home *** CD-ROM | disk | FTP | other *** search
- PROGRAM PasCaps2;
-
- { This program converts the lower case Pascal identifiers in a source }
- { code file to upper case. }
- { Jeff Firestone. June, 1984. }
-
- { Included Turbo Pascal version 2 additions to identifier table. Also added }
- { "IBM Goodies" (ie. Sound, Color, Windows, etc.). Also added I/O error }
- { handling if file not found. Other minor changes. }
- { - Loren Cook 12/29/84 }
-
-
- CONST
- Idents1 = ' ABSOLUTE ADDR AND ARCTAN ARRAY ASSIGN AUX AUXIN AUXINPTR AUXOUT AUXOUTPTR ';
- Idents2 = ' BEGIN BLOCKREAD BLOCKWRITE BOOLEAN BUFLEN BYTE CASE CHAIN CHAR CHR CLOSE ';
- Idents3 = ' CLREOL CLRSCR CON CONCAT CONIN CONINPTR CONOUT CONST CONST CONSTPTR COPY ';
- Idents4 = ' COS CRTEXIT CRTINIT CSEG DELAY DELETE DELLINE DISPOSE DIV DO DOWNTO DRAW ';
- Idents5 = ' DSEG ELSE END EOF EOLN ERASE EXECUTE EXP EXTERNAL FALSE FILE FILEPOS ';
- Idents6 = ' FILESIZE FILLCHAR FLUSH FOR FORWARD FRAC FREEMEM FUNCTION GETMEM GOTO ';
- Idents7 = ' GOTOXY GRAPHBACKGROUND GRAPHCOLORMODE GRAPHMODE GRAPHWINDOW HALT HEAPPTR HI ';
- Idents8 = ' HIGHVIDEO HIRES HIRESCOLOR FIN INLINE INPUT INSERT INSLINE INT INTEGER ';
- Idents9 = ' INTR IORESULT KBD KEYPRESSED LABEL LENGTH LN LO LONGFILEPOS LONGFILESIZE ';
- Idents10= ' LONGSEEK LST LSTOUT LSTOUTPTR MARK MAXAVAIL MAXINT MEM MEMAVAIL MEMW MOD ';
- Idents11= ' MOVE MSDOS NEW NIL NORMVIDEO NOSOUND NOT ODD OF OFS OR ORD OUTPUT OVERLAY ';
- Idents12= ' PACKED PALETTE PI PLOT PORT PORTW POS PRED PROCEDURE PROGRAM PTR RANDOM ';
- Idents13= ' RANDOMIZE READ READLN REAL RECORD RELEASE RENAME REPEAT RESET REWRITE ';
- Idents14 =' ROUND SEEK SEG SET SHL SHR SIN SIZEOF SOUND SQR SQRT SSEG STR STRING ';
- Idents15 =' SUCC SWAP TEXT TEXTBACKGROUND TEXTCOLOR TEXTMODE THEN TO TRM TRUE TRUNC ';
- Idents16 =' TYPE UNTIL UPCASE USR USRIN USRINPTR USROUT USROUTPTR VAL VAR WHEREX ';
- Idents17 =' WHEREY WHILE WINDOW WITH WRITE WRITELN XOR ';
- OpenBracket = '{';
- CloseBracket = '}';
- OpenParen = '(';
- CloseParen = ')';
- Null = '';
-
- TYPE
- Caps = SET OF 'A'..'Z';
- Nums = SET OF '0'..'9';
- Strng = STRING[255];
-
- VAR
- pntr, LineNum : INTEGER;
- ProgLine, Name : STRING[255];
- Word : STRING[100];
- f1, f2 : TEXT;
- Identifier: SET OF CHAR;
-
-
- PROCEDURE UpShift(VAR S: Strng);
- BEGIN
- INLINE
- ($C4/$BE/S/ { LES DI,S[BP] }
- $26/$8A/$0D/ { MOV CL,ES:[DI] }
- $FE/$C1/ { INC CL }
- $FE/$C9/ { L1: DEC CL }
- $74/$13/ { JZ L2 }
- $47/ { INC DI }
- $26/$80/$3D/$61/ { CMP ES:BYTE PRT [DI],'a' }
- $72/$F5/ { JB L1 }
- $26/$80/$3D/$7A/ { CMP ES:BYTE PTR [DI],'z' }
- $77/$EF/ { JA L1 }
- $26/$80/$2D/$20/ { SUB ES:BYTE PRT [DI],20H }
- $EB/$E9 { JMP SHORT L1 }
- { L2: });
- END;
-
-
- PROCEDURE Greeting;
- BEGIN
- GOTOXY(23,1);
- WRITELN('CAPITALIZE PASCAL IDENTIFIERS');
- GOTOXY(27,2);WRITELN('version 2 - 12/29/84');WRITELN;
- WRITELN('This program reads a Pascal source file and capitalizes all the identifiers');
- WRITELN('in that file. The results are output to a file the users specifies.');
- WRITELN;
- WRITELN('The output file tends to be easier to read than one in which a hodge-podge');
- WRITELN('of capitalized and lower case identifiers co-reside. It is the prefered');
- WRITELN('format for Pascal source code.');
- WRITELN;
- WRITELN('With this utility, you can type all your source code in lower case and then');
- WRITELN('convert it to standard format later. This manner of writing Pascal saves you');
- WRITELN('considerable time and bother.');
- WRITELN; WRITELN; WRITELN;
- END;
-
-
- PROCEDURE OpenFiles;
- BEGIN
- WRITE('What is the name of the source code file (RETURN to end) : ');
- READLN(name);
- IF (POS('.', name) = 0) THEN name:= name + '.pas';
- ASSIGN(f1, name);
- {$I-} RESET(f1) {$I+};
- IF IORESULT <> 0 THEN BEGIN
- WRITELN; GOTOXY(25,20);
- WRITELN('File ',name,' not found.');
- HALT;
- END;
- WRITE('Where do you want to output to be sent (RETURN for Screen) : ');
- READLN(name); UpShift(Name);
- IF LENGTH(name) = 0 THEN name:= 'CON:';
- ASSIGN(f2, name);
- REWRITE(f2);
- WRITELN; WRITELN('Capitalizing...'); WRITELN;
- END;
-
-
- PROCEDURE GetWord;
- VAR
- TmpWord,TmpWrd : STRING[255];
- GotIdent : INTEGER;
- BEGIN
- Word:= '';
- WHILE (UPCASE(ProgLine[pntr]) IN Identifier) AND
- (pntr <= LENGTH(ProgLine)) DO
- BEGIN
- Word:= Word + ProgLine[pntr];
- pntr:= pntr + 1;
- END;
-
- TmpWrd:= Word; UpShift(TmpWrd);
- TmpWord:= ' ' + TmpWrd + ' ';
- GotIdent:= POS(TmpWord, Idents1) + POS(TmpWord, Idents2) +
- POS(TmpWord, Idents3) + POS(TmpWord, Idents4) +
- POS(TmpWord, Idents5) + POS(TmpWord, Idents6) +
- POS(TmpWord, Idents7) + POS(TmpWord, Idents8) +
- POS(TmpWord, Idents9) + POS(TmpWord, Idents10) +
- POS(TmpWord, Idents11) + POS(TmpWord, Idents12) +
- POS(TmpWord, Idents13) + POS(TmpWord, Idents14) +
- POS(TmpWord, Idents15) + POS(TmpWord, Idents16) +
- POS(TmpWord, Idents17);
- IF GotIdent > 0 THEN
- WRITE(f2, TmpWrd)
- ELSE
- WRITE(f2, Word);
- END;
-
-
- PROCEDURE ScanTill(SearchChar: CHAR);
- BEGIN
- REPEAT
- WRITE(f2, ProgLine[pntr]);
- pntr:= pntr + 1;
- IF pntr > LENGTH(ProgLine) THEN
- BEGIN
- WRITELN(f2);
- READLN(f1, ProgLine);
- pntr:= 1;
- END;
- UNTIL (ProgLine[pntr] = SearchChar) OR EOF(f1);
- WRITE(f2, ProgLine[pntr]);
- pntr:= pntr + 1;
- END;
-
-
- PROCEDURE Convert;
- BEGIN
- LineNum:= 0;
- WHILE NOT EOF(f1) DO
- BEGIN
- pntr:= 1;
- READLN(f1, ProgLine);
- IF LENGTH(ProgLine) > 0 THEN
- BEGIN
- REPEAT
- CASE UPCASE(ProgLine[pntr]) OF
- 'A'..'Z', '0'..'9', '_' : GetWord;
- OpenBracket : ScanTill(CloseBracket);
- ELSE
- IF ProgLine[pntr] = CHR(39) THEN
- ScanTill(CHR(39))
- ELSE
- BEGIN
- WRITE(f2, ProgLine[pntr]);
- pntr:= pntr + 1;
- END;
- END; { Case UpCase }
- UNTIL (pntr > LENGTH(ProgLine));
- WRITELN(f2);
- IF Name <> 'CON:' THEN
- BEGIN
- GOTOXY(4, 21);
- WRITE(LineNum);
- LineNum:= LineNum + 1;
- END
- END;
- IF LENGTH(ProgLine) = 0 THEN WRITELN(f2);
- END; { WHILE }
- CLOSE(f1); CLOSE(f2);
- END;
-
- BEGIN
- Identifier:= ['A'..'Z', '0'..'9', '_'];
- Greeting;
- OpenFiles;
- Convert;
- END.
-