#define TANGLE
#include "cpascal.h"
/* 9999 */
#define bufsize ( 3000 )
#define maxbytes ( 45000L )
#define maxtoks ( 60000L )
#define maxnames ( 6000 )
#define maxtexts ( 5000 )
#define hashsize ( 353 )
#define longestname ( 400 )
#define linelength ( 72 )
#define outbufsize ( 144 )
#define stacksize ( 100 )
#define maxidlength ( 50 )
#define unambiglength ( 32 )
typedef unsigned char ASCIIcode ;
typedef text /* of ASCIIcode */ textfile ;
typedef unsigned char eightbits ;
typedef unsigned short sixteenbits ;
typedef integer namepointer ;
typedef integer textpointer ;
typedef struct {
sixteenbits endfield ;
sixteenbits bytefield ;
namepointer namefield ;
textpointer replfield ;
short modfield ;
} outputstate ;
char history ;
ASCIIcode xord[256] ;
ASCIIcode xchr[256] ;
textfile webfile ;
textfile changefile ;
textfile Pascalfile ;
textfile pool ;
ASCIIcode buffer[bufsize + 1] ;
boolean phaseone ;
ASCIIcode bytemem[3][maxbytes + 1] ;
eightbits tokmem[4][maxtoks + 1] ;
sixteenbits bytestart[maxnames + 1] ;
sixteenbits tokstart[maxtexts + 1] ;
sixteenbits link[maxnames + 1] ;
sixteenbits ilk[maxnames + 1] ;
sixteenbits equiv[maxnames + 1] ;
sixteenbits textlink[maxtexts + 1] ;
namepointer nameptr ;
namepointer stringptr ;
integer byteptr[3] ;
integer poolchecksum ;
textpointer textptr ;
integer tokptr[4] ;
char z ;
integer idfirst ;
integer idloc ;
integer doublechars ;
sixteenbits hash[hashsize + 1], chophash[hashsize + 1] ;
ASCIIcode choppedid[unambiglength + 1] ;
ASCIIcode modtext[longestname + 1] ;
textpointer lastunnamed ;
outputstate curstate ;
outputstate stack[stacksize + 1] ;
integer stackptr ;
char zo ;
eightbits bracelevel ;
integer curval ;
ASCIIcode outbuf[outbufsize + 1] ;
integer outptr ;
integer breakptr ;
integer semiptr ;
eightbits outstate ;
integer outval, outapp ;
ASCIIcode outsign ;
schar lastsign ;
ASCIIcode outcontrib[linelength + 1] ;
integer ii ;
integer line ;
integer otherline ;
integer templine ;
integer limit ;
integer loc ;
boolean inputhasended ;
boolean changing ;
ASCIIcode changebuffer[bufsize + 1] ;
integer changelimit ;
namepointer curmodule ;
boolean scanninghex ;
eightbits nextcontrol ;
textpointer currepltext ;
short modulecount ;
cstring webname, chgname, pascalname, poolname ;
#include "tangle.h"
void
#ifdef HAVE_PROTOTYPES
error ( void )
#else
error ( )
#endif
{
integer j ;
integer k, l ;
if ( phaseone )
{
if ( changing )
Fputs( stdout , ". (change file " ) ;
else
Fputs( stdout , ". (" ) ;
fprintf( stdout , "%s%ld%c\n", "l." , (long)line , ')' ) ;
if ( loc >= limit )
l = limit ;
else l = loc ;
{register integer for_end; k = 1 ;for_end = l ; if ( k <= for_end) do
if ( buffer [k - 1 ]== 9 )
putc ( ' ' , stdout );
else
putc ( xchr [buffer [k - 1 ]], stdout );
while ( k++ < for_end ) ;}
putc ('\n', stdout );
{register integer for_end; k = 1 ;for_end = l ; if ( k <= for_end) do
putc ( ' ' , stdout );
while ( k++ < for_end ) ;}
{register integer for_end; k = l + 1 ;for_end = limit ; if ( k <=
for_end) do
putc ( xchr [buffer [k - 1 ]], stdout );
while ( k++ < for_end ) ;}
putc ( ' ' , stdout );
}
else {
fprintf( stdout , "%s%ld%c\n", ". (l." , (long)line , ')' ) ;
{register integer for_end; j = 1 ;for_end = outptr ; if ( j <= for_end)
do
putc ( xchr [outbuf [j - 1 ]], stdout );
while ( j++ < for_end ) ;}
Fputs( stdout , "... " ) ;
}
fflush ( stdout ) ;
history = 2 ;
}
void
#ifdef HAVE_PROTOTYPES
parsearguments ( void )
#else
parsearguments ( )
#endif
{
#define noptions ( 3 )
getoptstruct longoptions[noptions + 1] ;
integer getoptreturnval ;
cinttype optionindex ;
integer currentoption ;
currentoption = 0 ;
longoptions [currentoption ].name = "help" ;
longoptions [currentoption ].hasarg = 0 ;
longoptions [currentoption ].flag = 0 ;
longoptions [currentoption ].val = 0 ;
currentoption = currentoption + 1 ;
longoptions [currentoption ].name = "version" ;
longoptions [currentoption ].hasarg = 0 ;
longoptions [currentoption ].flag = 0 ;
longoptions [currentoption ].val = 0 ;
currentoption = currentoption + 1 ;
longoptions [currentoption ].name = 0 ;
longoptions [currentoption ].hasarg = 0 ;
longoptions [currentoption ].flag = 0 ;
longoptions [currentoption ].val = 0 ;
do {
getoptreturnval = getoptlongonly ( argc , argv , "" , longoptions ,
addressof ( optionindex ) ) ;
if ( getoptreturnval == -1 )
{
;
}
else if ( getoptreturnval == 63 )
{
usage ( 1 , "tangle" ) ;
}
else if ( ( strcmp ( longoptions [optionindex ].name , "help" ) == 0 ) )
{
usage ( 0 , TANGLEHELP ) ;
}
else if ( ( strcmp ( longoptions [optionindex ].name , "version" ) == 0
) )
{
printversionandexit ( "This is TANGLE, Version 4.3" , nil , "D.E. Knuth"
) ;
}
} while ( ! ( getoptreturnval == -1 ) ) ;
if ( ( optind + 1 != argc ) && ( optind + 2 != argc ) )
{
fprintf( stderr , "%s\n", "tangle: Need one or two file arguments." ) ;
usage ( 1 , "tangle" ) ;
}
webname = extendfilename ( cmdline ( optind ) , "web" ) ;
if ( optind + 2 == argc )
{
chgname = extendfilename ( cmdline ( optind + 1 ) , "ch" ) ;
}
pascalname = basenamechangesuffix ( webname , ".web" , ".p" ) ;
}
void
#ifdef HAVE_PROTOTYPES
initialize ( void )
#else
initialize ( )
#endif
{
unsigned char i ;
char wi ;
char zi ;
integer h ;
kpsesetprogname ( argv [0 ]) ;
parsearguments () ;
history = 0 ;
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 ]= '~' ;
xchr [0 ]= ' ' ;
xchr [127 ]= ' ' ;
{register integer for_end; i = 1 ;for_end = 31 ; if ( i <= for_end) do
xchr [i ]= chr ( i ) ;
while ( i++ < for_end ) ;}
{register integer for_end; i = 128 ;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 ) ]= 32 ;
while ( i++ < for_end ) ;}
{register integer for_end; i = 1 ;for_end = 255 ; if ( i <= for_end) do
xord [xchr [i ]]= i ;
while ( i++ < for_end ) ;}
xord [' ' ]= 32 ;
rewrite ( Pascalfile , pascalname ) ;
{register integer for_end; wi = 0 ;for_end = 2 ; if ( wi <= for_end) do
{
bytestart [wi ]= 0 ;
byteptr [wi ]= 0 ;
}
while ( wi++ < for_end ) ;}
bytestart [3 ]= 0 ;
nameptr = 1 ;
stringptr = 256 ;
poolchecksum = 271828L ;
{register integer for_end; zi = 0 ;for_end = 3 ; if ( zi <= for_end) do
{
tokstart [zi ]= 0 ;
tokptr [zi ]= 0 ;
}
while ( zi++ < for_end ) ;}
tokstart [4 ]= 0 ;
textptr = 1 ;
z = 1 % 4 ;
ilk [0 ]= 0 ;
equiv [0 ]= 0 ;
{register integer for_end; h = 0 ;for_end = hashsize - 1 ; if ( h <=
for_end) do
{
hash [h ]= 0 ;
chophash [h ]= 0 ;
}
while ( h++ < for_end ) ;}
lastunnamed = 0 ;
textlink [0 ]= 0 ;
scanninghex = false ;
modtext [0 ]= 32 ;
}
void
#ifdef HAVE_PROTOTYPES
openinput ( void )
#else
openinput ( )
#endif
{
reset ( webfile , webname ) ;
if ( chgname )
reset ( changefile , chgname ) ;
}
boolean
#ifdef HAVE_PROTOTYPES
zinputln ( textfile f )
#else
zinputln ( f )
textfile f ;
#endif
{
register boolean Result; integer finallimit ;
limit = 0 ;
finallimit = 0 ;
if ( eof ( f ) )
Result = false ;
else {
while ( ! eoln ( f ) ) {
buffer [limit ]= xord [getc ( f ) ];
limit = limit + 1 ;
if ( buffer [limit - 1 ]!= 32 )
finallimit = limit ;
if ( limit == bufsize )
{
while ( ! eoln ( f ) ) vgetc ( f ) ;
limit = limit - 1 ;
if ( finallimit > limit )
finallimit = limit ;
{
putc ('\n', stdout );
Fputs( stdout , "! Input line too long" ) ;
}
loc = 0 ;
error () ;
}
}
readln ( f ) ;
limit = finallimit ;
Result = true ;
}
return Result ;
}
void
#ifdef HAVE_PROTOTYPES
zprintid ( namepointer p )
#else
zprintid ( p )
namepointer p ;
#endif
{
integer k ;
char w ;
if ( p >= nameptr )
Fputs( stdout , "IMPOSSIBLE" ) ;
else {
w = p % 3 ;
{register integer for_end; k = bytestart [p ];for_end = bytestart [p
+ 3 ]- 1 ; if ( k <= for_end) do
putc ( xchr [bytemem [w ][ k ]], stdout );
while ( k++ < for_end ) ;}
}
}
namepointer
#ifdef HAVE_PROTOTYPES
zidlookup ( eightbits t )
#else
zidlookup ( t )
eightbits t ;
#endif
{
/* 31 32 */ register namepointer Result; eightbits c ;
integer i ;
integer h ;
integer k ;
char w ;
integer l ;
namepointer p, q ;
integer s ;
l = idloc - idfirst ;
h = buffer [idfirst ];
i = idfirst + 1 ;
while ( i < idloc ) {
h = ( h + h + buffer [i ]) % hashsize ;
i = i + 1 ;
}
p = hash [h ];
while ( p != 0 ) {
if ( bytestart [p + 3 ]- bytestart [p ]== l )
{
i = idfirst ;
k = bytestart [p ];
w = p % 3 ;
while ( ( i < idloc ) && ( buffer [i ]== bytemem [w ][ k ]) ) {
i = i + 1 ;
k = k + 1 ;
}
if ( i == idloc )
goto lab31 ;
}
p = link [p ];
}
p = nameptr ;
link [p ]= hash [h ];
hash [h ]= p ;
lab31: ;
if ( ( p == nameptr ) || ( t != 0 ) )
{
if ( ( ( p != nameptr ) && ( t != 0 ) && ( ilk [p ]== 0 ) ) || ( ( p ==
nameptr ) && ( t == 0 ) && ( buffer [idfirst ]!= 34 ) ) )
{
i = idfirst ;
s = 0 ;
h = 0 ;
while ( ( i < idloc ) && ( s < unambiglength ) ) {
if ( buffer [i ]!= 95 )
{
choppedid [s ]= buffer [i ];
h = ( h + h + choppedid [s ]) % hashsize ;
s = s + 1 ;
}
i = i + 1 ;
}
choppedid [s ]= 0 ;
}
if ( p != nameptr )
{
if ( ilk [p ]== 0 )
{
if ( t == 1 )
{
putc ('\n', stdout );
Fputs( stdout , "! This identifier has already appeared" ) ;
error () ;
}
q = chophash [h ];
if ( q == p )
chophash [h ]= equiv [p ];
else {
while ( equiv [q ]!= p ) q = equiv [q ];
equiv [q ]= equiv [p ];
}
}
else {
putc ('\n', stdout );
Fputs( stdout , "! This identifier was defined before" ) ;
error () ;
}
ilk [p ]= t ;
}
else {
if ( ( t == 0 ) && ( buffer [idfirst ]!= 34 ) )
{
q = chophash [h ];
while ( q != 0 ) {
{
k = bytestart [q ];
s = 0 ;
w = q % 3 ;
while ( ( k < bytestart [q + 3 ]) && ( s < unambiglength ) ) {
c = bytemem [w ][ k ];
if ( c != 95 )
{
if ( choppedid [s ]!= c )
goto lab32 ;
s = s + 1 ;
}
k = k + 1 ;
}
if ( ( k == bytestart [q + 3 ]) && ( choppedid [s ]!= 0 ) )
goto lab32 ;
{
putc ('\n', stdout );
Fputs( stdout , "! Identifier conflict with " ) ;
}
{register integer for_end; k = bytestart [q ];for_end =
bytestart [q + 3 ]- 1 ; if ( k <= for_end) do
putc ( xchr [bytemem [w ][ k ]], stdout );
while ( k++ < for_end ) ;}
error () ;
q = 0 ;
lab32: ;
}
q = equiv [q ];
}
equiv [p ]= chophash [h ];
chophash [h ]= p ;
}
w = nameptr % 3 ;
k = byteptr [w ];
if ( k + l > maxbytes )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "byte memory" , " capacity exceeded" )
;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
if ( nameptr > maxnames - 3 )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "name" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
i = idfirst ;
while ( i < idloc ) {
bytemem [w ][ k ]= buffer [i ];
k = k + 1 ;
i = i + 1 ;
}
byteptr [w ]= k ;
bytestart [nameptr + 3 ]= k ;
nameptr = nameptr + 1 ;
if ( buffer [idfirst ]!= 34 )
ilk [p ]= t ;
else {
ilk [p ]= 1 ;
if ( l - doublechars == 2 )
equiv [p ]= buffer [idfirst + 1 ]+ 32768L ;
else {
if ( stringptr == 256 )
{
poolname = basenamechangesuffix ( webname , ".web" , ".pool" ) ;
rewrite ( pool , poolname ) ;
}
equiv [p ]= stringptr + 32768L ;
l = l - doublechars - 1 ;
if ( l > 99 )
{
putc ('\n', stdout );
Fputs( stdout , "! Preprocessed string is too long" ) ;
error () ;
}
stringptr = stringptr + 1 ;
fprintf( pool , "%c%c", xchr [48 + l / 10 ], xchr [48 + l % 10 ]) ;
poolchecksum = poolchecksum + poolchecksum + l ;
while ( poolchecksum > 536870839L ) poolchecksum = poolchecksum -
536870839L ;
i = idfirst + 1 ;
while ( i < idloc ) {
putc ( xchr [buffer [i ]], pool );
poolchecksum = poolchecksum + poolchecksum + buffer [i ];
while ( poolchecksum > 536870839L ) poolchecksum = poolchecksum -
536870839L ;
if ( ( buffer [i ]== 34 ) || ( buffer [i ]== 64 ) )
i = i + 2 ;
else i = i + 1 ;
}
putc ('\n', pool );
}
}
}
}
Result = p ;
return Result ;
}
namepointer
#ifdef HAVE_PROTOTYPES
zmodlookup ( sixteenbits l )
#else
zmodlookup ( l )
sixteenbits l ;
#endif
{
/* 31 */ register namepointer Result; char c ;
integer j ;
integer k ;
char w ;
namepointer p ;
namepointer q ;
c = 2 ;
q = 0 ;
p = ilk [0 ];
while ( p != 0 ) {
{
k = bytestart [p ];
w = p % 3 ;
c = 1 ;
j = 1 ;
while ( ( k < bytestart [p + 3 ]) && ( j <= l ) && ( modtext [j ]==
bytemem [w ][ k ]) ) {
k = k + 1 ;
j = j + 1 ;
}
if ( k == bytestart [p + 3 ])
if ( j > l )
c = 1 ;
else c = 4 ;
else if ( j > l )
c = 3 ;
else if ( modtext [j ]< bytemem [w ][ k ])
c = 0 ;
else c = 2 ;
}
q = p ;
if ( c == 0 )
p = link [q ];
else if ( c == 2 )
p = ilk [q ];
else goto lab31 ;
}
w = nameptr % 3 ;
k = byteptr [w ];
if ( k + l > maxbytes )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "byte memory" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
if ( nameptr > maxnames - 3 )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "name" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
p = nameptr ;
if ( c == 0 )
link [q ]= p ;
else ilk [q ]= p ;
link [p ]= 0 ;
ilk [p ]= 0 ;
c = 1 ;
equiv [p ]= 0 ;
{register integer for_end; j = 1 ;for_end = l ; if ( j <= for_end) do
bytemem [w ][ k + j - 1 ]= modtext [j ];
while ( j++ < for_end ) ;}
byteptr [w ]= k + l ;
bytestart [nameptr + 3 ]= k + l ;
nameptr = nameptr + 1 ;
lab31: if ( c != 1 )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Incompatible section names" ) ;
error () ;
}
p = 0 ;
}
Result = p ;
return Result ;
}
namepointer
#ifdef HAVE_PROTOTYPES
zprefixlookup ( sixteenbits l )
#else
zprefixlookup ( l )
sixteenbits l ;
#endif
{
register namepointer Result; char c ;
integer count ;
integer j ;
integer k ;
char w ;
namepointer p ;
namepointer q ;
namepointer r ;
q = 0 ;
p = ilk [0 ];
count = 0 ;
r = 0 ;
while ( p != 0 ) {
{
k = bytestart [p ];
w = p % 3 ;
c = 1 ;
j = 1 ;
while ( ( k < bytestart [p + 3 ]) && ( j <= l ) && ( modtext [j ]==
bytemem [w ][ k ]) ) {
k = k + 1 ;
j = j + 1 ;
}
if ( k == bytestart [p + 3 ])
if ( j > l )
c = 1 ;
else c = 4 ;
else if ( j > l )
c = 3 ;
else if ( modtext [j ]< bytemem [w ][ k ])
c = 0 ;
else c = 2 ;
}
if ( c == 0 )
p = link [p ];
else if ( c == 2 )
p = ilk [p ];
else {
r = p ;
count = count + 1 ;
q = ilk [p ];
p = link [p ];
}
if ( p == 0 )
{
p = q ;
q = 0 ;
}
}
if ( count != 1 )
if ( count == 0 )
{
putc ('\n', stdout );
Fputs( stdout , "! Name does not match" ) ;
error () ;
}
else {
putc ('\n', stdout );
Fputs( stdout , "! Ambiguous prefix" ) ;
error () ;
}
Result = r ;
return Result ;
}
void
#ifdef HAVE_PROTOTYPES
zstoretwobytes ( sixteenbits x )
#else
zstoretwobytes ( x )
sixteenbits x ;
#endif
{
if ( tokptr [z ]+ 2 > maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= x / 256 ;
tokmem [z ][ tokptr [z ]+ 1 ]= x % 256 ;
tokptr [z ]= tokptr [z ]+ 2 ;
}
void
#ifdef HAVE_PROTOTYPES
zpushlevel ( namepointer p )
#else
zpushlevel ( p )
namepointer p ;
#endif
{
if ( stackptr == stacksize )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "stack" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
else {
stack [stackptr ]= curstate ;
stackptr = stackptr + 1 ;
curstate .namefield = p ;
curstate .replfield = equiv [p ];
zo = curstate .replfield % 4 ;
curstate .bytefield = tokstart [curstate .replfield ];
curstate .endfield = tokstart [curstate .replfield + 4 ];
curstate .modfield = 0 ;
}
}
void
#ifdef HAVE_PROTOTYPES
poplevel ( void )
#else
poplevel ( )
#endif
{
/* 10 */ if ( textlink [curstate .replfield ]== 0 )
{
if ( ilk [curstate .namefield ]== 3 )
{
nameptr = nameptr - 1 ;
textptr = textptr - 1 ;
z = textptr % 4 ;
tokptr [z ]= tokstart [textptr ];
}
}
else if ( textlink [curstate .replfield ]< maxtexts )
{
curstate .replfield = textlink [curstate .replfield ];
zo = curstate .replfield % 4 ;
curstate .bytefield = tokstart [curstate .replfield ];
curstate .endfield = tokstart [curstate .replfield + 4 ];
goto lab10 ;
}
stackptr = stackptr - 1 ;
if ( stackptr > 0 )
{
curstate = stack [stackptr ];
zo = curstate .replfield % 4 ;
}
lab10: ;
}
sixteenbits
#ifdef HAVE_PROTOTYPES
getoutput ( void )
#else
getoutput ( )
#endif
{
/* 20 30 31 */ register sixteenbits Result; sixteenbits a ;
eightbits b ;
sixteenbits bal ;
integer k ;
char w ;
lab20: if ( stackptr == 0 )
{
a = 0 ;
goto lab31 ;
}
if ( curstate .bytefield == curstate .endfield )
{
curval = - (integer) curstate .modfield ;
poplevel () ;
if ( curval == 0 )
goto lab20 ;
a = 129 ;
goto lab31 ;
}
a = tokmem [zo ][ curstate .bytefield ];
curstate .bytefield = curstate .bytefield + 1 ;
if ( a < 128 )
if ( a == 0 )
{
pushlevel ( nameptr - 1 ) ;
goto lab20 ;
}
else goto lab31 ;
a = ( a - 128 ) * 256 + tokmem [zo ][ curstate .bytefield ];
curstate .bytefield = curstate .bytefield + 1 ;
if ( a < 10240 )
{
switch ( ilk [a ])
{case 0 :
{
curval = a ;
a = 130 ;
}
break ;
case 1 :
{
curval = equiv [a ]- 32768L ;
a = 128 ;
}
break ;
case 2 :
{
pushlevel ( a ) ;
goto lab20 ;
}
break ;
case 3 :
{
while ( ( curstate .bytefield == curstate .endfield ) && ( stackptr >
0 ) ) poplevel () ;
if ( ( stackptr == 0 ) || ( tokmem [zo ][ curstate .bytefield ]!= 40
) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! No parameter given for " ) ;
}
printid ( a ) ;
error () ;
goto lab20 ;
}
bal = 1 ;
curstate .bytefield = curstate .bytefield + 1 ;
while ( true ) {
b = tokmem [zo ][ curstate .bytefield ];
curstate .bytefield = curstate .bytefield + 1 ;
if ( b == 0 )
storetwobytes ( nameptr + 32767 ) ;
else {
if ( b >= 128 )
{
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= b ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
b = tokmem [zo ][ curstate .bytefield ];
curstate .bytefield = curstate .bytefield + 1 ;
}
else switch ( b )
{case 40 :
bal = bal + 1 ;
break ;
case 41 :
{
bal = bal - 1 ;
if ( bal == 0 )
goto lab30 ;
}
break ;
case 39 :
do {
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= b ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
b = tokmem [zo ][ curstate .bytefield ];
curstate .bytefield = curstate .bytefield + 1 ;
} while ( ! ( b == 39 ) ) ;
break ;
default:
;
break ;
}
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= b ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
}
}
lab30: ;
equiv [nameptr ]= textptr ;
ilk [nameptr ]= 2 ;
w = nameptr % 3 ;
k = byteptr [w ];
if ( nameptr > maxnames - 3 )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "name" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
bytestart [nameptr + 3 ]= k ;
nameptr = nameptr + 1 ;
if ( textptr > maxtexts - 4 )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "text" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
textlink [textptr ]= 0 ;
tokstart [textptr + 4 ]= tokptr [z ];
textptr = textptr + 1 ;
z = textptr % 4 ;
pushlevel ( a ) ;
goto lab20 ;
}
break ;
default:
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%c", "! This can't happen (" , "output" , ')' ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
break ;
}
goto lab31 ;
}
if ( a < 20480 )
{
a = a - 10240 ;
if ( equiv [a ]!= 0 )
pushlevel ( a ) ;
else if ( a != 0 )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Not present: <" ) ;
}
printid ( a ) ;
putc ( '>' , stdout );
error () ;
}
goto lab20 ;
}
curval = a - 20480 ;
a = 129 ;
curstate .modfield = curval ;
lab31: Result = a ;
return Result ;
}
void
#ifdef HAVE_PROTOTYPES
flushbuffer ( void )
#else
flushbuffer ( )
#endif
{
integer k ;
integer b ;
b = breakptr ;
if ( ( semiptr != 0 ) && ( outptr - semiptr <= linelength ) )
breakptr = semiptr ;
{register integer for_end; k = 1 ;for_end = breakptr ; if ( k <= for_end)
do
putc ( xchr [outbuf [k - 1 ]], Pascalfile );
while ( k++ < for_end ) ;}
putc ('\n', Pascalfile );
line = line + 1 ;
if ( line % 100 == 0 )
{
putc ( '.' , stdout );
if ( line % 500 == 0 )
fprintf( stdout , "%ld", (long)line ) ;
fflush ( stdout ) ;
}
if ( breakptr < outptr )
{
if ( outbuf [breakptr ]== 32 )
{
breakptr = breakptr + 1 ;
if ( breakptr > b )
b = breakptr ;
}
{register integer for_end; k = breakptr ;for_end = outptr - 1 ; if ( k
<= for_end) do
outbuf [k - breakptr ]= outbuf [k ];
while ( k++ < for_end ) ;}
}
outptr = outptr - breakptr ;
breakptr = b - breakptr ;
semiptr = 0 ;
if ( outptr > linelength )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Long line must be truncated" ) ;
error () ;
}
outptr = linelength ;
}
}
void
#ifdef HAVE_PROTOTYPES
zappval ( integer v )
#else
zappval ( v )
integer v ;
#endif
{
integer k ;
k = outbufsize ;
do {
outbuf [k ]= v % 10 ;
v = v / 10 ;
k = k - 1 ;
} while ( ! ( v == 0 ) ) ;
do {
k = k + 1 ;
{
outbuf [outptr ]= outbuf [k ]+ 48 ;
outptr = outptr + 1 ;
}
} while ( ! ( k == outbufsize ) ) ;
}
void
#ifdef HAVE_PROTOTYPES
zsendout ( eightbits t , sixteenbits v )
#else
zsendout ( t , v )
eightbits t ;
sixteenbits v ;
#endif
{
/* 20 */ integer k ;
lab20: switch ( outstate )
{case 1 :
if ( t != 3 )
{
breakptr = outptr ;
if ( t == 2 )
{
outbuf [outptr ]= 32 ;
outptr = outptr + 1 ;
}
}
break ;
case 2 :
{
{
outbuf [outptr ]= 44 - outapp ;
outptr = outptr + 1 ;
}
if ( outptr > linelength )
flushbuffer () ;
breakptr = outptr ;
}
break ;
case 3 :
case 4 :
{
if ( ( outval < 0 ) || ( ( outval == 0 ) && ( lastsign < 0 ) ) )
{
outbuf [outptr ]= 45 ;
outptr = outptr + 1 ;
}
else if ( outsign > 0 )
{
outbuf [outptr ]= outsign ;
outptr = outptr + 1 ;
}
appval ( abs ( outval ) ) ;
if ( outptr > linelength )
flushbuffer () ;
outstate = outstate - 2 ;
goto lab20 ;
}
break ;
case 5 :
{
if ( ( t == 3 ) || ( ( ( t == 2 ) && ( v == 3 ) && ( ( ( outcontrib [1
]== 68 ) && ( outcontrib [2 ]== 73 ) && ( outcontrib [3 ]== 86 ) )
|| ( ( outcontrib [1 ]== 100 ) && ( outcontrib [2 ]== 105 ) && (
outcontrib [3 ]== 118 ) ) || ( ( outcontrib [1 ]== 77 ) && (
outcontrib [2 ]== 79 ) && ( outcontrib [3 ]== 68 ) ) || ( (
outcontrib [1 ]== 109 ) && ( outcontrib [2 ]== 111 ) && ( outcontrib
[3 ]== 100 ) ) ) ) || ( ( t == 0 ) && ( ( v == 42 ) || ( v == 47 ) ) )
) )
{
if ( ( outval < 0 ) || ( ( outval == 0 ) && ( lastsign < 0 ) ) )
{
outbuf [outptr ]= 45 ;
outptr = outptr + 1 ;
}
else if ( outsign > 0 )
{
outbuf [outptr ]= outsign ;
outptr = outptr + 1 ;
}
appval ( abs ( outval ) ) ;
if ( outptr > linelength )
flushbuffer () ;
outsign = 43 ;
outval = outapp ;
}
else outval = outval + outapp ;
outstate = 3 ;
goto lab20 ;
}
break ;
case 0 :
if ( t != 3 )
breakptr = outptr ;
break ;
default:
;
break ;
}
if ( t != 0 )
{register integer for_end; k = 1 ;for_end = v ; if ( k <= for_end) do
{
outbuf [outptr ]= outcontrib [k ];
outptr = outptr + 1 ;
}
while ( k++ < for_end ) ;}
else {
outbuf [outptr ]= v ;
outptr = outptr + 1 ;
}
if ( outptr > linelength )
flushbuffer () ;
if ( ( t == 0 ) && ( ( v == 59 ) || ( v == 125 ) ) )
{
semiptr = outptr ;
breakptr = outptr ;
}
if ( t >= 2 )
outstate = 1 ;
else outstate = 0 ;
}
void
#ifdef HAVE_PROTOTYPES
zsendsign ( integer v )
#else
zsendsign ( v )
integer v ;
#endif
{
switch ( outstate )
{case 2 :
case 4 :
outapp = outapp * v ;
break ;
case 3 :
{
outapp = v ;
outstate = 4 ;
}
break ;
case 5 :
{
outval = outval + outapp ;
outapp = v ;
outstate = 4 ;
}
break ;
default:
{
breakptr = outptr ;
outapp = v ;
outstate = 2 ;
}
break ;
}
lastsign = outapp ;
}
void
#ifdef HAVE_PROTOTYPES
zsendval ( integer v )
#else
zsendval ( v )
integer v ;
#endif
{
/* 666 10 */ switch ( outstate )
{case 1 :
{
if ( ( outptr == breakptr + 3 ) || ( ( outptr == breakptr + 4 ) && (
outbuf [breakptr ]== 32 ) ) )
if ( ( ( outbuf [outptr - 3 ]== 68 ) && ( outbuf [outptr - 2 ]== 73
) && ( outbuf [outptr - 1 ]== 86 ) ) || ( ( outbuf [outptr - 3 ]==
100 ) && ( outbuf [outptr - 2 ]== 105 ) && ( outbuf [outptr - 1 ]==
118 ) ) || ( ( outbuf [outptr - 3 ]== 77 ) && ( outbuf [outptr - 2 ]
== 79 ) && ( outbuf [outptr - 1 ]== 68 ) ) || ( ( outbuf [outptr - 3
]== 109 ) && ( outbuf [outptr - 2 ]== 111 ) && ( outbuf [outptr - 1
]== 100 ) ) )
goto lab666 ;
outsign = 32 ;
outstate = 3 ;
outval = v ;
breakptr = outptr ;
lastsign = 1 ;
}
break ;
case 0 :
{
if ( ( outptr == breakptr + 1 ) && ( ( outbuf [breakptr ]== 42 ) || (
outbuf [breakptr ]== 47 ) ) )
goto lab666 ;
outsign = 0 ;
outstate = 3 ;
outval = v ;
breakptr = outptr ;
lastsign = 1 ;
}
break ;
case 2 :
{
outsign = 43 ;
outstate = 3 ;
outval = outapp * v ;
}
break ;
case 3 :
{
outstate = 5 ;
outapp = v ;
{
putc ('\n', stdout );
Fputs( stdout , "! Two numbers occurred without a sign between them" ) ;
error () ;
}
}
break ;
case 4 :
{
outstate = 5 ;
outapp = outapp * v ;
}
break ;
case 5 :
{
outval = outval + outapp ;
outapp = v ;
{
putc ('\n', stdout );
Fputs( stdout , "! Two numbers occurred without a sign between them" ) ;
error () ;
}
}
break ;
default:
goto lab666 ;
break ;
}
goto lab10 ;
lab666: if ( v >= 0 )
{
if ( outstate == 1 )
{
breakptr = outptr ;
{
outbuf [outptr ]= 32 ;
outptr = outptr + 1 ;
}
}
appval ( v ) ;
if ( outptr > linelength )
flushbuffer () ;
outstate = 1 ;
}
else {
{
outbuf [outptr ]= 40 ;
outptr = outptr + 1 ;
}
{
outbuf [outptr ]= 45 ;
outptr = outptr + 1 ;
}
appval ( - (integer) v ) ;
{
outbuf [outptr ]= 41 ;
outptr = outptr + 1 ;
}
if ( outptr > linelength )
flushbuffer () ;
outstate = 0 ;
}
lab10: ;
}
void
#ifdef HAVE_PROTOTYPES
sendtheoutput ( void )
#else
sendtheoutput ( )
#endif
{
/* 2 21 22 */ eightbits curchar ;
integer k ;
integer j ;
char w ;
integer n ;
while ( stackptr > 0 ) {
curchar = getoutput () ;
lab21: switch ( curchar )
{case 0 :
;
break ;
case 65 :
case 66 :
case 67 :
case 68 :
case 69 :
case 70 :
case 71 :
case 72 :
case 73 :
case 74 :
case 75 :
case 76 :
case 77 :
case 78 :
case 79 :
case 80 :
case 81 :
case 82 :
case 83 :
case 84 :
case 85 :
case 86 :
case 87 :
case 88 :
case 89 :
case 90 :
case 97 :
case 98 :
case 99 :
case 100 :
case 101 :
case 102 :
case 103 :
case 104 :
case 105 :
case 106 :
case 107 :
case 108 :
case 109 :
case 110 :
case 111 :
case 112 :
case 113 :
case 114 :
case 115 :
case 116 :
case 117 :
case 118 :
case 119 :
case 120 :
case 121 :
case 122 :
{
outcontrib [1 ]= curchar ;
sendout ( 2 , 1 ) ;
}
break ;
case 130 :
{
k = 0 ;
j = bytestart [curval ];
w = curval % 3 ;
while ( ( k < maxidlength ) && ( j < bytestart [curval + 3 ]) ) {
k = k + 1 ;
outcontrib [k ]= bytemem [w ][ j ];
j = j + 1 ;
if ( outcontrib [k ]== 95 )
k = k - 1 ;
}
sendout ( 2 , k ) ;
}
break ;
case 48 :
case 49 :
case 50 :
case 51 :
case 52 :
case 53 :
case 54 :
case 55 :
case 56 :
case 57 :
{
n = 0 ;
do {
curchar = curchar - 48 ;
if ( n >= 214748364L )
{
putc ('\n', stdout );
Fputs( stdout , "! Constant too big" ) ;
error () ;
}
else n = 10 * n + curchar ;
curchar = getoutput () ;
} while ( ! ( ( curchar > 57 ) || ( curchar < 48 ) ) ) ;
sendval ( n ) ;
k = 0 ;
if ( curchar == 101 )
curchar = 69 ;
if ( curchar == 69 )
goto lab2 ;
else goto lab21 ;
}
break ;
case 125 :
sendval ( poolchecksum ) ;
break ;
case 12 :
{
n = 0 ;
curchar = 48 ;
do {
curchar = curchar - 48 ;
if ( n >= 268435456L )
{
putc ('\n', stdout );
Fputs( stdout , "! Constant too big" ) ;
error () ;
}
else n = 8 * n + curchar ;
curchar = getoutput () ;
} while ( ! ( ( curchar > 55 ) || ( curchar < 48 ) ) ) ;
sendval ( n ) ;
goto lab21 ;
}
break ;
case 13 :
{
n = 0 ;
curchar = 48 ;
do {
if ( curchar >= 65 )
curchar = curchar - 55 ;
else curchar = curchar - 48 ;
if ( n >= 134217728L )
{
putc ('\n', stdout );
Fputs( stdout , "! Constant too big" ) ;
error () ;
}
else n = 16 * n + curchar ;
curchar = getoutput () ;
} while ( ! ( ( curchar > 70 ) || ( curchar < 48 ) || ( ( curchar > 57
) && ( curchar < 65 ) ) ) ) ;
sendval ( n ) ;
goto lab21 ;
}
break ;
case 128 :
sendval ( curval ) ;
break ;
case 46 :
{
k = 1 ;
outcontrib [1 ]= 46 ;
curchar = getoutput () ;
if ( curchar == 46 )
{
outcontrib [2 ]= 46 ;
sendout ( 1 , 2 ) ;
}
else if ( ( curchar >= 48 ) && ( curchar <= 57 ) )
goto lab2 ;
else {
sendout ( 0 , 46 ) ;
goto lab21 ;
}
}
break ;
case 43 :
case 45 :
sendsign ( 44 - curchar ) ;
break ;
case 4 :
{
outcontrib [1 ]= 97 ;
outcontrib [2 ]= 110 ;
outcontrib [3 ]= 100 ;
sendout ( 2 , 3 ) ;
}
break ;
case 5 :
{
outcontrib [1 ]= 110 ;
outcontrib [2 ]= 111 ;
outcontrib [3 ]= 116 ;
sendout ( 2 , 3 ) ;
}
break ;
case 6 :
{
outcontrib [1 ]= 105 ;
outcontrib [2 ]= 110 ;
sendout ( 2 , 2 ) ;
}
break ;
case 31 :
{
outcontrib [1 ]= 111 ;
outcontrib [2 ]= 114 ;
sendout ( 2 , 2 ) ;
}
break ;
case 24 :
{
outcontrib [1 ]= 58 ;
outcontrib [2 ]= 61 ;
sendout ( 1 , 2 ) ;
}
break ;
case 26 :
{
outcontrib [1 ]= 60 ;
outcontrib [2 ]= 62 ;
sendout ( 1 , 2 ) ;
}
break ;
case 28 :
{
outcontrib [1 ]= 60 ;
outcontrib [2 ]= 61 ;
sendout ( 1 , 2 ) ;
}
break ;
case 29 :
{
outcontrib [1 ]= 62 ;
outcontrib [2 ]= 61 ;
sendout ( 1 , 2 ) ;
}
break ;
case 30 :
{
outcontrib [1 ]= 61 ;
outcontrib [2 ]= 61 ;
sendout ( 1 , 2 ) ;
}
break ;
case 32 :
{
outcontrib [1 ]= 46 ;
outcontrib [2 ]= 46 ;
sendout ( 1 , 2 ) ;
}
break ;
case 39 :
{
k = 1 ;
outcontrib [1 ]= 39 ;
do {
if ( k < linelength )
k = k + 1 ;
outcontrib [k ]= getoutput () ;
} while ( ! ( ( outcontrib [k ]== 39 ) || ( stackptr == 0 ) ) ) ;
if ( k == linelength )
{
putc ('\n', stdout );
Fputs( stdout , "! String too long" ) ;
error () ;
}
sendout ( 1 , k ) ;
curchar = getoutput () ;
if ( curchar == 39 )
outstate = 6 ;
goto lab21 ;
}
break ;
case 33 :
case 34 :
case 35 :
case 36 :
case 37 :
case 38 :
case 40 :
case 41 :
case 42 :
case 44 :
case 47 :
case 58 :
case 59 :
case 60 :
case 61 :
case 62 :
case 63 :
case 64 :
case 91 :
case 92 :
case 93 :
case 94 :
case 95 :
case 96 :
case 123 :
case 124 :
sendout ( 0 , curchar ) ;
break ;
case 9 :
{
if ( bracelevel == 0 )
sendout ( 0 , 123 ) ;
else sendout ( 0 , 91 ) ;
bracelevel = bracelevel + 1 ;
}
break ;
case 10 :
if ( bracelevel > 0 )
{
bracelevel = bracelevel - 1 ;
if ( bracelevel == 0 )
sendout ( 0 , 125 ) ;
else sendout ( 0 , 93 ) ;
}
else {
putc ('\n', stdout );
Fputs( stdout , "! Extra @}" ) ;
error () ;
}
break ;
case 129 :
{
if ( bracelevel == 0 )
sendout ( 0 , 123 ) ;
else sendout ( 0 , 91 ) ;
if ( curval < 0 )
{
sendout ( 0 , 58 ) ;
sendval ( - (integer) curval ) ;
}
else {
sendval ( curval ) ;
sendout ( 0 , 58 ) ;
}
if ( bracelevel == 0 )
sendout ( 0 , 125 ) ;
else sendout ( 0 , 93 ) ;
}
break ;
case 127 :
{
sendout ( 3 , 0 ) ;
outstate = 6 ;
}
break ;
case 2 :
{
k = 0 ;
do {
if ( k < linelength )
k = k + 1 ;
outcontrib [k ]= getoutput () ;
} while ( ! ( ( outcontrib [k ]== 2 ) || ( stackptr == 0 ) ) ) ;
if ( k == linelength )
{
putc ('\n', stdout );
Fputs( stdout , "! Verbatim string too long" ) ;
error () ;
}
sendout ( 1 , k - 1 ) ;
}
break ;
case 3 :
{
sendout ( 1 , 0 ) ;
while ( outptr > 0 ) {
if ( outptr <= linelength )
breakptr = outptr ;
flushbuffer () ;
}
outstate = 0 ;
}
break ;
default:
{
putc ('\n', stdout );
fprintf( stdout , "%s%ld", "! Can't output ASCII code " , (long)curchar ) ;
error () ;
}
break ;
}
goto lab22 ;
lab2: do {
if ( k < linelength )
k = k + 1 ;
outcontrib [k ]= curchar ;
curchar = getoutput () ;
if ( ( outcontrib [k ]== 69 ) && ( ( curchar == 43 ) || ( curchar ==
45 ) ) )
{
if ( k < linelength )
k = k + 1 ;
outcontrib [k ]= curchar ;
curchar = getoutput () ;
}
else if ( curchar == 101 )
curchar = 69 ;
} while ( ! ( ( curchar != 69 ) && ( ( curchar < 48 ) || ( curchar > 57 )
) ) ) ;
if ( k == linelength )
{
putc ('\n', stdout );
Fputs( stdout , "! Fraction too long" ) ;
error () ;
}
sendout ( 3 , k ) ;
goto lab21 ;
lab22: ;
}
}
boolean
#ifdef HAVE_PROTOTYPES
linesdontmatch ( void )
#else
linesdontmatch ( )
#endif
{
/* 10 */ register boolean Result; integer k ;
Result = true ;
if ( changelimit != limit )
goto lab10 ;
if ( limit > 0 )
{register integer for_end; k = 0 ;for_end = limit - 1 ; if ( k <= for_end)
do
if ( changebuffer [k ]!= buffer [k ])
goto lab10 ;
while ( k++ < for_end ) ;}
Result = false ;
lab10: ;
return Result ;
}
void
#ifdef HAVE_PROTOTYPES
primethechangebuffer ( void )
#else
primethechangebuffer ( )
#endif
{
/* 22 30 10 */ integer k ;
changelimit = 0 ;
while ( true ) {
line = line + 1 ;
if ( ! inputln ( changefile ) )
goto lab10 ;
if ( limit < 2 )
goto lab22 ;
if ( buffer [0 ]!= 64 )
goto lab22 ;
if ( ( buffer [1 ]>= 88 ) && ( buffer [1 ]<= 90 ) )
buffer [1 ]= buffer [1 ]+ 32 ;
if ( buffer [1 ]== 120 )
goto lab30 ;
if ( ( buffer [1 ]== 121 ) || ( buffer [1 ]== 122 ) )
{
loc = 2 ;
{
putc ('\n', stdout );
Fputs( stdout , "! Where is the matching @x?" ) ;
error () ;
}
}
lab22: ;
}
lab30: ;
do {
line = line + 1 ;
if ( ! inputln ( changefile ) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Change file ended after @x" ) ;
error () ;
}
goto lab10 ;
}
} while ( ! ( limit > 0 ) ) ;
{
changelimit = limit ;
if ( limit > 0 )
{register integer for_end; k = 0 ;for_end = limit - 1 ; if ( k <=
for_end) do
changebuffer [k ]= buffer [k ];
while ( k++ < for_end ) ;}
}
lab10: ;
}
void
#ifdef HAVE_PROTOTYPES
checkchange ( void )
#else
checkchange ( )
#endif
{
/* 10 */ integer n ;
integer k ;
if ( linesdontmatch () )
goto lab10 ;
n = 0 ;
while ( true ) {
changing = ! changing ;
templine = otherline ;
otherline = line ;
line = templine ;
line = line + 1 ;
if ( ! inputln ( changefile ) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Change file ended before @y" ) ;
error () ;
}
changelimit = 0 ;
changing = ! changing ;
templine = otherline ;
otherline = line ;
line = templine ;
goto lab10 ;
}
if ( limit > 1 )
if ( buffer [0 ]== 64 )
{
if ( ( buffer [1 ]>= 88 ) && ( buffer [1 ]<= 90 ) )
buffer [1 ]= buffer [1 ]+ 32 ;
if ( ( buffer [1 ]== 120 ) || ( buffer [1 ]== 122 ) )
{
loc = 2 ;
{
putc ('\n', stdout );
Fputs( stdout , "! Where is the matching @y?" ) ;
error () ;
}
}
else if ( buffer [1 ]== 121 )
{
if ( n > 0 )
{
loc = 2 ;
{
putc ('\n', stdout );
fprintf( stdout , "%s%ld%s", "! Hmm... " , (long)n , " of the preceding lines failed to match" ) ;
error () ;
}
}
goto lab10 ;
}
}
{
changelimit = limit ;
if ( limit > 0 )
{register integer for_end; k = 0 ;for_end = limit - 1 ; if ( k <=
for_end) do
changebuffer [k ]= buffer [k ];
while ( k++ < for_end ) ;}
}
changing = ! changing ;
templine = otherline ;
otherline = line ;
line = templine ;
line = line + 1 ;
if ( ! inputln ( webfile ) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! WEB file ended during a change" ) ;
error () ;
}
inputhasended = true ;
goto lab10 ;
}
if ( linesdontmatch () )
n = n + 1 ;
}
lab10: ;
}
void
#ifdef HAVE_PROTOTYPES
getline ( void )
#else
getline ( )
#endif
{
/* 20 */ lab20: if ( changing )
{
line = line + 1 ;
if ( ! inputln ( changefile ) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Change file ended without @z" ) ;
error () ;
}
buffer [0 ]= 64 ;
buffer [1 ]= 122 ;
limit = 2 ;
}
if ( limit > 1 )
if ( buffer [0 ]== 64 )
{
if ( ( buffer [1 ]>= 88 ) && ( buffer [1 ]<= 90 ) )
buffer [1 ]= buffer [1 ]+ 32 ;
if ( ( buffer [1 ]== 120 ) || ( buffer [1 ]== 121 ) )
{
loc = 2 ;
{
putc ('\n', stdout );
Fputs( stdout , "! Where is the matching @z?" ) ;
error () ;
}
}
else if ( buffer [1 ]== 122 )
{
primethechangebuffer () ;
changing = ! changing ;
templine = otherline ;
otherline = line ;
line = templine ;
}
}
}
if ( ! changing )
{
{
line = line + 1 ;
if ( ! inputln ( webfile ) )
inputhasended = true ;
else if ( limit == changelimit )
if ( buffer [0 ]== changebuffer [0 ])
if ( changelimit > 0 )
checkchange () ;
}
if ( changing )
goto lab20 ;
}
loc = 0 ;
buffer [limit ]= 32 ;
}
eightbits
#ifdef HAVE_PROTOTYPES
zcontrolcode ( ASCIIcode c )
#else
zcontrolcode ( c )
ASCIIcode c ;
#endif
{
register eightbits Result; switch ( c )
{case 64 :
Result = 64 ;
break ;
case 39 :
Result = 12 ;
break ;
case 34 :
Result = 13 ;
break ;
case 36 :
Result = 125 ;
break ;
case 32 :
case 9 :
Result = 136 ;
break ;
case 42 :
{
fprintf( stdout , "%c%ld", '*' , (long)modulecount + 1 ) ;
fflush ( stdout ) ;
Result = 136 ;
}
break ;
case 68 :
case 100 :
Result = 133 ;
break ;
case 70 :
case 102 :
Result = 132 ;
break ;
case 123 :
Result = 9 ;
break ;
case 125 :
Result = 10 ;
break ;
case 80 :
case 112 :
Result = 134 ;
break ;
case 84 :
case 116 :
case 94 :
case 46 :
case 58 :
Result = 131 ;
break ;
case 38 :
Result = 127 ;
break ;
case 60 :
Result = 135 ;
break ;
case 61 :
Result = 2 ;
break ;
case 92 :
Result = 3 ;
break ;
default:
Result = 0 ;
break ;
}
return Result ;
}
eightbits
#ifdef HAVE_PROTOTYPES
skipahead ( void )
#else
skipahead ( )
#endif
{
/* 30 */ register eightbits Result; eightbits c ;
while ( true ) {
if ( loc > limit )
{
getline () ;
if ( inputhasended )
{
c = 136 ;
goto lab30 ;
}
}
buffer [limit + 1 ]= 64 ;
while ( buffer [loc ]!= 64 ) loc = loc + 1 ;
if ( loc <= limit )
{
loc = loc + 2 ;
c = controlcode ( buffer [loc - 1 ]) ;
if ( ( c != 0 ) || ( buffer [loc - 1 ]== 62 ) )
goto lab30 ;
}
}
lab30: Result = c ;
return Result ;
}
void
#ifdef HAVE_PROTOTYPES
skipcomment ( void )
#else
skipcomment ( )
#endif
{
/* 10 */ eightbits bal ;
ASCIIcode c ;
bal = 0 ;
while ( true ) {
if ( loc > limit )
{
getline () ;
if ( inputhasended )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Input ended in mid-comment" ) ;
error () ;
}
goto lab10 ;
}
}
c = buffer [loc ];
loc = loc + 1 ;
if ( c == 64 )
{
c = buffer [loc ];
if ( ( c != 32 ) && ( c != 9 ) && ( c != 42 ) && ( c != 122 ) && ( c !=
90 ) )
loc = loc + 1 ;
else {
{
putc ('\n', stdout );
Fputs( stdout , "! Section ended in mid-comment" ) ;
error () ;
}
loc = loc - 1 ;
goto lab10 ;
}
}
else if ( ( c == 92 ) && ( buffer [loc ]!= 64 ) )
loc = loc + 1 ;
else if ( c == 123 )
bal = bal + 1 ;
else if ( c == 125 )
{
if ( bal == 0 )
goto lab10 ;
bal = bal - 1 ;
}
}
lab10: ;
}
eightbits
#ifdef HAVE_PROTOTYPES
getnext ( void )
#else
getnext ( )
#endif
{
/* 20 30 31 */ register eightbits Result; eightbits c ;
eightbits d ;
integer j, k ;
lab20: if ( loc > limit )
{
getline () ;
if ( inputhasended )
{
c = 136 ;
goto lab31 ;
}
}
c = buffer [loc ];
loc = loc + 1 ;
if ( scanninghex )
if ( ( ( c >= 48 ) && ( c <= 57 ) ) || ( ( c >= 65 ) && ( c <= 70 ) ) )
goto lab31 ;
else scanninghex = false ;
switch ( c )
{case 65 :
case 66 :
case 67 :
case 68 :
case 69 :
case 70 :
case 71 :
case 72 :
case 73 :
case 74 :
case 75 :
case 76 :
case 77 :
case 78 :
case 79 :
case 80 :
case 81 :
case 82 :
case 83 :
case 84 :
case 85 :
case 86 :
case 87 :
case 88 :
case 89 :
case 90 :
case 97 :
case 98 :
case 99 :
case 100 :
case 101 :
case 102 :
case 103 :
case 104 :
case 105 :
case 106 :
case 107 :
case 108 :
case 109 :
case 110 :
case 111 :
case 112 :
case 113 :
case 114 :
case 115 :
case 116 :
case 117 :
case 118 :
case 119 :
case 120 :
case 121 :
case 122 :
{
if ( ( ( c == 101 ) || ( c == 69 ) ) && ( loc > 1 ) )
if ( ( buffer [loc - 2 ]<= 57 ) && ( buffer [loc - 2 ]>= 48 ) )
c = 0 ;
if ( c != 0 )
{
loc = loc - 1 ;
idfirst = loc ;
do {
loc = loc + 1 ;
d = buffer [loc ];
} while ( ! ( ( ( d < 48 ) || ( ( d > 57 ) && ( d < 65 ) ) || ( ( d >
90 ) && ( d < 97 ) ) || ( d > 122 ) ) && ( d != 95 ) ) ) ;
if ( loc > idfirst + 1 )
{
c = 130 ;
idloc = loc ;
}
}
else c = 69 ;
}
break ;
case 34 :
{
doublechars = 0 ;
idfirst = loc - 1 ;
do {
d = buffer [loc ];
loc = loc + 1 ;
if ( ( d == 34 ) || ( d == 64 ) )
if ( buffer [loc ]== d )
{
loc = loc + 1 ;
d = 0 ;
doublechars = doublechars + 1 ;
}
else {
if ( d == 64 )
{
putc ('\n', stdout );
Fputs( stdout , "! Double @ sign missing" ) ;
error () ;
}
}
else if ( loc > limit )
{
{
putc ('\n', stdout );
Fputs( stdout , "! String constant didn't end" ) ;
error () ;
}
d = 34 ;
}
} while ( ! ( d == 34 ) ) ;
idloc = loc - 1 ;
c = 130 ;
}
break ;
case 64 :
{
c = controlcode ( buffer [loc ]) ;
loc = loc + 1 ;
if ( c == 0 )
goto lab20 ;
else if ( c == 13 )
scanninghex = true ;
else if ( c == 135 )
{
k = 0 ;
while ( true ) {
if ( loc > limit )
{
getline () ;
if ( inputhasended )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Input ended in section name" ) ;
error () ;
}
goto lab30 ;
}
}
d = buffer [loc ];
if ( d == 64 )
{
d = buffer [loc + 1 ];
if ( d == 62 )
{
loc = loc + 2 ;
goto lab30 ;
}
if ( ( d == 32 ) || ( d == 9 ) || ( d == 42 ) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Section name didn't end" ) ;
error () ;
}
goto lab30 ;
}
k = k + 1 ;
modtext [k ]= 64 ;
loc = loc + 1 ;
}
loc = loc + 1 ;
if ( k < longestname - 1 )
k = k + 1 ;
if ( ( d == 32 ) || ( d == 9 ) )
{
d = 32 ;
if ( modtext [k - 1 ]== 32 )
k = k - 1 ;
}
modtext [k ]= d ;
}
lab30: if ( k >= longestname - 2 )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Section name too long: " ) ;
}
{register integer for_end; j = 1 ;for_end = 25 ; if ( j <=
for_end) do
putc ( xchr [modtext [j ]], stdout );
while ( j++ < for_end ) ;}
Fputs( stdout , "..." ) ;
if ( history == 0 )
history = 1 ;
}
if ( ( modtext [k ]== 32 ) && ( k > 0 ) )
k = k - 1 ;
if ( k > 3 )
{
if ( ( modtext [k ]== 46 ) && ( modtext [k - 1 ]== 46 ) && (
modtext [k - 2 ]== 46 ) )
curmodule = prefixlookup ( k - 3 ) ;
else curmodule = modlookup ( k ) ;
}
else curmodule = modlookup ( k ) ;
}
else if ( c == 131 )
{
do {
c = skipahead () ;
} while ( ! ( c != 64 ) ) ;
if ( buffer [loc - 1 ]!= 62 )
{
putc ('\n', stdout );
Fputs( stdout , "! Improper @ within control text" ) ;
error () ;
}
goto lab20 ;
}
}
break ;
case 46 :
if ( buffer [loc ]== 46 )
{
if ( loc <= limit )
{
c = 32 ;
loc = loc + 1 ;
}
}
else if ( buffer [loc ]== 41 )
{
if ( loc <= limit )
{
c = 93 ;
loc = loc + 1 ;
}
}
break ;
case 58 :
if ( buffer [loc ]== 61 )
{
if ( loc <= limit )
{
c = 24 ;
loc = loc + 1 ;
}
}
break ;
case 61 :
if ( buffer [loc ]== 61 )
{
if ( loc <= limit )
{
c = 30 ;
loc = loc + 1 ;
}
}
break ;
case 62 :
if ( buffer [loc ]== 61 )
{
if ( loc <= limit )
{
c = 29 ;
loc = loc + 1 ;
}
}
break ;
case 60 :
if ( buffer [loc ]== 61 )
{
if ( loc <= limit )
{
c = 28 ;
loc = loc + 1 ;
}
}
else if ( buffer [loc ]== 62 )
{
if ( loc <= limit )
{
c = 26 ;
loc = loc + 1 ;
}
}
break ;
case 40 :
if ( buffer [loc ]== 42 )
{
if ( loc <= limit )
{
c = 9 ;
loc = loc + 1 ;
}
}
else if ( buffer [loc ]== 46 )
{
if ( loc <= limit )
{
c = 91 ;
loc = loc + 1 ;
}
}
break ;
case 42 :
if ( buffer [loc ]== 41 )
{
if ( loc <= limit )
{
c = 10 ;
loc = loc + 1 ;
}
}
break ;
case 32 :
case 9 :
goto lab20 ;
break ;
case 123 :
{
skipcomment () ;
goto lab20 ;
}
break ;
case 125 :
{
{
putc ('\n', stdout );
Fputs( stdout , "! Extra }" ) ;
error () ;
}
goto lab20 ;
}
break ;
default:
if ( c >= 128 )
goto lab20 ;
else ;
break ;
}
lab31: Result = c ;
return Result ;
}
void
#ifdef HAVE_PROTOTYPES
zscannumeric ( namepointer p )
#else
zscannumeric ( p )
namepointer p ;
#endif
{
/* 21 30 */ integer accumulator ;
schar nextsign ;
namepointer q ;
integer val ;
accumulator = 0 ;
nextsign = 1 ;
while ( true ) {
nextcontrol = getnext () ;
lab21: switch ( nextcontrol )
{case 48 :
case 49 :
case 50 :
case 51 :
case 52 :
case 53 :
case 54 :
case 55 :
case 56 :
case 57 :
{
val = 0 ;
do {
val = 10 * val + nextcontrol - 48 ;
nextcontrol = getnext () ;
} while ( ! ( ( nextcontrol > 57 ) || ( nextcontrol < 48 ) ) ) ;
{
accumulator = accumulator + nextsign * toint ( val ) ;
nextsign = 1 ;
}
goto lab21 ;
}
break ;
case 12 :
{
val = 0 ;
nextcontrol = 48 ;
do {
val = 8 * val + nextcontrol - 48 ;
nextcontrol = getnext () ;
} while ( ! ( ( nextcontrol > 55 ) || ( nextcontrol < 48 ) ) ) ;
{
accumulator = accumulator + nextsign * toint ( val ) ;
nextsign = 1 ;
}
goto lab21 ;
}
break ;
case 13 :
{
val = 0 ;
nextcontrol = 48 ;
do {
if ( nextcontrol >= 65 )
nextcontrol = nextcontrol - 7 ;
val = 16 * val + nextcontrol - 48 ;
nextcontrol = getnext () ;
} while ( ! ( ( nextcontrol > 70 ) || ( nextcontrol < 48 ) || ( (
nextcontrol > 57 ) && ( nextcontrol < 65 ) ) ) ) ;
{
accumulator = accumulator + nextsign * toint ( val ) ;
nextsign = 1 ;
}
goto lab21 ;
}
break ;
case 130 :
{
q = idlookup ( 0 ) ;
if ( ilk [q ]!= 1 )
{
nextcontrol = 42 ;
goto lab21 ;
}
{
accumulator = accumulator + nextsign * toint ( equiv [q ]- 32768L
) ;
nextsign = 1 ;
}
}
break ;
case 43 :
;
break ;
case 45 :
nextsign = - (integer) nextsign ;
break ;
case 132 :
case 133 :
case 135 :
case 134 :
case 136 :
goto lab30 ;
break ;
case 59 :
{
putc ('\n', stdout );
Fputs( stdout , "! Omit semicolon in numeric definition" ) ;
error () ;
}
break ;
default:
{
{
putc ('\n', stdout );
Fputs( stdout , "! Improper numeric definition will be flushed" ) ;
error () ;
}
do {
nextcontrol = skipahead () ;
} while ( ! ( ( nextcontrol >= 132 ) ) ) ;
if ( nextcontrol == 135 )
{
loc = loc - 2 ;
nextcontrol = getnext () ;
}
accumulator = 0 ;
goto lab30 ;
}
break ;
}
}
lab30: ;
if ( abs ( accumulator ) >= 32768L )
{
{
putc ('\n', stdout );
fprintf( stdout , "%s%ld", "! Value too big: " , (long)accumulator ) ;
error () ;
}
accumulator = 0 ;
}
equiv [p ]= accumulator + 32768L ;
}
void
#ifdef HAVE_PROTOTYPES
zscanrepl ( eightbits t )
#else
zscanrepl ( t )
eightbits t ;
#endif
{
/* 22 30 31 21 */ sixteenbits a ;
ASCIIcode b ;
eightbits bal ;
bal = 0 ;
while ( true ) {
lab22: a = getnext () ;
switch ( a )
{case 40 :
bal = bal + 1 ;
break ;
case 41 :
if ( bal == 0 )
{
putc ('\n', stdout );
Fputs( stdout , "! Extra )" ) ;
error () ;
}
else bal = bal - 1 ;
break ;
case 39 :
{
b = 39 ;
while ( true ) {
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" )
;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= b ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
if ( b == 64 )
if ( buffer [loc ]== 64 )
loc = loc + 1 ;
else {
putc ('\n', stdout );
Fputs( stdout , "! You should double @ signs in strings" ) ;
error () ;
}
if ( loc == limit )
{
{
putc ('\n', stdout );
Fputs( stdout , "! String didn't end" ) ;
error () ;
}
buffer [loc ]= 39 ;
buffer [loc + 1 ]= 0 ;
}
b = buffer [loc ];
loc = loc + 1 ;
if ( b == 39 )
{
if ( buffer [loc ]!= 39 )
goto lab31 ;
else {
loc = loc + 1 ;
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= 39 ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
}
}
}
lab31: ;
}
break ;
case 35 :
if ( t == 3 )
a = 0 ;
break ;
case 130 :
{
a = idlookup ( 0 ) ;
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= ( a / 256 ) + 128 ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
a = a % 256 ;
}
break ;
case 135 :
if ( t != 135 )
goto lab30 ;
else {
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= ( curmodule / 256 ) + 168 ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
a = curmodule % 256 ;
}
break ;
case 2 :
{
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= 2 ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
buffer [limit + 1 ]= 64 ;
lab21: if ( buffer [loc ]== 64 )
{
if ( loc < limit )
if ( buffer [loc + 1 ]== 64 )
{
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= 64 ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
loc = loc + 2 ;
goto lab21 ;
}
}
else {
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" )
;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= buffer [loc ];
tokptr [z ]= tokptr [z ]+ 1 ;
}
loc = loc + 1 ;
goto lab21 ;
}
if ( loc >= limit )
{
putc ('\n', stdout );
Fputs( stdout , "! Verbatim string didn't end" ) ;
error () ;
}
else if ( buffer [loc + 1 ]!= 62 )
{
putc ('\n', stdout );
Fputs( stdout , "! You should double @ signs in verbatim strings" )
;
error () ;
}
loc = loc + 2 ;
}
break ;
case 133 :
case 132 :
case 134 :
if ( t != 135 )
goto lab30 ;
else {
{
putc ('\n', stdout );
fprintf( stdout , "%s%c%s", "! @" , xchr [buffer [loc - 1 ]], " is ignored in Pascal text" ) ;
error () ;
}
goto lab22 ;
}
break ;
case 136 :
goto lab30 ;
break ;
default:
;
break ;
}
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= a ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
}
lab30: nextcontrol = a ;
if ( bal > 0 )
{
if ( bal == 1 )
{
putc ('\n', stdout );
Fputs( stdout , "! Missing )" ) ;
error () ;
}
else {
putc ('\n', stdout );
fprintf( stdout , "%s%ld%s", "! Missing " , (long)bal , " )'s" ) ;
error () ;
}
while ( bal > 0 ) {
{
if ( tokptr [z ]== maxtoks )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "token" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
tokmem [z ][ tokptr [z ]]= 41 ;
tokptr [z ]= tokptr [z ]+ 1 ;
}
bal = bal - 1 ;
}
}
if ( textptr > maxtexts - 4 )
{
putc ('\n', stdout );
fprintf( stderr , "%s%s%s", "! Sorry, " , "text" , " capacity exceeded" ) ;
error () ;
history = 3 ;
uexit ( 1 ) ;
}
currepltext = textptr ;
tokstart [textptr + 4 ]= tokptr [z ];
textptr = textptr + 1 ;
if ( z == 3 )
z = 0 ;
else z = z + 1 ;
}
void
#ifdef HAVE_PROTOTYPES
zdefinemacro ( eightbits t )
#else
zdefinemacro ( t )
eightbits t ;
#endif
{
namepointer p ;
p = idlookup ( t ) ;
scanrepl ( t ) ;
equiv [p ]= currepltext ;
textlink [currepltext ]= 0 ;
}
void
#ifdef HAVE_PROTOTYPES
scanmodule ( void )
#else
scanmodule ( )
#endif
{
/* 22 30 10 */ namepointer p ;
modulecount = modulecount + 1 ;
nextcontrol = 0 ;
while ( true ) {
lab22: while ( nextcontrol <= 132 ) {
nextcontrol = skipahead () ;
if ( nextcontrol == 135 )
{
loc = loc - 2 ;
nextcontrol = getnext () ;
}
}
if ( nextcontrol != 133 )
goto lab30 ;
nextcontrol = getnext () ;
if ( nextcontrol != 130 )
{
{
putc ('\n', stdout );
fprintf( stdout , "%s%s", "! Definition flushed, must start with " , "identifier of length > 1" ) ;
error () ;
}
goto lab22 ;
}
nextcontrol = getnext () ;
if ( nextcontrol == 61 )
{
scannumeric ( idlookup ( 1 ) ) ;
goto lab22 ;
}
else if ( nextcontrol == 30 )
{
definemacro ( 2 ) ;
goto lab22 ;
}
else if ( nextcontrol == 40 )
{
nextcontrol = getnext () ;
if ( nextcontrol == 35 )
{
nextcontrol = getnext () ;
if ( nextcontrol == 41 )
{
nextcontrol = getnext () ;
if ( nextcontrol == 61 )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Use == for macros" ) ;
error () ;
}
nextcontrol = 30 ;
}
if ( nextcontrol == 30 )
{
definemacro ( 3 ) ;
goto lab22 ;
}
}
}
}
{
putc ('\n', stdout );
Fputs( stdout , "! Definition flushed since it starts badly" ) ;
error () ;
}
}
lab30: ;
switch ( nextcontrol )
{case 134 :
p = 0 ;
break ;
case 135 :
{
p = curmodule ;
do {
nextcontrol = getnext () ;
} while ( ! ( nextcontrol != 43 ) ) ;
if ( ( nextcontrol != 61 ) && ( nextcontrol != 30 ) )
{
{
putc ('\n', stdout );
Fputs( stdout , "! Pascal text flushed, = sign is missing" ) ;
error () ;
}
do {
nextcontrol = skipahead () ;
} while ( ! ( nextcontrol == 136 ) ) ;
goto lab10 ;
}
}
break ;
default:
goto lab10 ;
break ;
}
storetwobytes ( 53248L + modulecount ) ;
scanrepl ( 135 ) ;
if ( p == 0 )
{
textlink [lastunnamed ]= currepltext ;
lastunnamed = currepltext ;
}
else if ( equiv [p ]== 0 )
equiv [p ]= currepltext ;
else {
p = equiv [p ];
while ( textlink [p ]< maxtexts ) p = textlink [p ];
textlink [p ]= currepltext ;
}
textlink [currepltext ]= maxtexts ;
lab10: ;
}
void mainbody() {
initialize () ;
openinput () ;
line = 0 ;
otherline = 0 ;
changing = true ;
primethechangebuffer () ;
changing = ! changing ;
templine = otherline ;
otherline = line ;
line = templine ;
limit = 0 ;
loc = 1 ;
buffer [0 ]= 32 ;
inputhasended = false ;
Fputs( stdout , "This is TANGLE, Version 4.3" ) ;
fprintf( stdout , "%s\n", versionstring ) ;
phaseone = true ;
modulecount = 0 ;
do {
nextcontrol = skipahead () ;
} while ( ! ( nextcontrol == 136 ) ) ;
while ( ! inputhasended ) scanmodule () ;
if ( changelimit != 0 )
{
{register integer for_end; ii = 0 ;for_end = changelimit ; if ( ii <=
for_end) do
buffer [ii ]= changebuffer [ii ];
while ( ii++ < for_end ) ;}
limit = changelimit ;
changing = true ;
line = otherline ;
loc = changelimit ;
{
putc ('\n', stdout );
Fputs( stdout , "! Change file entry did not match" ) ;
error () ;
}
}
phaseone = false ;
if ( textlink [0 ]== 0 )
{
{
putc ('\n', stdout );
Fputs( stdout , "! No output was specified." ) ;
}
if ( history == 0 )
history = 1 ;
}
else {
{
putc ('\n', stdout );
Fputs( stdout , "Writing the output file" ) ;
}
fflush ( stdout ) ;
stackptr = 1 ;
bracelevel = 0 ;
curstate .namefield = 0 ;
curstate .replfield = textlink [0 ];
zo = curstate .replfield % 4 ;
curstate .bytefield = tokstart [curstate .replfield ];
curstate .endfield = tokstart [curstate .replfield + 4 ];
curstate .modfield = 0 ;
outstate = 0 ;
outptr = 0 ;
breakptr = 0 ;
semiptr = 0 ;
outbuf [0 ]= 0 ;
line = 1 ;
sendtheoutput () ;
breakptr = outptr ;
semiptr = 0 ;
flushbuffer () ;
if ( bracelevel != 0 )
{
putc ('\n', stdout );
fprintf( stdout , "%s%ld", "! Program ended at brace level " , (long)bracelevel ) ;
error () ;
}
{
putc ('\n', stdout );
Fputs( stdout , "Done." ) ;
}
}
lab9999: if ( stringptr > 256 )
{
{
putc ('\n', stdout );
fprintf( stdout , "%ld%s", (long)stringptr - 256 , " strings written to string pool file." ) ;
}
putc ( '*' , pool );
{register integer for_end; ii = 1 ;for_end = 9 ; if ( ii <= for_end) do
{
outbuf [ii ]= poolchecksum % 10 ;
poolchecksum = poolchecksum / 10 ;
}
while ( ii++ < for_end ) ;}
{register integer for_end; ii = 9 ;for_end = 1 ; if ( ii >= for_end) do
putc ( xchr [48 + outbuf [ii ]], pool );
while ( ii-- > for_end ) ;}
putc ('\n', pool );
}
switch ( history )
{case 0 :
{
putc ('\n', stdout );
Fputs( stdout , "(No errors were found.)" ) ;
}
break ;
case 1 :
{
putc ('\n', stdout );
Fputs( stdout , "(Did you see the warning message above?)" ) ;
}
break ;
case 2 :
{
putc ('\n', stdout );
Fputs( stdout , "(Pardon me, but I think I spotted something wrong.)" )
;
}
break ;
case 3 :
{
putc ('\n', stdout );
Fputs( stdout , "(That was a fatal error, my friend.)" ) ;
}
break ;
}
putc ('\n', stdout );
if ( ( history != 0 ) && ( history != 1 ) )
uexit ( 1 ) ;
else uexit ( 0 ) ;
}
|