home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBOPAS / RNF-PAS.LBR / RNF4.PQS / RNF4.PAS
Pascal/Delphi Source File  |  2000-06-30  |  8KB  |  300 lines

  1. (*  ---  rnf4 --- *)
  2.  
  3.  function BoolOrd (*  (BoolExp: Boolean): integer; *);
  4.  
  5.    (* circumvent UCSD III boolean expression evaluation error *)
  6.    
  7.    begin 
  8.      if BoolExp then
  9.        BoolOrd := 1
  10.      else
  11.        BoolOrd := 0
  12.    end;
  13.    
  14.  function ForceUpperCase (*  (achar: char): char   *);
  15.  
  16.    begin
  17.      if CharCategory[achar] = lcLetter then
  18.        ForceUpperCase := chr(ord(achar) + LowerCaseConvert)
  19.      else
  20.        ForceUpperCase := achar;
  21.    end;
  22.    
  23.  procedure StackToMacro (* (StartAt: integer;
  24.              var StartMacro, FinishMacro: integer) *);
  25.  
  26.    var
  27.      i, j: integer;
  28.      
  29.    begin
  30.      with StgStack[TopOfStack] do 
  31.        begin
  32.         if StgEnd - StartAt > FinishMacro - StartMacro then
  33.            begin
  34.              if FreeStgIndx = FinishMacro + 1 then
  35.                FreeStgIndx := StartMacro
  36.              else
  37.                if StartMacro > 0 then
  38.                  for i := StartMacro  to FinishMacro do
  39.                    StgTable[i] := chr(0);
  40.              StartMacro := FreeStgIndx;
  41.              FinishMacro := StartMacro + StgEnd - StartAt;
  42.              FreeStgIndx := FinishMacro + 1;
  43.              if FreeStgIndx > StgTblSize then
  44.                begin
  45.                  writeln(' String table overflow. --- halting.');
  46.                  {exit(program);}halt;
  47.                end;
  48.            end;
  49.          j := StartMacro;
  50.          if j > 0 then (* not an empty macro *)
  51.            for i := StartAt to StgEnd do
  52.              begin
  53.                StgTable[j] := StgTable[i];
  54.                j := j + 1;
  55.              end;
  56.          FinishMacro := j - 1;
  57.        end;
  58.    end;
  59.  
  60.  
  61. procedure Error (* (ErrNum: integer)  *);
  62.  
  63.   var
  64.     i: integer;
  65.  
  66.   procedure WriteErrPAOC ( var L: ALINE;  width: integer);
  67.   {  Write a Packed Array Of Char, with a field width.  Like global    }
  68.   {  WritePAOC, but this one goes to default output device (console).  }
  69.    var i : integer;
  70.    begin
  71.     if not paocBUG then write(L:width)  { ISO standard way to do it }
  72.      else for i:= 1 to width do write(L[i]);   { Turbo }
  73.    end (* WritePAOCErr *);
  74.  
  75.   procedure WriteArg(s:string80);
  76.   var i: integer;
  77.   begin i := 1;
  78.      repeat write(s[i]); i:= i+1;
  79.      until (i>length(s)) or (i>80) or (s[i]=' ');
  80.   end { WriteArg };
  81.  
  82.   begin { Error }
  83.     ErrorsOnLine := ErrorsOnLine + 1;
  84.     ErrorCount := ErrorCount + 1;
  85.     ErrorSet := ErrorSet + [ErrNum];
  86.     writeln;
  87.     writeln(' Error Count: ', ErrorCount: 1, ' Error Number: ', ErrNum: 1, '.');
  88.     if ErrNum in [1 .. 6, 9 .. 11, 15, 19 .. 24,
  89.                   26 .. 30, 34, 39 .. 52, 57 .. 59] then
  90.       begin write(' Working on symbol: "');
  91.             WriteErrPAOC(syl.lin,syl.len); writeln('".');
  92.       end;
  93.     if VarName <> AlfaBlanks then
  94.       begin
  95.         writeln(' Error in variable named: "',VarName);
  96.         VarName := AlfaBlanks;
  97.       end;
  98.     if ErrorsOnLine = 1 then
  99.       begin
  100.         writeln(' On output page: ', VAL[VPAGE]: 1,
  101.                 ' on output line: ', VAL[VOLNO]: 1, '.');
  102.         with otl do
  103.           if len > 1 then
  104.             begin
  105.               write('"');  WriteErrPAOC(lin,(len-1));
  106.               writeln('"');
  107.             end;
  108.         if DoInclFl then
  109.           begin write(' From include file '); WriteArg(InclName); i:=IncLNO;
  110.           end
  111.         else
  112.           begin write(' From input file '); WriteArg(InputName); i := ILNO;
  113.           end;
  114.         writeln(', on line ', i: 1, '.');
  115.         (* StgStack[0].StgEnd is first string *)
  116. {} {    writeln('     "', StgTable: StgStack[0].StgEnd,'"'); }
  117. { Turbo choked on the above, below is equivalent }
  118.         write  ('     "');
  119.         for i:= 1 to StgStack[0].StgEnd do write(StgTable[i]); writeln('"');
  120. { end of equivalent }
  121.       end;
  122.     writeln(' ': StartToken + 5, '^',ErrNum:1);
  123.     for i := TopOfStack downto 1 do
  124.       with StgStack[TopOfStack] do
  125.         if ActiveMacro <> nil then
  126.           writeln(' --> Within Macro: "', ActiveMacro^.nm: 10,'".')
  127.         else
  128.           writeln(' --> Within deferred macro.');
  129.     if ErrorsOnLine > 30 then
  130.       begin
  131.         writeln(' Too many errors on a line. Halting...');
  132.         {exit(program);}halt
  133.       end;
  134.   end;
  135.  
  136. function TestOk  (*  (BoolExp: Boolean; ErrNum: integer): Boolean  *);
  137.  
  138.   begin
  139.     TestOk := BoolExp;
  140.     if not BoolExp then
  141.       Error(ErrNum);
  142.   end;
  143.  
  144. PROCEDURE CLRTAB;
  145.  
  146.   var
  147.     i: integer;
  148.  
  149.   BEGIN FOR i := 1 TO TABMAX DO TABS[i] := 0; END (*CLRTAB*);
  150.  
  151. PROCEDURE SAVENV  (*  (VAR E: ENVIRON)  *);
  152.  
  153.   VAR
  154.                   I: INTEGER;
  155.  
  156.   BEGIN
  157.     WITH E DO
  158.       BEGIN
  159.         LM := VAL[VLM];   RM := VAL[VRM];   PM := PMAR;
  160.         PS := PARSPACE;   PT := PARTEST;   PR := PREL;   J := JUSTIT; 
  161.         F := FILL;   SP := VAL[VSP];
  162.         FOR I := 1 TO TABMAX DO TB[I] := TABS[I];   SG := SIGBL;
  163.         UN := UNDL;   Bl := Bold;
  164.       END
  165.   END (*SAVENV*);
  166.  
  167.  
  168. procedure PushText (*  (p: pmac)  *);
  169.   
  170.   begin
  171.     if TopOfStack = StackMax then
  172.       error(57)
  173.     else
  174.       begin
  175.         TopOfStack := TopOfStack + 1;
  176.         with StgStack[TopOfStack], p^ do
  177.           begin
  178.             ActiveMacro := p;
  179.             StgBegin := MacroBegin;
  180.             StgEnd := MacroEnd;
  181.             StgPosition := StgBegin;
  182.           end;
  183.       end;
  184.   end;
  185.   
  186.   
  187. PROCEDURE CLRLINE;
  188.  
  189.   var
  190.     LineIndex: integer;
  191.     
  192.   BEGIN
  193.     WITH OTL DO
  194.       BEGIN
  195.         FOR LineIndex := 1 TO VAL[VLM] DO
  196.           BEGIN LIN[LineIndex] := ' ';   OverLin[LineIndex] := ' ' END;
  197.         HasBoldPrinting := false;
  198.         HasOverPrinting := false;
  199.         HasUnderScore := false;
  200.         USflag := EmptyFlags; 
  201.         BoldFlag := EmptyFlags;
  202.         LEN := VAL[VLM];   JUST.NDX := 0;
  203.         SUP := FALSE;   DEFRB := 0;   EMPTY := TRUE;
  204.         CENTER := FALSE;   FORCE := FALSE;   BBAR := BB;
  205.       END
  206.   END (*CLRLINE*);
  207.  
  208. PROCEDURE SETSTD;
  209.  { Standard settings }
  210.   BEGIN
  211.     FLAG := NOT YES;   FLAGCAPS := NOT YES;   LOWER := YES;   ESCCHR := YES;
  212.     PERIOD := YES;   JUSTIT := YES;   UL := YES;   FILL := YES;
  213.     SIGBL := NOT YES;  
  214.     IF YES   THEN OPTBRKSET := BREAKSET   ELSE OPTBRKSET := [];
  215.   END (*SETSTD*);
  216.  
  217.  
  218. PROCEDURE RESENV  (*  (VAR E: ENVIRON)   *)  ;
  219.  
  220.   VAR
  221.                   I: INTEGER;
  222.  
  223.   BEGIN
  224.     WITH E DO
  225.       BEGIN
  226.         VAL[VLM] := LM;   VAL[VRM] := RM;   PMAR := PM;
  227.         PARSPACE := PS;   PARTEST := PT;   PREL := PR;   JUSTIT := J;
  228.         FILL := F;   VAL[VSP] := SP;
  229.         FOR I := 1 TO TABMAX DO TABS[I] := TB[I];   SIGBL := SG;
  230.         UNDL := UN;  Bold := Bl;
  231.       END
  232.   END (*RESENV*);
  233.  
  234.  
  235. PROCEDURE GETCUR;
  236.  
  237.   procedure GetInputLine(var f: text; var LnCounter: integer);
  238.   
  239.     var
  240.       achar: char;
  241.           i:integer;
  242.       
  243.     begin
  244.       LnCounter := LnCounter + 1;
  245.       with StgStack[0] do
  246.         begin
  247.           StgPosition := 1;
  248.           
  249.           (* Currentline is first string in string table *)
  250.  
  251.           i := 1;
  252.           while  not eoln(f) and (i <> linlen) do
  253.             begin
  254.               read(f, achar);
  255.               if achar < ' ' then
  256.                 StgTable[i] := ' '
  257.               else
  258.                 StgTable[i] := achar;
  259.               i := i + 1;
  260.             end;
  261.           
  262.           StgEnd := i;
  263.           StgTable[StgEnd] := ' ';
  264.            
  265.           if not eoln(f) and (StgEnd = linlen) then
  266.             begin
  267.               StartToken := StgEnd;
  268.               Error(53) (* Error - input line truncated *) 
  269.             end;
  270.         end;
  271.         
  272.       readln(f); {Turbo gets I/O error 99 here if no eof in document file }
  273.       StartToken := 1;
  274.     end;
  275.     
  276.   BEGIN
  277.     while (TopOfStack > 0) and 
  278.       (StgStack[TopOfStack].StgPosition >= StgStack[TopOfStack].StgEnd) do
  279.          TopOfStack := TopOfStack - 1       (* !!! should free *);
  280.     if TopOfStack = 0 then
  281.       begin
  282.         LineCount := LineCount + 1;
  283.         if DoInclFl then
  284.           IF EOF(inclfile) THEN
  285.             begin
  286.               close(inclfile);
  287.               DoInclFl := false;
  288.             end 
  289.           else
  290.             GetInputLine(inclfile, IncLno);
  291.             
  292.         if not DoInclFl then
  293.           if eof(infile) then
  294.             EOFINPUT := true
  295.           else
  296.             GetInputLine(InFile, ilno);
  297.       end;
  298.   END (*GETCUR*);
  299.         
  300.