home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol097 / insym.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  15.5 KB  |  521 lines

  1. External Cross::Insym(1);{$L-}{$C-}{$E-}
  2.  
  3. Procedure InSymbol(Var Dbl_DecF,Dbl_DecL:Dbl_Ptr;Var CurProc:List_Ptr_Ty);
  4.     Label 1;
  5.     Var
  6.       Base:Integer;Base_Set:Set Of Char;
  7.       OLD_SPACES_MARK,
  8.       (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON KOMMENTAREN*)
  9.       I       : INTEGER;
  10.       OLDSYTY: SYMBOL;
  11.       PROCEDURE READBUFFER;
  12.         PROCEDURE READLINE;
  13.         VAR
  14.           Exit:Boolean;
  15.           CH      : CHAR;
  16.         BEGIN (*READLINE*)
  17.           REPEAT
  18.             Exit:=False;
  19.             WHILE HACK_EOLN (OLDSOURCE) AND NOT (EOF (OLDSOURCE)) DO
  20.             BEGIN
  21.               READLN (OLDSOURCE);
  22.               BEGIN
  23.                 IF REALLINCNT = MAXLINE
  24.                   THEN HEADER;
  25.                 LINECNT := LINECNT + 1;
  26.                 REALLINCNT := REALLINCNT + 1;
  27.                 WRITELN (CROSSLIST,' ' : 12,LINECNT * INCREMENT : 5);
  28.                 WRITE_LINE_NUMBER;WriteLin;
  29.                 IF MAXINC = LINECNT
  30.                   THEN NEWPAGE;
  31.               END;
  32.             END;
  33.             IF NOT EOF(OLDSOURCE)
  34.               THEN READ (OLDSOURCE,CH);
  35.           UNTIL (CH <> ' ') OR (EOF (OLDSOURCE));
  36.             {%E}
  37.           BUFFLEN := 0;
  38.           REPEAT
  39. Exit:=False;
  40.             BUFFLEN := BUFFLEN + 1;
  41.             BUFFER [BUFFLEN] := CH;
  42.             IF (HACK_EOLN (OLDSOURCE) OR (BUFFLEN = 147))
  43.               OR (EOF(OLDSOURCE))
  44.               THEN Exit:=True;
  45.             If Not Exit Then Read (OLDSOURCE,CH);
  46.           UNTIL Exit;
  47.           IF NOT (HACK_EOLN (OLDSOURCE))
  48.             THEN
  49.               BEGIN
  50.                 WRITELN (OUTPUT);
  51.              WRITELN (OUTPUT,'Line ',(LINECNT+1)*INCREMENT : 5,'Too long');
  52.               WRITELN (CROSSLIST,' ' : 17,' **** Next line too long ****');
  53.               END
  54.             ELSE
  55.               IF NOT (EOF (OLDSOURCE))
  56.                 THEN
  57.                   BEGIN
  58.                     READLN (OLDSOURCE);
  59.                   END;
  60.           BUFFERPTR := 1;
  61.           BUFFMARK := 0;
  62.         END (*READLINE*) ;
  63.         {%E}
  64.       BEGIN (*READBUFFER*)
  65.         IF BUFFERPTR = BUFFLEN + 2
  66.           THEN
  67.             BEGIN
  68.               WR_LINE (BUFFERPTR);
  69.               CH := ' ';
  70.               IF EOF (OLDSOURCE)
  71.                 THEN EOB := TRUE
  72.                 ELSE READLINE;
  73.             END
  74.           ELSE
  75.             BEGIN
  76.               CH := BUFFER [BUFFERPTR];
  77.               BUFFERPTR := BUFFERPTR + 1;
  78.             END;
  79.       END (*READBUFFER*) ;
  80.       PROCEDURE PARENTHESE;
  81.       VAR
  82.         OLD_SPACES_MARK : INTEGER;
  83.         (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON KLAMMERN*)
  84.       BEGIN (*PARENTHESE*)
  85.         OLD_SPACES_MARK := SPACES;
  86.         IF OLDSPACES
  87.           THEN SPACES := LASTSPACES + BUFFERPTR - 2
  88.           ELSE
  89.             BEGIN
  90.               LASTSPACES := SPACES;
  91.               SPACES := SPACES + BUFFERPTR - 2;
  92.               OLDSPACES := TRUE;
  93.             END;
  94.         REPEAT
  95.           INSYMBOL(Dbl_DecF,Dbl_DecL,CurProc)
  96.         UNTIL SYTY IN [RPARENT,EOBSY];
  97.         SPACES := OLD_SPACES_MARK;
  98.         OLDSPACES := TRUE;
  99.         INSYMBOL(Dbl_DecF,Dbl_DecL,CurProc);
  100.       END (*PARENTHESE*) ;
  101.       {%E}
  102.       FUNCTION RESWORD: BOOLEAN ;
  103.       LABEL
  104.         1;
  105.       VAR
  106.         I       : INTEGER;
  107.       BEGIN (*RESWORD*)
  108.         RESWORD:= FALSE;
  109.         FOR I:=RESNUM[CHCNT] TO RESNUM [CHCNT + 1] -1 DO
  110.         IF RESLIST[ I ] = SY
  111.           THEN
  112.             BEGIN
  113.               RESWORD := TRUE;
  114.               SYTY := RESSY [I];
  115.               If Syty=Sub_Program
  116.                 Then
  117.                   Begin
  118.                     SyTy:=OtherSy;
  119.                     No_Main:=True;
  120.                   End;
  121.               GOTO 1;
  122.             END;
  123. 1:
  124.       END (*RESWORD*) ;
  125.       {%E}
  126.       PROCEDURE FINDNAME;
  127.       LABEL
  128.         1;
  129.       VAR
  130.         PROCPTR : PROC_CALL_TYPE;
  131.         (*ZEIGER AUF RUFENDE BZW. GERUFENE PROZEDUR BEI DEREN VERKETTUNG*)
  132.         LPTR: LIST_PTR_TY;        (*ZEIGER AUF DEN VORGAENGER IM BAUM*)
  133.         ZPTR : LINE_PTR_TY;
  134.         (*ZEIGER AUF DIE VORLETZTE ZEILENNUMMER IN EINER KETTE*)
  135.       RIGHT: BOOLEAN;         (*MERKVARIABLE FUER DIE VERZWEIGUNG IM BAUM*)
  136.         INDEXCH : CHAR;
  137.         (*INDEXVARIABLE FUER DAS FELD DER STARTZEIGER (FIRSTNAME)*)
  138.         PROCEDURE FINDPROC (COMP : LIST_PTR_TY);
  139.         VAR
  140.           PROCCALLPTR : PROC_CALL_TYPE;
  141.           (*MERK SICH LETZTE PROZEDUR FALLS EINE NEUE ERZEUGT WERDEN MUSS*)
  142.         BEGIN (*FINDPROC*)
  143.         WHILE (PROCPTR^.PROCNAME <> COMP) AND (PROCPTR^.NEXTPROC <> NIL) DO
  144.           PROCPTR := PROCPTR^.NEXTPROC;
  145.           IF PROCPTR^.PROCNAME = COMP
  146.             THEN
  147.               BEGIN
  148.                 ZPTR := PROCPTR^.LAST;
  149.                 NEW (PROCPTR^.LAST);
  150.                 WITH PROCPTR^.LAST^ DO
  151.                 BEGIN
  152.                   LINENR := LINECNT + 1;
  153.                   PAGENR := PAGECNT;
  154.                   CONTLINK := NIL;
  155.                 END;
  156.                 ZPTR^.CONTLINK := PROCPTR^.LAST;
  157.               END
  158.             ELSE
  159.               BEGIN
  160.                 PROCCALLPTR := PROCPTR;
  161.                 NEW (PROCPTR);
  162.                 WITH PROCPTR^ DO
  163.                 BEGIN
  164.                   PROCNAME := COMP;
  165.                   NEXTPROC := NIL;
  166.                   NEW (FIRST);
  167.                   WITH FIRST^ DO
  168.                   BEGIN
  169.                     LINENR := LINECNT + 1;
  170.                     PAGENR := PAGECNT;
  171.                     CONTLINK := NIL;
  172.                   END;
  173.                   LAST := FIRST;
  174.                 END;
  175.                 PROCCALLPTR^.NEXTPROC := PROCPTR;
  176.               END;
  177.         END (*FINDPROC*) ;
  178.         {%E}
  179.         PROCEDURE NEWPROCEDURE;
  180.         BEGIN (*NEWPROCEDURE*)
  181.           WITH LISTPTR^ DO
  182.           BEGIN
  183.             PROCVAR := PROCDEC;
  184.             NEW (CALLEDBY);
  185.             WITH CALLEDBY^ DO
  186.             BEGIN
  187.               PROCNAME := CURPROC;
  188.               NEXTPROC := NIL;
  189.               NEW (FIRST);
  190.               WITH FIRST^ DO
  191.               BEGIN
  192.                 LINENR := LINECNT + 1;
  193.                 PAGENR := PAGECNT;
  194.                 CONTLINK := NIL;
  195.               END;
  196.               LAST := FIRST;
  197.             END;
  198.             NEW (CALLED);
  199.             WITH CALLED^ DO
  200.             BEGIN
  201.               PROCNAME := FIRSTNAME ['M'];
  202.               NEXTPROC := NIL;
  203.               NEW (FIRST);
  204.               WITH FIRST^ DO
  205.               BEGIN
  206.                 LINENR := LINECNT + 1;
  207.                 PAGENR := PAGECNT;
  208.                 CONTLINK := NIL;
  209.               END;
  210.               LAST := FIRST;
  211.             END;
  212.           END;
  213.           NEW (PROC_CL^.NEXTPROC);
  214.           PROC_CL := PROC_CL^.NEXTPROC;
  215.           WITH PROC_CL^ DO
  216.           BEGIN
  217.             PROCNAME := LISTPTR;
  218.             NEXTPROC := NIL;
  219.             LINENR := LINECNT + 1;
  220.             PAGENR := PAGECNT;
  221.             PROCLEVEL := LEVEL;
  222.           END;
  223.         END (*NEWPROCEDURE*) ;
  224.         {%E}
  225.       BEGIN (*FINDNAME*)
  226.         INDEXCH := SY [1];
  227.         LISTPTR := FIRSTNAME [INDEXCH];
  228.         WHILE LISTPTR <> NIL DO
  229.         BEGIN
  230.           LPTR:= LISTPTR;
  231.           IF SY = LISTPTR^.NAME
  232.             THEN
  233.               BEGIN
  234.                 ZPTR := LISTPTR^.LAST;
  235.                 NEW (LISTPTR^.LAST);
  236.                 WITH LISTPTR^.LAST^ DO
  237.                 BEGIN
  238.                   LINENR := LINECNT + 1;
  239.                   PAGENR := PAGECNT;
  240.                   CONTLINK := NIL;
  241.                 END;
  242.                 ZPTR^.CONTLINK := LISTPTR^.LAST;
  243.                 IF LISTPTR^.PROCVAR <> 0
  244.                   THEN
  245.                     BEGIN
  246.                       IF LISTPTR^.PROCVAR = 2
  247.                         THEN WHILE CH = ' ' DO
  248.                           BEGIN
  249.                             SYLENG := SYLENG + 1;
  250.                             READBUFFER;
  251.                           END;
  252.                       IF (CH <> ':') OR (LISTPTR^.PROCVAR = 1)
  253.                         THEN
  254.                           BEGIN
  255.                             PROCPTR := LISTPTR^.CALLEDBY;
  256.                             FINDPROC (CURPROC);
  257.                             PROCPTR := CURPROC^.CALLED;
  258.                             FINDPROC (LISTPTR);
  259.                           END
  260.                     END
  261.                       {%E}
  262.                   ELSE
  263.                     IF PROCDEC <> 0
  264.                       THEN
  265.                         BEGIN
  266.                           IF DBL_DECF = NIL
  267.                             THEN
  268.                               BEGIN
  269.                                 NEW (DBL_DECF);
  270.                                 DBL_DECL := DBL_DECF;
  271.                               END
  272.                             ELSE
  273.                               BEGIN
  274.                                 NEW (DBL_DECL^.NEXTPROC);
  275.                                 DBL_DECL := DBL_DECL^.NEXTPROC;
  276.                               END;
  277.                           DBL_DECL^.NEXTPROC := NIL;
  278.                           DBL_DECL^.PROCORT := LISTPTR;
  279.                           NEWPROCEDURE;
  280.                         END;
  281.                 GOTO 1;
  282.               END
  283.             ELSE
  284.               IF SY > LISTPTR^.NAME
  285.                 THEN
  286.                   BEGIN
  287.                     LISTPTR:= LISTPTR^.RLINK;
  288.                     RIGHT:= TRUE;
  289.                   END
  290.                 ELSE
  291.                   BEGIN
  292.                     LISTPTR:= LISTPTR^.LLINK;
  293.                     RIGHT:= FALSE;
  294.                   END;
  295.         END;
  296.         {%E}
  297.         NEW (LISTPTR);
  298.         WITH LISTPTR^ DO
  299.         BEGIN
  300.           NAME := SY;
  301.           LLINK := NIL;
  302.           RLINK := NIL;
  303.         END;
  304.         IF FIRSTNAME [INDEXCH] = NIL
  305.           THEN FIRSTNAME [INDEXCH] := LISTPTR
  306.           ELSE
  307.             IF RIGHT
  308.               THEN LPTR^.RLINK := LISTPTR
  309.               ELSE LPTR^.LLINK := LISTPTR;
  310.         WITH LISTPTR^ DO
  311.         BEGIN
  312.           NEW (FIRST);
  313.           WITH FIRST^ DO
  314.           BEGIN
  315.             LINENR := LINECNT + 1;
  316.             PAGENR := PAGECNT;
  317.             CONTLINK := NIL;
  318.           END;
  319.           LAST := FIRST ;
  320.           IF PROCDEC = 0
  321.             THEN
  322.               BEGIN
  323.                 PROCVAR := 0;
  324.                 CALLED := NIL;
  325.                 CALLEDBY := NIL;
  326.               END
  327.             ELSE NEWPROCEDURE;
  328.         END;
  329. 1:
  330.         PROCDEC := 0;
  331.       END (*FINDNAME*) ;
  332.       {%E}
  333.       PROCEDURE CHECK_E(Pos:Integer);
  334.         {CHECK FOR THE E OPTION AND PAGE IF SO}
  335.       BEGIN
  336.         If (Buffer[Pos+1]='%')And
  337.           ((Buffer[Pos+2]='E')Or(Buffer[Pos+2]='e'))
  338.           Then NewPage;
  339.       End;
  340.       Procedure SkipComment(C:Char;Pos:Integer);
  341.       Begin {Skip over comments checking for eject option}
  342.         IF  C='{'
  343.           Then
  344.             Begin
  345.               Check_E(Pos-1);
  346.               While (CH<>'}')And (Not Eob) Do
  347.               Begin
  348.                 ReadBuffer;
  349.               End;
  350.             End
  351.           Else
  352.             Begin
  353.               ReadBuffer;
  354.               Check_E(Pos);
  355.               Repeat
  356.                 ReadBuffer
  357.               Until(Ch=')')And(Buffer[BufferPtr-2]='*')Or Eob;
  358.             End;
  359.       End;
  360.       {%E}
  361.       PROCEDURE FINDCOMMENT;
  362.       LABEL
  363.         1;
  364.       VAR
  365.         C: CHAR;
  366.         I: INTEGER;
  367.         FOUND: BOOLEAN;
  368.       BEGIN
  369.         I:= BUFFERPTR - 1;
  370.         C:= ' ';
  371.         FOUND := FALSE;
  372.         WHILE (C=' ') AND (I<BUFFLEN) DO
  373.         BEGIN
  374.           C:= BUFFER[I];
  375.           IF (C='{') OR (C='(') AND (BUFFER[I+1]='*')
  376.             THEN
  377.               BEGIN
  378.                 FOUND := TRUE;
  379.                 GOTO 1;
  380.               END;
  381.           I:= I + 1;
  382.         END;
  383. 1:
  384.         IF FOUND
  385.           THEN
  386.             Begin
  387.               While (Ch<>'{')And(Ch<>'(')Do ReadBuffer;
  388.               SkipComment(Ch,BufferPtr);
  389.             END;
  390.         ReadBuffer;
  391.       End;
  392.       FUNCTION UPPER(C:CHAR):CHAR;
  393.       BEGIN
  394.         IF (C>='a')And(C<='z')
  395.           Then Upper:=CHR(ORD(C)-Ord('a')+ord('A'))
  396.           Else Upper:=C;
  397.       End;
  398.       {%E}
  399.     BEGIN (*INSYMBOL*)
  400.       SYLENG := 0;
  401.       WHILE ((CH IN ['(',' ','?','!','@'])OR(CH='{')
  402.              OR(CH='}'))AND NOT EOB DO
  403.       BEGIN
  404.         IF (CH = '{') OR (CH = '(') AND (BUFFER[BUFFERPTR] = '*')
  405.           THEN
  406.             BEGIN
  407.               OLD_SPACES_MARK := SPACES;
  408.               IF OLDSPACES
  409.                 THEN SPACES := LASTSPACES
  410.                 ELSE  LASTSPACES := SPACES;
  411.               SPACES := SPACES + BUFFERPTR - 1;
  412.               OLDSPACES := TRUE;
  413.               SkipComment(CH,BufferPtr);
  414.               SPACES := OLD_SPACES_MARK;
  415.               OLDSPACES := TRUE;
  416.             END
  417.           ELSE
  418.             IF CH = '('
  419.               THEN GOTO 1;
  420.         READBUFFER;
  421.       END;
  422.       IF CH = ''''
  423.         THEN
  424.           BEGIN
  425.             SYTY := STRGCONST;
  426.             REPEAT
  427.               READBUFFER;
  428.             UNTIL (CH = '''') OR EOB;
  429.             READBUFFER;
  430.           END
  431.         ELSE
  432.           IF CH IN LETTERS
  433.             THEN
  434.               BEGIN
  435.                 SYLENG := 0;
  436.                 REPEAT
  437.                   SYLENG := SYLENG + 1;
  438.                   IF SYLENG <= 10
  439.                     THEN SY [SYLENG] :=UPPER(CH);
  440.                   READBUFFER;
  441.                 UNTIL NOT (CH IN ALPHANUM);
  442.                 FOR I := SYLENG + 1 TO 10 DO SY [I] := ' ';
  443.                 IF SYLENG > 10
  444.                   THEN CHCNT := 10
  445.                   ELSE CHCNT := SYLENG;
  446.                 IF NOT RESWORD
  447.                   THEN
  448.                     BEGIN
  449.                       SYTY := IDENT ;
  450.                       FINDNAME;
  451.                     END
  452.               END
  453.             ELSE
  454.               {%E}
  455.               IF CH IN DIGITS
  456.                 THEN
  457.                   BEGIN
  458.                     Base:=0;
  459.                     REPEAT
  460. If Base<36 Then
  461.                       Base:=Base*10+Ord(Ch)-Ord('0');
  462.                       READBUFFER;
  463.                     UNTIL NOT (CH IN DIGITS);
  464.                     SYTY := INTCONST;
  465.                     If (Ch='#')And (Base<36)
  466.                       Then
  467.                         Begin
  468.                           Base_Set:=Digits;
  469.                           For Base:=Base DownTo 11 Do
  470.                           Base_Set:=Base_Set+[Chr(Base-11+Ord('A'))];
  471.                           Repeat
  472.                             ReadBuffer;
  473.                           Until Not(Ch In Base_Set);
  474.                         End;
  475.                     BEGIN
  476.                       IF CH = '.'
  477.                         THEN
  478.                           BEGIN
  479.                             REPEAT
  480.                               READBUFFER
  481.                             UNTIL NOT (CH IN DIGITS);
  482.                             SYTY := OTHERSY;
  483.                           END;
  484.                       IF (CH = 'E')OR(CH='e')
  485.                         THEN
  486.                           BEGIN
  487.                             READBUFFER;
  488.                             IF CH IN ['+','-']
  489.                               THEN READBUFFER;
  490.                             WHILE CH IN DIGITS DO READBUFFER;
  491.                             SYTY := OTHERSY;
  492.                           END;
  493.                     END;
  494.                   END
  495.                 ELSE
  496.                   IF CH <> ' '
  497.                     THEN
  498.                       BEGIN
  499.                         1
  500. :
  501.                         OLDSYTY := SYTY;
  502. If (CH<' ')Or(CH>'_')Then SYTY:=OTHERSY
  503. Else
  504.                         SYTY := DELSY [CH];
  505.                         READBUFFER;
  506.                         IF (OLDSYTY=ENDSY) AND (SYTY=SEMICOLON)
  507.                           THEN FINDCOMMENT;
  508.                         IF SYTY = LPARENT
  509.                           THEN PARENTHESE
  510.                           ELSE
  511.                             IF (SYTY = COLON) AND (CH = '=')
  512.                               THEN
  513.                                 BEGIN
  514.                                   SYTY := OTHERSY;
  515.                                   READBUFFER;
  516.                                 END;
  517.                       END
  518.                     ELSE SYTY := EOBSY;
  519.     END (*INSYMBOL*) ;
  520. .
  521.