#define EXTERN extern #include "mfd.h" void #ifdef HAVE_PROTOTYPES initialize ( void ) #else initialize ( ) #endif { integer i ; integer k ; xchr [32 ]= ' ' ; xchr [33 ]= '!' ; xchr [34 ]= '"' ; xchr [35 ]= '#' ; xchr [36 ]= '$' ; xchr [37 ]= '%' ; xchr [38 ]= '&' ; xchr [39 ]= '\'' ; xchr [40 ]= '(' ; xchr [41 ]= ')' ; xchr [42 ]= '*' ; xchr [43 ]= '+' ; xchr [44 ]= ',' ; xchr [45 ]= '-' ; xchr [46 ]= '.' ; xchr [47 ]= '/' ; xchr [48 ]= '0' ; xchr [49 ]= '1' ; xchr [50 ]= '2' ; xchr [51 ]= '3' ; xchr [52 ]= '4' ; xchr [53 ]= '5' ; xchr [54 ]= '6' ; xchr [55 ]= '7' ; xchr [56 ]= '8' ; xchr [57 ]= '9' ; xchr [58 ]= ':' ; xchr [59 ]= ';' ; xchr [60 ]= '<' ; xchr [61 ]= '=' ; xchr [62 ]= '>' ; xchr [63 ]= '?' ; xchr [64 ]= '@' ; xchr [65 ]= 'A' ; xchr [66 ]= 'B' ; xchr [67 ]= 'C' ; xchr [68 ]= 'D' ; xchr [69 ]= 'E' ; xchr [70 ]= 'F' ; xchr [71 ]= 'G' ; xchr [72 ]= 'H' ; xchr [73 ]= 'I' ; xchr [74 ]= 'J' ; xchr [75 ]= 'K' ; xchr [76 ]= 'L' ; xchr [77 ]= 'M' ; xchr [78 ]= 'N' ; xchr [79 ]= 'O' ; xchr [80 ]= 'P' ; xchr [81 ]= 'Q' ; xchr [82 ]= 'R' ; xchr [83 ]= 'S' ; xchr [84 ]= 'T' ; xchr [85 ]= 'U' ; xchr [86 ]= 'V' ; xchr [87 ]= 'W' ; xchr [88 ]= 'X' ; xchr [89 ]= 'Y' ; xchr [90 ]= 'Z' ; xchr [91 ]= '[' ; xchr [92 ]= '\\' ; xchr [93 ]= ']' ; xchr [94 ]= '^' ; xchr [95 ]= '_' ; xchr [96 ]= '`' ; xchr [97 ]= 'a' ; xchr [98 ]= 'b' ; xchr [99 ]= 'c' ; xchr [100 ]= 'd' ; xchr [101 ]= 'e' ; xchr [102 ]= 'f' ; xchr [103 ]= 'g' ; xchr [104 ]= 'h' ; xchr [105 ]= 'i' ; xchr [106 ]= 'j' ; xchr [107 ]= 'k' ; xchr [108 ]= 'l' ; xchr [109 ]= 'm' ; xchr [110 ]= 'n' ; xchr [111 ]= 'o' ; xchr [112 ]= 'p' ; xchr [113 ]= 'q' ; xchr [114 ]= 'r' ; xchr [115 ]= 's' ; xchr [116 ]= 't' ; xchr [117 ]= 'u' ; xchr [118 ]= 'v' ; xchr [119 ]= 'w' ; xchr [120 ]= 'x' ; xchr [121 ]= 'y' ; xchr [122 ]= 'z' ; xchr [123 ]= '{' ; xchr [124 ]= '|' ; xchr [125 ]= '}' ; xchr [126 ]= '~' ; {register integer for_end; i = 0 ;for_end = 31 ; if ( i <= for_end) do xchr [i ]= chr ( i ) ; while ( i++ < for_end ) ;} {register integer for_end; i = 127 ;for_end = 255 ; if ( i <= for_end) do xchr [i ]= chr ( i ) ; while ( i++ < for_end ) ;} {register integer for_end; i = 0 ;for_end = 255 ; if ( i <= for_end) do xord [chr ( i ) ]= 127 ; while ( i++ < for_end ) ;} {register integer for_end; i = 128 ;for_end = 255 ; if ( i <= for_end) do xord [xchr [i ]]= i ; while ( i++ < for_end ) ;} {register integer for_end; i = 0 ;for_end = 126 ; if ( i <= for_end) do xord [xchr [i ]]= i ; while ( i++ < for_end ) ;} if ( interactionoption == 4 ) interaction = 3 ; else interaction = interactionoption ; deletionsallowed = true ; errorcount = 0 ; helpptr = 0 ; useerrhelp = false ; errhelp = 0 ; interrupt = 0 ; OKtointerrupt = true ; aritherror = false ; twotothe [0 ]= 1 ; {register integer for_end; k = 1 ;for_end = 30 ; if ( k <= for_end) do twotothe [k ]= 2 * twotothe [k - 1 ]; while ( k++ < for_end ) ;} speclog [1 ]= 93032640L ; speclog [2 ]= 38612034L ; speclog [3 ]= 17922280L ; speclog [4 ]= 8662214L ; speclog [5 ]= 4261238L ; speclog [6 ]= 2113709L ; speclog [7 ]= 1052693L ; speclog [8 ]= 525315L ; speclog [9 ]= 262400L ; speclog [10 ]= 131136L ; speclog [11 ]= 65552L ; speclog [12 ]= 32772L ; speclog [13 ]= 16385 ; {register integer for_end; k = 14 ;for_end = 27 ; if ( k <= for_end) do speclog [k ]= twotothe [27 - k ]; while ( k++ < for_end ) ;} speclog [28 ]= 1 ; specatan [1 ]= 27855475L ; specatan [2 ]= 14718068L ; specatan [3 ]= 7471121L ; specatan [4 ]= 3750058L ; specatan [5 ]= 1876857L ; specatan [6 ]= 938658L ; specatan [7 ]= 469357L ; specatan [8 ]= 234682L ; specatan [9 ]= 117342L ; specatan [10 ]= 58671L ; specatan [11 ]= 29335 ; specatan [12 ]= 14668 ; specatan [13 ]= 7334 ; specatan [14 ]= 3667 ; specatan [15 ]= 1833 ; specatan [16 ]= 917 ; specatan [17 ]= 458 ; specatan [18 ]= 229 ; specatan [19 ]= 115 ; specatan [20 ]= 57 ; specatan [21 ]= 29 ; specatan [22 ]= 14 ; specatan [23 ]= 7 ; specatan [24 ]= 4 ; specatan [25 ]= 2 ; specatan [26 ]= 1 ; ; #ifdef TEXMF_DEBUG wasmemend = 0 ; waslomax = 0 ; washimin = memmax ; panicking = false ; #endif /* TEXMF_DEBUG */ {register integer for_end; k = 1 ;for_end = 41 ; if ( k <= for_end) do internal [k ]= 0 ; while ( k++ < for_end ) ;} intptr = 41 ; {register integer for_end; k = 48 ;for_end = 57 ; if ( k <= for_end) do charclass [k ]= 0 ; while ( k++ < for_end ) ;} charclass [46 ]= 1 ; charclass [32 ]= 2 ; charclass [37 ]= 3 ; charclass [34 ]= 4 ; charclass [44 ]= 5 ; charclass [59 ]= 6 ; charclass [40 ]= 7 ; charclass [41 ]= 8 ; {register integer for_end; k = 65 ;for_end = 90 ; if ( k <= for_end) do charclass [k ]= 9 ; while ( k++ < for_end ) ;} {register integer for_end; k = 97 ;for_end = 122 ; if ( k <= for_end) do charclass [k ]= 9 ; while ( k++ < for_end ) ;} charclass [95 ]= 9 ; charclass [60 ]= 10 ; charclass [61 ]= 10 ; charclass [62 ]= 10 ; charclass [58 ]= 10 ; charclass [124 ]= 10 ; charclass [96 ]= 11 ; charclass [39 ]= 11 ; charclass [43 ]= 12 ; charclass [45 ]= 12 ; charclass [47 ]= 13 ; charclass [42 ]= 13 ; charclass [92 ]= 13 ; charclass [33 ]= 14 ; charclass [63 ]= 14 ; charclass [35 ]= 15 ; charclass [38 ]= 15 ; charclass [64 ]= 15 ; charclass [36 ]= 15 ; charclass [94 ]= 16 ; charclass [126 ]= 16 ; charclass [91 ]= 17 ; charclass [93 ]= 18 ; charclass [123 ]= 19 ; charclass [125 ]= 19 ; {register integer for_end; k = 0 ;for_end = 31 ; if ( k <= for_end) do charclass [k ]= 20 ; while ( k++ < for_end ) ;} {register integer for_end; k = 127 ;for_end = 255 ; if ( k <= for_end) do charclass [k ]= 20 ; while ( k++ < for_end ) ;} charclass [9 ]= 2 ; charclass [12 ]= 2 ; hash [1 ].lhfield = 0 ; hash [1 ].v.RH = 0 ; eqtb [1 ].lhfield = 41 ; eqtb [1 ].v.RH = 0 ; {register integer for_end; k = 2 ;for_end = 9769 ; if ( k <= for_end) do { hash [k ]= hash [1 ]; eqtb [k ]= eqtb [1 ]; } while ( k++ < for_end ) ;} bignodesize [13 ]= 12 ; bignodesize [14 ]= 4 ; saveptr = 0 ; octantdir [1 ]= 547 ; octantdir [5 ]= 548 ; octantdir [6 ]= 549 ; octantdir [2 ]= 550 ; octantdir [4 ]= 551 ; octantdir [8 ]= 552 ; octantdir [7 ]= 553 ; octantdir [3 ]= 554 ; maxroundingptr = 0 ; octantcode [1 ]= 1 ; octantcode [2 ]= 5 ; octantcode [3 ]= 6 ; octantcode [4 ]= 2 ; octantcode [5 ]= 4 ; octantcode [6 ]= 8 ; octantcode [7 ]= 7 ; octantcode [8 ]= 3 ; {register integer for_end; k = 1 ;for_end = 8 ; if ( k <= for_end) do octantnumber [octantcode [k ]]= k ; while ( k++ < for_end ) ;} revturns = false ; xcorr [1 ]= 0 ; ycorr [1 ]= 0 ; xycorr [1 ]= 0 ; xcorr [5 ]= 0 ; ycorr [5 ]= 0 ; xycorr [5 ]= 1 ; xcorr [6 ]= -1 ; ycorr [6 ]= 1 ; xycorr [6 ]= 0 ; xcorr [2 ]= 1 ; ycorr [2 ]= 0 ; xycorr [2 ]= 1 ; xcorr [4 ]= 0 ; ycorr [4 ]= 1 ; xycorr [4 ]= 1 ; xcorr [8 ]= 0 ; ycorr [8 ]= 1 ; xycorr [8 ]= 0 ; xcorr [7 ]= 1 ; ycorr [7 ]= 0 ; xycorr [7 ]= 1 ; xcorr [3 ]= -1 ; ycorr [3 ]= 1 ; xycorr [3 ]= 0 ; {register integer for_end; k = 1 ;for_end = 8 ; if ( k <= for_end) do zcorr [k ]= xycorr [k ]- xcorr [k ]; while ( k++ < for_end ) ;} screenstarted = false ; screenOK = false ; {register integer for_end; k = 0 ;for_end = 15 ; if ( k <= for_end) do { windowopen [k ]= false ; windowtime [k ]= 0 ; } while ( k++ < for_end ) ;} fixneeded = false ; watchcoefs = true ; condptr = 0 ; iflimit = 0 ; curif = 0 ; ifline = 0 ; loopptr = 0 ; curexp = 0 ; varflag = 0 ; startsym = 0 ; longhelpseen = false ; {register integer for_end; k = 0 ;for_end = 255 ; if ( k <= for_end) do { tfmwidth [k ]= 0 ; tfmheight [k ]= 0 ; tfmdepth [k ]= 0 ; tfmitalcorr [k ]= 0 ; charexists [k ]= false ; chartag [k ]= 0 ; charremainder [k ]= 0 ; skiptable [k ]= ligtablesize ; } while ( k++ < for_end ) ;} {register integer for_end; k = 1 ;for_end = headersize ; if ( k <= for_end) do headerbyte [k ]= -1 ; while ( k++ < for_end ) ;} bc = 255 ; ec = 0 ; nl = 0 ; nk = 0 ; ne = 0 ; np = 0 ; internal [41 ]= -65536L ; bchlabel = ligtablesize ; labelloc [0 ]= -1 ; labelptr = 0 ; gfprevptr = 0 ; totalchars = 0 ; halfbuf = gfbufsize / 2 ; gflimit = gfbufsize ; gfptr = 0 ; gfoffset = 0 ; baseident = 0 ; editnamestart = 0 ; } void #ifdef HAVE_PROTOTYPES println ( void ) #else println ( ) #endif { switch ( selector ) {case 3 : { putc ('\n', stdout ); putc ('\n', logfile ); termoffset = 0 ; fileoffset = 0 ; } break ; case 2 : { putc ('\n', logfile ); fileoffset = 0 ; } break ; case 1 : { putc ('\n', stdout ); termoffset = 0 ; } break ; case 0 : case 4 : case 5 : ; break ; } } void #ifdef HAVE_PROTOTYPES zprintvisiblechar ( ASCIIcode s ) #else zprintvisiblechar ( s ) ASCIIcode s ; #endif { switch ( selector ) {case 3 : { putc ( xchr [s ], stdout ); putc ( xchr [s ], logfile ); incr ( termoffset ) ; incr ( fileoffset ) ; if ( termoffset == maxprintline ) { putc ('\n', stdout ); termoffset = 0 ; } if ( fileoffset == maxprintline ) { putc ('\n', logfile ); fileoffset = 0 ; } } break ; case 2 : { putc ( xchr [s ], logfile ); incr ( fileoffset ) ; if ( fileoffset == maxprintline ) println () ; } break ; case 1 : { putc ( xchr [s ], stdout ); incr ( termoffset ) ; if ( termoffset == maxprintline ) println () ; } break ; case 0 : ; break ; case 4 : if ( tally < trickcount ) trickbuf [tally % errorline ]= s ; break ; case 5 : { if ( poolptr < poolsize ) { strpool [poolptr ]= s ; incr ( poolptr ) ; } } break ; } incr ( tally ) ; } void #ifdef HAVE_PROTOTYPES zprintchar ( ASCIIcode s ) #else zprintchar ( s ) ASCIIcode s ; #endif { /* 10 */ ASCIIcode k ; unsigned char l ; k = s ; if ( ( k < 32 ) || ( k > 126 ) ) { if ( selector > 4 ) { printvisiblechar ( s ) ; goto lab10 ; } printvisiblechar ( 94 ) ; printvisiblechar ( 94 ) ; if ( s < 64 ) printvisiblechar ( s + 64 ) ; else if ( s < 128 ) printvisiblechar ( s - 64 ) ; else { l = s / 16 ; if ( l < 10 ) printvisiblechar ( l + 48 ) ; else printvisiblechar ( l + 87 ) ; l = s % 16 ; if ( l < 10 ) printvisiblechar ( l + 48 ) ; else printvisiblechar ( l + 87 ) ; } } else printvisiblechar ( s ) ; lab10: ; } void #ifdef HAVE_PROTOTYPES zprint ( integer s ) #else zprint ( s ) integer s ; #endif { poolpointer j ; if ( ( s < 0 ) || ( s >= strptr ) ) s = 259 ; if ( ( s < 256 ) ) printchar ( s ) ; else { j = strstart [s ]; while ( j < strstart [s + 1 ]) { printchar ( strpool [j ]) ; incr ( j ) ; } } } void #ifdef HAVE_PROTOTYPES zprintnl ( strnumber s ) #else zprintnl ( s ) strnumber s ; #endif { if ( ( ( termoffset > 0 ) && ( odd ( selector ) ) ) || ( ( fileoffset > 0 ) && ( selector >= 2 ) ) ) println () ; print ( s ) ; } void #ifdef HAVE_PROTOTYPES zprintthedigs ( eightbits k ) #else zprintthedigs ( k ) eightbits k ; #endif { while ( k > 0 ) { decr ( k ) ; printchar ( 48 + dig [k ]) ; } } void #ifdef HAVE_PROTOTYPES zprintint ( integer n ) #else zprintint ( n ) integer n ; #endif { char k ; integer m ; k = 0 ; if ( n < 0 ) { printchar ( 45 ) ; if ( n > -100000000L ) n = - (integer) n ; else { m = -1 - n ; n = m / 10 ; m = ( m % 10 ) + 1 ; k = 1 ; if ( m < 10 ) dig [0 ]= m ; else { dig [0 ]= 0 ; incr ( n ) ; } } } do { dig [k ]= n % 10 ; n = n / 10 ; incr ( k ) ; } while ( ! ( n == 0 ) ) ; printthedigs ( k ) ; } void #ifdef HAVE_PROTOTYPES zprintscaled ( scaled s ) #else zprintscaled ( s ) scaled s ; #endif { scaled delta ; if ( s < 0 ) { printchar ( 45 ) ; s = - (integer) s ; } printint ( s / 65536L ) ; s = 10 * ( s % 65536L ) + 5 ; if ( s != 5 ) { delta = 10 ; printchar ( 46 ) ; do { if ( delta > 65536L ) s = s + 32768L - ( delta / 2 ) ; printchar ( 48 + ( s / 65536L ) ) ; s = 10 * ( s % 65536L ) ; delta = delta * 10 ; } while ( ! ( s <= delta ) ) ; } } void #ifdef HAVE_PROTOTYPES zprinttwo ( scaled x , scaled y ) #else zprinttwo ( x , y ) scaled x ; scaled y ; #endif { printchar ( 40 ) ; printscaled ( x ) ; printchar ( 44 ) ; printscaled ( y ) ; printchar ( 41 ) ; } void #ifdef HAVE_PROTOTYPES zprinttype ( smallnumber t ) #else zprinttype ( t ) smallnumber t ; #endif { switch ( t ) {case 1 : print ( 322 ) ; break ; case 2 : print ( 323 ) ; break ; case 3 : print ( 324 ) ; break ; case 4 : print ( 325 ) ; break ; case 5 : print ( 326 ) ; break ; case 6 : print ( 327 ) ; break ; case 7 : print ( 328 ) ; break ; case 8 : print ( 329 ) ; break ; case 9 : print ( 330 ) ; break ; case 10 : print ( 331 ) ; break ; case 11 : print ( 332 ) ; break ; case 12 : print ( 333 ) ; break ; case 13 : print ( 334 ) ; break ; case 14 : print ( 335 ) ; break ; case 16 : print ( 336 ) ; break ; case 17 : print ( 337 ) ; break ; case 18 : print ( 338 ) ; break ; case 15 : print ( 339 ) ; break ; case 19 : print ( 340 ) ; break ; case 20 : print ( 341 ) ; break ; case 21 : print ( 342 ) ; break ; case 22 : print ( 343 ) ; break ; case 23 : print ( 344 ) ; break ; default: print ( 345 ) ; break ; } } void #ifdef HAVE_PROTOTYPES begindiagnostic ( void ) #else begindiagnostic ( ) #endif { oldsetting = selector ; if ( ( internal [13 ]<= 0 ) && ( selector == 3 ) ) { decr ( selector ) ; if ( history == 0 ) history = 1 ; } } void #ifdef HAVE_PROTOTYPES zenddiagnostic ( boolean blankline ) #else zenddiagnostic ( blankline ) boolean blankline ; #endif { printnl ( 283 ) ; if ( blankline ) println () ; selector = oldsetting ; } void #ifdef HAVE_PROTOTYPES zprintdiagnostic ( strnumber s , strnumber t , boolean nuline ) #else zprintdiagnostic ( s , t , nuline ) strnumber s ; strnumber t ; boolean nuline ; #endif { begindiagnostic () ; if ( nuline ) printnl ( s ) ; else print ( s ) ; print ( 449 ) ; printint ( line ) ; print ( t ) ; printchar ( 58 ) ; } void #ifdef HAVE_PROTOTYPES zprintfilename ( integer n , integer a , integer e ) #else zprintfilename ( n , a , e ) integer n ; integer a ; integer e ; #endif { print ( a ) ; print ( n ) ; print ( e ) ; } #ifdef TEXMF_DEBUG #endif /* TEXMF_DEBUG */ void #ifdef HAVE_PROTOTYPES zflushstring ( strnumber s ) #else zflushstring ( s ) strnumber s ; #endif { if ( s < strptr - 1 ) strref [s ]= 0 ; else do { decr ( strptr ) ; } while ( ! ( strref [strptr - 1 ]!= 0 ) ) ; poolptr = strstart [strptr ]; } void #ifdef HAVE_PROTOTYPES jumpout ( void ) #else jumpout ( ) #endif { closefilesandterminate () ; { fflush ( stdout ) ; readyalready = 0 ; if ( ( history != 0 ) && ( history != 1 ) ) uexit ( 1 ) ; else uexit ( 0 ) ; } } void #ifdef HAVE_PROTOTYPES error ( void ) #else error ( ) #endif { /* 22 10 */ ASCIIcode c ; integer s1, s2, s3 ; poolpointer j ; if ( history < 2 ) history = 2 ; printchar ( 46 ) ; showcontext () ; if ( interaction == 3 ) while ( true ) { lab22: clearforerrorprompt () ; { ; print ( 263 ) ; terminput () ; } if ( last == first ) goto lab10 ; c = buffer [first ]; if ( c >= 97 ) c = c - 32 ; switch ( c ) {case 48 : case 49 : case 50 : case 51 : case 52 : case 53 : case 54 : case 55 : case 56 : case 57 : if ( deletionsallowed ) { s1 = curcmd ; s2 = curmod ; s3 = cursym ; OKtointerrupt = false ; if ( ( last > first + 1 ) && ( buffer [first + 1 ]>= 48 ) && ( buffer [first + 1 ]<= 57 ) ) c = c * 10 + buffer [first + 1 ]- 48 * 11 ; else c = c - 48 ; while ( c > 0 ) { getnext () ; if ( curcmd == 39 ) { if ( strref [curmod ]< 127 ) if ( strref [curmod ]> 1 ) decr ( strref [curmod ]) ; else flushstring ( curmod ) ; } decr ( c ) ; } curcmd = s1 ; curmod = s2 ; cursym = s3 ; OKtointerrupt = true ; { helpptr = 2 ; helpline [1 ]= 276 ; helpline [0 ]= 277 ; } showcontext () ; goto lab22 ; } break ; ; #ifdef TEXMF_DEBUG case 68 : { debughelp () ; goto lab22 ; } break ; #endif /* TEXMF_DEBUG */ case 69 : if ( fileptr > 0 ) { editnamestart = strstart [inputstack [fileptr ].namefield ]; editnamelength = strstart [inputstack [fileptr ].namefield + 1 ]- strstart [inputstack [fileptr ].namefield ]; editline = line ; jumpout () ; } break ; case 72 : { if ( useerrhelp ) { j = strstart [errhelp ]; while ( j < strstart [errhelp + 1 ]) { if ( strpool [j ]!= 37 ) print ( strpool [j ]) ; else if ( j + 1 == strstart [errhelp + 1 ]) println () ; else if ( strpool [j + 1 ]!= 37 ) println () ; else { incr ( j ) ; printchar ( 37 ) ; } incr ( j ) ; } useerrhelp = false ; } else { if ( helpptr == 0 ) { helpptr = 2 ; helpline [1 ]= 278 ; helpline [0 ]= 279 ; } do { decr ( helpptr ) ; print ( helpline [helpptr ]) ; println () ; } while ( ! ( helpptr == 0 ) ) ; } { helpptr = 4 ; helpline [3 ]= 280 ; helpline [2 ]= 279 ; helpline [1 ]= 281 ; helpline [0 ]= 282 ; } goto lab22 ; } break ; case 73 : { beginfilereading () ; if ( last > first + 1 ) { curinput .locfield = first + 1 ; buffer [first ]= 32 ; } else { { ; print ( 275 ) ; terminput () ; } curinput .locfield = first ; } first = last + 1 ; curinput .limitfield = last ; goto lab10 ; } break ; case 81 : case 82 : case 83 : { errorcount = 0 ; interaction = 0 + c - 81 ; print ( 270 ) ; switch ( c ) {case 81 : { print ( 271 ) ; decr ( selector ) ; } break ; case 82 : print ( 272 ) ; break ; case 83 : print ( 273 ) ; break ; } print ( 274 ) ; println () ; fflush ( stdout ) ; goto lab10 ; } break ; case 88 : { interaction = 2 ; jumpout () ; } break ; default: ; break ; } { print ( 264 ) ; printnl ( 265 ) ; printnl ( 266 ) ; if ( fileptr > 0 ) print ( 267 ) ; if ( deletionsallowed ) printnl ( 268 ) ; printnl ( 269 ) ; } } incr ( errorcount ) ; if ( errorcount == 100 ) { printnl ( 262 ) ; history = 3 ; jumpout () ; } if ( interaction > 0 ) decr ( selector ) ; if ( useerrhelp ) { printnl ( 283 ) ; j = strstart [errhelp ]; while ( j < strstart [errhelp + 1 ]) { if ( strpool [j ]!= 37 ) print ( strpool [j ]) ; else if ( j + 1 == strstart [errhelp + 1 ]) println () ; else if ( strpool [j + 1 ]!= 37 ) println () ; else { incr ( j ) ; printchar ( 37 ) ; } incr ( j ) ; } } else while ( helpptr > 0 ) { decr ( helpptr ) ; printnl ( helpline [helpptr ]) ; } println () ; if ( interaction > 0 ) incr ( selector ) ; println () ; lab10: ; } void #ifdef HAVE_PROTOTYPES zfatalerror ( strnumber s ) #else zfatalerror ( s ) strnumber s ; #endif { normalizeselector () ; { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 284 ) ; } { helpptr = 1 ; helpline [0 ]= s ; } { if ( interaction == 3 ) interaction = 2 ; if ( logopened ) error () ; ; #ifdef TEXMF_DEBUG if ( interaction > 0 ) debughelp () ; #endif /* TEXMF_DEBUG */ history = 3 ; jumpout () ; } } void #ifdef HAVE_PROTOTYPES zoverflow ( strnumber s , integer n ) #else zoverflow ( s , n ) strnumber s ; integer n ; #endif { normalizeselector () ; { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 285 ) ; } print ( s ) ; printchar ( 61 ) ; printint ( n ) ; printchar ( 93 ) ; { helpptr = 2 ; helpline [1 ]= 286 ; helpline [0 ]= 287 ; } { if ( interaction == 3 ) interaction = 2 ; if ( logopened ) error () ; ; #ifdef TEXMF_DEBUG if ( interaction > 0 ) debughelp () ; #endif /* TEXMF_DEBUG */ history = 3 ; jumpout () ; } } void #ifdef HAVE_PROTOTYPES zconfusion ( strnumber s ) #else zconfusion ( s ) strnumber s ; #endif { normalizeselector () ; if ( history < 2 ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 288 ) ; } print ( s ) ; printchar ( 41 ) ; { helpptr = 1 ; helpline [0 ]= 289 ; } } else { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 290 ) ; } { helpptr = 2 ; helpline [1 ]= 291 ; helpline [0 ]= 292 ; } } { if ( interaction == 3 ) interaction = 2 ; if ( logopened ) error () ; ; #ifdef TEXMF_DEBUG if ( interaction > 0 ) debughelp () ; #endif /* TEXMF_DEBUG */ history = 3 ; jumpout () ; } } boolean #ifdef HAVE_PROTOTYPES initterminal ( void ) #else initterminal ( ) #endif { /* 10 */ register boolean Result; topenin () ; if ( last > first ) { curinput .locfield = first ; while ( ( curinput .locfield < last ) && ( buffer [curinput .locfield ] == ' ' ) ) incr ( curinput .locfield ) ; if ( curinput .locfield < last ) { Result = true ; goto lab10 ; } } while ( true ) { ; Fputs( stdout , "**" ) ; fflush ( stdout ) ; if ( ! inputln ( stdin , true ) ) { putc ('\n', stdout ); Fputs( stdout , "! End of file on the terminal... why?" ) ; Result = false ; goto lab10 ; } curinput .locfield = first ; while ( ( curinput .locfield < last ) && ( buffer [curinput .locfield ] == 32 ) ) incr ( curinput .locfield ) ; if ( curinput .locfield < last ) { Result = true ; goto lab10 ; } fprintf( stdout , "%s\n", "Please type the name of your input file." ) ; } lab10: ; return Result ; } strnumber #ifdef HAVE_PROTOTYPES makestring ( void ) #else makestring ( ) #endif { register strnumber Result; if ( strptr == maxstrptr ) { if ( strptr == maxstrings ) overflow ( 258 , maxstrings - initstrptr ) ; incr ( maxstrptr ) ; } strref [strptr ]= 1 ; incr ( strptr ) ; strstart [strptr ]= poolptr ; Result = strptr - 1 ; return Result ; } boolean #ifdef HAVE_PROTOTYPES zstreqbuf ( strnumber s , integer k ) #else zstreqbuf ( s , k ) strnumber s ; integer k ; #endif { /* 45 */ register boolean Result; poolpointer j ; boolean result ; j = strstart [s ]; while ( j < strstart [s + 1 ]) { if ( strpool [j ]!= buffer [k ]) { result = false ; goto lab45 ; } incr ( j ) ; incr ( k ) ; } result = true ; lab45: Result = result ; return Result ; } integer #ifdef HAVE_PROTOTYPES zstrvsstr ( strnumber s , strnumber t ) #else zstrvsstr ( s , t ) strnumber s ; strnumber t ; #endif { /* 10 */ register integer Result; poolpointer j, k ; integer ls, lt ; integer l ; ls = ( strstart [s + 1 ]- strstart [s ]) ; lt = ( strstart [t + 1 ]- strstart [t ]) ; if ( ls <= lt ) l = ls ; else l = lt ; j = strstart [s ]; k = strstart [t ]; while ( l > 0 ) { if ( strpool [j ]!= strpool [k ]) { Result = strpool [j ]- strpool [k ]; goto lab10 ; } incr ( j ) ; incr ( k ) ; decr ( l ) ; } Result = ls - lt ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES zprintdd ( integer n ) #else zprintdd ( n ) integer n ; #endif { n = abs ( n ) % 100 ; printchar ( 48 + ( n / 10 ) ) ; printchar ( 48 + ( n % 10 ) ) ; } void #ifdef HAVE_PROTOTYPES terminput ( void ) #else terminput ( ) #endif { integer k ; fflush ( stdout ) ; if ( ! inputln ( stdin , true ) ) fatalerror ( 260 ) ; termoffset = 0 ; decr ( selector ) ; if ( last != first ) {register integer for_end; k = first ;for_end = last - 1 ; if ( k <= for_end) do print ( buffer [k ]) ; while ( k++ < for_end ) ;} println () ; buffer [last ]= 37 ; incr ( selector ) ; } void #ifdef HAVE_PROTOTYPES normalizeselector ( void ) #else normalizeselector ( ) #endif { if ( logopened ) selector = 3 ; else selector = 1 ; if ( jobname == 0 ) openlogfile () ; if ( interaction == 0 ) decr ( selector ) ; } void #ifdef HAVE_PROTOTYPES pauseforinstructions ( void ) #else pauseforinstructions ( ) #endif { if ( OKtointerrupt ) { interaction = 3 ; if ( ( selector == 2 ) || ( selector == 0 ) ) incr ( selector ) ; { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 293 ) ; } { helpptr = 3 ; helpline [2 ]= 294 ; helpline [1 ]= 295 ; helpline [0 ]= 296 ; } deletionsallowed = false ; error () ; deletionsallowed = true ; interrupt = 0 ; } } void #ifdef HAVE_PROTOTYPES zmissingerr ( strnumber s ) #else zmissingerr ( s ) strnumber s ; #endif { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 297 ) ; } print ( s ) ; print ( 298 ) ; } void #ifdef HAVE_PROTOTYPES cleararith ( void ) #else cleararith ( ) #endif { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 299 ) ; } { helpptr = 4 ; helpline [3 ]= 300 ; helpline [2 ]= 301 ; helpline [1 ]= 302 ; helpline [0 ]= 303 ; } error () ; aritherror = false ; } integer #ifdef HAVE_PROTOTYPES zslowadd ( integer x , integer y ) #else zslowadd ( x , y ) integer x ; integer y ; #endif { register integer Result; if ( x >= 0 ) if ( y <= 2147483647L - x ) Result = x + y ; else { aritherror = true ; Result = 2147483647L ; } else if ( - (integer) y <= 2147483647L + x ) Result = x + y ; else { aritherror = true ; Result = -2147483647L ; } return Result ; } scaled #ifdef HAVE_PROTOTYPES zrounddecimals ( smallnumber k ) #else zrounddecimals ( k ) smallnumber k ; #endif { register scaled Result; integer a ; a = 0 ; while ( k > 0 ) { decr ( k ) ; a = ( a + dig [k ]* 131072L ) / 10 ; } Result = halfp ( a + 1 ) ; return Result ; } #ifdef FIXPT fraction #ifdef HAVE_PROTOTYPES zmakefraction ( integer p , integer q ) #else zmakefraction ( p , q ) integer p ; integer q ; #endif { register fraction Result; integer f ; integer n ; boolean negative ; integer becareful ; if ( p >= 0 ) negative = false ; else { p = - (integer) p ; negative = true ; } if ( q <= 0 ) { ; #ifdef TEXMF_DEBUG if ( q == 0 ) confusion ( 47 ) ; #endif /* TEXMF_DEBUG */ q = - (integer) q ; negative = ! negative ; } n = p / q ; p = p % q ; if ( n >= 8 ) { aritherror = true ; if ( negative ) Result = -2147483647L ; else Result = 2147483647L ; } else { n = ( n - 1 ) * 268435456L ; f = 1 ; do { becareful = p - q ; p = becareful + p ; if ( p >= 0 ) f = f + f + 1 ; else { f = f + f ; p = p + q ; } } while ( ! ( f >= 268435456L ) ) ; becareful = p - q ; if ( becareful + p >= 0 ) incr ( f ) ; if ( negative ) Result = - (integer) ( f + n ) ; else Result = f + n ; } return Result ; } #endif /* FIXPT */ #ifdef FIXPT integer #ifdef HAVE_PROTOTYPES ztakefraction ( integer q , fraction f ) #else ztakefraction ( q , f ) integer q ; fraction f ; #endif { register integer Result; integer p ; boolean negative ; integer n ; integer becareful ; if ( f >= 0 ) negative = false ; else { f = - (integer) f ; negative = true ; } if ( q < 0 ) { q = - (integer) q ; negative = ! negative ; } if ( f < 268435456L ) n = 0 ; else { n = f / 268435456L ; f = f % 268435456L ; if ( q <= 2147483647L / n ) n = n * q ; else { aritherror = true ; n = 2147483647L ; } } f = f + 268435456L ; p = 134217728L ; if ( q < 1073741824L ) do { if ( odd ( f ) ) p = halfp ( p + q ) ; else p = halfp ( p ) ; f = halfp ( f ) ; } while ( ! ( f == 1 ) ) ; else do { if ( odd ( f ) ) p = p + halfp ( q - p ) ; else p = halfp ( p ) ; f = halfp ( f ) ; } while ( ! ( f == 1 ) ) ; becareful = n - 2147483647L ; if ( becareful + p > 0 ) { aritherror = true ; n = 2147483647L - p ; } if ( negative ) Result = - (integer) ( n + p ) ; else Result = n + p ; return Result ; } #endif /* FIXPT */ #ifdef FIXPT integer #ifdef HAVE_PROTOTYPES ztakescaled ( integer q , scaled f ) #else ztakescaled ( q , f ) integer q ; scaled f ; #endif { register integer Result; integer p ; boolean negative ; integer n ; integer becareful ; if ( f >= 0 ) negative = false ; else { f = - (integer) f ; negative = true ; } if ( q < 0 ) { q = - (integer) q ; negative = ! negative ; } if ( f < 65536L ) n = 0 ; else { n = f / 65536L ; f = f % 65536L ; if ( q <= 2147483647L / n ) n = n * q ; else { aritherror = true ; n = 2147483647L ; } } f = f + 65536L ; p = 32768L ; if ( q < 1073741824L ) do { if ( odd ( f ) ) p = halfp ( p + q ) ; else p = halfp ( p ) ; f = halfp ( f ) ; } while ( ! ( f == 1 ) ) ; else do { if ( odd ( f ) ) p = p + halfp ( q - p ) ; else p = halfp ( p ) ; f = halfp ( f ) ; } while ( ! ( f == 1 ) ) ; becareful = n - 2147483647L ; if ( becareful + p > 0 ) { aritherror = true ; n = 2147483647L - p ; } if ( negative ) Result = - (integer) ( n + p ) ; else Result = n + p ; return Result ; } #endif /* FIXPT */ #ifdef FIXPT scaled #ifdef HAVE_PROTOTYPES zmakescaled ( integer p , integer q ) #else zmakescaled ( p , q ) integer p ; integer q ; #endif { register scaled Result; integer f ; integer n ; boolean negative ; integer becareful ; if ( p >= 0 ) negative = false ; else { p = - (integer) p ; negative = true ; } if ( q <= 0 ) { ; #ifdef TEXMF_DEBUG if ( q == 0 ) confusion ( 47 ) ; #endif /* TEXMF_DEBUG */ q = - (integer) q ; negative = ! negative ; } n = p / q ; p = p % q ; if ( n >= 32768L ) { aritherror = true ; if ( negative ) Result = -2147483647L ; else Result = 2147483647L ; } else { n = ( n - 1 ) * 65536L ; f = 1 ; do { becareful = p - q ; p = becareful + p ; if ( p >= 0 ) f = f + f + 1 ; else { f = f + f ; p = p + q ; } } while ( ! ( f >= 65536L ) ) ; becareful = p - q ; if ( becareful + p >= 0 ) incr ( f ) ; if ( negative ) Result = - (integer) ( f + n ) ; else Result = f + n ; } return Result ; } #endif /* FIXPT */ fraction #ifdef HAVE_PROTOTYPES zvelocity ( fraction st , fraction ct , fraction sf , fraction cf , scaled t ) #else zvelocity ( st , ct , sf , cf , t ) fraction st ; fraction ct ; fraction sf ; fraction cf ; scaled t ; #endif { register fraction Result; integer acc, num, denom ; acc = takefraction ( st - ( sf / 16 ) , sf - ( st / 16 ) ) ; acc = takefraction ( acc , ct - cf ) ; num = 536870912L + takefraction ( acc , 379625062L ) ; denom = 805306368L + takefraction ( ct , 497706707L ) + takefraction ( cf , 307599661L ) ; if ( t != 65536L ) num = makescaled ( num , t ) ; if ( num / 4 >= denom ) Result = 1073741824L ; else Result = makefraction ( num , denom ) ; return Result ; } integer #ifdef HAVE_PROTOTYPES zabvscd ( integer a , integer b , integer c , integer d ) #else zabvscd ( a , b , c , d ) integer a ; integer b ; integer c ; integer d ; #endif { /* 10 */ register integer Result; integer q, r ; if ( a < 0 ) { a = - (integer) a ; b = - (integer) b ; } if ( c < 0 ) { c = - (integer) c ; d = - (integer) d ; } if ( d <= 0 ) { if ( b >= 0 ) if ( ( ( a == 0 ) || ( b == 0 ) ) && ( ( c == 0 ) || ( d == 0 ) ) ) { Result = 0 ; goto lab10 ; } else { Result = 1 ; goto lab10 ; } if ( d == 0 ) if ( a == 0 ) { Result = 0 ; goto lab10 ; } else { Result = -1 ; goto lab10 ; } q = a ; a = c ; c = q ; q = - (integer) b ; b = - (integer) d ; d = q ; } else if ( b <= 0 ) { if ( b < 0 ) if ( a > 0 ) { Result = -1 ; goto lab10 ; } if ( c == 0 ) { Result = 0 ; goto lab10 ; } else { Result = -1 ; goto lab10 ; } } while ( true ) { q = a / d ; r = c / b ; if ( q != r ) if ( q > r ) { Result = 1 ; goto lab10 ; } else { Result = -1 ; goto lab10 ; } q = a % d ; r = c % b ; if ( r == 0 ) if ( q == 0 ) { Result = 0 ; goto lab10 ; } else { Result = 1 ; goto lab10 ; } if ( q == 0 ) { Result = -1 ; goto lab10 ; } a = b ; b = q ; c = d ; d = r ; } lab10: ; return Result ; } scaled #ifdef HAVE_PROTOTYPES zsquarert ( scaled x ) #else zsquarert ( x ) scaled x ; #endif { register scaled Result; smallnumber k ; integer y, q ; if ( x <= 0 ) { if ( x < 0 ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 304 ) ; } printscaled ( x ) ; print ( 305 ) ; { helpptr = 2 ; helpline [1 ]= 306 ; helpline [0 ]= 307 ; } error () ; } Result = 0 ; } else { k = 23 ; q = 2 ; while ( x < 536870912L ) { decr ( k ) ; x = x + x + x + x ; } if ( x < 1073741824L ) y = 0 ; else { x = x - 1073741824L ; y = 1 ; } do { x = x + x ; y = y + y ; if ( x >= 1073741824L ) { x = x - 1073741824L ; incr ( y ) ; } x = x + x ; y = y + y - q ; q = q + q ; if ( x >= 1073741824L ) { x = x - 1073741824L ; incr ( y ) ; } if ( y > q ) { y = y - q ; q = q + 2 ; } else if ( y <= 0 ) { q = q - 2 ; y = y + q ; } decr ( k ) ; } while ( ! ( k == 0 ) ) ; Result = halfp ( q ) ; } return Result ; } integer #ifdef HAVE_PROTOTYPES zpythadd ( integer a , integer b ) #else zpythadd ( a , b ) integer a ; integer b ; #endif { /* 30 */ register integer Result; fraction r ; boolean big ; a = abs ( a ) ; b = abs ( b ) ; if ( a < b ) { r = b ; b = a ; a = r ; } if ( b > 0 ) { if ( a < 536870912L ) big = false ; else { a = a / 4 ; b = b / 4 ; big = true ; } while ( true ) { r = makefraction ( b , a ) ; r = takefraction ( r , r ) ; if ( r == 0 ) goto lab30 ; r = makefraction ( r , 1073741824L + r ) ; a = a + takefraction ( a + a , r ) ; b = takefraction ( b , r ) ; } lab30: ; if ( big ) if ( a < 536870912L ) a = a + a + a + a ; else { aritherror = true ; a = 2147483647L ; } } Result = a ; return Result ; } integer #ifdef HAVE_PROTOTYPES zpythsub ( integer a , integer b ) #else zpythsub ( a , b ) integer a ; integer b ; #endif { /* 30 */ register integer Result; fraction r ; boolean big ; a = abs ( a ) ; b = abs ( b ) ; if ( a <= b ) { if ( a < b ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 308 ) ; } printscaled ( a ) ; print ( 309 ) ; printscaled ( b ) ; print ( 305 ) ; { helpptr = 2 ; helpline [1 ]= 306 ; helpline [0 ]= 307 ; } error () ; } a = 0 ; } else { if ( a < 1073741824L ) big = false ; else { a = halfp ( a ) ; b = halfp ( b ) ; big = true ; } while ( true ) { r = makefraction ( b , a ) ; r = takefraction ( r , r ) ; if ( r == 0 ) goto lab30 ; r = makefraction ( r , 1073741824L - r ) ; a = a - takefraction ( a + a , r ) ; b = takefraction ( b , r ) ; } lab30: ; if ( big ) a = a + a ; } Result = a ; return Result ; } scaled #ifdef HAVE_PROTOTYPES zmlog ( scaled x ) #else zmlog ( x ) scaled x ; #endif { register scaled Result; integer y, z ; integer k ; if ( x <= 0 ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 310 ) ; } printscaled ( x ) ; print ( 305 ) ; { helpptr = 2 ; helpline [1 ]= 311 ; helpline [0 ]= 307 ; } error () ; Result = 0 ; } else { y = 1302456860L ; z = 6581195L ; while ( x < 1073741824L ) { x = x + x ; y = y - 93032639L ; z = z - 48782L ; } y = y + ( z / 65536L ) ; k = 2 ; while ( x > 1073741828L ) { z = ( ( x - 1 ) / twotothe [k ]) + 1 ; while ( x < 1073741824L + z ) { z = halfp ( z + 1 ) ; k = k + 1 ; } y = y + speclog [k ]; x = x - z ; } Result = y / 8 ; } return Result ; } scaled #ifdef HAVE_PROTOTYPES zmexp ( scaled x ) #else zmexp ( x ) scaled x ; #endif { register scaled Result; smallnumber k ; integer y, z ; if ( x > 174436200L ) { aritherror = true ; Result = 2147483647L ; } else if ( x < -197694359L ) Result = 0 ; else { if ( x <= 0 ) { z = -8 * x ; y = 1048576L ; } else { if ( x <= 127919879L ) z = 1023359037L - 8 * x ; else z = 8 * ( 174436200L - x ) ; y = 2147483647L ; } k = 1 ; while ( z > 0 ) { while ( z >= speclog [k ]) { z = z - speclog [k ]; y = y - 1 - ( ( y - twotothe [k - 1 ]) / twotothe [k ]) ; } incr ( k ) ; } if ( x <= 127919879L ) Result = ( y + 8 ) / 16 ; else Result = y ; } return Result ; } angle #ifdef HAVE_PROTOTYPES znarg ( integer x , integer y ) #else znarg ( x , y ) integer x ; integer y ; #endif { register angle Result; angle z ; integer t ; smallnumber k ; char octant ; if ( x >= 0 ) octant = 1 ; else { x = - (integer) x ; octant = 2 ; } if ( y < 0 ) { y = - (integer) y ; octant = octant + 2 ; } if ( x < y ) { t = y ; y = x ; x = t ; octant = octant + 4 ; } if ( x == 0 ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 312 ) ; } { helpptr = 2 ; helpline [1 ]= 313 ; helpline [0 ]= 307 ; } error () ; Result = 0 ; } else { while ( x >= 536870912L ) { x = halfp ( x ) ; y = halfp ( y ) ; } z = 0 ; if ( y > 0 ) { while ( x < 268435456L ) { x = x + x ; y = y + y ; } k = 0 ; do { y = y + y ; incr ( k ) ; if ( y > x ) { z = z + specatan [k ]; t = x ; x = x + ( y / twotothe [k + k ]) ; y = y - t ; } } while ( ! ( k == 15 ) ) ; do { y = y + y ; incr ( k ) ; if ( y > x ) { z = z + specatan [k ]; y = y - x ; } } while ( ! ( k == 26 ) ) ; } switch ( octant ) {case 1 : Result = z ; break ; case 5 : Result = 94371840L - z ; break ; case 6 : Result = 94371840L + z ; break ; case 2 : Result = 188743680L - z ; break ; case 4 : Result = z - 188743680L ; break ; case 8 : Result = - (integer) z - 94371840L ; break ; case 7 : Result = z - 94371840L ; break ; case 3 : Result = - (integer) z ; break ; } } return Result ; } void #ifdef HAVE_PROTOTYPES znsincos ( angle z ) #else znsincos ( z ) angle z ; #endif { smallnumber k ; char q ; fraction r ; integer x, y, t ; while ( z < 0 ) z = z + 377487360L ; z = z % 377487360L ; q = z / 47185920L ; z = z % 47185920L ; x = 268435456L ; y = x ; if ( ! odd ( q ) ) z = 47185920L - z ; k = 1 ; while ( z > 0 ) { if ( z >= specatan [k ]) { z = z - specatan [k ]; t = x ; x = t + y / twotothe [k ]; y = y - t / twotothe [k ]; } incr ( k ) ; } if ( y < 0 ) y = 0 ; switch ( q ) {case 0 : ; break ; case 1 : { t = x ; x = y ; y = t ; } break ; case 2 : { t = x ; x = - (integer) y ; y = t ; } break ; case 3 : x = - (integer) x ; break ; case 4 : { x = - (integer) x ; y = - (integer) y ; } break ; case 5 : { t = x ; x = - (integer) y ; y = - (integer) t ; } break ; case 6 : { t = x ; x = y ; y = - (integer) t ; } break ; case 7 : y = - (integer) y ; break ; } r = pythadd ( x , y ) ; ncos = makefraction ( x , r ) ; nsin = makefraction ( y , r ) ; } void #ifdef HAVE_PROTOTYPES newrandoms ( void ) #else newrandoms ( ) #endif { char k ; fraction x ; {register integer for_end; k = 0 ;for_end = 23 ; if ( k <= for_end) do { x = randoms [k ]- randoms [k + 31 ]; if ( x < 0 ) x = x + 268435456L ; randoms [k ]= x ; } while ( k++ < for_end ) ;} {register integer for_end; k = 24 ;for_end = 54 ; if ( k <= for_end) do { x = randoms [k ]- randoms [k - 24 ]; if ( x < 0 ) x = x + 268435456L ; randoms [k ]= x ; } while ( k++ < for_end ) ;} jrandom = 54 ; } void #ifdef HAVE_PROTOTYPES zinitrandoms ( scaled seed ) #else zinitrandoms ( seed ) scaled seed ; #endif { fraction j, jj, k ; char i ; j = abs ( seed ) ; while ( j >= 268435456L ) j = halfp ( j ) ; k = 1 ; {register integer for_end; i = 0 ;for_end = 54 ; if ( i <= for_end) do { jj = k ; k = j - k ; j = jj ; if ( k < 0 ) k = k + 268435456L ; randoms [( i * 21 ) % 55 ]= j ; } while ( i++ < for_end ) ;} newrandoms () ; newrandoms () ; newrandoms () ; } scaled #ifdef HAVE_PROTOTYPES zunifrand ( scaled x ) #else zunifrand ( x ) scaled x ; #endif { register scaled Result; scaled y ; if ( jrandom == 0 ) newrandoms () ; else decr ( jrandom ) ; y = takefraction ( abs ( x ) , randoms [jrandom ]) ; if ( y == abs ( x ) ) Result = 0 ; else if ( x > 0 ) Result = y ; else Result = - (integer) y ; return Result ; } scaled #ifdef HAVE_PROTOTYPES normrand ( void ) #else normrand ( ) #endif { register scaled Result; integer x, u, l ; do { do { if ( jrandom == 0 ) newrandoms () ; else decr ( jrandom ) ; x = takefraction ( 112429L , randoms [jrandom ]- 134217728L ) ; if ( jrandom == 0 ) newrandoms () ; else decr ( jrandom ) ; u = randoms [jrandom ]; } while ( ! ( abs ( x ) < u ) ) ; x = makefraction ( x , u ) ; l = 139548960L - mlog ( u ) ; } while ( ! ( abvscd ( 1024 , l , x , x ) >= 0 ) ) ; Result = x ; return Result ; } #ifdef TEXMF_DEBUG void #ifdef HAVE_PROTOTYPES zprintword ( memoryword w ) #else zprintword ( w ) memoryword w ; #endif { printint ( w .cint ) ; printchar ( 32 ) ; printscaled ( w .cint ) ; printchar ( 32 ) ; printscaled ( w .cint / 4096 ) ; println () ; printint ( w .hhfield .lhfield ) ; printchar ( 61 ) ; printint ( w .hhfield .b0 ) ; printchar ( 58 ) ; printint ( w .hhfield .b1 ) ; printchar ( 59 ) ; printint ( w .hhfield .v.RH ) ; printchar ( 32 ) ; printint ( w .qqqq .b0 ) ; printchar ( 58 ) ; printint ( w .qqqq .b1 ) ; printchar ( 58 ) ; printint ( w .qqqq .b2 ) ; printchar ( 58 ) ; printint ( w .qqqq .b3 ) ; } #endif /* TEXMF_DEBUG */ void #ifdef HAVE_PROTOTYPES zshowtokenlist ( integer p , integer q , integer l , integer nulltally ) #else zshowtokenlist ( p , q , l , nulltally ) integer p ; integer q ; integer l ; integer nulltally ; #endif { /* 10 */ smallnumber class, c ; integer r, v ; class = 3 ; tally = nulltally ; while ( ( p != 0 ) && ( tally < l ) ) { if ( p == q ) { firstcount = tally ; trickcount = tally + 1 + errorline - halferrorline ; if ( trickcount < errorline ) trickcount = errorline ; } c = 9 ; if ( ( p < 0 ) || ( p > memend ) ) { print ( 492 ) ; goto lab10 ; } if ( p < himemmin ) if ( mem [p ].hhfield .b1 == 12 ) if ( mem [p ].hhfield .b0 == 16 ) { if ( class == 0 ) printchar ( 32 ) ; v = mem [p + 1 ].cint ; if ( v < 0 ) { if ( class == 17 ) printchar ( 32 ) ; printchar ( 91 ) ; printscaled ( v ) ; printchar ( 93 ) ; c = 18 ; } else { printscaled ( v ) ; c = 0 ; } } else if ( mem [p ].hhfield .b0 != 4 ) print ( 495 ) ; else { printchar ( 34 ) ; print ( mem [p + 1 ].cint ) ; printchar ( 34 ) ; c = 4 ; } else if ( ( mem [p ].hhfield .b1 != 11 ) || ( mem [p ].hhfield .b0 < 1 ) || ( mem [p ].hhfield .b0 > 19 ) ) print ( 495 ) ; else { gpointer = p ; printcapsule () ; c = 8 ; } else { r = mem [p ].hhfield .lhfield ; if ( r >= 9770 ) { if ( r < 9920 ) { print ( 497 ) ; r = r - ( 9770 ) ; } else if ( r < 10070 ) { print ( 498 ) ; r = r - ( 9920 ) ; } else { print ( 499 ) ; r = r - ( 10070 ) ; } printint ( r ) ; printchar ( 41 ) ; c = 8 ; } else if ( r < 1 ) if ( r == 0 ) { if ( class == 17 ) printchar ( 32 ) ; print ( 496 ) ; c = 18 ; } else print ( 493 ) ; else { r = hash [r ].v.RH ; if ( ( r < 0 ) || ( r >= strptr ) ) print ( 494 ) ; else { c = charclass [strpool [strstart [r ]]]; if ( c == class ) switch ( c ) {case 9 : printchar ( 46 ) ; break ; case 5 : case 6 : case 7 : case 8 : ; break ; default: printchar ( 32 ) ; break ; } print ( r ) ; } } } class = c ; p = mem [p ].hhfield .v.RH ; } if ( p != 0 ) print ( 491 ) ; lab10: ; } void #ifdef HAVE_PROTOTYPES runaway ( void ) #else runaway ( ) #endif { if ( scannerstatus > 2 ) { printnl ( 634 ) ; switch ( scannerstatus ) {case 3 : print ( 635 ) ; break ; case 4 : case 5 : print ( 636 ) ; break ; case 6 : print ( 637 ) ; break ; } println () ; showtokenlist ( mem [memtop - 2 ].hhfield .v.RH , 0 , errorline - 10 , 0 ) ; } } halfword #ifdef HAVE_PROTOTYPES getavail ( void ) #else getavail ( ) #endif { register halfword Result; halfword p ; p = avail ; if ( p != 0 ) avail = mem [avail ].hhfield .v.RH ; else if ( memend < memmax ) { incr ( memend ) ; p = memend ; } else { decr ( himemmin ) ; p = himemmin ; if ( himemmin <= lomemmax ) { runaway () ; overflow ( 314 , memmax + 1 ) ; } } mem [p ].hhfield .v.RH = 0 ; ; #ifdef STAT incr ( dynused ) ; #endif /* STAT */ Result = p ; return Result ; } halfword #ifdef HAVE_PROTOTYPES zgetnode ( integer s ) #else zgetnode ( s ) integer s ; #endif { /* 40 10 20 */ register halfword Result; halfword p ; halfword q ; integer r ; integer t, tt ; lab20: p = rover ; do { q = p + mem [p ].hhfield .lhfield ; while ( ( mem [q ].hhfield .v.RH == 268435455L ) ) { t = mem [q + 1 ].hhfield .v.RH ; tt = mem [q + 1 ].hhfield .lhfield ; if ( q == rover ) rover = t ; mem [t + 1 ].hhfield .lhfield = tt ; mem [tt + 1 ].hhfield .v.RH = t ; q = q + mem [q ].hhfield .lhfield ; } r = q - s ; if ( r > toint ( p + 1 ) ) { mem [p ].hhfield .lhfield = r - p ; rover = p ; goto lab40 ; } if ( r == p ) if ( mem [p + 1 ].hhfield .v.RH != p ) { rover = mem [p + 1 ].hhfield .v.RH ; t = mem [p + 1 ].hhfield .lhfield ; mem [rover + 1 ].hhfield .lhfield = t ; mem [t + 1 ].hhfield .v.RH = rover ; goto lab40 ; } mem [p ].hhfield .lhfield = q - p ; p = mem [p + 1 ].hhfield .v.RH ; } while ( ! ( p == rover ) ) ; if ( s == 1073741824L ) { Result = 268435455L ; goto lab10 ; } if ( lomemmax + 2 < himemmin ) if ( lomemmax + 2 <= 268435455L ) { if ( himemmin - lomemmax >= 1998 ) t = lomemmax + 1000 ; else t = lomemmax + 1 + ( himemmin - lomemmax ) / 2 ; if ( t > 268435455L ) t = 268435455L ; p = mem [rover + 1 ].hhfield .lhfield ; q = lomemmax ; mem [p + 1 ].hhfield .v.RH = q ; mem [rover + 1 ].hhfield .lhfield = q ; mem [q + 1 ].hhfield .v.RH = rover ; mem [q + 1 ].hhfield .lhfield = p ; mem [q ].hhfield .v.RH = 268435455L ; mem [q ].hhfield .lhfield = t - lomemmax ; lomemmax = t ; mem [lomemmax ].hhfield .v.RH = 0 ; mem [lomemmax ].hhfield .lhfield = 0 ; rover = q ; goto lab20 ; } overflow ( 314 , memmax + 1 ) ; lab40: mem [r ].hhfield .v.RH = 0 ; ; #ifdef STAT varused = varused + s ; #endif /* STAT */ Result = r ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES zfreenode ( halfword p , halfword s ) #else zfreenode ( p , s ) halfword p ; halfword s ; #endif { halfword q ; mem [p ].hhfield .lhfield = s ; mem [p ].hhfield .v.RH = 268435455L ; q = mem [rover + 1 ].hhfield .lhfield ; mem [p + 1 ].hhfield .lhfield = q ; mem [p + 1 ].hhfield .v.RH = rover ; mem [rover + 1 ].hhfield .lhfield = p ; mem [q + 1 ].hhfield .v.RH = p ; ; #ifdef STAT varused = varused - s ; #endif /* STAT */ } void #ifdef HAVE_PROTOTYPES zflushlist ( halfword p ) #else zflushlist ( p ) halfword p ; #endif { /* 30 */ halfword q, r ; if ( p >= himemmin ) if ( p != memtop ) { r = p ; do { q = r ; r = mem [r ].hhfield .v.RH ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ if ( r < himemmin ) goto lab30 ; } while ( ! ( r == memtop ) ) ; lab30: mem [q ].hhfield .v.RH = avail ; avail = p ; } } void #ifdef HAVE_PROTOTYPES zflushnodelist ( halfword p ) #else zflushnodelist ( p ) halfword p ; #endif { halfword q ; while ( p != 0 ) { q = p ; p = mem [p ].hhfield .v.RH ; if ( q < himemmin ) freenode ( q , 2 ) ; else { mem [q ].hhfield .v.RH = avail ; avail = q ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ } } } #ifdef TEXMF_DEBUG void #ifdef HAVE_PROTOTYPES zcheckmem ( boolean printlocs ) #else zcheckmem ( printlocs ) boolean printlocs ; #endif { /* 31 32 */ halfword p, q, r ; boolean clobbered ; {register integer for_end; p = 0 ;for_end = lomemmax ; if ( p <= for_end) do freearr [p ]= false ; while ( p++ < for_end ) ;} {register integer for_end; p = himemmin ;for_end = memend ; if ( p <= for_end) do freearr [p ]= false ; while ( p++ < for_end ) ;} p = avail ; q = 0 ; clobbered = false ; while ( p != 0 ) { if ( ( p > memend ) || ( p < himemmin ) ) clobbered = true ; else if ( freearr [p ]) clobbered = true ; if ( clobbered ) { printnl ( 315 ) ; printint ( q ) ; goto lab31 ; } freearr [p ]= true ; q = p ; p = mem [q ].hhfield .v.RH ; } lab31: ; p = rover ; q = 0 ; clobbered = false ; do { if ( ( p >= lomemmax ) ) clobbered = true ; else if ( ( mem [p + 1 ].hhfield .v.RH >= lomemmax ) ) clobbered = true ; else if ( ! ( ( mem [p ].hhfield .v.RH == 268435455L ) ) || ( mem [p ] .hhfield .lhfield < 2 ) || ( p + mem [p ].hhfield .lhfield > lomemmax ) || ( mem [mem [p + 1 ].hhfield .v.RH + 1 ].hhfield .lhfield != p ) ) clobbered = true ; if ( clobbered ) { printnl ( 316 ) ; printint ( q ) ; goto lab32 ; } {register integer for_end; q = p ;for_end = p + mem [p ].hhfield .lhfield - 1 ; if ( q <= for_end) do { if ( freearr [q ]) { printnl ( 317 ) ; printint ( q ) ; goto lab32 ; } freearr [q ]= true ; } while ( q++ < for_end ) ;} q = p ; p = mem [p + 1 ].hhfield .v.RH ; } while ( ! ( p == rover ) ) ; lab32: ; p = 0 ; while ( p <= lomemmax ) { if ( ( mem [p ].hhfield .v.RH == 268435455L ) ) { printnl ( 318 ) ; printint ( p ) ; } while ( ( p <= lomemmax ) && ! freearr [p ]) incr ( p ) ; while ( ( p <= lomemmax ) && freearr [p ]) incr ( p ) ; } q = 13 ; p = mem [q ].hhfield .v.RH ; while ( p != 13 ) { if ( mem [p + 1 ].hhfield .lhfield != q ) { printnl ( 595 ) ; printint ( p ) ; } p = mem [p + 1 ].hhfield .v.RH ; r = 19 ; do { if ( mem [mem [p ].hhfield .lhfield + 1 ].cint >= mem [r + 1 ] .cint ) { printnl ( 596 ) ; printint ( p ) ; } r = mem [p ].hhfield .lhfield ; q = p ; p = mem [q ].hhfield .v.RH ; } while ( ! ( r == 0 ) ) ; } if ( printlocs ) { printnl ( 319 ) ; {register integer for_end; p = 0 ;for_end = lomemmax ; if ( p <= for_end) do if ( ! freearr [p ]&& ( ( p > waslomax ) || wasfree [p ]) ) { printchar ( 32 ) ; printint ( p ) ; } while ( p++ < for_end ) ;} {register integer for_end; p = himemmin ;for_end = memend ; if ( p <= for_end) do if ( ! freearr [p ]&& ( ( p < washimin ) || ( p > wasmemend ) || wasfree [p ]) ) { printchar ( 32 ) ; printint ( p ) ; } while ( p++ < for_end ) ;} } {register integer for_end; p = 0 ;for_end = lomemmax ; if ( p <= for_end) do wasfree [p ]= freearr [p ]; while ( p++ < for_end ) ;} {register integer for_end; p = himemmin ;for_end = memend ; if ( p <= for_end) do wasfree [p ]= freearr [p ]; while ( p++ < for_end ) ;} wasmemend = memend ; waslomax = lomemmax ; washimin = himemmin ; } #endif /* TEXMF_DEBUG */ #ifdef TEXMF_DEBUG void #ifdef HAVE_PROTOTYPES zsearchmem ( halfword p ) #else zsearchmem ( p ) halfword p ; #endif { integer q ; {register integer for_end; q = 0 ;for_end = lomemmax ; if ( q <= for_end) do { if ( mem [q ].hhfield .v.RH == p ) { printnl ( 320 ) ; printint ( q ) ; printchar ( 41 ) ; } if ( mem [q ].hhfield .lhfield == p ) { printnl ( 321 ) ; printint ( q ) ; printchar ( 41 ) ; } } while ( q++ < for_end ) ;} {register integer for_end; q = himemmin ;for_end = memend ; if ( q <= for_end) do { if ( mem [q ].hhfield .v.RH == p ) { printnl ( 320 ) ; printint ( q ) ; printchar ( 41 ) ; } if ( mem [q ].hhfield .lhfield == p ) { printnl ( 321 ) ; printint ( q ) ; printchar ( 41 ) ; } } while ( q++ < for_end ) ;} {register integer for_end; q = 1 ;for_end = 9769 ; if ( q <= for_end) do { if ( eqtb [q ].v.RH == p ) { printnl ( 457 ) ; printint ( q ) ; printchar ( 41 ) ; } } while ( q++ < for_end ) ;} } #endif /* TEXMF_DEBUG */ void #ifdef HAVE_PROTOTYPES zprintop ( quarterword c ) #else zprintop ( c ) quarterword c ; #endif { if ( c <= 15 ) printtype ( c ) ; else switch ( c ) {case 30 : print ( 346 ) ; break ; case 31 : print ( 347 ) ; break ; case 32 : print ( 348 ) ; break ; case 33 : print ( 349 ) ; break ; case 34 : print ( 350 ) ; break ; case 35 : print ( 351 ) ; break ; case 36 : print ( 352 ) ; break ; case 37 : print ( 353 ) ; break ; case 38 : print ( 354 ) ; break ; case 39 : print ( 355 ) ; break ; case 40 : print ( 356 ) ; break ; case 41 : print ( 357 ) ; break ; case 42 : print ( 358 ) ; break ; case 43 : print ( 359 ) ; break ; case 44 : print ( 360 ) ; break ; case 45 : print ( 361 ) ; break ; case 46 : print ( 362 ) ; break ; case 47 : print ( 363 ) ; break ; case 48 : print ( 364 ) ; break ; case 49 : print ( 365 ) ; break ; case 50 : print ( 366 ) ; break ; case 51 : print ( 367 ) ; break ; case 52 : print ( 368 ) ; break ; case 53 : print ( 369 ) ; break ; case 54 : print ( 370 ) ; break ; case 55 : print ( 371 ) ; break ; case 56 : print ( 372 ) ; break ; case 57 : print ( 373 ) ; break ; case 58 : print ( 374 ) ; break ; case 59 : print ( 375 ) ; break ; case 60 : print ( 376 ) ; break ; case 61 : print ( 377 ) ; break ; case 62 : print ( 378 ) ; break ; case 63 : print ( 379 ) ; break ; case 64 : print ( 380 ) ; break ; case 65 : print ( 381 ) ; break ; case 66 : print ( 382 ) ; break ; case 67 : print ( 383 ) ; break ; case 68 : print ( 384 ) ; break ; case 69 : printchar ( 43 ) ; break ; case 70 : printchar ( 45 ) ; break ; case 71 : printchar ( 42 ) ; break ; case 72 : printchar ( 47 ) ; break ; case 73 : print ( 385 ) ; break ; case 74 : print ( 309 ) ; break ; case 75 : print ( 386 ) ; break ; case 76 : print ( 387 ) ; break ; case 77 : printchar ( 60 ) ; break ; case 78 : print ( 388 ) ; break ; case 79 : printchar ( 62 ) ; break ; case 80 : print ( 389 ) ; break ; case 81 : printchar ( 61 ) ; break ; case 82 : print ( 390 ) ; break ; case 83 : print ( 38 ) ; break ; case 84 : print ( 391 ) ; break ; case 85 : print ( 392 ) ; break ; case 86 : print ( 393 ) ; break ; case 87 : print ( 394 ) ; break ; case 88 : print ( 395 ) ; break ; case 89 : print ( 396 ) ; break ; case 90 : print ( 397 ) ; break ; case 91 : print ( 398 ) ; break ; case 92 : print ( 399 ) ; break ; case 94 : print ( 400 ) ; break ; case 95 : print ( 401 ) ; break ; case 96 : print ( 402 ) ; break ; case 97 : print ( 403 ) ; break ; case 98 : print ( 404 ) ; break ; case 99 : print ( 405 ) ; break ; case 100 : print ( 406 ) ; break ; default: print ( 407 ) ; break ; } } void #ifdef HAVE_PROTOTYPES fixdateandtime ( void ) #else fixdateandtime ( ) #endif { dateandtime ( internal [17 ], internal [16 ], internal [15 ], internal [14 ]) ; internal [17 ]= internal [17 ]* 65536L ; internal [16 ]= internal [16 ]* 65536L ; internal [15 ]= internal [15 ]* 65536L ; internal [14 ]= internal [14 ]* 65536L ; } halfword #ifdef HAVE_PROTOTYPES zidlookup ( integer j , integer l ) #else zidlookup ( j , l ) integer j ; integer l ; #endif { /* 40 */ register halfword Result; integer h ; halfword p ; halfword k ; if ( l == 1 ) { p = buffer [j ]+ 1 ; hash [p ].v.RH = p - 1 ; goto lab40 ; } h = buffer [j ]; {register integer for_end; k = j + 1 ;for_end = j + l - 1 ; if ( k <= for_end) do { h = h + h + buffer [k ]; while ( h >= 7919 ) h = h - 7919 ; } while ( k++ < for_end ) ;} p = h + 257 ; while ( true ) { if ( hash [p ].v.RH > 0 ) if ( ( strstart [hash [p ].v.RH + 1 ]- strstart [hash [p ].v.RH ]) == l ) if ( streqbuf ( hash [p ].v.RH , j ) ) goto lab40 ; if ( hash [p ].lhfield == 0 ) { if ( hash [p ].v.RH > 0 ) { do { if ( ( hashused == 257 ) ) overflow ( 456 , 9500 ) ; decr ( hashused ) ; } while ( ! ( hash [hashused ].v.RH == 0 ) ) ; hash [p ].lhfield = hashused ; p = hashused ; } { if ( poolptr + l > maxpoolptr ) { if ( poolptr + l > poolsize ) overflow ( 257 , poolsize - initpoolptr ) ; maxpoolptr = poolptr + l ; } } {register integer for_end; k = j ;for_end = j + l - 1 ; if ( k <= for_end) do { strpool [poolptr ]= buffer [k ]; incr ( poolptr ) ; } while ( k++ < for_end ) ;} hash [p ].v.RH = makestring () ; strref [hash [p ].v.RH ]= 127 ; ; #ifdef STAT incr ( stcount ) ; #endif /* STAT */ goto lab40 ; } p = hash [p ].lhfield ; } lab40: Result = p ; return Result ; } halfword #ifdef HAVE_PROTOTYPES znewnumtok ( scaled v ) #else znewnumtok ( v ) scaled v ; #endif { register halfword Result; halfword p ; p = getnode ( 2 ) ; mem [p + 1 ].cint = v ; mem [p ].hhfield .b0 = 16 ; mem [p ].hhfield .b1 = 12 ; Result = p ; return Result ; } void #ifdef HAVE_PROTOTYPES zflushtokenlist ( halfword p ) #else zflushtokenlist ( p ) halfword p ; #endif { halfword q ; while ( p != 0 ) { q = p ; p = mem [p ].hhfield .v.RH ; if ( q >= himemmin ) { mem [q ].hhfield .v.RH = avail ; avail = q ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ } else { switch ( mem [q ].hhfield .b0 ) {case 1 : case 2 : case 16 : ; break ; case 4 : { if ( strref [mem [q + 1 ].cint ]< 127 ) if ( strref [mem [q + 1 ].cint ]> 1 ) decr ( strref [mem [q + 1 ].cint ]) ; else flushstring ( mem [q + 1 ].cint ) ; } break ; case 3 : case 5 : case 7 : case 12 : case 10 : case 6 : case 9 : case 8 : case 11 : case 14 : case 13 : case 17 : case 18 : case 19 : { gpointer = q ; tokenrecycle () ; } break ; default: confusion ( 490 ) ; break ; } freenode ( q , 2 ) ; } } } void #ifdef HAVE_PROTOTYPES zdeletemacref ( halfword p ) #else zdeletemacref ( p ) halfword p ; #endif { if ( mem [p ].hhfield .lhfield == 0 ) flushtokenlist ( p ) ; else decr ( mem [p ].hhfield .lhfield ) ; } void #ifdef HAVE_PROTOTYPES zprintcmdmod ( integer c , integer m ) #else zprintcmdmod ( c , m ) integer c ; integer m ; #endif { switch ( c ) {case 18 : print ( 461 ) ; break ; case 77 : print ( 460 ) ; break ; case 59 : print ( 463 ) ; break ; case 72 : print ( 462 ) ; break ; case 79 : print ( 459 ) ; break ; case 32 : print ( 464 ) ; break ; case 81 : print ( 58 ) ; break ; case 82 : print ( 44 ) ; break ; case 57 : print ( 465 ) ; break ; case 19 : print ( 466 ) ; break ; case 60 : print ( 467 ) ; break ; case 27 : print ( 468 ) ; break ; case 11 : print ( 469 ) ; break ; case 80 : print ( 458 ) ; break ; case 84 : print ( 452 ) ; break ; case 26 : print ( 470 ) ; break ; case 6 : print ( 471 ) ; break ; case 9 : print ( 472 ) ; break ; case 70 : print ( 473 ) ; break ; case 73 : print ( 474 ) ; break ; case 13 : print ( 475 ) ; break ; case 46 : print ( 123 ) ; break ; case 63 : print ( 91 ) ; break ; case 14 : print ( 476 ) ; break ; case 15 : print ( 477 ) ; break ; case 69 : print ( 478 ) ; break ; case 28 : print ( 479 ) ; break ; case 47 : print ( 407 ) ; break ; case 24 : print ( 480 ) ; break ; case 7 : printchar ( 92 ) ; break ; case 65 : print ( 125 ) ; break ; case 64 : print ( 93 ) ; break ; case 12 : print ( 481 ) ; break ; case 8 : print ( 482 ) ; break ; case 83 : print ( 59 ) ; break ; case 17 : print ( 483 ) ; break ; case 78 : print ( 484 ) ; break ; case 74 : print ( 485 ) ; break ; case 35 : print ( 486 ) ; break ; case 58 : print ( 487 ) ; break ; case 71 : print ( 488 ) ; break ; case 75 : print ( 489 ) ; break ; case 16 : if ( m <= 2 ) if ( m == 1 ) print ( 651 ) ; else if ( m < 1 ) print ( 453 ) ; else print ( 652 ) ; else if ( m == 53 ) print ( 653 ) ; else if ( m == 44 ) print ( 654 ) ; else print ( 655 ) ; break ; case 4 : if ( m <= 1 ) if ( m == 1 ) print ( 658 ) ; else print ( 454 ) ; else if ( m == 9770 ) print ( 656 ) ; else print ( 657 ) ; break ; case 61 : switch ( m ) {case 1 : print ( 660 ) ; break ; case 2 : printchar ( 64 ) ; break ; case 3 : print ( 661 ) ; break ; default: print ( 659 ) ; break ; } break ; case 56 : if ( m >= 9770 ) if ( m == 9770 ) print ( 672 ) ; else if ( m == 9920 ) print ( 673 ) ; else print ( 674 ) ; else if ( m < 2 ) print ( 675 ) ; else if ( m == 2 ) print ( 676 ) ; else print ( 677 ) ; break ; case 3 : if ( m == 0 ) print ( 687 ) ; else print ( 613 ) ; break ; case 1 : case 2 : switch ( m ) {case 1 : print ( 714 ) ; break ; case 2 : print ( 451 ) ; break ; case 3 : print ( 715 ) ; break ; default: print ( 716 ) ; break ; } break ; case 33 : case 34 : case 37 : case 55 : case 45 : case 50 : case 36 : case 43 : case 54 : case 48 : case 51 : case 52 : printop ( m ) ; break ; case 30 : printtype ( m ) ; break ; case 85 : if ( m == 0 ) print ( 908 ) ; else print ( 909 ) ; break ; case 23 : switch ( m ) {case 0 : print ( 271 ) ; break ; case 1 : print ( 272 ) ; break ; case 2 : print ( 273 ) ; break ; default: print ( 915 ) ; break ; } break ; case 21 : if ( m == 0 ) print ( 916 ) ; else print ( 917 ) ; break ; case 22 : switch ( m ) {case 0 : print ( 931 ) ; break ; case 1 : print ( 932 ) ; break ; case 2 : print ( 933 ) ; break ; case 3 : print ( 934 ) ; break ; default: print ( 935 ) ; break ; } break ; case 31 : case 62 : { if ( c == 31 ) print ( 938 ) ; else print ( 939 ) ; print ( 940 ) ; print ( hash [m ].v.RH ) ; } break ; case 41 : if ( m == 0 ) print ( 941 ) ; else print ( 942 ) ; break ; case 10 : print ( 943 ) ; break ; case 53 : case 44 : case 49 : { printcmdmod ( 16 , c ) ; print ( 944 ) ; println () ; showtokenlist ( mem [mem [m ].hhfield .v.RH ].hhfield .v.RH , 0 , 1000 , 0 ) ; } break ; case 5 : print ( 945 ) ; break ; case 40 : print ( intname [m ]) ; break ; case 68 : if ( m == 1 ) print ( 952 ) ; else if ( m == 0 ) print ( 953 ) ; else print ( 954 ) ; break ; case 66 : if ( m == 6 ) print ( 955 ) ; else print ( 956 ) ; break ; case 67 : if ( m == 0 ) print ( 957 ) ; else print ( 958 ) ; break ; case 25 : if ( m < 1 ) print ( 988 ) ; else if ( m == 1 ) print ( 989 ) ; else print ( 990 ) ; break ; case 20 : switch ( m ) {case 0 : print ( 1000 ) ; break ; case 1 : print ( 1001 ) ; break ; case 2 : print ( 1002 ) ; break ; case 3 : print ( 1003 ) ; break ; default: print ( 1004 ) ; break ; } break ; case 76 : switch ( m ) {case 0 : print ( 1022 ) ; break ; case 1 : print ( 1023 ) ; break ; case 2 : print ( 1025 ) ; break ; case 3 : print ( 1027 ) ; break ; case 5 : print ( 1024 ) ; break ; case 6 : print ( 1026 ) ; break ; case 7 : print ( 1028 ) ; break ; case 11 : print ( 1029 ) ; break ; default: print ( 1030 ) ; break ; } break ; case 29 : if ( m == 16 ) print ( 1055 ) ; else print ( 1054 ) ; break ; default: print ( 600 ) ; break ; } } void #ifdef HAVE_PROTOTYPES zshowmacro ( halfword p , integer q , integer l ) #else zshowmacro ( p , q , l ) halfword p ; integer q ; integer l ; #endif { /* 10 */ halfword r ; p = mem [p ].hhfield .v.RH ; while ( mem [p ].hhfield .lhfield > 7 ) { r = mem [p ].hhfield .v.RH ; mem [p ].hhfield .v.RH = 0 ; showtokenlist ( p , 0 , l , 0 ) ; mem [p ].hhfield .v.RH = r ; p = r ; if ( l > 0 ) l = l - tally ; else goto lab10 ; } tally = 0 ; switch ( mem [p ].hhfield .lhfield ) {case 0 : print ( 500 ) ; break ; case 1 : case 2 : case 3 : { printchar ( 60 ) ; printcmdmod ( 56 , mem [p ].hhfield .lhfield ) ; print ( 501 ) ; } break ; case 4 : print ( 502 ) ; break ; case 5 : print ( 503 ) ; break ; case 6 : print ( 504 ) ; break ; case 7 : print ( 505 ) ; break ; } showtokenlist ( mem [p ].hhfield .v.RH , q , l - tally , 0 ) ; lab10: ; } void #ifdef HAVE_PROTOTYPES zinitbignode ( halfword p ) #else zinitbignode ( p ) halfword p ; #endif { halfword q ; smallnumber s ; s = bignodesize [mem [p ].hhfield .b0 ]; q = getnode ( s ) ; do { s = s - 2 ; { mem [q + s ].hhfield .b0 = 19 ; serialno = serialno + 64 ; mem [q + s + 1 ].cint = serialno ; } mem [q + s ].hhfield .b1 = halfp ( s ) + 5 ; mem [q + s ].hhfield .v.RH = 0 ; } while ( ! ( s == 0 ) ) ; mem [q ].hhfield .v.RH = p ; mem [p + 1 ].cint = q ; } halfword #ifdef HAVE_PROTOTYPES idtransform ( void ) #else idtransform ( ) #endif { register halfword Result; halfword p, q, r ; p = getnode ( 2 ) ; mem [p ].hhfield .b0 = 13 ; mem [p ].hhfield .b1 = 11 ; mem [p + 1 ].cint = 0 ; initbignode ( p ) ; q = mem [p + 1 ].cint ; r = q + 12 ; do { r = r - 2 ; mem [r ].hhfield .b0 = 16 ; mem [r + 1 ].cint = 0 ; } while ( ! ( r == q ) ) ; mem [q + 5 ].cint = 65536L ; mem [q + 11 ].cint = 65536L ; Result = p ; return Result ; } void #ifdef HAVE_PROTOTYPES znewroot ( halfword x ) #else znewroot ( x ) halfword x ; #endif { halfword p ; p = getnode ( 2 ) ; mem [p ].hhfield .b0 = 0 ; mem [p ].hhfield .b1 = 0 ; mem [p ].hhfield .v.RH = x ; eqtb [x ].v.RH = p ; } void #ifdef HAVE_PROTOTYPES zprintvariablename ( halfword p ) #else zprintvariablename ( p ) halfword p ; #endif { /* 40 10 */ halfword q ; halfword r ; while ( mem [p ].hhfield .b1 >= 5 ) { switch ( mem [p ].hhfield .b1 ) {case 5 : printchar ( 120 ) ; break ; case 6 : printchar ( 121 ) ; break ; case 7 : print ( 508 ) ; break ; case 8 : print ( 509 ) ; break ; case 9 : print ( 510 ) ; break ; case 10 : print ( 511 ) ; break ; case 11 : { print ( 512 ) ; printint ( p - 0 ) ; goto lab10 ; } break ; } print ( 513 ) ; p = mem [p - 2 * ( mem [p ].hhfield .b1 - 5 ) ].hhfield .v.RH ; } q = 0 ; while ( mem [p ].hhfield .b1 > 1 ) { if ( mem [p ].hhfield .b1 == 3 ) { r = newnumtok ( mem [p + 2 ].cint ) ; do { p = mem [p ].hhfield .v.RH ; } while ( ! ( mem [p ].hhfield .b1 == 4 ) ) ; } else if ( mem [p ].hhfield .b1 == 2 ) { p = mem [p ].hhfield .v.RH ; goto lab40 ; } else { if ( mem [p ].hhfield .b1 != 4 ) confusion ( 507 ) ; r = getavail () ; mem [r ].hhfield .lhfield = mem [p + 2 ].hhfield .lhfield ; } mem [r ].hhfield .v.RH = q ; q = r ; lab40: p = mem [p + 2 ].hhfield .v.RH ; } r = getavail () ; mem [r ].hhfield .lhfield = mem [p ].hhfield .v.RH ; mem [r ].hhfield .v.RH = q ; if ( mem [p ].hhfield .b1 == 1 ) print ( 506 ) ; showtokenlist ( r , 0 , 2147483647L , tally ) ; flushtokenlist ( r ) ; lab10: ; } boolean #ifdef HAVE_PROTOTYPES zinteresting ( halfword p ) #else zinteresting ( p ) halfword p ; #endif { register boolean Result; smallnumber t ; if ( internal [3 ]> 0 ) Result = true ; else { t = mem [p ].hhfield .b1 ; if ( t >= 5 ) if ( t != 11 ) t = mem [mem [p - 2 * ( t - 5 ) ].hhfield .v.RH ].hhfield .b1 ; Result = ( t != 11 ) ; } return Result ; } halfword #ifdef HAVE_PROTOTYPES znewstructure ( halfword p ) #else znewstructure ( p ) halfword p ; #endif { register halfword Result; halfword q, r ; switch ( mem [p ].hhfield .b1 ) {case 0 : { q = mem [p ].hhfield .v.RH ; r = getnode ( 2 ) ; eqtb [q ].v.RH = r ; } break ; case 3 : { q = p ; do { q = mem [q ].hhfield .v.RH ; } while ( ! ( mem [q ].hhfield .b1 == 4 ) ) ; q = mem [q + 2 ].hhfield .v.RH ; r = q + 1 ; do { q = r ; r = mem [r ].hhfield .v.RH ; } while ( ! ( r == p ) ) ; r = getnode ( 3 ) ; mem [q ].hhfield .v.RH = r ; mem [r + 2 ].cint = mem [p + 2 ].cint ; } break ; case 4 : { q = mem [p + 2 ].hhfield .v.RH ; r = mem [q + 1 ].hhfield .lhfield ; do { q = r ; r = mem [r ].hhfield .v.RH ; } while ( ! ( r == p ) ) ; r = getnode ( 3 ) ; mem [q ].hhfield .v.RH = r ; mem [r + 2 ]= mem [p + 2 ]; if ( mem [p + 2 ].hhfield .lhfield == 0 ) { q = mem [p + 2 ].hhfield .v.RH + 1 ; while ( mem [q ].hhfield .v.RH != p ) q = mem [q ].hhfield .v.RH ; mem [q ].hhfield .v.RH = r ; } } break ; default: confusion ( 514 ) ; break ; } mem [r ].hhfield .v.RH = mem [p ].hhfield .v.RH ; mem [r ].hhfield .b0 = 21 ; mem [r ].hhfield .b1 = mem [p ].hhfield .b1 ; mem [r + 1 ].hhfield .lhfield = p ; mem [p ].hhfield .b1 = 2 ; q = getnode ( 3 ) ; mem [p ].hhfield .v.RH = q ; mem [r + 1 ].hhfield .v.RH = q ; mem [q + 2 ].hhfield .v.RH = r ; mem [q ].hhfield .b0 = 0 ; mem [q ].hhfield .b1 = 4 ; mem [q ].hhfield .v.RH = 17 ; mem [q + 2 ].hhfield .lhfield = 0 ; Result = r ; return Result ; } halfword #ifdef HAVE_PROTOTYPES zfindvariable ( halfword t ) #else zfindvariable ( t ) halfword t ; #endif { /* 10 */ register halfword Result; halfword p, q, r, s ; halfword pp, qq, rr, ss ; integer n ; memoryword saveword ; p = mem [t ].hhfield .lhfield ; t = mem [t ].hhfield .v.RH ; if ( eqtb [p ].lhfield % 86 != 41 ) { Result = 0 ; goto lab10 ; } if ( eqtb [p ].v.RH == 0 ) newroot ( p ) ; p = eqtb [p ].v.RH ; pp = p ; while ( t != 0 ) { if ( mem [pp ].hhfield .b0 != 21 ) { if ( mem [pp ].hhfield .b0 > 21 ) { Result = 0 ; goto lab10 ; } ss = newstructure ( pp ) ; if ( p == pp ) p = ss ; pp = ss ; } if ( mem [p ].hhfield .b0 != 21 ) p = newstructure ( p ) ; if ( t < himemmin ) { n = mem [t + 1 ].cint ; pp = mem [mem [pp + 1 ].hhfield .lhfield ].hhfield .v.RH ; q = mem [mem [p + 1 ].hhfield .lhfield ].hhfield .v.RH ; saveword = mem [q + 2 ]; mem [q + 2 ].cint = 2147483647L ; s = p + 1 ; do { r = s ; s = mem [s ].hhfield .v.RH ; } while ( ! ( n <= mem [s + 2 ].cint ) ) ; if ( n == mem [s + 2 ].cint ) p = s ; else { p = getnode ( 3 ) ; mem [r ].hhfield .v.RH = p ; mem [p ].hhfield .v.RH = s ; mem [p + 2 ].cint = n ; mem [p ].hhfield .b1 = 3 ; mem [p ].hhfield .b0 = 0 ; } mem [q + 2 ]= saveword ; } else { n = mem [t ].hhfield .lhfield ; ss = mem [pp + 1 ].hhfield .lhfield ; do { rr = ss ; ss = mem [ss ].hhfield .v.RH ; } while ( ! ( n <= mem [ss + 2 ].hhfield .lhfield ) ) ; if ( n < mem [ss + 2 ].hhfield .lhfield ) { qq = getnode ( 3 ) ; mem [rr ].hhfield .v.RH = qq ; mem [qq ].hhfield .v.RH = ss ; mem [qq + 2 ].hhfield .lhfield = n ; mem [qq ].hhfield .b1 = 4 ; mem [qq ].hhfield .b0 = 0 ; mem [qq + 2 ].hhfield .v.RH = pp ; ss = qq ; } if ( p == pp ) { p = ss ; pp = ss ; } else { pp = ss ; s = mem [p + 1 ].hhfield .lhfield ; do { r = s ; s = mem [s ].hhfield .v.RH ; } while ( ! ( n <= mem [s + 2 ].hhfield .lhfield ) ) ; if ( n == mem [s + 2 ].hhfield .lhfield ) p = s ; else { q = getnode ( 3 ) ; mem [r ].hhfield .v.RH = q ; mem [q ].hhfield .v.RH = s ; mem [q + 2 ].hhfield .lhfield = n ; mem [q ].hhfield .b1 = 4 ; mem [q ].hhfield .b0 = 0 ; mem [q + 2 ].hhfield .v.RH = p ; p = q ; } } } t = mem [t ].hhfield .v.RH ; } if ( mem [pp ].hhfield .b0 >= 21 ) if ( mem [pp ].hhfield .b0 == 21 ) pp = mem [pp + 1 ].hhfield .lhfield ; else { Result = 0 ; goto lab10 ; } if ( mem [p ].hhfield .b0 == 21 ) p = mem [p + 1 ].hhfield .lhfield ; if ( mem [p ].hhfield .b0 == 0 ) { if ( mem [pp ].hhfield .b0 == 0 ) { mem [pp ].hhfield .b0 = 15 ; mem [pp + 1 ].cint = 0 ; } mem [p ].hhfield .b0 = mem [pp ].hhfield .b0 ; mem [p + 1 ].cint = 0 ; } Result = p ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES zprintpath ( halfword h , strnumber s , boolean nuline ) #else zprintpath ( h , s , nuline ) halfword h ; strnumber s ; boolean nuline ; #endif { /* 30 31 */ halfword p, q ; printdiagnostic ( 516 , s , nuline ) ; println () ; p = h ; do { q = mem [p ].hhfield .v.RH ; if ( ( p == 0 ) || ( q == 0 ) ) { printnl ( 259 ) ; goto lab30 ; } printtwo ( mem [p + 1 ].cint , mem [p + 2 ].cint ) ; switch ( mem [p ].hhfield .b1 ) {case 0 : { if ( mem [p ].hhfield .b0 == 4 ) print ( 517 ) ; if ( ( mem [q ].hhfield .b0 != 0 ) || ( q != h ) ) q = 0 ; goto lab31 ; } break ; case 1 : { print ( 523 ) ; printtwo ( mem [p + 5 ].cint , mem [p + 6 ].cint ) ; print ( 522 ) ; if ( mem [q ].hhfield .b0 != 1 ) print ( 524 ) ; else printtwo ( mem [q + 3 ].cint , mem [q + 4 ].cint ) ; goto lab31 ; } break ; case 4 : if ( ( mem [p ].hhfield .b0 != 1 ) && ( mem [p ].hhfield .b0 != 4 ) ) print ( 517 ) ; break ; case 3 : case 2 : { if ( mem [p ].hhfield .b0 == 4 ) print ( 524 ) ; if ( mem [p ].hhfield .b1 == 3 ) { print ( 520 ) ; printscaled ( mem [p + 5 ].cint ) ; } else { nsincos ( mem [p + 5 ].cint ) ; printchar ( 123 ) ; printscaled ( ncos ) ; printchar ( 44 ) ; printscaled ( nsin ) ; } printchar ( 125 ) ; } break ; default: print ( 259 ) ; break ; } if ( mem [q ].hhfield .b0 <= 1 ) print ( 518 ) ; else if ( ( mem [p + 6 ].cint != 65536L ) || ( mem [q + 4 ].cint != 65536L ) ) { print ( 521 ) ; if ( mem [p + 6 ].cint < 0 ) print ( 463 ) ; printscaled ( abs ( mem [p + 6 ].cint ) ) ; if ( mem [p + 6 ].cint != mem [q + 4 ].cint ) { print ( 522 ) ; if ( mem [q + 4 ].cint < 0 ) print ( 463 ) ; printscaled ( abs ( mem [q + 4 ].cint ) ) ; } } lab31: ; p = q ; if ( ( p != h ) || ( mem [h ].hhfield .b0 != 0 ) ) { printnl ( 519 ) ; if ( mem [p ].hhfield .b0 == 2 ) { nsincos ( mem [p + 3 ].cint ) ; printchar ( 123 ) ; printscaled ( ncos ) ; printchar ( 44 ) ; printscaled ( nsin ) ; printchar ( 125 ) ; } else if ( mem [p ].hhfield .b0 == 3 ) { print ( 520 ) ; printscaled ( mem [p + 3 ].cint ) ; printchar ( 125 ) ; } } } while ( ! ( p == h ) ) ; if ( mem [h ].hhfield .b0 != 0 ) print ( 384 ) ; lab30: enddiagnostic ( true ) ; } void #ifdef HAVE_PROTOTYPES zprintweight ( halfword q , integer xoff ) #else zprintweight ( q , xoff ) halfword q ; integer xoff ; #endif { integer w, m ; integer d ; d = mem [q ].hhfield .lhfield ; w = d % 8 ; m = ( d / 8 ) - mem [curedges + 3 ].hhfield .lhfield ; if ( fileoffset > maxprintline - 9 ) printnl ( 32 ) ; else printchar ( 32 ) ; printint ( m + xoff ) ; while ( w > 4 ) { printchar ( 43 ) ; decr ( w ) ; } while ( w < 4 ) { printchar ( 45 ) ; incr ( w ) ; } } void #ifdef HAVE_PROTOTYPES zprintedges ( strnumber s , boolean nuline , integer xoff , integer yoff ) #else zprintedges ( s , nuline , xoff , yoff ) strnumber s ; boolean nuline ; integer xoff ; integer yoff ; #endif { halfword p, q, r ; integer n ; printdiagnostic ( 531 , s , nuline ) ; p = mem [curedges ].hhfield .lhfield ; n = mem [curedges + 1 ].hhfield .v.RH - 4096 ; while ( p != curedges ) { q = mem [p + 1 ].hhfield .lhfield ; r = mem [p + 1 ].hhfield .v.RH ; if ( ( q > 1 ) || ( r != memtop ) ) { printnl ( 532 ) ; printint ( n + yoff ) ; printchar ( 58 ) ; while ( q > 1 ) { printweight ( q , xoff ) ; q = mem [q ].hhfield .v.RH ; } print ( 533 ) ; while ( r != memtop ) { printweight ( r , xoff ) ; r = mem [r ].hhfield .v.RH ; } } p = mem [p ].hhfield .lhfield ; decr ( n ) ; } enddiagnostic ( true ) ; } void #ifdef HAVE_PROTOTYPES zunskew ( scaled x , scaled y , smallnumber octant ) #else zunskew ( x , y , octant ) scaled x ; scaled y ; smallnumber octant ; #endif { switch ( octant ) {case 1 : { curx = x + y ; cury = y ; } break ; case 5 : { curx = y ; cury = x + y ; } break ; case 6 : { curx = - (integer) y ; cury = x + y ; } break ; case 2 : { curx = - (integer) x - y ; cury = y ; } break ; case 4 : { curx = - (integer) x - y ; cury = - (integer) y ; } break ; case 8 : { curx = - (integer) y ; cury = - (integer) x - y ; } break ; case 7 : { curx = y ; cury = - (integer) x - y ; } break ; case 3 : { curx = x + y ; cury = - (integer) y ; } break ; } } void #ifdef HAVE_PROTOTYPES zprintpen ( halfword p , strnumber s , boolean nuline ) #else zprintpen ( p , s , nuline ) halfword p ; strnumber s ; boolean nuline ; #endif { boolean nothingprinted ; char k ; halfword h ; integer m, n ; halfword w, ww ; printdiagnostic ( 568 , s , nuline ) ; nothingprinted = true ; println () ; {register integer for_end; k = 1 ;for_end = 8 ; if ( k <= for_end) do { octant = octantcode [k ]; h = p + octant ; n = mem [h ].hhfield .lhfield ; w = mem [h ].hhfield .v.RH ; if ( ! odd ( k ) ) w = mem [w ].hhfield .lhfield ; {register integer for_end; m = 1 ;for_end = n + 1 ; if ( m <= for_end) do { if ( odd ( k ) ) ww = mem [w ].hhfield .v.RH ; else ww = mem [w ].hhfield .lhfield ; if ( ( mem [ww + 1 ].cint != mem [w + 1 ].cint ) || ( mem [ww + 2 ].cint != mem [w + 2 ].cint ) ) { if ( nothingprinted ) nothingprinted = false ; else printnl ( 570 ) ; unskew ( mem [ww + 1 ].cint , mem [ww + 2 ].cint , octant ) ; printtwo ( curx , cury ) ; } w = ww ; } while ( m++ < for_end ) ;} } while ( k++ < for_end ) ;} if ( nothingprinted ) { w = mem [p + 1 ].hhfield .v.RH ; printtwo ( mem [w + 1 ].cint + mem [w + 2 ].cint , mem [w + 2 ].cint ) ; } printnl ( 569 ) ; enddiagnostic ( true ) ; } void #ifdef HAVE_PROTOTYPES zprintdependency ( halfword p , smallnumber t ) #else zprintdependency ( p , t ) halfword p ; smallnumber t ; #endif { /* 10 */ integer v ; halfword pp, q ; pp = p ; while ( true ) { v = abs ( mem [p + 1 ].cint ) ; q = mem [p ].hhfield .lhfield ; if ( q == 0 ) { if ( ( v != 0 ) || ( p == pp ) ) { if ( mem [p + 1 ].cint > 0 ) if ( p != pp ) printchar ( 43 ) ; printscaled ( mem [p + 1 ].cint ) ; } goto lab10 ; } if ( mem [p + 1 ].cint < 0 ) printchar ( 45 ) ; else if ( p != pp ) printchar ( 43 ) ; if ( t == 17 ) v = roundfraction ( v ) ; if ( v != 65536L ) printscaled ( v ) ; if ( mem [q ].hhfield .b0 != 19 ) confusion ( 586 ) ; printvariablename ( q ) ; v = mem [q + 1 ].cint % 64 ; while ( v > 0 ) { print ( 587 ) ; v = v - 2 ; } p = mem [p ].hhfield .v.RH ; } lab10: ; } void #ifdef HAVE_PROTOTYPES zprintdp ( smallnumber t , halfword p , smallnumber verbosity ) #else zprintdp ( t , p , verbosity ) smallnumber t ; halfword p ; smallnumber verbosity ; #endif { halfword q ; q = mem [p ].hhfield .v.RH ; if ( ( mem [q ].hhfield .lhfield == 0 ) || ( verbosity > 0 ) ) printdependency ( p , t ) ; else print ( 760 ) ; } halfword #ifdef HAVE_PROTOTYPES stashcurexp ( void ) #else stashcurexp ( ) #endif { register halfword Result; halfword p ; switch ( curtype ) {case 3 : case 5 : case 7 : case 12 : case 10 : case 13 : case 14 : case 17 : case 18 : case 19 : p = curexp ; break ; default: { p = getnode ( 2 ) ; mem [p ].hhfield .b1 = 11 ; mem [p ].hhfield .b0 = curtype ; mem [p + 1 ].cint = curexp ; } break ; } curtype = 1 ; mem [p ].hhfield .v.RH = 1 ; Result = p ; return Result ; } void #ifdef HAVE_PROTOTYPES zunstashcurexp ( halfword p ) #else zunstashcurexp ( p ) halfword p ; #endif { curtype = mem [p ].hhfield .b0 ; switch ( curtype ) {case 3 : case 5 : case 7 : case 12 : case 10 : case 13 : case 14 : case 17 : case 18 : case 19 : curexp = p ; break ; default: { curexp = mem [p + 1 ].cint ; freenode ( p , 2 ) ; } break ; } } void #ifdef HAVE_PROTOTYPES zprintexp ( halfword p , smallnumber verbosity ) #else zprintexp ( p , verbosity ) halfword p ; smallnumber verbosity ; #endif { boolean restorecurexp ; smallnumber t ; integer v ; halfword q ; if ( p != 0 ) restorecurexp = false ; else { p = stashcurexp () ; restorecurexp = true ; } t = mem [p ].hhfield .b0 ; if ( t < 17 ) v = mem [p + 1 ].cint ; else if ( t < 19 ) v = mem [p + 1 ].hhfield .v.RH ; switch ( t ) {case 1 : print ( 322 ) ; break ; case 2 : if ( v == 30 ) print ( 346 ) ; else print ( 347 ) ; break ; case 3 : case 5 : case 7 : case 12 : case 10 : case 15 : { printtype ( t ) ; if ( v != 0 ) { printchar ( 32 ) ; while ( ( mem [v ].hhfield .b1 == 11 ) && ( v != p ) ) v = mem [v + 1 ].cint ; printvariablename ( v ) ; } } break ; case 4 : { printchar ( 34 ) ; print ( v ) ; printchar ( 34 ) ; } break ; case 6 : case 8 : case 9 : case 11 : if ( verbosity <= 1 ) printtype ( t ) ; else { if ( selector == 3 ) if ( internal [13 ]<= 0 ) { selector = 1 ; printtype ( t ) ; print ( 758 ) ; selector = 3 ; } switch ( t ) {case 6 : printpen ( v , 283 , false ) ; break ; case 8 : printpath ( v , 759 , false ) ; break ; case 9 : printpath ( v , 283 , false ) ; break ; case 11 : { curedges = v ; printedges ( 283 , false , 0 , 0 ) ; } break ; } } break ; case 13 : case 14 : if ( v == 0 ) printtype ( t ) ; else { printchar ( 40 ) ; q = v + bignodesize [t ]; do { if ( mem [v ].hhfield .b0 == 16 ) printscaled ( mem [v + 1 ].cint ) ; else if ( mem [v ].hhfield .b0 == 19 ) printvariablename ( v ) ; else printdp ( mem [v ].hhfield .b0 , mem [v + 1 ].hhfield .v.RH , verbosity ) ; v = v + 2 ; if ( v != q ) printchar ( 44 ) ; } while ( ! ( v == q ) ) ; printchar ( 41 ) ; } break ; case 16 : printscaled ( v ) ; break ; case 17 : case 18 : printdp ( t , v , verbosity ) ; break ; case 19 : printvariablename ( p ) ; break ; default: confusion ( 757 ) ; break ; } if ( restorecurexp ) unstashcurexp ( p ) ; } void #ifdef HAVE_PROTOTYPES zdisperr ( halfword p , strnumber s ) #else zdisperr ( p , s ) halfword p ; strnumber s ; #endif { if ( interaction == 3 ) ; printnl ( 761 ) ; printexp ( p , 1 ) ; if ( s != 283 ) { printnl ( 261 ) ; print ( s ) ; } } halfword #ifdef HAVE_PROTOTYPES zpplusfq ( halfword p , integer f , halfword q , smallnumber t , smallnumber tt ) #else zpplusfq ( p , f , q , t , tt ) halfword p ; integer f ; halfword q ; smallnumber t ; smallnumber tt ; #endif { /* 30 */ register halfword Result; halfword pp, qq ; halfword r, s ; integer threshold ; integer v ; if ( t == 17 ) threshold = 2685 ; else threshold = 8 ; r = memtop - 1 ; pp = mem [p ].hhfield .lhfield ; qq = mem [q ].hhfield .lhfield ; while ( true ) if ( pp == qq ) if ( pp == 0 ) goto lab30 ; else { if ( tt == 17 ) v = mem [p + 1 ].cint + takefraction ( f , mem [q + 1 ].cint ) ; else v = mem [p + 1 ].cint + takescaled ( f , mem [q + 1 ].cint ) ; mem [p + 1 ].cint = v ; s = p ; p = mem [p ].hhfield .v.RH ; if ( abs ( v ) < threshold ) freenode ( s , 2 ) ; else { if ( abs ( v ) >= 626349397L ) if ( watchcoefs ) { mem [qq ].hhfield .b0 = 0 ; fixneeded = true ; } mem [r ].hhfield .v.RH = s ; r = s ; } pp = mem [p ].hhfield .lhfield ; q = mem [q ].hhfield .v.RH ; qq = mem [q ].hhfield .lhfield ; } else if ( mem [pp + 1 ].cint < mem [qq + 1 ].cint ) { if ( tt == 17 ) v = takefraction ( f , mem [q + 1 ].cint ) ; else v = takescaled ( f , mem [q + 1 ].cint ) ; if ( abs ( v ) > halfp ( threshold ) ) { s = getnode ( 2 ) ; mem [s ].hhfield .lhfield = qq ; mem [s + 1 ].cint = v ; if ( abs ( v ) >= 626349397L ) if ( watchcoefs ) { mem [qq ].hhfield .b0 = 0 ; fixneeded = true ; } mem [r ].hhfield .v.RH = s ; r = s ; } q = mem [q ].hhfield .v.RH ; qq = mem [q ].hhfield .lhfield ; } else { mem [r ].hhfield .v.RH = p ; r = p ; p = mem [p ].hhfield .v.RH ; pp = mem [p ].hhfield .lhfield ; } lab30: if ( t == 17 ) mem [p + 1 ].cint = slowadd ( mem [p + 1 ].cint , takefraction ( mem [q + 1 ].cint , f ) ) ; else mem [p + 1 ].cint = slowadd ( mem [p + 1 ].cint , takescaled ( mem [q + 1 ].cint , f ) ) ; mem [r ].hhfield .v.RH = p ; depfinal = p ; Result = mem [memtop - 1 ].hhfield .v.RH ; return Result ; } halfword #ifdef HAVE_PROTOTYPES zpoverv ( halfword p , scaled v , smallnumber t0 , smallnumber t1 ) #else zpoverv ( p , v , t0 , t1 ) halfword p ; scaled v ; smallnumber t0 ; smallnumber t1 ; #endif { register halfword Result; halfword r, s ; integer w ; integer threshold ; boolean scalingdown ; if ( t0 != t1 ) scalingdown = true ; else scalingdown = false ; if ( t1 == 17 ) threshold = 1342 ; else threshold = 4 ; r = memtop - 1 ; while ( mem [p ].hhfield .lhfield != 0 ) { if ( scalingdown ) if ( abs ( v ) < 524288L ) w = makescaled ( mem [p + 1 ].cint , v * 4096 ) ; else w = makescaled ( roundfraction ( mem [p + 1 ].cint ) , v ) ; else w = makescaled ( mem [p + 1 ].cint , v ) ; if ( abs ( w ) <= threshold ) { s = mem [p ].hhfield .v.RH ; freenode ( p , 2 ) ; p = s ; } else { if ( abs ( w ) >= 626349397L ) { fixneeded = true ; mem [mem [p ].hhfield .lhfield ].hhfield .b0 = 0 ; } mem [r ].hhfield .v.RH = p ; r = p ; mem [p + 1 ].cint = w ; p = mem [p ].hhfield .v.RH ; } } mem [r ].hhfield .v.RH = p ; mem [p + 1 ].cint = makescaled ( mem [p + 1 ].cint , v ) ; Result = mem [memtop - 1 ].hhfield .v.RH ; return Result ; } void #ifdef HAVE_PROTOTYPES zvaltoobig ( scaled x ) #else zvaltoobig ( x ) scaled x ; #endif { if ( internal [40 ]> 0 ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 588 ) ; } printscaled ( x ) ; printchar ( 41 ) ; { helpptr = 4 ; helpline [3 ]= 589 ; helpline [2 ]= 590 ; helpline [1 ]= 591 ; helpline [0 ]= 592 ; } error () ; } } void #ifdef HAVE_PROTOTYPES zmakeknown ( halfword p , halfword q ) #else zmakeknown ( p , q ) halfword p ; halfword q ; #endif { char t ; mem [mem [q ].hhfield .v.RH + 1 ].hhfield .lhfield = mem [p + 1 ] .hhfield .lhfield ; mem [mem [p + 1 ].hhfield .lhfield ].hhfield .v.RH = mem [q ].hhfield .v.RH ; t = mem [p ].hhfield .b0 ; mem [p ].hhfield .b0 = 16 ; mem [p + 1 ].cint = mem [q + 1 ].cint ; freenode ( q , 2 ) ; if ( abs ( mem [p + 1 ].cint ) >= 268435456L ) valtoobig ( mem [p + 1 ].cint ) ; if ( internal [2 ]> 0 ) if ( interesting ( p ) ) { begindiagnostic () ; printnl ( 593 ) ; printvariablename ( p ) ; printchar ( 61 ) ; printscaled ( mem [p + 1 ].cint ) ; enddiagnostic ( false ) ; } if ( curexp == p ) if ( curtype == t ) { curtype = 16 ; curexp = mem [p + 1 ].cint ; freenode ( p , 2 ) ; } } void #ifdef HAVE_PROTOTYPES fixdependencies ( void ) #else fixdependencies ( ) #endif { /* 30 */ halfword p, q, r, s, t ; halfword x ; r = mem [13 ].hhfield .v.RH ; s = 0 ; while ( r != 13 ) { t = r ; r = t + 1 ; while ( true ) { q = mem [r ].hhfield .v.RH ; x = mem [q ].hhfield .lhfield ; if ( x == 0 ) goto lab30 ; if ( mem [x ].hhfield .b0 <= 1 ) { if ( mem [x ].hhfield .b0 < 1 ) { p = getavail () ; mem [p ].hhfield .v.RH = s ; s = p ; mem [s ].hhfield .lhfield = x ; mem [x ].hhfield .b0 = 1 ; } mem [q + 1 ].cint = mem [q + 1 ].cint / 4 ; if ( mem [q + 1 ].cint == 0 ) { mem [r ].hhfield .v.RH = mem [q ].hhfield .v.RH ; freenode ( q , 2 ) ; q = r ; } } r = q ; } lab30: ; r = mem [q ].hhfield .v.RH ; if ( q == mem [t + 1 ].hhfield .v.RH ) makeknown ( t , q ) ; } while ( s != 0 ) { p = mem [s ].hhfield .v.RH ; x = mem [s ].hhfield .lhfield ; { mem [s ].hhfield .v.RH = avail ; avail = s ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ } s = p ; mem [x ].hhfield .b0 = 19 ; mem [x + 1 ].cint = mem [x + 1 ].cint + 2 ; } fixneeded = false ; } void #ifdef HAVE_PROTOTYPES ztossknotlist ( halfword p ) #else ztossknotlist ( p ) halfword p ; #endif { halfword q ; halfword r ; q = p ; do { r = mem [q ].hhfield .v.RH ; freenode ( q , 7 ) ; q = r ; } while ( ! ( q == p ) ) ; } void #ifdef HAVE_PROTOTYPES ztossedges ( halfword h ) #else ztossedges ( h ) halfword h ; #endif { halfword p, q ; q = mem [h ].hhfield .v.RH ; while ( q != h ) { flushlist ( mem [q + 1 ].hhfield .v.RH ) ; if ( mem [q + 1 ].hhfield .lhfield > 1 ) flushlist ( mem [q + 1 ].hhfield .lhfield ) ; p = q ; q = mem [q ].hhfield .v.RH ; freenode ( p , 2 ) ; } freenode ( h , 6 ) ; } void #ifdef HAVE_PROTOTYPES ztosspen ( halfword p ) #else ztosspen ( p ) halfword p ; #endif { char k ; halfword w, ww ; if ( p != 3 ) { {register integer for_end; k = 1 ;for_end = 8 ; if ( k <= for_end) do { w = mem [p + k ].hhfield .v.RH ; do { ww = mem [w ].hhfield .v.RH ; freenode ( w , 3 ) ; w = ww ; } while ( ! ( w == mem [p + k ].hhfield .v.RH ) ) ; } while ( k++ < for_end ) ;} freenode ( p , 10 ) ; } } void #ifdef HAVE_PROTOTYPES zringdelete ( halfword p ) #else zringdelete ( p ) halfword p ; #endif { halfword q ; q = mem [p + 1 ].cint ; if ( q != 0 ) if ( q != p ) { while ( mem [q + 1 ].cint != p ) q = mem [q + 1 ].cint ; mem [q + 1 ].cint = mem [p + 1 ].cint ; } } void #ifdef HAVE_PROTOTYPES zrecyclevalue ( halfword p ) #else zrecyclevalue ( p ) halfword p ; #endif { /* 30 */ smallnumber t ; integer v ; integer vv ; halfword q, r, s, pp ; t = mem [p ].hhfield .b0 ; if ( t < 17 ) v = mem [p + 1 ].cint ; switch ( t ) {case 0 : case 1 : case 2 : case 16 : case 15 : ; break ; case 3 : case 5 : case 7 : case 12 : case 10 : ringdelete ( p ) ; break ; case 4 : { if ( strref [v ]< 127 ) if ( strref [v ]> 1 ) decr ( strref [v ]) ; else flushstring ( v ) ; } break ; case 6 : if ( mem [v ].hhfield .lhfield == 0 ) tosspen ( v ) ; else decr ( mem [v ].hhfield .lhfield ) ; break ; case 9 : case 8 : tossknotlist ( v ) ; break ; case 11 : tossedges ( v ) ; break ; case 14 : case 13 : if ( v != 0 ) { q = v + bignodesize [t ]; do { q = q - 2 ; recyclevalue ( q ) ; } while ( ! ( q == v ) ) ; freenode ( v , bignodesize [t ]) ; } break ; case 17 : case 18 : { q = mem [p + 1 ].hhfield .v.RH ; while ( mem [q ].hhfield .lhfield != 0 ) q = mem [q ].hhfield .v.RH ; mem [mem [p + 1 ].hhfield .lhfield ].hhfield .v.RH = mem [q ] .hhfield .v.RH ; mem [mem [q ].hhfield .v.RH + 1 ].hhfield .lhfield = mem [p + 1 ] .hhfield .lhfield ; mem [q ].hhfield .v.RH = 0 ; flushnodelist ( mem [p + 1 ].hhfield .v.RH ) ; } break ; case 19 : { maxc [17 ]= 0 ; maxc [18 ]= 0 ; maxlink [17 ]= 0 ; maxlink [18 ]= 0 ; q = mem [13 ].hhfield .v.RH ; while ( q != 13 ) { s = q + 1 ; while ( true ) { r = mem [s ].hhfield .v.RH ; if ( mem [r ].hhfield .lhfield == 0 ) goto lab30 ; if ( mem [r ].hhfield .lhfield != p ) s = r ; else { t = mem [q ].hhfield .b0 ; mem [s ].hhfield .v.RH = mem [r ].hhfield .v.RH ; mem [r ].hhfield .lhfield = q ; if ( abs ( mem [r + 1 ].cint ) > maxc [t ]) { if ( maxc [t ]> 0 ) { mem [maxptr [t ]].hhfield .v.RH = maxlink [t ]; maxlink [t ]= maxptr [t ]; } maxc [t ]= abs ( mem [r + 1 ].cint ) ; maxptr [t ]= r ; } else { mem [r ].hhfield .v.RH = maxlink [t ]; maxlink [t ]= r ; } } } lab30: q = mem [r ].hhfield .v.RH ; } if ( ( maxc [17 ]> 0 ) || ( maxc [18 ]> 0 ) ) { if ( ( maxc [17 ]/ 4096 >= maxc [18 ]) ) t = 17 ; else t = 18 ; s = maxptr [t ]; pp = mem [s ].hhfield .lhfield ; v = mem [s + 1 ].cint ; if ( t == 17 ) mem [s + 1 ].cint = -268435456L ; else mem [s + 1 ].cint = -65536L ; r = mem [pp + 1 ].hhfield .v.RH ; mem [s ].hhfield .v.RH = r ; while ( mem [r ].hhfield .lhfield != 0 ) r = mem [r ].hhfield .v.RH ; q = mem [r ].hhfield .v.RH ; mem [r ].hhfield .v.RH = 0 ; mem [q + 1 ].hhfield .lhfield = mem [pp + 1 ].hhfield .lhfield ; mem [mem [pp + 1 ].hhfield .lhfield ].hhfield .v.RH = q ; { mem [pp ].hhfield .b0 = 19 ; serialno = serialno + 64 ; mem [pp + 1 ].cint = serialno ; } if ( curexp == pp ) if ( curtype == t ) curtype = 19 ; if ( internal [2 ]> 0 ) if ( interesting ( p ) ) { begindiagnostic () ; printnl ( 763 ) ; if ( v > 0 ) printchar ( 45 ) ; if ( t == 17 ) vv = roundfraction ( maxc [17 ]) ; else vv = maxc [18 ]; if ( vv != 65536L ) printscaled ( vv ) ; printvariablename ( p ) ; while ( mem [p + 1 ].cint % 64 > 0 ) { print ( 587 ) ; mem [p + 1 ].cint = mem [p + 1 ].cint - 2 ; } if ( t == 17 ) printchar ( 61 ) ; else print ( 764 ) ; printdependency ( s , t ) ; enddiagnostic ( false ) ; } t = 35 - t ; if ( maxc [t ]> 0 ) { mem [maxptr [t ]].hhfield .v.RH = maxlink [t ]; maxlink [t ]= maxptr [t ]; } if ( t != 17 ) {register integer for_end; t = 17 ;for_end = 18 ; if ( t <= for_end) do { r = maxlink [t ]; while ( r != 0 ) { q = mem [r ].hhfield .lhfield ; mem [q + 1 ].hhfield .v.RH = pplusfq ( mem [q + 1 ].hhfield .v.RH , makefraction ( mem [r + 1 ].cint , - (integer) v ) , s , t , 17 ) ; if ( mem [q + 1 ].hhfield .v.RH == depfinal ) makeknown ( q , depfinal ) ; q = r ; r = mem [r ].hhfield .v.RH ; freenode ( q , 2 ) ; } } while ( t++ < for_end ) ;} else { register integer for_end; t = 17 ;for_end = 18 ; if ( t <= for_end) do { r = maxlink [t ]; while ( r != 0 ) { q = mem [r ].hhfield .lhfield ; if ( t == 17 ) { if ( curexp == q ) if ( curtype == 17 ) curtype = 18 ; mem [q + 1 ].hhfield .v.RH = poverv ( mem [q + 1 ].hhfield .v.RH , 65536L , 17 , 18 ) ; mem [q ].hhfield .b0 = 18 ; mem [r + 1 ].cint = roundfraction ( mem [r + 1 ].cint ) ; } mem [q + 1 ].hhfield .v.RH = pplusfq ( mem [q + 1 ].hhfield .v.RH , makescaled ( mem [r + 1 ].cint , - (integer) v ) , s , 18 , 18 ) ; if ( mem [q + 1 ].hhfield .v.RH == depfinal ) makeknown ( q , depfinal ) ; q = r ; r = mem [r ].hhfield .v.RH ; freenode ( q , 2 ) ; } } while ( t++ < for_end ) ;} flushnodelist ( s ) ; if ( fixneeded ) fixdependencies () ; { if ( aritherror ) cleararith () ; } } } break ; case 20 : case 21 : confusion ( 762 ) ; break ; case 22 : case 23 : deletemacref ( mem [p + 1 ].cint ) ; break ; } mem [p ].hhfield .b0 = 0 ; } void #ifdef HAVE_PROTOTYPES zflushcurexp ( scaled v ) #else zflushcurexp ( v ) scaled v ; #endif { switch ( curtype ) {case 3 : case 5 : case 7 : case 12 : case 10 : case 13 : case 14 : case 17 : case 18 : case 19 : { recyclevalue ( curexp ) ; freenode ( curexp , 2 ) ; } break ; case 6 : if ( mem [curexp ].hhfield .lhfield == 0 ) tosspen ( curexp ) ; else decr ( mem [curexp ].hhfield .lhfield ) ; break ; case 4 : { if ( strref [curexp ]< 127 ) if ( strref [curexp ]> 1 ) decr ( strref [curexp ]) ; else flushstring ( curexp ) ; } break ; case 8 : case 9 : tossknotlist ( curexp ) ; break ; case 11 : tossedges ( curexp ) ; break ; default: ; break ; } curtype = 16 ; curexp = v ; } void #ifdef HAVE_PROTOTYPES zflusherror ( scaled v ) #else zflusherror ( v ) scaled v ; #endif { error () ; flushcurexp ( v ) ; } void #ifdef HAVE_PROTOTYPES putgeterror ( void ) #else putgeterror ( ) #endif { backerror () ; getxnext () ; } void #ifdef HAVE_PROTOTYPES zputgetflusherror ( scaled v ) #else zputgetflusherror ( v ) scaled v ; #endif { putgeterror () ; flushcurexp ( v ) ; } void #ifdef HAVE_PROTOTYPES zflushbelowvariable ( halfword p ) #else zflushbelowvariable ( p ) halfword p ; #endif { halfword q, r ; if ( mem [p ].hhfield .b0 != 21 ) recyclevalue ( p ) ; else { q = mem [p + 1 ].hhfield .v.RH ; while ( mem [q ].hhfield .b1 == 3 ) { flushbelowvariable ( q ) ; r = q ; q = mem [q ].hhfield .v.RH ; freenode ( r , 3 ) ; } r = mem [p + 1 ].hhfield .lhfield ; q = mem [r ].hhfield .v.RH ; recyclevalue ( r ) ; if ( mem [p ].hhfield .b1 <= 1 ) freenode ( r , 2 ) ; else freenode ( r , 3 ) ; do { flushbelowvariable ( q ) ; r = q ; q = mem [q ].hhfield .v.RH ; freenode ( r , 3 ) ; } while ( ! ( q == 17 ) ) ; mem [p ].hhfield .b0 = 0 ; } } void #ifdef HAVE_PROTOTYPES zflushvariable ( halfword p , halfword t , boolean discardsuffixes ) #else zflushvariable ( p , t , discardsuffixes ) halfword p ; halfword t ; boolean discardsuffixes ; #endif { /* 10 */ halfword q, r ; halfword n ; while ( t != 0 ) { if ( mem [p ].hhfield .b0 != 21 ) goto lab10 ; n = mem [t ].hhfield .lhfield ; t = mem [t ].hhfield .v.RH ; if ( n == 0 ) { r = p + 1 ; q = mem [r ].hhfield .v.RH ; while ( mem [q ].hhfield .b1 == 3 ) { flushvariable ( q , t , discardsuffixes ) ; if ( t == 0 ) if ( mem [q ].hhfield .b0 == 21 ) r = q ; else { mem [r ].hhfield .v.RH = mem [q ].hhfield .v.RH ; freenode ( q , 3 ) ; } else r = q ; q = mem [r ].hhfield .v.RH ; } } p = mem [p + 1 ].hhfield .lhfield ; do { r = p ; p = mem [p ].hhfield .v.RH ; } while ( ! ( mem [p + 2 ].hhfield .lhfield >= n ) ) ; if ( mem [p + 2 ].hhfield .lhfield != n ) goto lab10 ; } if ( discardsuffixes ) flushbelowvariable ( p ) ; else { if ( mem [p ].hhfield .b0 == 21 ) p = mem [p + 1 ].hhfield .lhfield ; recyclevalue ( p ) ; } lab10: ; } smallnumber #ifdef HAVE_PROTOTYPES zundtype ( halfword p ) #else zundtype ( p ) halfword p ; #endif { register smallnumber Result; switch ( mem [p ].hhfield .b0 ) {case 0 : case 1 : Result = 0 ; break ; case 2 : case 3 : Result = 3 ; break ; case 4 : case 5 : Result = 5 ; break ; case 6 : case 7 : case 8 : Result = 7 ; break ; case 9 : case 10 : Result = 10 ; break ; case 11 : case 12 : Result = 12 ; break ; case 13 : case 14 : case 15 : Result = mem [p ].hhfield .b0 ; break ; case 16 : case 17 : case 18 : case 19 : Result = 15 ; break ; } return Result ; } void #ifdef HAVE_PROTOTYPES zclearsymbol ( halfword p , boolean saving ) #else zclearsymbol ( p , saving ) halfword p ; boolean saving ; #endif { halfword q ; q = eqtb [p ].v.RH ; switch ( eqtb [p ].lhfield % 86 ) {case 10 : case 53 : case 44 : case 49 : if ( ! saving ) deletemacref ( q ) ; break ; case 41 : if ( q != 0 ) if ( saving ) mem [q ].hhfield .b1 = 1 ; else { flushbelowvariable ( q ) ; freenode ( q , 2 ) ; } break ; default: ; break ; } eqtb [p ]= eqtb [9769 ]; } void #ifdef HAVE_PROTOTYPES zsavevariable ( halfword q ) #else zsavevariable ( q ) halfword q ; #endif { halfword p ; if ( saveptr != 0 ) { p = getnode ( 2 ) ; mem [p ].hhfield .lhfield = q ; mem [p ].hhfield .v.RH = saveptr ; mem [p + 1 ].hhfield = eqtb [q ]; saveptr = p ; } clearsymbol ( q , ( saveptr != 0 ) ) ; } void #ifdef HAVE_PROTOTYPES zsaveinternal ( halfword q ) #else zsaveinternal ( q ) halfword q ; #endif { halfword p ; if ( saveptr != 0 ) { p = getnode ( 2 ) ; mem [p ].hhfield .lhfield = 9769 + q ; mem [p ].hhfield .v.RH = saveptr ; mem [p + 1 ].cint = internal [q ]; saveptr = p ; } } void #ifdef HAVE_PROTOTYPES unsave ( void ) #else unsave ( ) #endif { halfword q ; halfword p ; while ( mem [saveptr ].hhfield .lhfield != 0 ) { q = mem [saveptr ].hhfield .lhfield ; if ( q > 9769 ) { if ( internal [8 ]> 0 ) { begindiagnostic () ; printnl ( 515 ) ; print ( intname [q - ( 9769 ) ]) ; printchar ( 61 ) ; printscaled ( mem [saveptr + 1 ].cint ) ; printchar ( 125 ) ; enddiagnostic ( false ) ; } internal [q - ( 9769 ) ]= mem [saveptr + 1 ].cint ; } else { if ( internal [8 ]> 0 ) { begindiagnostic () ; printnl ( 515 ) ; print ( hash [q ].v.RH ) ; printchar ( 125 ) ; enddiagnostic ( false ) ; } clearsymbol ( q , false ) ; eqtb [q ]= mem [saveptr + 1 ].hhfield ; if ( eqtb [q ].lhfield % 86 == 41 ) { p = eqtb [q ].v.RH ; if ( p != 0 ) mem [p ].hhfield .b1 = 0 ; } } p = mem [saveptr ].hhfield .v.RH ; freenode ( saveptr , 2 ) ; saveptr = p ; } p = mem [saveptr ].hhfield .v.RH ; { mem [saveptr ].hhfield .v.RH = avail ; avail = saveptr ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ } saveptr = p ; } halfword #ifdef HAVE_PROTOTYPES zcopyknot ( halfword p ) #else zcopyknot ( p ) halfword p ; #endif { register halfword Result; halfword q ; char k ; q = getnode ( 7 ) ; {register integer for_end; k = 0 ;for_end = 6 ; if ( k <= for_end) do mem [q + k ]= mem [p + k ]; while ( k++ < for_end ) ;} Result = q ; return Result ; } halfword #ifdef HAVE_PROTOTYPES zcopypath ( halfword p ) #else zcopypath ( p ) halfword p ; #endif { /* 10 */ register halfword Result; halfword q, pp, qq ; q = getnode ( 7 ) ; qq = q ; pp = p ; while ( true ) { mem [qq ].hhfield .b0 = mem [pp ].hhfield .b0 ; mem [qq ].hhfield .b1 = mem [pp ].hhfield .b1 ; mem [qq + 1 ].cint = mem [pp + 1 ].cint ; mem [qq + 2 ].cint = mem [pp + 2 ].cint ; mem [qq + 3 ].cint = mem [pp + 3 ].cint ; mem [qq + 4 ].cint = mem [pp + 4 ].cint ; mem [qq + 5 ].cint = mem [pp + 5 ].cint ; mem [qq + 6 ].cint = mem [pp + 6 ].cint ; if ( mem [pp ].hhfield .v.RH == p ) { mem [qq ].hhfield .v.RH = q ; Result = q ; goto lab10 ; } mem [qq ].hhfield .v.RH = getnode ( 7 ) ; qq = mem [qq ].hhfield .v.RH ; pp = mem [pp ].hhfield .v.RH ; } lab10: ; return Result ; } halfword #ifdef HAVE_PROTOTYPES zhtapypoc ( halfword p ) #else zhtapypoc ( p ) halfword p ; #endif { /* 10 */ register halfword Result; halfword q, pp, qq, rr ; q = getnode ( 7 ) ; qq = q ; pp = p ; while ( true ) { mem [qq ].hhfield .b1 = mem [pp ].hhfield .b0 ; mem [qq ].hhfield .b0 = mem [pp ].hhfield .b1 ; mem [qq + 1 ].cint = mem [pp + 1 ].cint ; mem [qq + 2 ].cint = mem [pp + 2 ].cint ; mem [qq + 5 ].cint = mem [pp + 3 ].cint ; mem [qq + 6 ].cint = mem [pp + 4 ].cint ; mem [qq + 3 ].cint = mem [pp + 5 ].cint ; mem [qq + 4 ].cint = mem [pp + 6 ].cint ; if ( mem [pp ].hhfield .v.RH == p ) { mem [q ].hhfield .v.RH = qq ; pathtail = pp ; Result = q ; goto lab10 ; } rr = getnode ( 7 ) ; mem [rr ].hhfield .v.RH = qq ; qq = rr ; pp = mem [pp ].hhfield .v.RH ; } lab10: ; return Result ; } fraction #ifdef HAVE_PROTOTYPES zcurlratio ( scaled gamma , scaled atension , scaled btension ) #else zcurlratio ( gamma , atension , btension ) scaled gamma ; scaled atension ; scaled btension ; #endif { register fraction Result; fraction alpha, beta, num, denom, ff ; alpha = makefraction ( 65536L , atension ) ; beta = makefraction ( 65536L , btension ) ; if ( alpha <= beta ) { ff = makefraction ( alpha , beta ) ; ff = takefraction ( ff , ff ) ; gamma = takefraction ( gamma , ff ) ; beta = beta / 4096 ; denom = takefraction ( gamma , alpha ) + 196608L - beta ; num = takefraction ( gamma , 805306368L - alpha ) + beta ; } else { ff = makefraction ( beta , alpha ) ; ff = takefraction ( ff , ff ) ; beta = takefraction ( beta , ff ) / 4096 ; denom = takefraction ( gamma , alpha ) + ( ff / 1365 ) - beta ; num = takefraction ( gamma , 805306368L - alpha ) + beta ; } if ( num >= denom + denom + denom + denom ) Result = 1073741824L ; else Result = makefraction ( num , denom ) ; return Result ; } void #ifdef HAVE_PROTOTYPES zsetcontrols ( halfword p , halfword q , integer k ) #else zsetcontrols ( p , q , k ) halfword p ; halfword q ; integer k ; #endif { fraction rr, ss ; scaled lt, rt ; fraction sine ; lt = abs ( mem [q + 4 ].cint ) ; rt = abs ( mem [p + 6 ].cint ) ; rr = velocity ( st , ct , sf , cf , rt ) ; ss = velocity ( sf , cf , st , ct , lt ) ; if ( ( mem [p + 6 ].cint < 0 ) || ( mem [q + 4 ].cint < 0 ) ) if ( ( ( st >= 0 ) && ( sf >= 0 ) ) || ( ( st <= 0 ) && ( sf <= 0 ) ) ) { sine = takefraction ( abs ( st ) , cf ) + takefraction ( abs ( sf ) , ct ) ; if ( sine > 0 ) { sine = takefraction ( sine , 268500992L ) ; if ( mem [p + 6 ].cint < 0 ) if ( abvscd ( abs ( sf ) , 268435456L , rr , sine ) < 0 ) rr = makefraction ( abs ( sf ) , sine ) ; if ( mem [q + 4 ].cint < 0 ) if ( abvscd ( abs ( st ) , 268435456L , ss , sine ) < 0 ) ss = makefraction ( abs ( st ) , sine ) ; } } mem [p + 5 ].cint = mem [p + 1 ].cint + takefraction ( takefraction ( deltax [k ], ct ) - takefraction ( deltay [k ], st ) , rr ) ; mem [p + 6 ].cint = mem [p + 2 ].cint + takefraction ( takefraction ( deltay [k ], ct ) + takefraction ( deltax [k ], st ) , rr ) ; mem [q + 3 ].cint = mem [q + 1 ].cint - takefraction ( takefraction ( deltax [k ], cf ) + takefraction ( deltay [k ], sf ) , ss ) ; mem [q + 4 ].cint = mem [q + 2 ].cint - takefraction ( takefraction ( deltay [k ], cf ) - takefraction ( deltax [k ], sf ) , ss ) ; mem [p ].hhfield .b1 = 1 ; mem [q ].hhfield .b0 = 1 ; } void #ifdef HAVE_PROTOTYPES zsolvechoices ( halfword p , halfword q , halfword n ) #else zsolvechoices ( p , q , n ) halfword p ; halfword q ; halfword n ; #endif { /* 40 10 */ integer k ; halfword r, s, t ; fraction aa, bb, cc, ff, acc ; scaled dd, ee ; scaled lt, rt ; k = 0 ; s = p ; while ( true ) { t = mem [s ].hhfield .v.RH ; if ( k == 0 ) switch ( mem [s ].hhfield .b1 ) {case 2 : if ( mem [t ].hhfield .b0 == 2 ) { aa = narg ( deltax [0 ], deltay [0 ]) ; nsincos ( mem [p + 5 ].cint - aa ) ; ct = ncos ; st = nsin ; nsincos ( mem [q + 3 ].cint - aa ) ; cf = ncos ; sf = - (integer) nsin ; setcontrols ( p , q , 0 ) ; goto lab10 ; } else { vv [0 ]= mem [s + 5 ].cint - narg ( deltax [0 ], deltay [0 ]) ; if ( abs ( vv [0 ]) > 188743680L ) if ( vv [0 ]> 0 ) vv [0 ]= vv [0 ]- 377487360L ; else vv [0 ]= vv [0 ]+ 377487360L ; uu [0 ]= 0 ; ww [0 ]= 0 ; } break ; case 3 : if ( mem [t ].hhfield .b0 == 3 ) { mem [p ].hhfield .b1 = 1 ; mem [q ].hhfield .b0 = 1 ; lt = abs ( mem [q + 4 ].cint ) ; rt = abs ( mem [p + 6 ].cint ) ; if ( rt == 65536L ) { if ( deltax [0 ]>= 0 ) mem [p + 5 ].cint = mem [p + 1 ].cint + ( ( deltax [0 ]+ 1 ) / 3 ) ; else mem [p + 5 ].cint = mem [p + 1 ].cint + ( ( deltax [0 ]- 1 ) / 3 ) ; if ( deltay [0 ]>= 0 ) mem [p + 6 ].cint = mem [p + 2 ].cint + ( ( deltay [0 ]+ 1 ) / 3 ) ; else mem [p + 6 ].cint = mem [p + 2 ].cint + ( ( deltay [0 ]- 1 ) / 3 ) ; } else { ff = makefraction ( 65536L , 3 * rt ) ; mem [p + 5 ].cint = mem [p + 1 ].cint + takefraction ( deltax [ 0 ], ff ) ; mem [p + 6 ].cint = mem [p + 2 ].cint + takefraction ( deltay [ 0 ], ff ) ; } if ( lt == 65536L ) { if ( deltax [0 ]>= 0 ) mem [q + 3 ].cint = mem [q + 1 ].cint - ( ( deltax [0 ]+ 1 ) / 3 ) ; else mem [q + 3 ].cint = mem [q + 1 ].cint - ( ( deltax [0 ]- 1 ) / 3 ) ; if ( deltay [0 ]>= 0 ) mem [q + 4 ].cint = mem [q + 2 ].cint - ( ( deltay [0 ]+ 1 ) / 3 ) ; else mem [q + 4 ].cint = mem [q + 2 ].cint - ( ( deltay [0 ]- 1 ) / 3 ) ; } else { ff = makefraction ( 65536L , 3 * lt ) ; mem [q + 3 ].cint = mem [q + 1 ].cint - takefraction ( deltax [ 0 ], ff ) ; mem [q + 4 ].cint = mem [q + 2 ].cint - takefraction ( deltay [ 0 ], ff ) ; } goto lab10 ; } else { cc = mem [s + 5 ].cint ; lt = abs ( mem [t + 4 ].cint ) ; rt = abs ( mem [s + 6 ].cint ) ; if ( ( rt == 65536L ) && ( lt == 65536L ) ) uu [0 ]= makefraction ( cc + cc + 65536L , cc + 131072L ) ; else uu [0 ]= curlratio ( cc , rt , lt ) ; vv [0 ]= - (integer) takefraction ( psi [1 ], uu [0 ]) ; ww [0 ]= 0 ; } break ; case 4 : { uu [0 ]= 0 ; vv [0 ]= 0 ; ww [0 ]= 268435456L ; } break ; } else switch ( mem [s ].hhfield .b0 ) {case 5 : case 4 : { if ( abs ( mem [r + 6 ].cint ) == 65536L ) { aa = 134217728L ; dd = 2 * delta [k ]; } else { aa = makefraction ( 65536L , 3 * abs ( mem [r + 6 ].cint ) - 65536L ) ; dd = takefraction ( delta [k ], 805306368L - makefraction ( 65536L , abs ( mem [r + 6 ].cint ) ) ) ; } if ( abs ( mem [t + 4 ].cint ) == 65536L ) { bb = 134217728L ; ee = 2 * delta [k - 1 ]; } else { bb = makefraction ( 65536L , 3 * abs ( mem [t + 4 ].cint ) - 65536L ) ; ee = takefraction ( delta [k - 1 ], 805306368L - makefraction ( 65536L , abs ( mem [t + 4 ].cint ) ) ) ; } cc = 268435456L - takefraction ( uu [k - 1 ], aa ) ; dd = takefraction ( dd , cc ) ; lt = abs ( mem [s + 4 ].cint ) ; rt = abs ( mem [s + 6 ].cint ) ; if ( lt != rt ) if ( lt < rt ) { ff = makefraction ( lt , rt ) ; ff = takefraction ( ff , ff ) ; dd = takefraction ( dd , ff ) ; } else { ff = makefraction ( rt , lt ) ; ff = takefraction ( ff , ff ) ; ee = takefraction ( ee , ff ) ; } ff = makefraction ( ee , ee + dd ) ; uu [k ]= takefraction ( ff , bb ) ; acc = - (integer) takefraction ( psi [k + 1 ], uu [k ]) ; if ( mem [r ].hhfield .b1 == 3 ) { ww [k ]= 0 ; vv [k ]= acc - takefraction ( psi [1 ], 268435456L - ff ) ; } else { ff = makefraction ( 268435456L - ff , cc ) ; acc = acc - takefraction ( psi [k ], ff ) ; ff = takefraction ( ff , aa ) ; vv [k ]= acc - takefraction ( vv [k - 1 ], ff ) ; if ( ww [k - 1 ]== 0 ) ww [k ]= 0 ; else ww [k ]= - (integer) takefraction ( ww [k - 1 ], ff ) ; } if ( mem [s ].hhfield .b0 == 5 ) { aa = 0 ; bb = 268435456L ; do { decr ( k ) ; if ( k == 0 ) k = n ; aa = vv [k ]- takefraction ( aa , uu [k ]) ; bb = ww [k ]- takefraction ( bb , uu [k ]) ; } while ( ! ( k == n ) ) ; aa = makefraction ( aa , 268435456L - bb ) ; theta [n ]= aa ; vv [0 ]= aa ; {register integer for_end; k = 1 ;for_end = n - 1 ; if ( k <= for_end) do vv [k ]= vv [k ]+ takefraction ( aa , ww [k ]) ; while ( k++ < for_end ) ;} goto lab40 ; } } break ; case 3 : { cc = mem [s + 3 ].cint ; lt = abs ( mem [s + 4 ].cint ) ; rt = abs ( mem [r + 6 ].cint ) ; if ( ( rt == 65536L ) && ( lt == 65536L ) ) ff = makefraction ( cc + cc + 65536L , cc + 131072L ) ; else ff = curlratio ( cc , lt , rt ) ; theta [n ]= - (integer) makefraction ( takefraction ( vv [n - 1 ], ff ) , 268435456L - takefraction ( ff , uu [n - 1 ]) ) ; goto lab40 ; } break ; case 2 : { theta [n ]= mem [s + 3 ].cint - narg ( deltax [n - 1 ], deltay [ n - 1 ]) ; if ( abs ( theta [n ]) > 188743680L ) if ( theta [n ]> 0 ) theta [n ]= theta [n ]- 377487360L ; else theta [n ]= theta [n ]+ 377487360L ; goto lab40 ; } break ; } r = s ; s = t ; incr ( k ) ; } lab40: { register integer for_end; k = n - 1 ;for_end = 0 ; if ( k >= for_end) do theta [k ]= vv [k ]- takefraction ( theta [k + 1 ], uu [k ]) ; while ( k-- > for_end ) ;} s = p ; k = 0 ; do { t = mem [s ].hhfield .v.RH ; nsincos ( theta [k ]) ; st = nsin ; ct = ncos ; nsincos ( - (integer) psi [k + 1 ]- theta [k + 1 ]) ; sf = nsin ; cf = ncos ; setcontrols ( s , t , k ) ; incr ( k ) ; s = t ; } while ( ! ( k == n ) ) ; lab10: ; } void #ifdef HAVE_PROTOTYPES zmakechoices ( halfword knots ) #else zmakechoices ( knots ) halfword knots ; #endif { /* 30 */ halfword h ; halfword p, q ; integer k, n ; halfword s, t ; scaled delx, dely ; fraction sine, cosine ; { if ( aritherror ) cleararith () ; } if ( internal [4 ]> 0 ) printpath ( knots , 525 , true ) ; p = knots ; do { q = mem [p ].hhfield .v.RH ; if ( mem [p + 1 ].cint == mem [q + 1 ].cint ) if ( mem [p + 2 ].cint == mem [q + 2 ].cint ) if ( mem [p ].hhfield .b1 > 1 ) { mem [p ].hhfield .b1 = 1 ; if ( mem [p ].hhfield .b0 == 4 ) { mem [p ].hhfield .b0 = 3 ; mem [p + 3 ].cint = 65536L ; } mem [q ].hhfield .b0 = 1 ; if ( mem [q ].hhfield .b1 == 4 ) { mem [q ].hhfield .b1 = 3 ; mem [q + 5 ].cint = 65536L ; } mem [p + 5 ].cint = mem [p + 1 ].cint ; mem [q + 3 ].cint = mem [p + 1 ].cint ; mem [p + 6 ].cint = mem [p + 2 ].cint ; mem [q + 4 ].cint = mem [p + 2 ].cint ; } p = q ; } while ( ! ( p == knots ) ) ; h = knots ; while ( true ) { if ( mem [h ].hhfield .b0 != 4 ) goto lab30 ; if ( mem [h ].hhfield .b1 != 4 ) goto lab30 ; h = mem [h ].hhfield .v.RH ; if ( h == knots ) { mem [h ].hhfield .b0 = 5 ; goto lab30 ; } } lab30: ; p = h ; do { q = mem [p ].hhfield .v.RH ; if ( mem [p ].hhfield .b1 >= 2 ) { while ( ( mem [q ].hhfield .b0 == 4 ) && ( mem [q ].hhfield .b1 == 4 ) ) q = mem [q ].hhfield .v.RH ; k = 0 ; s = p ; n = pathsize ; do { t = mem [s ].hhfield .v.RH ; deltax [k ]= mem [t + 1 ].cint - mem [s + 1 ].cint ; deltay [k ]= mem [t + 2 ].cint - mem [s + 2 ].cint ; delta [k ]= pythadd ( deltax [k ], deltay [k ]) ; if ( k > 0 ) { sine = makefraction ( deltay [k - 1 ], delta [k - 1 ]) ; cosine = makefraction ( deltax [k - 1 ], delta [k - 1 ]) ; psi [k ]= narg ( takefraction ( deltax [k ], cosine ) + takefraction ( deltay [k ], sine ) , takefraction ( deltay [k ], cosine ) - takefraction ( deltax [k ], sine ) ) ; } incr ( k ) ; s = t ; if ( k == pathsize ) overflow ( 530 , pathsize ) ; if ( s == q ) n = k ; } while ( ! ( ( k >= n ) && ( mem [s ].hhfield .b0 != 5 ) ) ) ; if ( k == n ) psi [n ]= 0 ; else psi [k ]= psi [1 ]; if ( mem [q ].hhfield .b0 == 4 ) { delx = mem [q + 5 ].cint - mem [q + 1 ].cint ; dely = mem [q + 6 ].cint - mem [q + 2 ].cint ; if ( ( delx == 0 ) && ( dely == 0 ) ) { mem [q ].hhfield .b0 = 3 ; mem [q + 3 ].cint = 65536L ; } else { mem [q ].hhfield .b0 = 2 ; mem [q + 3 ].cint = narg ( delx , dely ) ; } } if ( ( mem [p ].hhfield .b1 == 4 ) && ( mem [p ].hhfield .b0 == 1 ) ) { delx = mem [p + 1 ].cint - mem [p + 3 ].cint ; dely = mem [p + 2 ].cint - mem [p + 4 ].cint ; if ( ( delx == 0 ) && ( dely == 0 ) ) { mem [p ].hhfield .b1 = 3 ; mem [p + 5 ].cint = 65536L ; } else { mem [p ].hhfield .b1 = 2 ; mem [p + 5 ].cint = narg ( delx , dely ) ; } } solvechoices ( p , q , n ) ; } p = q ; } while ( ! ( p == h ) ) ; if ( internal [4 ]> 0 ) printpath ( knots , 526 , true ) ; if ( aritherror ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 527 ) ; } { helpptr = 2 ; helpline [1 ]= 528 ; helpline [0 ]= 529 ; } putgeterror () ; aritherror = false ; } } void #ifdef HAVE_PROTOTYPES zmakemoves ( scaled xx0 , scaled xx1 , scaled xx2 , scaled xx3 , scaled yy0 , scaled yy1 , scaled yy2 , scaled yy3 , smallnumber xicorr , smallnumber etacorr ) #else zmakemoves ( xx0 , xx1 , xx2 , xx3 , yy0 , yy1 , yy2 , yy3 , xicorr , etacorr ) scaled xx0 ; scaled xx1 ; scaled xx2 ; scaled xx3 ; scaled yy0 ; scaled yy1 ; scaled yy2 ; scaled yy3 ; smallnumber xicorr ; smallnumber etacorr ; #endif { /* 22 30 10 */ integer x1, x2, x3, m, r, y1, y2, y3, n, s, l ; integer q, t, u, x2a, x3a, y2a, y3a ; if ( ( xx3 < xx0 ) || ( yy3 < yy0 ) ) confusion ( 109 ) ; l = 16 ; bisectptr = 0 ; x1 = xx1 - xx0 ; x2 = xx2 - xx1 ; x3 = xx3 - xx2 ; if ( xx0 >= xicorr ) r = ( xx0 - xicorr ) % 65536L ; else r = 65535L - ( ( - (integer) xx0 + xicorr - 1 ) % 65536L ) ; m = ( xx3 - xx0 + r ) / 65536L ; y1 = yy1 - yy0 ; y2 = yy2 - yy1 ; y3 = yy3 - yy2 ; if ( yy0 >= etacorr ) s = ( yy0 - etacorr ) % 65536L ; else s = 65535L - ( ( - (integer) yy0 + etacorr - 1 ) % 65536L ) ; n = ( yy3 - yy0 + s ) / 65536L ; if ( ( xx3 - xx0 >= 268435456L ) || ( yy3 - yy0 >= 268435456L ) ) { x1 = half ( x1 + xicorr ) ; x2 = half ( x2 + xicorr ) ; x3 = half ( x3 + xicorr ) ; r = half ( r + xicorr ) ; y1 = half ( y1 + etacorr ) ; y2 = half ( y2 + etacorr ) ; y3 = half ( y3 + etacorr ) ; s = half ( s + etacorr ) ; l = 15 ; } while ( true ) { lab22: if ( m == 0 ) while ( n > 0 ) { incr ( moveptr ) ; move [moveptr ]= 1 ; decr ( n ) ; } else if ( n == 0 ) move [moveptr ]= move [moveptr ]+ m ; else if ( m + n == 2 ) { r = twotothe [l ]- r ; s = twotothe [l ]- s ; while ( l < 30 ) { x3a = x3 ; x2a = half ( x2 + x3 + xicorr ) ; x2 = half ( x1 + x2 + xicorr ) ; x3 = half ( x2 + x2a + xicorr ) ; t = x1 + x2 + x3 ; r = r + r - xicorr ; y3a = y3 ; y2a = half ( y2 + y3 + etacorr ) ; y2 = half ( y1 + y2 + etacorr ) ; y3 = half ( y2 + y2a + etacorr ) ; u = y1 + y2 + y3 ; s = s + s - etacorr ; if ( t < r ) if ( u < s ) { x1 = x3 ; x2 = x2a ; x3 = x3a ; r = r - t ; y1 = y3 ; y2 = y2a ; y3 = y3a ; s = s - u ; } else { { incr ( moveptr ) ; move [moveptr ]= 2 ; } goto lab30 ; } else if ( u < s ) { { incr ( move [moveptr ]) ; incr ( moveptr ) ; move [moveptr ]= 1 ; } goto lab30 ; } incr ( l ) ; } r = r - xicorr ; s = s - etacorr ; if ( abvscd ( x1 + x2 + x3 , s , y1 + y2 + y3 , r ) - xicorr >= 0 ) { incr ( move [moveptr ]) ; incr ( moveptr ) ; move [moveptr ]= 1 ; } else { incr ( moveptr ) ; move [moveptr ]= 2 ; } lab30: ; } else { incr ( l ) ; bisectstack [bisectptr + 10 ]= l ; bisectstack [bisectptr + 2 ]= x3 ; bisectstack [bisectptr + 1 ]= half ( x2 + x3 + xicorr ) ; x2 = half ( x1 + x2 + xicorr ) ; x3 = half ( x2 + bisectstack [bisectptr + 1 ]+ xicorr ) ; bisectstack [bisectptr ]= x3 ; r = r + r + xicorr ; t = x1 + x2 + x3 + r ; q = t / twotothe [l ]; bisectstack [bisectptr + 3 ]= t % twotothe [l ]; bisectstack [bisectptr + 4 ]= m - q ; m = q ; bisectstack [bisectptr + 7 ]= y3 ; bisectstack [bisectptr + 6 ]= half ( y2 + y3 + etacorr ) ; y2 = half ( y1 + y2 + etacorr ) ; y3 = half ( y2 + bisectstack [bisectptr + 6 ]+ etacorr ) ; bisectstack [bisectptr + 5 ]= y3 ; s = s + s + etacorr ; u = y1 + y2 + y3 + s ; q = u / twotothe [l ]; bisectstack [bisectptr + 8 ]= u % twotothe [l ]; bisectstack [bisectptr + 9 ]= n - q ; n = q ; bisectptr = bisectptr + 11 ; goto lab22 ; } if ( bisectptr == 0 ) goto lab10 ; bisectptr = bisectptr - 11 ; x1 = bisectstack [bisectptr ]; x2 = bisectstack [bisectptr + 1 ]; x3 = bisectstack [bisectptr + 2 ]; r = bisectstack [bisectptr + 3 ]; m = bisectstack [bisectptr + 4 ]; y1 = bisectstack [bisectptr + 5 ]; y2 = bisectstack [bisectptr + 6 ]; y3 = bisectstack [bisectptr + 7 ]; s = bisectstack [bisectptr + 8 ]; n = bisectstack [bisectptr + 9 ]; l = bisectstack [bisectptr + 10 ]; } lab10: ; } void #ifdef HAVE_PROTOTYPES zsmoothmoves ( integer b , integer t ) #else zsmoothmoves ( b , t ) integer b ; integer t ; #endif { integer k ; integer a, aa, aaa ; if ( t - b >= 3 ) { k = b + 2 ; aa = move [k - 1 ]; aaa = move [k - 2 ]; do { a = move [k ]; if ( abs ( a - aa ) > 1 ) if ( a > aa ) { if ( aaa >= aa ) if ( a >= move [k + 1 ]) { incr ( move [k - 1 ]) ; move [k ]= a - 1 ; } } else { if ( aaa <= aa ) if ( a <= move [k + 1 ]) { decr ( move [k - 1 ]) ; move [k ]= a + 1 ; } } incr ( k ) ; aaa = aa ; aa = a ; } while ( ! ( k == t ) ) ; } } void #ifdef HAVE_PROTOTYPES zinitedges ( halfword h ) #else zinitedges ( h ) halfword h ; #endif { mem [h ].hhfield .lhfield = h ; mem [h ].hhfield .v.RH = h ; mem [h + 1 ].hhfield .lhfield = 8191 ; mem [h + 1 ].hhfield .v.RH = 1 ; mem [h + 2 ].hhfield .lhfield = 8191 ; mem [h + 2 ].hhfield .v.RH = 1 ; mem [h + 3 ].hhfield .lhfield = 4096 ; mem [h + 3 ].hhfield .v.RH = 0 ; mem [h + 4 ].cint = 0 ; mem [h + 5 ].hhfield .v.RH = h ; mem [h + 5 ].hhfield .lhfield = 0 ; } void #ifdef HAVE_PROTOTYPES fixoffset ( void ) #else fixoffset ( ) #endif { halfword p, q ; integer delta ; delta = 8 * ( mem [curedges + 3 ].hhfield .lhfield - 4096 ) ; mem [curedges + 3 ].hhfield .lhfield = 4096 ; q = mem [curedges ].hhfield .v.RH ; while ( q != curedges ) { p = mem [q + 1 ].hhfield .v.RH ; while ( p != memtop ) { mem [p ].hhfield .lhfield = mem [p ].hhfield .lhfield - delta ; p = mem [p ].hhfield .v.RH ; } p = mem [q + 1 ].hhfield .lhfield ; while ( p > 1 ) { mem [p ].hhfield .lhfield = mem [p ].hhfield .lhfield - delta ; p = mem [p ].hhfield .v.RH ; } q = mem [q ].hhfield .v.RH ; } } void #ifdef HAVE_PROTOTYPES zedgeprep ( integer ml , integer mr , integer nl , integer nr ) #else zedgeprep ( ml , mr , nl , nr ) integer ml ; integer mr ; integer nl ; integer nr ; #endif { halfword delta ; integer temp ; halfword p, q ; ml = ml + 4096 ; mr = mr + 4096 ; nl = nl + 4096 ; nr = nr + 4095 ; if ( ml < mem [curedges + 2 ].hhfield .lhfield ) mem [curedges + 2 ].hhfield .lhfield = ml ; if ( mr > mem [curedges + 2 ].hhfield .v.RH ) mem [curedges + 2 ].hhfield .v.RH = mr ; temp = mem [curedges + 3 ].hhfield .lhfield - 4096 ; if ( ! ( abs ( mem [curedges + 2 ].hhfield .lhfield + temp - 4096 ) < 4096 ) || ! ( abs ( mem [curedges + 2 ].hhfield .v.RH + temp - 4096 ) < 4096 ) ) fixoffset () ; if ( mem [curedges ].hhfield .v.RH == curedges ) { mem [curedges + 1 ].hhfield .lhfield = nr + 1 ; mem [curedges + 1 ].hhfield .v.RH = nr ; } if ( nl < mem [curedges + 1 ].hhfield .lhfield ) { delta = mem [curedges + 1 ].hhfield .lhfield - nl ; mem [curedges + 1 ].hhfield .lhfield = nl ; p = mem [curedges ].hhfield .v.RH ; do { q = getnode ( 2 ) ; mem [q + 1 ].hhfield .v.RH = memtop ; mem [q + 1 ].hhfield .lhfield = 1 ; mem [p ].hhfield .lhfield = q ; mem [q ].hhfield .v.RH = p ; p = q ; decr ( delta ) ; } while ( ! ( delta == 0 ) ) ; mem [p ].hhfield .lhfield = curedges ; mem [curedges ].hhfield .v.RH = p ; if ( mem [curedges + 5 ].hhfield .v.RH == curedges ) mem [curedges + 5 ].hhfield .lhfield = nl - 1 ; } if ( nr > mem [curedges + 1 ].hhfield .v.RH ) { delta = nr - mem [curedges + 1 ].hhfield .v.RH ; mem [curedges + 1 ].hhfield .v.RH = nr ; p = mem [curedges ].hhfield .lhfield ; do { q = getnode ( 2 ) ; mem [q + 1 ].hhfield .v.RH = memtop ; mem [q + 1 ].hhfield .lhfield = 1 ; mem [p ].hhfield .v.RH = q ; mem [q ].hhfield .lhfield = p ; p = q ; decr ( delta ) ; } while ( ! ( delta == 0 ) ) ; mem [p ].hhfield .v.RH = curedges ; mem [curedges ].hhfield .lhfield = p ; if ( mem [curedges + 5 ].hhfield .v.RH == curedges ) mem [curedges + 5 ].hhfield .lhfield = nr + 1 ; } } halfword #ifdef HAVE_PROTOTYPES zcopyedges ( halfword h ) #else zcopyedges ( h ) halfword h ; #endif { register halfword Result; halfword p, r ; halfword hh, pp, qq, rr, ss ; hh = getnode ( 6 ) ; mem [hh + 1 ]= mem [h + 1 ]; mem [hh + 2 ]= mem [h + 2 ]; mem [hh + 3 ]= mem [h + 3 ]; mem [hh + 4 ]= mem [h + 4 ]; mem [hh + 5 ].hhfield .lhfield = mem [hh + 1 ].hhfield .v.RH + 1 ; mem [hh + 5 ].hhfield .v.RH = hh ; p = mem [h ].hhfield .v.RH ; qq = hh ; while ( p != h ) { pp = getnode ( 2 ) ; mem [qq ].hhfield .v.RH = pp ; mem [pp ].hhfield .lhfield = qq ; r = mem [p + 1 ].hhfield .v.RH ; rr = pp + 1 ; while ( r != memtop ) { ss = getavail () ; mem [rr ].hhfield .v.RH = ss ; rr = ss ; mem [rr ].hhfield .lhfield = mem [r ].hhfield .lhfield ; r = mem [r ].hhfield .v.RH ; } mem [rr ].hhfield .v.RH = memtop ; r = mem [p + 1 ].hhfield .lhfield ; rr = memtop - 1 ; while ( r > 1 ) { ss = getavail () ; mem [rr ].hhfield .v.RH = ss ; rr = ss ; mem [rr ].hhfield .lhfield = mem [r ].hhfield .lhfield ; r = mem [r ].hhfield .v.RH ; } mem [rr ].hhfield .v.RH = r ; mem [pp + 1 ].hhfield .lhfield = mem [memtop - 1 ].hhfield .v.RH ; p = mem [p ].hhfield .v.RH ; qq = pp ; } mem [qq ].hhfield .v.RH = hh ; mem [hh ].hhfield .lhfield = qq ; Result = hh ; return Result ; } void #ifdef HAVE_PROTOTYPES yreflectedges ( void ) #else yreflectedges ( ) #endif { halfword p, q, r ; p = mem [curedges + 1 ].hhfield .lhfield ; mem [curedges + 1 ].hhfield .lhfield = 8191 - mem [curedges + 1 ] .hhfield .v.RH ; mem [curedges + 1 ].hhfield .v.RH = 8191 - p ; mem [curedges + 5 ].hhfield .lhfield = 8191 - mem [curedges + 5 ] .hhfield .lhfield ; p = mem [curedges ].hhfield .v.RH ; q = curedges ; do { r = mem [p ].hhfield .v.RH ; mem [p ].hhfield .v.RH = q ; mem [q ].hhfield .lhfield = p ; q = p ; p = r ; } while ( ! ( q == curedges ) ) ; mem [curedges + 4 ].cint = 0 ; } void #ifdef HAVE_PROTOTYPES xreflectedges ( void ) #else xreflectedges ( ) #endif { halfword p, q, r, s ; integer m ; p = mem [curedges + 2 ].hhfield .lhfield ; mem [curedges + 2 ].hhfield .lhfield = 8192 - mem [curedges + 2 ] .hhfield .v.RH ; mem [curedges + 2 ].hhfield .v.RH = 8192 - p ; m = ( 4096 + mem [curedges + 3 ].hhfield .lhfield ) * 8 + 8 ; mem [curedges + 3 ].hhfield .lhfield = 4096 ; p = mem [curedges ].hhfield .v.RH ; do { q = mem [p + 1 ].hhfield .v.RH ; r = memtop ; while ( q != memtop ) { s = mem [q ].hhfield .v.RH ; mem [q ].hhfield .v.RH = r ; r = q ; mem [r ].hhfield .lhfield = m - mem [q ].hhfield .lhfield ; q = s ; } mem [p + 1 ].hhfield .v.RH = r ; q = mem [p + 1 ].hhfield .lhfield ; while ( q > 1 ) { mem [q ].hhfield .lhfield = m - mem [q ].hhfield .lhfield ; q = mem [q ].hhfield .v.RH ; } p = mem [p ].hhfield .v.RH ; } while ( ! ( p == curedges ) ) ; mem [curedges + 4 ].cint = 0 ; } void #ifdef HAVE_PROTOTYPES zyscaleedges ( integer s ) #else zyscaleedges ( s ) integer s ; #endif { halfword p, q, pp, r, rr, ss ; integer t ; if ( ( s * ( mem [curedges + 1 ].hhfield .v.RH - 4095 ) >= 4096 ) || ( s * ( mem [curedges + 1 ].hhfield .lhfield - 4096 ) <= -4096 ) ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 534 ) ; } { helpptr = 3 ; helpline [2 ]= 535 ; helpline [1 ]= 536 ; helpline [0 ]= 537 ; } putgeterror () ; } else { mem [curedges + 1 ].hhfield .v.RH = s * ( mem [curedges + 1 ].hhfield .v.RH - 4095 ) + 4095 ; mem [curedges + 1 ].hhfield .lhfield = s * ( mem [curedges + 1 ] .hhfield .lhfield - 4096 ) + 4096 ; p = curedges ; do { q = p ; p = mem [p ].hhfield .v.RH ; {register integer for_end; t = 2 ;for_end = s ; if ( t <= for_end) do { pp = getnode ( 2 ) ; mem [q ].hhfield .v.RH = pp ; mem [p ].hhfield .lhfield = pp ; mem [pp ].hhfield .v.RH = p ; mem [pp ].hhfield .lhfield = q ; q = pp ; r = mem [p + 1 ].hhfield .v.RH ; rr = pp + 1 ; while ( r != memtop ) { ss = getavail () ; mem [rr ].hhfield .v.RH = ss ; rr = ss ; mem [rr ].hhfield .lhfield = mem [r ].hhfield .lhfield ; r = mem [r ].hhfield .v.RH ; } mem [rr ].hhfield .v.RH = memtop ; r = mem [p + 1 ].hhfield .lhfield ; rr = memtop - 1 ; while ( r > 1 ) { ss = getavail () ; mem [rr ].hhfield .v.RH = ss ; rr = ss ; mem [rr ].hhfield .lhfield = mem [r ].hhfield .lhfield ; r = mem [r ].hhfield .v.RH ; } mem [rr ].hhfield .v.RH = r ; mem [pp + 1 ].hhfield .lhfield = mem [memtop - 1 ].hhfield .v.RH ; } while ( t++ < for_end ) ;} } while ( ! ( mem [p ].hhfield .v.RH == curedges ) ) ; mem [curedges + 4 ].cint = 0 ; } } void #ifdef HAVE_PROTOTYPES zxscaleedges ( integer s ) #else zxscaleedges ( s ) integer s ; #endif { halfword p, q ; unsigned short t ; char w ; integer delta ; if ( ( s * ( mem [curedges + 2 ].hhfield .v.RH - 4096 ) >= 4096 ) || ( s * ( mem [curedges + 2 ].hhfield .lhfield - 4096 ) <= -4096 ) ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 534 ) ; } { helpptr = 3 ; helpline [2 ]= 538 ; helpline [1 ]= 536 ; helpline [0 ]= 537 ; } putgeterror () ; } else if ( ( mem [curedges + 2 ].hhfield .v.RH != 4096 ) || ( mem [ curedges + 2 ].hhfield .lhfield != 4096 ) ) { mem [curedges + 2 ].hhfield .v.RH = s * ( mem [curedges + 2 ].hhfield .v.RH - 4096 ) + 4096 ; mem [curedges + 2 ].hhfield .lhfield = s * ( mem [curedges + 2 ] .hhfield .lhfield - 4096 ) + 4096 ; delta = 8 * ( 4096 - s * mem [curedges + 3 ].hhfield .lhfield ) + 0 ; mem [curedges + 3 ].hhfield .lhfield = 4096 ; q = mem [curedges ].hhfield .v.RH ; do { p = mem [q + 1 ].hhfield .v.RH ; while ( p != memtop ) { t = mem [p ].hhfield .lhfield ; w = t % 8 ; mem [p ].hhfield .lhfield = ( t - w ) * s + w + delta ; p = mem [p ].hhfield .v.RH ; } p = mem [q + 1 ].hhfield .lhfield ; while ( p > 1 ) { t = mem [p ].hhfield .lhfield ; w = t % 8 ; mem [p ].hhfield .lhfield = ( t - w ) * s + w + delta ; p = mem [p ].hhfield .v.RH ; } q = mem [q ].hhfield .v.RH ; } while ( ! ( q == curedges ) ) ; mem [curedges + 4 ].cint = 0 ; } } void #ifdef HAVE_PROTOTYPES znegateedges ( halfword h ) #else znegateedges ( h ) halfword h ; #endif { /* 30 */ halfword p, q, r, s, t, u ; p = mem [h ].hhfield .v.RH ; while ( p != h ) { q = mem [p + 1 ].hhfield .lhfield ; while ( q > 1 ) { mem [q ].hhfield .lhfield = 8 - 2 * ( ( mem [q ].hhfield .lhfield ) % 8 ) + mem [q ].hhfield .lhfield ; q = mem [q ].hhfield .v.RH ; } q = mem [p + 1 ].hhfield .v.RH ; if ( q != memtop ) { do { mem [q ].hhfield .lhfield = 8 - 2 * ( ( mem [q ].hhfield .lhfield ) % 8 ) + mem [q ].hhfield .lhfield ; q = mem [q ].hhfield .v.RH ; } while ( ! ( q == memtop ) ) ; u = p + 1 ; q = mem [u ].hhfield .v.RH ; r = q ; s = mem [r ].hhfield .v.RH ; while ( true ) if ( mem [s ].hhfield .lhfield > mem [r ].hhfield .lhfield ) { mem [u ].hhfield .v.RH = q ; if ( s == memtop ) goto lab30 ; u = r ; q = s ; r = q ; s = mem [r ].hhfield .v.RH ; } else { t = s ; s = mem [t ].hhfield .v.RH ; mem [t ].hhfield .v.RH = q ; q = t ; } lab30: mem [r ].hhfield .v.RH = memtop ; } p = mem [p ].hhfield .v.RH ; } mem [h + 4 ].cint = 0 ; } void #ifdef HAVE_PROTOTYPES zsortedges ( halfword h ) #else zsortedges ( h ) halfword h ; #endif { /* 30 */ halfword k ; halfword p, q, r, s ; r = mem [h + 1 ].hhfield .lhfield ; mem [h + 1 ].hhfield .lhfield = 0 ; p = mem [r ].hhfield .v.RH ; mem [r ].hhfield .v.RH = memtop ; mem [memtop - 1 ].hhfield .v.RH = r ; while ( p > 1 ) { k = mem [p ].hhfield .lhfield ; q = memtop - 1 ; do { r = q ; q = mem [r ].hhfield .v.RH ; } while ( ! ( k <= mem [q ].hhfield .lhfield ) ) ; mem [r ].hhfield .v.RH = p ; r = mem [p ].hhfield .v.RH ; mem [p ].hhfield .v.RH = q ; p = r ; } { r = h + 1 ; q = mem [r ].hhfield .v.RH ; p = mem [memtop - 1 ].hhfield .v.RH ; while ( true ) { k = mem [p ].hhfield .lhfield ; while ( k > mem [q ].hhfield .lhfield ) { r = q ; q = mem [r ].hhfield .v.RH ; } mem [r ].hhfield .v.RH = p ; s = mem [p ].hhfield .v.RH ; mem [p ].hhfield .v.RH = q ; if ( s == memtop ) goto lab30 ; r = p ; p = s ; } lab30: ; } } void #ifdef HAVE_PROTOTYPES zculledges ( integer wlo , integer whi , integer wout , integer win ) #else zculledges ( wlo , whi , wout , win ) integer wlo ; integer whi ; integer wout ; integer win ; #endif { /* 30 */ halfword p, q, r, s ; integer w ; integer d ; integer m ; integer mm ; integer ww ; integer prevw ; halfword n, minn, maxn ; halfword mind, maxd ; mind = 268435455L ; maxd = 0 ; minn = 268435455L ; maxn = 0 ; p = mem [curedges ].hhfield .v.RH ; n = mem [curedges + 1 ].hhfield .lhfield ; while ( p != curedges ) { if ( mem [p + 1 ].hhfield .lhfield > 1 ) sortedges ( p ) ; if ( mem [p + 1 ].hhfield .v.RH != memtop ) { r = memtop - 1 ; q = mem [p + 1 ].hhfield .v.RH ; ww = 0 ; m = 1000000L ; prevw = 0 ; while ( true ) { if ( q == memtop ) mm = 1000000L ; else { d = mem [q ].hhfield .lhfield ; mm = d / 8 ; ww = ww + ( d % 8 ) - 4 ; } if ( mm > m ) { if ( w != prevw ) { s = getavail () ; mem [r ].hhfield .v.RH = s ; mem [s ].hhfield .lhfield = 8 * m + 4 + w - prevw ; r = s ; prevw = w ; } if ( q == memtop ) goto lab30 ; } m = mm ; if ( ww >= wlo ) if ( ww <= whi ) w = win ; else w = wout ; else w = wout ; s = mem [q ].hhfield .v.RH ; { mem [q ].hhfield .v.RH = avail ; avail = q ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ } q = s ; } lab30: mem [r ].hhfield .v.RH = memtop ; mem [p + 1 ].hhfield .v.RH = mem [memtop - 1 ].hhfield .v.RH ; if ( r != memtop - 1 ) { if ( minn == 268435455L ) minn = n ; maxn = n ; if ( mind > mem [mem [memtop - 1 ].hhfield .v.RH ].hhfield .lhfield ) mind = mem [mem [memtop - 1 ].hhfield .v.RH ].hhfield .lhfield ; if ( maxd < mem [r ].hhfield .lhfield ) maxd = mem [r ].hhfield .lhfield ; } } p = mem [p ].hhfield .v.RH ; incr ( n ) ; } if ( minn > maxn ) { p = mem [curedges ].hhfield .v.RH ; while ( p != curedges ) { q = mem [p ].hhfield .v.RH ; freenode ( p , 2 ) ; p = q ; } initedges ( curedges ) ; } else { n = mem [curedges + 1 ].hhfield .lhfield ; mem [curedges + 1 ].hhfield .lhfield = minn ; while ( minn > n ) { p = mem [curedges ].hhfield .v.RH ; mem [curedges ].hhfield .v.RH = mem [p ].hhfield .v.RH ; mem [mem [p ].hhfield .v.RH ].hhfield .lhfield = curedges ; freenode ( p , 2 ) ; incr ( n ) ; } n = mem [curedges + 1 ].hhfield .v.RH ; mem [curedges + 1 ].hhfield .v.RH = maxn ; mem [curedges + 5 ].hhfield .lhfield = maxn + 1 ; mem [curedges + 5 ].hhfield .v.RH = curedges ; while ( maxn < n ) { p = mem [curedges ].hhfield .lhfield ; mem [curedges ].hhfield .lhfield = mem [p ].hhfield .lhfield ; mem [mem [p ].hhfield .lhfield ].hhfield .v.RH = curedges ; freenode ( p , 2 ) ; decr ( n ) ; } mem [curedges + 2 ].hhfield .lhfield = ( ( mind ) / 8 ) - mem [curedges + 3 ].hhfield .lhfield + 4096 ; mem [curedges + 2 ].hhfield .v.RH = ( ( maxd ) / 8 ) - mem [curedges + 3 ].hhfield .lhfield + 4096 ; } mem [curedges + 4 ].cint = 0 ; } void #ifdef HAVE_PROTOTYPES xyswapedges ( void ) #else xyswapedges ( ) #endif { /* 30 */ integer mmagic, nmagic ; halfword p, q, r, s ; integer mspread ; integer j, jj ; integer m, mm ; integer pd, rd ; integer pm, rm ; integer w ; integer ww ; integer dw ; integer extras ; schar xw ; integer k ; mspread = mem [curedges + 2 ].hhfield .v.RH - mem [curedges + 2 ] .hhfield .lhfield ; if ( mspread > movesize ) overflow ( 539 , movesize ) ; {register integer for_end; j = 0 ;for_end = mspread ; if ( j <= for_end) do move [j ]= memtop ; while ( j++ < for_end ) ;} p = getnode ( 2 ) ; mem [p + 1 ].hhfield .v.RH = memtop ; mem [p + 1 ].hhfield .lhfield = 0 ; mem [p ].hhfield .lhfield = curedges ; mem [mem [curedges ].hhfield .v.RH ].hhfield .lhfield = p ; p = getnode ( 2 ) ; mem [p + 1 ].hhfield .v.RH = memtop ; mem [p ].hhfield .lhfield = mem [curedges ].hhfield .lhfield ; mmagic = mem [curedges + 2 ].hhfield .lhfield + mem [curedges + 3 ] .hhfield .lhfield - 4096 ; nmagic = 8 * mem [curedges + 1 ].hhfield .v.RH + 12 ; do { q = mem [p ].hhfield .lhfield ; if ( mem [q + 1 ].hhfield .lhfield > 1 ) sortedges ( q ) ; r = mem [p + 1 ].hhfield .v.RH ; freenode ( p , 2 ) ; p = r ; pd = mem [p ].hhfield .lhfield ; pm = pd / 8 ; r = mem [q + 1 ].hhfield .v.RH ; rd = mem [r ].hhfield .lhfield ; rm = rd / 8 ; w = 0 ; while ( true ) { if ( pm < rm ) mm = pm ; else mm = rm ; if ( w != 0 ) if ( m != mm ) { if ( mm - mmagic >= movesize ) confusion ( 509 ) ; extras = ( abs ( w ) - 1 ) / 3 ; if ( extras > 0 ) { if ( w > 0 ) xw = 3 ; else xw = -3 ; ww = w - extras * xw ; } else ww = w ; do { j = m - mmagic ; {register integer for_end; k = 1 ;for_end = extras ; if ( k <= for_end) do { s = getavail () ; mem [s ].hhfield .lhfield = nmagic + xw ; mem [s ].hhfield .v.RH = move [j ]; move [j ]= s ; } while ( k++ < for_end ) ;} s = getavail () ; mem [s ].hhfield .lhfield = nmagic + ww ; mem [s ].hhfield .v.RH = move [j ]; move [j ]= s ; incr ( m ) ; } while ( ! ( m == mm ) ) ; } if ( pd < rd ) { dw = ( pd % 8 ) - 4 ; s = mem [p ].hhfield .v.RH ; { mem [p ].hhfield .v.RH = avail ; avail = p ; ; #ifdef STAT decr ( dynused ) ; #endif /* STAT */ } p = s ; pd = mem [p ].hhfield .lhfield ; pm = pd / 8 ; } else { if ( r == memtop ) goto lab30 ; dw = - (integer) ( ( rd % 8 ) - 4 ) ; r = mem [r ].hhfield .v.RH ; rd = mem [r ].hhfield .lhfield ; rm = rd / 8 ; } m = mm ; w = w + dw ; } lab30: ; p = q ; nmagic = nmagic - 8 ; } while ( ! ( mem [p ].hhfield .lhfield == curedges ) ) ; freenode ( p , 2 ) ; move [mspread ]= 0 ; j = 0 ; while ( move [j ]== memtop ) incr ( j ) ; if ( j == mspread ) initedges ( curedges ) ; else { mm = mem [curedges + 2 ].hhfield .lhfield ; mem [curedges + 2 ].hhfield .lhfield = mem [curedges + 1 ].hhfield .lhfield ; mem [curedges + 2 ].hhfield .v.RH = mem [curedges + 1 ].hhfield .v.RH + 1 ; mem [curedges + 3 ].hhfield .lhfield = 4096 ; jj = mspread - 1 ; while ( move [jj ]== memtop ) decr ( jj ) ; mem [curedges + 1 ].hhfield .lhfield = j + mm ; mem [curedges + 1 ].hhfield .v.RH = jj + mm ; q = curedges ; do { p = getnode ( 2 ) ; mem [q ].hhfield .v.RH = p ; mem [p ].hhfield .lhfield = q ; mem [p + 1 ].hhfield .v.RH = move [j ]; mem [p + 1 ].hhfield .lhfield = 0 ; incr ( j ) ; q = p ; } while ( ! ( j > jj ) ) ; mem [q ].hhfield .v.RH = curedges ; mem [curedges ].hhfield .lhfield = q ; mem [curedges + 5 ].hhfield .lhfield = mem [curedges + 1 ].hhfield .v.RH + 1 ; mem [curedges + 5 ].hhfield .v.RH = curedges ; mem [curedges + 4 ].cint = 0 ; } } void #ifdef HAVE_PROTOTYPES zmergeedges ( halfword h ) #else zmergeedges ( h ) halfword h ; #endif { /* 30 */ halfword p, q, r, pp, qq, rr ; integer n ; halfword k ; integer delta ; if ( mem [h ].hhfield .v.RH != h ) { if ( ( mem [h + 2 ].hhfield .lhfield < mem [curedges + 2 ].hhfield .lhfield ) || ( mem [h + 2 ].hhfield .v.RH > mem [curedges + 2 ] .hhfield .v.RH ) || ( mem [h + 1 ].hhfield .lhfield < mem [curedges + 1 ].hhfield .lhfield ) || ( mem [h + 1 ].hhfield .v.RH > mem [curedges + 1 ].hhfield .v.RH ) ) edgeprep ( mem [h + 2 ].hhfield .lhfield - 4096 , mem [h + 2 ].hhfield .v.RH - 4096 , mem [h + 1 ].hhfield .lhfield - 4096 , mem [h + 1 ] .hhfield .v.RH - 4095 ) ; if ( mem [h + 3 ].hhfield .lhfield != mem [curedges + 3 ].hhfield .lhfield ) { pp = mem [h ].hhfield .v.RH ; delta = 8 * ( mem [curedges + 3 ].hhfield .lhfield - mem [h + 3 ] .hhfield .lhfield ) ; do { qq = mem [pp + 1 ].hhfield .v.RH ; while ( qq != memtop ) { mem [qq ].hhfield .lhfield = mem [qq ].hhfield .lhfield + delta ; qq = mem [qq ].hhfield .v.RH ; } qq = mem [pp + 1 ].hhfield .lhfield ; while ( qq > 1 ) { mem [qq ].hhfield .lhfield = mem [qq ].hhfield .lhfield + delta ; qq = mem [qq ].hhfield .v.RH ; } pp = mem [pp ].hhfield .v.RH ; } while ( ! ( pp == h ) ) ; } n = mem [curedges + 1 ].hhfield .lhfield ; p = mem [curedges ].hhfield .v.RH ; pp = mem [h ].hhfield .v.RH ; while ( n < mem [h + 1 ].hhfield .lhfield ) { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } do { qq = mem [pp + 1 ].hhfield .lhfield ; if ( qq > 1 ) if ( mem [p + 1 ].hhfield .lhfield <= 1 ) mem [p + 1 ].hhfield .lhfield = qq ; else { while ( mem [qq ].hhfield .v.RH > 1 ) qq = mem [qq ].hhfield .v.RH ; mem [qq ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [p + 1 ].hhfield .lhfield = mem [pp + 1 ].hhfield .lhfield ; } mem [pp + 1 ].hhfield .lhfield = 0 ; qq = mem [pp + 1 ].hhfield .v.RH ; if ( qq != memtop ) { if ( mem [p + 1 ].hhfield .lhfield == 1 ) mem [p + 1 ].hhfield .lhfield = 0 ; mem [pp + 1 ].hhfield .v.RH = memtop ; r = p + 1 ; q = mem [r ].hhfield .v.RH ; if ( q == memtop ) mem [p + 1 ].hhfield .v.RH = qq ; else while ( true ) { k = mem [qq ].hhfield .lhfield ; while ( k > mem [q ].hhfield .lhfield ) { r = q ; q = mem [r ].hhfield .v.RH ; } mem [r ].hhfield .v.RH = qq ; rr = mem [qq ].hhfield .v.RH ; mem [qq ].hhfield .v.RH = q ; if ( rr == memtop ) goto lab30 ; r = qq ; qq = rr ; } } lab30: ; pp = mem [pp ].hhfield .v.RH ; p = mem [p ].hhfield .v.RH ; } while ( ! ( pp == h ) ) ; } } integer #ifdef HAVE_PROTOTYPES ztotalweight ( halfword h ) #else ztotalweight ( h ) halfword h ; #endif { register integer Result; halfword p, q ; integer n ; unsigned short m ; n = 0 ; p = mem [h ].hhfield .v.RH ; while ( p != h ) { q = mem [p + 1 ].hhfield .v.RH ; while ( q != memtop ) { m = mem [q ].hhfield .lhfield ; n = n - ( ( m % 8 ) - 4 ) * ( m / 8 ) ; q = mem [q ].hhfield .v.RH ; } q = mem [p + 1 ].hhfield .lhfield ; while ( q > 1 ) { m = mem [q ].hhfield .lhfield ; n = n - ( ( m % 8 ) - 4 ) * ( m / 8 ) ; q = mem [q ].hhfield .v.RH ; } p = mem [p ].hhfield .v.RH ; } Result = n ; return Result ; } void #ifdef HAVE_PROTOTYPES beginedgetracing ( void ) #else beginedgetracing ( ) #endif { printdiagnostic ( 540 , 283 , true ) ; print ( 541 ) ; printint ( curwt ) ; printchar ( 41 ) ; tracex = -4096 ; } void #ifdef HAVE_PROTOTYPES traceacorner ( void ) #else traceacorner ( ) #endif { if ( fileoffset > maxprintline - 13 ) printnl ( 283 ) ; printchar ( 40 ) ; printint ( tracex ) ; printchar ( 44 ) ; printint ( traceyy ) ; printchar ( 41 ) ; tracey = traceyy ; } void #ifdef HAVE_PROTOTYPES endedgetracing ( void ) #else endedgetracing ( ) #endif { if ( tracex == -4096 ) printnl ( 542 ) ; else { traceacorner () ; printchar ( 46 ) ; } enddiagnostic ( true ) ; } void #ifdef HAVE_PROTOTYPES ztracenewedge ( halfword r , integer n ) #else ztracenewedge ( r , n ) halfword r ; integer n ; #endif { integer d ; schar w ; integer m, n0, n1 ; d = mem [r ].hhfield .lhfield ; w = ( d % 8 ) - 4 ; m = ( d / 8 ) - mem [curedges + 3 ].hhfield .lhfield ; if ( w == curwt ) { n0 = n + 1 ; n1 = n ; } else { n0 = n ; n1 = n + 1 ; } if ( m != tracex ) { if ( tracex == -4096 ) { printnl ( 283 ) ; traceyy = n0 ; } else if ( traceyy != n0 ) printchar ( 63 ) ; else traceacorner () ; tracex = m ; traceacorner () ; } else { if ( n0 != traceyy ) printchar ( 33 ) ; if ( ( ( n0 < n1 ) && ( tracey > traceyy ) ) || ( ( n0 > n1 ) && ( tracey < traceyy ) ) ) traceacorner () ; } traceyy = n1 ; } void #ifdef HAVE_PROTOTYPES zlineedges ( scaled x0 , scaled y0 , scaled x1 , scaled y1 ) #else zlineedges ( x0 , y0 , x1 , y1 ) scaled x0 ; scaled y0 ; scaled x1 ; scaled y1 ; #endif { /* 30 31 */ integer m0, n0, m1, n1 ; scaled delx, dely ; scaled yt ; scaled tx ; halfword p, r ; integer base ; integer n ; n0 = roundunscaled ( y0 ) ; n1 = roundunscaled ( y1 ) ; if ( n0 != n1 ) { m0 = roundunscaled ( x0 ) ; m1 = roundunscaled ( x1 ) ; delx = x1 - x0 ; dely = y1 - y0 ; yt = n0 * 65536L - 32768L ; y0 = y0 - yt ; y1 = y1 - yt ; if ( n0 < n1 ) { base = 8 * mem [curedges + 3 ].hhfield .lhfield + 4 - curwt ; if ( m0 <= m1 ) edgeprep ( m0 , m1 , n0 , n1 ) ; else edgeprep ( m1 , m0 , n0 , n1 ) ; n = mem [curedges + 5 ].hhfield .lhfield - 4096 ; p = mem [curedges + 5 ].hhfield .v.RH ; if ( n != n0 ) if ( n < n0 ) do { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } while ( ! ( n == n0 ) ) ; else do { decr ( n ) ; p = mem [p ].hhfield .lhfield ; } while ( ! ( n == n0 ) ) ; y0 = 65536L - y0 ; while ( true ) { r = getavail () ; mem [r ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [p + 1 ].hhfield .lhfield = r ; tx = takefraction ( delx , makefraction ( y0 , dely ) ) ; if ( abvscd ( delx , y0 , dely , tx ) < 0 ) decr ( tx ) ; mem [r ].hhfield .lhfield = 8 * roundunscaled ( x0 + tx ) + base ; y1 = y1 - 65536L ; if ( internal [10 ]> 0 ) tracenewedge ( r , n ) ; if ( y1 < 65536L ) goto lab30 ; p = mem [p ].hhfield .v.RH ; y0 = y0 + 65536L ; incr ( n ) ; } lab30: ; } else { base = 8 * mem [curedges + 3 ].hhfield .lhfield + 4 + curwt ; if ( m0 <= m1 ) edgeprep ( m0 , m1 , n1 , n0 ) ; else edgeprep ( m1 , m0 , n1 , n0 ) ; decr ( n0 ) ; n = mem [curedges + 5 ].hhfield .lhfield - 4096 ; p = mem [curedges + 5 ].hhfield .v.RH ; if ( n != n0 ) if ( n < n0 ) do { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } while ( ! ( n == n0 ) ) ; else do { decr ( n ) ; p = mem [p ].hhfield .lhfield ; } while ( ! ( n == n0 ) ) ; while ( true ) { r = getavail () ; mem [r ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [p + 1 ].hhfield .lhfield = r ; tx = takefraction ( delx , makefraction ( y0 , dely ) ) ; if ( abvscd ( delx , y0 , dely , tx ) < 0 ) incr ( tx ) ; mem [r ].hhfield .lhfield = 8 * roundunscaled ( x0 - tx ) + base ; y1 = y1 + 65536L ; if ( internal [10 ]> 0 ) tracenewedge ( r , n ) ; if ( y1 >= 0 ) goto lab31 ; p = mem [p ].hhfield .lhfield ; y0 = y0 + 65536L ; decr ( n ) ; } lab31: ; } mem [curedges + 5 ].hhfield .v.RH = p ; mem [curedges + 5 ].hhfield .lhfield = n + 4096 ; } } void #ifdef HAVE_PROTOTYPES zmovetoedges ( integer m0 , integer n0 , integer m1 , integer n1 ) #else zmovetoedges ( m0 , n0 , m1 , n1 ) integer m0 ; integer n0 ; integer m1 ; integer n1 ; #endif { /* 60 61 62 63 30 */ integer delta ; integer k ; halfword p, r ; integer dx ; integer edgeandweight ; integer j ; integer n ; #ifdef TEXMF_DEBUG integer sum ; #endif /* TEXMF_DEBUG */ delta = n1 - n0 ; ; #ifdef TEXMF_DEBUG sum = move [0 ]; {register integer for_end; k = 1 ;for_end = delta ; if ( k <= for_end) do sum = sum + abs ( move [k ]) ; while ( k++ < for_end ) ;} if ( sum != m1 - m0 ) confusion ( 48 ) ; #endif /* TEXMF_DEBUG */ switch ( octant ) {case 1 : { dx = 8 ; edgeprep ( m0 , m1 , n0 , n1 ) ; goto lab60 ; } break ; case 5 : { dx = 8 ; edgeprep ( n0 , n1 , m0 , m1 ) ; goto lab62 ; } break ; case 6 : { dx = -8 ; edgeprep ( - (integer) n1 , - (integer) n0 , m0 , m1 ) ; n0 = - (integer) n0 ; goto lab62 ; } break ; case 2 : { dx = -8 ; edgeprep ( - (integer) m1 , - (integer) m0 , n0 , n1 ) ; m0 = - (integer) m0 ; goto lab60 ; } break ; case 4 : { dx = -8 ; edgeprep ( - (integer) m1 , - (integer) m0 , - (integer) n1 , - (integer) n0 ) ; m0 = - (integer) m0 ; goto lab61 ; } break ; case 8 : { dx = -8 ; edgeprep ( - (integer) n1 , - (integer) n0 , - (integer) m1 , - (integer) m0 ) ; n0 = - (integer) n0 ; goto lab63 ; } break ; case 7 : { dx = 8 ; edgeprep ( n0 , n1 , - (integer) m1 , - (integer) m0 ) ; goto lab63 ; } break ; case 3 : { dx = 8 ; edgeprep ( m0 , m1 , - (integer) n1 , - (integer) n0 ) ; goto lab61 ; } break ; } lab60: n = mem [curedges + 5 ].hhfield .lhfield - 4096 ; p = mem [curedges + 5 ].hhfield .v.RH ; if ( n != n0 ) if ( n < n0 ) do { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } while ( ! ( n == n0 ) ) ; else do { decr ( n ) ; p = mem [p ].hhfield .lhfield ; } while ( ! ( n == n0 ) ) ; if ( delta > 0 ) { k = 0 ; edgeandweight = 8 * ( m0 + mem [curedges + 3 ].hhfield .lhfield ) + 4 - curwt ; do { edgeandweight = edgeandweight + dx * move [k ]; { r = avail ; if ( r == 0 ) r = getavail () ; else { avail = mem [r ].hhfield .v.RH ; mem [r ].hhfield .v.RH = 0 ; ; #ifdef STAT incr ( dynused ) ; #endif /* STAT */ } } mem [r ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [r ].hhfield .lhfield = edgeandweight ; if ( internal [10 ]> 0 ) tracenewedge ( r , n ) ; mem [p + 1 ].hhfield .lhfield = r ; p = mem [p ].hhfield .v.RH ; incr ( k ) ; incr ( n ) ; } while ( ! ( k == delta ) ) ; } goto lab30 ; lab61: n0 = - (integer) n0 - 1 ; n = mem [curedges + 5 ].hhfield .lhfield - 4096 ; p = mem [curedges + 5 ].hhfield .v.RH ; if ( n != n0 ) if ( n < n0 ) do { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } while ( ! ( n == n0 ) ) ; else do { decr ( n ) ; p = mem [p ].hhfield .lhfield ; } while ( ! ( n == n0 ) ) ; if ( delta > 0 ) { k = 0 ; edgeandweight = 8 * ( m0 + mem [curedges + 3 ].hhfield .lhfield ) + 4 + curwt ; do { edgeandweight = edgeandweight + dx * move [k ]; { r = avail ; if ( r == 0 ) r = getavail () ; else { avail = mem [r ].hhfield .v.RH ; mem [r ].hhfield .v.RH = 0 ; ; #ifdef STAT incr ( dynused ) ; #endif /* STAT */ } } mem [r ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [r ].hhfield .lhfield = edgeandweight ; if ( internal [10 ]> 0 ) tracenewedge ( r , n ) ; mem [p + 1 ].hhfield .lhfield = r ; p = mem [p ].hhfield .lhfield ; incr ( k ) ; decr ( n ) ; } while ( ! ( k == delta ) ) ; } goto lab30 ; lab62: edgeandweight = 8 * ( n0 + mem [curedges + 3 ].hhfield .lhfield ) + 4 - curwt ; n0 = m0 ; k = 0 ; n = mem [curedges + 5 ].hhfield .lhfield - 4096 ; p = mem [curedges + 5 ].hhfield .v.RH ; if ( n != n0 ) if ( n < n0 ) do { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } while ( ! ( n == n0 ) ) ; else do { decr ( n ) ; p = mem [p ].hhfield .lhfield ; } while ( ! ( n == n0 ) ) ; do { j = move [k ]; while ( j > 0 ) { { r = avail ; if ( r == 0 ) r = getavail () ; else { avail = mem [r ].hhfield .v.RH ; mem [r ].hhfield .v.RH = 0 ; ; #ifdef STAT incr ( dynused ) ; #endif /* STAT */ } } mem [r ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [r ].hhfield .lhfield = edgeandweight ; if ( internal [10 ]> 0 ) tracenewedge ( r , n ) ; mem [p + 1 ].hhfield .lhfield = r ; p = mem [p ].hhfield .v.RH ; decr ( j ) ; incr ( n ) ; } edgeandweight = edgeandweight + dx ; incr ( k ) ; } while ( ! ( k > delta ) ) ; goto lab30 ; lab63: edgeandweight = 8 * ( n0 + mem [curedges + 3 ].hhfield .lhfield ) + 4 + curwt ; n0 = - (integer) m0 - 1 ; k = 0 ; n = mem [curedges + 5 ].hhfield .lhfield - 4096 ; p = mem [curedges + 5 ].hhfield .v.RH ; if ( n != n0 ) if ( n < n0 ) do { incr ( n ) ; p = mem [p ].hhfield .v.RH ; } while ( ! ( n == n0 ) ) ; else do { decr ( n ) ; p = mem [p ].hhfield .lhfield ; } while ( ! ( n == n0 ) ) ; do { j = move [k ]; while ( j > 0 ) { { r = avail ; if ( r == 0 ) r = getavail () ; else { avail = mem [r ].hhfield .v.RH ; mem [r ].hhfield .v.RH = 0 ; ; #ifdef STAT incr ( dynused ) ; #endif /* STAT */ } } mem [r ].hhfield .v.RH = mem [p + 1 ].hhfield .lhfield ; mem [r ].hhfield .lhfield = edgeandweight ; if ( internal [10 ]> 0 ) tracenewedge ( r , n ) ; mem [p + 1 ].hhfield .lhfield = r ; p = mem [p ].hhfield .lhfield ; decr ( j ) ; decr ( n ) ; } edgeandweight = edgeandweight + dx ; incr ( k ) ; } while ( ! ( k > delta ) ) ; goto lab30 ; lab30: mem [curedges + 5 ].hhfield .lhfield = n + 4096 ; mem [curedges + 5 ].hhfield .v.RH = p ; } void #ifdef HAVE_PROTOTYPES zskew ( scaled x , scaled y , smallnumber octant ) #else zskew ( x , y , octant ) scaled x ; scaled y ; smallnumber octant ; #endif { switch ( octant ) {case 1 : { curx = x - y ; cury = y ; } break ; case 5 : { curx = y - x ; cury = x ; } break ; case 6 : { curx = y + x ; cury = - (integer) x ; } break ; case 2 : { curx = - (integer) x - y ; cury = y ; } break ; case 4 : { curx = - (integer) x + y ; cury = - (integer) y ; } break ; case 8 : { curx = - (integer) y + x ; cury = - (integer) x ; } break ; case 7 : { curx = - (integer) y - x ; cury = x ; } break ; case 3 : { curx = x + y ; cury = - (integer) y ; } break ; } } void #ifdef HAVE_PROTOTYPES zabnegate ( scaled x , scaled y , smallnumber octantbefore , smallnumber octantafter ) #else zabnegate ( x , y , octantbefore , octantafter ) scaled x ; scaled y ; smallnumber octantbefore ; smallnumber octantafter ; #endif { if ( odd ( octantbefore ) == odd ( octantafter ) ) curx = x ; else curx = - (integer) x ; if ( ( octantbefore > 2 ) == ( octantafter > 2 ) ) cury = y ; else cury = - (integer) y ; } fraction #ifdef HAVE_PROTOTYPES zcrossingpoint ( integer a , integer b , integer c ) #else zcrossingpoint ( a , b , c ) integer a ; integer b ; integer c ; #endif { /* 10 */ register fraction Result; integer d ; integer x, xx, x0, x1, x2 ; if ( a < 0 ) { Result = 0 ; goto lab10 ; } if ( c >= 0 ) { if ( b >= 0 ) if ( c > 0 ) { Result = 268435457L ; goto lab10 ; } else if ( ( a == 0 ) && ( b == 0 ) ) { Result = 268435457L ; goto lab10 ; } else { Result = 268435456L ; goto lab10 ; } if ( a == 0 ) { Result = 0 ; goto lab10 ; } } else if ( a == 0 ) if ( b <= 0 ) { Result = 0 ; goto lab10 ; } d = 1 ; x0 = a ; x1 = a - b ; x2 = b - c ; do { x = half ( x1 + x2 ) ; if ( x1 - x0 > x0 ) { x2 = x ; x0 = x0 + x0 ; d = d + d ; } else { xx = x1 + x - x0 ; if ( xx > x0 ) { x2 = x ; x0 = x0 + x0 ; d = d + d ; } else { x0 = x0 - xx ; if ( x <= x0 ) if ( x + x2 <= x0 ) { Result = 268435457L ; goto lab10 ; } x1 = x ; d = d + d + 1 ; } } } while ( ! ( d >= 268435456L ) ) ; Result = d - 268435456L ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES zprintspec ( strnumber s ) #else zprintspec ( s ) strnumber s ; #endif { /* 45 30 */ halfword p, q ; smallnumber octant ; printdiagnostic ( 543 , s , true ) ; p = curspec ; octant = mem [p + 3 ].cint ; println () ; unskew ( mem [curspec + 1 ].cint , mem [curspec + 2 ].cint , octant ) ; printtwo ( curx , cury ) ; print ( 544 ) ; while ( true ) { print ( octantdir [octant ]) ; printchar ( 39 ) ; while ( true ) { q = mem [p ].hhfield .v.RH ; if ( mem [p ].hhfield .b1 == 0 ) goto lab45 ; { printnl ( 555 ) ; unskew ( mem [p + 5 ].cint , mem [p + 6 ].cint , octant ) ; printtwo ( curx , cury ) ; print ( 522 ) ; unskew ( mem [q + 3 ].cint , mem [q + 4 ].cint , octant ) ; printtwo ( curx , cury ) ; printnl ( 519 ) ; unskew ( mem [q + 1 ].cint , mem [q + 2 ].cint , octant ) ; printtwo ( curx , cury ) ; print ( 556 ) ; printint ( mem [q ].hhfield .b0 - 1 ) ; } p = q ; } lab45: if ( q == curspec ) goto lab30 ; p = q ; octant = mem [p + 3 ].cint ; printnl ( 545 ) ; } lab30: printnl ( 546 ) ; enddiagnostic ( true ) ; } void #ifdef HAVE_PROTOTYPES zprintstrange ( strnumber s ) #else zprintstrange ( s ) strnumber s ; #endif { halfword p ; halfword f ; halfword q ; integer t ; if ( interaction == 3 ) ; printnl ( 62 ) ; p = curspec ; t = 256 ; do { p = mem [p ].hhfield .v.RH ; if ( mem [p ].hhfield .b0 != 0 ) { if ( mem [p ].hhfield .b0 < t ) f = p ; t = mem [p ].hhfield .b0 ; } } while ( ! ( p == curspec ) ) ; p = curspec ; q = p ; do { p = mem [p ].hhfield .v.RH ; if ( mem [p ].hhfield .b0 == 0 ) q = p ; } while ( ! ( p == f ) ) ; t = 0 ; do { if ( mem [p ].hhfield .b0 != 0 ) { if ( mem [p ].hhfield .b0 != t ) { t = mem [p ].hhfield .b0 ; printchar ( 32 ) ; printint ( t - 1 ) ; } if ( q != 0 ) { if ( mem [mem [q ].hhfield .v.RH ].hhfield .b0 == 0 ) { print ( 557 ) ; print ( octantdir [mem [q + 3 ].cint ]) ; q = mem [q ].hhfield .v.RH ; while ( mem [mem [q ].hhfield .v.RH ].hhfield .b0 == 0 ) { printchar ( 32 ) ; print ( octantdir [mem [q + 3 ].cint ]) ; q = mem [q ].hhfield .v.RH ; } printchar ( 41 ) ; } printchar ( 32 ) ; print ( octantdir [mem [q + 3 ].cint ]) ; q = 0 ; } } else if ( q == 0 ) q = p ; p = mem [p ].hhfield .v.RH ; } while ( ! ( p == f ) ) ; printchar ( 32 ) ; printint ( mem [p ].hhfield .b0 - 1 ) ; if ( q != 0 ) if ( mem [mem [q ].hhfield .v.RH ].hhfield .b0 == 0 ) { print ( 557 ) ; print ( octantdir [mem [q + 3 ].cint ]) ; q = mem [q ].hhfield .v.RH ; while ( mem [mem [q ].hhfield .v.RH ].hhfield .b0 == 0 ) { printchar ( 32 ) ; print ( octantdir [mem [q + 3 ].cint ]) ; q = mem [q ].hhfield .v.RH ; } printchar ( 41 ) ; } { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( s ) ; } } void #ifdef HAVE_PROTOTYPES zremovecubic ( halfword p ) #else zremovecubic ( p ) halfword p ; #endif { halfword q ; q = mem [p ].hhfield .v.RH ; mem [p ].hhfield .b1 = mem [q ].hhfield .b1 ; mem [p ].hhfield .v.RH = mem [q ].hhfield .v.RH ; mem [p + 1 ].cint = mem [q + 1 ].cint ; mem [p + 2 ].cint = mem [q + 2 ].cint ; mem [p + 5 ].cint = mem [q + 5 ].cint ; mem [p + 6 ].cint = mem [q + 6 ].cint ; freenode ( q , 7 ) ; } void #ifdef HAVE_PROTOTYPES zsplitcubic ( halfword p , fraction t , scaled xq , scaled yq ) #else zsplitcubic ( p , t , xq , yq ) halfword p ; fraction t ; scaled xq ; scaled yq ; #endif { scaled v ; halfword q, r ; q = mem [p ].hhfield .v.RH ; r = getnode ( 7 ) ; mem [p ].hhfield .v.RH = r ; mem [r ].hhfield .v.RH = q ; mem [r ].hhfield .b0 = mem [q ].hhfield .b0 ; mem [r ].hhfield .b1 = mem [p ].hhfield .b1 ; v = mem [p + 5 ].cint - takefraction ( mem [p + 5 ].cint - mem [q + 3 ] .cint , t ) ; mem [p + 5 ].cint = mem [p + 1 ].cint - takefraction ( mem [p + 1 ] .cint - mem [p + 5 ].cint , t ) ; mem [q + 3 ].cint = mem [q + 3 ].cint - takefraction ( mem [q + 3 ] .cint - xq , t ) ; mem [r + 3 ].cint = mem [p + 5 ].cint - takefraction ( mem [p + 5 ] .cint - v , t ) ; mem [r + 5 ].cint = v - takefraction ( v - mem [q + 3 ].cint , t ) ; mem [r + 1 ].cint = mem [r + 3 ].cint - takefraction ( mem [r + 3 ] .cint - mem [r + 5 ].cint , t ) ; v = mem [p + 6 ].cint - takefraction ( mem [p + 6 ].cint - mem [q + 4 ] .cint , t ) ; mem [p + 6 ].cint = mem [p + 2 ].cint - takefraction ( mem [p + 2 ] .cint - mem [p + 6 ].cint , t ) ; mem [q + 4 ].cint = mem [q + 4 ].cint - takefraction ( mem [q + 4 ] .cint - yq , t ) ; mem [r + 4 ].cint = mem [p + 6 ].cint - takefraction ( mem [p + 6 ] .cint - v , t ) ; mem [r + 6 ].cint = v - takefraction ( v - mem [q + 4 ].cint , t ) ; mem [r + 2 ].cint = mem [r + 4 ].cint - takefraction ( mem [r + 4 ] .cint - mem [r + 6 ].cint , t ) ; } void #ifdef HAVE_PROTOTYPES quadrantsubdivide ( void ) #else quadrantsubdivide ( ) #endif { /* 22 10 */ halfword p, q, r, s, pp, qq ; scaled firstx, firsty ; scaled del1, del2, del3, del, dmax ; fraction t ; scaled destx, desty ; boolean constantx ; p = curspec ; firstx = mem [curspec + 1 ].cint ; firsty = mem [curspec + 2 ].cint ; do { lab22: q = mem [p ].hhfield .v.RH ; if ( q == curspec ) { destx = firstx ; desty = firsty ; } else { destx = mem [q + 1 ].cint ; desty = mem [q + 2 ].cint ; } del1 = mem [p + 5 ].cint - mem [p + 1 ].cint ; del2 = mem [q + 3 ].cint - mem [p + 5 ].cint ; del3 = destx - mem [q + 3 ].cint ; if ( del1 != 0 ) del = del1 ; else if ( del2 != 0 ) del = del2 ; else del = del3 ; if ( del != 0 ) { dmax = abs ( del1 ) ; if ( abs ( del2 ) > dmax ) dmax = abs ( del2 ) ; if ( abs ( del3 ) > dmax ) dmax = abs ( del3 ) ; while ( dmax < 134217728L ) { dmax = dmax + dmax ; del1 = del1 + del1 ; del2 = del2 + del2 ; del3 = del3 + del3 ; } } if ( del == 0 ) constantx = true ; else { constantx = false ; if ( del < 0 ) { mem [p + 1 ].cint = - (integer) mem [p + 1 ].cint ; mem [p + 5 ].cint = - (integer) mem [p + 5 ].cint ; mem [q + 3 ].cint = - (integer) mem [q + 3 ].cint ; del1 = - (integer) del1 ; del2 = - (integer) del2 ; del3 = - (integer) del3 ; destx = - (integer) destx ; mem [p ].hhfield .b1 = 2 ; } t = crossingpoint ( del1 , del2 , del3 ) ; if ( t < 268435456L ) { splitcubic ( p , t , destx , desty ) ; r = mem [p ].hhfield .v.RH ; if ( mem [r ].hhfield .b1 > 1 ) mem [r ].hhfield .b1 = 1 ; else mem [r ].hhfield .b1 = 2 ; if ( mem [r + 1 ].cint < mem [p + 1 ].cint ) mem [r + 1 ].cint = mem [p + 1 ].cint ; mem [r + 3 ].cint = mem [r + 1 ].cint ; if ( mem [p + 5 ].cint > mem [r + 1 ].cint ) mem [p + 5 ].cint = mem [r + 1 ].cint ; mem [r + 1 ].cint = - (integer) mem [r + 1 ].cint ; mem [r + 5 ].cint = mem [r + 1 ].cint ; mem [q + 3 ].cint = - (integer) mem [q + 3 ].cint ; destx = - (integer) destx ; del2 = del2 - takefraction ( del2 - del3 , t ) ; if ( del2 > 0 ) del2 = 0 ; t = crossingpoint ( 0 , - (integer) del2 , - (integer) del3 ) ; if ( t < 268435456L ) { splitcubic ( r , t , destx , desty ) ; s = mem [r ].hhfield .v.RH ; if ( mem [s + 1 ].cint < destx ) mem [s + 1 ].cint = destx ; if ( mem [s + 1 ].cint < mem [r + 1 ].cint ) mem [s + 1 ].cint = mem [r + 1 ].cint ; mem [s ].hhfield .b1 = mem [p ].hhfield .b1 ; mem [s + 3 ].cint = mem [s + 1 ].cint ; if ( mem [q + 3 ].cint < destx ) mem [q + 3 ].cint = - (integer) destx ; else if ( mem [q + 3 ].cint > mem [s + 1 ].cint ) mem [q + 3 ].cint = - (integer) mem [s + 1 ].cint ; else mem [q + 3 ].cint = - (integer) mem [q + 3 ].cint ; mem [s + 1 ].cint = - (integer) mem [s + 1 ].cint ; mem [s + 5 ].cint = mem [s + 1 ].cint ; } else { if ( mem [r + 1 ].cint > destx ) { mem [r + 1 ].cint = destx ; mem [r + 3 ].cint = - (integer) mem [r + 1 ].cint ; mem [r + 5 ].cint = mem [r + 1 ].cint ; } if ( mem [q + 3 ].cint > destx ) mem [q + 3 ].cint = destx ; else if ( mem [q + 3 ].cint < mem [r + 1 ].cint ) mem [q + 3 ].cint = mem [r + 1 ].cint ; } } } pp = p ; do { qq = mem [pp ].hhfield .v.RH ; abnegate ( mem [qq + 1 ].cint , mem [qq + 2 ].cint , mem [qq ] .hhfield .b1 , mem [pp ].hhfield .b1 ) ; destx = curx ; desty = cury ; del1 = mem [pp + 6 ].cint - mem [pp + 2 ].cint ; del2 = mem [qq + 4 ].cint - mem [pp + 6 ].cint ; del3 = desty - mem [qq + 4 ].cint ; if ( del1 != 0 ) del = del1 ; else if ( del2 != 0 ) del = del2 ; else del = del3 ; if ( del != 0 ) { dmax = abs ( del1 ) ; if ( abs ( del2 ) > dmax ) dmax = abs ( del2 ) ; if ( abs ( del3 ) > dmax ) dmax = abs ( del3 ) ; while ( dmax < 134217728L ) { dmax = dmax + dmax ; del1 = del1 + del1 ; del2 = del2 + del2 ; del3 = del3 + del3 ; } } if ( del != 0 ) { if ( del < 0 ) { mem [pp + 2 ].cint = - (integer) mem [pp + 2 ].cint ; mem [pp + 6 ].cint = - (integer) mem [pp + 6 ].cint ; mem [qq + 4 ].cint = - (integer) mem [qq + 4 ].cint ; del1 = - (integer) del1 ; del2 = - (integer) del2 ; del3 = - (integer) del3 ; desty = - (integer) desty ; mem [pp ].hhfield .b1 = mem [pp ].hhfield .b1 + 2 ; } t = crossingpoint ( del1 , del2 , del3 ) ; if ( t < 268435456L ) { splitcubic ( pp , t , destx , desty ) ; r = mem [pp ].hhfield .v.RH ; if ( mem [r ].hhfield .b1 > 2 ) mem [r ].hhfield .b1 = mem [r ].hhfield .b1 - 2 ; else mem [r ].hhfield .b1 = mem [r ].hhfield .b1 + 2 ; if ( mem [r + 2 ].cint < mem [pp + 2 ].cint ) mem [r + 2 ].cint = mem [pp + 2 ].cint ; mem [r + 4 ].cint = mem [r + 2 ].cint ; if ( mem [pp + 6 ].cint > mem [r + 2 ].cint ) mem [pp + 6 ].cint = mem [r + 2 ].cint ; mem [r + 2 ].cint = - (integer) mem [r + 2 ].cint ; mem [r + 6 ].cint = mem [r + 2 ].cint ; mem [qq + 4 ].cint = - (integer) mem [qq + 4 ].cint ; desty = - (integer) desty ; if ( mem [r + 1 ].cint < mem [pp + 1 ].cint ) mem [r + 1 ].cint = mem [pp + 1 ].cint ; else if ( mem [r + 1 ].cint > destx ) mem [r + 1 ].cint = destx ; if ( mem [r + 3 ].cint > mem [r + 1 ].cint ) { mem [r + 3 ].cint = mem [r + 1 ].cint ; if ( mem [pp + 5 ].cint > mem [r + 1 ].cint ) mem [pp + 5 ].cint = mem [r + 1 ].cint ; } if ( mem [r + 5 ].cint < mem [r + 1 ].cint ) { mem [r + 5 ].cint = mem [r + 1 ].cint ; if ( mem [qq + 3 ].cint < mem [r + 1 ].cint ) mem [qq + 3 ].cint = mem [r + 1 ].cint ; } del2 = del2 - takefraction ( del2 - del3 , t ) ; if ( del2 > 0 ) del2 = 0 ; t = crossingpoint ( 0 , - (integer) del2 , - (integer) del3 ) ; if ( t < 268435456L ) { splitcubic ( r , t , destx , desty ) ; s = mem [r ].hhfield .v.RH ; if ( mem [s + 2 ].cint < desty ) mem [s + 2 ].cint = desty ; if ( mem [s + 2 ].cint < mem [r + 2 ].cint ) mem [s + 2 ].cint = mem [r + 2 ].cint ; mem [s ].hhfield .b1 = mem [pp ].hhfield .b1 ; mem [s + 4 ].cint = mem [s + 2 ].cint ; if ( mem [qq + 4 ].cint < desty ) mem [qq + 4 ].cint = - (integer) desty ; else if ( mem [qq + 4 ].cint > mem [s + 2 ].cint ) mem [qq + 4 ].cint = - (integer) mem [s + 2 ].cint ; else mem [qq + 4 ].cint = - (integer) mem [qq + 4 ].cint ; mem [s + 2 ].cint = - (integer) mem [s + 2 ].cint ; mem [s + 6 ].cint = mem [s + 2 ].cint ; if ( mem [s + 1 ].cint < mem [r + 1 ].cint ) mem [s + 1 ].cint = mem [r + 1 ].cint ; else if ( mem [s + 1 ].cint > destx ) mem [s + 1 ].cint = destx ; if ( mem [s + 3 ].cint > mem [s + 1 ].cint ) { mem [s + 3 ].cint = mem [s + 1 ].cint ; if ( mem [r + 5 ].cint > mem [s + 1 ].cint ) mem [r + 5 ].cint = mem [s + 1 ].cint ; } if ( mem [s + 5 ].cint < mem [s + 1 ].cint ) { mem [s + 5 ].cint = mem [s + 1 ].cint ; if ( mem [qq + 3 ].cint < mem [s + 1 ].cint ) mem [qq + 3 ].cint = mem [s + 1 ].cint ; } } else { if ( mem [r + 2 ].cint > desty ) { mem [r + 2 ].cint = desty ; mem [r + 4 ].cint = - (integer) mem [r + 2 ].cint ; mem [r + 6 ].cint = mem [r + 2 ].cint ; } if ( mem [qq + 4 ].cint > desty ) mem [qq + 4 ].cint = desty ; else if ( mem [qq + 4 ].cint < mem [r + 2 ].cint ) mem [qq + 4 ].cint = mem [r + 2 ].cint ; } } } else if ( constantx ) { if ( q != p ) { removecubic ( p ) ; if ( curspec != q ) goto lab22 ; else { curspec = p ; goto lab10 ; } } } else if ( ! odd ( mem [pp ].hhfield .b1 ) ) { mem [pp + 2 ].cint = - (integer) mem [pp + 2 ].cint ; mem [pp + 6 ].cint = - (integer) mem [pp + 6 ].cint ; mem [qq + 4 ].cint = - (integer) mem [qq + 4 ].cint ; del1 = - (integer) del1 ; del2 = - (integer) del2 ; del3 = - (integer) del3 ; desty = - (integer) desty ; mem [pp ].hhfield .b1 = mem [pp ].hhfield .b1 + 2 ; } pp = qq ; } while ( ! ( pp == q ) ) ; if ( constantx ) { pp = p ; do { qq = mem [pp ].hhfield .v.RH ; if ( mem [pp ].hhfield .b1 > 2 ) { mem [pp ].hhfield .b1 = mem [pp ].hhfield .b1 + 1 ; mem [pp + 1 ].cint = - (integer) mem [pp + 1 ].cint ; mem [pp + 5 ].cint = - (integer) mem [pp + 5 ].cint ; mem [qq + 3 ].cint = - (integer) mem [qq + 3 ].cint ; } pp = qq ; } while ( ! ( pp == q ) ) ; } p = q ; } while ( ! ( p == curspec ) ) ; lab10: ; } void #ifdef HAVE_PROTOTYPES octantsubdivide ( void ) #else octantsubdivide ( ) #endif { halfword p, q, r, s ; scaled del1, del2, del3, del, dmax ; fraction t ; scaled destx, desty ; p = curspec ; do { q = mem [p ].hhfield .v.RH ; mem [p + 1 ].cint = mem [p + 1 ].cint - mem [p + 2 ].cint ; mem [p + 5 ].cint = mem [p + 5 ].cint - mem [p + 6 ].cint ; mem [q + 3 ].cint = mem [q + 3 ].cint - mem [q + 4 ].cint ; if ( q == curspec ) { unskew ( mem [q + 1 ].cint , mem [q + 2 ].cint , mem [q ].hhfield .b1 ) ; skew ( curx , cury , mem [p ].hhfield .b1 ) ; destx = curx ; desty = cury ; } else { abnegate ( mem [q + 1 ].cint , mem [q + 2 ].cint , mem [q ] .hhfield .b1 , mem [p ].hhfield .b1 ) ; destx = curx - cury ; desty = cury ; } del1 = mem [p + 5 ].cint - mem [p + 1 ].cint ; del2 = mem [q + 3 ].cint - mem [p + 5 ].cint ; del3 = destx - mem [q + 3 ].cint ; if ( del1 != 0 ) del = del1 ; else if ( del2 != 0 ) del = del2 ; else del = del3 ; if ( del != 0 ) { dmax = abs ( del1 ) ; if ( abs ( del2 ) > dmax ) dmax = abs ( del2 ) ; if ( abs ( del3 ) > dmax ) dmax = abs ( del3 ) ; while ( dmax < 134217728L ) { dmax = dmax + dmax ; del1 = del1 + del1 ; del2 = del2 + del2 ; del3 = del3 + del3 ; } } if ( del != 0 ) { if ( del < 0 ) { mem [p + 2 ].cint = mem [p + 1 ].cint + mem [p + 2 ].cint ; mem [p + 1 ].cint = - (integer) mem [p + 1 ].cint ; mem [p + 6 ].cint = mem [p + 5 ].cint + mem [p + 6 ].cint ; mem [p + 5 ].cint = - (integer) mem [p + 5 ].cint ; mem [q + 4 ].cint = mem [q + 3 ].cint + mem [q + 4 ].cint ; mem [q + 3 ].cint = - (integer) mem [q + 3 ].cint ; del1 = - (integer) del1 ; del2 = - (integer) del2 ; del3 = - (integer) del3 ; desty = destx + desty ; destx = - (integer) destx ; mem [p ].hhfield .b1 = mem [p ].hhfield .b1 + 4 ; } t = crossingpoint ( del1 , del2 , del3 ) ; if ( t < 268435456L ) { splitcubic ( p , t , destx , desty ) ; r = mem [p ].hhfield .v.RH ; if ( mem [r ].hhfield .b1 > 4 ) mem [r ].hhfield .b1 = mem [r ].hhfield .b1 - 4 ; else mem [r ].hhfield .b1 = mem [r ].hhfield .b1 + 4 ; if ( mem [r + 2 ].cint < mem [p + 2 ].cint ) mem [r + 2 ].cint = mem [p + 2 ].cint ; else if ( mem [r + 2 ].cint > desty ) mem [r + 2 ].cint = desty ; if ( mem [p + 1 ].cint + mem [r + 2 ].cint > destx + desty ) mem [r + 2 ].cint = destx + desty - mem [p + 1 ].cint ; if ( mem [r + 4 ].cint > mem [r + 2 ].cint ) { mem [r + 4 ].cint = mem [r + 2 ].cint ; if ( mem [p + 6 ].cint > mem [r + 2 ].cint ) mem [p + 6 ].cint = mem [r + 2 ].cint ; } if ( mem [r + 6 ].cint < mem [r + 2 ].cint ) { mem [r + 6 ].cint = mem [r + 2 ].cint ; if ( mem [q + 4 ].cint < mem [r + 2 ].cint ) mem [q + 4 ].cint = mem [r + 2 ].cint ; } if ( mem [r + 1 ].cint < mem [p + 1 ].cint ) mem [r + 1 ].cint = mem [p + 1 ].cint ; else if ( mem [r + 1 ].cint + mem [r + 2 ].cint > destx + desty ) mem [r + 1 ].cint = destx + desty - mem [r + 2 ].cint ; mem [r + 3 ].cint = mem [r + 1 ].cint ; if ( mem [p + 5 ].cint > mem [r + 1 ].cint ) mem [p + 5 ].cint = mem [r + 1 ].cint ; mem [r + 2 ].cint = mem [r + 2 ].cint + mem [r + 1 ].cint ; mem [r + 6 ].cint = mem [r + 6 ].cint + mem [r + 1 ].cint ; mem [r + 1 ].cint = - (integer) mem [r + 1 ].cint ; mem [r + 5 ].cint = mem [r + 1 ].cint ; mem [q + 4 ].cint = mem [q + 4 ].cint + mem [q + 3 ].cint ; mem [q + 3 ].cint = - (integer) mem [q + 3 ].cint ; desty = desty + destx ; destx = - (integer) destx ; if ( mem [r + 6 ].cint < mem [r + 2 ].cint ) { mem [r + 6 ].cint = mem [r + 2 ].cint ; if ( mem [q + 4 ].cint < mem [r + 2 ].cint ) mem [q + 4 ].cint = mem [r + 2 ].cint ; } del2 = del2 - takefraction ( del2 - del3 , t ) ; if ( del2 > 0 ) del2 = 0 ; t = crossingpoint ( 0 , - (integer) del2 , - (integer) del3 ) ; if ( t < 268435456L ) { splitcubic ( r , t , destx , desty ) ; s = mem [r ].hhfield .v.RH ; if ( mem [s + 2 ].cint < mem [r + 2 ].cint ) mem [s + 2 ].cint = mem [r + 2 ].cint ; else if ( mem [s + 2 ].cint > desty ) mem [s + 2 ].cint = desty ; if ( mem [r + 1 ].cint + mem [s + 2 ].cint > destx + desty ) mem [s + 2 ].cint = destx + desty - mem [r + 1 ].cint ; if ( mem [s + 4 ].cint > mem [s + 2 ].cint ) { mem [s + 4 ].cint = mem [s + 2 ].cint ; if ( mem [r + 6 ].cint > mem [s + 2 ].cint ) mem [r + 6 ].cint = mem [s + 2 ].cint ; } if ( mem [s + 6 ].cint < mem [s + 2 ].cint ) { mem [s + 6 ].cint = mem [s + 2 ].cint ; if ( mem [q + 4 ].cint < mem [s + 2 ].cint ) mem [q + 4 ].cint = mem [s + 2 ].cint ; } if ( mem [s + 1 ].cint + mem [s + 2 ].cint > destx + desty ) mem [s + 1 ].cint = destx + desty - mem [s + 2 ].cint ; else { if ( mem [s + 1 ].cint < destx ) mem [s + 1 ].cint = destx ; if ( mem [s + 1 ].cint < mem [r + 1 ].cint ) mem [s + 1 ].cint = mem [r + 1 ].cint ; } mem [s ].hhfield .b1 = mem [p ].hhfield .b1 ; mem [s + 3 ].cint = mem [s + 1 ].cint ; if ( mem [q + 3 ].cint < destx ) { mem [q + 4 ].cint = mem [q + 4 ].cint + destx ; mem [q + 3 ].cint = - (integer) destx ; } else if ( mem [q + 3 ].cint > mem [s + 1 ].cint ) { mem [q + 4 ].cint = mem [q + 4 ].cint + mem [s + 1 ].cint ; mem [q + 3 ].cint = - (integer) mem [s + 1 ].cint ; } else { mem [q + 4 ].cint = mem [q + 4 ].cint + mem [q + 3 ].cint ; mem [q + 3 ].cint = - (integer) mem [q + 3 ].cint ; } mem [s + 2 ].cint = mem [s + 2 ].cint + mem [s + 1 ].cint ; mem [s + 6 ].cint = mem [s + 6 ].cint + mem [s + 1 ].cint ; mem [s + 1 ].cint = - (integer) mem [s + 1 ].cint ; mem [s + 5 ].cint = mem [s + 1 ].cint ; if ( mem [s + 6 ].cint < mem [s + 2 ].cint ) { mem [s + 6 ].cint = mem [s + 2 ].cint ; if ( mem [q + 4 ].cint < mem [s + 2 ].cint ) mem [q + 4 ].cint = mem [s + 2 ].cint ; } } else { if ( mem [r + 1 ].cint > destx ) { mem [r + 1 ].cint = destx ; mem [r + 3 ].cint = - (integer) mem [r + 1 ].cint ; mem [r + 5 ].cint = mem [r + 1 ].cint ; } if ( mem [q + 3 ].cint > destx ) mem [q + 3 ].cint = destx ; else if ( mem [q + 3 ].cint < mem [r + 1 ].cint ) mem [q + 3 ].cint = mem [r + 1 ].cint ; } } } p = q ; } while ( ! ( p == curspec ) ) ; } void #ifdef HAVE_PROTOTYPES makesafe ( void ) #else makesafe ( ) #endif { integer k ; boolean allsafe ; scaled nexta ; scaled deltaa, deltab ; before [curroundingptr ]= before [0 ]; nodetoround [curroundingptr ]= nodetoround [0 ]; do { after [curroundingptr ]= after [0 ]; allsafe = true ; nexta = after [0 ]; {register integer for_end; k = 0 ;for_end = curroundingptr - 1 ; if ( k <= for_end) do { deltab = before [k + 1 ]- before [k ]; if ( deltab >= 0 ) deltaa = after [k + 1 ]- nexta ; else deltaa = nexta - after [k + 1 ]; nexta = after [k + 1 ]; if ( ( deltaa < 0 ) || ( deltaa > abs ( deltab + deltab ) ) ) { allsafe = false ; after [k ]= before [k ]; if ( k == curroundingptr - 1 ) after [0 ]= before [0 ]; else after [k + 1 ]= before [k + 1 ]; } } while ( k++ < for_end ) ;} } while ( ! ( allsafe ) ) ; } void #ifdef HAVE_PROTOTYPES zbeforeandafter ( scaled b , scaled a , halfword p ) #else zbeforeandafter ( b , a , p ) scaled b ; scaled a ; halfword p ; #endif { if ( curroundingptr == maxroundingptr ) if ( maxroundingptr < maxwiggle ) incr ( maxroundingptr ) ; else overflow ( 567 , maxwiggle ) ; after [curroundingptr ]= a ; before [curroundingptr ]= b ; nodetoround [curroundingptr ]= p ; incr ( curroundingptr ) ; } scaled #ifdef HAVE_PROTOTYPES zgoodval ( scaled b , scaled o ) #else zgoodval ( b , o ) scaled b ; scaled o ; #endif { register scaled Result; scaled a ; a = b + o ; if ( a >= 0 ) a = a - ( a % curgran ) - o ; else a = a + ( ( - (integer) ( a + 1 ) ) % curgran ) - curgran + 1 - o ; if ( b - a < a + curgran - b ) Result = a ; else Result = a + curgran ; return Result ; } scaled #ifdef HAVE_PROTOTYPES zcompromise ( scaled u , scaled v ) #else zcompromise ( u , v ) scaled u ; scaled v ; #endif { register scaled Result; Result = half ( goodval ( u + u , - (integer) u - v ) ) ; return Result ; } void #ifdef HAVE_PROTOTYPES xyround ( void ) #else xyround ( ) #endif { halfword p, q ; scaled b, a ; scaled penedge ; fraction alpha ; curgran = abs ( internal [37 ]) ; if ( curgran == 0 ) curgran = 65536L ; p = curspec ; curroundingptr = 0 ; do { q = mem [p ].hhfield .v.RH ; if ( odd ( mem [p ].hhfield .b1 ) != odd ( mem [q ].hhfield .b1 ) ) { if ( odd ( mem [q ].hhfield .b1 ) ) b = mem [q + 1 ].cint ; else b = - (integer) mem [q + 1 ].cint ; if ( ( abs ( mem [q + 1 ].cint - mem [q + 5 ].cint ) < 655 ) || ( abs ( mem [q + 1 ].cint + mem [q + 3 ].cint ) < 655 ) ) { if ( curpen == 3 ) penedge = 0 ; else if ( curpathtype == 0 ) penedge = compromise ( mem [mem [curpen + 5 ].hhfield .v.RH + 2 ] .cint , mem [mem [curpen + 7 ].hhfield .v.RH + 2 ].cint ) ; else if ( odd ( mem [q ].hhfield .b1 ) ) penedge = mem [mem [curpen + 7 ].hhfield .v.RH + 2 ].cint ; else penedge = mem [mem [curpen + 5 ].hhfield .v.RH + 2 ].cint ; a = goodval ( b , penedge ) ; } else a = b ; if ( abs ( a ) > maxallowed ) if ( a > 0 ) a = maxallowed ; else a = - (integer) maxallowed ; beforeandafter ( b , a , q ) ; } p = q ; } while ( ! ( p == curspec ) ) ; if ( curroundingptr > 0 ) { makesafe () ; do { decr ( curroundingptr ) ; if ( ( after [curroundingptr ]!= before [curroundingptr ]) || ( after [curroundingptr + 1 ]!= before [curroundingptr + 1 ]) ) { p = nodetoround [curroundingptr ]; if ( odd ( mem [p ].hhfield .b1 ) ) { b = before [curroundingptr ]; a = after [curroundingptr ]; } else { b = - (integer) before [curroundingptr ]; a = - (integer) after [curroundingptr ]; } if ( before [curroundingptr ]== before [curroundingptr + 1 ]) alpha = 268435456L ; else alpha = makefraction ( after [curroundingptr + 1 ]- after [ curroundingptr ], before [curroundingptr + 1 ]- before [ curroundingptr ]) ; do { mem [p + 1 ].cint = takefraction ( alpha , mem [p + 1 ].cint - b ) + a ; mem [p + 5 ].cint = takefraction ( alpha , mem [p + 5 ].cint - b ) + a ; p = mem [p ].hhfield .v.RH ; mem [p + 3 ].cint = takefraction ( alpha , mem [p + 3 ].cint - b ) + a ; } while ( ! ( p == nodetoround [curroundingptr + 1 ]) ) ; } } while ( ! ( curroundingptr == 0 ) ) ; } p = curspec ; curroundingptr = 0 ; do { q = mem [p ].hhfield .v.RH ; if ( ( mem [p ].hhfield .b1 > 2 ) != ( mem [q ].hhfield .b1 > 2 ) ) { if ( mem [q ].hhfield .b1 <= 2 ) b = mem [q + 2 ].cint ; else b = - (integer) mem [q + 2 ].cint ; if ( ( abs ( mem [q + 2 ].cint - mem [q + 6 ].cint ) < 655 ) || ( abs ( mem [q + 2 ].cint + mem [q + 4 ].cint ) < 655 ) ) { if ( curpen == 3 ) penedge = 0 ; else if ( curpathtype == 0 ) penedge = compromise ( mem [mem [curpen + 2 ].hhfield .v.RH + 2 ] .cint , mem [mem [curpen + 1 ].hhfield .v.RH + 2 ].cint ) ; else if ( mem [q ].hhfield .b1 <= 2 ) penedge = mem [mem [curpen + 1 ].hhfield .v.RH + 2 ].cint ; else penedge = mem [mem [curpen + 2 ].hhfield .v.RH + 2 ].cint ; a = goodval ( b , penedge ) ; } else a = b ; if ( abs ( a ) > maxallowed ) if ( a > 0 ) a = maxallowed ; else a = - (integer) maxallowed ; beforeandafter ( b , a , q ) ; } p = q ; } while ( ! ( p == curspec ) ) ; if ( curroundingptr > 0 ) { makesafe () ; do { decr ( curroundingptr ) ; if ( ( after [curroundingptr ]!= before [curroundingptr ]) || ( after [curroundingptr + 1 ]!= before [curroundingptr + 1 ]) ) { p = nodetoround [curroundingptr ]; if ( mem [p ].hhfield .b1 <= 2 ) { b = before [curroundingptr ]; a = after [curroundingptr ]; } else { b = - (integer) before [curroundingptr ]; a = - (integer) after [curroundingptr ]; } if ( before [curroundingptr ]== before [curroundingptr + 1 ]) alpha = 268435456L ; else alpha = makefraction ( after [curroundingptr + 1 ]- after [ curroundingptr ], before [curroundingptr + 1 ]- before [ curroundingptr ]) ; do { mem [p + 2 ].cint = takefraction ( alpha , mem [p + 2 ].cint - b ) + a ; mem [p + 6 ].cint = takefraction ( alpha , mem [p + 6 ].cint - b ) + a ; p = mem [p ].hhfield .v.RH ; mem [p + 4 ].cint = takefraction ( alpha , mem [p + 4 ].cint - b ) + a ; } while ( ! ( p == nodetoround [curroundingptr + 1 ]) ) ; } } while ( ! ( curroundingptr == 0 ) ) ; } } void #ifdef HAVE_PROTOTYPES diaground ( void ) #else diaground ( ) #endif { halfword p, q, pp ; scaled b, a, bb, aa, d, c, dd, cc ; scaled penedge ; fraction alpha, beta ; scaled nexta ; boolean allsafe ; integer k ; scaled firstx, firsty ; p = curspec ; curroundingptr = 0 ; do { q = mem [p ].hhfield .v.RH ; if ( mem [p ].hhfield .b1 != mem [q ].hhfield .b1 ) { if ( mem [q ].hhfield .b1 > 4 ) b = - (integer) mem [q + 1 ].cint ; else b = mem [q + 1 ].cint ; if ( abs ( mem [q ].hhfield .b1 - mem [p ].hhfield .b1 ) == 4 ) if ( ( abs ( mem [q + 1 ].cint - mem [q + 5 ].cint ) < 655 ) || ( abs ( mem [q + 1 ].cint + mem [q + 3 ].cint ) < 655 ) ) { if ( curpen == 3 ) penedge = 0 ; else if ( curpathtype == 0 ) switch ( mem [q ].hhfield .b1 ) {case 1 : case 5 : penedge = compromise ( mem [mem [mem [curpen + 1 ].hhfield .v.RH ].hhfield .lhfield + 1 ].cint , - (integer) mem [mem [mem [ curpen + 4 ].hhfield .v.RH ].hhfield .lhfield + 1 ].cint ) ; break ; case 4 : case 8 : penedge = - (integer) compromise ( mem [mem [mem [curpen + 1 ] .hhfield .v.RH ].hhfield .lhfield + 1 ].cint , - (integer) mem [ mem [mem [curpen + 4 ].hhfield .v.RH ].hhfield .lhfield + 1 ] .cint ) ; break ; case 6 : case 2 : penedge = compromise ( mem [mem [mem [curpen + 2 ].hhfield .v.RH ].hhfield .lhfield + 1 ].cint , - (integer) mem [mem [mem [ curpen + 3 ].hhfield .v.RH ].hhfield .lhfield + 1 ].cint ) ; break ; case 7 : case 3 : penedge = - (integer) compromise ( mem [mem [mem [curpen + 2 ] .hhfield .v.RH ].hhfield .lhfield + 1 ].cint , - (integer) mem [ mem [mem [curpen + 3 ].hhfield .v.RH ].hhfield .lhfield + 1 ] .cint ) ; break ; } else if ( mem [q ].hhfield .b1 <= 4 ) penedge = mem [mem [mem [curpen + mem [q ].hhfield .b1 ].hhfield .v.RH ].hhfield .lhfield + 1 ].cint ; else penedge = - (integer) mem [mem [mem [curpen + mem [q ] .hhfield .b1 ].hhfield .v.RH ].hhfield .lhfield + 1 ].cint ; if ( odd ( mem [q ].hhfield .b1 ) ) a = goodval ( b , penedge + halfp ( curgran ) ) ; else a = goodval ( b - 1 , penedge + halfp ( curgran ) ) ; } else a = b ; else a = b ; beforeandafter ( b , a , q ) ; } p = q ; } while ( ! ( p == curspec ) ) ; if ( curroundingptr > 0 ) { p = nodetoround [0 ]; firstx = mem [p + 1 ].cint ; firsty = mem [p + 2 ].cint ; before [curroundingptr ]= before [0 ]; nodetoround [curroundingptr ]= nodetoround [0 ]; do { after [curroundingptr ]= after [0 ]; allsafe = true ; nexta = after [0 ]; {register integer for_end; k = 0 ;for_end = curroundingptr - 1 ; if ( k <= for_end) do { a = nexta ; b = before [k ]; nexta = after [k + 1 ]; aa = nexta ; bb = before [k + 1 ]; if ( ( a != b ) || ( aa != bb ) ) { p = nodetoround [k ]; pp = nodetoround [k + 1 ]; if ( aa == bb ) { if ( pp == nodetoround [0 ]) unskew ( firstx , firsty , mem [pp ].hhfield .b1 ) ; else unskew ( mem [pp + 1 ].cint , mem [pp + 2 ].cint , mem [pp ].hhfield .b1 ) ; skew ( curx , cury , mem [p ].hhfield .b1 ) ; bb = curx ; aa = bb ; dd = cury ; cc = dd ; if ( mem [p ].hhfield .b1 > 4 ) { b = - (integer) b ; a = - (integer) a ; } } else { if ( mem [p ].hhfield .b1 > 4 ) { bb = - (integer) bb ; aa = - (integer) aa ; b = - (integer) b ; a = - (integer) a ; } if ( pp == nodetoround [0 ]) dd = firsty - bb ; else dd = mem [pp + 2 ].cint - bb ; if ( odd ( aa - bb ) ) if ( mem [p ].hhfield .b1 > 4 ) cc = dd - half ( aa - bb + 1 ) ; else cc = dd - half ( aa - bb - 1 ) ; else cc = dd - half ( aa - bb ) ; } d = mem [p + 2 ].cint ; if ( odd ( a - b ) ) if ( mem [p ].hhfield .b1 > 4 ) c = d - half ( a - b - 1 ) ; else c = d - half ( a - b + 1 ) ; else c = d - half ( a - b ) ; if ( ( aa < a ) || ( cc < c ) || ( aa - a > 2 * ( bb - b ) ) || ( cc - c > 2 * ( dd - d ) ) ) { allsafe = false ; after [k ]= before [k ]; if ( k == curroundingptr - 1 ) after [0 ]= before [0 ]; else after [k + 1 ]= before [k + 1 ]; } } } while ( k++ < for_end ) ;} } while ( ! ( allsafe ) ) ; {register integer for_end; k = 0 ;for_end = curroundingptr - 1 ; if ( k <= for_end) do { a = after [k ]; b = before [k ]; aa = after [k + 1 ]; bb = before [k + 1 ]; if ( ( a != b ) || ( aa != bb ) ) { p = nodetoround [k ]; pp = nodetoround [k + 1 ]; if ( aa == bb ) { if ( pp == nodetoround [0 ]) unskew ( firstx , firsty , mem [pp ].hhfield .b1 ) ; else unskew ( mem [pp + 1 ].cint , mem [pp + 2 ].cint , mem [ pp ].hhfield .b1 ) ; skew ( curx , cury , mem [p ].hhfield .b1 ) ; bb = curx ; aa = bb ; dd = cury ; cc = dd ; if ( mem [p ].hhfield .b1 > 4 ) { b = - (integer) b ; a = - (integer) a ; } } else { if ( mem [p ].hhfield .b1 > 4 ) { bb = - (integer) bb ; aa = - (integer) aa ; b = - (integer) b ; a = - (integer) a ; } if ( pp == nodetoround [0 ]) dd = firsty - bb ; else dd = mem [pp + 2 ].cint - bb ; if ( odd ( aa - bb ) ) if ( mem [p ].hhfield .b1 > 4 ) cc = dd - half ( aa - bb + 1 ) ; else cc = dd - half ( aa - bb - 1 ) ; else cc = dd - half ( aa - bb ) ; } d = mem [p + 2 ].cint ; if ( odd ( a - b ) ) if ( mem [p ].hhfield .b1 > 4 ) c = d - half ( a - b - 1 ) ; else c = d - half ( a - b + 1 ) ; else c = d - half ( a - b ) ; if ( b == bb ) alpha = 268435456L ; else alpha = makefraction ( aa - a , bb - b ) ; if ( d == dd ) beta = 268435456L ; else beta = makefraction ( cc - c , dd - d ) ; do { mem [p + 1 ].cint = takefraction ( alpha , mem [p + 1 ] .cint - b ) + a ; mem [p + 2 ].cint = takefraction ( beta , mem [p + 2 ].cint - d ) + c ; mem [p + 5 ].cint = takefraction ( alpha , mem [p + 5 ].cint - b ) + a ; mem [p + 6 ].cint = takefraction ( beta , mem [p + 6 ].cint - d ) + c ; p = mem [p ].hhfield .v.RH ; mem [p + 3 ].cint = takefraction ( alpha , mem [p + 3 ].cint - b ) + a ; mem [p + 4 ].cint = takefraction ( beta , mem [p + 4 ].cint - d ) + c ; } while ( ! ( p == pp ) ) ; } } while ( k++ < for_end ) ;} } } void #ifdef HAVE_PROTOTYPES znewboundary ( halfword p , smallnumber octant ) #else znewboundary ( p , octant ) halfword p ; smallnumber octant ; #endif { halfword q, r ; q = mem [p ].hhfield .v.RH ; r = getnode ( 7 ) ; mem [r ].hhfield .v.RH = q ; mem [p ].hhfield .v.RH = r ; mem [r ].hhfield .b0 = mem [q ].hhfield .b0 ; mem [r + 3 ].cint = mem [q + 3 ].cint ; mem [r + 4 ].cint = mem [q + 4 ].cint ; mem [r ].hhfield .b1 = 0 ; mem [q ].hhfield .b0 = 0 ; mem [r + 5 ].cint = octant ; mem [q + 3 ].cint = mem [q ].hhfield .b1 ; unskew ( mem [q + 1 ].cint , mem [q + 2 ].cint , mem [q ].hhfield .b1 ) ; skew ( curx , cury , octant ) ; mem [r + 1 ].cint = curx ; mem [r + 2 ].cint = cury ; } halfword #ifdef HAVE_PROTOTYPES zmakespec ( halfword h , scaled safetymargin , integer tracing ) #else zmakespec ( h , safetymargin , tracing ) halfword h ; scaled safetymargin ; integer tracing ; #endif { /* 22 30 */ register halfword Result; halfword p, q, r, s ; integer k ; boolean chopped ; smallnumber o1, o2 ; boolean clockwise ; integer dx1, dy1, dx2, dy2 ; integer dmax, del ; curspec = h ; if ( tracing > 0 ) printpath ( curspec , 558 , true ) ; maxallowed = 268402687L - safetymargin ; p = curspec ; k = 1 ; chopped = false ; do { if ( abs ( mem [p + 3 ].cint ) > maxallowed ) { chopped = true ; if ( mem [p + 3 ].cint > 0 ) mem [p + 3 ].cint = maxallowed ; else mem [p + 3 ].cint = - (integer) maxallowed ; } if ( abs ( mem [p + 4 ].cint ) > maxallowed ) { chopped = true ; if ( mem [p + 4 ].cint > 0 ) mem [p + 4 ].cint = maxallowed ; else mem [p + 4 ].cint = - (integer) maxallowed ; } if ( abs ( mem [p + 1 ].cint ) > maxallowed ) { chopped = true ; if ( mem [p + 1 ].cint > 0 ) mem [p + 1 ].cint = maxallowed ; else mem [p + 1 ].cint = - (integer) maxallowed ; } if ( abs ( mem [p + 2 ].cint ) > maxallowed ) { chopped = true ; if ( mem [p + 2 ].cint > 0 ) mem [p + 2 ].cint = maxallowed ; else mem [p + 2 ].cint = - (integer) maxallowed ; } if ( abs ( mem [p + 5 ].cint ) > maxallowed ) { chopped = true ; if ( mem [p + 5 ].cint > 0 ) mem [p + 5 ].cint = maxallowed ; else mem [p + 5 ].cint = - (integer) maxallowed ; } if ( abs ( mem [p + 6 ].cint ) > maxallowed ) { chopped = true ; if ( mem [p + 6 ].cint > 0 ) mem [p + 6 ].cint = maxallowed ; else mem [p + 6 ].cint = - (integer) maxallowed ; } p = mem [p ].hhfield .v.RH ; mem [p ].hhfield .b0 = k ; if ( k < 255 ) incr ( k ) ; else k = 1 ; } while ( ! ( p == curspec ) ) ; if ( chopped ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 562 ) ; } { helpptr = 4 ; helpline [3 ]= 563 ; helpline [2 ]= 564 ; helpline [1 ]= 565 ; helpline [0 ]= 566 ; } putgeterror () ; } quadrantsubdivide () ; if ( internal [36 ]> 0 ) xyround () ; octantsubdivide () ; if ( internal [36 ]> 65536L ) diaground () ; p = curspec ; do { lab22: q = mem [p ].hhfield .v.RH ; if ( p != q ) { if ( mem [p + 1 ].cint == mem [p + 5 ].cint ) if ( mem [p + 2 ].cint == mem [p + 6 ].cint ) if ( mem [p + 1 ].cint == mem [q + 3 ].cint ) if ( mem [p + 2 ].cint == mem [q + 4 ].cint ) { unskew ( mem [q + 1 ].cint , mem [q + 2 ].cint , mem [q ] .hhfield .b1 ) ; skew ( curx , cury , mem [p ].hhfield .b1 ) ; if ( mem [p + 1 ].cint == curx ) if ( mem [p + 2 ].cint == cury ) { removecubic ( p ) ; if ( q != curspec ) goto lab22 ; curspec = p ; q = p ; } } } p = q ; } while ( ! ( p == curspec ) ) ; turningnumber = 0 ; p = curspec ; q = mem [p ].hhfield .v.RH ; do { r = mem [q ].hhfield .v.RH ; if ( ( mem [p ].hhfield .b1 != mem [q ].hhfield .b1 ) || ( q == r ) ) { newboundary ( p , mem [p ].hhfield .b1 ) ; s = mem [p ].hhfield .v.RH ; o1 = octantnumber [mem [p ].hhfield .b1 ]; o2 = octantnumber [mem [q ].hhfield .b1 ]; switch ( o2 - o1 ) {case 1 : case -7 : case 7 : case -1 : goto lab30 ; break ; case 2 : case -6 : clockwise = false ; break ; case 3 : case -5 : case 4 : case -4 : case 5 : case -3 : { dx1 = mem [s + 1 ].cint - mem [s + 3 ].cint ; dy1 = mem [s + 2 ].cint - mem [s + 4 ].cint ; if ( dx1 == 0 ) if ( dy1 == 0 ) { dx1 = mem [s + 1 ].cint - mem [p + 5 ].cint ; dy1 = mem [s + 2 ].cint - mem [p + 6 ].cint ; if ( dx1 == 0 ) if ( dy1 == 0 ) { dx1 = mem [s + 1 ].cint - mem [p + 1 ].cint ; dy1 = mem [s + 2 ].cint - mem [p + 2 ].cint ; } } dmax = abs ( dx1 ) ; if ( abs ( dy1 ) > dmax ) dmax = abs ( dy1 ) ; while ( dmax < 268435456L ) { dmax = dmax + dmax ; dx1 = dx1 + dx1 ; dy1 = dy1 + dy1 ; } dx2 = mem [q + 5 ].cint - mem [q + 1 ].cint ; dy2 = mem [q + 6 ].cint - mem [q + 2 ].cint ; if ( dx2 == 0 ) if ( dy2 == 0 ) { dx2 = mem [r + 3 ].cint - mem [q + 1 ].cint ; dy2 = mem [r + 4 ].cint - mem [q + 2 ].cint ; if ( dx2 == 0 ) if ( dy2 == 0 ) { if ( mem [r ].hhfield .b1 == 0 ) { curx = mem [r + 1 ].cint ; cury = mem [r + 2 ].cint ; } else { unskew ( mem [r + 1 ].cint , mem [r + 2 ].cint , mem [r ] .hhfield .b1 ) ; skew ( curx , cury , mem [q ].hhfield .b1 ) ; } dx2 = curx - mem [q + 1 ].cint ; dy2 = cury - mem [q + 2 ].cint ; } } dmax = abs ( dx2 ) ; if ( abs ( dy2 ) > dmax ) dmax = abs ( dy2 ) ; while ( dmax < 268435456L ) { dmax = dmax + dmax ; dx2 = dx2 + dx2 ; dy2 = dy2 + dy2 ; } unskew ( dx1 , dy1 , mem [p ].hhfield .b1 ) ; del = pythadd ( curx , cury ) ; dx1 = makefraction ( curx , del ) ; dy1 = makefraction ( cury , del ) ; unskew ( dx2 , dy2 , mem [q ].hhfield .b1 ) ; del = pythadd ( curx , cury ) ; dx2 = makefraction ( curx , del ) ; dy2 = makefraction ( cury , del ) ; del = takefraction ( dx1 , dy2 ) - takefraction ( dx2 , dy1 ) ; if ( del > 4684844L ) clockwise = false ; else if ( del < -4684844L ) clockwise = true ; else clockwise = revturns ; } break ; case 6 : case -2 : clockwise = true ; break ; case 0 : clockwise = revturns ; break ; } while ( true ) { if ( clockwise ) if ( o1 == 1 ) o1 = 8 ; else decr ( o1 ) ; else if ( o1 == 8 ) o1 = 1 ; else incr ( o1 ) ; if ( o1 == o2 ) goto lab30 ; newboundary ( s , octantcode [o1 ]) ; s = mem [s ].hhfield .v.RH ; mem [s + 3 ].cint = mem [s + 5 ].cint ; } lab30: if ( q == r ) { q = mem [q ].hhfield .v.RH ; r = q ; p = s ; mem [s ].hhfield .v.RH = q ; mem [q + 3 ].cint = mem [q + 5 ].cint ; mem [q ].hhfield .b0 = 0 ; freenode ( curspec , 7 ) ; curspec = q ; } p = mem [p ].hhfield .v.RH ; do { s = mem [p ].hhfield .v.RH ; o1 = octantnumber [mem [p + 5 ].cint ]; o2 = octantnumber [mem [s + 3 ].cint ]; if ( abs ( o1 - o2 ) == 1 ) { if ( o2 < o1 ) o2 = o1 ; if ( odd ( o2 ) ) mem [p + 6 ].cint = 0 ; else mem [p + 6 ].cint = 1 ; } else { if ( o1 == 8 ) incr ( turningnumber ) ; else decr ( turningnumber ) ; mem [p + 6 ].cint = 0 ; } mem [s + 4 ].cint = mem [p + 6 ].cint ; p = s ; } while ( ! ( p == q ) ) ; } p = q ; q = r ; } while ( ! ( p == curspec ) ) ; while ( mem [curspec ].hhfield .b0 != 0 ) curspec = mem [curspec ] .hhfield .v.RH ; if ( tracing > 0 ) if ( internal [36 ]<= 0 ) printspec ( 559 ) ; else if ( internal [36 ]> 65536L ) printspec ( 560 ) ; else printspec ( 561 ) ; Result = curspec ; return Result ; } void #ifdef HAVE_PROTOTYPES zendround ( scaled x , scaled y ) #else zendround ( x , y ) scaled x ; scaled y ; #endif { y = y + 32768L - ycorr [octant ]; x = x + y - xcorr [octant ]; m1 = floorunscaled ( x ) ; n1 = floorunscaled ( y ) ; if ( x - 65536L * m1 >= y - 65536L * n1 + zcorr [octant ]) d1 = 1 ; else d1 = 0 ; } void #ifdef HAVE_PROTOTYPES zfillspec ( halfword h ) #else zfillspec ( h ) halfword h ; #endif { halfword p, q, r, s ; if ( internal [10 ]> 0 ) beginedgetracing () ; p = h ; do { octant = mem [p + 3 ].cint ; q = p ; while ( mem [q ].hhfield .b1 != 0 ) q = mem [q ].hhfield .v.RH ; if ( q != p ) { endround ( mem [p + 1 ].cint , mem [p + 2 ].cint ) ; m0 = m1 ; n0 = n1 ; d0 = d1 ; endround ( mem [q + 1 ].cint , mem [q + 2 ].cint ) ; if ( n1 - n0 >= movesize ) overflow ( 539 , movesize ) ; move [0 ]= d0 ; moveptr = 0 ; r = p ; do { s = mem [r ].hhfield .v.RH ; makemoves ( mem [r + 1 ].cint , mem [r + 5 ].cint , mem [s + 3 ] .cint , mem [s + 1 ].cint , mem [r + 2 ].cint + 32768L , mem [r + 6 ].cint + 32768L , mem [s + 4 ].cint + 32768L , mem [s + 2 ] .cint + 32768L , xycorr [octant ], ycorr [octant ]) ; r = s ; } while ( ! ( r == q ) ) ; move [moveptr ]= move [moveptr ]- d1 ; if ( internal [35 ]> 0 ) smoothmoves ( 0 , moveptr ) ; movetoedges ( m0 , n0 , m1 , n1 ) ; } p = mem [q ].hhfield .v.RH ; } while ( ! ( p == h ) ) ; tossknotlist ( h ) ; if ( internal [10 ]> 0 ) endedgetracing () ; } void #ifdef HAVE_PROTOTYPES zdupoffset ( halfword w ) #else zdupoffset ( w ) halfword w ; #endif { halfword r ; r = getnode ( 3 ) ; mem [r + 1 ].cint = mem [w + 1 ].cint ; mem [r + 2 ].cint = mem [w + 2 ].cint ; mem [r ].hhfield .v.RH = mem [w ].hhfield .v.RH ; mem [mem [w ].hhfield .v.RH ].hhfield .lhfield = r ; mem [r ].hhfield .lhfield = w ; mem [w ].hhfield .v.RH = r ; } halfword #ifdef HAVE_PROTOTYPES zmakepen ( halfword h ) #else zmakepen ( h ) halfword h ; #endif { /* 30 31 45 40 */ register halfword Result; smallnumber o, oo, k ; halfword p ; halfword q, r, s, w, hh ; integer n ; scaled dx, dy ; scaled mc ; q = h ; r = mem [q ].hhfield .v.RH ; mc = abs ( mem [h + 1 ].cint ) ; if ( q == r ) { hh = h ; mem [h ].hhfield .b1 = 0 ; if ( mc < abs ( mem [h + 2 ].cint ) ) mc = abs ( mem [h + 2 ].cint ) ; } else { o = 0 ; hh = 0 ; while ( true ) { s = mem [r ].hhfield .v.RH ; if ( mc < abs ( mem [r + 1 ].cint ) ) mc = abs ( mem [r + 1 ].cint ) ; if ( mc < abs ( mem [r + 2 ].cint ) ) mc = abs ( mem [r + 2 ].cint ) ; dx = mem [r + 1 ].cint - mem [q + 1 ].cint ; dy = mem [r + 2 ].cint - mem [q + 2 ].cint ; if ( dx == 0 ) if ( dy == 0 ) goto lab45 ; if ( abvscd ( dx , mem [s + 2 ].cint - mem [r + 2 ].cint , dy , mem [s + 1 ].cint - mem [r + 1 ].cint ) < 0 ) goto lab45 ; if ( dx > 0 ) octant = 1 ; else if ( dx == 0 ) if ( dy > 0 ) octant = 1 ; else octant = 2 ; else { dx = - (integer) dx ; octant = 2 ; } if ( dy < 0 ) { dy = - (integer) dy ; octant = octant + 2 ; } else if ( dy == 0 ) if ( octant > 1 ) octant = 4 ; if ( dx < dy ) octant = octant + 4 ; mem [q ].hhfield .b1 = octant ; oo = octantnumber [octant ]; if ( o > oo ) { if ( hh != 0 ) goto lab45 ; hh = q ; } o = oo ; if ( ( q == h ) && ( hh != 0 ) ) goto lab30 ; q = r ; r = s ; } lab30: ; } if ( mc >= 268402688L ) goto lab45 ; p = getnode ( 10 ) ; q = hh ; mem [p + 9 ].cint = mc ; mem [p ].hhfield .lhfield = 0 ; if ( mem [q ].hhfield .v.RH != q ) mem [p ].hhfield .v.RH = 1 ; {register integer for_end; k = 1 ;for_end = 8 ; if ( k <= for_end) do { octant = octantcode [k ]; n = 0 ; h = p + octant ; while ( true ) { r = getnode ( 3 ) ; skew ( mem [q + 1 ].cint , mem [q + 2 ].cint , octant ) ; mem [r + 1 ].cint = curx ; mem [r + 2 ].cint = cury ; if ( n == 0 ) mem [h ].hhfield .v.RH = r ; else if ( odd ( k ) ) { mem [w ].hhfield .v.RH = r ; mem [r ].hhfield .lhfield = w ; } else { mem [w ].hhfield .lhfield = r ; mem [r ].hhfield .v.RH = w ; } w = r ; if ( mem [q ].hhfield .b1 != octant ) goto lab31 ; q = mem [q ].hhfield .v.RH ; incr ( n ) ; } lab31: r = mem [h ].hhfield .v.RH ; if ( odd ( k ) ) { mem [w ].hhfield .v.RH = r ; mem [r ].hhfield .lhfield = w ; } else { mem [w ].hhfield .lhfield = r ; mem [r ].hhfield .v.RH = w ; mem [h ].hhfield .v.RH = w ; r = w ; } if ( ( mem [r + 2 ].cint != mem [mem [r ].hhfield .v.RH + 2 ].cint ) || ( n == 0 ) ) { dupoffset ( r ) ; incr ( n ) ; } r = mem [r ].hhfield .lhfield ; if ( mem [r + 1 ].cint != mem [mem [r ].hhfield .lhfield + 1 ] .cint ) dupoffset ( r ) ; else decr ( n ) ; if ( n >= 255 ) overflow ( 578 , 255 ) ; mem [h ].hhfield .lhfield = n ; } while ( k++ < for_end ) ;} goto lab40 ; lab45: p = 3 ; if ( mc >= 268402688L ) { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 572 ) ; } { helpptr = 2 ; helpline [1 ]= 573 ; helpline [0 ]= 574 ; } } else { { if ( interaction == 3 ) ; printnl ( 261 ) ; print ( 575 ) ; } { helpptr = 3 ; helpline [2 ]= 576 ; helpline [1 ]= 577 ; helpline [0 ]= 574 ; } } putgeterror () ; lab40: if ( internal [6 ]> 0 ) printpen ( p , 571 , true ) ; Result = p ; return Result ; } halfword #ifdef HAVE_PROTOTYPES ztrivialknot ( scaled x , scaled y ) #else ztrivialknot ( x , y ) scaled x ; scaled y ; #endif { register halfword Result; halfword p ; p = getnode ( 7 ) ; mem [p ].hhfield .b0 = 1 ; mem [p ].hhfield .b1 = 1 ; mem [p + 1 ].cint = x ; mem [p + 3 ].cint = x ; mem [p + 5 ].cint = x ; mem [p + 2 ].cint = y ; mem [p + 4 ].cint = y ; mem [p + 6 ].cint = y ; Result = p ; return Result ; } halfword #ifdef HAVE_PROTOTYPES zmakepath ( halfword penhead ) #else zmakepath ( penhead ) halfword penhead ; #endif { register halfword Result; halfword p ; char k ; halfword h ; integer m, n ; halfword w, ww ; p = memtop - 1 ; {register integer for_end; k = 1 ;for_end = 8 ; if ( k <= for_end) do { octant = octantcode [k ]; h = penhead + octant ; n = mem [h ].hhfield .lhfield ; w = mem [h ].hhfield .v.RH ; if ( ! odd ( k ) ) w = mem [w ].hhfield .lhfield ; {register integer for_end; m = 1 ;for_end = n + 1 ; if ( m <= for_end) do { if ( odd ( k ) ) ww = mem [w ].hhfield .v.RH ; else ww = mem [w ].hhfield .lhfield ; if ( ( mem [ww + 1 ].cint != mem [w + 1 ].cint ) || ( mem [ww + 2 ].cint != mem [w + 2 ].cint ) ) { unskew ( mem [ww + 1 ].cint , mem [ww + 2 ].cint , octant ) ; mem [p ].hhfield .v.RH = trivialknot ( curx , cury ) ; p = mem [p ].hhfield .v.RH ; } w = ww ; } while ( m++ < for_end ) ;} } while ( k++ < for_end ) ;} if ( p == memtop - 1 ) { w = mem [penhead + 1 ].hhfield .v.RH ; p = trivialknot ( mem [w + 1 ].cint + mem [w + 2 ].cint , mem [w + 2 ].cint ) ; mem [memtop - 1 ].hhfield .v.RH = p ; } mem [p ].hhfield .v.RH = mem [memtop - 1 ].hhfield .v.RH ; Result = mem [memtop - 1 ].hhfield .v.RH ; return Result ; } void #ifdef HAVE_PROTOTYPES zfindoffset ( scaled x , scaled y , halfword p ) #else zfindoffset ( x , y , p ) scaled x ; scaled y ; halfword p ; #endif { /* 30 10 */ char octant ; schar s ; integer n ; halfword h, w, ww ; if ( x > 0 ) octant = 1 ; else if ( x == 0 ) if ( y <= 0 ) if ( y == 0 ) { curx = 0 ; cury = 0 ; goto lab10 ; } else octant = 2 ; else octant = 1 ; else { x = - (integer) x ; if ( y == 0 ) octant = 4 ; else octant = 2 ; } if ( y < 0 ) { octant = octant + 2 ; y = - (integer) y ; } if ( x >= y ) x = x - y ; else { octant = octant + 4 ; x = y - x ; y = y - x ; } if ( odd ( octantnumber [octant ]) ) s = -1 ; else s = 1 ; h = p + octant ; w = mem [mem [h ].hhfield .v.RH ].hhfield .v.RH ; ww = mem [w ].hhfield .v.RH ; n = mem [h ].hhfield .lhfield ; while ( n > 1 ) { if ( abvscd ( x , mem [ww + 2 ].cint - mem [w + 2 ].cint , y , mem [ ww + 1 ].cint - mem [w + 1 ].cint ) != s ) goto lab30 ; w = ww ; ww = mem [w ].hhfield .v.RH ; decr ( n ) ; } lab30: unskew ( mem [w + 1 ].cint , mem [w + 2 ].cint , octant ) ; lab10: ; }