#include <perms.h> int _imp_mainep(int _imp_argc, char **_imp_argv) { const _imp_string Version = _imp_str_literal("8.4"); const int Minusone = -1; const int Maxint = ((Minusone) >> 1) / 10; const int Maxdig = ((Minusone) >> 1) - Maxint * 10; const int Bytesize = 8; const int Maxtag = 800; const int Maxdict = 6000; const int Namebits = 11; const int Maxnames = (1 << Namebits) - 1; static int Sparenames = Maxnames; const int Litmax = 50; const int Recsize = 520; const int Dimlimit = 6; const int Ff = 12; const int Marker = '^'; const int Squote = '"'; const int Cquote = '\''; const int Report = 0; const int Source = 1; const int Object = 1; const int Listing = 2; const int Integer = 1; const int Real = 2; const int Stringv = 3; const int Record = 4; const int Iform = (Integer << 4) + 1; const int Var = 91; const int Const = 93; const int Swit = 105; const int Comment = 22; const int Termin = 20; const int Lab = 3; const int Jump = 54; const int Recfm = 4; const int Proc = 7; const int Escdec = 252; const int Escproc = 253; const int Escarray = 254; const int Escrec = 255; typedef struct Arfm { int Class; int Sub; int Link; int Ptype; int Papp; int Pformat; int X; int Pos; } Arfm; typedef struct Tagfm { int App; int Format; int Flags; int Index; int Text; int Link; } Tagfm; const int Usedbit = 0b1000000000000000; const int Closed = 0b0100000000000000; const int Constbit = 0b0010000000000000; const int Parameters = 0b0001000000000000; const int Subname = 0b0000100000000000; const int Aname = 0b0000010000000000; const int Ownbit = 0b0000001000000000; const int Prot = 0b0000000100000000; const int Spec = 0b0000000010000000; const int Transbit = 0x4000; const int Error = 0x8000; Arfm Ar[520 /*1:520*/]; static int Class = 0; static int X = 0; static int Atom1 = 0; static int Atom2 = 0; static int Subatom = 0; static int Type = 0; static int App = 0; static int Format = 0; int Hashvalue; static int Faulty = 0; static int Faultrate = 0; static int Lines = 0; static int Textline = 0; static int Margin = 0; static int Errormargin = 0; static int Errorsym = 0; static int Column = 0; static int Stats = 0; static int Monpos = 0; static int Sym = Nl; static int Symtype = 0; static int Quote = 0; static int Endmark = 0; static int Cont = ' '; static int Csym = ' '; static int Decl = 0; static int Dim = 0; static int Specgiven = 0; static int Escapeclass = 0; static int Protection = 0; static int Atomflags = 0; static int Otype = 0; static int Realsln = 1; static int Last1 = 0; static int Gentype = 0; static int Ptype = 0; static int Papp = 0; static int Pformat = 0; static int Force = 0; static int G = 0; static int Gg = 0; static int Mapgg = 0; static int Fdef = 0; static int This = -1; static int Nmin = 0; static int Nmax = 0; static int Rbase = 0; static int Dmax = 1; static int Tmin = Maxtag; static int Ss = 0; _imp_string Includefile; static int Includelist = 0; static int Includelevel = 0; static int Include = 0; static int Perm = 1; static int Progmode = 0; static int Sstype = 0; static int Specmode = 0; static int Ocount = -1; static int Limit = 0; static int Copy = 0; static int Order = 0; static int Forwarn = 0; static int Dubious = 0; static int Dp = 1; static int Pos1 = 0; static int Pos2 = 0; static int Pos = 0; static int Dimension = 0; static int Local = 0; static int Fmbase = 0; static int Searchbase = 0; static int Formatlist = 0; int Recid; static unsigned char Char[134 /*0:133*/] = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; int Litpool[51 /*0:50*/]; static int Lit = 0; static int Lp = 0; static int Blockx = 0; static int List = 1; static int Control = 0; static int Diag = 0; int Hash[2048 /*0:2047*/]; Tagfm Tag[801 /*0:800*/]; int Dict[6000 /*1:6000*/]; unsigned char Buff[512 /*1:512*/]; static int Bp = 0; const int Maxgrammar = 1720; static int Gmin = Maxgrammar; const int Manifest = 120; const int Figurative = 130; const int Actions = 180; const int Phrasal = 200; const unsigned char Amap[16 /*0:15*/] = { 89, 91, 92, 104, 94, 93, 105, 100, 101, 102, 103, 106, 107, 108, 109, 89}; const unsigned char Atoms[16 /*0:15*/] = {89, 1, 1, 10, 9, 1, 10, 7, 7, 7, 7, 4, 1, 4, 1, 89}; const _imp_string Text[256 /*0:255*/] = { _imp_str_literal("Z"), _imp_str_literal("VDEC"), _imp_str_literal("OWNVDEC"), _imp_str_literal("EXTVSPEC"), _imp_str_literal("ADEC"), _imp_str_literal("OWNADEC"), _imp_str_literal("EXTASPEC"), _imp_str_literal("PROC"), _imp_str_literal("PROCSPEC"), _imp_str_literal("FORMDEC"), _imp_str_literal("SWDEC"), _imp_str_literal("LDEC"), _imp_str_literal("FORMSPEC"), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal("OPTION"), _imp_str_literal("COMMA"), _imp_str_literal("T"), _imp_str_literal("COLON"), _imp_str_literal("COMMENT"), _imp_str_literal("LB"), _imp_str_literal("ALIAS"), _imp_str_literal("RB"), _imp_str_literal("SUB"), _imp_str_literal("ARRAYD"), _imp_str_literal("STYPE"), _imp_str_literal("ARRAY"), _imp_str_literal("NAME"), _imp_str_literal("PROCD"), _imp_str_literal("FNMAP"), _imp_str_literal("SWITCH"), _imp_str_literal("OWN"), _imp_str_literal("EXTERNAL"), _imp_str_literal("STRING"), _imp_str_literal("RECORD"), _imp_str_literal("FORMAT"), _imp_str_literal("SPEC"), _imp_str_literal("MCODE"), _imp_str_literal("LABEL"), _imp_str_literal("OP1"), _imp_str_literal("OP2"), _imp_str_literal("OP3"), _imp_str_literal("SIGN"), _imp_str_literal("UOP"), _imp_str_literal("MOD"), _imp_str_literal("DOT"), _imp_str_literal("COMP"), _imp_str_literal("ACOMP"), _imp_str_literal("EQ"), _imp_str_literal("EQEQ"), _imp_str_literal("JAM"), _imp_str_literal("JUMP"), _imp_str_literal("RESOP"), _imp_str_literal("AND"), _imp_str_literal("OR"), _imp_str_literal("NOT"), _imp_str_literal("WHILE"), _imp_str_literal("UNTIL"), _imp_str_literal("FOR"), _imp_str_literal("CWORD"), _imp_str_literal("EXIT"), _imp_str_literal("ON"), _imp_str_literal("SIGNAL"), _imp_str_literal("THEN"), _imp_str_literal("START"), _imp_str_literal("ELSE"), _imp_str_literal("FINISH"), _imp_str_literal("FELSE"), _imp_str_literal("CYCLE"), _imp_str_literal("REPEAT"), _imp_str_literal("PROGRAM"), _imp_str_literal("BEGIN"), _imp_str_literal("END"), _imp_str_literal("ENDPROG"), _imp_str_literal("ENDPERM"), _imp_str_literal("FRESULT"), _imp_str_literal("MRESULT"), _imp_str_literal("BACK"), _imp_str_literal("MONITOR"), _imp_str_literal("STOP"), _imp_str_literal("LIST"), _imp_str_literal("REALSLN"), _imp_str_literal("CONTROL"), _imp_str_literal("INCLUDE"), _imp_str_literal("MASS"), _imp_str_literal("RTYPE"), _imp_str_literal("ADDOP"), _imp_str_literal("IDENT"), _imp_str_literal("V"), _imp_str_literal("N"), _imp_str_literal("CONST"), _imp_str_literal("FM"), _imp_str_literal(""), _imp_str_literal("R"), _imp_str_literal("F"), _imp_str_literal("M"), _imp_str_literal("P"), _imp_str_literal("RP"), _imp_str_literal("FP"), _imp_str_literal("MP"), _imp_str_literal("PP"), _imp_str_literal("L"), _imp_str_literal("S"), _imp_str_literal("A"), _imp_str_literal("AN"), _imp_str_literal("NA"), _imp_str_literal("NAN"), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal("%MSTART"), _imp_str_literal("%CLEAR"), _imp_str_literal("%PRED"), _imp_str_literal(""), _imp_str_literal("%DUBIOUS"), _imp_str_literal("%DUP"), _imp_str_literal("%PIN"), _imp_str_literal("%POUT"), _imp_str_literal("%EDUP"), _imp_str_literal(""), _imp_str_literal("PIDENT"), _imp_str_literal("CIDENT"), _imp_str_literal("OIDENT"), _imp_str_literal("FNAME"), _imp_str_literal("SWID"), _imp_str_literal("DOTL"), _imp_str_literal("DOTR"), _imp_str_literal("ASEP"), _imp_str_literal("CSEP"), _imp_str_literal("OSEP"), _imp_str_literal("PSEP"), _imp_str_literal("ARB"), _imp_str_literal("BPLRB"), _imp_str_literal("ORB"), _imp_str_literal("PRB"), _imp_str_literal("CRB"), _imp_str_literal("RCRB"), _imp_str_literal("RECRB"), _imp_str_literal("RECLB"), _imp_str_literal("LAB"), _imp_str_literal("MLAB"), _imp_str_literal("SLAB"), _imp_str_literal("XNAME"), _imp_str_literal("OWNT"), _imp_str_literal("DBSEP"), _imp_str_literal("PCONST"), _imp_str_literal("CMOD"), _imp_str_literal("CSIGN"), _imp_str_literal("CUOP"), _imp_str_literal("COP1"), _imp_str_literal("COP2"), _imp_str_literal("COP3"), _imp_str_literal("INDEF"), _imp_str_literal("XELSE"), _imp_str_literal("CRESOP"), _imp_str_literal("NLAB"), _imp_str_literal("RUNTIL"), _imp_str_literal("ACONST"), _imp_str_literal("ORRB"), _imp_str_literal("FMANY"), _imp_str_literal("OSTRING"), _imp_str_literal("FMLB"), _imp_str_literal("FMRB"), _imp_str_literal("FMOR"), _imp_str_literal("RANGERB"), _imp_str_literal("FSID"), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal("%DUMMY"), _imp_str_literal("%DECL"), _imp_str_literal("%TYPE"), _imp_str_literal("%ZERO"), _imp_str_literal("%APPLY"), _imp_str_literal("%PROT"), _imp_str_literal("%SETPROT"), _imp_str_literal("%PTYPE"), _imp_str_literal("%GAPP"), _imp_str_literal("%LOCAL"), _imp_str_literal("%GUARD"), _imp_str_literal("%MCODE"), _imp_str_literal("%CDUMMY"), _imp_str_literal("%SETTYPE"), _imp_str_literal("%OPER"), _imp_str_literal("%PARAM"), _imp_str_literal("%BLOCK"), _imp_str_literal("%OTHER"), _imp_str_literal("%COMPILE"), _imp_str_literal("APP"), _imp_str_literal("BASEAPP"), _imp_str_literal("APP2"), _imp_str_literal("APP3"), _imp_str_literal("APP4"), _imp_str_literal("APP5"), _imp_str_literal("APP6"), _imp_str_literal("ADEFN"), _imp_str_literal("NPARM"), _imp_str_literal("SWDEF"), _imp_str_literal("SWIDS"), _imp_str_literal("CIEXP"), _imp_str_literal("RCONST"), _imp_str_literal("SCONST"), _imp_str_literal("ARRAYP"), _imp_str_literal("XIMP"), _imp_str_literal("IMP"), _imp_str_literal("COND"), _imp_str_literal("SCOND"), _imp_str_literal("EXP1"), _imp_str_literal("EXP2"), _imp_str_literal("SEXP"), _imp_str_literal("IEXP"), _imp_str_literal("IEXP1"), _imp_str_literal("IEXP2"), _imp_str_literal("ISEXP"), _imp_str_literal("SEQ"), _imp_str_literal("FDEF"), _imp_str_literal("EXP"), _imp_str_literal("NARRAYP"), _imp_str_literal("STRUCT"), _imp_str_literal("RESEXP"), _imp_str_literal("BPL"), _imp_str_literal("CONSTB"), _imp_str_literal("FITEM"), _imp_str_literal("MOREA"), _imp_str_literal("CLIST"), _imp_str_literal("FPP"), _imp_str_literal("FPP0"), _imp_str_literal("FPP1"), _imp_str_literal("FPP2"), _imp_str_literal("INITVAR"), _imp_str_literal("RECEXP"), _imp_str_literal("EIMP"), _imp_str_literal("IDENTS"), _imp_str_literal("RANGE"), _imp_str_literal("RCONSTB"), _imp_str_literal("VARP"), _imp_str_literal("INITDEC"), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal(""), _imp_str_literal("ESCDEC"), _imp_str_literal("ESCPROC"), _imp_str_literal("ESCARRAY"), _imp_str_literal("ESCREC")}; const int Gmax1 = 719; static int Gmax = 719; const int Impphrase = 25; const short Initial[120 /*0:119*/] = { 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32551, 0, 0, 0, 0, 13, 0, 14, 4, -32557, 16, -32550, 0, 0, 5, 6, 3, 12, 15, 8, 7, 9, 10, 11, -32558, -32554, -32559, -32552, -32553, 18, 22, 17, 21, 19, 0, 0, 0, -32562, -32560, 0, 0, 0, -32561, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, -32556, 0, -32555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const unsigned char Atomic[50 /*130:179*/] = { 90, 90, 90, 90, 90, 48, 48, 19, 19, 19, 19, 25, 25, 25, 25, 25, 25, 25, 23, 104, 104, 105, 30, 20, 21, 93, 47, 45, 46, 42, 43, 44, 40, 68, 55, 104, 60, 93, 25, 40, 93, 23, 25, 57, 25, 90, 176, 177, 178, 179}; static short Phrase[56 /*200:255*/] = { 0, 564, 565, 567, 569, 571, 573, 562, 614, 203, 200, 602, 478, 480, 624, 298, 206, 308, 318, 433, 426, 437, 444, 458, 453, 461, 467, 482, 402, 627, 629, 603, 521, 511, 486, 502, 575, 527, 528, 543, 550, 578, 397, 287, 197, 636, 516, 621, 167, 0, 0, 0, 640, 693, 701, 709}; static short Gram[1721 /*0:1720*/] = { 0, -28523, -28521, -28602, -32706, -28509, -28603, -24502, -24503, -20405, -20404, -28595, -32697, -32709, -16323, -28600, -32704, -28587, -28589, -32681, -16344, -28586, -28588, -12270, -32586, 216, -12287, -16380, -8185, -8184, -12285, -12286, -12283, -12282, -12279, -12276, -16373, 20490, -32706, -32701, 216, -16364, -28610, -28613, -28612, 16445, 217, -16364, 62, -32701, 16450, -16364, 5346, -16364, 166, -16344, 4332, 130, -16360, -16361, 126, 217, -32701, 216, -16364, 16450, -32700, 16404, -32701, -32706, 216, 16405, 16407, -16222, 8414, 130, 217, -32697, 16450, 1250, 4307, 4318, 192, 93, 170, 90, 207, -16365, 16404, 90, -16360, -16365, 16404, 241, -16365, 16404, 132, 132, -16360, 4329, -16365, 16404, 133, 175, 90, -16365, 16404, 209, -16365, 16404, 4313, 217, 16451, 4263, 16384, 16384, 120, 216, -32700, 16404, -32706, 16404, 243, 16409, 454, -32685, 16404, 454, 248, -16365, 16404, 4263, 194, -16360, 4329, -32717, 16404, 4263, 16407, 454, 237, 127, 215, 454, 4263, 16384, -16364, 1502, -32629, -16361, 153, -32606, 222, 143, -32629, 153, 454, 126, 16409, 454, 16384, 234, -16365, -32595, 147, -32678, 234, 193, -32677, -32676, -32661, 109, -32717, 53, 52, 52, 52, 194, 194, 194, -28581, 4188, 194, -28566, 4203, 194, -28564, 4205, 4580, 16429, 183, 183, 186, 186, -28583, 0, 9437, 90, -16365, 0, 134, -16365, 0, 210, 4329, 199, -32677, -32672, -32676, -32688, -32690, -32705, -32661, -32659, -32689, -32686, -32687, -16330, 65, -32716, 186, -28583, -32717, -32715, -32713, 52, -32664, 4201, 186, -32717, -32715, 55, -16328, 0, 197, 197, 52, 52, 197, -28581, -28580, 186, -28581, 4188, 4318, 194, -28581, 4188, 9437, 194, 194, 454, 16407, 216, 194, -28566, -28565, 186, -28566, 4203, 194, -28564, -28563, 186, -28564, 4205, 183, 183, 186, 183, -16365, 0, 183, 4580, 16429, 5095, 9444, 5348, 186, -28583, -16328, 0, 16409, -16365, 0, 9437, 5348, 217, -32701, 16450, -32701, 216, -32700, 0, -32701, -32706, 216, 243, 217, -16318, 0, -32552, 0, -32700, 0, -32706, 0, 215, -32550, 228, -28616, -28615, 0, 4096, 218, 218, -28616, 0, -32677, -32676, -16361, -32710, -32669, -32662, -32661, -32660, -32659, 740, -32039, 740, -32719, 4096, 194, -32719, -32718, -32604, -32726, -32725, -32724, -32720, 4096, 710, 6116, -32719, 0, 710, 6116, -28581, 4188, 218, 122, 50, 16409, -32726, -32725, -32724, -32719, 4096, 710, 454, 195, 195, 195, 454, -28581, 4188, 194, -28566, -28565, -28564, 4205, 195, 195, 195, 710, 4836, 5095, 4829, -32726, -32725, -32724, -32719, 4096, 4827, 4828, 454, -32720, -32719, 4096, 4829, 4827, 4828, 194, -32719, 0, 710, 4836, -16291, -32677, 92, 184, 121, -28581, -28580, -32722, -32723, 4317, -32726, -32725, -32724, 0, 183, -32726, -32725, -32724, -32720, 0, 4316, 195, 195, 195, 454, -28581, 4188, 4315, 183, 4317, -32726, -32725, 0, 195, 195, 4315, 4317, -32726, 0, 195, -32677, -32676, -16361, 16431, 228, 228, 47, -32610, -32611, 5345, -32609, -32608, -32607, 0, 4320, 4319, 5345, -32609, -32608, 0, 4319, 5345, -32609, 0, -32613, -16361, 16431, 222, 222, 156, -32677, 92, 183, 186, 1222, 16435, 228, 16403, 4324, 138, 8420, -32723, 4189, 93, 454, 148, -32674, 16546, 16409, -32597, 182, -16383, 16388, 234, -16365, -32595, 172, -32678, 234, 90, 244, 246, -16365, 0, 235, -32678, 234, -16365, 246, -16365, 0, -32678, 234, 90, 16407, 222, 16405, 222, 145, 16407, 222, 16405, 222, 146, 16407, 1252, 154, 5348, -16365, 142, 126, 182, -16383, 16391, 90, -16365, 127, -32678, 238, 90, 125, 239, -16365, 8319, 8430, 128, 126, -16361, 127, 190, 240, 189, 16409, 182, -16383, 16391, 90, -16365, 0, -32678, 240, 90, 16623, -16365, 0, 244, 232, 1252, 1252, 137, 1252, 137, 1252, 137, 1252, 137, 1252, 137, 222, -16365, 0, 131, 194, -16360, -16333, -16332, 124, 181, -16292, -16277, 16493, -31802, 5342, -28581, 4188, 4263, 181, 186, 454, 16475, 183, -28583, 199, 5598, 9438, 222, -32677, -32676, 16407, 186, 228, 135, 16409, -32632, 0, -32677, 92, -32677, -32676, -32662, -32661, -32660, -32659, 165, -32677, 92, 188, -32662, 107, 188, -32660, 109, -32732, 37, -16344, 4318, 148, -32674, 16424, 222, 16405, 222, 174, -28644, -32734, -32680, -28641, -32733, -32730, -32735, -32727, -32738, 4326, -32738, -32739, -32741, -32736, 199, -28644, -32680, -28641, 4326, -32739, -32741, 199, -32738, -32739, -32741, -32736, -32729, 199, -32616, 199, -32739, -32741, -32729, 199, -32616, -32729, 199, -28644, -32680, 4326, -32738, -32739, -32741, 199, 245, 4318, 245, 16409, 152, 4318, 16409, 152, 245, -32672, -32671, -32670, 99, 16407, 200, 144, 185, -32677, 92, 16407, -32582, 200, 200, 187, 141, -32677, 92, 16410, 191, -32677, -32676, -32662, -32661, -32660, 109, 198, [720 ... 1720] = 0}; static short Glink[1721 /*0:1720*/] = { -1, 71, 72, 38, 46, 47, 67, 67, 75, 67, 0, 67, 51, 76, 79, 53, 55, 80, 67, 81, 82, 83, 67, 84, 26, 41, 85, 86, 57, 57, 89, 93, 96, 97, 102, 103, 104, 107, 46, 67, 67, 0, 110, 110, 111, 52, 49, 0, 61, 67, 62, 0, 67, 0, 111, 112, 112, 58, 113, 114, 115, 64, 67, 66, 116, 117, 68, 0, 67, 122, 67, 0, 73, 123, 123, 67, 77, 67, 40, 77, 67, 67, 0, 124, 127, 128, 87, 86, 0, 90, 131, 89, 0, 94, 93, 0, 132, 98, 137, 100, 97, 0, 138, 67, 105, 104, 0, 108, 107, 0, 67, 67, 67, 139, 140, 141, 0, 118, 120, 116, 142, 116, 67, 71, 125, 67, 0, 67, 129, 85, 0, 143, 133, 144, 135, 145, 0, 156, 157, 59, 158, 67, 119, 91, 159, 146, 145, 148, 146, 151, 0, 153, 153, 154, 146, 0, 99, 160, 67, 134, 161, 162, 165, 161, 141, 162, 162, 168, 172, 174, 175, 176, 177, 178, 179, 182, 185, 188, 189, 180, 190, 190, 183, 191, 191, 186, 191, 191, 0, 188, 192, 193, 194, 0, 196, 0, 0, 198, 197, 0, 201, 200, 0, 204, 205, 0, 228, 232, 219, 234, 235, 0, 236, 237, 238, 0, 232, 226, 244, 245, 221, 248, 249, 250, 251, 245, 0, 252, 229, 249, 250, 251, 253, 0, 0, 188, 254, 260, 239, 269, 269, 242, 191, 191, 270, 246, 272, 272, 229, 273, 274, 275, 276, 0, 255, 266, 266, 258, 267, 267, 261, 266, 266, 264, 267, 267, 232, 268, 232, 0, 277, 0, 278, 232, 273, 232, 282, 283, 279, 285, 253, 0, 0, 286, 0, 232, 0, 288, 0, 290, 0, 292, 294, 0, 0, 297, 0, 0, 299, 301, 0, 303, 0, 305, 0, 307, 0, 0, 310, 313, 314, 315, 0, 0, 316, 311, 314, 0, 332, 332, 328, 349, 350, 351, 351, 351, 351, 330, 282, 352, 358, 0, 333, 341, 347, 359, 360, 361, 362, 363, 0, 342, 343, 345, 0, 346, 0, 269, 269, 0, 0, 366, 353, 371, 372, 373, 374, 0, 375, 376, 377, 383, 384, 364, 385, 385, 367, 269, 269, 269, 269, 389, 390, 391, 392, 393, 0, 378, 360, 361, 362, 341, 0, 379, 380, 386, 363, 341, 0, 353, 354, 355, 375, 395, 0, 396, 0, 400, 269, 269, 401, 0, 411, 411, 406, 417, 407, 418, 419, 420, 0, 412, 418, 419, 420, 421, 0, 409, 406, 424, 417, 422, 425, 425, 408, 415, 427, 430, 431, 0, 426, 432, 428, 434, 436, 0, 433, 269, 269, 441, 442, 282, 443, 0, 446, 451, 447, 446, 452, 451, 0, 449, 448, 454, 453, 457, 0, 455, 459, 458, 0, 269, 464, 465, 282, 466, 0, 469, 469, 470, 471, 472, 473, 474, 475, 476, 477, 0, 479, 269, 481, 0, 483, 485, 485, 205, 490, 488, 496, 497, 491, 494, 490, 0, 491, 491, 0, 498, 499, 501, 0, 0, 504, 506, 510, 499, 508, 0, 506, 506, 504, 512, 513, 514, 515, 0, 517, 518, 519, 520, 0, 522, 523, 524, 525, 522, 0, 528, 529, 531, 536, 532, 534, 0, 532, 0, 537, 538, 539, 541, 542, 542, 0, 544, 546, 0, 547, 548, 549, 533, 551, 553, 558, 554, 556, 0, 554, 0, 559, 560, 557, 0, 563, 205, 0, 566, 564, 568, 565, 570, 567, 572, 569, 574, 571, 576, 575, 0, 579, 580, 592, 593, 584, 205, 585, 588, 588, 588, 590, 205, 594, 594, 595, 596, 597, 581, 600, 598, 601, 0, 205, 205, 205, 606, 606, 607, 608, 609, 605, 610, 612, 0, 193, 193, 193, 193, 193, 193, 193, 193, 0, 623, 623, 192, 626, 626, 0, 626, 626, 631, 633, 282, 282, 634, 282, 282, 637, 638, 639, 0, 650, 677, 684, 666, 655, 205, 205, 205, 205, 650, 659, 668, 685, 666, 0, 662, 686, 666, 662, 668, 685, 0, 670, 674, 689, 666, 205, 0, 205, 0, 674, 689, 205, 0, 666, 205, 0, 680, 692, 680, 659, 668, 685, 0, 650, 687, 662, 688, 205, 690, 691, 666, 680, 697, 697, 697, 697, 698, 699, 700, 0, 703, 703, 704, 706, 707, 708, 708, 700, 711, 711, 712, 713, 719, 719, 719, 719, 719, 719, 0, [720 ... 1720] = 0}; const short Maxkdict = 618; const short Kdict[587 /*32:618*/] = { 0, 511, 131, 531, 131, 551, 559, 131, 567, 575, 583, 603, 623, 631, 663, 671, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 691, 698, 707, 751, 795, 131, 131, 824, 900, 960, 1076, 1120, 1280, 128, 128, 1392, 128, 128, 1460, 1600, 1636, 1704, 1792, 128, 1872, 2088, 2284, 2316, 128, 2356, 128, 128, 128, 2375, 2383, 2415, 2423, 2443, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 2451, 131, 2459, -32351, 16428, 25, 16428, 29, -32349, 16433, 1, 16434, 1, -16127, 0, 16427, 21, 16407, 0, 16409, 0, -32323, -10840, 40, 16471, 0, -32341, -10580, 32, 16473, 117, 16384, 19, -31955, -32322, -10580, 36, -9290, 0, 16473, 113, 16432, 13, -32337, 16427, 46, 16427, 17, 16405, 0, 16404, 0, -31556, -31939, -32322, -9551, 2, 16433, 1, 16433, 5, 16426, 5, -31606, -32323, -9807, 0, -32374, -9678, 0, 16436, 0, 16435, 0, -31939, -32322, 16433, 4, 16426, 9, 16433, 3, -30772, -31666, 10578, 11457, -32344, 16413, 2, 16411, 2, 68, -32374, 16440, 0, 16440, 0, 8393, 83, 16408, 0, -31291, 10841, 69, -32311, 16412, 18, 10830, 9157, 10565, 16412, 18, 9415, 78, 16458, 0, -32049, 8665, 8908, 16455, 0, -30131, 78, -31277, 84, -32055, 10194, 76, 16469, 0, 10958, 69, 16447, 32, 84, -32319, 16418, 2, 10830, 16418, 2, 8909, 10830, 16406, 0, -31927, 10073, 9921, 8649, 16419, 5, 9153, 10190, 8915, 16469, 1, -27956, -31282, 88, -31927, 8916, 10066, 9793, 16419, 3, 84, 16447, 4, 68, -32305, 16459, 2, 70, -30650, -31284, 80, -31931, 10194, 10567, 9921, 16460, 1, 9938, 16461, 0, 10697, 84, 16467, 3, 9801, 69, 16460, 0, 8915, 16452, 0, -29631, -30903, -31282, -31793, 10069, 10819, 10185, 78, 16416, 9, 82, 16445, 0, 16416, 9, 9422, 9299, -32315, 16453, 0, 10700, 69, 16454, 0, 10700, 69, 16464, 1210, -30778, 78, -31549, 8916, 8903, 82, -32344, 16412, 17, 16472, 17, 10956, 8900, 16470, 0, 16446, 44, -28735, -29239, 10063, 71, -30263, -31668, -32302, 16412, 20, 8389, 76, 16412, 36, 10063, 71, -32311, 16412, 21, 10830, 9157, 10565, 16412, 21, 10830, 9157, 10565, 16412, 20, 10835, 16467, 1, 8898, 76, 16425, 6, -31935, 10063, 10825, 10575, 16465, 109, 80, 16416, 10, -32191, 10831, 16442, 0, 8909, -32314, 16414, 1, -31794, 10069, 10819, 10185, 78, 16416, 10, 16416, 10, -30770, -31408, -32174, 10071, 16418, 1, -32374, 16441, 2, 16441, 2, 9428, 10063, 16402, 0, -32315, 16448, 0, 8918, 10830, 16448, 0, -30523, 82, -31419, -31927, 9167, 8402, 77, 16457, 0, 77, 16419, 6, 9412, 8387, 8916, 16415, 123, 9938, 16419, 7, -31931, 10959, 9428, 8910, 16415, 104, -28351, -30397, -31024, -32045, 10964, 10066, 16464, 1319, 9813, 7892, -32323, 16462, 1384, 16463, 1241, 8389, 84, 16456, 0, 10575, 68, -32314, 16421, 64, 10575, 8397, 84, -32301, 16422, 9, 8912, 67, 16422, 12, 76, -32301, 16412, 33, -31924, 10190, 9938, 9793, 16468, 1, 10063, 71, 16468, 4, -27704, -28983, -29488, -31276, -31913, 10713, 8916, 77, 16419, 4, 10825, 9283, 16417, 12, -31423, -31921, 9426, 9166, 40, 16420, 48, 80, 16466, 115, 10834, 16451, 0, 8645, 16423, 0, 10055, 9793, -32315, 16449, 0, 8918, 10830, 16449, 0, 10575, 84, -32311, 16412, 19, 10830, 9157, 10565, 16412, 19, -32056, 10962, 69, 16464, 1354, 10053, 16450, 0, 78, -32052, 9428, 76, 16444, 182, 10693, 83, 16446, 46, 9416, 8908, 16443, 180, 16407, 0, -31939, -32292, -10454, 51, 16426, 13, 16433, 1, 16409, 0, -32290, -10454, 51, 16426, 13, 16410, 0, 16431, 14, -32323, 16430, 51, 16433, 1}; void Flushbuffer(int Limit) { int J; if (Bp >= Limit) { if (!Faulty) { Selectoutput(Object); for (J = 1; J <= Bp; J++) Printsymbol(Buff[J]); Selectoutput(Listing); } Bp = 0; } } void Addchar(unsigned char Ch) { Bp++; Buff[Bp] = Ch; } void Op(int Code, int Param) { Buff[Bp + 1] = Code; Buff[Bp + 2] = Param >> 8; Buff[Bp + 3] = Param; Bp += 3; } void Setconst(int M) { Buff[Bp + 1] = 'N'; Buff[Bp + 5] = M; M = M >> 8; Buff[Bp + 4] = M; M = M >> 8; Buff[Bp + 3] = M; M = M >> 8; Buff[Bp + 2] = M; Bp += 5; } void Octal(int N) { int M; M = N >> 3; if (M) Octal(M); Addchar((N & 7) + '0'); } void Hexadecimal(int N) { int M; M = N >> 4; if (M) Hexadecimal(M); if ((N & 15) > 9) Addchar((N & 15) + 'A'); else Addchar((N & 15) + '0'); } void Printident(int P, int Mode) { void Putit(int Ch) { if (!Mode) Printsymbol(Ch); else Addchar(Ch); } int K; int L; P = Tag[P]; if (!P) { Putit('?'); return; } P++; K = Dict[P]; L = K & 255; while (L > 0) { Putit(K >> 8); L--; P++; K = Dict[P]; if (!L) break; Putit(K & 255); L--; } } void Abandon(int N) { static int Reason_sw; static void *Reason[10 /*0:9*/] = { &&Reason_0, &&Reason_1, &&Reason_2, &&Reason_3, &&Reason_4, &&Reason_5, &&Reason_6, &&Reason_7, &&Reason_8, &&Reason_9, }; int Stream; Stream = Listing; for (;;) { if (Sym != Nl) Newline(); Printsymbol('*'); Write(Lines, 4); Space(); goto *Reason[Reason_sw = N]; Reason_0: Printstring(_imp_str_literal("compiler error!")); goto More; Reason_1: Printstring(_imp_str_literal("switch vector too large")); goto More; Reason_2: Printstring(_imp_str_literal("too many names")); goto More; Reason_3: Printstring(_imp_str_literal("program too complex")); goto More; Reason_4: Printstring(_imp_str_literal("feature not implemented")); goto More; Reason_5: Printstring(_imp_str_literal("input ended: ")); if (Quote) if (Quote < 0) Printsymbol(Cquote); else Printsymbol(Squote); else { Printstring(_imp_str_literal("%endof")); if (Progmode >= 0) Printstring(_imp_str_literal("program")); else Printstring(_imp_str_literal("file")); } Printstring(_imp_str_literal(" missing?")); goto More; Reason_6: Printstring(_imp_str_literal("too many faults!")); goto More; Reason_7: Printstring(_imp_str_literal("string constant too long")); goto More; Reason_8: Printstring(_imp_str_literal("dictionary full")); goto More; Reason_9: Printstring(_imp_join( _imp_str_literal("Included file "), _imp_join(Includefile, _imp_str_literal(" does not exist")))); More: Newline(); Printstring(_imp_str_literal("*** compilation abandoned ***")); Newline(); if (!Stream) break; Closeoutput(); Stream = Report; Selectoutput(Report); } exit(0); } void Compileblock(int Level, int Blocktag, int Dmin, int Tmax, int Id) { auto int Gapp(void); auto void Deletenames(int Quiet); auto void Analyse(void); auto void Compile(void); int Open; Open = Closed; int Dbase; Dbase = Dmax; int Tbase; Tbase = Tmax; int Tstart; Tstart = Tmax; int Label; Label = 4; int Access; Access = 1; int Inhibit; Inhibit = 0; int *Bflags; Bflags = &Tag[Blocktag]; int Blocktype; Blocktype = *Bflags >> 4 & 7; int Blockform; Blockform = *Bflags & 15; int Blockfm; Blockfm = Tag[Blocktag]; int Blockotype; Blockotype = Otype; int *Blockapp; Blockapp = &Tag[Blocktag]; int L; int Newapp; void Fault(int N) { static int Fm_sw; static void *Fm[28 /*-5:22*/] = { &&Fm_M5, &&Fm_M4, &&Fm_M3, &&Fm_M2, &&Fm_M1, &&Fm_0, &&Fm_1, &&Fm_2, &&Fm_3, &&Fm_4, &&Fm_5, &&Fm_6, &&Fm_7, &&Fm_8, &&Fm_9, &&Fm_10, &&Fm_11, &&Fm_12, &&Fm_13, &&Fm_14, &&Fm_15, &&Fm_16, &&Fm_17, &&Fm_18, &&Fm_19, &&Fm_20, &&Fm_21, &&Fm_22, }; int St; void Printss(void) { int S; int P; if (!Pos) return; Space(); P = 1; for (;;) { if (P == Pos1) Printsymbol(Marker); if (P == Pos) break; S = Char[P]; P++; if (S == Nl || (S == '%' && P == Pos)) break; if (S < ' ') if (S == Ff) S = Nl; else S = ' '; Printsymbol(S); } if (List <= 0) Pos = 0; } if (Pos2 > Pos1) Pos1 = Pos2; if (Sym != Nl) Newline(); St = Report; if (N == -3) St = Listing; for (;;) { Selectoutput(St); if (N < 0) { Printsymbol('?'); Pos1 = 0; } else Printsymbol('*'); if (St) if (List <= 0 && Pos1 != 0) { Spaces(Pos1 + Margin); Printstring(_imp_str_literal(" ! ")); } else { if (Include) Printstring(Includefile); Write(Lines, 4); Printsymbol(Csym); Space(); } if (-5 <= N && N <= 22) goto *Fm[Fm_sw = (N) - -5]; Printstring(_imp_str_literal("fault")); Write(N, 2); goto Ps; Fm_M5: Printstring(_imp_str_literal("Dubious statement")); Dubious = 0; goto Psd; Fm_M4: Printstring(_imp_str_literal("Non-local")); Pos1 = Forwarn; Forwarn = 0; goto Ps; Fm_M3: Printident(X, 0); Printstring(_imp_str_literal(" unused")); goto Nps; Fm_M2: Printstring(_imp_str_literal("\"}\"")); goto Miss; Fm_M1: Printstring(_imp_str_literal("access")); goto Psd; Fm_0: Printstring(_imp_str_literal("form")); goto Ps; Fm_1: Printstring(_imp_str_literal("atom")); goto Ps; Fm_2: Printstring(_imp_str_literal("not declared")); goto Ps; Fm_3: Printstring(_imp_str_literal("too complex")); goto Ps; Fm_4: Printstring(_imp_str_literal("duplicate ")); Printident(X, 0); goto Ps; Fm_5: Printstring(_imp_str_literal("type")); goto Ps; Fm_6: Printstring(_imp_str_literal("match")); goto Psd; Fm_7: Printstring(_imp_str_literal("context")); goto Psd; Fm_8: Printstring(_imp_str_literal("%cycle")); goto Miss; Fm_9: Printstring(_imp_str_literal("%start")); goto Miss; Fm_10: Printstring(_imp_str_literal("size")); if (!Pos1) Write(Lit, 1); goto Ps; Fm_11: Printstring(_imp_str_literal("bounds")); if (Ocount >= 0) Write(Ocount, 1); goto Ps; Fm_12: Printstring(_imp_str_literal("index")); goto Ps; Fm_13: Printstring(_imp_str_literal("order")); goto Psd; Fm_14: Printstring(_imp_str_literal("not a location")); goto Ps; Fm_15: Printstring(_imp_str_literal("%begin")); goto Miss; Fm_16: Printstring(_imp_str_literal("%end")); goto Miss; Fm_17: Printstring(_imp_str_literal("%repeat")); goto Miss; Fm_18: Printstring(_imp_str_literal("%finish")); goto Miss; Fm_19: Printstring(_imp_str_literal("result")); goto Miss; Fm_20: Printsymbol('"'); Printident(X, 0); Printsymbol('"'); goto Miss; Fm_21: Printstring(_imp_str_literal("context ")); Printident(This, 0); goto Ps; Fm_22: Printstring(_imp_str_literal("format")); goto Ps; Miss: Printstring(_imp_str_literal(" missing")); goto Nps; Psd: Pos1 = 0; Ps: Printss(); Nps: Newline(); if (St == Listing) break; St = Listing; } if (N >= 0) { if (N != 13) { Ocount = -1; Gg = 0; Copy = 0; Quote = 0; Searchbase = 0; Escapeclass = 0; Gg = 0; } Faulty++; Faultrate += 3; if (Faultrate > 30) Abandon(6); if (Faultrate <= 0) Faultrate = 3; } Tbase = Tstart; if (List <= 0 && Sym != Nl) { Errormargin = Column; Errorsym = Sym; Sym = Nl; } } Dmin--; Dict[Dmin] = -1; if (Dmax == Dmin) Abandon(2); if (List > 0 && Level > 0) { Write(Lines, 5); Spaces(Level * 3 - 1); if (!Blocktag) Printstring(_imp_str_literal("Begin")); else { Printstring(_imp_str_literal("Procedure ")); Printident(Blocktag, 0); } Newline(); } if (Blocktag) { Analyse(); if (Ss) Compile(); if (Blockotype) if (!(*Bflags & Spec)) if (Progmode <= 0 && Level == 1) Progmode = -1; else Fault(7); Newapp = Gapp(); if (Specgiven) { if (Newapp != *Blockapp) Fault(6); } *Blockapp = Newapp; if (Level < 0) { Deletenames(0); return; } } else { Open = 0; } for (;;) { Analyse(); if (Ss) { Compile(); if (Dubious) Fault(-5); Flushbuffer(128); if (Sstype > 0) { if (Sstype == 2) break; Compileblock(Specmode, Blockx, Dmin, Tmax, Id); if (Ss < 0) break; } } } if (List > 0 && Level > 0) { Write(Lines, 5); Spaces(Level * 3 - 1); Printstring(_imp_str_literal("End")); Newline(); } Deletenames(0); return; int Gapp(void) { const int Comma = 140; auto void Setcell(int G, int Tt); auto void Class(Tagfm * V); Tagfm *V; int P; int Link; int Tp; int C; int Ap; int T; if (Tmax == Local) return (0); P = Gmax1; Link = 0; T = Tmax; for (;;) { V = &Tag[T]; T--; Class(*V); if (C < 0) { C = -C; Setcell(196, Tp); Tp = -1; } Setcell(C, Tp); if (T == Local) break; Setcell(Comma, -1); } if (Gmax > Gmin) Abandon(3); return (Link); void Setcell(int G, int Tt) { while (P != Gmax) { P++; if (Glink[P] == Link && Gram[P] == G) if (Tt < 0 || (Gram[P + 1] == Tt && Glink[P + 1] == Ap)) { Link = P; return; } } Gmax++; Gram[Gmax] = G; Glink[Gmax] = Link; Link = Gmax; if (Tt >= 0) { Gmax++; Gram[Gmax] = Tt; Glink[Gmax] = Ap; } P = Gmax; } void Class(Tagfm * V) { const int Err = 89; const int Rtp = 100; const int Fnp = 101; const int Mapp = 102; const int Predp = 103; const int Classmap[16 /*0:15*/] = { 89, 1764, 247, [3 ... 6] = 89, -100, -101, -102, -103, 89, 214, 89, 229, 89}; int Tags; int Type; int Form; Ap = 0; Tags = V; Type = Tags >> 4 & 7; Form = Tags & 15; Tp = V << 3 | Type; C = Classmap[Form]; if (Type == 0 && Form == 2) { C = 208; Tp = 0; } if (Tags & Parameters) Ap = V; } } void Deletenames(int Quiet) { int Flags; Tagfm *Tx; while (Tmax > Tbase) { X = Tmax; Tmax--; Tx = &Tag[X]; Flags = Tx; if ((Flags & Spec) != 0 && (Flags & Ownbit) == 0) Fault(20); if ((Flags & Usedbit) == 0 && Level >= 0 && List <= 0) { if (!Quiet) Fault(-3); } Dict[Tx] = Tx; } } void Analyse(void) { const int Orderbits = 0x3000; const int Orderbit = 0x1000; const int Escape = 0x1000; int Strp; int Mark; int Flags; int Proterr; int K; int S; int C; static int Key = 0; int Node; int *Z; Arfm *Arp; static int Act_sw; static void *Act[21 /*180:200*/] = { &&Act_default, &&Act_181, &&Act_182, &&Act_183, &&Act_184, &&Act_185, &&Act_186, &&Act_187, &&Act_188, &&Act_189, &&Act_190, &&Act_191, &&Act_192, &&Act_193, &&Act_194, &&Act_195, &&Act_196, &&Act_197, &&Act_198, &&Act_199, &&Act_default, }; static int Paction_sw; static void *Paction[16 /*0:15*/] = { &&Paction_0, &&Paction_1, &&Paction_2, &&Paction_3, &&Paction_4, &&Paction_5, &&Paction_6, &&Paction_7, &&Paction_default, &&Paction_default, &&Paction_default, &&Paction_default, &&Paction_default, &&Paction_default, &&Paction_default, &&Paction_default, }; void Traceanalysis(void) { int A; void Show(int A) { if (0 < A && A < 130) { Space(); Printstring(Text[A]); } else Write(A, 3); } static int La1 = 0; static int La2 = 0; static int Lsa = 0; static int Lt = 0; if (Monpos != Pos && Sym != Nl) Newline(); Monpos = Pos; Write(G, 3); Space(); Printstring(Text[Class]); if (Gg & Transbit) Printsymbol('"'); A = Gg >> 8 & 15; if (A) { Printsymbol('{'); Write(A, 0); Printsymbol('}'); } if (Atom1 != La1 || Atom2 != La2 || Lsa != Subatom || Lt != Type) { Printstring(_imp_str_literal(" [")); La1 = Atom1; Show(La1); La2 = Atom2; Show(La2); Lsa = Subatom; Write(Lsa, 3); Lt = Type; Write(Lt, 5); Printsymbol(']'); } Newline(); } void Getsym(void) { Readsymbol(Sym); if (Sym < 0) Abandon(5); if (Pos != 133) Pos++; Char[Pos] = Sym; if (List <= 0) Printsymbol(Sym); Column++; } void Readsym(void) { static int Last = 0; const unsigned char Mapped[128 /*0:127*/] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '!', '"', '#', '$', 1, '&', 39, '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 2, '|', '}', '~', 0}; if (Sym == Nl) { S1: Lines++; if (Endmark) Printsymbol(Endmark); S11: Pos = 0; Pos1 = 0; Pos2 = 0; Margin = 0; Column = 0; Last = 0; Endmark = 0; if (List <= 0) { if (Include) { Printstring(_imp_str_literal(" &")); Write(Lines, -4); } else Write(Lines, 5); Csym = Cont; Printsymbol(Csym); Space(); if (Errormargin) { Lines--; Spaces(Errormargin); Errormargin = 0; if (Errorsym) { Printsymbol(Errorsym); Pos = 1; Char[1] = Errorsym; Sym = Errorsym; Errorsym = 0; goto S5; } } } S2: Symtype = 1; } S3: Readsymbol(Sym); if (Sym < 0) Abandon(5); if (Pos != 133) Pos++; Char[Pos] = Sym; if (List <= 0) Printsymbol(Sym); Column++; S5: if (Sym != Nl) { Last = Sym; if (Quote) return; Sym = Mapped[Sym & 127]; if (Sym <= 3) { if (!Sym) goto S2; if (Sym == 1) { Symtype = 2; goto S3; } if (Sym == 3) { Cont = '+'; goto S11; } for (;;) { Getsym(); if (Sym == '}') goto S3; if (Sym == Nl) goto S4; } } Key = Kdict[Sym]; if ((Key & 3) == 0 && Symtype == 2) if (Sym == 'C' && Nextsymbol() == Nl) { Getsym(); Cont = '+'; goto S1; } else Symtype = (Key & 3) - 2; return; } S4: Symtype = Quote; if (Last == 0 && Quote == 0) goto S1; Cont = '+'; } int Formatselected(void) { Formatlist = Tag[Format]; if (Formatlist < 0) { Atom1 = Error + 22; return (0); } if (Sym == '_') { Escapeclass = Escrec; Searchbase = Tag[Format]; } return (1); } void Codeatom(int Target) { int Dbase; int Da; int Base; int N; int Mul; int Pendquote; int J; int K; int L; int Pt; void Lookup(int D) { int Newname; int Vid; int K1; int K2; int Form; Tagfm *T; int New; int Dictmatch(int Ptr1, int Ptr2) { int Len; if (Dict[Ptr1] != Dict[Ptr2]) return (0); Len = Dict[Ptr1] & 255; Ptr1++; Ptr2++; Len--; while (Len >= 2) { if (Dict[Ptr1] != Dict[Ptr2]) return (0); Ptr1++; Ptr2++; Len -= 2; } if (Len == 1) if ((Dict[Ptr1] & 255) != (Dict[Ptr2] & 255)) return (0); return (1); } New = Dmax + 1; K1 = Hashvalue & Maxnames; for (;;) { Newname = Hash[K1]; if (!Newname) break; if (Dictmatch(Newname + 1, New) == 1) goto In; K1 = (K1 + 1) & Maxnames; } Sparenames--; if (Sparenames <= 0) Abandon(2); Hash[K1] = Dmax; Dict[Dmax] = -1; Newname = Dmax; Dmax = Dp; goto Notin; In: if (This >= 0 && D != 0) Searchbase = Rbase; if (Searchbase) { New = -1; X = Searchbase; for (;;) { if (X < Formatlist) goto Notin; if (Tag[X] == Newname) break; X--; } } else { X = Dict[Newname]; if (X <= Limit) goto Notin; } Subatom = X; T = &Tag[X]; Atomflags = T; Format = T; App = T; Protection = Atomflags & Prot; Type = Atomflags >> 4 & 7; Atom1 = Amap[Atomflags & 15]; if (Diag & 8) { Printstring(_imp_str_literal("lookup:")); Write(Atom1, 3); Write(Type, 1); Write(App, 3); Write(Format, 5); Write(Atomflags, 3); Newline(); } if (!D) { T = T | Usedbit; Searchbase = 0; if ((Atomflags & Subname) != 0 && Format != 0) if (!Formatselected()) return; if (Atomflags & Parameters) { if (!App) { Atom2 = Atom1; Atom1 -= 4; if (97 <= Atom1 && Atom1 <= 98) { Mapgg = Atom1; Atom1 = Var; } } else if (Sym == '(') { Searchbase = 0; if (Atom1 >= 106) { App = Phrase[App + 200]; Escapeclass = Escarray; Atom1 = ((Atom1 - 106) >> 1) + 91; } else { Escapeclass = Escproc; Atom1 -= 4; } Phrase[200] = App; } Pos2 = Pos; return; } if ((Atomflags & Constbit) != 0 && Atom1 == Var) { Mapgg = Const; Atom2 = Const; if (Type == Integer) Subatom = -Subatom; } return; } if (Tbase != Tstart) goto Notin; if (D == Lab + Spec + Usedbit) { T = T | Usedbit; return; } if (Atomflags & Spec) { if (D == Lab) { T -= Spec; return; } if (7 <= (Decl & 15) && (Decl & 15) <= 10 && (Decl & Spec) == 0) { if (!((Decl ^ Atomflags) & 0b1111111)) { T -= Spec; Specgiven = 1; return; } } if ((Decl & 15) == Recfm) { T = (Record << 4) + Recfm; T = Fdef; return; } } if (Last1 == Jump && Atom1 == Swit) return; if (!Copy) Copy = X; Notin: App = 0; Vid = 0; Atom1 = Error + 2; if (!D) return; Type = D >> 4 & 7; Form = D & 15; Atom1 = Amap[Form]; if (This < 0) { New = Newname; Tmax++; X = Tmax; } else { New = -1; Recid--; Vid = Recid; Tmin--; X = Tmin; Formatlist = Tmin; } if (11 <= Form && Form <= 14) { if (!Dim) Dim = 1; App = Dim; } if ((Otype > 2 && (D & Spec) == 0) || Perm != 0 || Level == Includelevel) D = D | Usedbit; T = &Tag[X]; if (Form == Lab) { Id++; Vid = Id; } T = Vid; T = Newname; T = D; T = App; T = Fdef; Format = Fdef; Subatom = X; if (New >= 0) { T = Dict[New]; Dict[New] = X; if (Gmin == Maxgrammar) { Tmin--; Subatom = Tmin; Tag[Tmin] = *T; } } if (Tmax >= Tmin) Abandon(3); } Top: Pos1 = Pos; Subatom = 0; Pendquote = 0; Atomflags = 0; if (Symtype == -2) goto Name; if (Symtype < 0) goto Number; if (!Symtype) { Atom1 = Termin; Atom2 = 0; return; } if (Symtype != 2) { if (Quote) goto Text; if (Sym == Squote) goto Strings; if (Sym == Cquote) goto Symbols; if (Sym == '.' && '0' <= Nextsymbol() && Nextsymbol() <= '9') goto Number; } K = Key >> 2; Readsym(); for (;;) { J = Kdict[K]; if (J & 0x4000) break; if ((J & 127) != Sym || Symtype < 0) { if (J >= 0) goto Err; K++; } else { L = J >> 7 & 127; Readsym(); if (J > 0) { if (L) { if (L != Sym || Symtype < 0) goto Err; Readsym(); } L = 1; } K += L; } } Atom1 = J & 127; if (!Atom1) { Atom1 = 19; Subatom = 19; Atom2 = 0; if (Sym == Nl) { if (Ocount >= 0) return; Readsym(); } return; } Atom2 = J >> 7 & 127; Subatom = Kdict[K + 1] & 0x3FFF; return; Err: Atom1 = Error + 1; Atom2 = 0; if (Pos - Pos1 > 2) Pos1 = Pos; return; Symbols: Atom1 = Var; Atom2 = Const; Type = Integer; Mapgg = Const; Protection = Prot; Subatom = Lp; if (Lp >= Litmax) Abandon(3); Quote = ~Pendquote; return; Chars: N = 0; Cont = Cquote; for (;;) { Readsym(); if (Sym == Cquote) { if (Nextsymbol() != Cquote) break; Readsym(); } if (N & (~((-1) >> Bytesize))) { Pos1 = Pos; Atom1 = Error + 10; return; } if (!Quote) goto Err; N = (N << Bytesize) + Sym; Quote++; } Quote = 0; Cont = ' '; if (Sym != Nl) Readsym(); Litpool[Lp] = N; Lp++; goto Top; Strings: Atom1 = Var; Atom2 = Const; Type = Stringv; Subatom = Strp | 0x4000; Mapgg = Const; Protection = Prot; Quote = Subatom; Textline = Lines; return; int Flipflop; Text: if (Quote < 0) goto Chars; L = Strp; K = 0; Flipflop = 0; for (;;) { Cont = Squote; Quote = 1; for (;;) { Readsym(); if (Sym == Squote) { if (Nextsymbol() != Squote) break; Readsym(); } if (Flipflop >= 0) { Glink[Strp] = (Sym << 8) + Flipflop; Strp++; Flipflop = -1; } else Flipflop = Sym; K++; if (K > 255) { Lines = Textline; Abandon(7); } } if (Flipflop >= 0) { Glink[Strp] = Flipflop; Strp++; } Glink[L] = Glink[L] | K; Quote = 0; Cont = ' '; Readsym(); Codeatom(Target); if (Atom1 != 48 || Sym != Squote) return; } void Get(int Limit) { int S; int Shift; Shift = 0; if (Base != 10) if (Base == 16) Shift = 4; else if (Base == 8) Shift = 3; else if (Base == 2) Shift = 1; N = 0; for (;;) { if (Symtype == -1) S = Sym - '0'; else if (Symtype < 0) S = Sym - 'A' + 10; else return; if (S >= Limit) return; Pt++; Glink[Pt] = Sym; if (Base == 10) if (N >= Maxint && (S > Maxdig || N > Maxint)) { Base = 0; Type = Real; N = 0; } if (!Shift) N = N * Base + S; else N = (N << Shift) + S; Readsym(); } } Number: Base = 10; Bxk: Atom1 = Var; Atom2 = Const; Type = Integer; Subatom = Lp; Mapgg = Const; Protection = Prot; if (Lp >= Litmax) Abandon(3); Pt = Strp; Mul = 0; for (;;) { Get(Base); if (Sym != '_' || Base == 0 || Pendquote != 0) break; Pt++; Glink[Pt] = '_'; Readsym(); Base = N; } if (Pendquote) { if (Sym != Cquote) goto Err; Readsym(); } if (Sym == '.') { Pt++; Glink[Pt] = '.'; Readsym(); Type = Real; N = Base; Base = 0; Get(N); } if (Sym == '@') { Pt++; Glink[Pt] = '@'; K = Pt; Readsym(); Type = Integer; Base = 10; if (Sym == '-') { Readsym(); Get(10); N = -N; } else Get(10); Pt = K + 1; Glink[Pt] = Lp; Litpool[Lp] = N; Lp++; if (!Base) Atom1 = Error + 10; Type = Real; } if (Type == Real) { Glink[Strp] = Pt - Strp; Subatom = (Strp) | 0x2000; Strp = Pt + 1; } else { Litpool[Lp] = N; Lp++; } return; Name: if (27 <= Target && Target <= 41) { Atom1 = 0; return; } Hashvalue = 0; Dp = Dmax + 1; Dbase = Dp; N = 0; Dict[Dp] = 0; for (;;) { Hashvalue += Hashvalue + Sym; Dict[Dp] = Dict[Dp] | (Sym << 8); N++; Dp++; Readsym(); if (Symtype >= 0) break; Dict[Dp] = Sym; N++; Readsym(); if (Symtype >= 0) break; } if (Sym == Cquote) { Pendquote = 100; if (Hashvalue == 'M') goto Symbols; Readsym(); if (Hashvalue == 'X') { Base = 16; goto Bxk; } if (Hashvalue == 'K' || Hashvalue == 'O') { Base = 8; goto Bxk; } if (Hashvalue == 'B') { Base = 2; goto Bxk; } goto Err; } Dict[Dbase] = Dict[Dbase] | N; if (!(N & 1)) Dp++; if (Dp >= Dmin) Abandon(8); Atom2 = 90; if (Last1 == 0 && Sym == ':') { Limit = Local; Lookup(Lab); return; } if (Last1 == Jump) { Limit = Local; Lookup(Lab + Spec + Usedbit); return; } if (Decl != 0 && Target == 90) { Searchbase = Fmbase; Limit = Local; Lookup(Decl); Searchbase = 0; } else { Limit = 0; Lookup(0); } } int Parsedmachinecode(void) { if (Symtype != -2) { Atom1 = Error; return (0); } Flushbuffer(128); Addchar('w'); do { Addchar(Sym); Readsym(); } while (Sym == '_' || Symtype == 0); Addchar('_'); if (Symtype) { Readsym(); while (Symtype) if (Symtype < 0) { Codeatom(0); if (Atom1 & Error) return (0); if (Atom2 == Const && Type == Integer) if (Subatom < 0) Setconst(Tag[-Subatom]); else Setconst(Litpool[Subatom]); else if (91 <= Atom1 && Atom1 <= 109) { if (Atom1 == 104 && (Tag[Subatom] & Closed) == 0) { This = Subatom; Atom1 = Error + 21; return (0); } Op(' ', Tag[Subatom]); } else { Atom1 = Error; return (0); } } else { if (Symtype == 2) Sym = Sym | 128; Addchar(Sym); Readsym(); } } Addchar(';'); return (1); } if (!Gg) Cont = ' '; Last1 = 0; Mapgg = 0; S = 0; Ss = 0; Sstype = -1; Fdef = 0; Fmbase = 0; App = 0; Margin = Column; Pos = 0; Strp = Gmax + 1; Lp = 0; Tbase = Tstart; Local = Tbase; if (Gg == 0 || Ocount >= 0) { Again: while (!Symtype) { C = Cont; Cont = ' '; if (Ocount >= 0) Cont = '+'; Readsym(); Cont = C; } if (Sym == '!') goto Skip; This = -1; Codeatom(0); if (Atom1 == Comment) { Skip: Quote = 1; C = Cont; while (Sym != Nl) { Readsym(); Cont = C; } Quote = 0; Symtype = 0; goto Again; } } Decl = 0; Mark = 0; Gentype = 0; Force = 0; Dim = 0; Proterr = 0; Node = 0; Nmax = 0; Nmin = Recsize + 1; Order = 1; Gmin = Maxgrammar + 1; if (Gg) { Sstype = 0; goto More; } Ptype = 0; Specgiven = 0; Stats++; if (!Perm) Op('O', Lines); if (Atom1 & Error) goto Fail1; if (Escapeclass) { G = Impphrase; Sstype = -1; goto A3; } G = Initial[Atom1]; if (!G) { G = Initial[0]; Sstype = 0; goto A3; } if (G < 0) { G = G & 255; Nmax = 1; Ar[1] = 0; Ar[1] = 0; Ar[1] = Impphrase; } Gg = Gram[G]; Class = Gg & 255; Sstype = (Gg >> 12 & 3) - 1; goto A1; Act_194: Ptype = Type; Papp = App; Pformat = Format; goto More; Act_196: K = G + 1; goto A610; Act_188: K = Ar[Nmax] + 1; A610: Papp = Glink[K]; K = Gram[K]; if (!K) goto More; Ptype = K & 7; Pformat = K >> 3; Act_183: K = Type; if (Gentype == 0 || K == Real) Gentype = K; if (Pformat < 0) { App = Papp; Format = Pformat; if (Ptype == Real && Type == Integer) K = Real; if (Force) { K = Force; Force = 0; } } if (Papp != App || (Ptype != K && Ptype != 0)) goto Fail2; if (Pformat == Format || Pformat == 0 || Format == 0) goto More; goto Fail2; Act_197: Arp = &Ar[Nmin]; K = Arp; if (Blockform != (K & 15)) goto Fail3; Arp = K >> 4; Type = Blocktype; Ptype = Blocktype; Pformat = Blockfm; Papp = App; if (Ptype != Record) Pformat = -1; goto More; Act_195: if (Type != 0 && Type != Integer && Type != Real) goto Fail2; Arp = &Ar[Nmin]; K = Arp; Arp = K >> 2; K = K & 3; if (!K) goto More; if (K == 1) { Force = Integer; if (Type == Integer || Type == 0) goto More; goto Fail2; } if (Ptype != Real && Ptype != 0) goto Fail2; if (K == 3) Force = Integer; goto More; Act_198:; K = Gg >> 8 & 15; if (!K) { Atom1 = Last1; goto More; } if (K == 1) { if (Type != Stringv) goto Fail2; goto More; } if (K == 2) { if (Type == Record) goto Fail2; goto More; } if (K == 3) { Codeatom(0); if (!(Atomflags & Ownbit)) goto A7; goto More; } if (X <= Local) Forwarn = Pos1; goto More; Paction_1: if (Type == Record) G = Phrase[242]; else Pformat = -1; goto A3; Paction_2: Ptype = Real; Pformat = -1; goto A3; Paction_3: Ptype = Stringv; Pformat = -1; goto A3; Paction_4: Ptype = Integer; Pformat = -1; goto A3; Paction_5: if (Ptype == Integer) goto A3; if (Ptype == Real) { G = Phrase[212]; Pformat = -1; } if (Ptype == Stringv) G = Phrase[213]; goto A3; Paction_6: Ptype = Gram[Ar[Nmax] + 1] & 7; Pformat = -1; goto A3; Paction_7: if (Ptype == Integer) Ptype = Real; Pformat = -1; goto A3; A1: Last1 = Class; Atom1 = 0; S = Subatom; A2: if (!(Gg & Transbit)) { Z = &Node; for (;;) { K = *Z; if ((Gg & Orderbits) == 0 || K == 0) break; Gg -= Orderbit; Z = &Ar[K]; } if (Mapgg != 0 && (Gg & 255) == Var) Gg = Mapgg; Nmin--; if (Nmin == Nmax) goto Fail0; *Z = Nmin; Arp = &Ar[Nmin]; Arp = S; Arp = (Gg & 255) | Mark; Arp = K; } Mark = 0; Mapgg = 0; More: G = Glink[G]; Paction_0:; A3: Gg = Gram[G]; Class = Gg & 255; if (Diag & 1) Traceanalysis(); if (!Class) goto A5; if (Class < Actions) { if (Class >= Figurative) Class = Atomic[Class]; if (Class >= Manifest) goto A2; if (!Atom1) Codeatom(Class); if (Escapeclass) { Class = Escapeclass; Escapeclass = 0; G += Escape; Esc: Gg = 0; Arp = &Ar[Nmax + 1]; Arp = Papp; Arp = X; goto A4; } if (Class == Atom1 || Class == Atom2) goto A1; A7: if (Gg >= 0) goto Fail1; G++; goto A3; } if (Class >= Phrasal) { A4: Nmax++; if (Nmax == Nmin) goto Fail0; Arp = &Ar[Nmax]; Arp = Ptype; Arp = Pos1; Arp = Pformat; Arp = Gentype; Arp = Node; Arp = G; Node = 0; G = Phrase[Class]; if (Force) { Ptype = Force; Force = 0; } Gentype = 0; goto *Paction[Paction_sw = Gg >> 8 & 15]; } goto *Act[Act_sw = (Class)-180]; A5:; S = 0; while (Node) { Z = &Ar[Node]; K = *Z; *Z = S; S = Node; Node = K; } Ss = S; A6: if (Nmax) { K = Gentype; Arp = &Ar[Nmax]; Nmax--; Node = Arp; Gentype = Arp; Ptype = Arp; Pformat = Arp; G = Arp; if (G & Escape) { G -= Escape; Papp = Arp; Mark = 255; Subatom = S; goto A3; } if (Gentype == 0 || K == Real) Gentype = K; Type = Gentype; K = Gg; for (;;) { Gg = Gram[G]; if (!K) goto A2; if (Gg >= 0) goto Fail1; K -= Orderbit; G++; } } if (Copy) Fault(4); if (!Order) Fault(13); if (Forwarn) Fault(-4); Pos1 = 0; Faultrate--; return; Act_193: if (Sym != '=' && Sym != '<') { Gg = 0; goto A5; } Act_181: Atom1 = Amap[Decl & 15]; goto More; Act_182: Class = Escdec; G = Glink[G] | Escape; Decl = 0; Otype = 0; goto Esc; Act_199:; S = 0; while (Node) { Z = &Ar[Node]; K = *Z; *Z = S; S = Node; Node = K; } Ss = S; if (Quote) Codeatom(28); Compile(); if (!(Atom1 & Error)) goto More; goto Fail1; Act_184: if (Type != Integer) goto Fail4; if (Subatom < 0) Lit = Tag[-Subatom]; else Lit = Litpool[Subatom]; if (Lit) goto Fail4; goto More; Act_185:; S = 0; while (Node) { Z = &Ar[Node]; K = *Z; *Z = S; S = Node; Node = K; } Ss = S; Atom1 = Ar[S]; Atom2 = 0; if (Atom1 == 97 || Atom1 == 98) Atom1 = Var; Arp = &Ar[Nmax]; X = Arp; Pos1 = Arp; Pos2 = 0; App = 0; Format = Tag[X]; Flags = Tag[X]; Type = Flags >> 4 & 7; Protection = Flags & Prot; if (Flags & Aname) Protection = 0; if ((Flags & Subname) != 0 && Format != 0) if (!Formatselected()) goto Fail1; goto A6; Act_187: Protection = Prot; goto More; Act_186: if (!(Protection & Prot)) goto More; Proterr = Nmin; goto A7; Act_191: K = Protection; Codeatom(0); if (!(Atomflags & Aname)) Protection = K; goto More; Act_192: if (!Parsedmachinecode()) goto Fail1; goto More; Act_189: K = Gapp(); Deletenames(1); Tmax = Tbase; Tbase = Gram[Gmin]; Local = Tbase; Gmin++; X = Ar[Ar[Nmax]]; Tag[X] = K; goto More; Act_190: Gmin--; if (Gmin <= Gmax) Abandon(2); Gram[Gmin] = Tbase; Tbase = Tmax; Local = Tbase; goto More; Fail4: K = Error + 10; goto Failed; Fail3: K = Error + 7; goto Failed; Fail2: K = Error + 5; Pos2 = 0; goto Failed; Fail0: K = Error + 3; goto Failed; Fail1: K = Atom1; Pos2 = 0; Failed: if (Diag & 32) { Printstring(_imp_str_literal("Atom1 =")); Write(Atom1, 3); Printstring(_imp_str_literal(" Atom2 =")); Write(Atom2, 3); Printstring(_imp_str_literal(" subatom =")); Write(Subatom, 3); Newline(); Printstring(_imp_str_literal("Type =")); Write(Type, 1); Printstring(_imp_str_literal(" Ptype =")); Write(Ptype, 1); Newline(); Printstring(_imp_str_literal("App =")); Write(App, 1); Printstring(_imp_str_literal(" Papp =")); Write(Papp, 1); Newline(); Printstring(_imp_str_literal("Format =")); Write(Format, 1); Printstring(_imp_str_literal(" Pformat =")); Write(Pformat, 1); Newline(); } while (Sym != Nl && Sym != ';') { Quote = 0; Readsym(); } if (K & Error) Fault(K & 255); else if (Proterr == Nmin) Fault(14); else Fault(0); Gg = 0; Ss = 0; Symtype = 0; goto Paction_skip; Paction_default: fprintf(stderr, "Switch label 'Paction(%d):' not set in %s", Paction_sw, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Paction_skip:; goto Act_skip; Act_default: fprintf(stderr, "Switch label 'Act(%d):' not set in %s", Act_sw + 180, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Act_skip:; } void Compile(void) { const int Then = 4; const int Else = 8; const int Loop = 16; static int C_sw; static void *C[181 /*0:180*/] = { &&C_0, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_27, &&C_28, &&C_29, &&C_30, &&C_31, &&C_32, &&C_33, &&C_34, &&C_35, &&C_36, &&C_37, &&C_38, &&C_39, &&C_default, &&C_41, &&C_42, &&C_43, &&C_44, &&C_45, &&C_46, &&C_47, &&C_48, &&C_49, &&C_50, &&C_51, &&C_52, &&C_53, &&C_default, &&C_55, &&C_56, &&C_57, &&C_58, &&C_59, &&C_60, &&C_default, &&C_62, &&C_63, &&C_64, &&C_65, &&C_default, &&C_67, &&C_68, &&C_69, &&C_70, &&C_71, &&C_72, &&C_default, &&C_74, &&C_75, &&C_76, &&C_77, &&C_78, &&C_79, &&C_80, &&C_81, &&C_82, &&C_83, &&C_84, &&C_85, &&C_86, &&C_87, &&C_88, &&C_89, &&C_90, &&C_91, &&C_92, &&C_93, &&C_default, &&C_default, &&C_96, &&C_97, &&C_98, &&C_99, &&C_100, &&C_101, &&C_102, &&C_103, &&C_104, &&C_105, &&C_106, &&C_107, &&C_108, &&C_109, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, &&C_120, &&C_121, &&C_122, &&C_default, &&C_124, &&C_125, &&C_126, &&C_127, &&C_128, &&C_default, &&C_130, &&C_131, &&C_132, &&C_133, &&C_134, &&C_135, &&C_136, &&C_137, &&C_138, &&C_139, &&C_140, &&C_141, &&C_142, &&C_143, &&C_144, &&C_145, &&C_146, &&C_147, &&C_148, &&C_149, &&C_default, &&C_151, &&C_152, &&C_153, &&C_154, &&C_155, &&C_156, &&C_157, &&C_158, &&C_159, &&C_160, &&C_161, &&C_162, &&C_163, &&C_164, &&C_165, &&C_166, &&C_167, &&C_168, &&C_default, &&C_170, &&C_171, &&C_172, &&C_173, &&C_174, &&C_175, &&C_default, &&C_default, &&C_default, &&C_default, &&C_default, }; static int Litop_sw; static void *Litop[12 /*1:12*/] = { &&Litop_1, &&Litop_2, &&Litop_3, &&Litop_4, &&Litop_5, &&Litop_6, &&Litop_7, &&Litop_8, &&Litop_9, &&Litop_10, &&Litop_11, &&Litop_12, }; const unsigned char Operator[14 /*1:14*/] = { '[', ']', 'X', '/', '&', '!', '%', '+', '-', '*', 'Q', 'x', '.', 'v'}; const unsigned char Cc[8 /*0:7*/] = {'#', '=', ')', '<', '(', '>', 'k', 't'}; const unsigned char Anyform[16 /*0:15*/] = {1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1}; const int Decmap[16 /*0:15*/] = {1, 2, 0x100B, 0x100D, 0x140C, 0x140E, 3, 4, 0x1007, 0x1008, 0x1009, 0x100A, 6, 0, 0, 0}; static unsigned char Cnest[16 /*0:15*/]; int Lmode; int Clab; int Dupid; int Resln; static int Lastdef = 0; static int Lb; static int Ub; int Cp; int Ord; int Next; int Link; int J; int K; int N; int Done; int Class; int Lit2; int Defs; int Decs; int Cident; int Pending; static int Pstack[40 /*1:40*/]; static _imp_string Name = _imp_str_literal(""); static int Count = 0; void Deflab(int L) { Op(':', L); Access = 1; } void Getnext(void) { Arfm *P; Gn: if (!Next) { if (!Link) { Class = 0; return; } P = &Ar[Link]; Next = P; Link = P; } for (;;) { P = &Ar[Next]; X = P; Class = P; if (Class < Actions) break; if (!X) { Next = P; goto Gn; } if (P) { P = Link; Link = Next; } Next = X; } Next = P; if (Diag & 2) { if (*Length(Name)) Spaces(8 - *Length(Name)); Name = Text[Class]; Write(X, 2); Space(); Printstring(Name); Space(); Count--; if (Count <= 0) { Count = 5; Name = _imp_str_literal(""); Newline(); } } } void Setsubs(int N) { int P; P = Tmax; while (N > 0) { Tag[P] = Dimension; P--; N--; } } void Setbp(void) { Pending -= 2; Lb = Pstack[Pending + 1]; Ub = Pstack[Pending + 2]; if (Ub - Lb + 1 < 0) { Pos1 = 0; Next = Link; Fault(11); Ub = Lb; } Setconst(Lb); Setconst(Ub); if (Class != 146) Addchar('b'); } void Compileend(int Type) { if (Access) { Open = 0; if (Blockform > Proc) Fault(19); } while (Dict[Dmin] >= 0) { Fault(17 + (Dict[Dmin] & 1)); Dmin++; } Addchar(';'); if (Type == 1) Addchar(';'); *Bflags = *Bflags | Open; if (Blocktag != 0 && Level != 1) Deflab(0); if (Type != 2) { if (Level != Type) Fault(16); } else if (!Level) { Fault(15); } Endmark = 11; } void Def(int P) { int T; int F; int Type; Tagfm *V; Flushbuffer(1); Defs++; V = &Tag[P]; T = 0; if (V >= 0) { if (!V) { Id++; V = Id; } Lastdef = V; T = Lastdef; } Op('$', T); Printident(P, 1); T = V; Type = T; if ((Type & (7 << 4)) >= 6 << 4) Type = Type & (~(7 << 4)); Op(',', Type & 0b1111111); F = V; if ((T & 0x70) == Record << 4) F = Tag[F]; if (F < 0) F = V; Op(',', F); F = Otype + (T >> 4 & 0b1111000); if (Class == 125) F = F | 8; Dim = V; if (0 >= Dim || Dim > Dimlimit) Dim = 0; Op(',', F + (Dim << 8)); if (!(T & Parameters)) Defs = 0; F = T & 15; if (V & Spec) { if (3 > F || F > 10) V = V & (~Spec); Ocount = -1; } Dimension = 0; if (Otype == 2 && (F == 2 || F == 12 || F == 14)) { V--; } } void Defslab(int N) { int P; int L; int B; int W; int Bit; P = Tag[X]; L = Dict[P]; if (L <= N && N <= Dict[P + 1]) { B = N - L; W = (B >> 4) + P; Bit = 1 << (B & 15); if (Dict[W + 2] & Bit) { if (Pending) Fault(4); return; } if (Pending) Dict[W + 2] = Dict[W + 2] | Bit; Setconst(N); Op('_', Tag[X]); } else Fault(12); Access = 1; } void Call(void) { Tagfm *T; T = &Tag[X]; Op('@', T); if (T & Closed) Access = 0; if (!T) Addchar('E'); } void Popdef(void) { Setconst(Pstack[Pending]); Pending--; } void Poplit(void) { if (!Pending) Lit = 0; else { Lit = Pstack[Pending]; Pending--; } } void Push(int X) { if ((Cnest[Cp] & 2) != X) { Cnest[Cp] = Cnest[Cp] | 1; X += 4; } if (Cnest[Cp] & 1) Clab++; Cnest[Cp + 1] = X; Cp++; } void Poplabel(int Mode) { Lmode = Dict[Dmin]; if (Lmode < 0 || (Lmode & 1) != Mode) Fault(Mode + 8); else { Dmin++; Label -= 3; } } if (Sstype < 0) if (!Level) { Fault(13); } else if (!Access) { Access = 1; Fault(-1); } if (Diag & 2) { if (Sym != Nl) Newline(); Printstring(_imp_str_literal("ss =")); Write(Ss, 1); Newline(); Count = 5; Name = _imp_str_literal(""); } Next = Ss; Pending = 0; Lmode = 0; Link = 0; Decs = 0; Defs = 0; Resln = 0; Done = 0; Ord = Level; if (This >= 0) Ord = 1; C_0:; Top: if (Next != Link) { Getnext(); goto *C[C_sw = Class]; } if ((Diag & 2) != 0 && Count != 5) Newline(); if (Lmode & (Loop | Then | Else)) { if (Lmode & Loop) Op('B', Label - 1); if (Lmode & Then) Deflab(Label); if (Lmode & Else) Deflab(Label - 1); } if (!Decs) return; if (Atom1) { Atom1 = Error; return; } Order = Ord; Decl = (Decl & (~15)) + Decmap[Decl & 15]; Atom1 = Atoms[Decl & 15]; if (Otype) { if (Atom1 != Proc) Atom1++; if (Otype == 2) { N = Decl & 15; if (N & 1) { Decl = Decl | Prot; if ((Decl & 0b1111111) == Iform) Decl = Decl | Constbit; } } else Decl = Decl | Ownbit; } if (Sstype == 0 && Atom1 == Proc) Sstype = 1; if (Decl & Spec) Atom1++; if (Atom1 == 5) { Ocount = 0; Cont = '+'; } if (!Anyform[Decl & 15]) { if ((Decl >> 4 & 7) == Record) { if (Tag[Fdef] & Spec) This = Fdef; if (Fdef == This) Atom1 = Error + 21; } if (!Fdef) Atom1 = Error + 10; } return; Atop: Access = 0; goto Top; C_88:; C_28: Decl = X & (~7); Fdef = X & 7; if ((X & 0b1110001) == (Real << 4) + 1) Fdef = Realsln; Decs = 1; goto Top; C_34:; C_35: Otype = X; Ord = 1; goto Top; C_152: Decl += X << 1; goto Top; C_31:; C_32: Specmode = Level + 1; if (X == 9) Decl = Decl | Prot; C_29: Ord = 1; Dim = 0; C_30: Decl += X; Decs = 1; goto Top; C_27: Lit = 0; if (Pending) { Poplit(); if (0 >= Lit || Lit > Dimlimit) { Atom1 = Error + 11; return; } } Dim = Lit; Decl += X; Decs = 1; goto Top; C_37: X = X | Subname; C_36: Lit = 0; if (Pending) { Poplit(); if (0 >= Lit || Lit > 255) { Atom1 = Error + 10; return; } } Fdef = Lit; C_33: Decl = X; Decs = 1; goto Top; C_39: Decl = Decl | Spec; Ocount = -1; Specmode = -1; goto Top; C_38: Decl = 64 + 4; Order = 1; Atom1 = X; if (Atom1 == 12) Decl = Decl | Spec; Fdef = Tmax + 1; return; C_175: Id++; Tag[X] = Id; return; C_41: Decs = 1; Decl = X | Spec | Closed; goto Top; C_133: Recid = 0; Rbase = Tmin - 1; This = X; Fmbase = Fdef; Formatlist = Tmin; Def(This); goto Top; C_148: if (!Next) { Fdef = 0; goto Top; } Getnext(); Fdef = X; goto Top; C_127: Addchar('}'); goto Top; C_126: Addchar('{'); goto Top; C_174: Setbp(); C_171:; C_172:; C_173: Addchar('~'); Addchar(Class - 171 + 'A'); goto Top; C_168: Rbase = -Rbase; Sstype = 0; Specmode = 0; C_147: Searchbase = 0; Tag[This] = Tmin; Tag[This] = Rbase; goto Top; C_45: if (X == 36) Addchar('U'); goto Top; C_46: Addchar('\\'); goto Top; C_47:; C_48:; C_42:; C_43:; C_44: Addchar(Operator[X]); goto Top; C_56:; C_57: Push(X); goto Top; C_58: Cnest[Cp] = Cnest[Cp] ^ 2; goto Top; C_138: X = 128 + 32 + 16 + 4; C_59:; C_60: if (Class == 138) Op('f', Label - 1); else Deflab(Label - 1); C_166:; C_62: Lmode = (Lmode & (Else | Loop)) | (X >> 3); Clab = Label; Cp = 1; Cnest[1] = X & 7; goto Top; C_72: Poplabel(0); if (Lmode & 32) Deflab(Label + 1); goto Atop; C_69: Poplabel(1); goto Top; C_163:; C_70: Poplabel(1); if ((Lmode & 3) == 3) Fault(7); C_68: Lmode = (Lmode & Else) | 3; if (Access) { Op('F', Label - 1); Lmode = Else | 3; } Deflab(Label); if (Next) goto Top; C_120:; C_67:; C_71:; Stcy: if (!Lmode) { Deflab(Label - 1); Lmode = Loop; } Dmin--; if (Dmin <= Dmax) Abandon(3); Dict[Dmin] = Lmode; Label += 3; return; C_64: if (Dict[Dmin] >= 0 || Inhibit != 0) Fault(13); Inhibit = 1; N = 0; if (!Pending) N = 0xFFFF; while (Pending > 0) { Poplit(); if (Lit & (~15)) Fault(10); J = 1 << Lit; if (N & J) Dubious = 1; N = N | J; } Op('o', N); Op(',', Label); Lmode = Then | 1; goto Stcy; C_104: Op('J', Tag[X]); Inhibit = 1; goto Atop; C_149: Stats--; Access = 1; Inhibit = 1; Op('L', Tag[X]); goto Top; C_63: J = Dmin; L = Label - 3; for (;;) { if (Dict[J] < 0) { Fault(7); goto Top; } if (!(Dict[J] & 1)) break; J++; L -= 3; } if (X == 32) L++; Op('F', L); Dict[J] = Dict[J] | X; goto Atop; C_50: Addchar('C'); goto Cop; C_49:; if (Next) { Addchar('"'); Push(0); } else Addchar('?'); Cop: if (Cnest[Cp] & 2) X = X ^ 1; J = Cp; L = Clab; while (!(Cnest[J] & 4)) { J--; L -= Cnest[J] & 1; } Op(Cc[X], L); if (Cnest[Cp] & 1) Deflab(Clab + 1); Cp--; Clab -= Cnest[Cp] & 1; goto Top; C_78:; C_79:; C_80: Open = 0; C_82: Access = 0; C_89:; C_81: Addchar(X); goto Top; C_65: Poplit(); Op('e', Lit); goto Atop; C_51: Addchar('S'); goto Top; C_53: Addchar('j'); goto Top; C_52: Addchar('Z'); goto Top; C_74: if (!Level) { if (Progmode <= 0) Progmode = 1; else Fault(7); } Specmode = Level + 1; Blockx = 0; Addchar('H'); return; C_77: Perm = 0; Lines = 0; Stats = 0; Closeinput(); Selectinput(Source); List--; Tbase = Tmax; Tstart = Tmax; return; C_76: if (Include != 0 && X == 0) { Lines = Include; Sstype = 0; Closeinput(); List = Includelist; Includelevel = 0; Include = 0; Selectinput(Source); return; } Ss = -1; C_75: Compileend(X); return; C_85: if (!X) Control = Lit; else if ((Lit >> 14 & 3) == 1) Diag = Lit & 0x3FFF; Op('z' - X, Lit); goto Top; C_83: List = List + X - 2; goto Top; C_84: Realsln = X; goto Top; C_86: if (Include) { Fault(7); return; } Getnext(); X -= 0x4000; J = Glink[X]; K = J & 255; Includefile = _imp_str_literal(""); for (;;) { K--; if (K < 0) break; Includefile = _imp_join(Includefile, Tostring(J >> 8)); X++; J = Glink[X]; K--; if (K < 0) break; Includefile = _imp_join(Includefile, Tostring(J & 255)); } { if (_imp_on_event(9)) Abandon(9); Openinput(3, Includefile); } Include = Lines; Lines = 0; Includelist = List; Includelevel = Level; Selectinput(3); goto Top; C_154: Dimension++; if (Dimension == Dimlimit + 1) Fault(11); goto Top; C_145: Setbp(); goto Top; C_146: Setbp(); C_142:; if (!Dimension) Dimension = 1; Op('d', Dimension); Op(',', Defs); if (Class != 146) { Setsubs(Defs); if (Dict[Dmin] >= 0 || Inhibit != 0 || Level == 0) Fault(13); } Dimension = 0; Defs = 0; goto Top; C_128: Id = Dupid; goto Top; C_130: Blockx = X; if ((Decl & Spec) == 0 && Level != 0) Op('F', 0); C_125: Dupid = Id; if (Level < 0) return; C_90: Def(X); goto Top; C_131:; if ((Tag[X] & (0b1111111 + Constbit)) == Iform + Constbit) Tag[X] = Lit; else { if (Pending) Setconst(Lit); Def(X); Op('A', 1); } Cident = X; goto Top; C_124: if (Tag[Cident] & Prot) Dubious = 1; goto Top; C_97:; C_98:; C_99:; C_96: Call(); goto Top; C_165:; C_100:; C_101:; C_102:; C_103:; C_91:; C_92:; C_106:; C_107:; C_108:; C_109:; K = Tag[X]; if (K < 0) Op('n', -K); else Op('@', K); goto Top; C_121: Setconst(0); goto Top; C_167: Addchar('G'); goto Pstr; C_93:; if (X < 0) { Setconst(Tag[-X]); goto Top; } if (X & 0x4000) { Addchar('\''); Pstr: X -= 0x4000; J = Glink[X]; K = J & 255; Addchar(K); for (;;) { K--; if (K < 0) goto Top; Addchar(J >> 8); X++; J = Glink[X]; K--; if (K < 0) goto Top; Addchar(J & 255); } } if (X & 0x2000) { X -= 0x2000; K = Glink[X]; Op('D', K); Addchar(','); for (;;) { if (!K) goto Top; K--; X++; J = Glink[X]; if (J == '@') { Op('@', Litpool[Glink[X + 1]]); goto Top; } Addchar(J); } } Setconst(Litpool[X]); goto Top; C_137: Addchar('i'); goto Top; C_141: Addchar('a'); goto Top; C_132: Ocount = Ub - Lb + 1; Def(X); Dimension = 1; Setsubs(1); if (!Next) { if (Ocount > 0) Op('A', Ocount); Ocount = -1; } else Getnext(); goto Top; C_162: Lit = Ocount; goto Ins; C_143: Poplit(); Ins: if (Lit < 0) { Fault(10); Lit = 0; } Getnext(); goto Inst; C_139:; C_153: Lit = 1; Inst: if (Pending) Popdef(); Op('A', Lit); Ocount -= Lit; if (Ocount >= 0) { if (X) goto Top; if (!Ocount) { Ocount = -1; return; } } Fault(11); return; C_105: Op('W', Tag[X]); Inhibit = 1; goto Atop; C_134: Def(X); N = Ub - Lb + 1; N = (N + 15) >> 4; J = Dmax; Dmax = Dmax + N + 2; if (Dmax >= Dmin) Abandon(1); Tag[X] = J; Dict[J] = Lb; Dict[J + 1] = Ub; for (;;) { N--; if (N < 0) goto Top; J++; Dict[J + 1] = 0; } C_151: Stats--; if (X < Tbase) { Fault(7); return; } if (Pending) Defslab(Pstack[1]); else { if (Tag[X]) { Fault(4); return; } Tag[X] = 1; N = Tag[X]; for (J = Dict[N]; J <= Dict[N + 1]; J++) { Defslab(J); Flushbuffer(128); } } Inhibit = 1; return; C_140: Addchar('p'); goto Top; C_144:; Addchar('p'); Addchar('E'); goto Top; C_155:; if (X < 0) Lit = Tag[-X]; else Lit = Litpool[X]; Pending++; Pstack[Pending] = Lit; goto Top; C_156: Lit = Pstack[Pending]; if (Lit < 0) Lit = -Lit; Pstack[Pending] = Lit; goto Top; C_157: Lit = -Pstack[Pending]; Pstack[Pending] = Lit; goto Top; C_158: Lit = ~Pstack[Pending]; Pstack[Pending] = Lit; goto Top; C_159:; C_160:; C_161: Pending--; Lit2 = Pstack[Pending + 1]; Lit = Pstack[Pending]; goto *Litop[Litop_sw = (X >> 2) - 1]; Litop_1: Lit = Lit << Lit2; goto Setl; Litop_2: Lit = Lit >> Lit2; goto Setl; Litop_3: N = 1; if (Lit2 < 0) Fault(10); while (Lit2 > 0) { Lit2--; N = N * Lit; } Lit = N; goto Setl; Litop_4: if (!Lit2) Fault(10); else Lit = Lit / Lit2; goto Setl; Litop_5: Lit = Lit & Lit2; goto Setl; Litop_6: Lit = Lit | Lit2; goto Setl; Litop_7: Lit = Lit ^ Lit2; goto Setl; Litop_8: Lit += Lit2; goto Setl; Litop_9: Lit -= Lit2; goto Setl; Litop_10: Lit = Lit * Lit2; goto Setl; Litop_11: Lit += Lit2; goto Setl; Litop_12: N = 1; if (Lit2 < 0) Fault(10); while (Lit2 > 0) { Lit2--; N = N * Lit; } Lit = N; goto Setl; Setl: Pstack[Pending] = Lit; goto Top; C_170:; goto Top; C_135: Resln = 2; goto Top; C_136: Resln++; goto Top; C_55: Op('r', Resln); Resln = 0; goto Top; C_164: Op('r', Resln + 4); Resln = 0; C_122: X = 6; goto Cop; C_87: Setconst(Pstack[1]); Bp++; Buff[Bp] = 'P'; goto Top; goto C_skip; C_default: fprintf(stderr, "Switch label 'C(%d):' not set in %s", C_sw, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; C_skip:; } } if (_imp_on_event(9)) Abandon(5); Selectinput(2); Selectoutput(Listing); Tag[Maxtag] = 0; Tag[0] = 0; Tag[0] = 7; for (X = 0; X <= Maxnames; X++) Hash[X] = 0; Printstring(_imp_str_literal(" Edinburgh IMP77 Compiler - Version ")); Printstring(Version); Newlines(2); Op('l', 0); Compileblock(0, 0, Maxdict, 0, 0); Addchar(Nl); Flushbuffer(0); X = Listing; Newline(); for (;;) { if (!Faulty) { Write(Stats, 5); Printstring(_imp_str_literal(" Statements compiled")); } else { Printstring(_imp_str_literal(" Program contains ")); Write(Faulty, 1); Printstring(_imp_str_literal(" fault")); if (Faulty != 1) Printsymbol('s'); } Newline(); if (!X) break; X = Report; Selectoutput(Report); } if (Faulty) exit(0); exit(0); return (1); }