DataMuseum.dk

Presents historical artifacts from the history of:

DANOSI

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DANOSI

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦9d23681d1⟧ TextFile

    Length: 45913 (0xb359)
    Types: TextFile
    Names: »INDENT.PAS«

Derivation

└─⟦e2123b2a1⟧ Bits:30010498 DVBS1.SW2103.src.1.8-1 Pascal TOOLS JTAS 1989-04-26 LEIF NIELSEN E.d.
    └─⟦this⟧ »INDENT.PAS« 

TextFile

      {[A=20,I=2,L=4,E=3,W=1-100] PASCFORM directive }\r
  PROGRAM indent;\r
      (* Indent Pascal programs, and also optionaly change keywords and variables to\r
      common case ( upper-case or lower-case ).\r
 \r
      Was originaly a RC8000 Pascal program. Changed to RTP86 Pascal by RC *)\r
      (*----------------------------------------------------------------------------\r
      Date.     Init. Vers. Explanation.\r
 \r
      1989-01-19 LEI  1.1  Changed to Turbo Pascal 5.0 by Leif Nielsen JTAS\r
      1989-03-22 LEI  1.2  New languages inserted.\r
      -----------------------------------------------------------------------------*)\r
 \r
      {$R+,S+ }\r
 \r
  USES\r
    Dos,\r
    DosUtil,\r
    Help,\r
    Param;\r
 \r
  CONST\r
    version: STRING = ('1.2');\r
 \r
    MaxParam  = 2;\r
    MaxOption = 8;\r
 \r
    ParamList : ARRAY[1..MaxParam] OF ParamRec =\r
     ((Kind:KnownFile; Defined:FALSE; KeyWord:'I'; NumVal:0; TextVal:'.RTP'),\r
      (Kind:FileType;  Defined:FALSE; KeyWord:'O'; NumVal:0; TextVal:''));\r
 \r
    OptionList : ARRAY[1..MaxOption] OF ParamRec =\r
     ((Kind:OnOff;    Defined:FALSE ;KeyWord:'NUMBERS'; NumVal:0; TextVal:'OFF'), (*line numbers*)\r
      (Kind:OnOff;    Defined:FALSE ;KeyWord:'MARK'; NumVal:0; TextVal:'OFF'), (*mark*)\r
      (Kind:OnOff;    Defined:FALSE ;KeyWord:'LIST'; NumVal:0; TextVal:'OFF'), (*list*)\r
      (Kind:TextType; Defined:FALSE ;KeyWord:'INDENT'; NumVal:0; TextVal:'ON' ), (*indent*)\r
      (Kind:TextType; Defined:FALSE ;KeyWord:'KEYWORDS'; NumVal:0; TextVal:'OWN'), (*keywords*)\r
      (Kind:TextType; Defined:FALSE ;KeyWord:'VARIABLE'; NumVal:0; TextVal:'OWN'), (*variables*)\r
      (Kind:TextType; Defined:FALSE ;KeyWord:'PASCAL'; NumVal:0; TextVal:'TURBO'), (*Pascal ver.*)\r
      (Kind:OnOff;    Defined:FALSE ;KeyWord:'XRAY'; NumVal:0; TextVal:'OFF') ); (*test*)\r
 \r
 \r
  CONST\r
    blank = ' ';\r
    lsize = 240; (* LONGEST LINE*)\r
    ssize = 90; (* DEEPEST STACK LOAD*)\r
    tsize = 77;   (* NO OF INTERESTING KEYWORDS *)\r
    toplength = 14;  (* longest identifier *)\r
 \r
    alfalength = 14;\r
    File_buff_size = 2048;\r
    key_ptrsize = 27 (* A..Z + 1 *);\r
    space = 32;\r
    ordoftab = 9;\r
 \r
    LF = 10;\r
    FF = 12;\r
    CR = 13;\r
 \r
 \r
  TYPE\r
    alfa = STRING[alfalength];\r
 \r
    options = (ind_, noind_, ownind_, lcid_, ucid_, ownid_,\r
               lckeyw_, uckeyw_, ownkeyw_ );\r
 \r
    language_type = ( Not_implemented, Turbo_pascal, Pascal_86,\r
                     Common_RTP, RTP_8000, RTP_286 );\r
 \r
    stackelement = RECORD\r
                      prior, indent: integer\r
                   END;\r
 \r
    tablelement = RECORD\r
                     txt_str: alfa;\r
                     p1, p2, spacing: integer\r
                  END;\r
 \r
 \r
  VAR\r
    outpfile, inpfile: STRING;\r
    inp, outp: text;\r
    I_buff, O_buff: ARRAY[1..File_buff_size] OF byte;\r
 \r
 \r
    eol: boolean;   (** false until END-OF-LINE is met **)\r
 \r
    alfanum: SET OF char; (*HOLDS SET OF ALPHANUMERIC SYMBOLS *)\r
    dummy_line: STRING;\r
    line: STRING[lsize];    (* LINE LEFT JUSTIFIED*)\r
    line_after_ff: STRING[lsize]; (* Store rest of line read *)\r
    line_too_long: integer; (* count number of too long lines *)\r
    c_pos: integer;         (* POINTER TO CURRENT CHARACTER*)\r
    lastpos: integer;     (* LAST POSITION ON CURRENT LINE*)\r
    linepos: integer;     (* POINTER TO LAST USED PRINTPOS*)\r
    lineno: integer;     (* LINE NUMBER OF CURRENT LINE *)\r
    current, ch: char;     (* CH IS FIRST CHAR ON NEXT LINE*)\r
    fresh: boolean;       (* LINE READ, NOT YET PRINTED*)\r
    margin: integer;      (* HANDLES INDENTION*)\r
    oldpos: integer;      (* USED TO HOLD POSITIONS IN RECORDS*)\r
    max_keyw_index,\r
    keyw_index: integer;\r
    state, old_state: (spublic, declare, statement);\r
    skiperror, formfeed, myind,\r
    noind, fewends: boolean;\r
    linesmode, markmode: boolean;\r
 \r
    idmode,\r
    varmode,\r
    reskeymode: byte;\r
 \r
    language: language_type;\r
 \r
    test_requested,       (* governed by parameter option *)\r
 \r
    skiptekst: boolean;   (*USED IN SHIFTCASE*)\r
    skipchar: char;       (*USED IN SHIFTCASE *)\r
 \r
    markstack: ARRAY[-10..lsize] OF integer;\r
    markpointer, nextmark: integer;\r
 \r
 \r
 \r
    stack: ARRAY[0..ssize] OF stackelement;\r
    top: integer;                (* STACK POINTER *)\r
    stacktop: stackelement; (* HOLDS STACK[TOP]*)\r
    PascalTable: ARRAY[1..TSize] OF tablelement;\r
    key_ptr: ARRAY[ 65..91 { 'A'..'Z'+1 }] OF integer;\r
 \r
 \r
    NoRecord: integer; (* gives the number of records.\r
                       inc. by 1 on keyword 'Record'. Dec by one on\r
                       end record *)\r
 \r
 \r
    InWith: boolean;  (* true if passing With ... do *)\r
 \r
 \r
 \r
    PROCEDURE printline; FORWARD;\r
 \r
    PROCEDURE semicolon; FORWARD;\r
 \r
    PROCEDURE skip(skipend: char); FORWARD;\r
 \r
 \r
    FUNCTION eof_inp: boolean;\r
    BEGIN (* Cheat, because of problem with FF. See Readline procedure\r
            for more information *)\r
      IF NOT formfeed  THEN\r
        eof_inp := eof(inp)\r
      ELSE\r
        eof_inp := false;\r
    END (* Special EOF(INP) made for Turbo Pascal edition *);\r
 \r
 \r
    PROCEDURE error(e_txt1: STRING);\r
    BEGIN\r
      writeln(Output);\r
      writeln(Output, '*** INDENT ERROR ***', e_txt1);\r
 \r
      halt;  (** i.e.: EXIT program **)\r
    END (*error*);\r
 \r
 \r
    PROCEDURE initialize_1;\r
    VAR\r
      i, j: integer;\r
      prev_keylgth,\r
      k_ix,\r
      index: integer;\r
 \r
      PROCEDURE init_P_table(a: alfa; a1, a2, a3: integer);\r
      BEGIN\r
        WITH pascaltable[index] DO\r
          BEGIN\r
            txt_str := a;\r
            p1 := a1;\r
            p2 := a2;\r
            spacing := a3;\r
          END;\r
        max_keyw_index := index;\r
        index := index+1;\r
      END;\r
 \r
    BEGIN\r
 \r
      eol := false;\r
      alfanum := ['0'..'9', 'A'..'Z', '_'];\r
      linepos := 0;\r
      lineno := 1;\r
      line_too_long := 0;\r
      fewends := false;\r
      skiptekst := false;\r
      skiperror := false;\r
      markpointer := 0;\r
 \r
      Margin := 3;\r
 \r
      stack[0].prior := 10; (* bottom never unstack *)\r
      stack[0].indent := 0;\r
      stack[1].indent := 2;\r
      stack[1].prior := 2;\r
      stacktop := stack[1];\r
      top := 1;\r
      state := declare;\r
      old_state := statement;\r
      NoRecord := 0;\r
      InWith := false;\r
 \r
      formfeed := false;\r
 \r
 \r
        (** Searching in this table is done by means of "binary search" on\r
        the keywords. For this reason the keywords has to be put into the table\r
        in alphabetical order!!!     **)\r
 \r
      index := 1;\r
 \r
      init_P_table('ABSOLUTE      ', -1, 0, 0);\r
      init_P_table('AND           ', -1, 0, 0);\r
      init_P_table('ARRAY         ', -1, 0, 0);\r
      init_P_table('AS            ', -1, 0, 0);\r
      init_P_table('BEGIN         ',  4, 4, 2);\r
      init_P_table('BEGINBODY     ',  4, 4, 2);\r
      init_P_table('CASE          ',  0, 4, 2);\r
      init_P_table('CHANNEL       ', -1, 0, 0);\r
      init_P_table('CONST         ',  3, 2, 2);\r
      init_P_table('CONTINUELOOP  ', -1, 0, 0);\r
      init_P_table('DIV           ', -1, 0, 0);\r
      init_P_table('DO            ', -1, 0, 0);\r
      init_P_table('DOWNTO        ', -1, 0, 0);\r
      init_P_table('ELSE          ',  6, 5, 2);\r
      init_P_table('END           ',  5, 0, 0);\r
      init_P_table('ENDLOOP       ',  5, 0, 0);\r
      init_P_table('EXIT          ', -1, 0, 0);\r
      init_P_table('EXITLOOP      ', -1, 0, 0);\r
      init_P_table('EXPORT        ', -1, 0, 0);\r
      init_P_table('EXTERNAL      ',  4, 0, 0);\r
      init_P_table('FILE          ', -1, 0, 0);\r
      init_P_table('FOR           ',  0, 5, 2);\r
      init_P_table('FORWARD       ',  4, 0, 0);\r
      init_P_table('FUNCTION      ',  0, 2, 2);\r
      init_P_table('GETSWITCH     ', -1, 0, 0);\r
      init_P_table('GOTO          ', -1, 0, 0);\r
      init_P_table('IF            ',  0, 5, 2);\r
      init_P_table('IMPLEMENTATION',  3, 2, 2);\r
      init_P_table('IN            ', -1, 0, 0);\r
      init_P_table('INCLUDE       ', -1, 0, 0);\r
      init_P_table('INLINE        ', -1, 0, 0);\r
      init_P_table('INSPECT       ', -1, 0, 0);\r
      init_P_table('INTERFACE     ', -1, 0, 0);\r
      init_P_table('INTERRUPT     ', -1, 0, 0);\r
      init_P_table('LABEL         ',  3, 2, 2);\r
      init_P_table('LOCK          ',  0, 5, 2);\r
      init_P_table('LOCKBUF       ',  0, 5, 2);\r
      init_P_table('LOCKDATA      ',  0, 5, 2);\r
      init_P_table('LOCKMES       ',  0, 5, 2);\r
      init_P_table('LOOP          ',  0, 4, 2);\r
      init_P_table('MOD           ', -1, 0, 0);\r
      init_P_table('MODULE        ',  3, 2, 2);\r
      init_P_table('NIL           ', -1, 0, 0);\r
      init_P_table('NOT           ', -1, 0, 0);\r
      init_P_table('OF            ', -1, 0, 0);\r
      init_P_table('OPENROUTINE   ',  4, 0, 0);\r
      init_P_table('OR            ', -1, 0, 0);\r
      init_P_table('OTHERWISE     ',  0, 5, 2);\r
      init_P_table('PACKED        ', -1, 0, 0);\r
      init_P_table('POOL          ', -1, 0, 0);\r
      init_P_table('PREFIX        ', -1, 0, 0);\r
      init_P_table('PRIVATE       ',  3, 2, 2);\r
      init_P_table('PROCEDURE     ',  0, 2, 2);\r
      init_P_table('PROCESS       ',  3, 2, 2);\r
      init_P_table('PROGRAM       ',  3, 2, 2);\r
      init_P_table('PUBLIC        ',  3, 2, 2);\r
      init_P_table('RECORD        ',  0, 2, 3);\r
      init_P_table('REGION        ',  0, 5, 2);\r
      init_P_table('REPEAT        ',  0, 4, 2);\r
      init_P_table('SET           ', -1, 0, 0);\r
      init_P_table('SHARED        ',  3, 2, 2);\r
      init_P_table('SHIFT         ', -1, 0, 0);\r
      init_P_table('SHL           ', -1, 0, 0);\r
      init_P_table('SHR           ', -1, 0, 0);\r
      init_P_table('STRING        ', -1, 0, 0);\r
      init_P_table('THEN          ', -1, 0, 0);\r
      init_P_table('TO            ', -1, 0, 0);\r
      init_P_table('TYPE          ',  3, 2, 2);\r
      init_P_table('TYPESIZE      ', -1, 0, 0);\r
      init_P_table('UNIT          ',  3, 2, 2);\r
      init_P_table('UNTIL         ',  5, 0, 0);\r
      init_P_table('USES          ',  3, 2, 2);\r
      init_P_table('VAR           ',  3, 2, 2);\r
      init_P_table('VARSIZE       ', -1, 0, 0);\r
      init_P_table('WHILE         ',  0, 5, 2);\r
      init_P_table('WITH          ',  0, 5, 2);\r
      init_P_table('XOR           ', -1, 0, 0);\r
 \r
    END;  (** initialize_1 **)\r
 \r
    PROCEDURE initialize_2;\r
    VAR\r
      i, last_i, j: integer;\r
      index: integer;\r
 \r
    BEGIN\r
 \r
        {  Compress key table, to remove unused entries }\r
      index := 0;\r
      FOR i := 1 TO max_keyw_index DO\r
        BEGIN\r
          IF PascalTable[i].txt_str[1] <> ' ' THEN\r
            BEGIN\r
              index := index + 1;\r
              PascalTable[index] := PascalTable[i];\r
              IF test_requested THEN\r
                writeln(' Key-word ', index:4, ' ', PascalTable[index].txt_str );\r
            END;\r
        END;\r
      max_keyw_index := index;\r
      PascalTable[index+1].txt_str := 'zzz' { terminator for seach };\r
 \r
 \r
        { initialize KEY_PTR array, used to speed search }\r
 \r
      last_i := ord('A') -1;\r
 \r
      FOR index := 1 TO max_keyw_index DO\r
        BEGIN\r
          IF ord( pascalTable[index].txt_str[1] ) > last_i THEN\r
            BEGIN\r
              i :=  ord( pascalTable[index].txt_str[1] ) ;\r
              FOR j := last_i + 1 TO i DO\r
                key_ptr[j] := index;\r
 \r
              last_i := i;\r
            END;\r
 \r
        END;\r
 \r
      FOR j := last_i+1 TO ord('Z')+1 DO\r
        key_ptr[j] := max_keyw_index+1;\r
 \r
      IF test_requested THEN\r
        FOR i := ord('A') TO ord('Z')+1 DO\r
        BEGIN\r
          write(Output, 'k_ix', i: 3, ' ', chr(i), ' ');\r
          write(Output, 'contents: ', key_ptr[i]: 3);\r
          writeln(Output);\r
        END;\r
 \r
    END {initialize_2};\r
 \r
    PROCEDURE remove_key_word( key : alfa);\r
    VAR\r
      hi, lo, try: integer;\r
 \r
    BEGIN\r
      lo := 1;\r
      hi := max_keyw_index;\r
      REPEAT\r
        try := (lo+hi)DIV 2;\r
        WITH PascalTable[try] DO\r
          BEGIN\r
            IF key >= txt_str THEN lo := try+1;\r
            IF key <= txt_str THEN hi := try-1;\r
          END;\r
      UNTIL lo > hi;\r
 \r
      WITH PascalTable[try] DO\r
        BEGIN\r
          IF txt_str <> key THEN\r
            error('Internal table error ');\r
          txt_str := ' ';\r
        END;\r
 \r
    END {remove_key_word};\r
 \r
 \r
    PROCEDURE Turbo_pascal_indent;\r
    VAR\r
      step: integer;\r
 \r
    BEGIN\r
 \r
      language := Turbo_pascal;\r
 \r
        (* remove non Turbo Pascal 4.0 or 5.0  key words from table *)\r
 \r
 \r
      remove_key_word('AS            ');\r
      remove_key_word('BEGINBODY     ');\r
      remove_key_word('CHANNEL       ');\r
      remove_key_word('CONTINUELOOP  ');\r
      remove_key_word('ENDLOOP       ');\r
      remove_key_word('EXIT          ');\r
      remove_key_word('EXITLOOP      ');\r
      remove_key_word('EXPORT        ');\r
      remove_key_word('GETSWITCH     ');\r
      remove_key_word('INCLUDE       ');\r
      remove_key_word('INSPECT       ');\r
      remove_key_word('LOCK          ');\r
      remove_key_word('LOCKBUF       ');\r
      remove_key_word('LOCKDATA      ');\r
      remove_key_word('LOCKMES       ');\r
      remove_key_word('LOOP          ');\r
      remove_key_word('MODULE        ');\r
      remove_key_word('OPENROUTINE   ');\r
      remove_key_word('OTHERWISE     ');\r
      remove_key_word('POOL          ');\r
      remove_key_word('PREFIX        ');\r
      remove_key_word('PRIVATE       ');\r
      remove_key_word('PROCESS       ');\r
      remove_key_word('PUBLIC        ');\r
      remove_key_word('REGION        ');\r
      remove_key_word('SHARED        ');\r
      remove_key_word('SHIFT         ');\r
      remove_key_word('TYPESIZE      ');\r
      remove_key_word('VARSIZE       ');\r
 \r
    END; (* Turbo_pascal_indent *)\r
 \r
 \r
 \r
    PROCEDURE Pascal_86_indent;\r
    VAR\r
      step: integer;\r
 \r
    BEGIN\r
 \r
      language := Pascal_86;\r
 \r
        (* remove non PASCAL86 key words from table *)\r
 \r
      remove_key_word('ABSOLUTE      ');\r
      remove_key_word('AS            ');\r
      remove_key_word('BEGINBODY     ');\r
      remove_key_word('CHANNEL       ');\r
      remove_key_word('CONTINUELOOP  ');\r
      remove_key_word('ENDLOOP       ');\r
      remove_key_word('EXIT          ');\r
      remove_key_word('EXITLOOP      ');\r
      remove_key_word('EXPORT        ');\r
      remove_key_word('GETSWITCH     ');\r
      remove_key_word('IMPLEMENTATION');\r
      remove_key_word('INCLUDE       ');\r
      remove_key_word('INLINE        ');\r
      remove_key_word('INSPECT       ');\r
      remove_key_word('INTERFACE     ');\r
      remove_key_word('INTERRUPT     ');\r
      remove_key_word('LOCK          ');\r
      remove_key_word('LOCKBUF       ');\r
      remove_key_word('LOCKDATA      ');\r
      remove_key_word('LOCKMES       ');\r
      remove_key_word('LOOP          ');\r
      remove_key_word('MODULE        ');\r
      remove_key_word('OPENROUTINE   ');\r
      remove_key_word('POOL          ');\r
      remove_key_word('PREFIX        ');\r
      remove_key_word('PROCESS       ');\r
      remove_key_word('REGION        ');\r
      remove_key_word('SHARED        ');\r
      remove_key_word('SHIFT         ');\r
      remove_key_word('SHL           ');\r
      remove_key_word('SHR           ');\r
      remove_key_word('STRING        ');\r
      remove_key_word('TYPESIZE      ');\r
      remove_key_word('UNIT          ');\r
      remove_key_word('USES          ');\r
      remove_key_word('VARSIZE       ');\r
      remove_key_word('XOR           ');\r
 \r
    END; (* Pascal_86_indent *)\r
 \r
 \r
 \r
    PROCEDURE Common_RTP_indent;\r
    VAR\r
      step: integer;\r
 \r
    BEGIN\r
 \r
      language := Common_RTP;\r
 \r
        (* remove non Common_RTP key words from table *)\r
 \r
      remove_key_word('ABSOLUTE      ');\r
      remove_key_word('BEGINBODY     ');\r
      remove_key_word('CHANNEL       ');\r
      remove_key_word('EXPORT        ');\r
      remove_key_word('FILE          ');\r
      remove_key_word('IMPLEMENTATION');\r
      remove_key_word('INCLUDE       ');\r
      remove_key_word('INLINE        ');\r
      remove_key_word('INTERFACE     ');\r
      remove_key_word('INTERRUPT     ');\r
      remove_key_word('LABEL         ');\r
      remove_key_word('LOCK          ');\r
      remove_key_word('LOCKMES       ');\r
      remove_key_word('MODULE        ');\r
      remove_key_word('NIL           ');\r
      remove_key_word('OPENROUTINE   ');\r
      remove_key_word('POOL          ');\r
      remove_key_word('PREFIX        ');\r
      remove_key_word('PRIVATE       ');\r
      remove_key_word('PROCESS       ');\r
      remove_key_word('PUBLIC        ');\r
      remove_key_word('SHL           ');\r
      remove_key_word('SHR           ');\r
      remove_key_word('STRING        ');\r
      remove_key_word('UNIT          ');\r
      remove_key_word('USES          ');\r
 \r
    END; (* Common_RTP_indent *)\r
 \r
 \r
 \r
    PROCEDURE RTP_8000_indent;\r
    VAR\r
      step: integer;\r
 \r
    BEGIN\r
 \r
      language := RTP_8000;\r
 \r
        (* remove non RTP-8000 key words from table *)\r
 \r
      remove_key_word('ABSOLUTE      ');\r
      remove_key_word('FILE          ');\r
      remove_key_word('GETSWITCH     ');\r
      remove_key_word('IMPLEMENTATION');\r
      remove_key_word('INLINE        ');\r
      remove_key_word('INSPECT       ');\r
      remove_key_word('INTERFACE     ');\r
      remove_key_word('INTERRUPT     ');\r
      remove_key_word('LOCKBUF       ');\r
      remove_key_word('LOCKDATA      ');\r
      remove_key_word('MODULE        ');\r
      remove_key_word('NIL           ');\r
      remove_key_word('OPENROUTINE   ');\r
      remove_key_word('PRIVATE       ');\r
      remove_key_word('PROGRAM       ');\r
      remove_key_word('PUBLIC        ');\r
      remove_key_word('REGION        ');\r
      remove_key_word('SHARED        ');\r
      remove_key_word('SHIFT         ');\r
      remove_key_word('SHL           ');\r
      remove_key_word('SHR           ');\r
      remove_key_word('STRING        ');\r
      remove_key_word('TYPESIZE      ');\r
      remove_key_word('UNIT          ');\r
      remove_key_word('USES          ');\r
      remove_key_word('VARSIZE       ');\r
      remove_key_word('XOR           ');\r
 \r
    END; (* RTP_8000_indent *)\r
 \r
 \r
    PROCEDURE RTP_86_indent;\r
    VAR\r
      step: integer;\r
 \r
    BEGIN\r
 \r
      language := RTP_286;\r
 \r
        (* remove non RTP-86 key words from table *)\r
 \r
      remove_key_word('ABSOLUTE      ');\r
      remove_key_word('BEGINBODY     ');\r
      remove_key_word('CHANNEL       ');\r
      remove_key_word('EXPORT        ');\r
      remove_key_word('FILE          ');\r
      remove_key_word('GETSWITCH     ');\r
      remove_key_word('IMPLEMENTATION');\r
      remove_key_word('INCLUDE       ');\r
      remove_key_word('INLINE        ');\r
      remove_key_word('INTERFACE     ');\r
      remove_key_word('INTERRUPT     ');\r
      remove_key_word('LABEL         ');\r
      remove_key_word('MODULE        ');\r
      remove_key_word('NIL           ');\r
      remove_key_word('OPENROUTINE   ');\r
      remove_key_word('POOL          ');\r
      remove_key_word('PREFIX        ');\r
      remove_key_word('PRIVATE       ');\r
      remove_key_word('PROCESS       ');\r
      remove_key_word('PUBLIC        ');\r
      remove_key_word('SHL           ');\r
      remove_key_word('SHR           ');\r
      remove_key_word('STRING        ');\r
      remove_key_word('TYPESIZE      ');\r
      remove_key_word('UNIT          ');\r
      remove_key_word('USES          ');\r
      remove_key_word('VARSIZE       ');\r
 \r
    END; (* RTP_86_indent *)\r
 \r
 \r
    PROCEDURE read_callparameters;\r
    VAR\r
      i, k: integer;\r
      key_text: STRING;\r
      dir_st: DirStr;\r
      name_st: NameStr;\r
      ext_st: ExtStr;\r
 \r
    BEGIN\r
 \r
 \r
      IF ( ParamCount = 0 ) OR\r
        ( ParamCount >= 1) AND ( ParamStr(1 ) = '?') THEN\r
        BEGIN { The user must give at least the input file as parameter }\r
          Showhelp;\r
          Halt;\r
        END;\r
 \r
      assign(Output, '');\r
      rewrite(Output);\r
      Writeln(' INDENT (v.', version, ')' );\r
 \r
 \r
      GetParams( Paramlist, MaxParam, OptionList, MaxOption);\r
 \r
      linesmode := OptionList[1].TextVal = 'ON';\r
 \r
      markmode :=  OptionList[2].TextVal = 'ON';\r
 \r
      IF OptionList[3].TextVal = 'ON' THEN\r
        BEGIN\r
          linesmode := true;\r
          markmode := true;\r
        END;\r
 \r
      CASE\r
        MatchOptionStr( OptionList[4].TextVal, 4, 'ON  OFF OWN ') OF\r
 \r
        -1: Error(' Option not unique ');\r
 \r
        0: Error(' Option not valid ');\r
 \r
        1: BEGIN\r
            myind := false;\r
            noind := false;\r
          END;\r
 \r
        2: BEGIN\r
            myind := false;\r
            noind := true;\r
          END;\r
 \r
        3: BEGIN\r
            myind := true;\r
            noind := true;\r
          END;\r
      END (*case *);\r
 \r
      CASE\r
        MatchOptionStr( OptionList[5].TextVal, 4, 'LC  UC  OWN ') OF\r
 \r
        -1: Error(' Option not unique ');\r
 \r
        0: Error(' Option not valid ');\r
 \r
        1: reskeymode := ord(lckeyw_);\r
 \r
        2: reskeymode := ord(uckeyw_);\r
 \r
        3: reskeymode := ord(ownkeyw_);\r
 \r
      END (*case *);\r
 \r
      CASE\r
        MatchOptionStr( OptionList[6].TextVal, 4, 'LC  UC  OWN ') OF\r
 \r
        -1: Error(' Option not unique ');\r
 \r
        0: Error(' Option not valid ');\r
 \r
        1: idmode := ord(lcid_);\r
 \r
        2: idmode := ord(ucid_);\r
 \r
        3: idmode := ord(ownid_);\r
 \r
      END (*case *);\r
 \r
 \r
      CASE  MatchOptionStr( OptionList[7].TextVal, 9,\r
        'TURBO    PASCAL86 C-RTP    RTP8000  RTP286   ') OF\r
 \r
        -1: Error(' Option not unique ');\r
 \r
        0: Error(' Option not valid ');\r
 \r
        1: Turbo_pascal_indent;\r
 \r
        2: Pascal_86_indent;\r
 \r
        3: Common_RTP_indent;\r
 \r
        4: RTP_8000_indent;\r
 \r
        5: RTP_86_indent;\r
 \r
      END (*case *);\r
 \r
 \r
      test_requested :=  OptionList[8].TextVal = 'ON';\r
 \r
 \r
      inpfile := ParamList[1].TextVal;\r
 \r
      IF ParamList[2].Defined THEN\r
        outpfile := ParamList[2].TextVal\r
      ELSE\r
        BEGIN\r
          FSplit(inpfile, dir_st, name_st, ext_st);\r
          IF UpperStr(ext_st) = 'IND' THEN\r
            Error(' FileName Clash');\r
          outpfile := dir_st + name_st + '.IND';\r
        END;\r
 \r
      IF FileExist(outpfile) THEN\r
        BEGIN\r
            (* query to user*)\r
          write(Output, outpfile:1);\r
          write(Output, ', already exists, OVERWRITE (Y/N)?');\r
          assign(Input, '');\r
          reset(Input);\r
          read(Input, ch);\r
          IF NOT ((ch = 'y') OR (ch = 'Y')) THEN\r
            halt; (*i.e.: exit program*)\r
        END;\r
 \r
      assign(inp, inpfile);\r
      SetTextBuf(inp, I_buff);\r
      reset(inp);\r
      assign(outp, outpfile);\r
      SetTextBuf(outp, O_buff);\r
      rewrite(outp);\r
 \r
    END (* READ_CALLPARAMS *);\r
 \r
 \r
    PROCEDURE writeeol;\r
    BEGIN\r
      linepos := 0;\r
      IF formfeed THEN\r
        BEGIN\r
          write(outp, chr(FF));\r
        END\r
      ELSE\r
        writeln(outp);\r
    END;\r
 \r
 \r
 \r
    PROCEDURE pushmark(c_pos: integer);\r
    BEGIN\r
      IF markpointer<lsize THEN\r
        markpointer := markpointer+1;\r
      markstack[markpointer] := c_pos;\r
      IF test_requested THEN\r
        Writeln(outp,  'M+',markpointer:3, c_pos:3, ' ');\r
    END;\r
 \r
 \r
 \r
    PROCEDURE popmark;\r
    BEGIN\r
      markstack[markpointer] := 0;\r
      IF markpointer>0 THEN\r
        markpointer := markpointer-1;\r
      IF test_requested THEN\r
        Writeln(outp,  'M-',markpointer:3, ' ');\r
    END;\r
 \r
 \r
 \r
    FUNCTION resword( name: alfa; VAR index: integer): boolean;\r
    VAR\r
      hi, lo, i: integer;\r
 \r
    BEGIN\r
 \r
      i := ord(name[1]);\r
      lo := key_ptr[i];\r
      hi := key_ptr[i+1];\r
      IF hi = lo THEN\r
        resword := false\r
      ELSE\r
        BEGIN\r
          REPEAT\r
            index := (lo+hi) DIV 2;\r
            WITH PascalTable[index] DO\r
              BEGIN\r
                IF name >= txt_str THEN lo := index+1;\r
                IF name <= txt_str THEN hi := index-1;\r
              END;\r
          UNTIL lo > hi;\r
 \r
          resword :=  PascalTable[index].txt_str = name;\r
        END;\r
 \r
    END {resword};\r
 \r
 \r
    PROCEDURE changeletters(lowercase: boolean;c_pos: integer);\r
    VAR\r
      i, add: integer;\r
      ch, a, z: char;\r
 \r
    BEGIN\r
      IF lowercase THEN\r
        BEGIN\r
          add := 32;\r
          a := 'A';\r
          z := 'Z';\r
        END\r
      ELSE\r
        BEGIN\r
          add := -32;\r
          a := 'a';\r
          z := 'z';\r
        END;\r
      i := c_pos;\r
      REPEAT\r
        ch := line[i];\r
        IF (ch >= a) AND (ch <= z) THEN line[i] := chr(ord(ch)+add);\r
        i := i-1;\r
      UNTIL NOT((ch IN alfanum) OR ((ch >= 'a') AND (ch <= 'z'))) OR (i = 0);\r
    END;\r
 \r
 \r
    PROCEDURE shiftcase;\r
        (*CHANGE IDENTIFIERS TO LC OR UC AND KEYWORDS TO LC OR UC *)\r
    VAR\r
      k, c_pos: integer;\r
      key: alfa;\r
      current: char;\r
 \r
    BEGIN\r
      c_pos := 1;\r
      current := line[c_pos];\r
      WHILE c_pos <= lastpos DO\r
        BEGIN\r
          IF skiptekst THEN\r
            BEGIN\r
              IF current = skipchar THEN\r
                BEGIN\r
                  IF ((skipchar = '*') AND (line[c_pos+1] = ')')) OR (skipchar <> '*') THEN\r
                    skiptekst := false;\r
                END;\r
            END\r
          ELSE\r
            BEGIN\r
              IF (current >= 'a') AND (current <= 'z') THEN current := chr(ord(current)-32);\r
              CASE current OF\r
 \r
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',\r
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',\r
                'U', 'V', 'W', 'X', 'Y', 'Z':\r
                  BEGIN\r
                    k := 1;\r
                    key := '              ';\r
                    REPEAT (*PICK UP IDENTIFIER *)\r
                      IF k <= alfalength THEN\r
                        BEGIN\r
                          key[k] := current;\r
                          k := k+1;\r
                        END;\r
                      c_pos := c_pos+1;\r
                      current := line[c_pos];\r
                      IF (current >= 'a') AND (current <= 'z') THEN\r
                        current := chr(ord(current)-32);\r
                    UNTIL NOT (current IN alfanum);\r
                    c_pos := c_pos-1;\r
                    IF resword( key, keyw_index) THEN\r
                      BEGIN\r
                        IF reskeymode <> ord(ownkeyw_) THEN\r
                          changeletters(reskeymode = ord(lckeyw_) , c_pos)\r
                      END\r
                    ELSE\r
                      IF idmode <> ord(ownid_) THEN\r
                        changeletters(idmode = ord(lcid_), c_pos);\r
 \r
                  END;\r
 \r
                '0', '1', '2', '3', '4',\r
                '5', '6', '7', '8', '9':\r
                  BEGIN\r
                    REPEAT c_pos := c_pos+1 UNTIL NOT (line[c_pos] IN ['0'..'9']);\r
                    IF line[c_pos] = '(' THEN\r
                      c_pos := c_pos-1; (*MIGHT BE START OF COMMENT *)\r
                  END;\r
 \r
                '(':\r
                  IF line[c_pos+1] = '*' THEN\r
                    BEGIN\r
                      skiptekst := true;\r
                      skipchar := '*';\r
                      c_pos := c_pos+1;\r
                    END;\r
 \r
                '<':\r
                  IF (language <> Turbo_pascal )\r
                    AND ( line[c_pos+1] = '*') THEN\r
                    BEGIN\r
                      skiptekst := true;\r
                      skipchar := '*';\r
                      c_pos := c_pos+1;\r
                    END;\r
 \r
                '''', '"':\r
                  BEGIN\r
                    skiptekst := true;\r
                    skipchar := current;\r
                  END;\r
 \r
                '-':\r
                  IF (language <> Turbo_pascal )\r
                    AND ( line[ c_pos + 1 ] = '-') THEN  (* RTP86-comment *)\r
                    BEGIN\r
 \r
                      c_pos := lastpos; (*i.e.: skipp rest of line *)\r
                    END;\r
 \r
                '{':  (* TurboPascal comment string *)\r
                  IF language = turbo_pascal THEN\r
                    BEGIN\r
                      skiptekst := true;\r
                      skipchar := '}';\r
                    END;\r
 \r
              ELSE ;\r
            END;\r
        END;\r
      c_pos := c_pos+1;\r
      current := line[c_pos];\r
    END;\r
  END;\r
 \r
 \r
  PROCEDURE pushindent(prioritet, indention: integer);\r
      (*STACK ONE LEVEL OF INDENTION *)\r
  BEGIN\r
    WITH stacktop DO\r
      BEGIN\r
        IF top < ssize THEN top := top+1;\r
        prior := prioritet;\r
        indent := indention-oldpos;\r
        oldpos := c_pos;\r
        margin := margin+indent;\r
        stack[top] := stacktop;\r
      END;\r
  END;\r
 \r
 \r
  PROCEDURE popindent;\r
      (*REMOVE ONE LEVEL OF INDENTION FROM STACK*)\r
  BEGIN\r
    IF top > 0 THEN top := top-1;\r
    margin := margin-stacktop.indent;\r
    IF oldpos > 0 THEN oldpos := oldpos-stacktop.indent;\r
    stacktop := stack[top];\r
  END;\r
 \r
 \r
  PROCEDURE pasidentifier;\r
      (* CHECKS IF IDENTIFIER IS A KEYWORD WITH EFFECT\r
      ON INDENTION. IF SO, INDENTION IS ADJUSTED*)\r
      (* AS ONLY ONE KEYWORD MAY AFFECT INDENTION -\r
      CURRENT LINE MUST BE PRINTED OUT AS SOON AS THE\r
      FIRST KEYWORD WITH EFFECT ON INDENTION IS FOUND. *)\r
  VAR a: ARRAY[0..alfalength] OF char; key: alfa;\r
    k, hi, lo, try: integer;\r
 \r
  BEGIN\r
    IF key_ptr[ord(current)] <> key_ptr[ord(current)+1] THEN\r
      k := 0\r
    ELSE k := toplength + 1;\r
 \r
    REPEAT\r
      IF k < toplength THEN\r
        a[ k ] := current;\r
      k := k + 1;\r
      c_pos := c_pos+1; current := line[c_pos];\r
      IF (current >= 'a') AND (current <= 'z') THEN\r
        current  :=  chr(ord(current)-32);\r
    UNTIL NOT(current IN alfanum) ;\r
 \r
    IF (k <= toplength) AND (k > 1) THEN\r
      BEGIN (* MIGHT BE INTERESTING KEYWORD*)\r
        FOR hi := k TO alfalength DO a[ hi ] := blank;\r
        key := copy(a, 1, alfalength);\r
        IF resword( key, keyw_index ) THEN\r
          WITH PascalTable[keyw_index] DO\r
            BEGIN\r
              IF test_requested THEN\r
                Writeln(outp, 'ResW ', p1:4, p2:4 , ' ', Key);\r
              IF Key = 'DO            ' THEN InWith := false;\r
              IF p1 <> -1 THEN\r
                WITH stacktop DO\r
                  BEGIN (* KEYWORD AFFECTING MARGIN IS FOUND *)\r
                    old_state := state;\r
 \r
                    IF (txt_str = 'END           ') OR (txt_str = 'UNTIL         ')\r
                      OR (txt_str = 'OTHERWISE     ') OR (txt_str = 'ENDLOOP       ') THEN semicolon\r
                    ELSE\r
                      IF (txt_str = 'PUBLIC        ') OR\r
                        (txt_str = 'UNIT          ') THEN state := spublic\r
                    ELSE IF (txt_str = 'PROGRAM       ') OR (txt_str = 'PROCESS       ')\r
                        OR (txt_str = 'PRIVATE       ')  OR (txt_str = 'IMPLEMENTATION') THEN\r
                        state := declare\r
                    ELSE IF (txt_str = 'TYPE          ') OR (txt_str = 'CONST         ') OR\r
                        (txt_str = 'VAR           ') OR (txt_str = 'SHARED        ')\r
                        THEN\r
                        BEGIN\r
                          IF state <> spublic THEN state := declare;\r
                        END\r
                      ELSE IF txt_str = 'BEGIN         ' THEN state := statement;\r
 \r
                    IF test_requested  AND ( state <> old_state ) THEN\r
                      Writeln(outp, ' New State = ', ord(state), ' old = ', ord(old_state) );\r
 \r
                      (* SEE IF UNSTACKING*)\r
                    IF prior < p1 THEN\r
                      BEGIN\r
                        IF (txt_str = 'END           ') AND (Norecord > 0) THEN\r
                          BEGIN (*SPECIAL HANDLING OF RECORD *)\r
                            margin := margin-3;\r
                            IF fresh THEN printline;\r
                            margin := margin+3;\r
                            IF oldpos > 0 THEN oldpos := oldpos-indent;\r
                            Norecord := NoRecord - 1;\r
                          END;\r
                        margin := margin-indent;\r
                        top := top-1; stacktop := stack[top];\r
                      END\r
 \r
                    ELSE\r
                      IF ((State = sPublic) AND ((txt_str = 'PROCEDURE     ') OR\r
                        (txt_str = 'FUNCTION      '))) THEN\r
                        BEGIN\r
                            (* unstack *)\r
                          margin := margin - indent;\r
                          top := top - 1; stacktop := stack[top];\r
                        END;\r
                    IF fresh THEN printline; (** SEE COMMENT IN BEGINNING OF PROCEDURE!! **)\r
 \r
                      (* SEE IF STACKING*)\r
                      (** IF p2 = 0 THEN ACTUAL KEYWORD DOES NOT CAUSE\r
                      FURTHER INDENTION IN THE FOLLOWING LINES **)\r
                    IF p2>0 THEN\r
                      IF (txt_str = 'CASE          ') AND (state <> statement) THEN\r
                        BEGIN margin := margin+spacing; indent := indent+spacing;\r
                          stack[top] := stacktop;\r
                        END\r
                      ELSE\r
                        BEGIN\r
                          IF top < ssize THEN top := top+1;\r
                          prior := p2;\r
                          IF txt_str = 'RECORD        ' THEN\r
                            BEGIN\r
                              indent := spacing+c_pos-7-oldpos;\r
                              oldpos := spacing+c_pos-7;\r
                              NoRecord := NoRecord + 1;\r
                            END\r
                          ELSE indent := spacing;\r
                          margin := margin+indent;\r
                          stack[top] := stacktop\r
                        END;\r
                    IF (    txt_str = 'FUNCTION      ') OR (txt_str = 'PROGRAM       ')\r
                      OR (txt_str = 'PROCEDURE     ') OR (txt_str = 'PROCESS       ')\r
                      THEN skip(';')\r
                    ELSE\r
                      IF( txt_str = 'WITH          ') THEN\r
                        BEGIN\r
                          InWith := true;\r
                          OldPos := Spacing;\r
                        END\r
                      ELSE\r
                        IF ( txt_str = 'END           ' ) AND\r
                          ( current = '.' ) THEN\r
                          BEGIN\r
                            IF fresh THEN Printline;\r
                            WHILE NOT eof(inp) DO\r
                                (** Copy from input to output-file **)\r
                              BEGIN\r
                                readln(inp, dummy_line);\r
                                writeln(outp, dummy_line);\r
                              END;\r
                          END;\r
 \r
                    IF markmode THEN\r
                      BEGIN\r
                        IF (key = 'BEGIN         ') OR (key = 'REPEAT        ') OR\r
                          ( key = 'LOOP          ') OR\r
                          ((key = 'CASE          ') AND (state = statement))\r
                          OR (key = 'RECORD        ')\r
                          THEN pushmark(margin+1 - spacing)\r
                        ELSE\r
                          IF (key = 'END           ') OR (key = 'UNTIL         ')\r
                            OR (key = 'ENDLOOP       ')\r
                            THEN popmark;\r
                      END;\r
                  END; (* taking care of interesting keywords *)\r
            END; (* if resword ... *)\r
      END (* K IN [2..alfalength] *)\r
  END (* IDENTIFIER*);\r
 \r
 \r
  PROCEDURE semicolon;\r
      (* UNSTACK UNTIL STACKTOP DOES NOT CONTAIN IF OR ELSE*)\r
  BEGIN\r
 \r
    WITH stacktop DO\r
      WHILE prior = 5 DO\r
        BEGIN\r
          margin := margin-indent;\r
          top := top-1;\r
          stacktop := stack[top];\r
          IF test_requested THEN\r
            writeln(outp, '; ->', top:4,\r
            stacktop.indent:4, stacktop.prior:4 );\r
        END\r
  END (* SEMICOLON*);\r
 \r
 \r
 \r
  PROCEDURE printline;\r
  VAR c_pos: integer;\r
  BEGIN\r
 \r
    fresh := false  (* Flag that LINE is PRINTED*);\r
 \r
    IF test_requested THEN\r
      BEGIN\r
        Write(outp, margin:4,\r
          top:4, stack[top].indent:4, stack[top].prior:4);\r
        Write(outp, ' ');\r
      END;\r
    IF linesmode THEN\r
      BEGIN (* PRINT LINE NUMBER *)\r
        write(outp, lineno: 5, ': ');\r
        lineno := lineno+1;\r
      END;\r
    IF NOT noind THEN write(outp, blank);\r
      (*** ***) IF (noind <> true) THEN\r
      IF NOT (lastpos = 0) OR markmode THEN\r
          (*AN EMPTY LINE IS NOT SPACED*)\r
        BEGIN nextmark := 1;\r
          FOR c_pos := 1 TO margin DO\r
              (** "margin" number of blanks are printed out. -\r
              Perhabs including a "mark".   **)\r
            BEGIN\r
              IF markmode THEN\r
                BEGIN IF c_pos = markstack[nextmark] THEN\r
                    BEGIN write(outp, '!');\r
                      nextmark := nextmark+1;\r
                    END\r
                  ELSE\r
                    write(outp, blank);\r
                END\r
              ELSE write(outp, blank);\r
            END; (* markmode *)\r
 \r
        END; (* for *)\r
    IF lastpos <> 0 THEN\r
      write(outp, copy(line, 1, lastpos) );\r
    writeeol;\r
  END; (*PRINTLINE*)\r
 \r
 \r
 \r
  PROCEDURE readline;\r
  VAR c_pos: integer;\r
 \r
  BEGIN\r
    lastpos := 0; oldpos := 0;\r
    fresh := true (* New LINE is READ, NOT printed Yet*);\r
    ch := blank;\r
 \r
    IF formfeed THEN\r
      BEGIN (* Move the rest of line kept in line_after_ff *)\r
        line := copy(line_after_ff, 1, length(line_after_ff) );\r
        formfeed := false;\r
      END\r
    ELSE\r
      BEGIN\r
        readln(inp, line);\r
        IF length(line) = lsize THEN\r
          BEGIN\r
            line_too_long := line_too_long + 1;\r
            line := copy(line, 1, lsize-1); (* neaded for terminating space *)\r
          END;\r
      END;\r
 \r
    c_pos := Pos(chr(FF), line) (* Test whether FF in line *);\r
    IF c_pos > 0 THEN\r
      BEGIN\r
          (* Save the line part before FF in line. Save the line part after\r
          the last ff ( if more than one ) in line_after_ff, and remember\r
          the fact that something is keept by setting formfeed = true *)\r
 \r
        formfeed := true;\r
        lastpos := c_pos - 1;\r
 \r
        WHILE ( line[c_pos] = chr(FF) ) AND ( c_pos <= length(line) ) DO\r
          c_pos := c_pos + 1;\r
 \r
        line_after_ff := copy(line, c_pos, 255);\r
        line := copy(line, 1, lastpos);\r
      END; (* if FF *)\r
 \r
    c_pos := 1;\r
 \r
    IF myind = false THEN\r
        (* Preceeding blanks and tabs in line are skipped - if wanted. *)\r
      WHILE ((line[c_pos] = blank) OR (line[c_pos] = chr(ordoftab)))\r
        AND (c_pos <= length(line) ) AND (line[c_pos] <> chr(FF))\r
        DO c_pos := c_pos + 1;\r
 \r
    lastpos := length(line);\r
    WHILE  ( line[lastpos] = blank ) AND ( lastpos >= 1 ) DO\r
      lastpos := lastpos - 1;\r
      (* Now "lastpos" points at the last character <> blank in the line *)\r
 \r
    line := copy( line, c_pos, lastpos) + ' ' (*ensure blank in line*);\r
    lastpos := length(line) - 1;\r
 \r
    IF (idmode <> ord(ownid_)) OR (reskeymode <> ord(ownkeyw_)) THEN shiftcase;\r
 \r
  END (* READLINE*);\r
 \r
  PROCEDURE skip;\r
  LABEL 11; (* exit in case of eof *)\r
  BEGIN\r
    IF fresh THEN printline;\r
 \r
    REPEAT\r
      IF c_pos >= lastpos THEN\r
        IF eof_inp THEN\r
          BEGIN\r
            skiperror := true;\r
            GOTO 11;\r
          END\r
        ELSE\r
          BEGIN\r
            readline;\r
            printline;\r
            c_pos := 0;\r
          END;\r
      c_pos := c_pos+1; current := line[c_pos];\r
      IF ((skipend = ';') OR (skipend = ')')) AND\r
        (current = '(') AND (line[c_pos+1] <> '*') THEN\r
        REPEAT (*SKIP PARAMETERLIST *)\r
          skip(')');\r
          c_pos := c_pos + 1; current := line[c_pos];\r
        UNTIL line[c_pos-2] <> '*';\r
    UNTIL current = skipend;\r
    IF skipend = ':' THEN\r
      BEGIN\r
        c_pos := c_pos + 1; current := line[c_pos];\r
      END;\r
    11:\r
  END;\r
 \r
    (*****     ----------     *****)\r
 \r
 \r
    (* MAIN PROGRAM*)\r
  BEGIN\r
 \r
    initialize_1;\r
 \r
    read_callparameters;\r
 \r
    initialize_2;\r
 \r
    IF markmode THEN\r
      BEGIN\r
        FOR c_pos := -1 TO lsize DO\r
          markstack[c_pos] := 0;\r
      END;\r
 \r
 \r
    WHILE  NOT eof_inp  DO\r
      BEGIN\r
        readline;\r
        c_pos := 1; current := line[c_pos];\r
 \r
        WHILE c_pos <= lastpos DO\r
          BEGIN\r
            IF (current >= 'a') AND (current <= 'z') THEN\r
              current := chr(ord(current)-32);\r
            IF  (current IN ['A'..'Z'])  THEN\r
              pasidentifier\r
            ELSE\r
              BEGIN\r
                CASE current OF\r
 \r
                  ';': semicolon;\r
 \r
                  '(':\r
                    BEGIN\r
                      IF line[c_pos+1] = '*' THEN\r
                        BEGIN\r
                          IF c_pos = 1 (* i.e. in front of the line *) THEN\r
                            pushindent(4, 2)  (* indent 2 more positions *)\r
                          ELSE\r
                            pushindent(4, c_pos - 1); (* no further indention caused by comment *)\r
                          REPEAT skip('*') UNTIL line[c_pos+1] = ')';\r
                          c_pos := c_pos+1;\r
                          popindent;\r
                        END\r
                      ELSE\r
                        IF state <> statement THEN\r
                          pushindent(4, c_pos); (* INDENTION OF SCALAR TYPES AND VARIANT FIELDS IN RECORDS *)\r
                    END;\r
 \r
                  '<':\r
                    BEGIN\r
                      IF (language <> turbo_pascal )\r
                        AND ( line[c_pos+1] = '*') THEN\r
                        BEGIN\r
                          IF c_pos = 1 (* i.e. in front of the line *) THEN\r
                            pushindent(4, 2)  (* indent 2 more positions *)\r
                          ELSE\r
                            pushindent(4, c_pos - 1); (* no further indention caused by comment *)\r
                          REPEAT skip('*') UNTIL line[c_pos+1] = '>';\r
                          c_pos := c_pos+1;\r
                          popindent;\r
                        END\r
                      ELSE\r
                        IF state <> statement THEN\r
                          skip('>') (* value initialization of array *)\r
                    END;\r
 \r
                  ')':\r
                    BEGIN\r
                      IF state <> statement THEN\r
                        BEGIN(*UNSTACK INDENTION OF SCALAR TYPES AND VARIANT PARTS IN RECORDS*)\r
                          popindent;\r
                        END;\r
                    END;\r
 \r
                  ':':\r
                    IF InWith = false THEN\r
                      IF line[c_pos+1] <> ' = ' THEN\r
                        IF state = statement THEN\r
                          BEGIN (*INDENTION OF CASELABELS *)\r
                            semicolon; (*POP PREVIOUS STACKED CASELABELS AND IFSTATEMENTS *)\r
                            pushindent(5, oldpos + 2);\r
                          END;\r
 \r
                  '-':\r
                    IF (language <> turbo_pascal )\r
                      AND ( line[ c_pos + 1 ] = '-') THEN (* RTP86 comment - skip to eol *)\r
                      IF c_pos = 1 (* i.e. in front of the line *) THEN\r
                        BEGIN\r
                          pushindent(4, 2);  (* indent 2 more positions *)\r
                          printline;\r
                          popindent;\r
                          c_pos := lastpos;\r
                        END\r
                      ELSE\r
                        c_pos := lastpos;  (** i.e.: skip rest of line **)\r
                    (*** end RTP86 comment ***)\r
 \r
 \r
                  '''': skip(''''); (* text string *)\r
 \r
                  '"': skip('"'); (* text string *)\r
 \r
                  '{': (* Turbo Pascal Text string *)\r
                    IF language = turbo_pascal THEN\r
                      BEGIN\r
                        IF c_pos = 1 (* i.e. in front of the line *) THEN\r
                          pushindent(4, 2)  (* indent 2 more positions *)\r
                        ELSE\r
                          pushindent(4, c_pos - 1); (* no further indention caused by comment *)\r
                        skip('}');\r
                        popindent;\r
                      END;\r
 \r
                  '$': BEGIN\r
                      oldpos := margin;\r
                      margin := 1;\r
                      IF fresh THEN printline;\r
                      margin := oldpos;\r
                      c_pos := lastpos;\r
                    END;\r
 \r
                ELSE\r
                  BEGIN (* ALL OTHER ARE BLIND*)\r
                  END;\r
 \r
              END;\r
            c_pos := c_pos+1; current := line[c_pos];\r
          END;\r
        IF fresh THEN printline\r
      END (* SCAN OF LINE*);\r
    IF fresh THEN printline;\r
  END (* SCAN OF INPUT FILE *);\r
  IF fewends THEN writeln(Output, ' ** WARNING, END(S) MISSING.');\r
  IF skiperror THEN\r
    writeln(Output, ' ** premature end of file  ');\r
  IF line_too_long > 0 THEN\r
    writeln(Output, line_too_long:1, ' lines truncated after ',\r
    lsize:1,' characters.');\r
 \r
  Close(inp);\r
  Close(outp);\r
  END.\r