home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / MURUTIL.ZIP / CURLY.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-11-26  |  4.9 KB  |  191 lines

  1. PROGRAM CURLY;
  2.  
  3. {  Curly-Bracket Processor:
  4.  
  5.    This Turbo Pascal program scans Pascal programs  and  translates  all
  6.    comments to curly-bracket notation.
  7.  
  8.    This translation conforms to the requirements of Paragraphs 6.1.8 and
  9.    6.1.9 of  ANSI/IEEE770X3.97-1983,  "American National Standard Pascal
  10.    Computer Programming Language".
  11.  
  12.    Program by Harry M. Murphy.  11 November 1986.  }
  13.  
  14.   CONST
  15.         LENSPEC = 65;
  16.         LINELEN = 255;
  17.  
  18.   TYPE
  19.        FILESPEC = STRING[LENSPEC];
  20.        TEXTLINE = STRING[LINELEN];
  21.  
  22.   VAR
  23.       CR     : CHAR;
  24.       INCOMM : BOOLEAN;
  25.       INQUOT : BOOLEAN;
  26.       INP    : TEXT[2048];
  27.       INPNAME: FILESPEC;
  28.       LINE   : TEXTLINE;
  29.       NLINE  : INTEGER;
  30.       OUT    : TEXT[2048];
  31.       OUTNAME: FILESPEC;
  32.  
  33.  
  34. PROCEDURE GETINPFIL(VAR INPNAME: FILESPEC);
  35.  
  36. {  This file gets an input file, either as the first parameter on the
  37.    command line or by requesting it from the user.
  38.  
  39.    Procedure by Harry M. Murphy,  22 February 1986.  }
  40.  
  41.   VAR
  42.       L: INTEGER;
  43.  
  44.   BEGIN
  45.     IF PARAMCOUNT = 0
  46.       THEN
  47.         BEGIN
  48.           WRITE('Input  file: ');
  49.           READLN(INPNAME)
  50.         END
  51.       ELSE
  52.         INPNAME := PARAMSTR(1);
  53.     FOR L:=1 TO LENGTH(INPNAME) DO INPNAME[L] := UPCASE(INPNAME[L]);
  54.     ASSIGN(INP,INPNAME);
  55.     {$I-} RESET(INP); {$I+}
  56.     IF IORESULT <> 0
  57.       THEN
  58.         BEGIN
  59.           CLOSE(INP);
  60.           WRITELN('ERROR!  Can''t find file ',INPNAME,'!');
  61.           HALT
  62.         END;
  63.   END {Procedure GETINPFIL};
  64.  
  65.  
  66. PROCEDURE GETOUTFIL(VAR OUTNAME: FILESPEC);
  67.  
  68. {  This file gets an output file, either as the second parameter on the
  69.    command line or by requesting it from the user.
  70.  
  71.    Procedure by Harry M. Murphy,  22 February 1986.  }
  72.  
  73.  VAR
  74.      L: INTEGER;
  75.  
  76.   BEGIN
  77.     IF PARAMCOUNT < 2
  78.       THEN
  79.         BEGIN
  80.           WRITE('Output file: ');
  81.           READLN(OUTNAME)
  82.         END
  83.       ELSE
  84.         OUTNAME := PARAMSTR(2);
  85.     FOR L:=1 TO LENGTH(OUTNAME) DO OUTNAME[L] := UPCASE(OUTNAME[L]);
  86.     ASSIGN(OUT,OUTNAME);
  87.     {$I-} REWRITE(OUT); {$I-}
  88.     IF IORESULT <> 0
  89.       THEN
  90.         BEGIN
  91.           CLOSE(OUT);
  92.           WRITELN('ERROR!  Can''t open ',OUTNAME,'!');
  93.           HALT
  94.         END
  95.   END {Procedure GETOUTFIL};
  96.  
  97.  
  98.   PROCEDURE SCAN(VAR LINE: TEXTLINE);
  99.  
  100.   {  This procedure scans a Pascal line and converts all comments to
  101.      Curly-Bracket notation.  }
  102.  
  103.   VAR
  104.       CH : CHAR;
  105.       K  : 0..LINELEN;
  106.       L  : 0..LINELEN;
  107.       LL : 0..LINELEN;
  108.  
  109.   BEGIN  { Procedure SCAN }
  110.     LL := LENGTH(LINE);
  111.     LINE[0] := CHR(0);
  112.     WHILE LINE[LL] = ' ' DO LL := LL-1;
  113.     LINE[0] := CHR(LL);
  114.     K := 0;
  115.     L := 0;
  116.     WHILE L < LL DO
  117.       BEGIN
  118.         L := L+1;
  119.         CH := LINE[L];
  120.         IF CH IN ['{','}','(','*']
  121.           THEN
  122.             CASE CH OF
  123.               '{': IF NOT INQUOT
  124.                      THEN INCOMM := TRUE;
  125.               '}': IF NOT INQUOT
  126.                      THEN INCOMM := FALSE;
  127.               '(': IF NOT (INCOMM OR INQUOT)
  128.                      THEN
  129.                        IF L < LL
  130.                          THEN
  131.                            IF LINE[L+1] = '*'
  132.                              THEN
  133.                                BEGIN
  134.                                  L := L+1;
  135.                                  CH := '{';
  136.                                  INCOMM := TRUE;
  137.                                  IF L < LL
  138.                                    THEN
  139.                                      IF LINE[L+1] = ')'
  140.                                        THEN LINE[L+1] := '}'
  141.                                END;
  142.               '*': IF INCOMM
  143.                      THEN
  144.                        IF L < LL
  145.                          THEN
  146.                            IF LINE[L+1] = ')'
  147.                              THEN
  148.                                BEGIN
  149.                                  L := L+1;
  150.                                  CH := '}';
  151.                                  INCOMM := FALSE
  152.                                END
  153.             END { CASE }
  154.           ELSE
  155.             IF CH = CHR(39)  { CHR(39) = "'".}
  156.               THEN
  157.                 IF NOT INCOMM
  158.                   THEN
  159.                     INQUOT := NOT INQUOT;
  160.         K := K+1;
  161.         LINE[K] := CH
  162.       END {WHILE};
  163.     LINE[0] := CHR(K)
  164.   END { Procedure SCAN };
  165.  
  166.  
  167.   BEGIN {Program CURLY}
  168.     LOWVIDEO;
  169.     CR := CHR(13);
  170.     GETINPFIL(INPNAME);
  171.     GETOUTFIL(OUTNAME);
  172.     WRITELN('CURLY processing ',INPNAME,' to ',OUTNAME);
  173.     INCOMM := FALSE;
  174.     INQUOT := FALSE;
  175.     NLINE := 0;
  176.     WHILE NOT EOF(INP) DO
  177.       BEGIN
  178.         READLN(INP,LINE);
  179.         SCAN(LINE);
  180.         WRITELN(OUT,LINE);
  181.         NLINE := NLINE+1;
  182.         IF (NLINE MOD 100)=0
  183.           THEN
  184.             WRITE(NLINE:5,' lines processed.',CR)
  185.       END;
  186.     CLOSE(INP);
  187.     CLOSE(OUT);
  188.     WRITELN(NLINE:5,' lines processed.');
  189.     WRITELN('CURLY is done.')
  190. END.
  191.