-#ifdef _WINDOWS
- #define NOCOMM
- #define NOSOUND
- #define NODRIVERS
- #define STRICT
- #pragma warning(disable:4115) // kill rpcasync.h complaint
- #include <windows.h>
- #define MYLIBAPI __declspec(dllexport)
-#endif
-
-#include "texwin.h"
-
-#pragma warning(disable:4996)
-#pragma warning(disable:4131) // old style declarator
-#pragma warning(disable:4135) // conversion between different integral types
-#pragma warning(disable:4127) // conditional expression is constant
-
-#include <setjmp.h>
-
-#define EXTERN extern
-
-#include "texd.h"
-
-#pragma warning(disable:4244) /* 96/Jan/10 */
-
-/* #pragma optimize("a", off) */ /* 98/Dec/10 experiment */
-
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-
-void char_warning_(internal_font_number f, eight_bits c)
-{
- if(eqtb[(hash_size + 3198)].cint > 0)
- {
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- if (show_missing == 0) /* show on screen 94/June/10 */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- begin_diagnostic ();
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- if (show_missing) { /* add ! before 94/June/10 */
- print_nl("! "); /* ! */
- print_string("Missing character: there is no");
- }
- else
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- print_nl("Missing character: there is no"); /* */
- print(c);
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- if (show_numeric) { /* bkph 93/Dec/21 */
- print_char(32); /* */
- print_char(40); /*(*/
- if (c / 100 > 0) {
- print_char(48 + c / 100);
-/* c = c % 100; */
- c = c - (c / 100) * 100; /* ? */
- print_char(48 + c / 10);
- }
- else {
-/* c = c % 100; */
- c = c - (c / 100) * 100; /* ? */
- if (c / 10 > 0) print_char(48 + c / 10);
- }
- print_char(48 + c % 10);
- print_char(41); /*)*/
-/* print_char(32); */
- }
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- print_string("in font");
- slow_print(font_name[f]);
- print_char(33); /* ! */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* if (show_missing) show_context(); */ /* in tex2.c 94/June/10 */
- if (show_missing) {
- if (f != 0) show_context(); /* not if its the nullfont */
- }
- if (show_missing == 0) /* show on screen 94/June/10 */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- end_diagnostic(false);
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- missing_characters++; /* bkph 93/Dec/16 */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- }
-}
-halfword new_character_(internal_font_number f, eight_bits c)
-{/* 10 */ register halfword Result;
- halfword p;
- if(font_bc[f]<= c)
- if(font_ec[f]>= c)
- if((font_info[char_base[f]+ c].qqqq.b0 > 0))
- {
- p = get_avail ();
-/* long to unsigned short ... */
- mem[p].hh.b0 = f;
- mem[p].hh.b1 = c;
- Result = p;
- return(Result);
- }
- char_warning(f, c); /* char_warning(f,c); l.11283 */
- Result = 0; /* new_character:=null */
- return Result;
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void dvi_swap (void)
-{
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- if (trace_flag) {
- show_char('\n');
- sprintf(log_line, "dvi_swap %d", dvi_gone);
- show_line(log_line, 0);
-}
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- if(dvi_limit == dvi_buf_size) {
- writedvi(0, half_buf - 1);
- dvi_limit = half_buf;
- dvi_offset = dvi_offset + dvi_buf_size;
- dvi_ptr = 0;
- }
- else {
- writedvi(half_buf, dvi_buf_size - 1);
- dvi_limit = dvi_buf_size;
- }
- dvi_gone = dvi_gone + half_buf;
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void dvi_four_(integer x) /* attempt at speeding up bkph - is compiler smart ? */
-{
- if(x >= 0)
- {
-/* dvi_buf[dvi_ptr]= x / 16777216L; */ /* 2^24 */
-/* dvi_buf[dvi_ptr]=(x >> 24); */
- dvi_buf[dvi_ptr]= (unsigned char)(x >> 24);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- else {
- x = x + 1073741824L; /* 2^30 40000000 hex */
- x = x + 1073741824L;
- {
-/* dvi_buf[dvi_ptr]=(x / 16777216L)+ 128; */ /* 2^24 */
- dvi_buf[dvi_ptr]=(x >> 24)+ 128; /* set sign bit */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- }
-/* x = x % 16777216L; */ /* % 2^24 */
- x = x & 16777215L;
- {
-/* dvi_buf[dvi_ptr]= x / 65536L; */
-/* dvi_buf[dvi_ptr]=(x >> 16); */
- dvi_buf[dvi_ptr]= (unsigned char)(x >> 16);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
-/* x = x % 65536L; */ /* % 2^16 */
- x = x & 65535L;
- {
-/* dvi_buf[dvi_ptr]= x / 256; */
-/* dvi_buf[dvi_ptr]=(x >> 8); */
- dvi_buf[dvi_ptr]= (unsigned char)(x >> 8);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
-/* dvi_buf[dvi_ptr]= x % 256; */ /* % 2^8 */
- dvi_buf[dvi_ptr]= x & 255;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void zdvipop(integer l)
-{
- if((l == dvi_offset + dvi_ptr)&&(dvi_ptr > 0))
- decr(dvi_ptr);
- else {
-
- dvi_buf[dvi_ptr]= 142;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void dvi_font_def_(internal_font_number f)
-{
- pool_pointer k;
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-#ifdef INCREASEFONTS
- if (f <= 256) {
- {
- dvi_buf[dvi_ptr]= 243;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= f - 1;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- }
- else {
- {
- dvi_buf[dvi_ptr]= 244;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= (f - 1) >> 8; /* top byte */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= (f - 1) & 255; /* bottom byte */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- }
-#else
- {
- dvi_buf[dvi_ptr]= 243;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= f - 1;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
-#endif
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* spit out the font checksum now */
- {
- dvi_buf[dvi_ptr]= font_check[f].b0;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= font_check[f].b1;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= font_check[f].b2;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= font_check[f].b3;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- dvi_four(font_size[f]);
- dvi_four(font_dsize[f]);
- {
-/* long to unsigned char ... */
- dvi_buf[dvi_ptr]=
- (str_start[font_area[f]+ 1]- str_start[font_area[f]]);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
-/* long to unsigned char ... */
- dvi_buf[dvi_ptr]=
- (str_start[font_name[f]+ 1]- str_start[font_name[f]]);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- register integer for_end;
- k = str_start[font_area[f]];
- for_end = str_start[font_area[f]+ 1]- 1;
- if(k <= for_end) do
- {
- dvi_buf[dvi_ptr]= str_pool[k];
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- while(k++ < for_end);
- }
- {
- register integer for_end;
- k = str_start[font_name[f]];
- for_end = str_start[font_name[f]+ 1]- 1;
- if(k <= for_end) do
- {
- dvi_buf[dvi_ptr]= str_pool[k];
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- while(k++ < for_end);
- }
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void zmovement(scaled w, eight_bits o)
-{/* 10 40 45 2 1 */
- small_number mstate;
- halfword p, q;
- integer k;
- q = get_node(3);
- mem[q + 1].cint = w;
- mem[q + 2].cint = dvi_offset + dvi_ptr;
- if(o == 157) /* 157 == down1 */
- {
- mem[q].hh.v.RH = down_ptr;
- down_ptr = q;
- }
- else { /* 143 == right1 */
-
- mem[q].hh.v.RH = right_ptr;
- right_ptr = q;
- }
- p = mem[q].hh.v.RH;
- mstate = 0;
- while(p != 0){ /* while p<>null do l.12153 */
-
- if(mem[p + 1].cint == w)
- switch(mstate + mem[p].hh.v.LH)
- {case 3 :
- case 4 :
- case 15 :
- case 16 :
- if(mem[p + 2].cint < dvi_gone)
- goto lab45;
- else {
-
- k = mem[p + 2].cint - dvi_offset;
- if(k < 0)
- k = k + dvi_buf_size;
- dvi_buf[k]= dvi_buf[k]+ 5;
- mem[p].hh.v.LH = 1;
- goto lab40;
- }
- break;
- case 5 :
- case 9 :
- case 11 :
- if(mem[p + 2].cint < dvi_gone)
- goto lab45;
- else {
-
- k = mem[p + 2].cint - dvi_offset;
- if(k < 0)
- k = k + dvi_buf_size;
- dvi_buf[k]= dvi_buf[k]+ 10;
- mem[p].hh.v.LH = 2;
- goto lab40;
- }
- break;
- case 1 :
- case 2 :
- case 8 :
- case 13 :
- goto lab40;
- break;
- default:
- ;
- break;
- }
- else switch(mstate + mem[p].hh.v.LH)
- {case 1 :
- mstate = 6;
- break;
- case 2 :
- mstate = 12;
- break;
- case 8 :
- case 13 :
- goto lab45;
- break;
- default:
- ;
- break;
- }
- p = mem[p].hh.v.RH;
- }
- lab45:;
- mem[q].hh.v.LH = 3;
- if(abs(w)>= 8388608L) /* 2^23 */
- {
- {
- dvi_buf[dvi_ptr]= o + 3;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- dvi_four(w);
- return;
- }
- if(abs(w)>= 32768L)
- {
- {
- dvi_buf[dvi_ptr]= o + 2;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- if(w < 0)
- w = w + 16777216L; /* 2^24 */
- {
-/* dvi_buf[dvi_ptr]= w / 65536L; */
-/* dvi_buf[dvi_ptr]=(w >> 16); */
- dvi_buf[dvi_ptr]= (unsigned char)(w >> 16);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
-/* w = w % 65536L; */
- w = w & 65535L;
- goto lab2;
- }
- if(abs(w)>= 128)
- {
- {
- dvi_buf[dvi_ptr]= o + 1;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- if(w < 0)
- w = w + 65536L;
- goto lab2;
- }
- {
- dvi_buf[dvi_ptr]= o;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- if(w < 0)
- w = w + 256;
- goto lab1;
- lab2: {
-
-/* dvi_buf[dvi_ptr]= w / 256; */
-/* dvi_buf[dvi_ptr]=(w >> 8); */
- dvi_buf[dvi_ptr]= (unsigned char)(w >> 8);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- lab1: {
-
-/* dvi_buf[dvi_ptr]= w % 256; */
- dvi_buf[dvi_ptr]= w & 255;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- return;
- lab40: mem[q].hh.v.LH = mem[p].hh.v.LH;
- if(mem[q].hh.v.LH == 1)
- {
- {
- dvi_buf[dvi_ptr]= o + 4;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- while(mem[q].hh.v.RH != p){
-
- q = mem[q].hh.v.RH;
- switch(mem[q].hh.v.LH)
- {case 3 :
- mem[q].hh.v.LH = 5;
- break;
- case 4 :
- mem[q].hh.v.LH = 6;
- break;
- default:
- ;
- break;
- }
- }
- }
- else {
-
- {
- dvi_buf[dvi_ptr]= o + 9;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- while(mem[q].hh.v.RH != p){
-
- q = mem[q].hh.v.RH;
- switch(mem[q].hh.v.LH)
- {case 3 :
- mem[q].hh.v.LH = 4;
- break;
- case 5 :
- mem[q].hh.v.LH = 6;
- break;
- default:
- ;
- break;
- }
- }
- }
-}
-void prune_movements_(integer l)
-{/* 30 10 */
- halfword p;
- while(down_ptr != 0){ /* while down_ptr<>null do l.12206 */
-
- if(mem[down_ptr + 2].cint < l)
- goto lab30;
- p = down_ptr;
- down_ptr = mem[p].hh.v.RH;
- free_node(p, 3);
- }
- lab30: while(right_ptr != 0){ /* done: while right_ptr<>null do */
-
- if(mem[right_ptr + 2].cint < l)
- return;
- p = right_ptr;
- right_ptr = mem[p].hh.v.RH;
- free_node(p, 3);
- }
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void special_out_(halfword p)
-{
- char old_setting;
- pool_pointer k;
- if(cur_h != dvi_h)
- {
- movement(cur_h - dvi_h, 143); /* 143 == right1 */
- dvi_h = cur_h;
- }
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- old_setting = selector;
- selector = 21;
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* About output \special{...} make some space in string pool 97/Mar/9 */
-#ifdef ALLOCATESTRING
- if(pool_ptr + 32000 > current_pool_size)
- str_pool = realloc_str_pool (increment_pool_size);
-/* We don't bother to check whether this worked - will catch later */
-#endif
-/* Potential problem here if current_pool_size is not much more than pool_ptr! */
-/* Fixed 97/Mar/9 in version 2.0.3 */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-#ifdef ALLOCATESTRING
-/* show_token_list(mem[mem[p + 1].hh.v.RH].hh.v.RH, 0,
- current_pool_size - pool_ptr); */
- show_token_list(mem[mem[p + 1].hh.v.RH].hh.v.RH, 0,
- 10000000L);
-/* Above is safe, since print/print_char/print_esc will extend string space */
-#else
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- show_token_list(mem[mem[p + 1].hh.v.RH].hh.v.RH, 0,
- pool_size - pool_ptr);
-#endif
-
- selector = old_setting;
- {
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* str_room(1) - is there space for one more character in string pool ? */
-#ifdef ALLOCATESTRING
- if(pool_ptr + 1 > current_pool_size)
- str_pool = realloc_str_pool (increment_pool_size);
- if(pool_ptr + 1 > current_pool_size) { /* in case it failed 94/Jan/24 */
- overflow(257, current_pool_size - init_pool_ptr); /* 97/Mar/7 */
- return; // abort_flag set
- }
-#else
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- if(pool_ptr + 1 > pool_size){
- overflow(257, pool_size - init_pool_ptr); /* pool size */
- return; // abort_flag set
- }
-#endif
- }
- if((pool_ptr - str_start[str_ptr])< 256) /* can use xxx1 ? */
- {
- {
- dvi_buf[dvi_ptr]= 239; /* xxx1 */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
-/* long to unsigned char ... */
- dvi_buf[dvi_ptr]=(pool_ptr - str_start[str_ptr]);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- }
- else { /* use xxx4 instead */
-
- {
- dvi_buf[dvi_ptr]= 242; /* xxx4 */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- dvi_four((pool_ptr - str_start[str_ptr]));
- }
-
-#ifdef IGNORED
-/* debugging code for \special{src: ... } 98/Nov/11 */
- {
- int k = str_start[str_ptr];
- int kend = pool_ptr;
- if (kend > k + 4) {
- if (str_pool [k] == 's' &&
- str_pool [k+1] == 'r' &&
- str_pool [k+2] == 'c' &&
- str_pool [k+3] == ':') { /* \special{src: ... } */
- show_char('\n');
- s = log_line;
- while (k < kend) {
- *s++ = str_pool[k++];
- }
- *s++ = ' ';
- *s++ = '\0';
- show_line(log_line, 0)
-#ifndef _WINDOWS
- fflush(stdout);
-#endif
- if (cur_input.name_field > 17) { /* redundant ? */
- print(cur_input.name_field);
- print_char(40); /*(*/
- print_int(line); /* line number */
- print_char(41); /*)*/
- print_char(32); /* */
- print_char(58); /* : */
- }
-#ifndef _WINDOWS
- fflush(stdout);
-#endif
- }
- }
- }
-#endif
-
- {
- register integer for_end;
- k = str_start[str_ptr];
- for_end = pool_ptr - 1;
- if(k <= for_end) do
- {
- dvi_buf[dvi_ptr]= str_pool[k];
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- while(k++ < for_end);
- }
- pool_ptr = str_start[str_ptr];
-}
-/* noew returns -1 if it fails */
-void write_out_(halfword p)
-{
- char old_setting;
-/* integer oldmode; */
- int oldmode; /* 1995/Jan/7 */
-/* small_number j; */
- int j; /* 1995/Jan/7 */
- halfword q, r;
-/* q:=get_avail; info(q):=right_brace_token+"}";@/ */
- q = get_avail ();
- mem[q].hh.v.LH = 637;
-/* r:=get_avail; link(q):=r; info(r):=end_write_token; ins_list(q);@/ */
-/* @d end_write_token==cs_token_flag+end_write */
- r = get_avail ();
- mem[q].hh.v.RH = r;
-/* mem[r].hh.v.LH = (hash_size + 4617); */
-/* mem[r].hh.v.LH = (hash_size + 4095 + 522); */
- mem[r].hh.v.LH = (hash_size + hash_extra + 4095 + 522);
- begin_token_list(q, 4);
- begin_token_list(mem[p + 1].hh.v.RH, 15);
- q = get_avail ();
- mem[q].hh.v.LH = 379;
- begin_token_list(q, 4);
- oldmode = mode;
- mode = 0;
- cur_cs = write_loc;
- q = scan_toks(false, true);
- get_token ();
-/* if(cur_tok != (hash_size + 4617)) */
-/* if(cur_tok != (hash_size + 4095 + 522)) */
- if(cur_tok != (hash_size + hash_extra + 4095 + 522))
- {
- print_err("Unbalanced write command");
- help2("On this page there's a \\write with fewer real {'s than }'s.",
- "I can't handle that very well; good luck.");
- error ();
- do {
- get_token ();
-/* } while(!(cur_tok == (hash_size + 4617))); */
-/* } while(!(cur_tok == (hash_size + 4095 + 522))); */
- } while(!(cur_tok == (hash_size + hash_extra + 4095 + 522))); /*1996/Jan/10*/
- }
- mode = oldmode;
- end_token_list ();
- old_setting = selector;
- j = mem[p + 1].hh.v.LH;
- if(write_open[j])selector = j;
- else {
- if((j == 17)&&(selector == 19))
- selector = 18;
- print_nl(""); /* */
- }
- token_show(def_ref);
- print_ln ();
- flush_list(def_ref);
- selector = old_setting;
-}
-void out_what_(halfword p)
-{
-/* small_number j; */
- int j; /* 1995/Jan/7 */
- switch(mem[p].hh.b1)
- {case 0 :
- case 1 :
- case 2 :
- if(! doing_leaders){
- j = mem[p + 1].hh.v.LH;
- if(mem[p].hh.b1 == 1){
- write_out(p);
- }
- else {
- if(write_open[j])
- (void) a_close(write_file[j]);
- if(mem[p].hh.b1 == 2)
- write_open[j]= false;
- else if(j < 16){
- cur_name = mem[p + 1].hh.v.RH;
- cur_area = mem[p + 2].hh.v.LH;
- cur_ext = mem[p + 2].hh.v.RH;
- if(cur_ext == 335) /* "" */
- cur_ext = 785; /* => ".tex" */
- pack_file_name(cur_name, cur_area, cur_ext);
- while(! a_open_out(write_file[j])) {
- prompt_file_name(1294, 785); /* output file name .tex */
- }
- write_open[j]= true;
- }
- }
- }
- break;
- case 3 :
- special_out(p);
- break;
- case 4 :
- ;
- break;
- default:
- {
- confusion(1293); /* ext4 */
- return; // abort_flag set
- }
- break;
- }
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void hlist_out (void)
-{/* 21 13 14 15 */
- scaled baseline;
- scaled leftedge;
- scaled saveh, savev;
- halfword thisbox;
-/* glue_ord gorder; */
- int gorder; /* 95/Jan/7 */
-/* char gsign; */
- int gsign; /* 95/Jan/7 */
- halfword p;
- integer saveloc;
- halfword leaderbox;
- scaled leaderwd;
- scaled lx;
- bool outerdoingleaders;
- scaled edge;
-/* ********************************************************************* */
- real gluetemp; /* new in 3.14159 */
-/* ********************************************************************* */
- thisbox = temp_ptr;
- gorder = mem[thisbox + 5].hh.b1;
- gsign = mem[thisbox + 5].hh.b0;
- p = mem[thisbox + 5].hh.v.RH;
- incr(cur_s);
- if(cur_s > 0)
- {
- dvi_buf[dvi_ptr]= 141;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- if(cur_s > max_push)
- max_push = cur_s;
- saveloc = dvi_offset + dvi_ptr;
- baseline = cur_v;
- leftedge = cur_h;
-/* while p<>null do l.12314 */
- while(p != 0)lab21: if((p >= hi_mem_min))
- {
- if(cur_h != dvi_h)
- {
- movement(cur_h - dvi_h, 143); /* 143 == right1 */
- dvi_h = cur_h;
- }
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- do {
- f = mem[p].hh.b0;
- c = mem[p].hh.b1;
- if(f != dvi_f)
- {
- if(! font_used[f])
- {
- dvi_font_def(f);
- font_used[f]= true;
- }
- if(f <= 64)
- { /* fnt_num_0 --- fnt_num_63 */
- dvi_buf[dvi_ptr]= f + 170;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-#ifdef INCREASEFONTS
- else if(f <= 256){ /* if we allow greater than 256 fonts */
-#else
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- else { /* normal TeX 82 case */
-#endif
- { /* fnt1 followed by f */
- dvi_buf[dvi_ptr]= 235;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= f - 1;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- }
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-#ifdef INCREASEFONTS
- else { /* fnt2 followed by f / 256, f % 256 */
- {
- dvi_buf[dvi_ptr]= 236;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= (f - 1) >> 8; /* top byte */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= (f - 1) & 255; /* bottom byte */
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- }
-#endif
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
- dvi_f = f;
- }
- if(c >= 128)
- {
- dvi_buf[dvi_ptr]= 128;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= c;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- cur_h = cur_h + font_info[width_base[f]+ font_info[char_base[f]+ c
- ].qqqq.b0].cint;
- p = mem[p].hh.v.RH;
- } while(!(!(p >= hi_mem_min)));
- dvi_h = cur_h;
- }
- else {
-
- switch(mem[p].hh.b0)
- {case 0 :
- case 1 :
-/* if list_ptr(p)=null then cur_h:=cur_h+width(p) l.12371 */
- if(mem[p + 5].hh.v.RH == 0)
- cur_h = cur_h + mem[p + 1].cint;
- else {
-
- saveh = dvi_h;
- savev = dvi_v;
- cur_v = baseline + mem[p + 4].cint;
- temp_ptr = p;
- edge = cur_h;
- if(mem[p].hh.b0 == 1)vlist_out ();
- else hlist_out ();
- dvi_h = saveh;
- dvi_v = savev;
- cur_h = edge + mem[p + 1].cint;
- cur_v = baseline;
- }
- break;
- case 2 :
- {
- rule_ht = mem[p + 3].cint;
- rule_dp = mem[p + 2].cint;
- rule_wd = mem[p + 1].cint;
- goto lab14;
- }
- break;
- case 8 :
- out_what(p);
- break;
- case 10 :
- {
- g = mem[p + 1].hh.v.LH;
- rule_wd = mem[g + 1].cint;
- if(gsign != 0)
- {
- if(gsign == 1)
- {
- if(mem[g].hh.b0 == gorder)
-/* *********************************************************************** */
-/* rule_wd = rule_wd + round(mem[thisbox + 6].gr * mem[g + 2].cint); */
-/* ******************** 3.14159 ******************************************* */
- {
- gluetemp = mem[thisbox + 6].gr * mem[g + 2].cint;
- if(gluetemp > 1000000000.0)
- gluetemp = 1000000000.0;
- else if(gluetemp < -1000000000.0)
- gluetemp = -1000000000.0;
- rule_wd = rule_wd + round(gluetemp);
- }
-/* ************************************************************************* */
- }
-/* else { */
-/* if(mem[g].hh.b1 == gorder)*/
-/* rule_wd = rule_wd - round(mem[thisbox + 6].gr * mem[g + 3].cint); */
-/* } */
-/* ******************** 3.14159 ******************************************* */
- else if(mem[g].hh.b1 == gorder)
- {
- gluetemp = mem[thisbox + 6].gr * mem[g + 3].cint;
- if(gluetemp > 1000000000.0)
- gluetemp = 1000000000.0;
- else if(gluetemp < -1000000000.0)
- gluetemp = -1000000000.0;
- rule_wd = rule_wd - round(gluetemp);
- }
-/* ************************************************************************* */
- }
- if(mem[p].hh.b1 >= 100)
- {
- leaderbox = mem[p + 1].hh.v.RH;
- if(mem[leaderbox].hh.b0 == 2)
- {
- rule_ht = mem[leaderbox + 3].cint;
- rule_dp = mem[leaderbox + 2].cint;
- goto lab14;
- }
- leaderwd = mem[leaderbox + 1].cint;
- if((leaderwd > 0)&&(rule_wd > 0))
- {
- rule_wd = rule_wd + 10;
- edge = cur_h + rule_wd;
- lx = 0;
- if(mem[p].hh.b1 == 100)
- {
- saveh = cur_h;
- cur_h = leftedge + leaderwd *((cur_h - leftedge)/ leaderwd)
- ;
- if(cur_h < saveh)
- cur_h = cur_h + leaderwd;
- }
- else {
-
- lq = rule_wd / leaderwd;
- lr = rule_wd % leaderwd;
- if(mem[p].hh.b1 == 101)
- cur_h = cur_h +(lr / 2);
- else {
-
- lx =(2 * lr + lq + 1)/(2 * lq + 2);
- cur_h = cur_h +((lr -(lq - 1)* lx)/ 2);
- }
- }
- while(cur_h + leaderwd <= edge){
-
- cur_v = baseline + mem[leaderbox + 4].cint;
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- savev = dvi_v;
- if(cur_h != dvi_h)
- {
- movement(cur_h - dvi_h, 143); /* 143 == right1 */
- dvi_h = cur_h;
- }
- saveh = dvi_h;
- temp_ptr = leaderbox;
- outerdoingleaders = doing_leaders;
- doing_leaders = true;
- if(mem[leaderbox].hh.b0 == 1)vlist_out ();
- else hlist_out ();
- doing_leaders = outerdoingleaders;
- dvi_v = savev;
- dvi_h = saveh;
-/* ****************************************************************** */
-/* cur_v = saveh; */
- cur_v = baseline; /* changed in 3.1415 */
-/* ****************************************************************** */
- cur_h = saveh + leaderwd + lx;
- }
- cur_h = edge - 10;
- goto lab15;
- }
- }
- goto lab13;
- }
- break;
- case 11 :
- case 9 :
- cur_h = cur_h + mem[p + 1].cint;
- break;
- case 6 :
- {
- mem[mem_top - 12]= mem[p + 1];
- mem[mem_top - 12].hh.v.RH = mem[p].hh.v.RH;
- p = mem_top - 12;
- goto lab21;
- }
- break;
- default:
- ;
- break;
- }
- goto lab15;
- lab14: if((rule_ht == -1073741824L)) /* - 2^30 */
- rule_ht = mem[thisbox + 3].cint;
- if((rule_dp == -1073741824L)) /* - 2^30 */
- rule_dp = mem[thisbox + 2].cint;
- rule_ht = rule_ht + rule_dp;
- if((rule_ht > 0)&&(rule_wd > 0))
- {
- if(cur_h != dvi_h)
- {
- movement(cur_h - dvi_h, 143); /* 143 == right1 */
- dvi_h = cur_h;
- }
- cur_v = baseline + rule_dp;
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- {
- dvi_buf[dvi_ptr]= 132;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- dvi_four(rule_ht);
- dvi_four(rule_wd);
- cur_v = baseline;
- dvi_h = dvi_h + rule_wd;
- }
- lab13: cur_h = cur_h + rule_wd;
- lab15: p = mem[p].hh.v.RH;
- }
- prune_movements(saveloc);
- if(cur_s > 0)
- dvi_pop(saveloc);
- decr(cur_s);
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void vlist_out (void)
-{/* 13 14 15 */
- scaled leftedge;
- scaled topedge;
- scaled saveh, savev;
- halfword thisbox;
-/* glue_ord gorder; */
- int gorder; /* 95/Jan/7 */
-/* char gsign; */
- int gsign; /* 95/Jan/7 */
- halfword p;
- integer saveloc;
- halfword leaderbox;
- scaled leaderht;
- scaled lx;
- bool outerdoingleaders;
- scaled edge;
-/* ************************************************************************ */
- real gluetemp; /* new in 3.14159 */
-/* ************************************************************************ */
- thisbox = temp_ptr;
- gorder = mem[thisbox + 5].hh.b1;
- gsign = mem[thisbox + 5].hh.b0;
- p = mem[thisbox + 5].hh.v.RH;
- incr(cur_s);
- if(cur_s > 0)
- {
- dvi_buf[dvi_ptr]= 141;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- if(cur_s > max_push)
- max_push = cur_s;
- saveloc = dvi_offset + dvi_ptr;
- leftedge = cur_h;
- cur_v = cur_v - mem[thisbox + 3].cint;
- topedge = cur_v;
- while(p != 0){ /* while p<>null do l.12494 OK */
- if((p >= hi_mem_min)) {
- confusion(822); /* vlist_out */
- return; // abort_flag set
- }
- else {
- switch(mem[p].hh.b0)
- {case 0 :
- case 1 :
-/* if list_ptr(p)=null then cur_v:=cur_v+height(p)+depth(p) l.12529 */
- if(mem[p + 5].hh.v.RH == 0)
- cur_v = cur_v + mem[p + 3].cint + mem[p + 2].cint;
- else {
-
- cur_v = cur_v + mem[p + 3].cint;
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- saveh = dvi_h;
- savev = dvi_v;
- cur_h = leftedge + mem[p + 4].cint;
- temp_ptr = p;
- if(mem[p].hh.b0 == 1)vlist_out ();
- else hlist_out ();
- dvi_h = saveh;
- dvi_v = savev;
- cur_v = savev + mem[p + 2].cint;
- cur_h = leftedge;
- }
- break;
- case 2 :
- {
- rule_ht = mem[p + 3].cint;
- rule_dp = mem[p + 2].cint;
- rule_wd = mem[p + 1].cint;
- goto lab14;
- }
- break;
- case 8 :
- out_what(p);
- break;
- case 10 :
- {
- g = mem[p + 1].hh.v.LH;
- rule_ht = mem[g + 1].cint;
- if(gsign != 0)
- {
- if(gsign == 1)
- {
- if(mem[g].hh.b0 == gorder)
-/* ************************************************************************ */
-/* rule_ht = rule_ht + round(mem[thisbox + 6].gr * mem[g + 2].cint); */
-/* ************************ 3.14159 **************************************** */
- {
- gluetemp = mem[thisbox + 6].gr * mem[g + 2].cint;
- if(gluetemp > 1000000000.0)
- gluetemp = 1000000000.0;
- else if(gluetemp < -1000000000.0)
- gluetemp = -1000000000.0;
- rule_ht = rule_ht + round(gluetemp);
- }
-/* ************************************************************************* */
- }
-/* ************************************************************************* */
-/* else { */
-/* if(mem[g].hh.b1 == gorder) */
-/* rule_ht = rule_ht - round(mem[thisbox + 6].gr * mem[g + 3].cint); */
-/* } */
- else if(mem[g].hh.b1 == gorder) /* BUG FIX !!! */
- {
- gluetemp = mem[thisbox + 6].gr * mem[g + 3].cint;
- if(gluetemp > 1000000000.0)
- gluetemp = 1000000000.0;
- else if(gluetemp < -1000000000.0)
- gluetemp = -1000000000.0;
- rule_ht = rule_ht - round(gluetemp);
- }
-/* ************************************************************************* */
- }
- if(mem[p].hh.b1 >= 100)
- {
- leaderbox = mem[p + 1].hh.v.RH;
- if(mem[leaderbox].hh.b0 == 2)
- {
- rule_wd = mem[leaderbox + 1].cint;
- rule_dp = 0;
- goto lab14;
- }
- leaderht = mem[leaderbox + 3].cint + mem[leaderbox + 2]
- .cint;
- if((leaderht > 0)&&(rule_ht > 0))
- {
- rule_ht = rule_ht + 10;
- edge = cur_v + rule_ht;
- lx = 0;
- if(mem[p].hh.b1 == 100)
- {
- savev = cur_v;
- cur_v = topedge + leaderht *((cur_v - topedge)/ leaderht)
- ;
- if(cur_v < savev)
- cur_v = cur_v + leaderht;
- }
- else {
-
- lq = rule_ht / leaderht;
- lr = rule_ht % leaderht;
- if(mem[p].hh.b1 == 101)
- cur_v = cur_v +(lr / 2);
- else {
-
- lx =(2 * lr + lq + 1)/(2 * lq + 2);
- cur_v = cur_v +((lr -(lq - 1)* lx)/ 2);
- }
- }
- while(cur_v + leaderht <= edge){
-
- cur_h = leftedge + mem[leaderbox + 4].cint;
- if(cur_h != dvi_h)
- {
- movement(cur_h - dvi_h, 143); /* 143 == right1 */
- dvi_h = cur_h;
- }
- saveh = dvi_h;
- cur_v = cur_v + mem[leaderbox + 3].cint;
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- savev = dvi_v;
- temp_ptr = leaderbox;
- outerdoingleaders = doing_leaders;
- doing_leaders = true;
- if(mem[leaderbox].hh.b0 == 1)vlist_out ();
- else hlist_out ();
- doing_leaders = outerdoingleaders;
- dvi_v = savev;
- dvi_h = saveh;
-/* ************************************************************************ */
-/* cur_h = saveh; */
- cur_h = leftedge; /* 3.1415 */
-/* ************************************************************************ */
- cur_v = savev - mem[leaderbox + 3].cint + leaderht + lx;
- }
- cur_v = edge - 10;
- goto lab15;
- }
- }
- goto lab13;
- }
- break;
- case 11 :
- cur_v = cur_v + mem[p + 1].cint;
- break;
- default:
- ;
- break;
- }
- goto lab15;
- lab14: if((rule_wd == -1073741824L)) /* -2^30 */
- rule_wd = mem[thisbox + 1].cint;
- rule_ht = rule_ht + rule_dp;
- cur_v = cur_v + rule_ht;
- if((rule_ht > 0)&&(rule_wd > 0))
- {
- if(cur_h != dvi_h)
- {
- movement(cur_h - dvi_h, 143); /* 143 == right1 */
- dvi_h = cur_h;
- }
- if(cur_v != dvi_v)
- {
- movement(cur_v - dvi_v, 157); /* 157 == down1 */
- dvi_v = cur_v;
- }
- {
- dvi_buf[dvi_ptr]= 137;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- dvi_four(rule_ht);
- dvi_four(rule_wd);
- }
- goto lab15;
- lab13: cur_v = cur_v + rule_ht;
- }
- lab15: p = mem[p].hh.v.RH;
- }
- prune_movements(saveloc);
- if(cur_s > 0)
- dvi_pop(saveloc);
- decr(cur_s);
-}
-/* following needs access to dvi_buf=zdvibuf see coerce.h */
-void ship_out_(halfword p)
-{/* 30 */
- integer pageloc;
- char j, k;
- pool_pointer s;
- char old_setting;
- if(eqtb[(hash_size + 3197)].cint > 0)
- {
- print_nl(""); /* */
- print_ln ();
- print_string("Completed box being shipped out");
- }
- if(term_offset > max_print_line - 9)
- print_ln ();
- else if((term_offset > 0)||(file_offset > 0))
- print_char(32); /* */
- print_char(91); /*[*/
- j = 9;
- while((eqtb[(hash_size + 3218) + j].cint == 0)&&(j > 0)) decr(j);
- {
- register integer for_end;
- k = 0;
- for_end = j;
- if(k <= for_end) do
- {
- print_int(eqtb[(hash_size + 3218) + k].cint);
- if(k < j)
- print_char(46); /* . */
- }
- while(k++ < for_end);
- }
-#ifndef _WINDOWS
- fflush(stdout);
-#endif
- if(eqtb[(hash_size + 3197)].cint > 0)
- {
- print_char(93); /*]*/
- begin_diagnostic ();
- show_box(p);
- end_diagnostic(true);
- }
- if((mem[p + 3].cint > 1073741823L)|| /* 2^30 - 1 */
- (mem[p + 2].cint > 1073741823L)||
- (mem[p + 3].cint + mem[p + 2].cint +
- eqtb[(hash_size + 3749)].cint > 1073741823L)||
- (mem[p + 1].cint + eqtb[(hash_size + 3748)].cint > 1073741823L))
- {
- print_err("Huge page cannot be shipped out");
- help2("The page just created is more than 18 feet tall or",
- "more than 18 feet wide, so I suspect something went wrong.");
- error ();
- if(eqtb[(hash_size + 3197)].cint <= 0)
- {
- begin_diagnostic ();
- print_nl("The following box has been deleted:"); /* */
- show_box(p);
- end_diagnostic(true);
- }
- goto lab30;
- }
- if(mem[p + 3].cint + mem[p + 2].cint + eqtb[(hash_size + 3749)].cint > max_v
-)
- max_v = mem[p + 3].cint + mem[p + 2].cint + eqtb[(hash_size + 3749)].cint;
- if(mem[p + 1].cint + eqtb[(hash_size + 3748)].cint > max_h)
- max_h = mem[p + 1].cint + eqtb[(hash_size + 3748)].cint;
- dvi_h = 0;
- dvi_v = 0;
- cur_h = eqtb[(hash_size + 3748)].cint;
- dvi_f = 0;
- if(output_file_name == 0)
- {
- if(job_name == 0)open_log_file ();
- pack_job_name(788); /* .dvi */
- while(! b_open_out(dvi_file)) {
- prompt_file_name(789, 788); /* file name for output .dvi */
- }
- output_file_name = b_make_name_string(dvi_file);
- }
-
- if(total_pages == 0)
- {
- {
- dvi_buf[dvi_ptr]= 247;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- dvi_buf[dvi_ptr]= 2;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- dvi_four(25400000L); /* magic DVI scale factor */
- dvi_four(473628672L); /* 7227 * 65536 */
- prepare_mag ();
- dvi_four(eqtb[(hash_size + 3180)].cint);
- old_setting = selector;
- selector = 21;
- print_string("TeX output ");
- print_int(eqtb[(hash_size + 3186)].cint);
- print_char(46); /* . */
- print_two(eqtb[(hash_size + 3185)].cint);
- print_char(46); /* . */
- print_two(eqtb[(hash_size + 3184)].cint);
- print_char(58); /* : */
- print_two(eqtb[(hash_size + 3183)].cint / 60);
- print_two(eqtb[(hash_size + 3183)].cint % 60);
- selector = old_setting;
- {
-/* long to unsigned char ... */
- dvi_buf[dvi_ptr]=(pool_ptr - str_start[str_ptr]);
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- register integer for_end;
- s = str_start[str_ptr];
- for_end = pool_ptr - 1;
- if(s <= for_end) do
- {
- dvi_buf[dvi_ptr]= str_pool[s];
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- while(s++ < for_end);
- }
- pool_ptr = str_start[str_ptr];
- } // end of if total_pages == 0
-
- pageloc = dvi_offset + dvi_ptr;
- {
- dvi_buf[dvi_ptr]= 139;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- {
- register integer for_end;
- k = 0;
- for_end = 9;
- if(k <= for_end) do
- dvi_four(eqtb[(hash_size + 3218) + k].cint);
- while(k++ < for_end);
- }
- dvi_four(last_bop);
- last_bop = pageloc;
- cur_v = mem[p + 3].cint + eqtb[(hash_size + 3749)].cint;
- temp_ptr = p;
- if(mem[p].hh.b0 == 1)vlist_out ();
- else hlist_out ();
- {
- dvi_buf[dvi_ptr]= 140;
- incr(dvi_ptr);
- if(dvi_ptr == dvi_limit)dvi_swap ();
- }
- incr(total_pages);
- cur_s = -1;
- lab30:;
- if(eqtb[(hash_size + 3197)].cint <= 0)
- print_char(93); /*]*/
- dead_cycles = 0;
-#ifndef _WINDOWS
- fflush(stdout);
-#endif
- ;
-#ifdef STAT
- if(eqtb[(hash_size + 3194)].cint > 1)
- {
- print_nl("Memory usage before: "); /* */
- print_int(var_used);
- print_char(38); /* & */
- print_int(dyn_used);
- print_char(59); /*; */
- }
-#endif /* STAT */
- flush_node_list(p);
- ;
-#ifdef STAT
- if(eqtb[(hash_size + 3194)].cint > 1)
- {
- print_string("after");
- print_int(var_used);
- print_char(38); /* & */
- print_int(dyn_used);
- print_string("still utouched");
- print_int(hi_mem_min - lo_mem_max - 1); /* somewhat inaccurate free mem */
- print_ln ();
- }
-#endif /* STAT */
-}
-void scan_spec_(group_code c, bool threecodes)
-{/* 40 */
- integer s;
- char speccode;
- if(threecodes)
- s = save_stack[save_ptr + 0].cint;
- if(scan_keyword(836)) /* to */
- speccode = 0;
- else if(scan_keyword(837)) /* spread */
- speccode = 1;
- else {
- speccode = 1;
- cur_val = 0;
- goto lab40;
- }
- scan_dimen(false, false, false);
- lab40: if(threecodes)
- {
- save_stack[save_ptr + 0].cint = s; /* s may be used without ... */
- incr(save_ptr);
- }
- save_stack[save_ptr + 0].cint = speccode;
- save_stack[save_ptr + 1].cint = cur_val;
- save_ptr = save_ptr + 2;
- new_save_level(c);
- scan_left_brace ();
-}
-halfword hpack_(halfword p, scaled w, small_number m)
-{/* 21 50 10 */ register halfword Result;
- halfword r;
- halfword q;
- scaled h, d, x;
- scaled s;
- halfword g;
-/* glue_ord o; */
- int o; /* 95/Jan/7 */
- internal_font_number f;
- ffourquarters i;
- eight_bits hd;
- last_badness = 0;
- r = get_node(7);
- mem[r].hh.b0 = 0;
- mem[r].hh.b1 = 0;
- mem[r + 4].cint = 0;
- q = r + 5;
- mem[q].hh.v.RH = p;
- h = 0;
- d = 0;
- x = 0;
- totalstretch[0]= 0;
- totalshrink[0]= 0;
- totalstretch[1]= 0;
- totalshrink[1]= 0;
- totalstretch[2]= 0;
- totalshrink[2]= 0;
- totalstretch[3]= 0;
- totalshrink[3]= 0;
- while(p != 0){ /* while p<>null do l.12862 */
-
- lab21: while((p >= hi_mem_min)) {
-
- f = mem[p].hh.b0;
- i = font_info[char_base[f]+ mem[p].hh.b1].qqqq;
- hd = i.b1;
- x = x + font_info[width_base[f]+ i.b0].cint;
- s = font_info[height_base[f]+(hd)/ 16].cint;
- if(s > h)
- h = s;
- s = font_info[depth_base[f]+(hd)% 16].cint;
- if(s > d)
- d = s;
- p = mem[p].hh.v.RH;
- }
- if(p != 0) /* if p<>null then l.12886 */
- {
- switch(mem[p].hh.b0)
- {case 0 :
- case 1 :
- case 2 :
- case 13 :
- {
- x = x + mem[p + 1].cint;
- if(mem[p].hh.b0 >= 2)
- s = 0;
- else s = mem[p + 4].cint;
- if(mem[p + 3].cint - s > h)
- h = mem[p + 3].cint - s;
- if(mem[p + 2].cint + s > d)
- d = mem[p + 2].cint + s;
- }
- break;
- case 3 :
- case 4 :
- case 5 :
-/* if adjust_tail<>null then link(adjust_tail):=null; l.12865 / 12891 */
- if(adjust_tail != 0)
- {
- while(mem[q].hh.v.RH != p)q = mem[q].hh.v.RH;
- if(mem[p].hh.b0 == 5)
- {
- mem[adjust_tail].hh.v.RH = mem[p + 1].cint;
- while(mem[adjust_tail].hh.v.RH != 0)adjust_tail = mem[
- adjust_tail].hh.v.RH;
- p = mem[p].hh.v.RH;
- free_node(mem[q].hh.v.RH, 2);
- }
- else {
-
- mem[adjust_tail].hh.v.RH = p;
- adjust_tail = p;
- p = mem[p].hh.v.RH;
- }
- mem[q].hh.v.RH = p;
- p = q;
- }
- break;
- case 8 :
- ;
- break;
- case 10 :
- {
- g = mem[p + 1].hh.v.LH;
- x = x + mem[g + 1].cint;
- o = mem[g].hh.b0;
- totalstretch[o]= totalstretch[o]+ mem[g + 2].cint;
- o = mem[g].hh.b1;
- totalshrink[o]= totalshrink[o]+ mem[g + 3].cint;
- if(mem[p].hh.b1 >= 100)
- {
- g = mem[p + 1].hh.v.RH;
- if(mem[g + 3].cint > h)
- h = mem[g + 3].cint;
- if(mem[g + 2].cint > d)
- d = mem[g + 2].cint;
- }
- }
- break;
- case 11 :
- case 9 :
- x = x + mem[p + 1].cint;
- break;
- case 6 :
- {
- mem[mem_top - 12]= mem[p + 1];
- mem[mem_top - 12].hh.v.RH = mem[p].hh.v.RH;
- p = mem_top - 12;
- goto lab21;
- }
- break;
- default:
- ;
- break;
- }
- p = mem[p].hh.v.RH;
- }
- }
- if(adjust_tail != 0)
- mem[adjust_tail].hh.v.RH = 0;
- mem[r + 3].cint = h;
- mem[r + 2].cint = d;
- if(m == 1)
- w = x + w;
- mem[r + 1].cint = w;
- x = w - x;
- if(x == 0)
- {
- mem[r + 5].hh.b0 = 0;
- mem[r + 5].hh.b1 = 0;
- mem[r + 6].gr = 0.0;
- goto lab10;
- }
- else if(x > 0)
- {
- if(totalstretch[3]!= 0)
- o = 3;
- else if(totalstretch[2]!= 0)
- o = 2;
- else if(totalstretch[1]!= 0)
- o = 1;
- else o = 0;
- mem[r + 5].hh.b1 = o;
- mem[r + 5].hh.b0 = 1;
-/* if total_stretch[o]<>0 then glue_set(r):=... l.12982 */
- if(totalstretch[o]!= 0)
- mem[r + 6].gr = x / ((double) totalstretch[o]);
- else {
-
- mem[r + 5].hh.b0 = 0;
- mem[r + 6].gr = 0.0;
- }
-/* if o=normal then if list_ptr(r)<>null then l.12987 */
- if(o == 0)
- if(mem[r + 5].hh.v.RH != 0)
- {
- last_badness = badness(x, totalstretch[0]);
- if(last_badness > eqtb[(hash_size + 3189)].cint)
- {
- print_ln ();
- if(last_badness > 100)
- print_nl("Underfull"); /* */
- else print_nl("Loose"); /* */
- print_string("\\hbox (badness");
- print_int(last_badness);
- if(last_badness > 100)underfull_hbox++; /* 1996/Feb/9 */
- goto lab50;
- }
- }
- goto lab10;
- }
- else {
-
- if(totalshrink[3]!= 0)
- o = 3;
- else if(totalshrink[2]!= 0)
- o = 2;
- else if(totalshrink[1]!= 0)
- o = 1;
- else o = 0;
- mem[r + 5].hh.b1 = o;
- mem[r + 5].hh.b0 = 2;
- if(totalshrink[o]!= 0)
- mem[r + 6].gr =(- (integer) x)/ ((double) totalshrink[o]);
- else {
-
- mem[r + 5].hh.b0 = 0;
- mem[r + 6].gr = 0.0;
- }
-/* if (total_shrink[o]<-x)and(o=normal)and(list_ptr(r)<>null) then l.13946 */
- if((totalshrink[o]< - (integer) x)&&(o == 0)&&(mem[r + 5
- ].hh.v.RH != 0))
- {
- last_badness = 1000000L;
-/* set_glue_ratio_one(glue_set(r)); {use the maximum shrinkage} */
- mem[r + 6].gr = 1.0;
-/* if (-x-total_shrink[normal]>hfuzz)or(hbadness<100) then */
- if((- (integer) x - totalshrink[0]> eqtb[(hash_size + 3738)].cint)||(
- eqtb[(hash_size + 3189)].cint < 100))
- {
- if((eqtb[(hash_size + 3746)].cint > 0)&&(- (integer) x - totalshrink[0
- ] > eqtb[(hash_size + 3738)].cint))
- {
- while(mem[q].hh.v.RH != 0)q = mem[q].hh.v.RH;
- mem[q].hh.v.RH = new_rule ();
- mem[mem[q].hh.v.RH + 1].cint = eqtb[(hash_size + 3746)].cint;
- }
- print_ln ();
- print_nl("Overfull \\hbox("); /* */
- print_scaled(- (integer) x - totalshrink[0]);
- print_string("pt too wide");
- overfull_hbox++; /* 1996/Feb/9 */
- goto lab50;
- }
- }
- else if(o == 0)
- if(mem[r + 5].hh.v.RH != 0)
- {
- last_badness = badness(- (integer) x, totalshrink[0]);
- if(last_badness > eqtb[(hash_size + 3189)].cint)
- {
- print_ln ();
- print_nl("Tight \\hbox (badness "); /* */
- print_int(last_badness);
- goto lab50;
- }
- }
- goto lab10;
- }
- lab50: if(output_active)
- print_string(")has occurred while \\output is active");
- else {
-
- if(pack_begin_line != 0)
- {
- if(pack_begin_line > 0)
- print_string(")in paragraph at lines ");
- else print_string(")in alignment at lines ");
- print_int(abs(pack_begin_line));
- print_string("--");
- }
- else print_string(")detected at line ");
- print_int(line);
- }
- print_ln ();
- font_in_short_display = 0;
- short_display(mem[r + 5].hh.v.RH);
- print_ln ();
- begin_diagnostic ();
- show_box(r);
- end_diagnostic(true);
- lab10: Result = r;
- return Result;
-}
-halfword vpackage_(halfword p, scaled h, small_number m, scaled l)
-{/* 50 10 */ register halfword Result;
- halfword r;
- scaled w, d, x;
- scaled s;
- halfword g;
-/* glue_ord o; */
- int o; /* 95/Jan/7 */
- last_badness = 0;
- r = get_node(7);
- mem[r].hh.b0 = 1;
- mem[r].hh.b1 = 0;
- mem[r + 4].cint = 0;
- mem[r + 5].hh.v.RH = p;
- w = 0;
- d = 0;
- x = 0;
- totalstretch[0]= 0;
- totalshrink[0]= 0;
- totalstretch[1]= 0;
- totalshrink[1]= 0;
- totalstretch[2]= 0;
- totalshrink[2]= 0;
- totalstretch[3]= 0;
- totalshrink[3]= 0;
- while(p != 0){
-
- if((p >= hi_mem_min)) {
- confusion(849); /* vpack */
- return 0; // abort_flag set
- }
- else switch(mem[p].hh.b0)
- {case 0 :
- case 1 :
- case 2 :
- case 13 :
- {
- x = x + d + mem[p + 3].cint;
- d = mem[p + 2].cint;
- if(mem[p].hh.b0 >= 2)
- s = 0;
- else s = mem[p + 4].cint;
- if(mem[p + 1].cint + s > w)
- w = mem[p + 1].cint + s;
- }
- break;
- case 8 :
- ;
- break;
- case 10 :
- {
- x = x + d;
- d = 0;
- g = mem[p + 1].hh.v.LH;
- x = x + mem[g + 1].cint;
- o = mem[g].hh.b0;
- totalstretch[o]= totalstretch[o]+ mem[g + 2].cint;
- o = mem[g].hh.b1;
- totalshrink[o]= totalshrink[o]+ mem[g + 3].cint;
- if(mem[p].hh.b1 >= 100)
- {
- g = mem[p + 1].hh.v.RH;
- if(mem[g + 1].cint > w)
- w = mem[g + 1].cint;
- }
- }
- break;
- case 11 :
- {
- x = x + d + mem[p + 1].cint;
- d = 0;
- }
- break;
- default:
- ;
- break;
- }
- p = mem[p].hh.v.RH;
- }
- mem[r + 1].cint = w;
- if(d > l)
- {
- x = x + d - l;
- mem[r + 2].cint = l;
- }
- else mem[r + 2].cint = d;
- if(m == 1)
- h = x + h;
- mem[r + 3].cint = h;
- x = h - x;
- if(x == 0)
- {
- mem[r + 5].hh.b0 = 0;
- mem[r + 5].hh.b1 = 0;
- mem[r + 6].gr = 0.0;
- goto lab10;
- }
- else if(x > 0)
- {
- if(totalstretch[3]!= 0)
- o = 3;
- else if(totalstretch[2]!= 0)
- o = 2;
- else if(totalstretch[1]!= 0)
- o = 1;
- else o = 0;
- mem[r + 5].hh.b1 = o;
- mem[r + 5].hh.b0 = 1;
- if(totalstretch[o]!= 0)
- mem[r + 6].gr = x / ((double) totalstretch[o]);
- else {
-
- mem[r + 5].hh.b0 = 0;
- mem[r + 6].gr = 0.0;
- }
- if(o == 0)
- if(mem[r + 5].hh.v.RH != 0)
- {
- last_badness = badness(x, totalstretch[0]);
- if(last_badness > eqtb[(hash_size + 3190)].cint)
- {
- print_ln ();
- if(last_badness > 100)
- print_nl("Underfull"); /* */
- else print_nl("Loose"); /* */
- print_string("\\vbox (badness");
- print_int(last_badness);
- if(last_badness > 100)underfull_vbox++; /* 1996/Feb/9 */
- goto lab50;
- }
- }
- goto lab10;
- }
- else {
-
- if(totalshrink[3]!= 0)
- o = 3;
- else if(totalshrink[2]!= 0)
- o = 2;
- else if(totalshrink[1]!= 0)
- o = 1;
- else o = 0;
- mem[r + 5].hh.b1 = o;
- mem[r + 5].hh.b0 = 2;
- if(totalshrink[o]!= 0)
- mem[r + 6].gr =(- (integer) x)/ ((double) totalshrink[o]);
- else {
-
- mem[r + 5].hh.b0 = 0;
- mem[r + 6].gr = 0.0;
- }
-/* if (total_shrink[o]<-x)and(o=normal)and(list_ptr(r)<>null) then l.13046 */
- if((totalshrink[o]< - (integer) x)&&(o == 0)&&(mem[r + 5
- ].hh.v.RH != 0))
- {
- last_badness = 1000000L;
- mem[r + 6].gr = 1.0;
- if((- (integer) x - totalshrink[0]> eqtb[(hash_size + 3739)].cint)||(
- eqtb[(hash_size + 3190)].cint < 100))
- {
- print_ln ();
- print_nl("Overfull \\vbox("); /* */
- print_scaled(- (integer) x - totalshrink[0]);
- print_string("pt too high");
- overfull_vbox++; /* 1996/Feb/9 */
- goto lab50;
- }
- }
-/* else if o=normal then if list_ptr(r)<>null then l.13052 */
- else if(o == 0)
- if(mem[r + 5].hh.v.RH != 0)
- {
- last_badness = badness(- (integer) x, totalshrink[0]);
- if(last_badness > eqtb[(hash_size + 3190)].cint)
- {
- print_ln ();
- print_nl("Tight \\vbox (badness "); /* */
- print_int(last_badness);
- goto lab50;
- }
- }
- goto lab10;
- }
- lab50: if(output_active)
- print_string(")has occurred while \\output is active");
- else {
-
- if(pack_begin_line != 0)
- {
- print_string(")in alignment at lines ");
- print_int(abs(pack_begin_line));
- print_string("--");
- }
- else print_string(")detected at line ");
- print_int(line);
- print_ln ();
- }
- begin_diagnostic ();
- show_box(r);
- end_diagnostic(true);
- lab10: Result = r;
- return Result;
-}
-void append_to_vlist_(halfword b)
-{
- scaled d;
- halfword p;
- if(cur_list.aux_field.cint > ignore_depth)
- {
- d = mem[eqtb[(hash_size + 783)].hh.v.RH + 1].cint - cur_list.aux_field.cint -
- mem[b + 3].cint;
- if(d < eqtb[(hash_size + 3732)].cint)
- p = new_param_glue(0);
- else {
-
- p = new_skip_param(1);
- mem[temp_ptr + 1].cint = d;
- }
- mem[tail].hh.v.RH = p;
- tail = p;
- }
- mem[tail].hh.v.RH = b;
- tail = b;
- cur_list.aux_field.cint = mem[b + 2].cint;
-}
-halfword new_noad (void)
-{register halfword Result;
- halfword p;
- p = get_node(4);
- mem[p].hh.b0 = 16;
- mem[p].hh.b1 = 0;
- mem[p + 1].hh = empty_field;
- mem[p + 3].hh = empty_field;
- mem[p + 2].hh = empty_field;
- Result = p;
- return Result;
-}
-halfword new_style_(small_number s)
-{register halfword Result;
- halfword p;
- p = get_node(3);
- mem[p].hh.b0 = 14;
- mem[p].hh.b1 = s;
- mem[p + 1].cint = 0;
- mem[p + 2].cint = 0;
- Result = p;
- return Result;
-}
-halfword new_choice (void)
-{register halfword Result;
- halfword p;
- p = get_node(3);
- mem[p].hh.b0 = 15;
- mem[p].hh.b1 = 0;
- mem[p + 1].hh.v.LH = 0;
- mem[p + 1].hh.v.RH = 0;
- mem[p + 2].hh.v.LH = 0;
- mem[p + 2].hh.v.RH = 0;
- Result = p;
- return Result;
-}
-void show_info (void)
-{
- show_node_list(mem[temp_ptr].hh.v.LH);
-}
-halfword fraction_rule_(scaled t)
-{register halfword Result;
- halfword p;
- p = new_rule ();
- mem[p + 3].cint = t;
- mem[p + 2].cint = 0;
- Result = p;
- return Result;
-}
-halfword overbar_(halfword b, scaled k, scaled t)
-{register halfword Result;
- halfword p, q;
- p = new_kern(k);
- mem[p].hh.v.RH = b;
- q = fraction_rule(t);
- mem[q].hh.v.RH = p;
- p = new_kern(t);
- mem[p].hh.v.RH = q;
- Result = vpackage(p, 0, 1, 1073741823L); /* 2^30 - 1 */
- return Result;
-}
-halfword char_box_(internal_font_number f, quarterword c)
-{register halfword Result;
- ffourquarters q;
- eight_bits hd;
- halfword b, p;
- q = font_info[char_base[f]+ c].qqqq;
- hd = q.b1;
- b = new_null_box ();
- mem[b + 1].cint = font_info[width_base[f]+ q.b0].cint + font_info
- [italic_base[f]+(q.b2)/ 4].cint;
- mem[b + 3].cint = font_info[height_base[f]+(hd)/ 16].cint;
- mem[b + 2].cint = font_info[depth_base[f]+(hd)% 16].cint;
-/* long to unsigned short ... */
- p = get_avail ();
- mem[p].hh.b1 = c;
- mem[p].hh.b0 = f;
- mem[b + 5].hh.v.RH = p;
- Result = b;
- return Result;
-}
-void stack_into_box_(halfword b, internal_font_number f, quarterword c)
-{
- halfword p;
- p = char_box(f, c);
- mem[p].hh.v.RH = mem[b + 5].hh.v.RH;
- mem[b + 5].hh.v.RH = p;
- mem[b + 3].cint = mem[p + 3].cint;
-}
-scaled height_plus_depth_(internal_font_number f, fquarterword c)
-{register scaled Result;
- ffourquarters q;
- eight_bits hd;
- q = font_info[char_base[f]+ c].qqqq;
- hd = q.b1;
- Result = font_info[height_base[f]+(hd)/ 16].cint + font_info[
- depth_base[f]+(hd)% 16].cint;
- return Result;
-}
-halfword var_delimiter_(halfword d, small_number s, scaled v)
-{/* 40 22 */ register halfword Result;
- halfword b;
- internal_font_number f, g;
- quarterword c, x, y;
- integer m, n;
- scaled u;
- scaled w;
- ffourquarters q;
- ffourquarters r;
- eight_bits hd;
-/* small_number z; */
- int z; /* 95/Jan/7 */
-/* bool largeattempt; */
- int largeattempt; /* 95/Jan/7 */
- f = 0;
- w = 0;
- largeattempt = false;
- z = mem[d].qqqq.b0;
- x = mem[d].qqqq.b1;
- while(true){
- if((z != 0)||(x != 0))
- {
- z = z + s + 16;
- do {
- z = z - 16;
- g = eqtb[(hash_size + 1835) + z].hh.v.RH;
- if(g != 0)
- {
- y = x;
- if((y >= font_bc[g])&&(y <= font_ec[g]))
- {
- lab22: q = font_info[char_base[g]+ y].qqqq;
- if((q.b0 > 0))
- {
- if(((q.b2)% 4)== 3)
- {
- f = g;
- c = y;
- goto lab40;
- }
- hd = q.b1;
- u = font_info[height_base[g]+(hd)/ 16].cint + font_info
- [depth_base[g]+(hd)% 16].cint;
- if(u > w)
- {
- f = g;
- c = y;
- w = u;
- if(u >= v)
- goto lab40;
- }
- if(((q.b2)% 4)== 2)
- {
- y = q.b3;
- goto lab22;
- }
- }
- }
- }
- } while(!(z < 16));
- }
- if(largeattempt)
- goto lab40;
- largeattempt = true;
- z = mem[d].qqqq.b2;
- x = mem[d].qqqq.b3;
- }
- lab40: if(f != 0)
- if(((q.b2)% 4)== 3) /* q may be used without ... */
- {
- b = new_null_box ();
- mem[b].hh.b0 = 1;
- r = font_info[exten_base[f]+ q.b3].qqqq;
- c = r.b3;
- u = height_plus_depth(f, c);
- w = 0;
- q = font_info[char_base[f]+ c].qqqq;
- mem[b + 1].cint = font_info[width_base[f]+ q.b0].cint +
- font_info[italic_base[f]+(q.b2)/ 4].cint;
- c = r.b2;
- if(c != 0)
- w = w + height_plus_depth(f, c);
- c = r.b1;
- if(c != 0)
- w = w + height_plus_depth(f, c);
- c = r.b0;
- if(c != 0)
- w = w + height_plus_depth(f, c);
- n = 0;
- if(u > 0)
- while(w < v){
-
- w = w + u;
- incr(n);
- if(r.b1 != 0)
- w = w + u;
- }
- c = r.b2;
- if(c != 0)
- stack_into_box(b, f, c);
- c = r.b3;
- {
- register integer for_end;
- m = 1;
- for_end = n;
- if(m <= for_end) do
- stack_into_box(b, f, c);
- while(m++ < for_end);
- }
- c = r.b1;
- if(c != 0)
- {
- stack_into_box(b, f, c);
- c = r.b3;
- {
- register integer for_end;
- m = 1;
- for_end = n;
- if(m <= for_end) do
- stack_into_box(b, f, c);
- while(m++ < for_end);
- }
- }
- c = r.b0;
- if(c != 0)
- stack_into_box(b, f, c);
- mem[b + 2].cint = w - mem[b + 3].cint;
- }
- else b = char_box(f, c);
- else { /* c may be used without ... */
- b = new_null_box ();
- mem[b + 1].cint = eqtb[(hash_size + 3741)].cint;
- }
- mem[b + 4].cint = half(mem[b + 3].cint - mem[b + 2].cint)-
- font_info[22 + param_base[eqtb[(hash_size + 1837) + s].hh.v.RH]].cint;
- Result = b;
- return Result;
-}
-/* rebox_ etc used to follow here in tex4.c */
+/* Copyright 2014 Clerk Ma\r
+\r
+ This program is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ This program is distributed in the hope that it will be useful, but\r
+ WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with this program; if not, write to the Free Software\r
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+ 02110-1301 USA. */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+#include "dpx.h"\r
+\r
+/* sec 0581 */\r
+void char_warning_(internal_font_number f, eight_bits c)\r
+{ \r
+ if (tracing_lost_chars > 0)\r
+ {\r
+ if (show_missing == 0)\r
+ begin_diagnostic();\r
+\r
+ if (show_missing)\r
+ {\r
+ print_nl("! ");\r
+ prints("Missing character: there is no ");\r
+ }\r
+ else\r
+ print_nl("Missing character: there is no ");\r
+\r
+ print(c);\r
+\r
+ if (show_numeric)\r
+ {\r
+ print_char(' ');\r
+ print_char('(');\r
+\r
+ if (c / 100 > 0)\r
+ {\r
+ print_char('0' + c / 100);\r
+ c = c - (c / 100) * 100;\r
+ print_char('0' + c / 10);\r
+ }\r
+ else\r
+ {\r
+ c = c - (c / 100) * 100;\r
+\r
+ if (c / 10 > 0)\r
+ print_char('0' + c / 10);\r
+ }\r
+\r
+ print_char('0' + c % 10);\r
+ print_char(')');\r
+ }\r
+\r
+ prints(" in font ");\r
+ slow_print(font_name[f]);\r
+ print_char('!');\r
+\r
+ if (show_missing)\r
+ {\r
+ if (f != null_font)\r
+ show_context();\r
+ }\r
+\r
+ if (show_missing == 0)\r
+ end_diagnostic(false);\r
+\r
+ missing_characters++;\r
+ }\r
+}\r
+/* sec 0582 */\r
+pointer new_character_(internal_font_number f, eight_bits c)\r
+{\r
+ pointer p;\r
+\r
+ if (font_bc[f] <= c)\r
+ if (font_ec[f] >= c)\r
+ if (char_exists(char_info(f, c)))\r
+ {\r
+ p = get_avail();\r
+ font(p) = f;\r
+ character(p) = c;\r
+ return p;\r
+ }\r
+\r
+ char_warning(f, c);\r
+ return 0;\r
+}\r
+/* sec 0598 */\r
+void dvi_swap (void)\r
+{ \r
+ if (trace_flag)\r
+ {\r
+ wterm_cr();\r
+ printf("dvi_swap() %lld", dvi_gone);\r
+ }\r
+\r
+ if (dvi_limit == dvi_buf_size)\r
+ {\r
+ write_dvi(0, half_buf - 1);\r
+ dvi_limit = half_buf;\r
+ dvi_offset = dvi_offset + dvi_buf_size;\r
+ dvi_ptr = 0;\r
+ }\r
+ else\r
+ {\r
+ write_dvi(half_buf, dvi_buf_size - 1);\r
+ dvi_limit = dvi_buf_size;\r
+ }\r
+\r
+ dvi_gone = dvi_gone + half_buf;\r
+}\r
+/* sec 0600 */\r
+void dvi_four_(integer x)\r
+{ \r
+ if (x >= 0)\r
+ dvi_out(x / 0100000000);\r
+ else\r
+ {\r
+ x = x + 010000000000;\r
+ x = x + 010000000000;\r
+ dvi_out((x / 0100000000) + 128);\r
+ }\r
+\r
+ x = x % 0100000000;\r
+ dvi_out(x / 0200000);\r
+ x = x % 0200000;\r
+ dvi_out(x / 0400);\r
+ dvi_out(x % 0400);\r
+}\r
+/* sec 0601 */\r
+void dvi_pop_(integer l)\r
+{\r
+ if ((l == dvi_offset + dvi_ptr) && (dvi_ptr > 0))\r
+ decr(dvi_ptr);\r
+ else\r
+ dvi_out(pop);\r
+}\r
+/* sec 0602 */\r
+void dvi_font_def (internal_font_number f)\r
+{\r
+ pool_pointer k;\r
+\r
+#ifdef INCREASEFONTS\r
+ if (f <= 256)\r
+ {\r
+ dvi_out(fnt_def1);\r
+ dvi_out(f - 1);\r
+ }\r
+ else\r
+ {\r
+ dvi_out(fnt_def2);\r
+ dvi_out(((f - 1) >> 8));\r
+ dvi_out(((f - 1) & 255));\r
+ }\r
+#else\r
+ dvi_out(fnt_def1);\r
+ dvi_out(f - 1);\r
+#endif\r
+\r
+ dvi_out(font_check[f].b0);\r
+ dvi_out(font_check[f].b1);\r
+ dvi_out(font_check[f].b2);\r
+ dvi_out(font_check[f].b3);\r
+ dvi_four(font_size[f]); \r
+ dvi_four(font_dsize[f]);\r
+ dvi_out(length(font_area[f]));\r
+ dvi_out(length(font_name[f]));\r
+\r
+ for (k = str_start[font_area[f]]; k <= str_start[font_area[f] + 1] - 1; k++)\r
+ dvi_out(str_pool[k]);\r
+\r
+ for (k = str_start[font_name[f]]; k <= str_start[font_name[f] + 1] - 1; k++)\r
+ dvi_out(str_pool[k]);\r
+}\r
+/* sec 0607 */\r
+void movement (scaled w, eight_bits o)\r
+{\r
+ small_number mstate;\r
+ pointer p, q;\r
+ integer k;\r
+\r
+ q = get_node(movement_node_size);\r
+ width(q) = w;\r
+ location(q) = dvi_offset + dvi_ptr;\r
+\r
+ if (o == down1)\r
+ {\r
+ link(q) = down_ptr;\r
+ down_ptr = q;\r
+ }\r
+ else\r
+ {\r
+ link(q) = right_ptr;\r
+ right_ptr = q;\r
+ }\r
+\r
+ p = link(q);\r
+ mstate = none_seen;\r
+\r
+ while (p != 0)\r
+ {\r
+ if (width(p) == w)\r
+ switch (mstate + info(p))\r
+ {\r
+ case none_seen + yz_OK:\r
+ case none_seen + y_OK:\r
+ case z_seen + yz_OK:\r
+ case z_seen + y_OK:\r
+ if (location(p) < dvi_gone)\r
+ goto not_found;\r
+ else\r
+ {\r
+ k = location(p) - dvi_offset;\r
+\r
+ if (k < 0)\r
+ k = k + dvi_buf_size;\r
+\r
+ dvi_buf[k] = dvi_buf[k] + y1 - down1;\r
+ info(p) = y_here;\r
+ goto found;\r
+ }\r
+ break;\r
+\r
+ case none_seen + z_OK:\r
+ case y_seen + yz_OK:\r
+ case y_seen + z_OK:\r
+ if (location(p) < dvi_gone)\r
+ goto not_found;\r
+ else\r
+ {\r
+ k = location(p) - dvi_offset;\r
+\r
+ if (k < 0)\r
+ k = k + dvi_buf_size;\r
+\r
+ dvi_buf[k] = dvi_buf[k] + z1 - down1;\r
+ info(p) = z_here;\r
+ goto found;\r
+ }\r
+ break;\r
+\r
+ case none_seen + y_here:\r
+ case none_seen + z_here:\r
+ case y_seen + z_here:\r
+ case z_seen + y_here:\r
+ goto found;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ else\r
+ switch (mstate + info(p))\r
+ {\r
+ case none_seen + y_here:\r
+ mstate = y_seen;\r
+ break;\r
+\r
+ case none_seen + z_here:\r
+ mstate = z_seen;\r
+ break;\r
+\r
+ case y_seen + z_here:\r
+ case z_seen + y_here:\r
+ goto not_found;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ p = link(p);\r
+ }\r
+\r
+not_found:\r
+\r
+ info(q) = yz_OK;\r
+\r
+ if (abs(w) >= 8388608L) /* 2^23 */\r
+ {\r
+ dvi_out(o + 3);\r
+ dvi_four(w);\r
+ return;\r
+ }\r
+\r
+ if (abs(w) >= 32768L)\r
+ {\r
+ dvi_out(o + 2);\r
+\r
+ if (w < 0)\r
+ w = w + 16777216L; /* 2^24 */\r
+ //dvi_out(w / 65536L);\r
+ dvi_out((w >> 16));\r
+ //w = w % 65536L;\r
+ w = w & 65535L;\r
+ goto lab2;\r
+ }\r
+\r
+ if (abs(w) >= 128)\r
+ {\r
+ dvi_out(o + 1);\r
+\r
+ if (w < 0)\r
+ w = w + 65536L;\r
+\r
+ goto lab2;\r
+ }\r
+\r
+ dvi_out(o);\r
+\r
+ if (w < 0)\r
+ w = w + 256;\r
+\r
+ goto lab1;\r
+\r
+lab2:\r
+ dvi_out(w / 256);\r
+\r
+lab1:\r
+ dvi_out(w % 256);\r
+ return;\r
+\r
+found:\r
+ info(q) = info(p);\r
+\r
+ if (info(q) == y_here)\r
+ {\r
+ dvi_out(o + y0 - down1);\r
+\r
+ while (link(q) != p)\r
+ {\r
+ q = link(q);\r
+\r
+ switch (info(q))\r
+ {\r
+ case yz_OK:\r
+ info(q) = z_OK;\r
+ break;\r
+\r
+ case y_OK:\r
+ info(q) = d_fixed;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dvi_out(o + z0 - down1);\r
+\r
+ while (link(q) != p)\r
+ {\r
+ q = link(q);\r
+\r
+ switch (info(q))\r
+ {\r
+ case yz_OK:\r
+ info(q) = y_OK;\r
+ break;\r
+\r
+ case z_OK:\r
+ info(q) = d_fixed;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}\r
+/* sec 0615 */\r
+void prune_movements (integer l)\r
+{\r
+ pointer p;\r
+\r
+ while (down_ptr != 0)\r
+ {\r
+ if (location(down_ptr) < l)\r
+ goto done;\r
+\r
+ p = down_ptr;\r
+ down_ptr = link(p);\r
+ free_node(p, movement_node_size);\r
+ }\r
+\r
+done:\r
+ while (right_ptr != 0)\r
+ {\r
+ if (location(right_ptr) < l)\r
+ return;\r
+\r
+ p = right_ptr;\r
+ right_ptr = link(p);\r
+ free_node(p, movement_node_size);\r
+ }\r
+}\r
+/* sec 1368 */\r
+void special_out (pointer p)\r
+{\r
+ char old_setting;\r
+ pool_pointer k;\r
+\r
+ pdf_synch_h();//synch_h();\r
+ pdf_synch_h();//synch_v();\r
+ old_setting = selector;\r
+ selector = new_string;\r
+\r
+#ifdef ALLOCATESTRING\r
+ if (pool_ptr + 32000 > current_pool_size)\r
+ str_pool = realloc_str_pool (increment_pool_size);\r
+\r
+ show_token_list(link(write_tokens(p)), 0, 10000000L);\r
+#else\r
+ show_token_list(link(write_tokens(p)), 0, pool_size - pool_ptr);\r
+#endif\r
+\r
+ selector = old_setting;\r
+ str_room(1);\r
+ graphics_mode();\r
+ spc_exec_special(str_pool + str_start[str_ptr], cur_length, cur_h * 0.000015202, -cur_v * 0.000015202, 1.0);\r
+/*\r
+ if (cur_length < 256)\r
+ {\r
+ dvi_out(xxx1);\r
+ dvi_out(cur_length);\r
+ }\r
+ else\r
+ {\r
+ dvi_out(xxx4);\r
+ dvi_four(cur_length); \r
+ } \r
+\r
+ for (k = str_start[str_ptr]; k <= pool_ptr - 1; k++)\r
+ dvi_out(str_pool[k]);\r
+*/\r
+ pool_ptr = str_start[str_ptr];\r
+}\r
+/* sec 1370 */\r
+void write_out (pointer p)\r
+{\r
+ char old_setting;\r
+ /* integer old_mode; */\r
+ int old_mode;\r
+ /* small_number j; */\r
+ int j;\r
+ pointer q, r;\r
+\r
+ q = get_avail();\r
+ info(q) = right_brace_token + '}';\r
+ r = get_avail();\r
+ link(q) = r;\r
+ info(r) = end_write_token;\r
+ ins_list(q);\r
+ begin_token_list(write_tokens(p), write_text);\r
+ q = get_avail();\r
+ info(q) = left_brace_token + '{';\r
+ ins_list(q);\r
+ old_mode = mode;\r
+ mode = 0;\r
+ cur_cs = write_loc;\r
+ q = scan_toks(false, true);\r
+ get_token();\r
+\r
+ if (cur_tok != end_write_token)\r
+ {\r
+ print_err("Unbalanced write command");\r
+ help2("On this page there's a \\write with fewer real {'s than }'s.",\r
+ "I can't handle that very well; good luck.");\r
+ error();\r
+\r
+ do\r
+ {\r
+ get_token();\r
+ }\r
+ while (!(cur_tok == end_write_token));\r
+ }\r
+\r
+ mode = old_mode;\r
+ end_token_list();\r
+ old_setting = selector;\r
+ j = write_stream(p);\r
+\r
+ if (write_open[j])\r
+ selector = j;\r
+ else\r
+ {\r
+ if ((j == 17) && (selector == term_and_log))\r
+ selector = log_only;\r
+\r
+ print_nl("");\r
+ }\r
+\r
+ token_show(def_ref);\r
+ print_ln();\r
+ flush_list(def_ref);\r
+ selector = old_setting;\r
+}\r
+/* sec 1373 */\r
+void out_what (pointer p)\r
+{\r
+ /* small_number j; */\r
+ int j;\r
+\r
+ switch (subtype(p))\r
+ {\r
+ case open_node:\r
+ case write_node:\r
+ case close_node:\r
+ if (!doing_leaders)\r
+ {\r
+ j = write_stream(p);\r
+\r
+ if (subtype(p) == write_node)\r
+ write_out(p);\r
+ else\r
+ {\r
+ if (write_open[j])\r
+ a_close(write_file[j]); \r
+\r
+ if (subtype(p) == close_node)\r
+ write_open[j]= false;\r
+ else if (j < 16)\r
+ {\r
+ cur_name = open_name(p);\r
+ cur_area = open_area(p);\r
+ cur_ext = open_ext(p); \r
+\r
+ if (cur_ext == 335) /* "" */\r
+ cur_ext = 785; /* ".tex" */\r
+\r
+ pack_file_name(cur_name, cur_area, cur_ext);\r
+\r
+ while (!a_open_out(write_file[j]))\r
+ prompt_file_name("output file name", ".tex");\r
+\r
+ write_open[j] = true;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case special_node:\r
+ special_out(p); \r
+ break;\r
+\r
+ case language_node:\r
+ do_nothing();\r
+ break;\r
+\r
+ default:\r
+ {\r
+ confusion("ext4");\r
+ return;\r
+ }\r
+ break;\r
+ }\r
+}\r
+/* sec 0619 */\r
+void hlist_out (void)\r
+{\r
+ scaled base_line;\r
+ scaled left_edge;\r
+ scaled save_h, save_v;\r
+ pointer this_box;\r
+ /* glue_ord g_order; */\r
+ int g_order;\r
+ /* char g_sign; */\r
+ int g_sign;\r
+ pointer p;\r
+ integer save_loc;\r
+ pointer leader_box;\r
+ scaled leader_wd;\r
+ scaled lx;\r
+ boolean outer_doing_leaders;\r
+ scaled edge;\r
+ real glue_temp;\r
+ real cur_glue;\r
+ scaled cur_g;\r
+\r
+ cur_g = 0;\r
+ cur_glue = 0.0;\r
+ this_box = temp_ptr;\r
+ g_order = glue_order(this_box);\r
+ g_sign = glue_sign(this_box);\r
+ p = list_ptr(this_box);\r
+ incr(cur_s);\r
+\r
+ if (cur_s > 0)\r
+ dvi_out(push);\r
+\r
+ if (cur_s > max_push)\r
+ max_push = cur_s;\r
+\r
+ save_loc = dvi_offset + dvi_ptr;\r
+ base_line = cur_v;\r
+ left_edge = cur_h;\r
+\r
+ while (p != 0)\r
+reswitch:\r
+ if (is_char_node(p))\r
+ {\r
+ synch_h();\r
+ synch_v();\r
+\r
+ do\r
+ {\r
+ f = font(p);\r
+ c = character(p);\r
+\r
+ if (f != dvi_f)\r
+ {\r
+ if (!font_used[f])\r
+ {\r
+ dvi_font_def(f);\r
+ font_used[f] = true;\r
+ }\r
+\r
+ if (f <= 64 + font_base)\r
+ dvi_out(f - font_base - 1 + fnt_num_0);\r
+#ifdef INCREASEFONTS\r
+ else if (f <= 256)\r
+ {\r
+ dvi_out(fnt1);\r
+ dvi_out(f - 1);\r
+ }\r
+ else\r
+ {\r
+ dvi_out(fnt2);\r
+ dvi_out(((f - 1) >> 8));\r
+ dvi_out(((f - 1) & 255));\r
+ }\r
+#else\r
+ else\r
+ {\r
+ dvi_out(fnt1);\r
+ dvi_out(f - 1);\r
+ }\r
+#endif\r
+\r
+ dvi_f = f;\r
+ }\r
+\r
+ if (c >= 128)\r
+ dvi_out(set1);\r
+\r
+ dvi_out(c);\r
+ cur_h = cur_h + char_width(f, char_info(f, c));\r
+ p = link(p);\r
+ }\r
+ while (!(!is_char_node(p)));\r
+\r
+ dvi_h = cur_h;\r
+ }\r
+ else\r
+ {\r
+ switch (type(p))\r
+ {\r
+ case hlist_node:\r
+ case vlist_node:\r
+ if (list_ptr(p) == 0)\r
+ cur_h = cur_h + width(p);\r
+ else\r
+ {\r
+ save_h = dvi_h;\r
+ save_v = dvi_v;\r
+ cur_v = base_line + shift_amount(p);\r
+ temp_ptr = p;\r
+ edge = cur_h;\r
+\r
+ if (type(p) == vlist_node)\r
+ vlist_out();\r
+ else\r
+ hlist_out();\r
+\r
+ dvi_h = save_h;\r
+ dvi_v = save_v;\r
+ cur_h = edge + width(p);\r
+ cur_v = base_line;\r
+ }\r
+ break;\r
+\r
+ case rule_node:\r
+ {\r
+ rule_ht = height(p);\r
+ rule_dp = depth(p);\r
+ rule_wd = width(p);\r
+ goto fin_rule;\r
+ }\r
+ break;\r
+\r
+ case whatsit_node:\r
+ out_what(p);\r
+ break;\r
+\r
+ case glue_node:\r
+ {\r
+ g = glue_ptr(p);\r
+ rule_wd = width(g) - cur_g;\r
+\r
+ if (g_sign != normal)\r
+ {\r
+ if (g_sign == stretching)\r
+ {\r
+ if (stretch_order(g) == g_order)\r
+ {\r
+ cur_glue = cur_glue + stretch(g);\r
+ vet_glue(glue_set(this_box) * cur_glue);\r
+ cur_g = round(glue_temp);\r
+ }\r
+ }\r
+ else if (shrink_order(g) == g_order)\r
+ {\r
+ cur_glue = cur_glue - shrink(g);\r
+ vet_glue(glue_set(this_box) * cur_glue);\r
+ cur_g = round(glue_temp);\r
+ }\r
+ }\r
+\r
+ rule_wd = rule_wd + cur_g;\r
+\r
+ if (subtype(p) >= a_leaders)\r
+ {\r
+ leader_box = leader_ptr(p);\r
+\r
+ if (type(leader_box) == rule_node)\r
+ {\r
+ rule_ht = height(leader_box);\r
+ rule_dp = depth(leader_box);\r
+ goto fin_rule;\r
+ }\r
+\r
+ leader_wd = width(leader_box);\r
+\r
+ if ((leader_wd > 0) && (rule_wd > 0))\r
+ {\r
+ rule_wd = rule_wd + 10;\r
+ edge = cur_h + rule_wd;\r
+ lx = 0;\r
+\r
+ if (subtype(p) == a_leaders)\r
+ {\r
+ save_h = cur_h;\r
+ cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);\r
+\r
+ if (cur_h < save_h)\r
+ cur_h = cur_h + leader_wd;\r
+ }\r
+ else\r
+ {\r
+ lq = rule_wd / leader_wd;\r
+ lr = rule_wd % leader_wd;\r
+\r
+ if (subtype(p) == c_leaders)\r
+ cur_h = cur_h + (lr / 2);\r
+ else\r
+ {\r
+ lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+ cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);\r
+ }\r
+ }\r
+\r
+ while (cur_h + leader_wd <= edge)\r
+ {\r
+ cur_v = base_line + shift_amount(leader_box);\r
+ synch_v();\r
+ save_v = dvi_v;\r
+ synch_h();\r
+ save_h = dvi_h;\r
+ temp_ptr = leader_box;\r
+ outer_doing_leaders = doing_leaders;\r
+ doing_leaders = true;\r
+\r
+ if (type(leader_box) == vlist_node)\r
+ vlist_out();\r
+ else\r
+ hlist_out();\r
+\r
+ doing_leaders = outer_doing_leaders;\r
+ dvi_v = save_v;\r
+ dvi_h = save_h;\r
+ cur_v = base_line;\r
+ cur_h = save_h + leader_wd + lx;\r
+ }\r
+\r
+ cur_h = edge - 10;\r
+ goto next_p;\r
+ }\r
+ }\r
+\r
+ goto move_past;\r
+ }\r
+ break;\r
+\r
+ case kern_node:\r
+ case math_node:\r
+ cur_h = cur_h + width(p);\r
+ break;\r
+\r
+ case ligature_node:\r
+ {\r
+ mem[lig_trick] = mem[lig_char(p)];\r
+ link(lig_trick) = link(p);\r
+ p = lig_trick;\r
+ goto reswitch;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ goto next_p;\r
+\r
+fin_rule:\r
+ if (is_running(rule_ht))\r
+ rule_ht = height(this_box);\r
+\r
+ if (is_running(rule_dp))\r
+ rule_dp = depth(this_box);\r
+\r
+ rule_ht = rule_ht + rule_dp;\r
+\r
+ if ((rule_ht > 0) && (rule_wd > 0))\r
+ {\r
+ synch_h();\r
+ cur_v = base_line + rule_dp;\r
+ synch_v();\r
+ dvi_out(set_rule);\r
+ dvi_four(rule_ht);\r
+ dvi_four(rule_wd);\r
+ cur_v = base_line;\r
+ dvi_h = dvi_h + rule_wd;\r
+ }\r
+\r
+move_past:\r
+ cur_h = cur_h + rule_wd;\r
+\r
+next_p:\r
+ p = link(p);\r
+ }\r
+\r
+ prune_movements(save_loc);\r
+\r
+ if (cur_s > 0)\r
+ dvi_pop(save_loc);\r
+\r
+ decr(cur_s);\r
+}\r
+/* sec 0629 */\r
+void vlist_out (void)\r
+{\r
+ scaled left_edge;\r
+ scaled top_edge;\r
+ scaled save_h, save_v;\r
+ pointer this_box;\r
+ /* glue_ord g_order; */\r
+ int g_order;\r
+ /* char g_sign; */\r
+ int g_sign;\r
+ pointer p;\r
+ integer save_loc;\r
+ pointer leader_box;\r
+ scaled leader_ht;\r
+ scaled lx;\r
+ boolean outer_doing_leaders;\r
+ scaled edge;\r
+ real glue_temp;\r
+ real cur_glue;\r
+ scaled cur_g;\r
+\r
+ cur_g = 0;\r
+ cur_glue = 0.0;\r
+ this_box = temp_ptr;\r
+ g_order = glue_order(this_box);\r
+ g_sign = glue_sign(this_box);\r
+ p = list_ptr(this_box);\r
+ incr(cur_s);\r
+\r
+ if (cur_s > 0)\r
+ dvi_out(push);\r
+\r
+ if (cur_s > max_push)\r
+ max_push = cur_s;\r
+\r
+ save_loc = dvi_offset + dvi_ptr;\r
+ left_edge = cur_h;\r
+ cur_v = cur_v - height(this_box);\r
+ top_edge = cur_v;\r
+\r
+ while (p != 0)\r
+ {\r
+ if (is_char_node(p))\r
+ {\r
+ confusion("vlistout");\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ switch (type(p))\r
+ {\r
+ case hlist_node:\r
+ case vlist_node:\r
+ if (list_ptr(p) == 0)\r
+ cur_v = cur_v + height(p) + depth(p);\r
+ else\r
+ {\r
+ cur_v = cur_v + height(p);\r
+ synch_v();\r
+ save_h = dvi_h;\r
+ save_v = dvi_v;\r
+ cur_h = left_edge + shift_amount(p);\r
+ temp_ptr = p;\r
+\r
+ if (type(p) == vlist_node)\r
+ vlist_out();\r
+ else\r
+ hlist_out();\r
+\r
+ dvi_h = save_h;\r
+ dvi_v = save_v;\r
+ cur_v = save_v + depth(p);\r
+ cur_h = left_edge;\r
+ }\r
+ break;\r
+\r
+ case rule_node:\r
+ {\r
+ rule_ht = height(p);\r
+ rule_dp = depth(p);\r
+ rule_wd = width(p);\r
+ goto fin_rule;\r
+ }\r
+ break;\r
+\r
+ case whatsit_node:\r
+ out_what(p);\r
+ break;\r
+\r
+ case glue_node:\r
+ {\r
+ g = glue_ptr(p);\r
+ rule_ht = width(g) - cur_g;\r
+\r
+ if (g_sign != normal)\r
+ {\r
+ if (g_sign == stretching)\r
+ {\r
+ if (stretch_order(g) == g_order)\r
+ {\r
+ cur_glue = cur_glue + stretch(g);\r
+ vet_glue(glue_set(this_box) * cur_glue);\r
+ cur_g = round(glue_temp);\r
+ }\r
+ }\r
+ else if (shrink_order(g) == g_order) /* BUG FIX !!! */\r
+ {\r
+ cur_glue = cur_glue - shrink(g);\r
+ vet_glue(glue_set(this_box) * cur_glue);\r
+ cur_g = round(glue_temp);\r
+ }\r
+ }\r
+\r
+ rule_ht = rule_ht + cur_g;\r
+\r
+ if (subtype(p) >= a_leaders)\r
+ {\r
+ leader_box = leader_ptr(p);\r
+\r
+ if (type(leader_box) == rule_node)\r
+ {\r
+ rule_wd = width(leader_box);\r
+ rule_dp = 0;\r
+ goto fin_rule;\r
+ }\r
+\r
+ leader_ht = height(leader_box) + depth(leader_box);\r
+\r
+ if ((leader_ht > 0) && (rule_ht > 0))\r
+ {\r
+ rule_ht = rule_ht + 10;\r
+ edge = cur_v + rule_ht;\r
+ lx = 0;\r
+\r
+ if (subtype(p) == a_leaders)\r
+ {\r
+ save_v = cur_v;\r
+ cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);\r
+\r
+ if (cur_v < save_v)\r
+ cur_v = cur_v + leader_ht;\r
+ }\r
+ else\r
+ {\r
+ lq = rule_ht / leader_ht;\r
+ lr = rule_ht % leader_ht;\r
+\r
+ if (subtype(p) == c_leaders)\r
+ cur_v = cur_v + (lr / 2);\r
+ else\r
+ {\r
+ lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+ cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);\r
+ }\r
+ }\r
+\r
+ while (cur_v + leader_ht <= edge)\r
+ {\r
+ cur_h = left_edge + shift_amount(leader_box);\r
+ synch_h();\r
+ save_h = dvi_h;\r
+ cur_v = cur_v + height(leader_box);\r
+ synch_v();\r
+ save_v = dvi_v;\r
+ temp_ptr = leader_box;\r
+ outer_doing_leaders = doing_leaders;\r
+ doing_leaders = true;\r
+\r
+ if (type(leader_box) == vlist_node)\r
+ vlist_out();\r
+ else\r
+ hlist_out();\r
+\r
+ doing_leaders = outer_doing_leaders;\r
+ dvi_v = save_v;\r
+ dvi_h = save_h;\r
+ cur_h = left_edge;\r
+ cur_v = save_v - height(leader_box) + leader_ht + lx;\r
+ }\r
+\r
+ cur_v = edge - 10;\r
+ goto next_p;\r
+ }\r
+ }\r
+\r
+ goto move_past;\r
+ }\r
+ break;\r
+\r
+ case kern_node:\r
+ cur_v = cur_v + width(p);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ goto next_p;\r
+\r
+fin_rule:\r
+ if (is_running(rule_wd))\r
+ rule_wd = width(this_box);\r
+\r
+ rule_ht = rule_ht + rule_dp;\r
+ cur_v = cur_v + rule_ht;\r
+\r
+ if ((rule_ht > 0) && (rule_wd > 0))\r
+ {\r
+ synch_h();\r
+ synch_v();\r
+ dvi_out(put_rule);\r
+ dvi_four(rule_ht);\r
+ dvi_four(rule_wd);\r
+ }\r
+\r
+ goto next_p;\r
+\r
+move_past:\r
+ cur_v = cur_v + rule_ht;\r
+ }\r
+\r
+next_p:\r
+ p = link(p);\r
+ }\r
+\r
+ prune_movements(save_loc);\r
+\r
+ if (cur_s > 0)\r
+ dvi_pop(save_loc);\r
+\r
+ decr(cur_s);\r
+}\r
+/* sec 0638 */\r
+void dvi_ship_out_(pointer p)\r
+{\r
+ integer page_loc;\r
+ char j, k;\r
+ pool_pointer s;\r
+ char old_setting;\r
+\r
+ if (tracing_output > 0)\r
+ {\r
+ print_nl("");\r
+ print_ln();\r
+ prints("Completed box being shipped out");\r
+ }\r
+\r
+ if (term_offset > max_print_line - 9)\r
+ print_ln();\r
+ else if ((term_offset > 0) || (file_offset > 0))\r
+ print_char(' ');\r
+\r
+ print_char('[');\r
+ j = 9;\r
+\r
+ while ((count(j) == 0) && (j > 0))\r
+ decr(j);\r
+\r
+ for (k = 0; k <= j; k++)\r
+ {\r
+ print_int(count(k));\r
+\r
+ if (k < j)\r
+ print_char('.');\r
+ }\r
+ \r
+ update_terminal();\r
+\r
+ if (tracing_output > 0)\r
+ {\r
+ print_char(']');\r
+ begin_diagnostic();\r
+ show_box(p);\r
+ end_diagnostic(true);\r
+ }\r
+\r
+ if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||\r
+ (height(p) + depth(p) + v_offset > max_dimen) ||\r
+ (width(p) + h_offset > max_dimen))\r
+ {\r
+ print_err("Huge page cannot be shipped out");\r
+ help2("The page just created is more than 18 feet tall or",\r
+ "more than 18 feet wide, so I suspect something went wrong.");\r
+ error();\r
+\r
+ if (tracing_output <= 0)\r
+ {\r
+ begin_diagnostic();\r
+ print_nl("The following box has been deleted:");\r
+ show_box(p);\r
+ end_diagnostic(true);\r
+ }\r
+\r
+ goto done;\r
+ }\r
+\r
+ if (height(p) + depth(p) + v_offset > max_v)\r
+ max_v = height(p) + depth(p) + v_offset;\r
+\r
+ if (width(p) + h_offset > max_h)\r
+ max_h = width(p) + h_offset;\r
+\r
+ dvi_h = 0;\r
+ dvi_v = 0;\r
+ cur_h = h_offset;\r
+ dvi_f = null_font;\r
+ ensure_dvi_open();\r
+\r
+ if (total_pages == 0)\r
+ {\r
+ dvi_out(pre);\r
+ dvi_out(id_byte);\r
+ dvi_four(25400000L);\r
+ dvi_four(473628672L);\r
+ prepare_mag();\r
+ dvi_four(mag);\r
+ old_setting = selector;\r
+ selector = new_string;\r
+ prints(" TeX output ");\r
+ print_int(year);\r
+ print_char('.');\r
+ print_two(month);\r
+ print_char('.');\r
+ print_two(day);\r
+ print_char(':');\r
+ print_two(tex_time / 60);\r
+ print_two(tex_time % 60);\r
+ selector = old_setting;\r
+ dvi_out(cur_length);\r
+\r
+ for (s = str_start[str_ptr]; s <= pool_ptr - 1; s++)\r
+ dvi_out(str_pool[s]);\r
+\r
+ pool_ptr = str_start[str_ptr];\r
+ }\r
+\r
+ page_loc = dvi_offset + dvi_ptr;\r
+ dvi_out(bop);\r
+\r
+ for (k = 0; k <= 9; k++)\r
+ dvi_four(count(k));\r
+\r
+ dvi_four(last_bop);\r
+ last_bop = page_loc;\r
+ cur_v = height(p) + v_offset;\r
+ temp_ptr = p;\r
+\r
+ if (type(p) == vlist_node)\r
+ vlist_out();\r
+ else\r
+ hlist_out();\r
+\r
+ dvi_out(eop);\r
+ incr(total_pages);\r
+ cur_s = -1;\r
+\r
+done:\r
+ if (tracing_output <= 0)\r
+ print_char(']');\r
+\r
+ dead_cycles = 0;\r
+ update_terminal();\r
+\r
+#ifdef STAT\r
+ if (tracing_stats > 1)\r
+ {\r
+ print_nl("Memory usage before: ");\r
+ print_int(var_used);\r
+ print_char('&');\r
+ print_int(dyn_used);\r
+ print_char(';');\r
+ }\r
+#endif\r
+\r
+ flush_node_list(p);\r
+\r
+#ifdef STAT\r
+ if (tracing_stats > 1)\r
+ {\r
+ prints(" after: ");\r
+ print_int(var_used);\r
+ print_char('&');\r
+ print_int(dyn_used);\r
+ prints("; still utouched: ");\r
+ print_int(hi_mem_min - lo_mem_max - 1);\r
+ print_ln();\r
+ }\r
+#endif\r
+}\r
+void ship_out (pointer p)\r
+{;\r
+ pdf_ship_out(p);\r
+ /*\r
+ switch (shipout_flag)\r
+ {\r
+ case out_dvi_flag:\r
+ case out_xdv_flag:\r
+ dvi_ship_out_(p);\r
+ break;\r
+ case out_pdf_flag:\r
+ //pdf_ship_out(p);\r
+ break;\r
+ }*/\r
+}\r
+/* sec 0645 */\r
+void scan_spec (group_code c, boolean three_codes)\r
+{\r
+ integer s;\r
+ char spec_code;\r
+\r
+ if (three_codes)\r
+ s = saved(0);\r
+\r
+ if (scan_keyword("to"))\r
+ spec_code = exactly;\r
+ else if (scan_keyword("spread"))\r
+ spec_code = additional;\r
+ else\r
+ {\r
+ spec_code = additional;\r
+ cur_val = 0;\r
+ goto found;\r
+ }\r
+\r
+ scan_dimen(false, false, false);\r
+\r
+found:\r
+ if (three_codes)\r
+ {\r
+ saved(0) = s;\r
+ incr(save_ptr);\r
+ }\r
+\r
+ saved(0) = spec_code;\r
+ saved(1) = cur_val;\r
+ save_ptr = save_ptr + 2;\r
+ new_save_level(c);\r
+ scan_left_brace();\r
+}\r
+/* sec 0649 */\r
+pointer hpack_(pointer p, scaled w, small_number m)\r
+{\r
+ pointer r;\r
+ pointer q;\r
+ scaled h, d, x;\r
+ scaled s;\r
+ pointer g;\r
+ /* glue_ord o; */\r
+ int o;\r
+ internal_font_number f;\r
+ four_quarters i;\r
+ eight_bits hd;\r
+\r
+ last_badness = 0;\r
+ r = get_node(box_node_size);\r
+ type(r) = hlist_node;\r
+ subtype(r) = 0;\r
+ shift_amount(r) = 0;\r
+ q = r + list_offset;\r
+ link(q) = p;\r
+ h = 0;\r
+ d = 0;\r
+ x = 0;\r
+ total_stretch[normal] = 0;\r
+ total_shrink[normal] = 0;\r
+ total_stretch[fil] = 0;\r
+ total_shrink[fil] = 0;\r
+ total_stretch[fill] = 0;\r
+ total_shrink[fill] = 0;\r
+ total_stretch[filll] = 0;\r
+ total_shrink[filll] = 0;\r
+\r
+ while (p != 0)\r
+ {\r
+reswitch:\r
+\r
+ while (is_char_node(p))\r
+ {\r
+ f = font(p);\r
+ i = char_info(f, character(p));\r
+ hd = height_depth(i);\r
+ x = x + char_width(f, i);\r
+ s = char_height(f, hd);\r
+\r
+ if (s > h)\r
+ h = s;\r
+\r
+ s = char_depth(f, hd);\r
+\r
+ if (s > d)\r
+ d = s;\r
+\r
+ p = link(p);\r
+ }\r
+\r
+ if (p != 0)\r
+ {\r
+ switch (type(p))\r
+ {\r
+ case hlist_node:\r
+ case vlist_node:\r
+ case rule_node:\r
+ case unset_node:\r
+ {\r
+ x = x + width(p);\r
+\r
+ if (type(p) >= rule_node)\r
+ s = 0;\r
+ else\r
+ s = shift_amount(p);\r
+\r
+ if (height(p) - s > h)\r
+ h = height(p) - s;\r
+\r
+ if (depth(p) + s > d)\r
+ d = depth(p) + s;\r
+ }\r
+ break;\r
+\r
+ case ins_node:\r
+ case mark_node:\r
+ case adjust_node:\r
+ if (adjust_tail != 0)\r
+ {\r
+ while (link(q) != p)\r
+ q = link(q);\r
+\r
+ if (type(p) == adjust_node)\r
+ {\r
+ link(adjust_tail) = adjust_ptr(p);\r
+\r
+ while (link(adjust_tail) != 0)\r
+ adjust_tail = link(adjust_tail);\r
+\r
+ p = link(p);\r
+ free_node(link(q), small_node_size);\r
+ }\r
+ else\r
+ {\r
+ link(adjust_tail) = p;\r
+ adjust_tail = p;\r
+ p = link(p);\r
+ }\r
+\r
+ link(q) = p;\r
+ p = q;\r
+ }\r
+ break;\r
+\r
+ case whatsit_node:\r
+ break;\r
+\r
+ case glue_node:\r
+ {\r
+ g = glue_ptr(p);\r
+ x = x + width(g);\r
+ o = stretch_order(g);\r
+ total_stretch[o] = total_stretch[o] + stretch(g);\r
+ o = shrink_order(g);\r
+ total_shrink[o] = total_shrink[o] + shrink(g);\r
+\r
+ if (subtype(p) >= a_leaders)\r
+ {\r
+ g = leader_ptr(p);\r
+\r
+ if (height(g) > h)\r
+ h = height(g);\r
+\r
+ if (depth(g) > d)\r
+ d = depth(g);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case kern_node:\r
+ case math_node:\r
+ x = x + width(p);\r
+ break;\r
+\r
+ case ligature_node:\r
+ {\r
+ mem[lig_trick] = mem[lig_char(p)];\r
+ link(lig_trick) = link(p);\r
+ p = lig_trick;\r
+ goto reswitch;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ p = link(p);\r
+ }\r
+ }\r
+\r
+ if (adjust_tail != 0)\r
+ link(adjust_tail) = 0;\r
+\r
+ height(r) = h;\r
+ depth(r) = d;\r
+\r
+ if (m == additional)\r
+ w = x + w;\r
+\r
+ width(r) = w;\r
+ x = w - x;\r
+\r
+ if (x == 0)\r
+ {\r
+ glue_sign(r) = normal;\r
+ glue_order(r) = normal;\r
+ glue_set(r) = 0.0;\r
+ goto exit;\r
+ }\r
+ else if (x > 0)\r
+ {\r
+ if (total_stretch[filll] != 0)\r
+ o = filll;\r
+ else if (total_stretch[fill] != 0)\r
+ o = fill;\r
+ else if (total_stretch[fil] != 0)\r
+ o = fil;\r
+ else\r
+ o = normal;\r
+\r
+ glue_order(r) = o;\r
+ glue_sign(r) = stretching;\r
+\r
+ if (total_stretch[o] != 0)\r
+ glue_set(r) = x / ((double) total_stretch[o]);\r
+ else\r
+ {\r
+ glue_sign(r) = normal;\r
+ glue_set(r) = 0.0;\r
+ }\r
+\r
+ if (o == normal)\r
+ if (list_ptr(r) != 0)\r
+ {\r
+ last_badness = badness(x, total_stretch[normal]);\r
+\r
+ if (last_badness > hbadness)\r
+ {\r
+ print_ln();\r
+\r
+ if (last_badness > 100)\r
+ print_nl("Underfull");\r
+ else\r
+ print_nl("Loose");\r
+\r
+ prints(" \\hbox (badness ");\r
+ print_int(last_badness);\r
+\r
+ if (last_badness > 100)\r
+ underfull_hbox++;\r
+\r
+ goto common_ending;\r
+ }\r
+ }\r
+\r
+ goto exit;\r
+ }\r
+ else\r
+ {\r
+ if (total_shrink[filll] != 0)\r
+ o = filll;\r
+ else if (total_shrink[fill] != 0)\r
+ o = fill;\r
+ else if (total_shrink[fil] != 0)\r
+ o = fil;\r
+ else\r
+ o = normal;\r
+\r
+ glue_order(r) = o;\r
+ glue_sign(r) = shrinking;\r
+\r
+ if (total_shrink[o] != 0)\r
+ glue_set(r) = ((- (integer) x) / ((double) total_shrink[o]));\r
+ else\r
+ {\r
+ glue_sign(r) = normal;\r
+ glue_set(r) = 0.0;\r
+ }\r
+\r
+ if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))\r
+ {\r
+ last_badness = 1000000L;\r
+ glue_set(r) = 1.0;\r
+\r
+ if ((- (integer) x - total_shrink[normal] > hfuzz) || (hbadness < 100))\r
+ {\r
+ if ((overfull_rule > 0) && (- (integer) x - total_shrink[0] > hfuzz))\r
+ {\r
+ while (link(q) != 0)\r
+ q = link(q);\r
+ \r
+ link(q) = new_rule();\r
+ width(link(q)) = overfull_rule;\r
+ }\r
+ \r
+ print_ln();\r
+ print_nl("Overfull \\hbox (");\r
+ print_scaled(- (integer) x - total_shrink[normal]);\r
+ prints("pt too wide");\r
+ \r
+ overfull_hbox++;\r
+ goto common_ending;\r
+ }\r
+ }\r
+ else if (o == normal)\r
+ if (list_ptr(r) != 0)\r
+ {\r
+ last_badness = badness(- (integer) x, total_shrink[normal]);\r
+\r
+ if (last_badness > hbadness)\r
+ {\r
+ print_ln();\r
+ print_nl("Tight \\hbox (badness ");\r
+ print_int(last_badness);\r
+ goto common_ending;\r
+ }\r
+ }\r
+\r
+ goto exit;\r
+ }\r
+\r
+common_ending:\r
+\r
+ if (output_active)\r
+ prints(") has occurred while \\output is active");\r
+ else\r
+ {\r
+ if (pack_begin_line != 0)\r
+ {\r
+ if (pack_begin_line > 0)\r
+ prints(") in paragraph at lines ");\r
+ else\r
+ prints(") in alignment at lines ");\r
+\r
+ print_int(abs(pack_begin_line));\r
+ prints("--");\r
+ }\r
+ else\r
+ prints(") detected at line ");\r
+\r
+ print_int(line);\r
+ }\r
+\r
+ print_ln();\r
+ font_in_short_display = null_font;\r
+ short_display(list_ptr(r));\r
+ print_ln();\r
+ begin_diagnostic();\r
+ show_box(r);\r
+ end_diagnostic(true);\r
+\r
+exit:\r
+ return r;\r
+}\r
+/* sec 0668 */\r
+pointer vpackage_(pointer p, scaled h, small_number m, scaled l)\r
+{\r
+ pointer r;\r
+ scaled w, d, x;\r
+ scaled s;\r
+ pointer g;\r
+ /* glue_ord o; */\r
+ int o;\r
+\r
+ last_badness = 0;\r
+ r = get_node(box_node_size);\r
+ type(r) = vlist_node;\r
+ subtype(r) = min_quarterword;\r
+ shift_amount(r) = 0;\r
+ list_ptr(r) = p;\r
+ w = 0;\r
+ d = 0;\r
+ x = 0;\r
+ total_stretch[normal] = 0;\r
+ total_shrink[normal] = 0;\r
+ total_stretch[fil] = 0;\r
+ total_shrink[fil] = 0;\r
+ total_stretch[fill] = 0;\r
+ total_shrink[fill] = 0;\r
+ total_stretch[filll] = 0;\r
+ total_shrink[filll] = 0;\r
+\r
+ while (p != 0)\r
+ {\r
+ if (is_char_node(p))\r
+ {\r
+ confusion("vpack");\r
+ return 0;\r
+ }\r
+ else switch (type(p))\r
+ {\r
+ case hlist_node:\r
+ case vlist_node:\r
+ case rule_node:\r
+ case unset_node:\r
+ {\r
+ x = x + d + height(p);\r
+ d = depth(p);\r
+\r
+ if (type(p) >= rule_node)\r
+ s = 0;\r
+ else\r
+ s = shift_amount(p);\r
+\r
+ if (width(p) + s > w)\r
+ w = width(p) + s;\r
+ }\r
+ break;\r
+\r
+ case whatsit_node:\r
+ break;\r
+\r
+ case glue_node:\r
+ {\r
+ x = x + d;\r
+ d = 0;\r
+ g = glue_ptr(p);\r
+ x = x + width(g);\r
+ o = stretch_order(g);\r
+ total_stretch[o] = total_stretch[o] + stretch(g);\r
+ o = shrink_order(g);\r
+ total_shrink[o] = total_shrink[o] + shrink(g);\r
+\r
+ if (subtype(p) >= a_leaders)\r
+ {\r
+ g = leader_ptr(p);\r
+\r
+ if (width(g) > w)\r
+ w = width(g);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case kern_node:\r
+ {\r
+ x = x + d + width(p);\r
+ d = 0;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ p = link(p);\r
+ }\r
+\r
+ width(r) = w;\r
+\r
+ if (d > l)\r
+ {\r
+ x = x + d - l;\r
+ depth(r) = l;\r
+ }\r
+ else\r
+ depth(r) = d;\r
+\r
+ if (m == additional)\r
+ h = x + h;\r
+\r
+ height(r) = h;\r
+ x = h - x;\r
+\r
+ if (x == 0)\r
+ {\r
+ glue_sign(r) = normal;\r
+ glue_order(r) = normal;\r
+ glue_set(r) = 0.0;\r
+ goto exit;\r
+ }\r
+ else if (x > 0)\r
+ {\r
+ if (total_stretch[filll] != 0)\r
+ o = filll;\r
+ else if (total_stretch[fill] != 0)\r
+ o = fill;\r
+ else if (total_stretch[fil] != 0)\r
+ o = fil;\r
+ else\r
+ o = normal;\r
+\r
+ glue_order(r) = o;\r
+ glue_sign(r) = stretching;\r
+\r
+ if (total_stretch[o] != 0)\r
+ glue_set(r) = x / ((double) total_stretch[o]);\r
+ else\r
+ {\r
+ glue_sign(r) = normal;\r
+ glue_set(r) = 0.0;\r
+ }\r
+\r
+ if (o == normal)\r
+ if (list_ptr(r) != 0)\r
+ {\r
+ last_badness = badness(x, total_stretch[normal]);\r
+\r
+ if (last_badness > vbadness)\r
+ {\r
+ print_ln();\r
+\r
+ if (last_badness > 100)\r
+ print_nl("Underfull");\r
+ else\r
+ print_nl("Loose");\r
+\r
+ prints(" \\vbox (badness ");\r
+ print_int(last_badness);\r
+\r
+ if (last_badness > 100)\r
+ underfull_vbox++;\r
+\r
+ goto common_ending;\r
+ }\r
+ }\r
+\r
+ goto exit;\r
+ }\r
+ else\r
+ {\r
+ if (total_shrink[filll] != 0)\r
+ o = filll;\r
+ else if (total_shrink[fill] != 0)\r
+ o = fill;\r
+ else if (total_shrink[fil] != 0)\r
+ o = fil;\r
+ else\r
+ o = normal;\r
+\r
+ glue_order(r) = o;\r
+ glue_sign(r) = shrinking;\r
+\r
+ if (total_shrink[o] != 0)\r
+ glue_set(r) = (- (integer) x) / ((double) total_shrink[o]);\r
+ else\r
+ {\r
+ glue_sign(r) = normal;\r
+ glue_set(r) = 0.0;\r
+ }\r
+\r
+ if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))\r
+ {\r
+ last_badness = 1000000L;\r
+ glue_set(r) = 1.0;\r
+\r
+ if ((- (integer) x - total_shrink[0] > vfuzz) || (vbadness < 100))\r
+ {\r
+ print_ln();\r
+ print_nl("Overfull \\vbox (");\r
+ print_scaled(- (integer) x - total_shrink[0]);\r
+ prints("pt too high");\r
+\r
+ overfull_vbox++;\r
+\r
+ goto common_ending;\r
+ }\r
+ }\r
+ else if (o == 0)\r
+ if (list_ptr(r) != 0)\r
+ {\r
+ last_badness = badness(- (integer) x, total_shrink[normal]);\r
+ if (last_badness > vbadness)\r
+ {\r
+ print_ln();\r
+ print_nl("Tight \\vbox (badness ");\r
+ print_int(last_badness);\r
+ goto common_ending;\r
+ }\r
+ }\r
+\r
+ goto exit;\r
+ }\r
+\r
+common_ending:\r
+\r
+ if (output_active)\r
+ prints(") has occurred while \\output is active");\r
+ else\r
+ {\r
+ if (pack_begin_line != 0)\r
+ {\r
+ prints(") in alignment at lines ");\r
+ print_int(abs(pack_begin_line));\r
+ prints("--");\r
+ }\r
+ else\r
+ prints(") detected at line ");\r
+\r
+ print_int(line);\r
+ print_ln();\r
+ }\r
+\r
+ begin_diagnostic();\r
+ show_box(r);\r
+ end_diagnostic(true);\r
+\r
+exit:\r
+ return r;\r
+}\r
+/* sec 0679 */\r
+void append_to_vlist (pointer b)\r
+{\r
+ scaled d;\r
+ pointer p;\r
+\r
+ if (prev_depth > ignore_depth)\r
+ {\r
+ d = width(baseline_skip) - prev_depth - height(b);\r
+\r
+ if (d < line_skip_limit)\r
+ p = new_param_glue(line_skip_code);\r
+ else\r
+ {\r
+ p = new_skip_param(baseline_skip_code);\r
+ width(temp_ptr) = d;\r
+ }\r
+\r
+ link(tail) = p;\r
+ tail = p;\r
+ }\r
+\r
+ link(tail) = b;\r
+ tail = b;\r
+ prev_depth = depth(b);\r
+}\r
+/* sec 0686 */\r
+pointer new_noad (void)\r
+{\r
+ pointer p;\r
+\r
+ p = get_node(noad_size);\r
+ type(p) = ord_noad;\r
+ subtype(p) = normal;\r
+ mem[nucleus(p)].hh = empty_field;\r
+ mem[subscr(p)].hh = empty_field;\r
+ mem[supscr(p)].hh = empty_field;\r
+\r
+ return p;\r
+}\r
+/* sec 0688 */\r
+pointer new_style (small_number s)\r
+{\r
+ pointer p;\r
+\r
+ p = get_node(style_node_size);\r
+ type(p) = style_node;\r
+ subtype(p) = s;\r
+ width(p) = 0;\r
+ depth(p) = 0;\r
+\r
+ return p;\r
+}\r
+/* sec 0689 */\r
+pointer new_choice (void)\r
+{\r
+ pointer p;\r
+\r
+ p = get_node(style_node_size);\r
+ type(p) = choice_node;\r
+ subtype(p) = 0;\r
+ display_mlist(p) = 0;\r
+ text_mlist(p) = 0;\r
+ script_mlist(p) = 0;\r
+ script_script_mlist(p) = 0;\r
+\r
+ return p;\r
+}\r
+/* sec 0693 */\r
+void show_info (void)\r
+{\r
+ show_node_list(info(temp_ptr));\r
+}\r
+/* sec 0704 */\r
+pointer fraction_rule (scaled t)\r
+{\r
+ pointer p;\r
+\r
+ p = new_rule();\r
+ height(p) = t;\r
+ depth(p) = 0;\r
+\r
+ return p;\r
+}\r
+/* sec 0705 */\r
+pointer overbar (pointer b, scaled k, scaled t)\r
+{\r
+ pointer p, q;\r
+\r
+ p = new_kern(k);\r
+ link(p) = b;\r
+ q = fraction_rule(t);\r
+ link(q) = p;\r
+ p = new_kern(t);\r
+ link(p) = q;\r
+\r
+ return vpackage(p, 0, 1, max_dimen);\r
+}\r
+/* sec 0709 */\r
+pointer char_box (internal_font_number f, quarterword c)\r
+{\r
+ four_quarters q;\r
+ eight_bits hd;\r
+ pointer b, p;\r
+\r
+ q = char_info(f, c);\r
+ hd = height_depth(q);\r
+ b = new_null_box();\r
+ width(b) = char_width(f, q) + char_italic(f, q);\r
+ height(b) = char_height(f, hd);\r
+ depth(b) = char_depth(f, hd);\r
+ p = get_avail();\r
+ character(p) = c;\r
+ font(p) = f;\r
+ list_ptr(b) = p;\r
+\r
+ return b;\r
+}\r
+/* sec 0711 */\r
+void stack_into_box (pointer b, internal_font_number f, quarterword c)\r
+{\r
+ pointer p;\r
+\r
+ p = char_box(f, c);\r
+ link(p) = list_ptr(b);\r
+ list_ptr(b) = p;\r
+ height(b) = height(p);\r
+}\r
+/* sec 0712 */\r
+scaled height_plus_depth (internal_font_number f, quarterword c)\r
+{\r
+ four_quarters q;\r
+ eight_bits hd;\r
+\r
+ q = char_info(f, c);\r
+ hd = height_depth(q);\r
+\r
+ return char_height(f, hd) + char_depth(f, hd);\r
+}\r
+/* sec 0706 */\r
+pointer var_delimiter (pointer d, small_number s, scaled v)\r
+{\r
+ pointer b;\r
+ internal_font_number f, g;\r
+ quarterword c, x, y;\r
+ integer m, n;\r
+ scaled u;\r
+ scaled w;\r
+ four_quarters q;\r
+ four_quarters r;\r
+ eight_bits hd;\r
+ /* small_number z; */\r
+ int z;\r
+ boolean large_attempt;\r
+\r
+ f = null_font;\r
+ w = 0;\r
+ large_attempt = false;\r
+ z = small_fam(d);\r
+ x = small_char(d);\r
+\r
+ while (true)\r
+ {\r
+ if ((z != 0) || (x != 0))\r
+ {\r
+ z = z + s + 16;\r
+\r
+ do\r
+ {\r
+ z = z - 16;\r
+ g = fam_fnt(z);\r
+\r
+ if (g != null_font)\r
+ {\r
+ y = x;\r
+\r
+ if ((y >= font_bc[g]) && (y <= font_ec[g]))\r
+ {\r
+continu:\r
+ q = char_info(g, y);\r
+ \r
+ if (char_exists(q))\r
+ {\r
+ if (char_tag(q) == ext_tag)\r
+ {\r
+ f = g;\r
+ c = y;\r
+ goto found;\r
+ }\r
+\r
+ hd = height_depth(q);\r
+ u = char_height(g, hd) + char_depth(g, hd);\r
+\r
+ if (u > w)\r
+ {\r
+ f = g;\r
+ c = y;\r
+ w = u;\r
+\r
+ if (u >= v)\r
+ goto found;\r
+ }\r
+\r
+ if (char_tag(q) == list_tag)\r
+ {\r
+ y = rem_byte(q);\r
+ goto continu;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ while (!(z < 16));\r
+ }\r
+\r
+ if (large_attempt)\r
+ goto found;\r
+\r
+ large_attempt = true;\r
+ z = large_fam(d);\r
+ x = large_char(d);\r
+ }\r
+\r
+found:\r
+ if (f != null_font)\r
+ if (char_tag(q) == ext_tag)\r
+ {\r
+ b = new_null_box();\r
+ type(b) = vlist_node;\r
+ r = font_info[exten_base[f] + rem_byte(q)].qqqq;\r
+ c = ext_rep(r);\r
+ u = height_plus_depth(f, c);\r
+ w = 0;\r
+ q = char_info(f, c);\r
+ width(b) = char_width(f, q) + char_italic(f, q);\r
+ c = ext_bot(r);\r
+\r
+ if (c != min_quarterword)\r
+ w = w + height_plus_depth(f, c);\r
+\r
+ c = ext_mid(r);\r
+\r
+ if (c != min_quarterword)\r
+ w = w + height_plus_depth(f, c);\r
+\r
+ c = ext_top(r);\r
+\r
+ if (c != min_quarterword)\r
+ w = w + height_plus_depth(f, c);\r
+\r
+ n = 0;\r
+\r
+ if (u > 0)\r
+ while (w < v)\r
+ {\r
+ w = w + u;\r
+ incr(n);\r
+\r
+ if (ext_mid(r) != min_quarterword)\r
+ w = w + u;\r
+ }\r
+\r
+ c = ext_bot(r);\r
+\r
+ if (c != min_quarterword)\r
+ stack_into_box(b, f, c);\r
+\r
+ c = ext_rep(r);\r
+\r
+ for (m = 1; m <= n; m++)\r
+ stack_into_box(b, f, c);\r
+\r
+ c = ext_mid(r);\r
+\r
+ if (c != min_quarterword)\r
+ {\r
+ stack_into_box(b, f, c);\r
+ c = ext_rep(r);\r
+\r
+ for (m = 1; m <= n; m++)\r
+ stack_into_box(b, f, c);\r
+ }\r
+\r
+ c = ext_top(r);\r
+\r
+ if (c != 0)\r
+ stack_into_box(b, f, c);\r
+ \r
+ depth(b) = w - height(b);\r
+ }\r
+ else\r
+ b = char_box(f, c);\r
+ else\r
+ {\r
+ b = new_null_box();\r
+ width(b) = null_delimiter_space;\r
+ }\r
+\r
+ shift_amount(b) = half(height(b) - depth(b)) - axis_height(s);\r
+\r
+ return b;\r
+}
\ No newline at end of file