Plan 9 from Bell Labs’s /usr/web/sources/contrib/steve/root/sys/src/cmd/tex/web2c/mp/mp0.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#define EXTERN extern
#include "mpd.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 = 33 ; if ( k <= for_end) do 
    internal [k ]= 0 ;
  while ( k++ < for_end ) ;} 
  intptr = 33 ;
  {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 = 43 ;
  eqtb [1 ].v.RH = 0 ;
  {register integer for_end; k = 2 ;for_end = 9771 ; if ( k <= for_end) do 
    {
      hash [k ]= hash [1 ];
      eqtb [k ]= eqtb [1 ];
    } 
  while ( k++ < for_end ) ;} 
  bignodesize [12 ]= 12 ;
  bignodesize [14 ]= 4 ;
  bignodesize [13 ]= 6 ;
  sector0 [12 ]= 5 ;
  sector0 [14 ]= 5 ;
  sector0 [13 ]= 11 ;
  {register integer for_end; k = 5 ;for_end = 10 ; if ( k <= for_end) do 
    sectoroffset [k ]= 2 * ( k - 5 ) ;
  while ( k++ < for_end ) ;} 
  {register integer for_end; k = 11 ;for_end = 13 ; if ( k <= for_end) do 
    sectoroffset [k ]= 2 * ( k - 11 ) ;
  while ( k++ < for_end ) ;} 
  saveptr = 0 ;
  halfcos [0 ]= 134217728L ;
  halfcos [1 ]= 94906266L ;
  halfcos [2 ]= 0 ;
  dcos [0 ]= 35596755L ;
  dcos [1 ]= 25170707L ;
  dcos [2 ]= 0 ;
  {register integer for_end; k = 3 ;for_end = 4 ; if ( k <= for_end) do 
    {
      halfcos [k ]= - (integer) halfcos [4 - k ];
      dcos [k ]= - (integer) dcos [4 - k ];
    } 
  while ( k++ < for_end ) ;} 
  {register integer for_end; k = 5 ;for_end = 7 ; if ( k <= for_end) do 
    {
      halfcos [k ]= halfcos [8 - k ];
      dcos [k ]= dcos [8 - k ];
    } 
  while ( k++ < for_end ) ;} 
  grobjectsize [1 ]= 6 ;
  grobjectsize [2 ]= 8 ;
  grobjectsize [3 ]= 14 ;
  grobjectsize [4 ]= 2 ;
  grobjectsize [6 ]= 2 ;
  grobjectsize [5 ]= 2 ;
  grobjectsize [7 ]= 2 ;
  specp1 = 0 ;
  specp2 = 0 ;
  fixneeded = false ;
  watchcoefs = true ;
  condptr = 0 ;
  iflimit = 0 ;
  curif = 0 ;
  ifline = 0 ;
  loopptr = 0 ;
  curname = 284 ;
  curarea = 284 ;
  curext = 284 ;
  readfiles = 0 ;
  writefiles = 0 ;
  curexp = 0 ;
  varflag = 0 ;
  eofline = 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 [31 ]= -65536L ;
  bchlabel = ligtablesize ;
  labelloc [0 ]= -1 ;
  labelptr = 0 ;
  firstfilename = 284 ;
  lastfilename = 284 ;
  firstoutputcode = 32768L ;
  lastoutputcode = -32768L ;
  totalshipped = 0 ;
  lastpending = memtop - 3 ;
  memident = 0 ;
  editnamestart = 0 ;
} 
void 
#ifdef HAVE_PROTOTYPES
println ( void ) 
#else
println ( ) 
#endif
{
  switch ( selector ) 
  {case 10 : 
    {
      putc ('\n',  stdout );
      putc ('\n',  logfile );
      termoffset = 0 ;
      fileoffset = 0 ;
    } 
    break ;
  case 9 : 
    {
      putc ('\n',  logfile );
      fileoffset = 0 ;
    } 
    break ;
  case 8 : 
    {
      putc ('\n',  stdout );
      termoffset = 0 ;
    } 
    break ;
  case 5 : 
    {
      putc ('\n',  psfile );
      psoffset = 0 ;
    } 
    break ;
  case 7 : 
  case 6 : 
  case 4 : 
    ;
    break ;
    default: 
    putc ('\n',  wrfile [selector ]);
    break ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zprintvisiblechar ( ASCIIcode s ) 
#else
zprintvisiblechar ( s ) 
  ASCIIcode s ;
#endif
{
  /* 30 */ switch ( selector ) 
  {case 10 : 
    {
      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 9 : 
    {
      putc ( xchr [s ],  logfile );
      incr ( fileoffset ) ;
      if ( fileoffset == maxprintline ) 
      println () ;
    } 
    break ;
  case 8 : 
    {
      putc ( xchr [s ],  stdout );
      incr ( termoffset ) ;
      if ( termoffset == maxprintline ) 
      println () ;
    } 
    break ;
  case 5 : 
    {
      putc ( xchr [s ],  psfile );
      incr ( psoffset ) ;
    } 
    break ;
  case 7 : 
    ;
    break ;
  case 6 : 
    if ( tally < trickcount ) 
    trickbuf [tally % errorline ]= s ;
    break ;
  case 4 : 
    {
      if ( poolptr >= maxpoolptr ) 
      {
	unitstrroom () ;
	if ( poolptr >= poolsize ) 
	goto lab30 ;
      } 
      {
	strpool [poolptr ]= s ;
	incr ( poolptr ) ;
      } 
    } 
    break ;
    default: 
    putc ( xchr [s ],  wrfile [selector ]);
    break ;
  } 
  lab30: incr ( tally ) ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintchar ( ASCIIcode k ) 
#else
zprintchar ( k ) 
  ASCIIcode k ;
#endif
{
  unsigned char l  ;
  if ( selector < 6 ) 
  printvisiblechar ( k ) ;
  else if ( ( k < 32 ) || ( k > 126 ) ) 
  {
    printvisiblechar ( 94 ) ;
    printvisiblechar ( 94 ) ;
    if ( k < 64 ) 
    printvisiblechar ( k + 64 ) ;
    else if ( k < 128 ) 
    printvisiblechar ( k - 64 ) ;
    else {
	
      l = k / 16 ;
      if ( l < 10 ) 
      printvisiblechar ( l + 48 ) ;
      else printvisiblechar ( l + 87 ) ;
      l = k % 16 ;
      if ( l < 10 ) 
      printvisiblechar ( l + 48 ) ;
      else printvisiblechar ( l + 87 ) ;
    } 
  } 
  else printvisiblechar ( k ) ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprint ( integer s ) 
#else
zprint ( s ) 
  integer s ;
#endif
{
  poolpointer j  ;
  if ( ( s < 0 ) || ( s > maxstrptr ) ) 
  s = 260 ;
  j = strstart [s ];
  while ( j < strstart [nextstr [s ]]) {
      
    printchar ( strpool [j ]) ;
    incr ( j ) ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zprintnl ( strnumber s ) 
#else
zprintnl ( s ) 
  strnumber s ;
#endif
{
  switch ( selector ) 
  {case 10 : 
    if ( ( termoffset > 0 ) || ( fileoffset > 0 ) ) 
    println () ;
    break ;
  case 9 : 
    if ( fileoffset > 0 ) 
    println () ;
    break ;
  case 8 : 
    if ( termoffset > 0 ) 
    println () ;
    break ;
  case 5 : 
    if ( psoffset > 0 ) 
    println () ;
    break ;
  case 7 : 
  case 6 : 
  case 4 : 
    ;
    break ;
  } 
  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 ( 324 ) ;
    break ;
  case 2 : 
    print ( 325 ) ;
    break ;
  case 3 : 
    print ( 326 ) ;
    break ;
  case 4 : 
    print ( 259 ) ;
    break ;
  case 5 : 
    print ( 327 ) ;
    break ;
  case 6 : 
    print ( 328 ) ;
    break ;
  case 7 : 
    print ( 329 ) ;
    break ;
  case 8 : 
    print ( 330 ) ;
    break ;
  case 9 : 
    print ( 331 ) ;
    break ;
  case 10 : 
    print ( 332 ) ;
    break ;
  case 11 : 
    print ( 333 ) ;
    break ;
  case 12 : 
    print ( 334 ) ;
    break ;
  case 13 : 
    print ( 335 ) ;
    break ;
  case 14 : 
    print ( 336 ) ;
    break ;
  case 16 : 
    print ( 337 ) ;
    break ;
  case 17 : 
    print ( 338 ) ;
    break ;
  case 18 : 
    print ( 339 ) ;
    break ;
  case 15 : 
    print ( 340 ) ;
    break ;
  case 19 : 
    print ( 341 ) ;
    break ;
  case 20 : 
    print ( 342 ) ;
    break ;
  case 21 : 
    print ( 343 ) ;
    break ;
  case 22 : 
    print ( 344 ) ;
    break ;
  case 23 : 
    print ( 345 ) ;
    break ;
    default: 
    print ( 346 ) ;
    break ;
  } 
} 
integer 
#ifdef HAVE_PROTOTYPES
trueline ( void ) 
#else
trueline ( ) 
#endif
{
  register integer Result; integer k  ;
  if ( ( curinput .indexfield <= 15 ) && ( curinput .namefield > 2 ) ) 
  Result = linestack [curinput .indexfield ];
  else {
      
    k = inputptr ;
    while ( ( k > 0 ) && ( inputstack [k ].indexfield > 15 ) || ( inputstack 
    [k ].namefield <= 2 ) ) decr ( k ) ;
    Result = linestack [k ];
  } 
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
begindiagnostic ( void ) 
#else
begindiagnostic ( ) 
#endif
{
  oldsetting = selector ;
  if ( selector == 5 ) 
  selector = nonpssetting ;
  if ( ( internal [12 ]<= 0 ) && ( selector == 10 ) ) 
  {
    decr ( selector ) ;
    if ( history == 0 ) 
    history = 1 ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zenddiagnostic ( boolean blankline ) 
#else
zenddiagnostic ( blankline ) 
  boolean blankline ;
#endif
{
  printnl ( 284 ) ;
  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 ( 463 ) ;
  printint ( trueline () ) ;
  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
{
  
	;
#ifdef STAT
  poolinuse = poolinuse - ( strstart [nextstr [s ]]- strstart [s ]) ;
  decr ( strsinuse ) ;
#endif /* STAT */
  if ( nextstr [s ]!= strptr ) 
  strref [s ]= 0 ;
  else {
      
    strptr = s ;
    decr ( strsusedup ) ;
  } 
  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 ( 264 ) ;
      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 == 41 ) 
	  {
	    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 ]= 277 ;
	  helpline [0 ]= 278 ;
	} 
	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 [nextstr [inputstack [fileptr ]
	.namefield ]]- strstart [inputstack [fileptr ].namefield ]) ;
	editline = trueline () ;
	jumpout () ;
      } 
      break ;
    case 72 : 
      {
	if ( useerrhelp ) 
	{
	  j = strstart [errhelp ];
	  while ( j < strstart [nextstr [errhelp ]]) {
	      
	    if ( strpool [j ]!= 37 ) 
	    print ( strpool [j ]) ;
	    else if ( j + 1 == strstart [nextstr [errhelp ]]) 
	    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 ]= 279 ;
	    helpline [0 ]= 280 ;
	  } 
	  do {
	      decr ( helpptr ) ;
	    print ( helpline [helpptr ]) ;
	    println () ;
	  } while ( ! ( helpptr == 0 ) ) ;
	} 
	{
	  helpptr = 4 ;
	  helpline [3 ]= 281 ;
	  helpline [2 ]= 280 ;
	  helpline [1 ]= 282 ;
	  helpline [0 ]= 283 ;
	} 
	goto lab22 ;
      } 
      break ;
    case 73 : 
      {
	beginfilereading () ;
	if ( last > first + 1 ) 
	{
	  curinput .locfield = first + 1 ;
	  buffer [first ]= 32 ;
	} 
	else {
	    
	  {
	    ;
	    print ( 276 ) ;
	    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 ( 271 ) ;
	switch ( c ) 
	{case 81 : 
	  {
	    print ( 272 ) ;
	    decr ( selector ) ;
	  } 
	  break ;
	case 82 : 
	  print ( 273 ) ;
	  break ;
	case 83 : 
	  print ( 274 ) ;
	  break ;
	} 
	print ( 275 ) ;
	println () ;
	fflush ( stdout ) ;
	goto lab10 ;
      } 
      break ;
    case 88 : 
      {
	interaction = 2 ;
	jumpout () ;
      } 
      break ;
      default: 
      ;
      break ;
    } 
    {
      print ( 265 ) ;
      printnl ( 266 ) ;
      printnl ( 267 ) ;
      if ( fileptr > 0 ) 
      print ( 268 ) ;
      if ( deletionsallowed ) 
      printnl ( 269 ) ;
      printnl ( 270 ) ;
    } 
  } 
  incr ( errorcount ) ;
  if ( errorcount == 100 ) 
  {
    printnl ( 263 ) ;
    history = 3 ;
    jumpout () ;
  } 
  if ( interaction > 0 ) 
  decr ( selector ) ;
  if ( useerrhelp ) 
  {
    printnl ( 284 ) ;
    j = strstart [errhelp ];
    while ( j < strstart [nextstr [errhelp ]]) {
	
      if ( strpool [j ]!= 37 ) 
      print ( strpool [j ]) ;
      else if ( j + 1 == strstart [nextstr [errhelp ]]) 
      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 ( 262 ) ;
    print ( 285 ) ;
  } 
  {
    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 ( 262 ) ;
    print ( 286 ) ;
  } 
  print ( s ) ;
  printchar ( 61 ) ;
  printint ( n ) ;
  printchar ( 93 ) ;
  {
    helpptr = 2 ;
    helpline [1 ]= 287 ;
    helpline [0 ]= 288 ;
  } 
  {
    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 ( 262 ) ;
      print ( 289 ) ;
    } 
    print ( s ) ;
    printchar ( 41 ) ;
    {
      helpptr = 1 ;
      helpline [0 ]= 290 ;
    } 
  } 
  else {
      
    {
      if ( interaction == 3 ) 
      ;
      printnl ( 262 ) ;
      print ( 291 ) ;
    } 
    {
      helpptr = 2 ;
      helpline [1 ]= 292 ;
      helpline [0 ]= 293 ;
    } 
  } 
  {
    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 ;
} 
void 
#ifdef HAVE_PROTOTYPES
zdocompaction ( poolpointer needed ) 
#else
zdocompaction ( needed ) 
  poolpointer needed ;
#endif
{
  /* 30 */ strnumber struse  ;
  strnumber r, s, t  ;
  poolpointer p, q  ;
  t = nextstr [lastfixedstr ];
  while ( ( strref [t ]== 127 ) && ( t != strptr ) ) {
      
    incr ( fixedstruse ) ;
    lastfixedstr = t ;
    t = nextstr [t ];
  } 
  struse = fixedstruse ;
  r = lastfixedstr ;
  s = nextstr [r ];
  p = strstart [s ];
  while ( s != strptr ) {
      
    while ( strref [s ]== 0 ) {
	
      t = s ;
      s = nextstr [s ];
      nextstr [r ]= s ;
      nextstr [t ]= nextstr [strptr ];
      nextstr [strptr ]= t ;
      if ( s == strptr ) 
      goto lab30 ;
    } 
    r = s ;
    s = nextstr [s ];
    incr ( struse ) ;
    q = strstart [r ];
    strstart [r ]= p ;
    while ( q < strstart [s ]) {
	
      strpool [p ]= strpool [q ];
      incr ( p ) ;
      incr ( q ) ;
    } 
  } 
  lab30: q = strstart [strptr ];
  strstart [strptr ]= p ;
  while ( q < poolptr ) {
      
    strpool [p ]= strpool [q ];
    incr ( p ) ;
    incr ( q ) ;
  } 
  poolptr = p ;
  if ( needed < poolsize ) 
  {
    if ( struse >= maxstrings - 1 ) 
    {
      stroverflowed = true ;
      overflow ( 257 , maxstrings - 1 - initstruse ) ;
    } 
    if ( poolptr + needed > maxpoolptr ) 
    if ( poolptr + needed > poolsize ) 
    {
      stroverflowed = true ;
      overflow ( 258 , poolsize - initpoolptr ) ;
    } 
    else maxpoolptr = poolptr + needed ;
  } 
	;
#ifdef STAT
  if ( ( strstart [strptr ]!= poolinuse ) || ( struse != strsinuse ) ) 
  confusion ( 259 ) ;
  incr ( pactcount ) ;
  pactchars = pactchars + poolptr - strstart [nextstr [lastfixedstr ]];
  pactstrs = pactstrs + struse - fixedstruse ;
	;
#ifdef TEXMF_DEBUG
  s = strptr ;
  t = struse ;
  while ( s <= maxstrptr ) {
      
    if ( t > maxstrptr ) 
    confusion ( 34 ) ;
    incr ( t ) ;
    s = nextstr [s ];
  } 
  if ( t <= maxstrptr ) 
  confusion ( 34 ) ;
#endif /* TEXMF_DEBUG */
#endif /* STAT */
  strsusedup = struse ;
} 
void 
#ifdef HAVE_PROTOTYPES
unitstrroom ( void ) 
#else
unitstrroom ( ) 
#endif
{
  if ( poolptr >= poolsize ) 
  docompaction ( poolsize ) ;
  if ( poolptr >= maxpoolptr ) 
  maxpoolptr = poolptr + 1 ;
} 
strnumber 
#ifdef HAVE_PROTOTYPES
makestring ( void ) 
#else
makestring ( ) 
#endif
{
  /* 20 */ register strnumber Result; strnumber s  ;
  lab20: s = strptr ;
  strptr = nextstr [s ];
  if ( strptr > maxstrptr ) 
  if ( strptr == maxstrings ) 
  {
    strptr = s ;
    docompaction ( 0 ) ;
    goto lab20 ;
  } 
  else {
      
	;
#ifdef TEXMF_DEBUG
    if ( strsusedup != maxstrptr ) 
    confusion ( 115 ) ;
#endif /* TEXMF_DEBUG */
    maxstrptr = strptr ;
    nextstr [strptr ]= maxstrptr + 1 ;
  } 
  strref [s ]= 1 ;
  strstart [strptr ]= poolptr ;
  incr ( strsusedup ) ;
	;
#ifdef STAT
  incr ( strsinuse ) ;
  poolinuse = poolinuse + ( strstart [nextstr [s ]]- strstart [s ]) ;
  if ( poolinuse > maxplused ) 
  maxplused = poolinuse ;
  if ( strsinuse > maxstrsused ) 
  maxstrsused = strsinuse ;
#endif /* STAT */
  Result = s ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zchoplaststring ( poolpointer p ) 
#else
zchoplaststring ( p ) 
  poolpointer p ;
#endif
{
  
	;
#ifdef STAT
  poolinuse = poolinuse - ( strstart [strptr ]- p ) ;
#endif /* STAT */
  strstart [strptr ]= p ;
} 
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 [nextstr [s ]]) {
      
    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 [nextstr [s ]]- strstart [s ]) ;
  lt = ( strstart [nextstr [t ]]- 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 ( 261 ) ;
  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 = 10 ;
  else selector = 8 ;
  if ( jobname == 0 ) 
  openlogfile () ;
  if ( interaction == 0 ) 
  decr ( selector ) ;
} 
void 
#ifdef HAVE_PROTOTYPES
pauseforinstructions ( void ) 
#else
pauseforinstructions ( ) 
#endif
{
  if ( OKtointerrupt ) 
  {
    interaction = 3 ;
    if ( ( selector == 9 ) || ( selector == 7 ) ) 
    incr ( selector ) ;
    {
      if ( interaction == 3 ) 
      ;
      printnl ( 262 ) ;
      print ( 294 ) ;
    } 
    {
      helpptr = 3 ;
      helpline [2 ]= 295 ;
      helpline [1 ]= 296 ;
      helpline [0 ]= 297 ;
    } 
    deletionsallowed = false ;
    error () ;
    deletionsallowed = true ;
    interrupt = 0 ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zmissingerr ( strnumber s ) 
#else
zmissingerr ( s ) 
  strnumber s ;
#endif
{
  {
    if ( interaction == 3 ) 
    ;
    printnl ( 262 ) ;
    print ( 298 ) ;
  } 
  print ( s ) ;
  print ( 299 ) ;
} 
void 
#ifdef HAVE_PROTOTYPES
cleararith ( void ) 
#else
cleararith ( ) 
#endif
{
  {
    if ( interaction == 3 ) 
    ;
    printnl ( 262 ) ;
    print ( 300 ) ;
  } 
  {
    helpptr = 4 ;
    helpline [3 ]= 301 ;
    helpline [2 ]= 302 ;
    helpline [1 ]= 303 ;
    helpline [0 ]= 304 ;
  } 
  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 ( 262 ) ;
	print ( 305 ) ;
      } 
      printscaled ( x ) ;
      print ( 306 ) ;
      {
	helpptr = 2 ;
	helpline [1 ]= 307 ;
	helpline [0 ]= 308 ;
      } 
      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 ( 262 ) ;
	print ( 309 ) ;
      } 
      printscaled ( a ) ;
      print ( 310 ) ;
      printscaled ( b ) ;
      print ( 306 ) ;
      {
	helpptr = 2 ;
	helpline [1 ]= 307 ;
	helpline [0 ]= 308 ;
      } 
      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 ( 262 ) ;
      print ( 311 ) ;
    } 
    printscaled ( x ) ;
    print ( 306 ) ;
    {
      helpptr = 2 ;
      helpline [1 ]= 312 ;
      helpline [0 ]= 308 ;
    } 
    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 ( 262 ) ;
      print ( 313 ) ;
    } 
    {
      helpptr = 2 ;
      helpline [1 ]= 314 ;
      helpline [0 ]= 308 ;
    } 
    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 ( 505 ) ;
      goto lab10 ;
    } 
    if ( p < himemmin ) 
    if ( mem [p ].hhfield .b1 == 15 ) 
    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 ( 508 ) ;
    else {
	
      printchar ( 34 ) ;
      print ( mem [p + 1 ].cint ) ;
      printchar ( 34 ) ;
      c = 4 ;
    } 
    else if ( ( mem [p ].hhfield .b1 != 14 ) || ( mem [p ].hhfield .b0 < 1 
    ) || ( mem [p ].hhfield .b0 > 19 ) ) 
    print ( 508 ) ;
    else {
	
      gpointer = p ;
      printcapsule () ;
      c = 8 ;
    } 
    else {
	
      r = mem [p ].hhfield .lhfield ;
      if ( r >= 9772 ) 
      {
	if ( r < 9922 ) 
	{
	  print ( 510 ) ;
	  r = r - ( 9772 ) ;
	} 
	else if ( r < 10072 ) 
	{
	  print ( 511 ) ;
	  r = r - ( 9922 ) ;
	} 
	else {
	    
	  print ( 512 ) ;
	  r = r - ( 10072 ) ;
	} 
	printint ( r ) ;
	printchar ( 41 ) ;
	c = 8 ;
      } 
      else if ( r < 1 ) 
      if ( r == 0 ) 
      {
	if ( class == 17 ) 
	printchar ( 32 ) ;
	print ( 509 ) ;
	c = 18 ;
      } 
      else print ( 506 ) ;
      else {
	  
	r = hash [r ].v.RH ;
	if ( ( r < 0 ) || ( r > maxstrptr ) ) 
	print ( 507 ) ;
	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 ( 504 ) ;
  lab10: ;
} 
void 
#ifdef HAVE_PROTOTYPES
runaway ( void ) 
#else
runaway ( ) 
#endif
{
  if ( scannerstatus > 2 ) 
  {
    printnl ( 658 ) ;
    switch ( scannerstatus ) 
    {case 3 : 
      print ( 659 ) ;
      break ;
    case 4 : 
    case 5 : 
      print ( 660 ) ;
      break ;
    case 6 : 
      print ( 661 ) ;
      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 ( 315 , 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 ( 315 , 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 33 */ 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 ( 316 ) ;
      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 ( 317 ) ;
      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 ( 318 ) ;
	  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 ( 319 ) ;
      printint ( p ) ;
    } 
    while ( ( p <= lomemmax ) && ! freearr [p ]) incr ( p ) ;
    while ( ( p <= lomemmax ) && freearr [p ]) incr ( p ) ;
  } 
  q = 5 ;
  p = mem [q ].hhfield .v.RH ;
  while ( p != 5 ) {
      
    if ( mem [p + 1 ].hhfield .lhfield != q ) 
    {
      printnl ( 609 ) ;
      printint ( p ) ;
    } 
    p = mem [p + 1 ].hhfield .v.RH ;
    while ( true ) {
	
      r = mem [p ].hhfield .lhfield ;
      q = p ;
      p = mem [q ].hhfield .v.RH ;
      if ( r == 0 ) 
      goto lab33 ;
      if ( mem [mem [p ].hhfield .lhfield + 1 ].cint >= mem [r + 1 ]
      .cint ) 
      {
	printnl ( 610 ) ;
	printint ( p ) ;
      } 
    } 
    lab33: ;
  } 
  if ( printlocs ) 
  {
    q = memmax ;
    r = memmax ;
    printnl ( 320 ) ;
    {register integer for_end; p = 0 ;for_end = lomemmax ; if ( p <= 
    for_end) do 
      if ( ! freearr [p ]&& ( ( p > waslomax ) || wasfree [p ]) ) 
      {
	if ( p > q + 1 ) 
	{
	  if ( q > r ) 
	  {
	    print ( 321 ) ;
	    printint ( q ) ;
	  } 
	  printchar ( 32 ) ;
	  printint ( p ) ;
	  r = p ;
	} 
	q = 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 ]) ) 
      {
	if ( p > q + 1 ) 
	{
	  if ( q > r ) 
	  {
	    print ( 321 ) ;
	    printint ( q ) ;
	  } 
	  printchar ( 32 ) ;
	  printint ( p ) ;
	  r = p ;
	} 
	q = p ;
      } 
    while ( p++ < for_end ) ;} 
    if ( q > r ) 
    {
      print ( 321 ) ;
      printint ( q ) ;
    } 
  } 
  {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 ( 322 ) ;
	printint ( q ) ;
	printchar ( 41 ) ;
      } 
      if ( mem [q ].hhfield .lhfield == p ) 
      {
	printnl ( 323 ) ;
	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 ( 322 ) ;
	printint ( q ) ;
	printchar ( 41 ) ;
      } 
      if ( mem [q ].hhfield .lhfield == p ) 
      {
	printnl ( 323 ) ;
	printint ( q ) ;
	printchar ( 41 ) ;
      } 
    } 
  while ( q++ < for_end ) ;} 
  {register integer for_end; q = 1 ;for_end = 9771 ; if ( q <= for_end) do 
    {
      if ( eqtb [q ].v.RH == p ) 
      {
	printnl ( 473 ) ;
	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 ( 347 ) ;
    break ;
  case 31 : 
    print ( 348 ) ;
    break ;
  case 32 : 
    print ( 349 ) ;
    break ;
  case 33 : 
    print ( 350 ) ;
    break ;
  case 34 : 
    print ( 351 ) ;
    break ;
  case 35 : 
    print ( 352 ) ;
    break ;
  case 36 : 
    print ( 353 ) ;
    break ;
  case 37 : 
    print ( 354 ) ;
    break ;
  case 38 : 
    print ( 355 ) ;
    break ;
  case 39 : 
    print ( 356 ) ;
    break ;
  case 40 : 
    print ( 357 ) ;
    break ;
  case 41 : 
    print ( 358 ) ;
    break ;
  case 42 : 
    print ( 359 ) ;
    break ;
  case 43 : 
    print ( 360 ) ;
    break ;
  case 44 : 
    print ( 361 ) ;
    break ;
  case 45 : 
    print ( 362 ) ;
    break ;
  case 46 : 
    print ( 363 ) ;
    break ;
  case 47 : 
    print ( 364 ) ;
    break ;
  case 48 : 
    print ( 365 ) ;
    break ;
  case 49 : 
    print ( 366 ) ;
    break ;
  case 50 : 
    print ( 367 ) ;
    break ;
  case 51 : 
    print ( 368 ) ;
    break ;
  case 52 : 
    print ( 369 ) ;
    break ;
  case 53 : 
    print ( 370 ) ;
    break ;
  case 54 : 
    print ( 371 ) ;
    break ;
  case 55 : 
    print ( 372 ) ;
    break ;
  case 56 : 
    print ( 373 ) ;
    break ;
  case 57 : 
    print ( 374 ) ;
    break ;
  case 58 : 
    print ( 375 ) ;
    break ;
  case 59 : 
    print ( 376 ) ;
    break ;
  case 60 : 
    print ( 377 ) ;
    break ;
  case 61 : 
    print ( 378 ) ;
    break ;
  case 62 : 
    print ( 379 ) ;
    break ;
  case 63 : 
    print ( 380 ) ;
    break ;
  case 64 : 
    print ( 381 ) ;
    break ;
  case 65 : 
    print ( 382 ) ;
    break ;
  case 66 : 
    print ( 383 ) ;
    break ;
  case 67 : 
    print ( 384 ) ;
    break ;
  case 68 : 
    print ( 385 ) ;
    break ;
  case 69 : 
    print ( 386 ) ;
    break ;
  case 70 : 
    print ( 387 ) ;
    break ;
  case 71 : 
    print ( 388 ) ;
    break ;
  case 72 : 
    print ( 389 ) ;
    break ;
  case 73 : 
    print ( 390 ) ;
    break ;
  case 74 : 
    print ( 391 ) ;
    break ;
  case 75 : 
    print ( 392 ) ;
    break ;
  case 76 : 
    print ( 393 ) ;
    break ;
  case 77 : 
    print ( 394 ) ;
    break ;
  case 78 : 
    print ( 395 ) ;
    break ;
  case 79 : 
    print ( 396 ) ;
    break ;
  case 80 : 
    print ( 397 ) ;
    break ;
  case 81 : 
    print ( 398 ) ;
    break ;
  case 82 : 
    print ( 399 ) ;
    break ;
  case 83 : 
    print ( 400 ) ;
    break ;
  case 84 : 
    print ( 401 ) ;
    break ;
  case 85 : 
    print ( 402 ) ;
    break ;
  case 86 : 
    print ( 403 ) ;
    break ;
  case 87 : 
    print ( 404 ) ;
    break ;
  case 88 : 
    print ( 405 ) ;
    break ;
  case 89 : 
    printchar ( 43 ) ;
    break ;
  case 90 : 
    printchar ( 45 ) ;
    break ;
  case 91 : 
    printchar ( 42 ) ;
    break ;
  case 92 : 
    printchar ( 47 ) ;
    break ;
  case 93 : 
    print ( 406 ) ;
    break ;
  case 94 : 
    print ( 310 ) ;
    break ;
  case 95 : 
    print ( 407 ) ;
    break ;
  case 96 : 
    print ( 408 ) ;
    break ;
  case 97 : 
    printchar ( 60 ) ;
    break ;
  case 98 : 
    print ( 409 ) ;
    break ;
  case 99 : 
    printchar ( 62 ) ;
    break ;
  case 100 : 
    print ( 410 ) ;
    break ;
  case 101 : 
    printchar ( 61 ) ;
    break ;
  case 102 : 
    print ( 411 ) ;
    break ;
  case 103 : 
    print ( 38 ) ;
    break ;
  case 104 : 
    print ( 412 ) ;
    break ;
  case 105 : 
    print ( 413 ) ;
    break ;
  case 106 : 
    print ( 414 ) ;
    break ;
  case 107 : 
    print ( 415 ) ;
    break ;
  case 108 : 
    print ( 416 ) ;
    break ;
  case 109 : 
    print ( 417 ) ;
    break ;
  case 110 : 
    print ( 418 ) ;
    break ;
  case 111 : 
    print ( 419 ) ;
    break ;
  case 112 : 
    print ( 420 ) ;
    break ;
  case 113 : 
    print ( 421 ) ;
    break ;
  case 115 : 
    print ( 422 ) ;
    break ;
  case 116 : 
    print ( 423 ) ;
    break ;
  case 117 : 
    print ( 424 ) ;
    break ;
  case 118 : 
    print ( 425 ) ;
    break ;
  case 119 : 
    print ( 426 ) ;
    break ;
  case 120 : 
    print ( 427 ) ;
    break ;
  case 121 : 
    print ( 428 ) ;
    break ;
  case 122 : 
    print ( 429 ) ;
    break ;
    default: 
    print ( 321 ) ;
    break ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
fixdateandtime ( void ) 
#else
fixdateandtime ( ) 
#endif
{
  dateandtime ( internal [16 ], internal [15 ], internal [14 ], 
  internal [13 ]) ;
  internal [16 ]= internal [16 ]* 65536L ;
  internal [15 ]= internal [15 ]* 65536L ;
  internal [14 ]= internal [14 ]* 65536L ;
  internal [13 ]= internal [13 ]* 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 [nextstr [hash [p ].v.RH ]]- 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 ( 472 , 9500 ) ;
	  decr ( hashused ) ;
	} while ( ! ( hash [hashused ].v.RH == 0 ) ) ;
	hash [p ].lhfield = hashused ;
	p = hashused ;
      } 
      {
	if ( poolptr + l > maxpoolptr ) 
	if ( poolptr + l > poolsize ) 
	docompaction ( l ) ;
	else 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 = 15 ;
  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 11 : 
      case 9 : 
      case 6 : 
      case 8 : 
      case 10 : 
      case 14 : 
      case 13 : 
      case 12 : 
      case 17 : 
      case 18 : 
      case 19 : 
	{
	  gpointer = q ;
	  tokenrecycle () ;
	} 
	break ;
	default: 
	confusion ( 503 ) ;
	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 20 : 
    print ( 477 ) ;
    break ;
  case 76 : 
    print ( 476 ) ;
    break ;
  case 61 : 
    print ( 478 ) ;
    break ;
  case 78 : 
    print ( 475 ) ;
    break ;
  case 34 : 
    print ( 479 ) ;
    break ;
  case 80 : 
    print ( 58 ) ;
    break ;
  case 81 : 
    print ( 44 ) ;
    break ;
  case 59 : 
    print ( 480 ) ;
    break ;
  case 62 : 
    print ( 481 ) ;
    break ;
  case 29 : 
    print ( 482 ) ;
    break ;
  case 79 : 
    print ( 474 ) ;
    break ;
  case 83 : 
    print ( 468 ) ;
    break ;
  case 28 : 
    print ( 483 ) ;
    break ;
  case 9 : 
    print ( 484 ) ;
    break ;
  case 12 : 
    print ( 485 ) ;
    break ;
  case 15 : 
    print ( 486 ) ;
    break ;
  case 48 : 
    print ( 123 ) ;
    break ;
  case 65 : 
    print ( 91 ) ;
    break ;
  case 16 : 
    print ( 487 ) ;
    break ;
  case 17 : 
    print ( 488 ) ;
    break ;
  case 70 : 
    print ( 489 ) ;
    break ;
  case 49 : 
    print ( 321 ) ;
    break ;
  case 26 : 
    print ( 490 ) ;
    break ;
  case 10 : 
    printchar ( 92 ) ;
    break ;
  case 67 : 
    print ( 125 ) ;
    break ;
  case 66 : 
    print ( 93 ) ;
    break ;
  case 14 : 
    print ( 491 ) ;
    break ;
  case 11 : 
    print ( 492 ) ;
    break ;
  case 82 : 
    print ( 59 ) ;
    break ;
  case 19 : 
    print ( 493 ) ;
    break ;
  case 77 : 
    print ( 494 ) ;
    break ;
  case 30 : 
    print ( 495 ) ;
    break ;
  case 72 : 
    print ( 496 ) ;
    break ;
  case 37 : 
    print ( 497 ) ;
    break ;
  case 60 : 
    print ( 498 ) ;
    break ;
  case 71 : 
    print ( 499 ) ;
    break ;
  case 73 : 
    print ( 500 ) ;
    break ;
  case 74 : 
    print ( 501 ) ;
    break ;
  case 31 : 
    print ( 502 ) ;
    break ;
  case 1 : 
    if ( m == 0 ) 
    print ( 681 ) ;
    else print ( 682 ) ;
    break ;
  case 2 : 
    print ( 465 ) ;
    break ;
  case 3 : 
    print ( 466 ) ;
    break ;
  case 18 : 
    if ( m <= 2 ) 
    if ( m == 1 ) 
    print ( 695 ) ;
    else if ( m < 1 ) 
    print ( 469 ) ;
    else print ( 696 ) ;
    else if ( m == 55 ) 
    print ( 697 ) ;
    else if ( m == 46 ) 
    print ( 698 ) ;
    else print ( 699 ) ;
    break ;
  case 7 : 
    if ( m <= 1 ) 
    if ( m == 1 ) 
    print ( 702 ) ;
    else print ( 470 ) ;
    else if ( m == 9772 ) 
    print ( 700 ) ;
    else print ( 701 ) ;
    break ;
  case 63 : 
    switch ( m ) 
    {case 1 : 
      print ( 704 ) ;
      break ;
    case 2 : 
      printchar ( 64 ) ;
      break ;
    case 3 : 
      print ( 705 ) ;
      break ;
      default: 
      print ( 703 ) ;
      break ;
    } 
    break ;
  case 58 : 
    if ( m >= 9772 ) 
    if ( m == 9772 ) 
    print ( 716 ) ;
    else if ( m == 9922 ) 
    print ( 717 ) ;
    else print ( 718 ) ;
    else if ( m < 2 ) 
    print ( 719 ) ;
    else if ( m == 2 ) 
    print ( 720 ) ;
    else print ( 721 ) ;
    break ;
  case 6 : 
    if ( m == 0 ) 
    print ( 731 ) ;
    else print ( 628 ) ;
    break ;
  case 4 : 
  case 5 : 
    switch ( m ) 
    {case 1 : 
      print ( 758 ) ;
      break ;
    case 2 : 
      print ( 467 ) ;
      break ;
    case 3 : 
      print ( 759 ) ;
      break ;
      default: 
      print ( 760 ) ;
      break ;
    } 
    break ;
  case 35 : 
  case 36 : 
  case 39 : 
  case 57 : 
  case 47 : 
  case 52 : 
  case 38 : 
  case 45 : 
  case 56 : 
  case 50 : 
  case 53 : 
  case 54 : 
    printop ( m ) ;
    break ;
  case 32 : 
    printtype ( m ) ;
    break ;
  case 84 : 
    if ( m == 0 ) 
    print ( 960 ) ;
    else print ( 961 ) ;
    break ;
  case 25 : 
    switch ( m ) 
    {case 0 : 
      print ( 272 ) ;
      break ;
    case 1 : 
      print ( 273 ) ;
      break ;
    case 2 : 
      print ( 274 ) ;
      break ;
      default: 
      print ( 967 ) ;
      break ;
    } 
    break ;
  case 23 : 
    if ( m == 0 ) 
    print ( 968 ) ;
    else print ( 969 ) ;
    break ;
  case 24 : 
    switch ( m ) 
    {case 0 : 
      print ( 983 ) ;
      break ;
    case 1 : 
      print ( 984 ) ;
      break ;
    case 2 : 
      print ( 985 ) ;
      break ;
    case 3 : 
      print ( 986 ) ;
      break ;
      default: 
      print ( 987 ) ;
      break ;
    } 
    break ;
  case 33 : 
  case 64 : 
    {
      if ( c == 33 ) 
      print ( 990 ) ;
      else print ( 991 ) ;
      print ( 992 ) ;
      print ( hash [m ].v.RH ) ;
    } 
    break ;
  case 43 : 
    if ( m == 0 ) 
    print ( 993 ) ;
    else print ( 994 ) ;
    break ;
  case 13 : 
    print ( 995 ) ;
    break ;
  case 55 : 
  case 46 : 
  case 51 : 
    {
      printcmdmod ( 18 , c ) ;
      print ( 996 ) ;
      println () ;
      showtokenlist ( mem [mem [m ].hhfield .v.RH ].hhfield .v.RH , 0 , 
      1000 , 0 ) ;
    } 
    break ;
  case 8 : 
    print ( 997 ) ;
    break ;
  case 42 : 
    print ( intname [m ]) ;
    break ;
  case 69 : 
    if ( m == 1 ) 
    print ( 1007 ) ;
    else if ( m == 0 ) 
    print ( 1006 ) ;
    else print ( 1008 ) ;
    break ;
  case 68 : 
    if ( m == 6 ) 
    print ( 1009 ) ;
    else if ( m == 13 ) 
    print ( 1011 ) ;
    else print ( 1010 ) ;
    break ;
  case 21 : 
    if ( m == 4 ) 
    print ( 1020 ) ;
    else print ( 1021 ) ;
    break ;
  case 27 : 
    if ( m < 1 ) 
    print ( 1034 ) ;
    else if ( m == 1 ) 
    print ( 1035 ) ;
    else print ( 1036 ) ;
    break ;
  case 22 : 
    switch ( m ) 
    {case 0 : 
      print ( 1051 ) ;
      break ;
    case 1 : 
      print ( 1052 ) ;
      break ;
    case 2 : 
      print ( 1053 ) ;
      break ;
    case 3 : 
      print ( 1054 ) ;
      break ;
      default: 
      print ( 1055 ) ;
      break ;
    } 
    break ;
  case 75 : 
    switch ( m ) 
    {case 0 : 
      print ( 1073 ) ;
      break ;
    case 1 : 
      print ( 1074 ) ;
      break ;
    case 2 : 
      print ( 1076 ) ;
      break ;
    case 3 : 
      print ( 1078 ) ;
      break ;
    case 5 : 
      print ( 1075 ) ;
      break ;
    case 6 : 
      print ( 1077 ) ;
      break ;
    case 7 : 
      print ( 1079 ) ;
      break ;
    case 11 : 
      print ( 1080 ) ;
      break ;
      default: 
      print ( 1081 ) ;
      break ;
    } 
    break ;
    default: 
    print ( 614 ) ;
    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 ( 513 ) ;
    break ;
  case 1 : 
  case 2 : 
  case 3 : 
    {
      printchar ( 60 ) ;
      printcmdmod ( 58 , mem [p ].hhfield .lhfield ) ;
      print ( 514 ) ;
    } 
    break ;
  case 4 : 
    print ( 515 ) ;
    break ;
  case 5 : 
    print ( 516 ) ;
    break ;
  case 6 : 
    print ( 517 ) ;
    break ;
  case 7 : 
    print ( 518 ) ;
    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 ) + sector0 [mem [p ].hhfield 
    .b0 ];
    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 = 12 ;
  mem [p ].hhfield .b1 = 14 ;
  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 ( 521 ) ;
      break ;
    case 8 : 
      print ( 522 ) ;
      break ;
    case 9 : 
      print ( 523 ) ;
      break ;
    case 10 : 
      print ( 524 ) ;
      break ;
    case 11 : 
      print ( 525 ) ;
      break ;
    case 12 : 
      print ( 526 ) ;
      break ;
    case 13 : 
      print ( 527 ) ;
      break ;
    case 14 : 
      {
	print ( 528 ) ;
	printint ( p - 0 ) ;
	goto lab10 ;
      } 
      break ;
    } 
    print ( 529 ) ;
    p = mem [p - sectoroffset [mem [p ].hhfield .b1 ]].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 ( 520 ) ;
      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 ( 519 ) ;
  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 != 14 ) 
    t = mem [mem [p - sectoroffset [t ]].hhfield .v.RH ].hhfield .b1 ;
    Result = ( t != 14 ) ;
  } 
  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 ( 530 ) ;
    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 = 9 ;
  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 % 85 != 43 ) 
  {
    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
zprpath ( halfword h ) 
#else
zprpath ( h ) 
  halfword h ;
#endif
{
  /* 30 31 */ halfword p, q  ;
  p = h ;
  do {
      q = mem [p ].hhfield .v.RH ;
    if ( ( p == 0 ) || ( q == 0 ) ) 
    {
      printnl ( 260 ) ;
      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 ( 532 ) ;
	if ( ( mem [q ].hhfield .b0 != 0 ) || ( q != h ) ) 
	q = 0 ;
	goto lab31 ;
      } 
      break ;
    case 1 : 
      {
	print ( 538 ) ;
	printtwo ( mem [p + 5 ].cint , mem [p + 6 ].cint ) ;
	print ( 537 ) ;
	if ( mem [q ].hhfield .b0 != 1 ) 
	print ( 539 ) ;
	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 ( 532 ) ;
      break ;
    case 3 : 
    case 2 : 
      {
	if ( mem [p ].hhfield .b0 == 4 ) 
	print ( 539 ) ;
	if ( mem [p ].hhfield .b1 == 3 ) 
	{
	  print ( 535 ) ;
	  printscaled ( mem [p + 5 ].cint ) ;
	} 
	else {
	    
	  nsincos ( mem [p + 5 ].cint ) ;
	  printchar ( 123 ) ;
	  printscaled ( ncos ) ;
	  printchar ( 44 ) ;
	  printscaled ( nsin ) ;
	} 
	printchar ( 125 ) ;
      } 
      break ;
      default: 
      print ( 260 ) ;
      break ;
    } 
    if ( mem [q ].hhfield .b0 <= 1 ) 
    print ( 533 ) ;
    else if ( ( mem [p + 6 ].cint != 65536L ) || ( mem [q + 4 ].cint != 
    65536L ) ) 
    {
      print ( 536 ) ;
      if ( mem [p + 6 ].cint < 0 ) 
      print ( 478 ) ;
      printscaled ( abs ( mem [p + 6 ].cint ) ) ;
      if ( mem [p + 6 ].cint != mem [q + 4 ].cint ) 
      {
	print ( 537 ) ;
	if ( mem [q + 4 ].cint < 0 ) 
	print ( 478 ) ;
	printscaled ( abs ( mem [q + 4 ].cint ) ) ;
      } 
    } 
    lab31: ;
    p = q ;
    if ( ( p != h ) || ( mem [h ].hhfield .b0 != 0 ) ) 
    {
      printnl ( 534 ) ;
      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 ( 535 ) ;
	printscaled ( mem [p + 3 ].cint ) ;
	printchar ( 125 ) ;
      } 
    } 
  } while ( ! ( p == h ) ) ;
  if ( mem [h ].hhfield .b0 != 0 ) 
  print ( 400 ) ;
  lab30: ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintpath ( halfword h , strnumber s , boolean nuline ) 
#else
zprintpath ( h , s , nuline ) 
  halfword h ;
  strnumber s ;
  boolean nuline ;
#endif
{
  printdiagnostic ( 540 , s , nuline ) ;
  println () ;
  prpath ( h ) ;
  enddiagnostic ( true ) ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprpen ( halfword h ) 
#else
zprpen ( h ) 
  halfword h ;
#endif
{
  /* 30 */ halfword p, q  ;
  if ( ( h == mem [h ].hhfield .v.RH ) ) 
  {
    print ( 549 ) ;
    printscaled ( mem [h + 1 ].cint ) ;
    printchar ( 44 ) ;
    printscaled ( mem [h + 2 ].cint ) ;
    printchar ( 44 ) ;
    printscaled ( mem [h + 3 ].cint - mem [h + 1 ].cint ) ;
    printchar ( 44 ) ;
    printscaled ( mem [h + 5 ].cint - mem [h + 1 ].cint ) ;
    printchar ( 44 ) ;
    printscaled ( mem [h + 4 ].cint - mem [h + 2 ].cint ) ;
    printchar ( 44 ) ;
    printscaled ( mem [h + 6 ].cint - mem [h + 2 ].cint ) ;
    printchar ( 41 ) ;
  } 
  else {
      
    p = h ;
    do {
	printtwo ( mem [p + 1 ].cint , mem [p + 2 ].cint ) ;
      printnl ( 548 ) ;
      q = mem [p ].hhfield .v.RH ;
      if ( ( q == 0 ) || ( mem [q ].hhfield .lhfield != p ) ) 
      {
	printnl ( 260 ) ;
	goto lab30 ;
      } 
      p = q ;
    } while ( ! ( p == h ) ) ;
    print ( 400 ) ;
  } 
  lab30: ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintpen ( halfword h , strnumber s , boolean nuline ) 
#else
zprintpen ( h , s , nuline ) 
  halfword h ;
  strnumber s ;
  boolean nuline ;
#endif
{
  printdiagnostic ( 550 , s , nuline ) ;
  println () ;
  prpen ( h ) ;
  enddiagnostic ( true ) ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zsqrtdet ( scaled a , scaled b , scaled c , scaled d ) 
#else
zsqrtdet ( a , b , c , d ) 
  scaled a ;
  scaled b ;
  scaled c ;
  scaled d ;
#endif
{
  register scaled Result; scaled maxabs  ;
  integer s  ;
  maxabs = abs ( a ) ;
  if ( abs ( b ) > maxabs ) 
  maxabs = abs ( b ) ;
  if ( abs ( c ) > maxabs ) 
  maxabs = abs ( c ) ;
  if ( abs ( d ) > maxabs ) 
  maxabs = abs ( d ) ;
  s = 64 ;
  while ( ( maxabs < 268435456L ) && ( s > 1 ) ) {
      
    a = a + a ;
    b = b + b ;
    c = c + c ;
    d = d + d ;
    maxabs = maxabs + maxabs ;
    s = halfp ( s ) ;
  } 
  Result = s * squarert ( abs ( takefraction ( a , d ) - takefraction ( b , c 
  ) ) ) ;
  return Result ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zgetpenscale ( halfword p ) 
#else
zgetpenscale ( p ) 
  halfword p ;
#endif
{
  register scaled Result; Result = sqrtdet ( mem [p + 3 ].cint - mem [p + 
  1 ].cint , mem [p + 5 ].cint - mem [p + 1 ].cint , mem [p + 4 ].cint 
  - mem [p + 2 ].cint , mem [p + 6 ].cint - mem [p + 2 ].cint ) ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintcompactnode ( halfword p , smallnumber k ) 
#else
zprintcompactnode ( p , k ) 
  halfword p ;
  smallnumber k ;
#endif
{
  halfword q  ;
  q = p + k - 1 ;
  printchar ( 40 ) ;
  while ( p <= q ) {
      
    printscaled ( mem [p ].cint ) ;
    if ( p < q ) 
    printchar ( 44 ) ;
    incr ( p ) ;
  } 
  printchar ( 41 ) ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintobjcolor ( halfword p ) 
#else
zprintobjcolor ( p ) 
  halfword p ;
#endif
{
  if ( ( mem [p + 2 ].cint > 0 ) || ( mem [p + 3 ].cint > 0 ) || ( mem [
  p + 4 ].cint > 0 ) ) 
  {
    print ( 565 ) ;
    printcompactnode ( p + 2 , 3 ) ;
  } 
} 
scaled 
#ifdef HAVE_PROTOTYPES
zdashoffset ( halfword h ) 
#else
zdashoffset ( h ) 
  halfword h ;
#endif
{
  register scaled Result; scaled x  ;
  if ( ( mem [h ].hhfield .v.RH == 2 ) || ( mem [h + 1 ].cint < 0 ) ) 
  confusion ( 573 ) ;
  if ( mem [h + 1 ].cint == 0 ) 
  x = 0 ;
  else {
      
    x = - (integer) ( mem [mem [h ].hhfield .v.RH + 1 ].cint % mem [h + 1 
    ].cint ) ;
    if ( x < 0 ) 
    x = x + mem [h + 1 ].cint ;
  } 
  Result = x ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintedges ( halfword h , strnumber s , boolean nuline ) 
#else
zprintedges ( h , s , nuline ) 
  halfword h ;
  strnumber s ;
  boolean nuline ;
#endif
{
  halfword p  ;
  halfword hh, pp  ;
  scaled scf  ;
  boolean oktodash  ;
  printdiagnostic ( 552 , s , nuline ) ;
  p = h + 7 ;
  while ( mem [p ].hhfield .v.RH != 0 ) {
      
    p = mem [p ].hhfield .v.RH ;
    println () ;
    switch ( mem [p ].hhfield .b0 ) 
    {case 1 : 
      {
	print ( 555 ) ;
	printobjcolor ( p ) ;
	printchar ( 58 ) ;
	println () ;
	prpath ( mem [p + 1 ].hhfield .v.RH ) ;
	println () ;
	if ( ( mem [p + 1 ].hhfield .lhfield != 0 ) ) 
	{
	  switch ( mem [p ].hhfield .b1 ) 
	  {case 0 : 
	    {
	      print ( 557 ) ;
	      printscaled ( mem [p + 5 ].cint ) ;
	    } 
	    break ;
	  case 1 : 
	    print ( 558 ) ;
	    break ;
	  case 2 : 
	    print ( 559 ) ;
	    break ;
	    default: 
	    print ( 560 ) ;
	    break ;
	  } 
	  print ( 556 ) ;
	  println () ;
	  prpen ( mem [p + 1 ].hhfield .lhfield ) ;
	} 
      } 
      break ;
    case 2 : 
      {
	print ( 566 ) ;
	printobjcolor ( p ) ;
	printchar ( 58 ) ;
	println () ;
	prpath ( mem [p + 1 ].hhfield .v.RH ) ;
	if ( mem [p + 6 ].hhfield .v.RH != 0 ) 
	{
	  printnl ( 567 ) ;
	  oktodash = ( mem [p + 1 ].hhfield .lhfield == mem [mem [p + 1 ]
	  .hhfield .lhfield ].hhfield .v.RH ) ;
	  if ( ! oktodash ) 
	  scf = 65536L ;
	  else scf = mem [p + 7 ].cint ;
	  hh = mem [p + 6 ].hhfield .v.RH ;
	  pp = mem [hh ].hhfield .v.RH ;
	  if ( ( pp == 2 ) || ( mem [hh + 1 ].cint < 0 ) ) 
	  print ( 568 ) ;
	  else {
	      
	    mem [3 ].cint = mem [pp + 1 ].cint + mem [hh + 1 ].cint ;
	    while ( pp != 2 ) {
		
	      print ( 569 ) ;
	      printscaled ( takescaled ( mem [pp + 2 ].cint - mem [pp + 1 ]
	      .cint , scf ) ) ;
	      print ( 570 ) ;
	      printscaled ( takescaled ( mem [mem [pp ].hhfield .v.RH + 1 ]
	      .cint - mem [pp + 2 ].cint , scf ) ) ;
	      pp = mem [pp ].hhfield .v.RH ;
	      if ( pp != 2 ) 
	      printchar ( 32 ) ;
	    } 
	    print ( 571 ) ;
	    printscaled ( - (integer) takescaled ( dashoffset ( hh ) , scf ) ) 
	    ;
	    if ( ! oktodash || ( mem [hh + 1 ].cint == 0 ) ) 
	    print ( 572 ) ;
	  } 
	} 
	println () ;
	switch ( mem [p + 6 ].hhfield .b0 ) 
	{case 0 : 
	  print ( 561 ) ;
	  break ;
	case 1 : 
	  print ( 562 ) ;
	  break ;
	case 2 : 
	  print ( 563 ) ;
	  break ;
	  default: 
	  print ( 539 ) ;
	  break ;
	} 
	print ( 564 ) ;
	switch ( mem [p ].hhfield .b1 ) 
	{case 0 : 
	  {
	    print ( 557 ) ;
	    printscaled ( mem [p + 5 ].cint ) ;
	  } 
	  break ;
	case 1 : 
	  print ( 558 ) ;
	  break ;
	case 2 : 
	  print ( 559 ) ;
	  break ;
	  default: 
	  print ( 560 ) ;
	  break ;
	} 
	print ( 556 ) ;
	println () ;
	if ( mem [p + 1 ].hhfield .lhfield == 0 ) 
	print ( 260 ) ;
	else prpen ( mem [p + 1 ].hhfield .lhfield ) ;
      } 
      break ;
    case 3 : 
      {
	printchar ( 34 ) ;
	print ( mem [p + 1 ].hhfield .v.RH ) ;
	print ( 574 ) ;
	print ( fontname [mem [p + 1 ].hhfield .lhfield ]) ;
	printchar ( 34 ) ;
	println () ;
	printobjcolor ( p ) ;
	print ( 575 ) ;
	printcompactnode ( p + 8 , 6 ) ;
      } 
      break ;
    case 4 : 
      {
	print ( 576 ) ;
	println () ;
	prpath ( mem [p + 1 ].hhfield .v.RH ) ;
      } 
      break ;
    case 6 : 
      print ( 577 ) ;
      break ;
    case 5 : 
      {
	print ( 578 ) ;
	println () ;
	prpath ( mem [p + 1 ].hhfield .v.RH ) ;
      } 
      break ;
    case 7 : 
      print ( 579 ) ;
      break ;
      default: 
      {
	print ( 553 ) ;
      } 
      break ;
    } 
  } 
  printnl ( 554 ) ;
  if ( p != mem [h + 7 ].hhfield .lhfield ) 
  print ( 63 ) ;
  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 ( 600 ) ;
    printvariablename ( q ) ;
    v = mem [q + 1 ].cint % 64 ;
    while ( v > 0 ) {
	
      print ( 601 ) ;
      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 ( 814 ) ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
stashcurexp ( void ) 
#else
stashcurexp ( ) 
#endif
{
  register halfword Result; halfword p  ;
  switch ( curtype ) 
  {case 3 : 
  case 5 : 
  case 7 : 
  case 11 : 
  case 9 : 
  case 12 : 
  case 13 : 
  case 14 : 
  case 17 : 
  case 18 : 
  case 19 : 
    p = curexp ;
    break ;
    default: 
    {
      p = getnode ( 2 ) ;
      mem [p ].hhfield .b1 = 14 ;
      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 11 : 
  case 9 : 
  case 12 : 
  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 ( 324 ) ;
    break ;
  case 2 : 
    if ( v == 30 ) 
    print ( 347 ) ;
    else print ( 348 ) ;
    break ;
  case 3 : 
  case 5 : 
  case 7 : 
  case 11 : 
  case 9 : 
  case 15 : 
    {
      printtype ( t ) ;
      if ( v != 0 ) 
      {
	printchar ( 32 ) ;
	while ( ( mem [v ].hhfield .b1 == 14 ) && ( v != p ) ) v = mem [v + 
	1 ].cint ;
	printvariablename ( v ) ;
      } 
    } 
    break ;
  case 4 : 
    {
      printchar ( 34 ) ;
      print ( v ) ;
      printchar ( 34 ) ;
    } 
    break ;
  case 6 : 
  case 8 : 
  case 10 : 
    if ( verbosity <= 1 ) 
    printtype ( t ) ;
    else {
	
      if ( selector == 10 ) 
      if ( internal [12 ]<= 0 ) 
      {
	selector = 8 ;
	printtype ( t ) ;
	print ( 813 ) ;
	selector = 10 ;
      } 
      switch ( t ) 
      {case 6 : 
	printpen ( v , 284 , false ) ;
	break ;
      case 8 : 
	printpath ( v , 284 , false ) ;
	break ;
      case 10 : 
	printedges ( v , 284 , false ) ;
	break ;
      } 
    } 
    break ;
  case 12 : 
  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 ( 812 ) ;
    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 ( 804 ) ;
  printexp ( p , 1 ) ;
  if ( s != 284 ) 
  {
    printnl ( 262 ) ;
    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 [30 ]> 0 ) 
  {
    {
      if ( interaction == 3 ) 
      ;
      printnl ( 262 ) ;
      print ( 602 ) ;
    } 
    printscaled ( x ) ;
    printchar ( 41 ) ;
    {
      helpptr = 4 ;
      helpline [3 ]= 603 ;
      helpline [2 ]= 604 ;
      helpline [1 ]= 605 ;
      helpline [0 ]= 606 ;
    } 
    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 ( 607 ) ;
    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 [5 ].hhfield .v.RH ;
  s = 0 ;
  while ( r != 5 ) {
      
    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
zflushdashlist ( halfword h ) 
#else
zflushdashlist ( h ) 
  halfword h ;
#endif
{
  halfword p, q  ;
  q = mem [h ].hhfield .v.RH ;
  while ( q != 2 ) {
      
    p = q ;
    q = mem [q ].hhfield .v.RH ;
    freenode ( p , 3 ) ;
  } 
  mem [h ].hhfield .v.RH = 2 ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
ztossgrobject ( halfword p ) 
#else
ztossgrobject ( p ) 
  halfword p ;
#endif
{
  register halfword Result; halfword e  ;
  e = 0 ;
  switch ( mem [p ].hhfield .b0 ) 
  {case 1 : 
    {
      tossknotlist ( mem [p + 1 ].hhfield .v.RH ) ;
      if ( mem [p + 1 ].hhfield .lhfield != 0 ) 
      tossknotlist ( mem [p + 1 ].hhfield .lhfield ) ;
    } 
    break ;
  case 2 : 
    {
      tossknotlist ( mem [p + 1 ].hhfield .v.RH ) ;
      if ( mem [p + 1 ].hhfield .lhfield != 0 ) 
      tossknotlist ( mem [p + 1 ].hhfield .lhfield ) ;
      e = mem [p + 6 ].hhfield .v.RH ;
    } 
    break ;
  case 3 : 
    {
      if ( strref [mem [p + 1 ].hhfield .v.RH ]< 127 ) 
      if ( strref [mem [p + 1 ].hhfield .v.RH ]> 1 ) 
      decr ( strref [mem [p + 1 ].hhfield .v.RH ]) ;
      else flushstring ( mem [p + 1 ].hhfield .v.RH ) ;
    } 
    break ;
  case 4 : 
  case 5 : 
    tossknotlist ( mem [p + 1 ].hhfield .v.RH ) ;
    break ;
  case 6 : 
  case 7 : 
    ;
    break ;
  } 
  freenode ( p , grobjectsize [mem [p ].hhfield .b0 ]) ;
  Result = e ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
ztossedges ( halfword h ) 
#else
ztossedges ( h ) 
  halfword h ;
#endif
{
  halfword p, q  ;
  halfword r  ;
  flushdashlist ( h ) ;
  q = mem [h + 7 ].hhfield .v.RH ;
  while ( ( q != 0 ) ) {
      
    p = q ;
    q = mem [q ].hhfield .v.RH ;
    r = tossgrobject ( p ) ;
    if ( r != 0 ) 
    if ( mem [r ].hhfield .lhfield == 0 ) 
    tossedges ( r ) ;
    else decr ( mem [r ].hhfield .lhfield ) ;
  } 
  freenode ( h , 8 ) ;
} 
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 11 : 
  case 9 : 
    ringdelete ( p ) ;
    break ;
  case 4 : 
    {
      if ( strref [v ]< 127 ) 
      if ( strref [v ]> 1 ) 
      decr ( strref [v ]) ;
      else flushstring ( v ) ;
    } 
    break ;
  case 8 : 
  case 6 : 
    tossknotlist ( v ) ;
    break ;
  case 10 : 
    if ( mem [v ].hhfield .lhfield == 0 ) 
    tossedges ( v ) ;
    else decr ( mem [v ].hhfield .lhfield ) ;
    break ;
  case 14 : 
  case 13 : 
  case 12 : 
    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 [5 ].hhfield .v.RH ;
      while ( q != 5 ) {
	  
	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 ( 816 ) ;
	  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 ( 601 ) ;
	    mem [p + 1 ].cint = mem [p + 1 ].cint - 2 ;
	  } 
	  if ( t == 17 ) 
	  printchar ( 61 ) ;
	  else print ( 817 ) ;
	  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 ( 815 ) ;
    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 11 : 
  case 9 : 
  case 12 : 
  case 13 : 
  case 14 : 
  case 17 : 
  case 18 : 
  case 19 : 
    {
      recyclevalue ( curexp ) ;
      freenode ( curexp , 2 ) ;
    } 
    break ;
  case 4 : 
    {
      if ( strref [curexp ]< 127 ) 
      if ( strref [curexp ]> 1 ) 
      decr ( strref [curexp ]) ;
      else flushstring ( curexp ) ;
    } 
    break ;
  case 6 : 
  case 8 : 
    tossknotlist ( curexp ) ;
    break ;
  case 10 : 
    if ( mem [curexp ].hhfield .lhfield == 0 ) 
    tossedges ( curexp ) ;
    else decr ( mem [curexp ].hhfield .lhfield ) ;
    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 == 9 ) ) ;
    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 : 
    Result = 7 ;
    break ;
  case 8 : 
  case 9 : 
    Result = 9 ;
    break ;
  case 10 : 
  case 11 : 
    Result = 11 ;
    break ;
  case 12 : 
  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 % 85 ) 
  {case 13 : 
  case 55 : 
  case 46 : 
  case 51 : 
    if ( ! saving ) 
    deletemacref ( q ) ;
    break ;
  case 43 : 
    if ( q != 0 ) 
    if ( saving ) 
    mem [q ].hhfield .b1 = 1 ;
    else {
	
      flushbelowvariable ( q ) ;
      freenode ( q , 2 ) ;
    } 
    break ;
    default: 
    ;
    break ;
  } 
  eqtb [p ]= eqtb [9771 ];
} 
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 = 9771 + 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 > 9771 ) 
    {
      if ( internal [7 ]> 0 ) 
      {
	begindiagnostic () ;
	printnl ( 531 ) ;
	print ( intname [q - ( 9771 ) ]) ;
	printchar ( 61 ) ;
	printscaled ( mem [saveptr + 1 ].cint ) ;
	printchar ( 125 ) ;
	enddiagnostic ( false ) ;
      } 
      internal [q - ( 9771 ) ]= mem [saveptr + 1 ].cint ;
    } 
    else {
	
      if ( internal [7 ]> 0 ) 
      {
	begindiagnostic () ;
	printnl ( 531 ) ;
	print ( hash [q ].v.RH ) ;
	printchar ( 125 ) ;
	enddiagnostic ( false ) ;
      } 
      clearsymbol ( q , false ) ;
      eqtb [q ]= mem [saveptr + 1 ].hhfield ;
      if ( eqtb [q ].lhfield % 85 == 43 ) 
      {
	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
{
  register halfword Result; halfword q, pp, qq  ;
  q = copyknot ( p ) ;
  qq = q ;
  pp = mem [p ].hhfield .v.RH ;
  while ( pp != p ) {
      
    mem [qq ].hhfield .v.RH = copyknot ( pp ) ;
    qq = mem [qq ].hhfield .v.RH ;
    pp = mem [pp ].hhfield .v.RH ;
  } 
  mem [qq ].hhfield .v.RH = q ;
  Result = q ;
  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 , 541 , 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 ( 546 , 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 ) ;
    } 
    else if ( mem [p ].hhfield .b1 == 0 ) 
    {
      mem [p + 5 ].cint = mem [p + 1 ].cint ;
      mem [p + 6 ].cint = mem [p + 2 ].cint ;
      mem [q + 3 ].cint = mem [q + 1 ].cint ;
      mem [q + 4 ].cint = mem [q + 2 ].cint ;
    } 
    p = q ;
  } while ( ! ( p == h ) ) ;
  if ( internal [4 ]> 0 ) 
  printpath ( knots , 542 , true ) ;
  if ( aritherror ) 
  {
    {
      if ( interaction == 3 ) 
      ;
      printnl ( 262 ) ;
      print ( 543 ) ;
    } 
    {
      helpptr = 2 ;
      helpline [1 ]= 544 ;
      helpline [0 ]= 545 ;
    } 
    putgeterror () ;
    aritherror = false ;
  } 
} 
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 ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zevalcubic ( halfword p , halfword q , fraction t ) 
#else
zevalcubic ( p , q , t ) 
  halfword p ;
  halfword q ;
  fraction t ;
#endif
{
  register scaled Result; scaled x1, x2, x3  ;
  x1 = mem [p ].cint - takefraction ( mem [p ].cint - mem [p + 4 ].cint 
  , t ) ;
  x2 = mem [p + 4 ].cint - takefraction ( mem [p + 4 ].cint - mem [q + 2 
  ].cint , t ) ;
  x3 = mem [q + 2 ].cint - takefraction ( mem [q + 2 ].cint - mem [q ]
  .cint , t ) ;
  x1 = x1 - takefraction ( x1 - x2 , t ) ;
  x2 = x2 - takefraction ( x2 - x3 , t ) ;
  Result = x1 - takefraction ( x1 - x2 , t ) ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zboundcubic ( halfword p , halfword q , smallnumber c ) 
#else
zboundcubic ( p , q , c ) 
  halfword p ;
  halfword q ;
  smallnumber c ;
#endif
{
  boolean wavy  ;
  scaled del1, del2, del3, del, dmax  ;
  fraction t, tt  ;
  scaled x  ;
  x = mem [q ].cint ;
  if ( x < bbmin [c ]) 
  bbmin [c ]= x ;
  if ( x > bbmax [c ]) 
  bbmax [c ]= x ;
  wavy = true ;
  if ( bbmin [c ]<= mem [p + 4 ].cint ) 
  if ( mem [p + 4 ].cint <= bbmax [c ]) 
  if ( bbmin [c ]<= mem [q + 2 ].cint ) 
  if ( mem [q + 2 ].cint <= bbmax [c ]) 
  wavy = false ;
  if ( wavy ) 
  {
    del1 = mem [p + 4 ].cint - mem [p ].cint ;
    del2 = mem [q + 2 ].cint - mem [p + 4 ].cint ;
    del3 = mem [q ].cint - mem [q + 2 ].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 ) 
    {
      del1 = - (integer) del1 ;
      del2 = - (integer) del2 ;
      del3 = - (integer) del3 ;
    } 
    t = crossingpoint ( del1 , del2 , del3 ) ;
    if ( t < 268435456L ) 
    {
      x = evalcubic ( p , q , t ) ;
      if ( x < bbmin [c ]) 
      bbmin [c ]= x ;
      if ( x > bbmax [c ]) 
      bbmax [c ]= x ;
      del2 = del2 - takefraction ( del2 - del3 , t ) ;
      if ( del2 > 0 ) 
      del2 = 0 ;
      tt = crossingpoint ( 0 , - (integer) del2 , - (integer) del3 ) ;
      if ( tt < 268435456L ) 
      {
	x = evalcubic ( p , q , tt - takefraction ( tt - 268435456L , t ) ) ;
	if ( x < bbmin [c ]) 
	bbmin [c ]= x ;
	if ( x > bbmax [c ]) 
	bbmax [c ]= x ;
      } 
    } 
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zpathbbox ( halfword h ) 
#else
zpathbbox ( h ) 
  halfword h ;
#endif
{
  /* 10 */ halfword p, q  ;
  bbmin [0 ]= mem [h + 1 ].cint ;
  bbmin [1 ]= mem [h + 2 ].cint ;
  bbmax [0 ]= bbmin [0 ];
  bbmax [1 ]= bbmin [1 ];
  p = h ;
  do {
      if ( mem [p ].hhfield .b1 == 0 ) 
    goto lab10 ;
    q = mem [p ].hhfield .v.RH ;
    boundcubic ( p + 1 , q + 1 , 0 ) ;
    boundcubic ( p + 2 , q + 2 , 1 ) ;
    p = q ;
  } while ( ! ( p == h ) ) ;
  lab10: ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zsolverisingcubic ( scaled a , scaled b , scaled c , scaled x ) 
#else
zsolverisingcubic ( a , b , c , x ) 
  scaled a ;
  scaled b ;
  scaled c ;
  scaled x ;
#endif
{
  register scaled Result; scaled ab, bc, ac  ;
  integer t  ;
  integer xx  ;
  if ( ( a < 0 ) || ( c < 0 ) ) 
  confusion ( 547 ) ;
  if ( x <= 0 ) 
  Result = 0 ;
  else if ( x >= a + b + c ) 
  Result = 65536L ;
  else {
      
    t = 1 ;
    while ( ( a > 715827882L ) || ( b > 715827882L ) || ( c > 715827882L ) ) {
	
      a = halfp ( a ) ;
      b = half ( b ) ;
      c = halfp ( c ) ;
      x = halfp ( x ) ;
    } 
    do {
	t = t + t ;
      ab = half ( a + b ) ;
      bc = half ( b + c ) ;
      ac = half ( ab + bc ) ;
      xx = x - a - ab - ac ;
      if ( xx < - (integer) x ) 
      {
	x = x + x ;
	b = ab ;
	c = ac ;
      } 
      else {
	  
	x = x + xx ;
	a = ac ;
	b = bc ;
	t = t + 1 ;
      } 
    } while ( ! ( t >= 65536L ) ) ;
    Result = t - 65536L ;
  } 
  return Result ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zarctest ( scaled dx0 , scaled dy0 , scaled dx1 , scaled dy1 , scaled dx2 , 
scaled dy2 , scaled v0 , scaled v02 , scaled v2 , scaled agoal , scaled tol ) 
#else
zarctest ( dx0 , dy0 , dx1 , dy1 , dx2 , dy2 , v0 , v02 , v2 , agoal , tol ) 
  scaled dx0 ;
  scaled dy0 ;
  scaled dx1 ;
  scaled dy1 ;
  scaled dx2 ;
  scaled dy2 ;
  scaled v0 ;
  scaled v02 ;
  scaled v2 ;
  scaled agoal ;
  scaled tol ;
#endif
{
  /* 10 */ register scaled Result; boolean simple  ;
  scaled dx01, dy01, dx12, dy12, dx02, dy02  ;
  scaled v002, v022  ;
  scaled arc  ;
  scaled a, b  ;
  scaled anew, aaux  ;
  scaled tmp, tmp2  ;
  scaled arc1  ;
  dx01 = half ( dx0 + dx1 ) ;
  dx12 = half ( dx1 + dx2 ) ;
  dx02 = half ( dx01 + dx12 ) ;
  dy01 = half ( dy0 + dy1 ) ;
  dy12 = half ( dy1 + dy2 ) ;
  dy02 = half ( dy01 + dy12 ) ;
  v002 = pythadd ( dx01 + half ( dx0 + dx02 ) , dy01 + half ( dy0 + dy02 ) ) ;
  v022 = pythadd ( dx12 + half ( dx02 + dx2 ) , dy12 + half ( dy02 + dy2 ) ) ;
  tmp = halfp ( v02 + 2 ) ;
  arc1 = v002 + half ( halfp ( v0 + tmp ) - v002 ) ;
  arc = v022 + half ( halfp ( v2 + tmp ) - v022 ) ;
  if ( ( arc < 2147483647L - arc1 ) ) 
  arc = arc + arc1 ;
  else {
      
    aritherror = true ;
    if ( agoal == 2147483647L ) 
    Result = 2147483647L ;
    else Result = -131072L ;
    goto lab10 ;
  } 
  simple = ( dx0 >= 0 ) && ( dx1 >= 0 ) && ( dx2 >= 0 ) || ( dx0 <= 0 ) && ( 
  dx1 <= 0 ) && ( dx2 <= 0 ) ;
  if ( simple ) 
  simple = ( dy0 >= 0 ) && ( dy1 >= 0 ) && ( dy2 >= 0 ) || ( dy0 <= 0 ) && ( 
  dy1 <= 0 ) && ( dy2 <= 0 ) ;
  if ( ! simple ) 
  {
    simple = ( dx0 >= dy0 ) && ( dx1 >= dy1 ) && ( dx2 >= dy2 ) || ( dx0 <= 
    dy0 ) && ( dx1 <= dy1 ) && ( dx2 <= dy2 ) ;
    if ( simple ) 
    simple = ( - (integer) dx0 >= dy0 ) && ( - (integer) dx1 >= dy1 ) && ( 
    - (integer) dx2 >= dy2 ) || ( - (integer) dx0 <= dy0 ) && ( - (integer) 
    dx1 <= dy1 ) && ( - (integer) dx2 <= dy2 ) ;
  } 
  if ( simple && ( abs ( arc - v02 - halfp ( v0 + v2 ) ) <= tol ) ) 
  if ( arc < agoal ) 
  Result = arc ;
  else {
      
    tmp = ( v02 + 2 ) / 4 ;
    if ( agoal <= arc1 ) 
    {
      tmp2 = halfp ( v0 ) ;
      Result = halfp ( solverisingcubic ( tmp2 , arc1 - tmp2 - tmp , tmp , 
      agoal ) ) - 131072L ;
    } 
    else {
	
      tmp2 = halfp ( v2 ) ;
      Result = ( -98304L ) + halfp ( solverisingcubic ( tmp , arc - arc1 - tmp 
      - tmp2 , tmp2 , agoal - arc1 ) ) ;
    } 
  } 
  else {
      
    aaux = 2147483647L - agoal ;
    if ( agoal > aaux ) 
    {
      aaux = agoal - aaux ;
      anew = 2147483647L ;
    } 
    else {
	
      anew = agoal + agoal ;
      aaux = 0 ;
    } 
    tol = tol + halfp ( tol ) ;
    a = arctest ( dx0 , dy0 , dx01 , dy01 , dx02 , dy02 , v0 , v002 , halfp ( 
    v02 ) , anew , tol ) ;
    if ( a < 0 ) 
    Result = - (integer) halfp ( 131072L - a ) ;
    else {
	
      if ( a > aaux ) 
      {
	aaux = aaux - a ;
	anew = anew + aaux ;
      } 
      b = arctest ( dx02 , dy02 , dx12 , dy12 , dx2 , dy2 , halfp ( v02 ) , 
      v022 , v2 , anew , tol ) ;
      if ( b < 0 ) 
      Result = - (integer) halfp ( - (integer) b ) - 32768L ;
      else Result = a + half ( b - a ) ;
    } 
  } 
  lab10: ;
  return Result ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zdoarctest ( scaled dx0 , scaled dy0 , scaled dx1 , scaled dy1 , scaled dx2 , 
scaled dy2 , scaled agoal ) 
#else
zdoarctest ( dx0 , dy0 , dx1 , dy1 , dx2 , dy2 , agoal ) 
  scaled dx0 ;
  scaled dy0 ;
  scaled dx1 ;
  scaled dy1 ;
  scaled dx2 ;
  scaled dy2 ;
  scaled agoal ;
#endif
{
  register scaled Result; scaled v0, v1, v2  ;
  scaled v02  ;
  v0 = pythadd ( dx0 , dy0 ) ;
  v1 = pythadd ( dx1 , dy1 ) ;
  v2 = pythadd ( dx2 , dy2 ) ;
  if ( ( v0 >= 1073741824L ) || ( v1 >= 1073741824L ) || ( v2 >= 1073741824L ) 
  ) 
  {
    aritherror = true ;
    if ( agoal == 2147483647L ) 
    Result = 2147483647L ;
    else Result = -131072L ;
  } 
  else {
      
    v02 = pythadd ( dx1 + half ( dx0 + dx2 ) , dy1 + half ( dy0 + dy2 ) ) ;
    Result = arctest ( dx0 , dy0 , dx1 , dy1 , dx2 , dy2 , v0 , v02 , v2 , 
    agoal , 16 ) ;
  } 
  return Result ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zgetarclength ( halfword h ) 
#else
zgetarclength ( h ) 
  halfword h ;
#endif
{
  /* 30 */ register scaled Result; halfword p, q  ;
  scaled a, atot  ;
  atot = 0 ;
  p = h ;
  while ( mem [p ].hhfield .b1 != 0 ) {
      
    q = mem [p ].hhfield .v.RH ;
    a = doarctest ( mem [p + 5 ].cint - mem [p + 1 ].cint , mem [p + 6 ]
    .cint - mem [p + 2 ].cint , mem [q + 3 ].cint - mem [p + 5 ].cint , 
    mem [q + 4 ].cint - mem [p + 6 ].cint , mem [q + 1 ].cint - mem [q 
    + 3 ].cint , mem [q + 2 ].cint - mem [q + 4 ].cint , 2147483647L ) ;
    atot = slowadd ( a , atot ) ;
    if ( q == h ) 
    goto lab30 ;
    else p = q ;
  } 
  lab30: {
      
    if ( aritherror ) 
    cleararith () ;
  } 
  Result = atot ;
  return Result ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zgetarctime ( halfword h , scaled arc0 ) 
#else
zgetarctime ( h , arc0 ) 
  halfword h ;
  scaled arc0 ;
#endif
{
  /* 30 */ register scaled Result; halfword p, q  ;
  scaled ttot  ;
  scaled t  ;
  scaled arc  ;
  integer n  ;
  if ( arc0 < 0 ) 
  {
    if ( mem [h ].hhfield .b0 == 0 ) 
    ttot = 0 ;
    else {
	
      p = htapypoc ( h ) ;
      ttot = - (integer) getarctime ( p , - (integer) arc0 ) ;
      tossknotlist ( p ) ;
    } 
    goto lab30 ;
  } 
  if ( arc0 == 2147483647L ) 
  decr ( arc0 ) ;
  ttot = 0 ;
  arc = arc0 ;
  p = h ;
  while ( ( mem [p ].hhfield .b1 != 0 ) && ( arc > 0 ) ) {
      
    q = mem [p ].hhfield .v.RH ;
    t = doarctest ( mem [p + 5 ].cint - mem [p + 1 ].cint , mem [p + 6 ]
    .cint - mem [p + 2 ].cint , mem [q + 3 ].cint - mem [p + 5 ].cint , 
    mem [q + 4 ].cint - mem [p + 6 ].cint , mem [q + 1 ].cint - mem [q 
    + 3 ].cint , mem [q + 2 ].cint - mem [q + 4 ].cint , arc ) ;
    if ( t < 0 ) 
    {
      ttot = ttot + t + 131072L ;
      arc = 0 ;
    } 
    else {
	
      ttot = ttot + 65536L ;
      arc = arc - t ;
    } 
    if ( q == h ) 
    if ( arc > 0 ) 
    {
      n = arc / ( arc0 - arc ) ;
      arc = arc - n * ( arc0 - arc ) ;
      if ( ttot > 2147483647L / ( n + 1 ) ) 
      {
	aritherror = true ;
	ttot = 2147483647L ;
	goto lab30 ;
      } 
      ttot = ( n + 1 ) * ttot ;
    } 
    p = q ;
  } 
  lab30: {
      
    if ( aritherror ) 
    cleararith () ;
  } 
  Result = ttot ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zmoveknot ( halfword p , halfword q ) 
#else
zmoveknot ( p , q ) 
  halfword p ;
  halfword q ;
#endif
{
  mem [mem [p ].hhfield .lhfield ].hhfield .v.RH = mem [p ].hhfield 
  .v.RH ;
  mem [mem [p ].hhfield .v.RH ].hhfield .lhfield = mem [p ].hhfield 
  .lhfield ;
  mem [p ].hhfield .lhfield = q ;
  mem [p ].hhfield .v.RH = mem [q ].hhfield .v.RH ;
  mem [q ].hhfield .v.RH = p ;
  mem [mem [p ].hhfield .v.RH ].hhfield .lhfield = p ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zconvexhull ( halfword h ) 
#else
zconvexhull ( h ) 
  halfword h ;
#endif
{
  /* 31 32 33 */ register halfword Result; halfword l, r  ;
  halfword p, q  ;
  halfword s  ;
  scaled dx, dy  ;
  if ( ( h == mem [h ].hhfield .v.RH ) ) 
  Result = h ;
  else {
      
    l = h ;
    p = mem [h ].hhfield .v.RH ;
    while ( p != h ) {
	
      if ( mem [p + 1 ].cint <= mem [l + 1 ].cint ) 
      if ( ( mem [p + 1 ].cint < mem [l + 1 ].cint ) || ( mem [p + 2 ]
      .cint < mem [l + 2 ].cint ) ) 
      l = p ;
      p = mem [p ].hhfield .v.RH ;
    } 
    r = h ;
    p = mem [h ].hhfield .v.RH ;
    while ( p != h ) {
	
      if ( mem [p + 1 ].cint >= mem [r + 1 ].cint ) 
      if ( ( mem [p + 1 ].cint > mem [r + 1 ].cint ) || ( mem [p + 2 ]
      .cint > mem [r + 2 ].cint ) ) 
      r = p ;
      p = mem [p ].hhfield .v.RH ;
    } 
    if ( l != r ) 
    {
      s = mem [r ].hhfield .v.RH ;
      dx = mem [r + 1 ].cint - mem [l + 1 ].cint ;
      dy = mem [r + 2 ].cint - mem [l + 2 ].cint ;
      p = mem [l ].hhfield .v.RH ;
      while ( p != r ) {
	  
	q = mem [p ].hhfield .v.RH ;
	if ( abvscd ( dx , mem [p + 2 ].cint - mem [l + 2 ].cint , dy , 
	mem [p + 1 ].cint - mem [l + 1 ].cint ) > 0 ) 
	moveknot ( p , r ) ;
	p = q ;
      } 
      p = s ;
      while ( p != l ) {
	  
	q = mem [p ].hhfield .v.RH ;
	if ( abvscd ( dx , mem [p + 2 ].cint - mem [l + 2 ].cint , dy , 
	mem [p + 1 ].cint - mem [l + 1 ].cint ) < 0 ) 
	moveknot ( p , l ) ;
	p = q ;
      } 
      p = mem [l ].hhfield .v.RH ;
      while ( p != r ) {
	  
	q = mem [p ].hhfield .lhfield ;
	while ( mem [q + 1 ].cint > mem [p + 1 ].cint ) q = mem [q ]
	.hhfield .lhfield ;
	while ( mem [q + 1 ].cint == mem [p + 1 ].cint ) if ( mem [q + 2 
	].cint > mem [p + 2 ].cint ) 
	q = mem [q ].hhfield .lhfield ;
	else goto lab31 ;
	lab31: if ( q == mem [p ].hhfield .lhfield ) 
	p = mem [p ].hhfield .v.RH ;
	else {
	    
	  p = mem [p ].hhfield .v.RH ;
	  moveknot ( mem [p ].hhfield .lhfield , q ) ;
	} 
      } 
      p = mem [r ].hhfield .v.RH ;
      while ( p != l ) {
	  
	q = mem [p ].hhfield .lhfield ;
	while ( mem [q + 1 ].cint < mem [p + 1 ].cint ) q = mem [q ]
	.hhfield .lhfield ;
	while ( mem [q + 1 ].cint == mem [p + 1 ].cint ) if ( mem [q + 2 
	].cint < mem [p + 2 ].cint ) 
	q = mem [q ].hhfield .lhfield ;
	else goto lab32 ;
	lab32: if ( q == mem [p ].hhfield .lhfield ) 
	p = mem [p ].hhfield .v.RH ;
	else {
	    
	  p = mem [p ].hhfield .v.RH ;
	  moveknot ( mem [p ].hhfield .lhfield , q ) ;
	} 
      } 
    } 
    if ( l != mem [l ].hhfield .v.RH ) 
    {
      p = l ;
      q = mem [l ].hhfield .v.RH ;
      while ( true ) {
	  
	dx = mem [q + 1 ].cint - mem [p + 1 ].cint ;
	dy = mem [q + 2 ].cint - mem [p + 2 ].cint ;
	p = q ;
	q = mem [q ].hhfield .v.RH ;
	if ( p == l ) 
	goto lab33 ;
	if ( p != r ) 
	if ( abvscd ( dx , mem [q + 2 ].cint - mem [p + 2 ].cint , dy , 
	mem [q + 1 ].cint - mem [p + 1 ].cint ) <= 0 ) 
	{
	  s = mem [p ].hhfield .lhfield ;
	  freenode ( p , 7 ) ;
	  mem [s ].hhfield .v.RH = q ;
	  mem [q ].hhfield .lhfield = s ;
	  if ( s == l ) 
	  p = s ;
	  else {
	      
	    p = mem [s ].hhfield .lhfield ;
	    q = s ;
	  } 
	} 
      } 
      lab33: ;
    } 
    Result = l ;
  } 
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zmakepen ( halfword h , boolean needhull ) 
#else
zmakepen ( h , needhull ) 
  halfword h ;
  boolean needhull ;
#endif
{
  register halfword Result; halfword p, q  ;
  q = h ;
  do {
      p = q ;
    q = mem [q ].hhfield .v.RH ;
    mem [q ].hhfield .lhfield = p ;
  } while ( ! ( q == h ) ) ;
  if ( needhull ) 
  {
    h = convexhull ( h ) ;
    if ( ( h == mem [h ].hhfield .v.RH ) ) 
    {
      mem [h + 3 ].cint = mem [h + 1 ].cint ;
      mem [h + 4 ].cint = mem [h + 2 ].cint ;
      mem [h + 5 ].cint = mem [h + 1 ].cint ;
      mem [h + 6 ].cint = mem [h + 2 ].cint ;
    } 
  } 
  Result = h ;
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zgetpencircle ( scaled diam ) 
#else
zgetpencircle ( diam ) 
  scaled diam ;
#endif
{
  register halfword Result; halfword h  ;
  h = getnode ( 7 ) ;
  mem [h ].hhfield .v.RH = h ;
  mem [h ].hhfield .lhfield = h ;
  mem [h + 1 ].cint = 0 ;
  mem [h + 2 ].cint = 0 ;
  mem [h + 3 ].cint = diam ;
  mem [h + 4 ].cint = 0 ;
  mem [h + 5 ].cint = 0 ;
  mem [h + 6 ].cint = diam ;
  Result = h ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zmakepath ( halfword h ) 
#else
zmakepath ( h ) 
  halfword h ;
#endif
{
  halfword p  ;
  smallnumber k  ;
  scaled centerx, centery  ;
  scaled widthx, widthy  ;
  scaled heightx, heighty  ;
  scaled dx, dy  ;
  integer kk  ;
  if ( ( h == mem [h ].hhfield .v.RH ) ) 
  {
    centerx = mem [h + 1 ].cint ;
    centery = mem [h + 2 ].cint ;
    widthx = mem [h + 3 ].cint - centerx ;
    widthy = mem [h + 4 ].cint - centery ;
    heightx = mem [h + 5 ].cint - centerx ;
    heighty = mem [h + 6 ].cint - centery ;
    p = h ;
    {register integer for_end; k = 0 ;for_end = 7 ; if ( k <= for_end) do 
      {
	kk = ( k + 6 ) % 8 ;
	mem [p + 1 ].cint = centerx + takefraction ( halfcos [k ], widthx 
	) + takefraction ( halfcos [kk ], heightx ) ;
	mem [p + 2 ].cint = centery + takefraction ( halfcos [k ], widthy 
	) + takefraction ( halfcos [kk ], heighty ) ;
	dx = - (integer) takefraction ( dcos [kk ], widthx ) + takefraction 
	( dcos [k ], heightx ) ;
	dy = - (integer) takefraction ( dcos [kk ], widthy ) + takefraction 
	( dcos [k ], heighty ) ;
	mem [p + 5 ].cint = mem [p + 1 ].cint + dx ;
	mem [p + 6 ].cint = mem [p + 2 ].cint + dy ;
	mem [p + 3 ].cint = mem [p + 1 ].cint - dx ;
	mem [p + 4 ].cint = mem [p + 2 ].cint - dy ;
	mem [p ].hhfield .b0 = 1 ;
	mem [p ].hhfield .b1 = 1 ;
	if ( k == 7 ) 
	mem [p ].hhfield .v.RH = h ;
	else mem [p ].hhfield .v.RH = getnode ( 7 ) ;
	p = mem [p ].hhfield .v.RH ;
      } 
    while ( k++ < for_end ) ;} 
  } 
  else {
      
    p = h ;
    do {
	mem [p ].hhfield .b0 = 1 ;
      mem [p ].hhfield .b1 = 1 ;
      mem [p + 3 ].cint = mem [p + 1 ].cint ;
      mem [p + 4 ].cint = mem [p + 2 ].cint ;
      mem [p + 5 ].cint = mem [p + 1 ].cint ;
      mem [p + 6 ].cint = mem [p + 2 ].cint ;
      p = mem [p ].hhfield .v.RH ;
    } while ( ! ( p == h ) ) ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zfindoffset ( scaled x , scaled y , halfword h ) 
#else
zfindoffset ( x , y , h ) 
  scaled x ;
  scaled y ;
  halfword h ;
#endif
{
  halfword p, q  ;
  scaled wx, wy, hx, hy  ;
  fraction xx, yy  ;
  fraction d  ;
  if ( ( h == mem [h ].hhfield .v.RH ) ) 
  if ( ( x == 0 ) && ( y == 0 ) ) 
  {
    curx = mem [h + 1 ].cint ;
    cury = mem [h + 2 ].cint ;
  } 
  else {
      
    wx = mem [h + 3 ].cint - mem [h + 1 ].cint ;
    wy = mem [h + 4 ].cint - mem [h + 2 ].cint ;
    hx = mem [h + 5 ].cint - mem [h + 1 ].cint ;
    hy = mem [h + 6 ].cint - mem [h + 2 ].cint ;
    while ( ( abs ( x ) < 134217728L ) && ( abs ( y ) < 134217728L ) ) {
	
      x = x + x ;
      y = y + y ;
    } 
    yy = - (integer) ( takefraction ( x , hy ) + takefraction ( y , 
    - (integer) hx ) ) ;
    xx = takefraction ( x , - (integer) wy ) + takefraction ( y , wx ) ;
    d = pythadd ( xx , yy ) ;
    if ( d > 0 ) 
    {
      xx = half ( makefraction ( xx , d ) ) ;
      yy = half ( makefraction ( yy , d ) ) ;
    } 
    curx = mem [h + 1 ].cint + takefraction ( xx , wx ) + takefraction ( yy 
    , hx ) ;
    cury = mem [h + 2 ].cint + takefraction ( xx , wy ) + takefraction ( yy 
    , hy ) ;
  } 
  else {
      
    q = h ;
    do {
	p = q ;
      q = mem [q ].hhfield .v.RH ;
    } while ( ! ( abvscd ( mem [q + 1 ].cint - mem [p + 1 ].cint , y , mem 
    [q + 2 ].cint - mem [p + 2 ].cint , x ) >= 0 ) ) ;
    do {
	p = q ;
      q = mem [q ].hhfield .v.RH ;
    } while ( ! ( abvscd ( mem [q + 1 ].cint - mem [p + 1 ].cint , y , mem 
    [q + 2 ].cint - mem [p + 2 ].cint , x ) <= 0 ) ) ;
    curx = mem [p + 1 ].cint ;
    cury = mem [p + 2 ].cint ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zpenbbox ( halfword h ) 
#else
zpenbbox ( h ) 
  halfword h ;
#endif
{
  halfword p  ;
  if ( ( h == mem [h ].hhfield .v.RH ) ) 
  {
    findoffset ( 0 , 268435456L , h ) ;
    bbmax [0 ]= curx ;
    bbmin [0 ]= 2 * mem [h + 1 ].cint - curx ;
    findoffset ( -268435456L , 0 , h ) ;
    bbmax [1 ]= cury ;
    bbmin [1 ]= 2 * mem [h + 2 ].cint - cury ;
  } 
  else {
      
    bbmin [0 ]= mem [h + 1 ].cint ;
    bbmax [0 ]= bbmin [0 ];
    bbmin [1 ]= mem [h + 2 ].cint ;
    bbmax [1 ]= bbmin [1 ];
    p = mem [h ].hhfield .v.RH ;
    while ( p != h ) {
	
      if ( mem [p + 1 ].cint < bbmin [0 ]) 
      bbmin [0 ]= mem [p + 1 ].cint ;
      if ( mem [p + 2 ].cint < bbmin [1 ]) 
      bbmin [1 ]= mem [p + 2 ].cint ;
      if ( mem [p + 1 ].cint > bbmax [0 ]) 
      bbmax [0 ]= mem [p + 1 ].cint ;
      if ( mem [p + 2 ].cint > bbmax [1 ]) 
      bbmax [1 ]= mem [p + 2 ].cint ;
      p = mem [p ].hhfield .v.RH ;
    } 
  } 
} 
halfword 
#ifdef HAVE_PROTOTYPES
znewfillnode ( halfword p ) 
#else
znewfillnode ( p ) 
  halfword p ;
#endif
{
  register halfword Result; halfword t  ;
  t = getnode ( 6 ) ;
  mem [t ].hhfield .b0 = 1 ;
  mem [t + 1 ].hhfield .v.RH = p ;
  mem [t + 1 ].hhfield .lhfield = 0 ;
  mem [t + 2 ].cint = 0 ;
  mem [t + 3 ].cint = 0 ;
  mem [t + 4 ].cint = 0 ;
  if ( internal [27 ]> 65536L ) 
  mem [t ].hhfield .b1 = 2 ;
  else if ( internal [27 ]> 0 ) 
  mem [t ].hhfield .b1 = 1 ;
  else mem [t ].hhfield .b1 = 0 ;
  if ( internal [29 ]< 65536L ) 
  mem [t + 5 ].cint = 65536L ;
  else mem [t + 5 ].cint = internal [29 ];
  Result = t ;
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
znewstrokednode ( halfword p ) 
#else
znewstrokednode ( p ) 
  halfword p ;
#endif
{
  register halfword Result; halfword t  ;
  t = getnode ( 8 ) ;
  mem [t ].hhfield .b0 = 2 ;
  mem [t + 1 ].hhfield .v.RH = p ;
  mem [t + 1 ].hhfield .lhfield = 0 ;
  mem [t + 6 ].hhfield .v.RH = 0 ;
  mem [t + 7 ].cint = 65536L ;
  mem [t + 2 ].cint = 0 ;
  mem [t + 3 ].cint = 0 ;
  mem [t + 4 ].cint = 0 ;
  if ( internal [27 ]> 65536L ) 
  mem [t ].hhfield .b1 = 2 ;
  else if ( internal [27 ]> 0 ) 
  mem [t ].hhfield .b1 = 1 ;
  else mem [t ].hhfield .b1 = 0 ;
  if ( internal [29 ]< 65536L ) 
  mem [t + 5 ].cint = 65536L ;
  else mem [t + 5 ].cint = internal [29 ];
  if ( internal [28 ]> 65536L ) 
  mem [t + 6 ].hhfield .b0 = 2 ;
  else if ( internal [28 ]> 0 ) 
  mem [t + 6 ].hhfield .b0 = 1 ;
  else mem [t + 6 ].hhfield .b0 = 0 ;
  Result = t ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
beginname ( void ) 
#else
beginname ( ) 
#endif
{
  {
    if ( strref [curname ]< 127 ) 
    if ( strref [curname ]> 1 ) 
    decr ( strref [curname ]) ;
    else flushstring ( curname ) ;
  } 
  {
    if ( strref [curarea ]< 127 ) 
    if ( strref [curarea ]> 1 ) 
    decr ( strref [curarea ]) ;
    else flushstring ( curarea ) ;
  } 
  {
    if ( strref [curext ]< 127 ) 
    if ( strref [curext ]> 1 ) 
    decr ( strref [curext ]) ;
    else flushstring ( curext ) ;
  } 
  areadelimiter = -1 ;
  extdelimiter = -1 ;
} 
boolean 
#ifdef HAVE_PROTOTYPES
zmorename ( ASCIIcode c ) 
#else
zmorename ( c ) 
  ASCIIcode c ;
#endif
{
  register boolean Result; if ( ( c == 32 ) || ( c == 9 ) ) 
  Result = false ;
  else {
      
    if ( ISDIRSEP ( c ) ) 
    {
      areadelimiter = poolptr - strstart [strptr ];
      extdelimiter = -1 ;
    } 
    else if ( ( c == 46 ) ) 
    extdelimiter = poolptr - strstart [strptr ];
    {
      if ( poolptr + 1 > maxpoolptr ) 
      if ( poolptr + 1 > poolsize ) 
      docompaction ( 1 ) ;
      else maxpoolptr = poolptr + 1 ;
    } 
    {
      strpool [poolptr ]= c ;
      incr ( poolptr ) ;
    } 
    Result = true ;
  } 
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
endname ( void ) 
#else
endname ( ) 
#endif
{
  poolpointer a, n, e  ;
  e = poolptr - strstart [strptr ];
  if ( extdelimiter < 0 ) 
  extdelimiter = e ;
  a = areadelimiter + 1 ;
  n = extdelimiter - a ;
  e = e - extdelimiter ;
  if ( a == 0 ) 
  curarea = 284 ;
  else {
      
    curarea = makestring () ;
    choplaststring ( strstart [curarea ]+ a ) ;
  } 
  if ( n == 0 ) 
  curname = 284 ;
  else {
      
    curname = makestring () ;
    choplaststring ( strstart [curname ]+ n ) ;
  } 
  if ( e == 0 ) 
  curext = 284 ;
  else curext = makestring () ;
} 
void 
#ifdef HAVE_PROTOTYPES
zpackfilename ( strnumber n , strnumber a , strnumber e ) 
#else
zpackfilename ( n , a , e ) 
  strnumber n ;
  strnumber a ;
  strnumber e ;
#endif
{
  integer k  ;
  ASCIIcode c  ;
  poolpointer j  ;
  k = 0 ;
  if ( (char*) nameoffile ) 
  libcfree ( (char*) nameoffile ) ;
  nameoffile = xmalloc ( 1 + ( strstart [nextstr [a ]]- strstart [a ]) + 
  ( strstart [nextstr [n ]]- strstart [n ]) + ( strstart [nextstr [e ]
  ]- strstart [e ]) + 1 ) ;
  {register integer for_end; j = strstart [a ];for_end = strstart [
  nextstr [a ]]- 1 ; if ( j <= for_end) do 
    {
      c = strpool [j ];
      incr ( k ) ;
      if ( k <= maxint ) 
      nameoffile [k ]= xchr [c ];
    } 
  while ( j++ < for_end ) ;} 
  {register integer for_end; j = strstart [n ];for_end = strstart [
  nextstr [n ]]- 1 ; if ( j <= for_end) do 
    {
      c = strpool [j ];
      incr ( k ) ;
      if ( k <= maxint ) 
      nameoffile [k ]= xchr [c ];
    } 
  while ( j++ < for_end ) ;} 
  {register integer for_end; j = strstart [e ];for_end = strstart [
  nextstr [e ]]- 1 ; if ( j <= for_end) do 
    {
      c = strpool [j ];
      incr ( k ) ;
      if ( k <= maxint ) 
      nameoffile [k ]= xchr [c ];
    } 
  while ( j++ < for_end ) ;} 
  if ( k <= maxint ) 
  namelength = k ;
  else namelength = maxint ;
  nameoffile [namelength + 1 ]= 0 ;
} 
void 
#ifdef HAVE_PROTOTYPES
zstrscanfile ( strnumber s ) 
#else
zstrscanfile ( s ) 
  strnumber s ;
#endif
{
  /* 30 */ poolpointer p, q  ;
  beginname () ;
  p = strstart [s ];
  q = strstart [nextstr [s ]];
  while ( p < q ) {
      
    if ( ! morename ( strpool [p ]) ) 
    goto lab30 ;
    incr ( p ) ;
  } 
  lab30: endname () ;
} 
fontnumber 
#ifdef HAVE_PROTOTYPES
zreadfontinfo ( strnumber fname ) 
#else
zreadfontinfo ( fname ) 
  strnumber fname ;
#endif
{
  /* 11 30 */ register fontnumber Result; boolean fileopened  ;
  fontnumber n  ;
  halfword lf, lh, bc, ec, nw, nh, nd  ;
  integer whdsize  ;
  integer i, ii  ;
  integer jj  ;
  scaled z  ;
  fraction d  ;
  eightbits handd  ;
  n = 0 ;
  fileopened = false ;
  strscanfile ( fname ) ;
  if ( curext == 284 ) 
  curext = 1092 ;
  packfilename ( curname , curarea , curext ) ;
  if ( ! bopenin ( tfminfile ) ) 
  goto lab11 ;
  fileopened = true ;
  {
    lf = tfmtemp ;
    if ( lf > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    lf = lf * 256 + tfmtemp ;
  } 
  tfmtemp = getc ( tfminfile ) ;
  {
    lh = tfmtemp ;
    if ( lh > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    lh = lh * 256 + tfmtemp ;
  } 
  tfmtemp = getc ( tfminfile ) ;
  {
    bc = tfmtemp ;
    if ( bc > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    bc = bc * 256 + tfmtemp ;
  } 
  tfmtemp = getc ( tfminfile ) ;
  {
    ec = tfmtemp ;
    if ( ec > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    ec = ec * 256 + tfmtemp ;
  } 
  if ( ( bc > 1 + ec ) || ( ec > 255 ) ) 
  goto lab11 ;
  tfmtemp = getc ( tfminfile ) ;
  {
    nw = tfmtemp ;
    if ( nw > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    nw = nw * 256 + tfmtemp ;
  } 
  tfmtemp = getc ( tfminfile ) ;
  {
    nh = tfmtemp ;
    if ( nh > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    nh = nh * 256 + tfmtemp ;
  } 
  tfmtemp = getc ( tfminfile ) ;
  {
    nd = tfmtemp ;
    if ( nd > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    nd = nd * 256 + tfmtemp ;
  } 
  whdsize = ( ec + 1 - bc ) + nw + nh + nd ;
  if ( lf < 6 + lh + whdsize ) 
  goto lab11 ;
  {register integer for_end; jj = 10 ;for_end = 1 ; if ( jj >= for_end) do 
    tfmtemp = getc ( tfminfile ) ;
  while ( jj-- > for_end ) ;} 
  if ( nextfmem < bc + 0 ) 
  nextfmem = bc + 0 ;
  if ( ( lastfnum == fontmax ) || ( nextfmem + whdsize >= fontmemsize ) ) 
  {
    {
      if ( interaction == 3 ) 
      ;
      printnl ( 262 ) ;
      print ( 1100 ) ;
    } 
    print ( fname ) ;
    print ( 1107 ) ;
    {
      helpptr = 3 ;
      helpline [2 ]= 1108 ;
      helpline [1 ]= 1109 ;
      helpline [0 ]= 1110 ;
    } 
    error () ;
    goto lab30 ;
  } 
  incr ( lastfnum ) ;
  n = lastfnum ;
  fontbc [n ]= bc ;
  fontec [n ]= ec ;
  charbase [n ]= nextfmem - bc - 0 ;
  widthbase [n ]= nextfmem + ec - bc + 1 ;
  heightbase [n ]= widthbase [n ]+ 0 + nw ;
  depthbase [n ]= heightbase [n ]+ nh ;
  nextfmem = nextfmem + whdsize ;
  if ( lh < 2 ) 
  goto lab11 ;
  {register integer for_end; jj = 4 ;for_end = 1 ; if ( jj >= for_end) do 
    tfmtemp = getc ( tfminfile ) ;
  while ( jj-- > for_end ) ;} 
  tfmtemp = getc ( tfminfile ) ;
  {
    z = tfmtemp ;
    if ( z > 127 ) 
    goto lab11 ;
    tfmtemp = getc ( tfminfile ) ;
    z = z * 256 + tfmtemp ;
  } 
  tfmtemp = getc ( tfminfile ) ;
  z = z * 256 + tfmtemp ;
  tfmtemp = getc ( tfminfile ) ;
  z = z * 256 + tfmtemp ;
  fontdsize [n ]= takefraction ( z , 267432584L ) ;
  {register integer for_end; jj = 4 * ( lh - 2 ) ;for_end = 1 ; if ( jj >= 
  for_end) do 
    tfmtemp = getc ( tfminfile ) ;
  while ( jj-- > for_end ) ;} 
  ii = widthbase [n ]+ 0 ;
  i = charbase [n ]+ 0 + bc ;
  while ( i < ii ) {
      
    tfmtemp = getc ( tfminfile ) ;
    fontinfo [i ].qqqq .b0 = tfmtemp ;
    tfmtemp = getc ( tfminfile ) ;
    handd = tfmtemp ;
    fontinfo [i ].qqqq .b1 = handd / 16 ;
    fontinfo [i ].qqqq .b2 = handd % 16 ;
    tfmtemp = getc ( tfminfile ) ;
    tfmtemp = getc ( tfminfile ) ;
    incr ( i ) ;
  } 
  while ( i < nextfmem ) {
      
    tfmtemp = getc ( tfminfile ) ;
    d = tfmtemp ;
    if ( d >= 128 ) 
    d = d - 256 ;
    tfmtemp = getc ( tfminfile ) ;
    d = d * 256 + tfmtemp ;
    tfmtemp = getc ( tfminfile ) ;
    d = d * 256 + tfmtemp ;
    tfmtemp = getc ( tfminfile ) ;
    d = d * 256 + tfmtemp ;
    fontinfo [i ].cint = takefraction ( d * 16 , fontdsize [n ]) ;
    incr ( i ) ;
  } 
  if ( feof ( tfminfile ) ) 
  goto lab11 ;
  goto lab30 ;
  lab11: {
      
    if ( interaction == 3 ) 
    ;
    printnl ( 262 ) ;
    print ( 1100 ) ;
  } 
  print ( fname ) ;
  if ( fileopened ) 
  print ( 1101 ) ;
  else print ( 1102 ) ;
  {
    helpptr = 3 ;
    helpline [2 ]= 1103 ;
    helpline [1 ]= 1104 ;
    helpline [0 ]= 1105 ;
  } 
  if ( fileopened ) 
  helpline [0 ]= 1106 ;
  error () ;
  lab30: if ( fileopened ) 
  bclose ( tfminfile ) ;
  if ( n != 0 ) 
  {
    fontpsname [n ]= fname ;
    fontname [n ]= fname ;
    strref [fname ]= 127 ;
  } 
  Result = n ;
  return Result ;
} 
fontnumber 
#ifdef HAVE_PROTOTYPES
zfindfont ( strnumber f ) 
#else
zfindfont ( f ) 
  strnumber f ;
#endif
{
  /* 10 40 */ register fontnumber Result; fontnumber n  ;
  {register integer for_end; n = 0 ;for_end = lastfnum ; if ( n <= for_end) 
  do 
    if ( strvsstr ( f , fontname [n ]) == 0 ) 
    goto lab40 ;
  while ( n++ < for_end ) ;} 
  Result = readfontinfo ( f ) ;
  goto lab10 ;
  lab40: Result = n ;
  lab10: ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zlostwarning ( fontnumber f , poolpointer k ) 
#else
zlostwarning ( f , k ) 
  fontnumber f ;
  poolpointer k ;
#endif
{
  if ( internal [11 ]> 0 ) 
  {
    begindiagnostic () ;
    printnl ( 1111 ) ;
    print ( strpool [k ]) ;
    print ( 1112 ) ;
    print ( fontname [f ]) ;
    printchar ( 33 ) ;
    enddiagnostic ( false ) ;
  } 
} 
void 
#ifdef HAVE_PROTOTYPES
zsettextbox ( halfword p ) 
#else
zsettextbox ( p ) 
  halfword p ;
#endif
{
  fontnumber f  ;
  poolASCIIcode bc, ec  ;
  poolpointer k, kk  ;
  fourquarters cc  ;
  scaled h, d  ;
  mem [p + 5 ].cint = 0 ;
  mem [p + 6 ].cint = -2147483647L ;
  mem [p + 7 ].cint = -2147483647L ;
  f = mem [p + 1 ].hhfield .lhfield ;
  bc = fontbc [f ];
  ec = fontec [f ];
  kk = strstart [nextstr [mem [p + 1 ].hhfield .v.RH ]];
  k = strstart [mem [p + 1 ].hhfield .v.RH ];
  while ( k < kk ) {
      
    if ( ( strpool [k ]< bc ) || ( strpool [k ]> ec ) ) 
    lostwarning ( f , k ) ;
    else {
	
      cc = fontinfo [charbase [f ]+ strpool [k ]].qqqq ;
      if ( ! ( cc .b0 > 0 ) ) 
      lostwarning ( f , k ) ;
      else {
	  
	mem [p + 5 ].cint = mem [p + 5 ].cint + fontinfo [widthbase [f ]
	+ cc .b0 ].cint ;
	h = fontinfo [heightbase [f ]+ cc .b1 ].cint ;
	d = fontinfo [depthbase [f ]+ cc .b2 ].cint ;
	if ( h > mem [p + 6 ].cint ) 
	mem [p + 6 ].cint = h ;
	if ( d > mem [p + 7 ].cint ) 
	mem [p + 7 ].cint = d ;
      } 
    } 
    incr ( k ) ;
  } 
  if ( mem [p + 6 ].cint < - (integer) mem [p + 7 ].cint ) 
  {
    mem [p + 6 ].cint = 0 ;
    mem [p + 7 ].cint = 0 ;
  } 
} 
halfword 
#ifdef HAVE_PROTOTYPES
znewtextnode ( strnumber f , strnumber s ) 
#else
znewtextnode ( f , s ) 
  strnumber f ;
  strnumber s ;
#endif
{
  register halfword Result; halfword t  ;
  t = getnode ( 14 ) ;
  mem [t ].hhfield .b0 = 3 ;
  mem [t + 1 ].hhfield .v.RH = s ;
  mem [t + 1 ].hhfield .lhfield = findfont ( f ) ;
  mem [t + 2 ].cint = 0 ;
  mem [t + 3 ].cint = 0 ;
  mem [t + 4 ].cint = 0 ;
  mem [t + 8 ].cint = 0 ;
  mem [t + 9 ].cint = 0 ;
  mem [t + 10 ].cint = 65536L ;
  mem [t + 11 ].cint = 0 ;
  mem [t + 12 ].cint = 0 ;
  mem [t + 13 ].cint = 65536L ;
  settextbox ( t ) ;
  Result = t ;
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
znewboundsnode ( halfword p , smallnumber c ) 
#else
znewboundsnode ( p , c ) 
  halfword p ;
  smallnumber c ;
#endif
{
  register halfword Result; halfword t  ;
  t = getnode ( grobjectsize [c ]) ;
  mem [t ].hhfield .b0 = c ;
  mem [t + 1 ].hhfield .v.RH = p ;
  Result = t ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zinitbbox ( halfword h ) 
#else
zinitbbox ( h ) 
  halfword h ;
#endif
{
  mem [h + 6 ].hhfield .v.RH = h + 7 ;
  mem [h + 6 ].hhfield .lhfield = 0 ;
  mem [h + 2 ].cint = 2147483647L ;
  mem [h + 3 ].cint = 2147483647L ;
  mem [h + 4 ].cint = -2147483647L ;
  mem [h + 5 ].cint = -2147483647L ;
} 
void 
#ifdef HAVE_PROTOTYPES
zinitedges ( halfword h ) 
#else
zinitedges ( h ) 
  halfword h ;
#endif
{
  mem [h ].hhfield .v.RH = 2 ;
  mem [h + 7 ].hhfield .lhfield = h + 7 ;
  mem [h + 7 ].hhfield .v.RH = 0 ;
  mem [h ].hhfield .lhfield = 0 ;
  initbbox ( h ) ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zcopyobjects ( halfword p , halfword q ) 
#else
zcopyobjects ( p , q ) 
  halfword p ;
  halfword q ;
#endif
{
  register halfword Result; halfword hh  ;
  halfword pp  ;
  smallnumber k  ;
  hh = getnode ( 8 ) ;
  mem [hh ].hhfield .v.RH = 2 ;
  mem [hh ].hhfield .lhfield = 0 ;
  pp = hh + 7 ;
  while ( ( p != q ) ) {
      
    k = grobjectsize [mem [p ].hhfield .b0 ];
    mem [pp ].hhfield .v.RH = getnode ( k ) ;
    pp = mem [pp ].hhfield .v.RH ;
    while ( ( k > 0 ) ) {
	
      decr ( k ) ;
      mem [pp + k ]= mem [p + k ];
    } 
    switch ( mem [p ].hhfield .b0 ) 
    {case 4 : 
    case 5 : 
      mem [pp + 1 ].hhfield .v.RH = copypath ( mem [p + 1 ].hhfield .v.RH 
      ) ;
      break ;
    case 1 : 
      {
	mem [pp + 1 ].hhfield .v.RH = copypath ( mem [p + 1 ].hhfield 
	.v.RH ) ;
	if ( mem [p + 1 ].hhfield .lhfield != 0 ) 
	mem [pp + 1 ].hhfield .lhfield = makepen ( copypath ( mem [p + 1 ]
	.hhfield .lhfield ) , false ) ;
      } 
      break ;
    case 2 : 
      {
	mem [pp + 1 ].hhfield .v.RH = copypath ( mem [p + 1 ].hhfield 
	.v.RH ) ;
	mem [pp + 1 ].hhfield .lhfield = makepen ( copypath ( mem [p + 1 ]
	.hhfield .lhfield ) , false ) ;
	if ( mem [p + 6 ].hhfield .v.RH != 0 ) 
	incr ( mem [mem [pp + 6 ].hhfield .v.RH ].hhfield .lhfield ) ;
      } 
      break ;
    case 3 : 
      {
	if ( strref [mem [pp + 1 ].hhfield .v.RH ]< 127 ) 
	incr ( strref [mem [pp + 1 ].hhfield .v.RH ]) ;
      } 
      break ;
    case 6 : 
    case 7 : 
      ;
      break ;
    } 
    p = mem [p ].hhfield .v.RH ;
  } 
  mem [hh + 7 ].hhfield .lhfield = pp ;
  mem [pp ].hhfield .v.RH = 0 ;
  Result = hh ;
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zprivateedges ( halfword h ) 
#else
zprivateedges ( h ) 
  halfword h ;
#endif
{
  register halfword Result; halfword hh  ;
  halfword p, pp  ;
  if ( mem [h ].hhfield .lhfield == 0 ) 
  Result = h ;
  else {
      
    decr ( mem [h ].hhfield .lhfield ) ;
    hh = copyobjects ( mem [h + 7 ].hhfield .v.RH , 0 ) ;
    pp = hh ;
    p = mem [h ].hhfield .v.RH ;
    while ( ( p != 2 ) ) {
	
      mem [pp ].hhfield .v.RH = getnode ( 3 ) ;
      pp = mem [pp ].hhfield .v.RH ;
      mem [pp + 1 ].cint = mem [p + 1 ].cint ;
      mem [pp + 2 ].cint = mem [p + 2 ].cint ;
      p = mem [p ].hhfield .v.RH ;
    } 
    mem [pp ].hhfield .v.RH = 2 ;
    mem [hh + 1 ].cint = mem [h + 1 ].cint ;
    mem [hh + 2 ].cint = mem [h + 2 ].cint ;
    mem [hh + 3 ].cint = mem [h + 3 ].cint ;
    mem [hh + 4 ].cint = mem [h + 4 ].cint ;
    mem [hh + 5 ].cint = mem [h + 5 ].cint ;
    mem [hh + 6 ].hhfield .lhfield = mem [h + 6 ].hhfield .lhfield ;
    p = h + 7 ;
    pp = hh + 7 ;
    while ( ( p != mem [h + 6 ].hhfield .v.RH ) ) {
	
      if ( p == 0 ) 
      confusion ( 551 ) ;
      p = mem [p ].hhfield .v.RH ;
      pp = mem [pp ].hhfield .v.RH ;
    } 
    mem [hh + 6 ].hhfield .v.RH = pp ;
    Result = hh ;
  } 
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zskip1component ( halfword p ) 
#else
zskip1component ( p ) 
  halfword p ;
#endif
{
  register halfword Result; integer lev  ;
  lev = 0 ;
  do {
      if ( ( mem [p ].hhfield .b0 >= 4 ) ) 
    if ( ( mem [p ].hhfield .b0 >= 6 ) ) 
    decr ( lev ) ;
    else incr ( lev ) ;
    p = mem [p ].hhfield .v.RH ;
  } while ( ! ( lev == 0 ) ) ;
  Result = p ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
xretraceerror ( void ) 
#else
xretraceerror ( ) 
#endif
{
  {
    if ( interaction == 3 ) 
    ;
    printnl ( 262 ) ;
    print ( 580 ) ;
  } 
  {
    helpptr = 3 ;
    helpline [2 ]= 584 ;
    helpline [1 ]= 585 ;
    helpline [0 ]= 583 ;
  } 
  putgeterror () ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zmakedashes ( halfword h ) 
#else
zmakedashes ( h ) 
  halfword h ;
#endif
{
  /* 10 40 45 */ register halfword Result; halfword p  ;
  scaled y0  ;
  halfword p0  ;
  halfword pp, qq, rr  ;
  halfword d, dd  ;
  scaled x0, x1, x2, x3  ;
  halfword dln  ;
  halfword hh  ;
  scaled hsf  ;
  halfword ds  ;
  scaled xoff  ;
  if ( mem [h ].hhfield .v.RH != 2 ) 
  goto lab40 ;
  p0 = 0 ;
  p = mem [h + 7 ].hhfield .v.RH ;
  while ( p != 0 ) {
      
    if ( mem [p ].hhfield .b0 != 2 ) 
    {
      {
	if ( interaction == 3 ) 
	;
	printnl ( 262 ) ;
	print ( 580 ) ;
      } 
      {
	helpptr = 3 ;
	helpline [2 ]= 581 ;
	helpline [1 ]= 582 ;
	helpline [0 ]= 583 ;
      } 
      putgeterror () ;
      goto lab45 ;
    } 
    pp = mem [p + 1 ].hhfield .v.RH ;
    if ( p0 == 0 ) 
    {
      p0 = p ;
      y0 = mem [pp + 2 ].cint ;
    } 
    if ( ( mem [p + 2 ].cint != mem [p0 + 2 ].cint ) || ( mem [p + 3 ]
    .cint != mem [p0 + 3 ].cint ) || ( mem [p + 4 ].cint != mem [p0 + 4 ]
    .cint ) ) 
    {
      {
	if ( interaction == 3 ) 
	;
	printnl ( 262 ) ;
	print ( 580 ) ;
      } 
      {
	helpptr = 3 ;
	helpline [2 ]= 586 ;
	helpline [1 ]= 587 ;
	helpline [0 ]= 583 ;
      } 
      putgeterror () ;
      goto lab45 ;
    } 
    rr = pp ;
    if ( mem [pp ].hhfield .v.RH != pp ) 
    do {
	qq = rr ;
      rr = mem [rr ].hhfield .v.RH ;
      x0 = mem [qq + 1 ].cint ;
      x1 = mem [qq + 5 ].cint ;
      x2 = mem [rr + 3 ].cint ;
      x3 = mem [rr + 1 ].cint ;
      if ( ( x0 > x1 ) || ( x1 > x2 ) || ( x2 > x3 ) ) 
      if ( ( x0 < x1 ) || ( x1 < x2 ) || ( x2 < x3 ) ) 
      if ( abvscd ( x2 - x1 , x2 - x1 , x1 - x0 , x3 - x2 ) > 0 ) 
      {
	xretraceerror () ;
	goto lab45 ;
      } 
      if ( ( mem [pp + 1 ].cint > x0 ) || ( x0 > x3 ) ) 
      if ( ( mem [pp + 1 ].cint < x0 ) || ( x0 < x3 ) ) 
      {
	xretraceerror () ;
	goto lab45 ;
      } 
    } while ( ! ( mem [rr ].hhfield .b1 == 0 ) ) ;
    d = getnode ( 3 ) ;
    if ( mem [p + 6 ].hhfield .v.RH == 0 ) 
    mem [d ].hhfield .lhfield = 0 ;
    else mem [d ].hhfield .lhfield = p ;
    if ( mem [pp + 1 ].cint < mem [rr + 1 ].cint ) 
    {
      mem [d + 1 ].cint = mem [pp + 1 ].cint ;
      mem [d + 2 ].cint = mem [rr + 1 ].cint ;
    } 
    else {
	
      mem [d + 1 ].cint = mem [rr + 1 ].cint ;
      mem [d + 2 ].cint = mem [pp + 1 ].cint ;
    } 
    mem [3 ].cint = mem [d + 2 ].cint ;
    dd = h ;
    while ( mem [mem [dd ].hhfield .v.RH + 1 ].cint < mem [d + 2 ].cint 
    ) dd = mem [dd ].hhfield .v.RH ;
    if ( dd != h ) 
    if ( ( mem [dd + 2 ].cint > mem [d + 1 ].cint ) ) 
    {
      xretraceerror () ;
      goto lab45 ;
    } 
    mem [d ].hhfield .v.RH = mem [dd ].hhfield .v.RH ;
    mem [dd ].hhfield .v.RH = d ;
    p = mem [p ].hhfield .v.RH ;
  } 
  if ( mem [h ].hhfield .v.RH == 2 ) 
  goto lab45 ;
  d = h ;
  while ( mem [d ].hhfield .v.RH != 2 ) {
      
    ds = mem [mem [d ].hhfield .v.RH ].hhfield .lhfield ;
    if ( ds == 0 ) 
    d = mem [d ].hhfield .v.RH ;
    else {
	
      hh = mem [ds + 6 ].hhfield .v.RH ;
      hsf = mem [ds + 7 ].cint ;
      if ( ( hh == 0 ) ) 
      confusion ( 588 ) ;
      if ( mem [hh + 1 ].cint == 0 ) 
      d = mem [d ].hhfield .v.RH ;
      else {
	  
	if ( mem [hh ].hhfield .v.RH == 0 ) 
	confusion ( 588 ) ;
	dln = mem [d ].hhfield .v.RH ;
	dd = mem [hh ].hhfield .v.RH ;
	xoff = mem [dln + 1 ].cint - takescaled ( hsf , mem [dd + 1 ].cint 
	) - takescaled ( hsf , dashoffset ( hh ) ) ;
	mem [3 ].cint = takescaled ( hsf , mem [dd + 1 ].cint ) + 
	takescaled ( hsf , mem [hh + 1 ].cint ) ;
	mem [4 ].cint = mem [3 ].cint ;
	while ( xoff + takescaled ( hsf , mem [dd + 2 ].cint ) < mem [dln + 
	1 ].cint ) dd = mem [dd ].hhfield .v.RH ;
	while ( mem [dln + 1 ].cint <= mem [dln + 2 ].cint ) {
	    
	  if ( dd == 2 ) 
	  {
	    dd = mem [hh ].hhfield .v.RH ;
	    xoff = xoff + takescaled ( hsf , mem [hh + 1 ].cint ) ;
	  } 
	  if ( xoff + takescaled ( hsf , mem [dd + 1 ].cint ) <= mem [dln + 
	  2 ].cint ) 
	  {
	    mem [d ].hhfield .v.RH = getnode ( 3 ) ;
	    d = mem [d ].hhfield .v.RH ;
	    mem [d ].hhfield .v.RH = dln ;
	    if ( mem [dln + 1 ].cint > xoff + takescaled ( hsf , mem [dd + 
	    1 ].cint ) ) 
	    mem [d + 1 ].cint = mem [dln + 1 ].cint ;
	    else mem [d + 1 ].cint = xoff + takescaled ( hsf , mem [dd + 1 
	    ].cint ) ;
	    if ( mem [dln + 2 ].cint < xoff + takescaled ( hsf , mem [dd + 
	    2 ].cint ) ) 
	    mem [d + 2 ].cint = mem [dln + 2 ].cint ;
	    else mem [d + 2 ].cint = xoff + takescaled ( hsf , mem [dd + 2 
	    ].cint ) ;
	  } 
	  dd = mem [dd ].hhfield .v.RH ;
	  mem [dln + 1 ].cint = xoff + takescaled ( hsf , mem [dd + 1 ]
	  .cint ) ;
	} 
	mem [d ].hhfield .v.RH = mem [dln ].hhfield .v.RH ;
	freenode ( dln , 3 ) ;
      } 
    } 
  } 
  d = mem [h ].hhfield .v.RH ;
  while ( ( mem [d ].hhfield .v.RH != 2 ) ) d = mem [d ].hhfield .v.RH ;
  dd = mem [h ].hhfield .v.RH ;
  mem [h + 1 ].cint = mem [d + 2 ].cint - mem [dd + 1 ].cint ;
  if ( abs ( y0 ) > mem [h + 1 ].cint ) 
  mem [h + 1 ].cint = abs ( y0 ) ;
  else if ( d != dd ) 
  {
    mem [h ].hhfield .v.RH = mem [dd ].hhfield .v.RH ;
    mem [d + 2 ].cint = mem [dd + 2 ].cint + mem [h + 1 ].cint ;
    freenode ( dd , 3 ) ;
  } 
  lab40: Result = h ;
  goto lab10 ;
  lab45: flushdashlist ( h ) ;
  if ( mem [h ].hhfield .lhfield == 0 ) 
  tossedges ( h ) ;
  else decr ( mem [h ].hhfield .lhfield ) ;
  Result = 0 ;
  lab10: ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zadjustbbox ( halfword h ) 
#else
zadjustbbox ( h ) 
  halfword h ;
#endif
{
  if ( bbmin [0 ]< mem [h + 2 ].cint ) 
  mem [h + 2 ].cint = bbmin [0 ];
  if ( bbmin [1 ]< mem [h + 3 ].cint ) 
  mem [h + 3 ].cint = bbmin [1 ];
  if ( bbmax [0 ]> mem [h + 4 ].cint ) 
  mem [h + 4 ].cint = bbmax [0 ];
  if ( bbmax [1 ]> mem [h + 5 ].cint ) 
  mem [h + 5 ].cint = bbmax [1 ];
} 
void 
#ifdef HAVE_PROTOTYPES
zboxends ( halfword p , halfword pp , halfword h ) 
#else
zboxends ( p , pp , h ) 
  halfword p ;
  halfword pp ;
  halfword h ;
#endif
{
  /* 10 */ halfword q  ;
  fraction dx, dy  ;
  scaled d  ;
  scaled z  ;
  scaled xx, yy  ;
  integer i  ;
  if ( mem [p ].hhfield .b1 != 0 ) 
  {
    q = mem [p ].hhfield .v.RH ;
    while ( true ) {
	
      if ( q == mem [p ].hhfield .v.RH ) 
      {
	dx = mem [p + 1 ].cint - mem [p + 5 ].cint ;
	dy = mem [p + 2 ].cint - mem [p + 6 ].cint ;
	if ( ( dx == 0 ) && ( dy == 0 ) ) 
	{
	  dx = mem [p + 1 ].cint - mem [q + 3 ].cint ;
	  dy = mem [p + 2 ].cint - mem [q + 4 ].cint ;
	} 
      } 
      else {
	  
	dx = mem [p + 1 ].cint - mem [p + 3 ].cint ;
	dy = mem [p + 2 ].cint - mem [p + 4 ].cint ;
	if ( ( dx == 0 ) && ( dy == 0 ) ) 
	{
	  dx = mem [p + 1 ].cint - mem [q + 5 ].cint ;
	  dy = mem [p + 2 ].cint - mem [q + 6 ].cint ;
	} 
      } 
      dx = mem [p + 1 ].cint - mem [q + 1 ].cint ;
      dy = mem [p + 2 ].cint - mem [q + 2 ].cint ;
      d = pythadd ( dx , dy ) ;
      if ( d > 0 ) 
      {
	dx = makefraction ( dx , d ) ;
	dy = makefraction ( dy , d ) ;
	findoffset ( - (integer) dy , dx , pp ) ;
	xx = curx ;
	yy = cury ;
	{register integer for_end; i = 1 ;for_end = 2 ; if ( i <= for_end) 
	do 
	  {
	    findoffset ( dx , dy , pp ) ;
	    d = takefraction ( xx - curx , dx ) + takefraction ( yy - cury , 
	    dy ) ;
	    if ( ( d < 0 ) && ( i == 1 ) || ( d > 0 ) && ( i == 2 ) ) 
	    confusion ( 589 ) ;
	    z = mem [p + 1 ].cint + curx + takefraction ( d , dx ) ;
	    if ( z < mem [h + 2 ].cint ) 
	    mem [h + 2 ].cint = z ;
	    if ( z > mem [h + 4 ].cint ) 
	    mem [h + 4 ].cint = z ;
	    z = mem [p + 2 ].cint + cury + takefraction ( d , dy ) ;
	    if ( z < mem [h + 3 ].cint ) 
	    mem [h + 3 ].cint = z ;
	    if ( z > mem [h + 5 ].cint ) 
	    mem [h + 5 ].cint = z ;
	    dx = - (integer) dx ;
	    dy = - (integer) dy ;
	  } 
	while ( i++ < for_end ) ;} 
      } 
      if ( mem [p ].hhfield .b1 == 0 ) 
      goto lab10 ;
      else do {
	  q = p ;
	p = mem [p ].hhfield .v.RH ;
      } while ( ! ( mem [p ].hhfield .b1 == 0 ) ) ;
    } 
  } 
  lab10: ;
} 
void 
#ifdef HAVE_PROTOTYPES
zsetbbox ( halfword h , boolean toplevel ) 
#else
zsetbbox ( h , toplevel ) 
  halfword h ;
  boolean toplevel ;
#endif
{
  /* 10 */ halfword p  ;
  scaled sminx, sminy, smaxx, smaxy  ;
  scaled x0, x1, y0, y1  ;
  integer lev  ;
  switch ( mem [h + 6 ].hhfield .lhfield ) 
  {case 0 : 
    ;
    break ;
  case 1 : 
    if ( internal [33 ]> 0 ) 
    initbbox ( h ) ;
    break ;
  case 2 : 
    if ( internal [33 ]<= 0 ) 
    initbbox ( h ) ;
    break ;
  } 
  while ( mem [mem [h + 6 ].hhfield .v.RH ].hhfield .v.RH != 0 ) {
      
    p = mem [mem [h + 6 ].hhfield .v.RH ].hhfield .v.RH ;
    mem [h + 6 ].hhfield .v.RH = p ;
    switch ( mem [p ].hhfield .b0 ) 
    {case 6 : 
      if ( toplevel ) 
      confusion ( 590 ) ;
      else goto lab10 ;
      break ;
    case 1 : 
      {
	pathbbox ( mem [p + 1 ].hhfield .v.RH ) ;
	adjustbbox ( h ) ;
      } 
      break ;
    case 5 : 
      if ( internal [33 ]> 0 ) 
      mem [h + 6 ].hhfield .lhfield = 2 ;
      else {
	  
	mem [h + 6 ].hhfield .lhfield = 1 ;
	pathbbox ( mem [p + 1 ].hhfield .v.RH ) ;
	adjustbbox ( h ) ;
	lev = 1 ;
	while ( lev != 0 ) {
	    
	  if ( mem [p ].hhfield .v.RH == 0 ) 
	  confusion ( 591 ) ;
	  p = mem [p ].hhfield .v.RH ;
	  if ( mem [p ].hhfield .b0 == 5 ) 
	  incr ( lev ) ;
	  else if ( mem [p ].hhfield .b0 == 7 ) 
	  decr ( lev ) ;
	} 
	mem [h + 6 ].hhfield .v.RH = p ;
      } 
      break ;
    case 7 : 
      if ( internal [33 ]<= 0 ) 
      confusion ( 591 ) ;
      break ;
    case 2 : 
      {
	pathbbox ( mem [p + 1 ].hhfield .v.RH ) ;
	x0 = bbmin [0 ];
	y0 = bbmin [1 ];
	x1 = bbmax [0 ];
	y1 = bbmax [1 ];
	penbbox ( mem [p + 1 ].hhfield .lhfield ) ;
	bbmin [0 ]= bbmin [0 ]+ x0 ;
	bbmin [1 ]= bbmin [1 ]+ y0 ;
	bbmax [0 ]= bbmax [0 ]+ x1 ;
	bbmax [1 ]= bbmax [1 ]+ y1 ;
	adjustbbox ( h ) ;
	if ( ( mem [mem [p + 1 ].hhfield .v.RH ].hhfield .b0 == 0 ) && ( 
	mem [p + 6 ].hhfield .b0 == 2 ) ) 
	boxends ( mem [p + 1 ].hhfield .v.RH , mem [p + 1 ].hhfield 
	.lhfield , h ) ;
      } 
      break ;
    case 3 : 
      {
	x1 = takescaled ( mem [p + 10 ].cint , mem [p + 5 ].cint ) ;
	y0 = takescaled ( mem [p + 11 ].cint , - (integer) mem [p + 7 ]
	.cint ) ;
	y1 = takescaled ( mem [p + 11 ].cint , mem [p + 6 ].cint ) ;
	bbmin [0 ]= mem [p + 8 ].cint ;
	bbmax [0 ]= bbmin [0 ];
	if ( y0 < y1 ) 
	{
	  bbmin [0 ]= bbmin [0 ]+ y0 ;
	  bbmax [0 ]= bbmax [0 ]+ y1 ;
	} 
	else {
	    
	  bbmin [0 ]= bbmin [0 ]+ y1 ;
	  bbmax [0 ]= bbmax [0 ]+ y0 ;
	} 
	if ( x1 < 0 ) 
	bbmin [0 ]= bbmin [0 ]+ x1 ;
	else bbmax [0 ]= bbmax [0 ]+ x1 ;
	x1 = takescaled ( mem [p + 12 ].cint , mem [p + 5 ].cint ) ;
	y0 = takescaled ( mem [p + 13 ].cint , - (integer) mem [p + 7 ]
	.cint ) ;
	y1 = takescaled ( mem [p + 13 ].cint , mem [p + 6 ].cint ) ;
	bbmin [1 ]= mem [p + 9 ].cint ;
	bbmax [1 ]= bbmin [1 ];
	if ( y0 < y1 ) 
	{
	  bbmin [1 ]= bbmin [1 ]+ y0 ;
	  bbmax [1 ]= bbmax [1 ]+ y1 ;
	} 
	else {
	    
	  bbmin [1 ]= bbmin [1 ]+ y1 ;
	  bbmax [1 ]= bbmax [1 ]+ y0 ;
	} 
	if ( x1 < 0 ) 
	bbmin [1 ]= bbmin [1 ]+ x1 ;
	else bbmax [1 ]= bbmax [1 ]+ x1 ;
	adjustbbox ( h ) ;
      } 
      break ;
    case 4 : 
      {
	pathbbox ( mem [p + 1 ].hhfield .v.RH ) ;
	x0 = bbmin [0 ];
	y0 = bbmin [1 ];
	x1 = bbmax [0 ];
	y1 = bbmax [1 ];
	sminx = mem [h + 2 ].cint ;
	sminy = mem [h + 3 ].cint ;
	smaxx = mem [h + 4 ].cint ;
	smaxy = mem [h + 5 ].cint ;
	mem [h + 2 ].cint = 2147483647L ;
	mem [h + 3 ].cint = 2147483647L ;
	mem [h + 4 ].cint = -2147483647L ;
	mem [h + 5 ].cint = -2147483647L ;
	setbbox ( h , false ) ;
	if ( mem [h + 2 ].cint < x0 ) 
	mem [h + 2 ].cint = x0 ;
	if ( mem [h + 3 ].cint < y0 ) 
	mem [h + 3 ].cint = y0 ;
	if ( mem [h + 4 ].cint > x1 ) 
	mem [h + 4 ].cint = x1 ;
	if ( mem [h + 5 ].cint > y1 ) 
	mem [h + 5 ].cint = y1 ;
	bbmin [0 ]= sminx ;
	bbmin [1 ]= sminy ;
	bbmax [0 ]= smaxx ;
	bbmax [1 ]= smaxy ;
	adjustbbox ( h ) ;
      } 
      break ;
    } 
  } 
  if ( ! toplevel ) 
  confusion ( 590 ) ;
  lab10: ;
} 
void 
#ifdef HAVE_PROTOTYPES
zsplitcubic ( halfword p , fraction t ) 
#else
zsplitcubic ( p , t ) 
  halfword p ;
  fraction t ;
#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 = 1 ;
  mem [r ].hhfield .b1 = 1 ;
  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 - mem [q + 1 ].cint , 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 - mem [q + 2 ].cint , 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
zremovecubic ( halfword p ) 
#else
zremovecubic ( p ) 
  halfword p ;
#endif
{
  halfword q  ;
  q = mem [p ].hhfield .v.RH ;
  mem [p ].hhfield .v.RH = mem [q ].hhfield .v.RH ;
  mem [p + 5 ].cint = mem [q + 5 ].cint ;
  mem [p + 6 ].cint = mem [q + 6 ].cint ;
  freenode ( q , 7 ) ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zpenwalk ( halfword w , integer k ) 
#else
zpenwalk ( w , k ) 
  halfword w ;
  integer k ;
#endif
{
  register halfword Result; while ( k > 0 ) {
      
    w = mem [w ].hhfield .v.RH ;
    decr ( k ) ;
  } 
  while ( k < 0 ) {
      
    w = mem [w ].hhfield .lhfield ;
    incr ( k ) ;
  } 
  Result = w ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zfinoffsetprep ( halfword p , halfword w , integer x0 , integer x1 , integer 
x2 , integer y0 , integer y1 , integer y2 , integer rise , integer turnamt ) 
#else
zfinoffsetprep ( p , w , x0 , x1 , x2 , y0 , y1 , y2 , rise , turnamt ) 
  halfword p ;
  halfword w ;
  integer x0 ;
  integer x1 ;
  integer x2 ;
  integer y0 ;
  integer y1 ;
  integer y2 ;
  integer rise ;
  integer turnamt ;
#endif
{
  /* 10 */ halfword ww  ;
  scaled du, dv  ;
  integer t0, t1, t2  ;
  fraction t  ;
  fraction s  ;
  integer v  ;
  halfword q  ;
  q = mem [p ].hhfield .v.RH ;
  while ( true ) {
      
    if ( rise > 0 ) 
    ww = mem [w ].hhfield .v.RH ;
    else ww = mem [w ].hhfield .lhfield ;
    du = mem [ww + 1 ].cint - mem [w + 1 ].cint ;
    dv = mem [ww + 2 ].cint - mem [w + 2 ].cint ;
    if ( abs ( du ) >= abs ( dv ) ) 
    {
      s = makefraction ( dv , du ) ;
      t0 = takefraction ( x0 , s ) - y0 ;
      t1 = takefraction ( x1 , s ) - y1 ;
      t2 = takefraction ( x2 , s ) - y2 ;
      if ( du < 0 ) 
      {
	t0 = - (integer) t0 ;
	t1 = - (integer) t1 ;
	t2 = - (integer) t2 ;
      } 
    } 
    else {
	
      s = makefraction ( du , dv ) ;
      t0 = x0 - takefraction ( y0 , s ) ;
      t1 = x1 - takefraction ( y1 , s ) ;
      t2 = x2 - takefraction ( y2 , s ) ;
      if ( dv < 0 ) 
      {
	t0 = - (integer) t0 ;
	t1 = - (integer) t1 ;
	t2 = - (integer) t2 ;
      } 
    } 
    if ( t0 < 0 ) 
    t0 = 0 ;
    t = crossingpoint ( t0 , t1 , t2 ) ;
    if ( t >= 268435456L ) 
    if ( turnamt > 0 ) 
    t = 268435456L ;
    else goto lab10 ;
    {
      splitcubic ( p , t ) ;
      p = mem [p ].hhfield .v.RH ;
      mem [p ].hhfield .lhfield = 16384 + rise ;
      decr ( turnamt ) ;
      v = x0 - takefraction ( x0 - x1 , t ) ;
      x1 = x1 - takefraction ( x1 - x2 , t ) ;
      x0 = v - takefraction ( v - x1 , t ) ;
      v = y0 - takefraction ( y0 - y1 , t ) ;
      y1 = y1 - takefraction ( y1 - y2 , t ) ;
      y0 = v - takefraction ( v - y1 , t ) ;
      if ( turnamt < 0 ) 
      {
	t1 = t1 - takefraction ( t1 - t2 , t ) ;
	if ( t1 > 0 ) 
	t1 = 0 ;
	t = crossingpoint ( 0 , - (integer) t1 , - (integer) t2 ) ;
	if ( t > 268435456L ) 
	t = 268435456L ;
	incr ( turnamt ) ;
	if ( ( t == 268435456L ) && ( mem [p ].hhfield .v.RH != q ) ) 
	mem [mem [p ].hhfield .v.RH ].hhfield .lhfield = mem [mem [p ]
	.hhfield .v.RH ].hhfield .lhfield - rise ;
	else {
	    
	  splitcubic ( p , t ) ;
	  mem [mem [p ].hhfield .v.RH ].hhfield .lhfield = 16384 - rise ;
	  v = x1 - takefraction ( x1 - x2 , t ) ;
	  x1 = x0 - takefraction ( x0 - x1 , t ) ;
	  x2 = x1 - takefraction ( x1 - v , t ) ;
	  v = y1 - takefraction ( y1 - y2 , t ) ;
	  y1 = y0 - takefraction ( y0 - y1 , t ) ;
	  y2 = y1 - takefraction ( y1 - v , t ) ;
	} 
      } 
    } 
    w = ww ;
  } 
  lab10: ;
} 
integer 
#ifdef HAVE_PROTOTYPES
zgetturnamt ( halfword w , scaled dx , scaled dy , boolean ccw ) 
#else
zgetturnamt ( w , dx , dy , ccw ) 
  halfword w ;
  scaled dx ;
  scaled dy ;
  boolean ccw ;
#endif
{
  /* 30 */ register integer Result; halfword ww  ;
  integer s  ;
  integer t  ;
  s = 0 ;
  if ( ccw ) 
  {
    ww = mem [w ].hhfield .v.RH ;
    do {
	t = abvscd ( dy , mem [ww + 1 ].cint - mem [w + 1 ].cint , dx , 
      mem [ww + 2 ].cint - mem [w + 2 ].cint ) ;
      if ( t < 0 ) 
      goto lab30 ;
      incr ( s ) ;
      w = ww ;
      ww = mem [ww ].hhfield .v.RH ;
    } while ( ! ( t <= 0 ) ) ;
    lab30: ;
  } 
  else {
      
    ww = mem [w ].hhfield .lhfield ;
    while ( abvscd ( dy , mem [w + 1 ].cint - mem [ww + 1 ].cint , dx , 
    mem [w + 2 ].cint - mem [ww + 2 ].cint ) < 0 ) {
	
      decr ( s ) ;
      w = ww ;
      ww = mem [ww ].hhfield .lhfield ;
    } 
  } 
  Result = s ;
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zoffsetprep ( halfword c , halfword h ) 
#else
zoffsetprep ( c , h ) 
  halfword c ;
  halfword h ;
#endif
{
  /* 45 */ register halfword Result; halfword n  ;
  halfword p, q, r, w, ww  ;
  integer kneeded  ;
  halfword w0  ;
  scaled dxin, dyin  ;
  integer turnamt  ;
  integer x0, x1, x2, y0, y1, y2  ;
  integer t0, t1, t2  ;
  integer du, dv, dx, dy  ;
  integer dx0, dy0  ;
  integer lmaxcoef  ;
  integer x0a, x1a, x2a, y0a, y1a, y2a  ;
  fraction t  ;
  fraction s  ;
  integer u0, u1, v0, v1  ;
  integer ss  ;
  schar dsign  ;
  n = 0 ;
  p = h ;
  do {
      incr ( n ) ;
    p = mem [p ].hhfield .v.RH ;
  } while ( ! ( p == h ) ) ;
  dxin = mem [mem [h ].hhfield .v.RH + 1 ].cint - mem [mem [h ].hhfield 
  .lhfield + 1 ].cint ;
  dyin = mem [mem [h ].hhfield .v.RH + 2 ].cint - mem [mem [h ].hhfield 
  .lhfield + 2 ].cint ;
  if ( ( dxin == 0 ) && ( dyin == 0 ) ) 
  {
    dxin = mem [mem [h ].hhfield .lhfield + 2 ].cint - mem [h + 2 ].cint 
    ;
    dyin = mem [h + 1 ].cint - mem [mem [h ].hhfield .lhfield + 1 ].cint 
    ;
  } 
  w0 = h ;
  p = c ;
  kneeded = 0 ;
  do {
      q = mem [p ].hhfield .v.RH ;
    mem [p ].hhfield .lhfield = 16384 + kneeded ;
    kneeded = 0 ;
    x0 = mem [p + 5 ].cint - mem [p + 1 ].cint ;
    x2 = mem [q + 1 ].cint - mem [q + 3 ].cint ;
    x1 = mem [q + 3 ].cint - mem [p + 5 ].cint ;
    y0 = mem [p + 6 ].cint - mem [p + 2 ].cint ;
    y2 = mem [q + 2 ].cint - mem [q + 4 ].cint ;
    y1 = mem [q + 4 ].cint - mem [p + 6 ].cint ;
    lmaxcoef = abs ( x0 ) ;
    if ( abs ( x1 ) > lmaxcoef ) 
    lmaxcoef = abs ( x1 ) ;
    if ( abs ( x2 ) > lmaxcoef ) 
    lmaxcoef = abs ( x2 ) ;
    if ( abs ( y0 ) > lmaxcoef ) 
    lmaxcoef = abs ( y0 ) ;
    if ( abs ( y1 ) > lmaxcoef ) 
    lmaxcoef = abs ( y1 ) ;
    if ( abs ( y2 ) > lmaxcoef ) 
    lmaxcoef = abs ( y2 ) ;
    if ( lmaxcoef == 0 ) 
    goto lab45 ;
    while ( lmaxcoef < 134217728L ) {
	
      lmaxcoef = lmaxcoef + lmaxcoef ;
      x0 = x0 + x0 ;
      x1 = x1 + x1 ;
      x2 = x2 + x2 ;
      y0 = y0 + y0 ;
      y1 = y1 + y1 ;
      y2 = y2 + y2 ;
    } 
    dx = x0 ;
    dy = y0 ;
    if ( dx == 0 ) 
    if ( dy == 0 ) 
    {
      dx = x1 ;
      dy = y1 ;
      if ( dx == 0 ) 
      if ( dy == 0 ) 
      {
	dx = x2 ;
	dy = y2 ;
      } 
    } 
    if ( p == c ) 
    {
      dx0 = dx ;
      dy0 = dy ;
    } 
    turnamt = getturnamt ( w0 , dx , dy , abvscd ( dy , dxin , dx , dyin ) >= 
    0 ) ;
    w = penwalk ( w0 , turnamt ) ;
    w0 = w ;
    mem [p ].hhfield .lhfield = mem [p ].hhfield .lhfield + turnamt ;
    dxin = x2 ;
    dyin = y2 ;
    if ( dxin == 0 ) 
    if ( dyin == 0 ) 
    {
      dxin = x1 ;
      dyin = y1 ;
      if ( dxin == 0 ) 
      if ( dyin == 0 ) 
      {
	dxin = x0 ;
	dyin = y0 ;
      } 
    } 
    dsign = abvscd ( dx , dyin , dxin , dy ) ;
    if ( dsign == 0 ) 
    if ( dx == 0 ) 
    if ( dy > 0 ) 
    dsign = 1 ;
    else dsign = -1 ;
    else if ( dx > 0 ) 
    dsign = 1 ;
    else dsign = -1 ;
    t0 = half ( takefraction ( x0 , y2 ) ) - half ( takefraction ( x2 , y0 ) ) 
    ;
    t1 = half ( takefraction ( x1 , y0 + y2 ) ) - half ( takefraction ( y1 , 
    x0 + x2 ) ) ;
    if ( t0 == 0 ) 
    t0 = dsign ;
    if ( t0 > 0 ) 
    {
      t = crossingpoint ( t0 , t1 , - (integer) t0 ) ;
      u0 = x0 - takefraction ( x0 - x1 , t ) ;
      u1 = x1 - takefraction ( x1 - x2 , t ) ;
      v0 = y0 - takefraction ( y0 - y1 , t ) ;
      v1 = y1 - takefraction ( y1 - y2 , t ) ;
    } 
    else {
	
      t = crossingpoint ( - (integer) t0 , t1 , t0 ) ;
      u0 = x2 - takefraction ( x2 - x1 , t ) ;
      u1 = x1 - takefraction ( x1 - x0 , t ) ;
      v0 = y2 - takefraction ( y2 - y1 , t ) ;
      v1 = y1 - takefraction ( y1 - y0 , t ) ;
    } 
    ss = takefraction ( x0 + x2 , u0 - takefraction ( u0 - u1 , t ) ) + 
    takefraction ( y0 + y2 , v0 - takefraction ( v0 - v1 , t ) ) ;
    turnamt = getturnamt ( w , dxin , dyin , dsign > 0 ) ;
    if ( ss < 0 ) 
    turnamt = turnamt - dsign * n ;
    ww = mem [w ].hhfield .lhfield ;
    du = mem [ww + 1 ].cint - mem [w + 1 ].cint ;
    dv = mem [ww + 2 ].cint - mem [w + 2 ].cint ;
    if ( abs ( du ) >= abs ( dv ) ) 
    {
      s = makefraction ( dv , du ) ;
      t0 = takefraction ( x0 , s ) - y0 ;
      t1 = takefraction ( x1 , s ) - y1 ;
      t2 = takefraction ( x2 , s ) - y2 ;
      if ( du < 0 ) 
      {
	t0 = - (integer) t0 ;
	t1 = - (integer) t1 ;
	t2 = - (integer) t2 ;
      } 
    } 
    else {
	
      s = makefraction ( du , dv ) ;
      t0 = x0 - takefraction ( y0 , s ) ;
      t1 = x1 - takefraction ( y1 , s ) ;
      t2 = x2 - takefraction ( y2 , s ) ;
      if ( dv < 0 ) 
      {
	t0 = - (integer) t0 ;
	t1 = - (integer) t1 ;
	t2 = - (integer) t2 ;
      } 
    } 
    if ( t0 < 0 ) 
    t0 = 0 ;
    t = crossingpoint ( t0 , t1 , t2 ) ;
    if ( turnamt >= 0 ) 
    if ( t2 < 0 ) 
    t = 268435457L ;
    else {
	
      u0 = x0 - takefraction ( x0 - x1 , t ) ;
      u1 = x1 - takefraction ( x1 - x2 , t ) ;
      ss = takefraction ( - (integer) du , u0 - takefraction ( u0 - u1 , t ) ) 
      ;
      v0 = y0 - takefraction ( y0 - y1 , t ) ;
      v1 = y1 - takefraction ( y1 - y2 , t ) ;
      ss = ss + takefraction ( - (integer) dv , v0 - takefraction ( v0 - v1 , 
      t ) ) ;
      if ( ss < 0 ) 
      t = 268435457L ;
    } 
    else if ( t > 268435456L ) 
    t = 268435456L ;
    if ( t > 268435456L ) 
    finoffsetprep ( p , w , x0 , x1 , x2 , y0 , y1 , y2 , 1 , turnamt ) ;
    else {
	
      splitcubic ( p , t ) ;
      r = mem [p ].hhfield .v.RH ;
      x1a = x0 - takefraction ( x0 - x1 , t ) ;
      x1 = x1 - takefraction ( x1 - x2 , t ) ;
      x2a = x1a - takefraction ( x1a - x1 , t ) ;
      y1a = y0 - takefraction ( y0 - y1 , t ) ;
      y1 = y1 - takefraction ( y1 - y2 , t ) ;
      y2a = y1a - takefraction ( y1a - y1 , t ) ;
      finoffsetprep ( p , w , x0 , x1a , x2a , y0 , y1a , y2a , 1 , 0 ) ;
      x0 = x2a ;
      y0 = y2a ;
      mem [r ].hhfield .lhfield = 16383 ;
      if ( turnamt >= 0 ) 
      {
	t1 = t1 - takefraction ( t1 - t2 , t ) ;
	if ( t1 > 0 ) 
	t1 = 0 ;
	t = crossingpoint ( 0 , - (integer) t1 , - (integer) t2 ) ;
	if ( t > 268435456L ) 
	t = 268435456L ;
	splitcubic ( r , t ) ;
	mem [mem [r ].hhfield .v.RH ].hhfield .lhfield = 16385 ;
	x1a = x1 - takefraction ( x1 - x2 , t ) ;
	x1 = x0 - takefraction ( x0 - x1 , t ) ;
	x0a = x1 - takefraction ( x1 - x1a , t ) ;
	y1a = y1 - takefraction ( y1 - y2 , t ) ;
	y1 = y0 - takefraction ( y0 - y1 , t ) ;
	y0a = y1 - takefraction ( y1 - y1a , t ) ;
	finoffsetprep ( mem [r ].hhfield .v.RH , w , x0a , x1a , x2 , y0a , 
	y1a , y2 , 1 , turnamt ) ;
	x2 = x0a ;
	y2 = y0a ;
	finoffsetprep ( r , ww , x0 , x1 , x2 , y0 , y1 , y2 , -1 , 0 ) ;
      } 
      else finoffsetprep ( r , ww , x0 , x1 , x2 , y0 , y1 , y2 , -1 , -1 - 
      turnamt ) ;
    } 
    w0 = penwalk ( w0 , turnamt ) ;
    lab45: ;
    do {
	r = mem [p ].hhfield .v.RH ;
      if ( mem [p + 1 ].cint == mem [p + 5 ].cint ) 
      if ( mem [p + 2 ].cint == mem [p + 6 ].cint ) 
      if ( mem [p + 1 ].cint == mem [r + 3 ].cint ) 
      if ( mem [p + 2 ].cint == mem [r + 4 ].cint ) 
      if ( mem [p + 1 ].cint == mem [r + 1 ].cint ) 
      if ( mem [p + 2 ].cint == mem [r + 2 ].cint ) 
      if ( r != p ) 
      {
	kneeded = mem [p ].hhfield .lhfield - 16384 ;
	if ( r == q ) 
	q = p ;
	else {
	    
	  mem [p ].hhfield .lhfield = kneeded + mem [r ].hhfield .lhfield 
	  ;
	  kneeded = 0 ;
	} 
	if ( r == c ) 
	{
	  mem [p ].hhfield .lhfield = mem [c ].hhfield .lhfield ;
	  c = p ;
	} 
	if ( r == specp1 ) 
	specp1 = p ;
	if ( r == specp2 ) 
	specp2 = p ;
	r = p ;
	removecubic ( p ) ;
      } 
      p = r ;
    } while ( ! ( p == q ) ) ;
  } while ( ! ( q == c ) ) ;
  specoffset = mem [c ].hhfield .lhfield - 16384 ;
  if ( mem [c ].hhfield .v.RH == c ) 
  mem [c ].hhfield .lhfield = 16384 + n ;
  else {
      
    mem [c ].hhfield .lhfield = mem [c ].hhfield .lhfield + kneeded ;
    while ( w0 != h ) {
	
      mem [c ].hhfield .lhfield = mem [c ].hhfield .lhfield + 1 ;
      w0 = mem [w0 ].hhfield .v.RH ;
    } 
    while ( mem [c ].hhfield .lhfield <= 16384 - n ) mem [c ].hhfield 
    .lhfield = mem [c ].hhfield .lhfield + n ;
    while ( mem [c ].hhfield .lhfield > 16384 ) mem [c ].hhfield .lhfield 
    = mem [c ].hhfield .lhfield - n ;
    if ( ( mem [c ].hhfield .lhfield != 16384 ) && ( abvscd ( dy0 , dxin , 
    dx0 , dyin ) >= 0 ) ) 
    mem [c ].hhfield .lhfield = mem [c ].hhfield .lhfield + n ;
  } 
  Result = c ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zprintspec ( halfword curspec , halfword curpen , strnumber s ) 
#else
zprintspec ( curspec , curpen , s ) 
  halfword curspec ;
  halfword curpen ;
  strnumber s ;
#endif
{
  halfword p, q  ;
  halfword w  ;
  printdiagnostic ( 592 , s , true ) ;
  p = curspec ;
  w = penwalk ( curpen , specoffset ) ;
  println () ;
  printtwo ( mem [curspec + 1 ].cint , mem [curspec + 2 ].cint ) ;
  print ( 593 ) ;
  printtwo ( mem [w + 1 ].cint , mem [w + 2 ].cint ) ;
  do {
      do { q = mem [p ].hhfield .v.RH ;
      {
	printnl ( 598 ) ;
	printtwo ( mem [p + 5 ].cint , mem [p + 6 ].cint ) ;
	print ( 537 ) ;
	printtwo ( mem [q + 3 ].cint , mem [q + 4 ].cint ) ;
	printnl ( 534 ) ;
	printtwo ( mem [q + 1 ].cint , mem [q + 2 ].cint ) ;
      } 
      p = q ;
    } while ( ! ( ( p == curspec ) || ( mem [p ].hhfield .lhfield != 16384 ) 
    ) ) ;
    if ( mem [p ].hhfield .lhfield != 16384 ) 
    {
      w = penwalk ( w , mem [p ].hhfield .lhfield - 16384 ) ;
      print ( 595 ) ;
      if ( mem [p ].hhfield .lhfield > 16384 ) 
      print ( 596 ) ;
      print ( 597 ) ;
      printtwo ( mem [w + 1 ].cint , mem [w + 2 ].cint ) ;
    } 
  } while ( ! ( p == curspec ) ) ;
  printnl ( 594 ) ;
  enddiagnostic ( true ) ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zinsertknot ( halfword q , scaled x , scaled y ) 
#else
zinsertknot ( q , x , y ) 
  halfword q ;
  scaled x ;
  scaled y ;
#endif
{
  register halfword Result; halfword r  ;
  r = getnode ( 7 ) ;
  mem [r ].hhfield .v.RH = mem [q ].hhfield .v.RH ;
  mem [q ].hhfield .v.RH = r ;
  mem [r + 5 ].cint = mem [q + 5 ].cint ;
  mem [r + 6 ].cint = mem [q + 6 ].cint ;
  mem [r + 1 ].cint = x ;
  mem [r + 2 ].cint = y ;
  mem [q + 5 ].cint = mem [q + 1 ].cint ;
  mem [q + 6 ].cint = mem [q + 2 ].cint ;
  mem [r + 3 ].cint = mem [r + 1 ].cint ;
  mem [r + 4 ].cint = mem [r + 2 ].cint ;
  mem [r ].hhfield .b0 = 1 ;
  mem [r ].hhfield .b1 = 1 ;
  Result = r ;
  return Result ;
} 
halfword 
#ifdef HAVE_PROTOTYPES
zmakeenvelope ( halfword c , halfword h , smallnumber ljoin , smallnumber lcap 
, scaled miterlim ) 
#else
zmakeenvelope ( c , h , ljoin , lcap , miterlim ) 
  halfword c ;
  halfword h ;
  smallnumber ljoin ;
  smallnumber lcap ;
  scaled miterlim ;
#endif
{
  /* 30 */ register halfword Result; halfword p, q, r, q0  ;
  char jointype  ;
  halfword w, w0  ;
  scaled qx, qy  ;
  halfword k, k0  ;
  fraction dxin, dyin, dxout, dyout  ;
  scaled tmp  ;
  fraction det  ;
  fraction htx, hty  ;
  scaled maxht  ;
  halfword kk  ;
  halfword ww  ;
  specp1 = 0 ;
  specp2 = 0 ;
  if ( mem [c ].hhfield .b0 == 0 ) 
  {
    specp1 = htapypoc ( c ) ;
    specp2 = pathtail ;
    mem [specp2 ].hhfield .v.RH = mem [specp1 ].hhfield .v.RH ;
    mem [specp1 ].hhfield .v.RH = c ;
    removecubic ( specp1 ) ;
    c = specp1 ;
    if ( c != mem [c ].hhfield .v.RH ) 
    removecubic ( specp2 ) ;
    else {
	
      mem [c ].hhfield .b0 = 1 ;
      mem [c ].hhfield .b1 = 1 ;
      mem [c + 3 ].cint = mem [c + 1 ].cint ;
      mem [c + 4 ].cint = mem [c + 2 ].cint ;
      mem [c + 5 ].cint = mem [c + 1 ].cint ;
      mem [c + 6 ].cint = mem [c + 2 ].cint ;
    } 
  } 
  c = offsetprep ( c , h ) ;
  if ( internal [5 ]> 0 ) 
  printspec ( c , h , 284 ) ;
  h = penwalk ( h , specoffset ) ;
  w = h ;
  p = c ;
  do {
      q = mem [p ].hhfield .v.RH ;
    q0 = q ;
    qx = mem [q + 1 ].cint ;
    qy = mem [q + 2 ].cint ;
    k = mem [q ].hhfield .lhfield ;
    k0 = k ;
    w0 = w ;
    if ( k != 16384 ) 
    if ( k < 16384 ) 
    jointype = 2 ;
    else {
	
      if ( ( q != specp1 ) && ( q != specp2 ) ) 
      jointype = ljoin ;
      else if ( lcap == 2 ) 
      jointype = 3 ;
      else jointype = 2 - lcap ;
      if ( ( jointype == 0 ) || ( jointype == 3 ) ) 
      {
	dxin = mem [q + 1 ].cint - mem [q + 3 ].cint ;
	dyin = mem [q + 2 ].cint - mem [q + 4 ].cint ;
	if ( ( dxin == 0 ) && ( dyin == 0 ) ) 
	{
	  dxin = mem [q + 1 ].cint - mem [p + 5 ].cint ;
	  dyin = mem [q + 2 ].cint - mem [p + 6 ].cint ;
	  if ( ( dxin == 0 ) && ( dyin == 0 ) ) 
	  {
	    dxin = mem [q + 1 ].cint - mem [p + 1 ].cint ;
	    dyin = mem [q + 2 ].cint - mem [p + 2 ].cint ;
	    if ( p != c ) 
	    {
	      dxin = dxin + mem [w + 1 ].cint ;
	      dyin = dyin + mem [w + 2 ].cint ;
	    } 
	  } 
	} 
	tmp = pythadd ( dxin , dyin ) ;
	if ( tmp == 0 ) 
	jointype = 2 ;
	else {
	    
	  dxin = makefraction ( dxin , tmp ) ;
	  dyin = makefraction ( dyin , tmp ) ;
	  dxout = mem [q + 5 ].cint - mem [q + 1 ].cint ;
	  dyout = mem [q + 6 ].cint - mem [q + 2 ].cint ;
	  if ( ( dxout == 0 ) && ( dyout == 0 ) ) 
	  {
	    r = mem [q ].hhfield .v.RH ;
	    dxout = mem [r + 3 ].cint - mem [q + 1 ].cint ;
	    dyout = mem [r + 4 ].cint - mem [q + 2 ].cint ;
	    if ( ( dxout == 0 ) && ( dyout == 0 ) ) 
	    {
	      dxout = mem [r + 1 ].cint - mem [q + 1 ].cint ;
	      dyout = mem [r + 2 ].cint - mem [q + 2 ].cint ;
	    } 
	  } 
	  if ( q == c ) 
	  {
	    dxout = dxout - mem [h + 1 ].cint ;
	    dyout = dyout - mem [h + 2 ].cint ;
	  } 
	  tmp = pythadd ( dxout , dyout ) ;
	  if ( tmp == 0 ) 
	  confusion ( 599 ) ;
	  dxout = makefraction ( dxout , tmp ) ;
	  dyout = makefraction ( dyout , tmp ) ;
	} 
	if ( jointype == 0 ) 
	{
	  tmp = takefraction ( miterlim , 134217728L + half ( takefraction ( 
	  dxin , dxout ) + takefraction ( dyin , dyout ) ) ) ;
	  if ( tmp < 65536L ) 
	  if ( takescaled ( miterlim , tmp ) < 65536L ) 
	  jointype = 2 ;
	} 
      } 
    } 
    mem [p + 5 ].cint = mem [p + 5 ].cint + mem [w + 1 ].cint ;
    mem [p + 6 ].cint = mem [p + 6 ].cint + mem [w + 2 ].cint ;
    mem [q + 3 ].cint = mem [q + 3 ].cint + mem [w + 1 ].cint ;
    mem [q + 4 ].cint = mem [q + 4 ].cint + mem [w + 2 ].cint ;
    mem [q + 1 ].cint = mem [q + 1 ].cint + mem [w + 1 ].cint ;
    mem [q + 2 ].cint = mem [q + 2 ].cint + mem [w + 2 ].cint ;
    mem [q ].hhfield .b0 = 1 ;
    mem [q ].hhfield .b1 = 1 ;
    while ( k != 16384 ) {
	
      if ( k > 16384 ) 
      {
	w = mem [w ].hhfield .v.RH ;
	decr ( k ) ;
      } 
      else {
	  
	w = mem [w ].hhfield .lhfield ;
	incr ( k ) ;
      } 
      if ( ( jointype == 1 ) || ( k == 16384 ) ) 
      q = insertknot ( q , qx + mem [w + 1 ].cint , qy + mem [w + 2 ].cint 
      ) ;
    } 
    if ( q != mem [p ].hhfield .v.RH ) 
    {
      p = mem [p ].hhfield .v.RH ;
      if ( ( jointype == 0 ) || ( jointype == 3 ) ) 
      {
	if ( jointype == 0 ) 
	{
	  det = takefraction ( dyout , dxin ) - takefraction ( dxout , dyin ) 
	  ;
	  if ( abs ( det ) < 26844 ) 
	  r = 0 ;
	  else {
	      
	    tmp = takefraction ( mem [q + 1 ].cint - mem [p + 1 ].cint , 
	    dyout ) - takefraction ( mem [q + 2 ].cint - mem [p + 2 ].cint 
	    , dxout ) ;
	    tmp = makefraction ( tmp , det ) ;
	    r = insertknot ( p , mem [p + 1 ].cint + takefraction ( tmp , 
	    dxin ) , mem [p + 2 ].cint + takefraction ( tmp , dyin ) ) ;
	  } 
	} 
	else {
	    
	  htx = mem [w + 2 ].cint - mem [w0 + 2 ].cint ;
	  hty = mem [w0 + 1 ].cint - mem [w + 1 ].cint ;
	  while ( ( abs ( htx ) < 134217728L ) && ( abs ( hty ) < 134217728L ) 
	  ) {
	      
	    htx = htx + htx ;
	    hty = hty + hty ;
	  } 
	  maxht = 0 ;
	  kk = 16384 ;
	  ww = w ;
	  while ( true ) {
	      
	    if ( kk > k0 ) 
	    {
	      ww = mem [ww ].hhfield .v.RH ;
	      decr ( kk ) ;
	    } 
	    else {
		
	      ww = mem [ww ].hhfield .lhfield ;
	      incr ( kk ) ;
	    } 
	    if ( kk == k0 ) 
	    goto lab30 ;
	    tmp = takefraction ( mem [ww + 1 ].cint - mem [w0 + 1 ].cint , 
	    htx ) + takefraction ( mem [ww + 2 ].cint - mem [w0 + 2 ].cint 
	    , hty ) ;
	    if ( tmp > maxht ) 
	    maxht = tmp ;
	  } 
	  lab30: ;
	  tmp = makefraction ( maxht , takefraction ( dxin , htx ) + 
	  takefraction ( dyin , hty ) ) ;
	  r = insertknot ( p , mem [p + 1 ].cint + takefraction ( tmp , dxin 
	  ) , mem [p + 2 ].cint + takefraction ( tmp , dyin ) ) ;
	  tmp = makefraction ( maxht , takefraction ( dxout , htx ) + 
	  takefraction ( dyout , hty ) ) ;
	  r = insertknot ( r , mem [q + 1 ].cint + takefraction ( tmp , 
	  dxout ) , mem [q + 2 ].cint + takefraction ( tmp , dyout ) ) ;
	} 
	if ( r != 0 ) 
	{
	  mem [r + 5 ].cint = mem [r + 1 ].cint ;
	  mem [r + 6 ].cint = mem [r + 2 ].cint ;
	} 
      } 
    } 
    p = q ;
  } while ( ! ( q0 == c ) ) ;
  Result = c ;
  return Result ;
} 
scaled 
#ifdef HAVE_PROTOTYPES
zfinddirectiontime ( scaled x , scaled y , halfword h ) 
#else
zfinddirectiontime ( x , y , h ) 
  scaled x ;
  scaled y ;
  halfword h ;
#endif
{
  /* 10 40 45 30 */ register scaled Result; scaled max  ;
  halfword p, q  ;
  scaled n  ;
  scaled tt  ;
  scaled x1, x2, x3, y1, y2, y3  ;
  angle theta, phi  ;
  fraction t  ;
  if ( abs ( x ) < abs ( y ) ) 
  {
    x = makefraction ( x , abs ( y ) ) ;
    if ( y > 0 ) 
    y = 268435456L ;
    else y = -268435456L ;
  } 
  else if ( x == 0 ) 
  {
    Result = 0 ;
    goto lab10 ;
  } 
  else {
      
    y = makefraction ( y , abs ( x ) ) ;
    if ( x > 0 ) 
    x = 268435456L ;
    else x = -268435456L ;
  } 
  n = 0 ;
  p = h ;
  while ( true ) {
      
    if ( mem [p ].hhfield .b1 == 0 ) 
    goto lab45 ;
    q = mem [p ].hhfield .v.RH ;
    tt = 0 ;
    x1 = mem [p + 5 ].cint - mem [p + 1 ].cint ;
    x2 = mem [q + 3 ].cint - mem [p + 5 ].cint ;
    x3 = mem [q + 1 ].cint - mem [q + 3 ].cint ;
    y1 = mem [p + 6 ].cint - mem [p + 2 ].cint ;
    y2 = mem [q + 4 ].cint - mem [p + 6 ].cint ;
    y3 = mem [q + 2 ].cint - mem [q + 4 ].cint ;
    max = abs ( x1 ) ;
    if ( abs ( x2 ) > max ) 
    max = abs ( x2 ) ;
    if ( abs ( x3 ) > max ) 
    max = abs ( x3 ) ;
    if ( abs ( y1 ) > max ) 
    max = abs ( y1 ) ;
    if ( abs ( y2 ) > max ) 
    max = abs ( y2 ) ;
    if ( abs ( y3 ) > max ) 
    max = abs ( y3 ) ;
    if ( max == 0 ) 
    goto lab40 ;
    while ( max < 134217728L ) {
	
      max = max + max ;
      x1 = x1 + x1 ;
      x2 = x2 + x2 ;
      x3 = x3 + x3 ;
      y1 = y1 + y1 ;
      y2 = y2 + y2 ;
      y3 = y3 + y3 ;
    } 
    t = x1 ;
    x1 = takefraction ( x1 , x ) + takefraction ( y1 , y ) ;
    y1 = takefraction ( y1 , x ) - takefraction ( t , y ) ;
    t = x2 ;
    x2 = takefraction ( x2 , x ) + takefraction ( y2 , y ) ;
    y2 = takefraction ( y2 , x ) - takefraction ( t , y ) ;
    t = x3 ;
    x3 = takefraction ( x3 , x ) + takefraction ( y3 , y ) ;
    y3 = takefraction ( y3 , x ) - takefraction ( t , y ) ;
    if ( y1 == 0 ) 
    if ( x1 >= 0 ) 
    goto lab40 ;
    if ( n > 0 ) 
    {
      theta = narg ( x1 , y1 ) ;
      if ( theta >= 0 ) 
      if ( phi <= 0 ) 
      if ( phi >= theta - 188743680L ) 
      goto lab40 ;
      if ( theta <= 0 ) 
      if ( phi >= 0 ) 
      if ( phi <= theta + 188743680L ) 
      goto lab40 ;
      if ( p == h ) 
      goto lab45 ;
    } 
    if ( ( x3 != 0 ) || ( y3 != 0 ) ) 
    phi = narg ( x3 , y3 ) ;
    if ( x1 < 0 ) 
    if ( x2 < 0 ) 
    if ( x3 < 0 ) 
    goto lab30 ;
    if ( abvscd ( y1 , y3 , y2 , y2 ) == 0 ) 
    {
      if ( abvscd ( y1 , y2 , 0 , 0 ) < 0 ) 
      {
	t = makefraction ( y1 , y1 - y2 ) ;
	x1 = x1 - takefraction ( x1 - x2 , t ) ;
	x2 = x2 - takefraction ( x2 - x3 , t ) ;
	if ( x1 - takefraction ( x1 - x2 , t ) >= 0 ) 
	{
	  tt = ( t + 2048 ) / 4096 ;
	  goto lab40 ;
	} 
      } 
      else if ( y3 == 0 ) 
      if ( y1 == 0 ) 
      {
	t = crossingpoint ( - (integer) x1 , - (integer) x2 , - (integer) x3 ) 
	;
	if ( t <= 268435456L ) 
	{
	  tt = ( t + 2048 ) / 4096 ;
	  goto lab40 ;
	} 
	if ( abvscd ( x1 , x3 , x2 , x2 ) <= 0 ) 
	{
	  t = makefraction ( x1 , x1 - x2 ) ;
	  {
	    tt = ( t + 2048 ) / 4096 ;
	    goto lab40 ;
	  } 
	} 
      } 
      else if ( x3 >= 0 ) 
      {
	tt = 65536L ;
	goto lab40 ;
      } 
      goto lab30 ;
    } 
    if ( y1 <= 0 ) 
    if ( y1 < 0 ) 
    {
      y1 = - (integer) y1 ;
      y2 = - (integer) y2 ;
      y3 = - (integer) y3 ;
    } 
    else if ( y2 > 0 ) 
    {
      y2 = - (integer) y2 ;
      y3 = - (integer) y3 ;
    } 
    t = crossingpoint ( y1 , y2 , y3 ) ;
    if ( t > 268435456L ) 
    goto lab30 ;
    y2 = y2 - takefraction ( y2 - y3 , t ) ;
    x1 = x1 - takefraction ( x1 - x2 , t ) ;
    x2 = x2 - takefraction ( x2 - x3 , t ) ;
    x1 = x1 - takefraction ( x1 - x2 , t ) ;
    if ( x1 >= 0 ) 
    {
      tt = ( t + 2048 ) / 4096 ;
      goto lab40 ;
    } 
    if ( y2 > 0 ) 
    y2 = 0 ;
    tt = t ;
    t = crossingpoint ( 0 , - (integer) y2 , - (integer) y3 ) ;
    if ( t > 268435456L ) 
    goto lab30 ;
    x1 = x1 - takefraction ( x1 - x2 , t ) ;
    x2 = x2 - takefraction ( x2 - x3 , t ) ;
    if ( x1 - takefraction ( x1 - x2 , t ) >= 0 ) 
    {
      t = tt - takefraction ( tt - 268435456L , t ) ;
      {
	tt = ( t + 2048 ) / 4096 ;
	goto lab40 ;
      } 
    } 
    lab30: ;
    p = q ;
    n = n + 65536L ;
  } 
  lab45: Result = -65536L ;
  goto lab10 ;
  lab40: Result = n + tt ;
  lab10: ;
  return Result ;
} 
void 
#ifdef HAVE_PROTOTYPES
zcubicintersection ( halfword p , halfword pp ) 
#else
zcubicintersection ( p , pp ) 
  halfword p ;
  halfword pp ;
#endif
{
  /* 22 45 10 */ halfword q, qq  ;
  timetogo = 5000 ;
  maxt = 2 ;
  q = mem [p ].hhfield .v.RH ;
  qq = mem [pp ].hhfield .v.RH ;
  bisectptr = 20 ;
  bisectstack [bisectptr - 5 ]= mem [p + 5 ].cint - mem [p + 1 ].cint ;
  bisectstack [bisectptr - 4 ]= mem [q + 3 ].cint - mem [p + 5 ].cint ;
  bisectstack [bisectptr - 3 ]= mem [q + 1 ].cint - mem [q + 3 ].cint ;
  if ( bisectstack [bisectptr - 5 ]< 0 ) 
  if ( bisectstack [bisectptr - 3 ]>= 0 ) 
  {
    if ( bisectstack [bisectptr - 4 ]< 0 ) 
    bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ];
    else bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ];
    bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
    if ( bisectstack [bisectptr - 1 ]< 0 ) 
    bisectstack [bisectptr - 1 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
    if ( bisectstack [bisectptr - 2 ]> bisectstack [bisectptr - 5 ]) 
    bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ];
    bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ];
    if ( bisectstack [bisectptr - 1 ]< 0 ) 
    bisectstack [bisectptr - 1 ]= 0 ;
  } 
  else if ( bisectstack [bisectptr - 3 ]<= 0 ) 
  {
    if ( bisectstack [bisectptr - 4 ]> 0 ) 
    bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ];
    else bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ];
    bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
    if ( bisectstack [bisectptr - 2 ]> 0 ) 
    bisectstack [bisectptr - 2 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
    if ( bisectstack [bisectptr - 1 ]< bisectstack [bisectptr - 5 ]) 
    bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ];
    bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
    bisectstack [bisectptr - 4 ];
    if ( bisectstack [bisectptr - 2 ]> 0 ) 
    bisectstack [bisectptr - 2 ]= 0 ;
  } 
  bisectstack [bisectptr - 10 ]= mem [p + 6 ].cint - mem [p + 2 ].cint ;
  bisectstack [bisectptr - 9 ]= mem [q + 4 ].cint - mem [p + 6 ].cint ;
  bisectstack [bisectptr - 8 ]= mem [q + 2 ].cint - mem [q + 4 ].cint ;
  if ( bisectstack [bisectptr - 10 ]< 0 ) 
  if ( bisectstack [bisectptr - 8 ]>= 0 ) 
  {
    if ( bisectstack [bisectptr - 9 ]< 0 ) 
    bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ];
    else bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ];
    bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
    if ( bisectstack [bisectptr - 6 ]< 0 ) 
    bisectstack [bisectptr - 6 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
    if ( bisectstack [bisectptr - 7 ]> bisectstack [bisectptr - 10 ]) 
    bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ];
    bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ];
    if ( bisectstack [bisectptr - 6 ]< 0 ) 
    bisectstack [bisectptr - 6 ]= 0 ;
  } 
  else if ( bisectstack [bisectptr - 8 ]<= 0 ) 
  {
    if ( bisectstack [bisectptr - 9 ]> 0 ) 
    bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ];
    else bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ];
    bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
    if ( bisectstack [bisectptr - 7 ]> 0 ) 
    bisectstack [bisectptr - 7 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
    if ( bisectstack [bisectptr - 6 ]< bisectstack [bisectptr - 10 ]) 
    bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ];
    bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
    bisectstack [bisectptr - 9 ];
    if ( bisectstack [bisectptr - 7 ]> 0 ) 
    bisectstack [bisectptr - 7 ]= 0 ;
  } 
  bisectstack [bisectptr - 15 ]= mem [pp + 5 ].cint - mem [pp + 1 ].cint 
  ;
  bisectstack [bisectptr - 14 ]= mem [qq + 3 ].cint - mem [pp + 5 ].cint 
  ;
  bisectstack [bisectptr - 13 ]= mem [qq + 1 ].cint - mem [qq + 3 ].cint 
  ;
  if ( bisectstack [bisectptr - 15 ]< 0 ) 
  if ( bisectstack [bisectptr - 13 ]>= 0 ) 
  {
    if ( bisectstack [bisectptr - 14 ]< 0 ) 
    bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ];
    else bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ];
    bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
    if ( bisectstack [bisectptr - 11 ]< 0 ) 
    bisectstack [bisectptr - 11 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
    if ( bisectstack [bisectptr - 12 ]> bisectstack [bisectptr - 15 ]) 
    bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ];
    bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ];
    if ( bisectstack [bisectptr - 11 ]< 0 ) 
    bisectstack [bisectptr - 11 ]= 0 ;
  } 
  else if ( bisectstack [bisectptr - 13 ]<= 0 ) 
  {
    if ( bisectstack [bisectptr - 14 ]> 0 ) 
    bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ];
    else bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ];
    bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
    if ( bisectstack [bisectptr - 12 ]> 0 ) 
    bisectstack [bisectptr - 12 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
    if ( bisectstack [bisectptr - 11 ]< bisectstack [bisectptr - 15 ]) 
    bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ];
    bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
    bisectstack [bisectptr - 14 ];
    if ( bisectstack [bisectptr - 12 ]> 0 ) 
    bisectstack [bisectptr - 12 ]= 0 ;
  } 
  bisectstack [bisectptr - 20 ]= mem [pp + 6 ].cint - mem [pp + 2 ].cint 
  ;
  bisectstack [bisectptr - 19 ]= mem [qq + 4 ].cint - mem [pp + 6 ].cint 
  ;
  bisectstack [bisectptr - 18 ]= mem [qq + 2 ].cint - mem [qq + 4 ].cint 
  ;
  if ( bisectstack [bisectptr - 20 ]< 0 ) 
  if ( bisectstack [bisectptr - 18 ]>= 0 ) 
  {
    if ( bisectstack [bisectptr - 19 ]< 0 ) 
    bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ];
    else bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ];
    bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
    if ( bisectstack [bisectptr - 16 ]< 0 ) 
    bisectstack [bisectptr - 16 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
    if ( bisectstack [bisectptr - 17 ]> bisectstack [bisectptr - 20 ]) 
    bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ];
    bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ];
    if ( bisectstack [bisectptr - 16 ]< 0 ) 
    bisectstack [bisectptr - 16 ]= 0 ;
  } 
  else if ( bisectstack [bisectptr - 18 ]<= 0 ) 
  {
    if ( bisectstack [bisectptr - 19 ]> 0 ) 
    bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ];
    else bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ];
    bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
    if ( bisectstack [bisectptr - 17 ]> 0 ) 
    bisectstack [bisectptr - 17 ]= 0 ;
  } 
  else {
      
    bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
    if ( bisectstack [bisectptr - 16 ]< bisectstack [bisectptr - 20 ]) 
    bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ];
    bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
    bisectstack [bisectptr - 19 ];
    if ( bisectstack [bisectptr - 17 ]> 0 ) 
    bisectstack [bisectptr - 17 ]= 0 ;
  } 
  delx = mem [p + 1 ].cint - mem [pp + 1 ].cint ;
  dely = mem [p + 2 ].cint - mem [pp + 2 ].cint ;
  tol = 0 ;
  uv = bisectptr ;
  xy = bisectptr ;
  threel = 0 ;
  curt = 1 ;
  curtt = 1 ;
  while ( true ) {
      
    lab22: if ( delx - tol <= bisectstack [xy - 11 ]- bisectstack [uv - 2 ]
    ) 
    if ( delx + tol >= bisectstack [xy - 12 ]- bisectstack [uv - 1 ]) 
    if ( dely - tol <= bisectstack [xy - 16 ]- bisectstack [uv - 7 ]) 
    if ( dely + tol >= bisectstack [xy - 17 ]- bisectstack [uv - 6 ]) 
    {
      if ( curt >= maxt ) 
      {
	if ( maxt == 131072L ) 
	{
	  curt = halfp ( curt + 1 ) ;
	  curtt = halfp ( curtt + 1 ) ;
	  goto lab10 ;
	} 
	maxt = maxt + maxt ;
	apprt = curt ;
	apprtt = curtt ;
      } 
      bisectstack [bisectptr ]= delx ;
      bisectstack [bisectptr + 1 ]= dely ;
      bisectstack [bisectptr + 2 ]= tol ;
      bisectstack [bisectptr + 3 ]= uv ;
      bisectstack [bisectptr + 4 ]= xy ;
      bisectptr = bisectptr + 45 ;
      curt = curt + curt ;
      curtt = curtt + curtt ;
      bisectstack [bisectptr - 25 ]= bisectstack [uv - 5 ];
      bisectstack [bisectptr - 3 ]= bisectstack [uv - 3 ];
      bisectstack [bisectptr - 24 ]= half ( bisectstack [bisectptr - 25 ]+ 
      bisectstack [uv - 4 ]) ;
      bisectstack [bisectptr - 4 ]= half ( bisectstack [bisectptr - 3 ]+ 
      bisectstack [uv - 4 ]) ;
      bisectstack [bisectptr - 23 ]= half ( bisectstack [bisectptr - 24 ]+ 
      bisectstack [bisectptr - 4 ]) ;
      bisectstack [bisectptr - 5 ]= bisectstack [bisectptr - 23 ];
      if ( bisectstack [bisectptr - 25 ]< 0 ) 
      if ( bisectstack [bisectptr - 23 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 24 ]< 0 ) 
	bisectstack [bisectptr - 22 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ];
	else bisectstack [bisectptr - 22 ]= bisectstack [bisectptr - 25 ];
	bisectstack [bisectptr - 21 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ]+ bisectstack [bisectptr - 23 ];
	if ( bisectstack [bisectptr - 21 ]< 0 ) 
	bisectstack [bisectptr - 21 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 22 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ]+ bisectstack [bisectptr - 23 ];
	if ( bisectstack [bisectptr - 22 ]> bisectstack [bisectptr - 25 ]) 
	bisectstack [bisectptr - 22 ]= bisectstack [bisectptr - 25 ];
	bisectstack [bisectptr - 21 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ];
	if ( bisectstack [bisectptr - 21 ]< 0 ) 
	bisectstack [bisectptr - 21 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 23 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 24 ]> 0 ) 
	bisectstack [bisectptr - 21 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ];
	else bisectstack [bisectptr - 21 ]= bisectstack [bisectptr - 25 ];
	bisectstack [bisectptr - 22 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ]+ bisectstack [bisectptr - 23 ];
	if ( bisectstack [bisectptr - 22 ]> 0 ) 
	bisectstack [bisectptr - 22 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 21 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ]+ bisectstack [bisectptr - 23 ];
	if ( bisectstack [bisectptr - 21 ]< bisectstack [bisectptr - 25 ]) 
	bisectstack [bisectptr - 21 ]= bisectstack [bisectptr - 25 ];
	bisectstack [bisectptr - 22 ]= bisectstack [bisectptr - 25 ]+ 
	bisectstack [bisectptr - 24 ];
	if ( bisectstack [bisectptr - 22 ]> 0 ) 
	bisectstack [bisectptr - 22 ]= 0 ;
      } 
      if ( bisectstack [bisectptr - 5 ]< 0 ) 
      if ( bisectstack [bisectptr - 3 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 4 ]< 0 ) 
	bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ];
	else bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ];
	bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
	if ( bisectstack [bisectptr - 1 ]< 0 ) 
	bisectstack [bisectptr - 1 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
	if ( bisectstack [bisectptr - 2 ]> bisectstack [bisectptr - 5 ]) 
	bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ];
	bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ];
	if ( bisectstack [bisectptr - 1 ]< 0 ) 
	bisectstack [bisectptr - 1 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 3 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 4 ]> 0 ) 
	bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ];
	else bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ];
	bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
	if ( bisectstack [bisectptr - 2 ]> 0 ) 
	bisectstack [bisectptr - 2 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ]+ bisectstack [bisectptr - 3 ];
	if ( bisectstack [bisectptr - 1 ]< bisectstack [bisectptr - 5 ]) 
	bisectstack [bisectptr - 1 ]= bisectstack [bisectptr - 5 ];
	bisectstack [bisectptr - 2 ]= bisectstack [bisectptr - 5 ]+ 
	bisectstack [bisectptr - 4 ];
	if ( bisectstack [bisectptr - 2 ]> 0 ) 
	bisectstack [bisectptr - 2 ]= 0 ;
      } 
      bisectstack [bisectptr - 30 ]= bisectstack [uv - 10 ];
      bisectstack [bisectptr - 8 ]= bisectstack [uv - 8 ];
      bisectstack [bisectptr - 29 ]= half ( bisectstack [bisectptr - 30 ]+ 
      bisectstack [uv - 9 ]) ;
      bisectstack [bisectptr - 9 ]= half ( bisectstack [bisectptr - 8 ]+ 
      bisectstack [uv - 9 ]) ;
      bisectstack [bisectptr - 28 ]= half ( bisectstack [bisectptr - 29 ]+ 
      bisectstack [bisectptr - 9 ]) ;
      bisectstack [bisectptr - 10 ]= bisectstack [bisectptr - 28 ];
      if ( bisectstack [bisectptr - 30 ]< 0 ) 
      if ( bisectstack [bisectptr - 28 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 29 ]< 0 ) 
	bisectstack [bisectptr - 27 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ];
	else bisectstack [bisectptr - 27 ]= bisectstack [bisectptr - 30 ];
	bisectstack [bisectptr - 26 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ]+ bisectstack [bisectptr - 28 ];
	if ( bisectstack [bisectptr - 26 ]< 0 ) 
	bisectstack [bisectptr - 26 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 27 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ]+ bisectstack [bisectptr - 28 ];
	if ( bisectstack [bisectptr - 27 ]> bisectstack [bisectptr - 30 ]) 
	bisectstack [bisectptr - 27 ]= bisectstack [bisectptr - 30 ];
	bisectstack [bisectptr - 26 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ];
	if ( bisectstack [bisectptr - 26 ]< 0 ) 
	bisectstack [bisectptr - 26 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 28 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 29 ]> 0 ) 
	bisectstack [bisectptr - 26 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ];
	else bisectstack [bisectptr - 26 ]= bisectstack [bisectptr - 30 ];
	bisectstack [bisectptr - 27 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ]+ bisectstack [bisectptr - 28 ];
	if ( bisectstack [bisectptr - 27 ]> 0 ) 
	bisectstack [bisectptr - 27 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 26 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ]+ bisectstack [bisectptr - 28 ];
	if ( bisectstack [bisectptr - 26 ]< bisectstack [bisectptr - 30 ]) 
	bisectstack [bisectptr - 26 ]= bisectstack [bisectptr - 30 ];
	bisectstack [bisectptr - 27 ]= bisectstack [bisectptr - 30 ]+ 
	bisectstack [bisectptr - 29 ];
	if ( bisectstack [bisectptr - 27 ]> 0 ) 
	bisectstack [bisectptr - 27 ]= 0 ;
      } 
      if ( bisectstack [bisectptr - 10 ]< 0 ) 
      if ( bisectstack [bisectptr - 8 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 9 ]< 0 ) 
	bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ];
	else bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ];
	bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
	if ( bisectstack [bisectptr - 6 ]< 0 ) 
	bisectstack [bisectptr - 6 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
	if ( bisectstack [bisectptr - 7 ]> bisectstack [bisectptr - 10 ]) 
	bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ];
	bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ];
	if ( bisectstack [bisectptr - 6 ]< 0 ) 
	bisectstack [bisectptr - 6 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 8 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 9 ]> 0 ) 
	bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ];
	else bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ];
	bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
	if ( bisectstack [bisectptr - 7 ]> 0 ) 
	bisectstack [bisectptr - 7 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ]+ bisectstack [bisectptr - 8 ];
	if ( bisectstack [bisectptr - 6 ]< bisectstack [bisectptr - 10 ]) 
	bisectstack [bisectptr - 6 ]= bisectstack [bisectptr - 10 ];
	bisectstack [bisectptr - 7 ]= bisectstack [bisectptr - 10 ]+ 
	bisectstack [bisectptr - 9 ];
	if ( bisectstack [bisectptr - 7 ]> 0 ) 
	bisectstack [bisectptr - 7 ]= 0 ;
      } 
      bisectstack [bisectptr - 35 ]= bisectstack [xy - 15 ];
      bisectstack [bisectptr - 13 ]= bisectstack [xy - 13 ];
      bisectstack [bisectptr - 34 ]= half ( bisectstack [bisectptr - 35 ]+ 
      bisectstack [xy - 14 ]) ;
      bisectstack [bisectptr - 14 ]= half ( bisectstack [bisectptr - 13 ]+ 
      bisectstack [xy - 14 ]) ;
      bisectstack [bisectptr - 33 ]= half ( bisectstack [bisectptr - 34 ]+ 
      bisectstack [bisectptr - 14 ]) ;
      bisectstack [bisectptr - 15 ]= bisectstack [bisectptr - 33 ];
      if ( bisectstack [bisectptr - 35 ]< 0 ) 
      if ( bisectstack [bisectptr - 33 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 34 ]< 0 ) 
	bisectstack [bisectptr - 32 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ];
	else bisectstack [bisectptr - 32 ]= bisectstack [bisectptr - 35 ];
	bisectstack [bisectptr - 31 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ]+ bisectstack [bisectptr - 33 ];
	if ( bisectstack [bisectptr - 31 ]< 0 ) 
	bisectstack [bisectptr - 31 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 32 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ]+ bisectstack [bisectptr - 33 ];
	if ( bisectstack [bisectptr - 32 ]> bisectstack [bisectptr - 35 ]) 
	bisectstack [bisectptr - 32 ]= bisectstack [bisectptr - 35 ];
	bisectstack [bisectptr - 31 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ];
	if ( bisectstack [bisectptr - 31 ]< 0 ) 
	bisectstack [bisectptr - 31 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 33 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 34 ]> 0 ) 
	bisectstack [bisectptr - 31 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ];
	else bisectstack [bisectptr - 31 ]= bisectstack [bisectptr - 35 ];
	bisectstack [bisectptr - 32 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ]+ bisectstack [bisectptr - 33 ];
	if ( bisectstack [bisectptr - 32 ]> 0 ) 
	bisectstack [bisectptr - 32 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 31 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ]+ bisectstack [bisectptr - 33 ];
	if ( bisectstack [bisectptr - 31 ]< bisectstack [bisectptr - 35 ]) 
	bisectstack [bisectptr - 31 ]= bisectstack [bisectptr - 35 ];
	bisectstack [bisectptr - 32 ]= bisectstack [bisectptr - 35 ]+ 
	bisectstack [bisectptr - 34 ];
	if ( bisectstack [bisectptr - 32 ]> 0 ) 
	bisectstack [bisectptr - 32 ]= 0 ;
      } 
      if ( bisectstack [bisectptr - 15 ]< 0 ) 
      if ( bisectstack [bisectptr - 13 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 14 ]< 0 ) 
	bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ];
	else bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ];
	bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
	if ( bisectstack [bisectptr - 11 ]< 0 ) 
	bisectstack [bisectptr - 11 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
	if ( bisectstack [bisectptr - 12 ]> bisectstack [bisectptr - 15 ]) 
	bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ];
	bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ];
	if ( bisectstack [bisectptr - 11 ]< 0 ) 
	bisectstack [bisectptr - 11 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 13 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 14 ]> 0 ) 
	bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ];
	else bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ];
	bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
	if ( bisectstack [bisectptr - 12 ]> 0 ) 
	bisectstack [bisectptr - 12 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ]+ bisectstack [bisectptr - 13 ];
	if ( bisectstack [bisectptr - 11 ]< bisectstack [bisectptr - 15 ]) 
	bisectstack [bisectptr - 11 ]= bisectstack [bisectptr - 15 ];
	bisectstack [bisectptr - 12 ]= bisectstack [bisectptr - 15 ]+ 
	bisectstack [bisectptr - 14 ];
	if ( bisectstack [bisectptr - 12 ]> 0 ) 
	bisectstack [bisectptr - 12 ]= 0 ;
      } 
      bisectstack [bisectptr - 40 ]= bisectstack [xy - 20 ];
      bisectstack [bisectptr - 18 ]= bisectstack [xy - 18 ];
      bisectstack [bisectptr - 39 ]= half ( bisectstack [bisectptr - 40 ]+ 
      bisectstack [xy - 19 ]) ;
      bisectstack [bisectptr - 19 ]= half ( bisectstack [bisectptr - 18 ]+ 
      bisectstack [xy - 19 ]) ;
      bisectstack [bisectptr - 38 ]= half ( bisectstack [bisectptr - 39 ]+ 
      bisectstack [bisectptr - 19 ]) ;
      bisectstack [bisectptr - 20 ]= bisectstack [bisectptr - 38 ];
      if ( bisectstack [bisectptr - 40 ]< 0 ) 
      if ( bisectstack [bisectptr - 38 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 39 ]< 0 ) 
	bisectstack [bisectptr - 37 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ];
	else bisectstack [bisectptr - 37 ]= bisectstack [bisectptr - 40 ];
	bisectstack [bisectptr - 36 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ]+ bisectstack [bisectptr - 38 ];
	if ( bisectstack [bisectptr - 36 ]< 0 ) 
	bisectstack [bisectptr - 36 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 37 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ]+ bisectstack [bisectptr - 38 ];
	if ( bisectstack [bisectptr - 37 ]> bisectstack [bisectptr - 40 ]) 
	bisectstack [bisectptr - 37 ]= bisectstack [bisectptr - 40 ];
	bisectstack [bisectptr - 36 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ];
	if ( bisectstack [bisectptr - 36 ]< 0 ) 
	bisectstack [bisectptr - 36 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 38 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 39 ]> 0 ) 
	bisectstack [bisectptr - 36 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ];
	else bisectstack [bisectptr - 36 ]= bisectstack [bisectptr - 40 ];
	bisectstack [bisectptr - 37 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ]+ bisectstack [bisectptr - 38 ];
	if ( bisectstack [bisectptr - 37 ]> 0 ) 
	bisectstack [bisectptr - 37 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 36 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ]+ bisectstack [bisectptr - 38 ];
	if ( bisectstack [bisectptr - 36 ]< bisectstack [bisectptr - 40 ]) 
	bisectstack [bisectptr - 36 ]= bisectstack [bisectptr - 40 ];
	bisectstack [bisectptr - 37 ]= bisectstack [bisectptr - 40 ]+ 
	bisectstack [bisectptr - 39 ];
	if ( bisectstack [bisectptr - 37 ]> 0 ) 
	bisectstack [bisectptr - 37 ]= 0 ;
      } 
      if ( bisectstack [bisectptr - 20 ]< 0 ) 
      if ( bisectstack [bisectptr - 18 ]>= 0 ) 
      {
	if ( bisectstack [bisectptr - 19 ]< 0 ) 
	bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ];
	else bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ];
	bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
	if ( bisectstack [bisectptr - 16 ]< 0 ) 
	bisectstack [bisectptr - 16 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
	if ( bisectstack [bisectptr - 17 ]> bisectstack [bisectptr - 20 ]) 
	bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ];
	bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ];
	if ( bisectstack [bisectptr - 16 ]< 0 ) 
	bisectstack [bisectptr - 16 ]= 0 ;
      } 
      else if ( bisectstack [bisectptr - 18 ]<= 0 ) 
      {
	if ( bisectstack [bisectptr - 19 ]> 0 ) 
	bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ];
	else bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ];
	bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
	if ( bisectstack [bisectptr - 17 ]> 0 ) 
	bisectstack [bisectptr - 17 ]= 0 ;
      } 
      else {
	  
	bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ]+ bisectstack [bisectptr - 18 ];
	if ( bisectstack [bisectptr - 16 ]< bisectstack [bisectptr - 20 ]) 
	bisectstack [bisectptr - 16 ]= bisectstack [bisectptr - 20 ];
	bisectstack [bisectptr - 17 ]= bisectstack [bisectptr - 20 ]+ 
	bisectstack [bisectptr - 19 ];
	if ( bisectstack [bisectptr - 17 ]> 0 ) 
	bisectstack [bisectptr - 17 ]= 0 ;
      } 
      uv = bisectptr - 20 ;
      xy = bisectptr - 20 ;
      delx = delx + delx ;
      dely = dely + dely ;
      tol = tol - threel + tolstep ;
      tol = tol + tol ;
      threel = threel + tolstep ;
      goto lab22 ;
    } 
    if ( timetogo > 0 ) 
    decr ( timetogo ) ;
    else {
	
      while ( apprt < 65536L ) {
	  
	apprt = apprt + apprt ;
	apprtt = apprtt + apprtt ;
      } 
      curt = apprt ;
      curtt = apprtt ;
      goto lab10 ;
    } 
    lab45: if ( odd ( curtt ) ) 
    if ( odd ( curt ) ) 
    {
      curt = halfp ( curt ) ;
      curtt = halfp ( curtt ) ;
      if ( curt == 0 ) 
      goto lab10 ;
      bisectptr = bisectptr - 45 ;
      threel = threel - tolstep ;
      delx = bisectstack [bisectptr ];
      dely = bisectstack [bisectptr + 1 ];
      tol = bisectstack [bisectptr + 2 ];
      uv = bisectstack [bisectptr + 3 ];
      xy = bisectstack [bisectptr + 4 ];
      goto lab45 ;
    } 
    else {
	
      incr ( curt ) ;
      delx = delx + bisectstack [uv - 5 ]+ bisectstack [uv - 4 ]+ 
      bisectstack [uv - 3 ];
      dely = dely + bisectstack [uv - 10 ]+ bisectstack [uv - 9 ]+ 
      bisectstack [uv - 8 ];
      uv = uv + 20 ;
      decr ( curtt ) ;
      xy = xy - 20 ;
      delx = delx + bisectstack [xy - 15 ]+ bisectstack [xy - 14 ]+ 
      bisectstack [xy - 13 ];
      dely = dely + bisectstack [xy - 20 ]+ bisectstack [xy - 19 ]+ 
      bisectstack [xy - 18 ];
    } 
    else {
	
      incr ( curtt ) ;
      tol = tol + threel ;
      delx = delx - bisectstack [xy - 15 ]- bisectstack [xy - 14 ]- 
      bisectstack [xy - 13 ];
      dely = dely - bisectstack [xy - 20 ]- bisectstack [xy - 19 ]- 
      bisectstack [xy - 18 ];
      xy = xy + 20 ;
    } 
  } 
  lab10: ;
} 

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].