external; { Initialize.p (of PCQ Pascal) Copyright (c) 1989 Patrick Quaid. This routine initializes all the global variables and enters the standard identifiers. } const {$I "pasconst.i"} type {$I "pastype.i"} var {$I "pasvar.i"} function addtype(a, b, c, d, e, f : integer): integer; forward; procedure enterspell(s : string); forward; function enterstandard(a, b, c, d, e, f, g : integer): integer; forward; function AllocString(l : integer): string; forward; procedure initstandard; { This is a huge routine, but since it's so straightforward I don't think I'll split it up. It just enters all the standard identifiers into the identifier table. Note that 'nil' is considered a standard identifier. } var dummy : integer; niltype : integer; spellint : integer; begin spellint := integer(adr(spelling)) - 1; badtype := addtype(vordinal, 0, 0, 0, 4, 0); idents[badtype].name := string(spellint + spellptr); enterspell(" "); inttype := addtype(vordinal, 0, 0, 0, 4, 0); idents[inttype].name := string(spellint + spellptr); enterspell("Integer"); shorttype := addtype(vordinal, 0, 0, 0, 2, 0); idents[shorttype].name := string(spellint + spellptr); enterspell("Short"); booltype := addtype(vordinal, 0, 0, 0, 1, 0); idents[booltype].name := string(spellint + spellptr); enterspell("Boolean"); chartype := addtype(vordinal, 0, 0, 0, 1, 0); idents[chartype].name := string(spellint + spellptr); enterspell("Char"); texttype := addtype(vfile, chartype, 0, 0, 18, 0); idents[texttype].name := string(spellint + spellptr); enterspell("Text"); stringtype := addtype(vpointer, chartype, 0, 0, 4, 0); idents[stringtype].name := string(spellint + spellptr); enterspell("String"); realtype := addtype(vreal, 0, 0, 0, 4, 0); idents[realtype].name := string(spellint + spellptr); enterspell("Real"); bytetype := addtype(vordinal, 0, 0, 0, 1, 0); idents[bytetype].name := string(spellint + spellptr); enterspell("Byte"); literaltype := addtype(varray, chartype, 1, 1, 1, inttype); dummy := enterstandard(stanproc, 1, 0, 0, 0, 0, 0); enterspell("Write"); dummy := enterstandard(stanproc, 2, 0, 0, 0, 0, 0); enterspell("Writeln"); dummy := enterstandard(stanproc, 3, 0, 0, 0, 0, 0); enterspell("Read"); dummy := enterstandard(stanproc, 4, 0, 0, 0, 0, 0); enterspell("Readln"); dummy := enterstandard(stanproc, 5, 0, 0, 0, 0, 0); enterspell("New"); dummy := enterstandard(stanproc, 6, 0, 0, 0, 0, 0); enterspell("Dispose"); dummy := enterstandard(stanproc, 7, 0, 0, 0, 0, 0); enterspell("Close"); dummy := enterstandard(stanproc, 8, 0, 0, 0, 0, 0); enterspell("Get"); dummy := enterstandard(stanproc, 9, 0, 0, 0, 0, 0); enterspell("Exit"); dummy := enterstandard(stanproc, 10, 0, 0, 0, 0, 0); enterspell("Trap"); dummy := enterstandard(stanfunc, 1, inttype, 0, 0, 0, 0); enterspell("Ord"); dummy := enterstandard(stanfunc, 2, chartype, 0, 0, 0, 0); enterspell("Chr"); dummy := enterstandard(stanfunc, 3, booltype, 0, 0, 0, 0); enterspell("Odd"); dummy := enterstandard(stanfunc, 4, inttype, 0, 0, 0, 0); enterspell("Abs"); dummy := enterstandard(stanfunc, 5, inttype, 0, 0, 0, 0); enterspell("Succ"); dummy := enterstandard(stanfunc, 6, inttype, 0, 0, 0, 0); enterspell("Pred"); dummy := enterstandard(stanfunc, 7, booltype, 0, 0, 0, 0); enterspell("Reopen"); dummy := enterstandard(stanfunc, 8, booltype, 0, 0, 0, 0); enterspell("Open"); dummy := enterstandard(stanfunc, 9, booltype, 0, 0, 0, 0); enterspell("Eof"); dummy := enterstandard(constant, -1, booltype, 0, 0, 0, 0); enterspell("True"); dummy := enterstandard(constant, 0, booltype, 0, 0, 0, 0); enterspell("False"); dummy := enterstandard(constant, $7FFFFFFF, inttype, 0, 0, 0, 0); enterspell("MaxInt"); dummy := enterstandard(constant, $7FFF, shorttype, 0, 0, 0, 0); enterspell("MaxShort"); niltype := addtype(vpointer, badtype, 0, 0, 4, 0); idents[niltype].name := string(spellint + spellptr); enterspell("Address"); dummy := enterstandard(constant, 0, niltype, 0, 0, 0, 0); enterspell("Nil"); dummy := enterstandard(stanfunc, 10, niltype, 0, 0, 0, 0); enterspell("Adr"); dummy := addtype(varray, chartype, 128, 1, 128, inttype); dummy := enterstandard(global, 0, dummy, 0, 0, 0, 0); enterspell("CommandLine"); end; procedure initreserved(); { This initializes the array of reserved words. If you mess around with this, be advised that the symbol numbers defined in pasconst.i correspond with the indices of these words. Look at searchreserved in utilities.p to explain the previous sentence. } begin reserved[1] := "AND"; reserved[2] := "ARRAY"; reserved[3] := "BEGIN"; reserved[4] := "BY"; reserved[5] := "CASE"; reserved[6] := "CONST"; reserved[7] := "DIV"; reserved[8] := "DO"; reserved[9] := "DOWNTO"; reserved[10] := "ELSE"; reserved[11] := "END"; reserved[12] := "EXTERNAL"; reserved[13] := "FILE"; reserved[14] := "FOR"; reserved[15] := "FORWARD"; reserved[16] := "FUNCTION"; reserved[17] := "GOTO"; reserved[18] := "IF"; reserved[19] := "IN"; reserved[20] := "LABEL"; reserved[21] := "MOD"; reserved[22] := "NOT"; reserved[23] := "OF"; reserved[24] := "OR"; reserved[25] := "PACKED"; reserved[26] := "PRIVATE"; reserved[27] := "PROCEDURE"; reserved[28] := "PROGRAM"; reserved[29] := "RECORD"; reserved[30] := "REPEAT"; reserved[31] := "RETURN"; reserved[32] := "SET"; reserved[33] := "THEN"; reserved[34] := "TO"; reserved[35] := "TYPE"; reserved[36] := "UNTIL"; reserved[37] := "VAR"; reserved[38] := "WHILE"; reserved[39] := "WITH"; end; Procedure initglobals; { This just puts the startup values into the variables. } begin litlab := 1; symtext := allocstring(80); includename := allocstring(80); eqstart := 0; eqend := 0; errorptr := 0; including := false; identptr := 1; spelling[0] := chr(0); spellptr := 1; litptr := 1; errorcount := 0; lineno := 1; currsym := 0; symloc := 0; currfn := 0; nxtlab := 1; rangecheck := false; end;