home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol021 / entry.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  5.3 KB  |  200 lines

  1. PROGRAM CREATE_ENTRY_FOR_EXTERNALDECLARATIONS;
  2. {                            by
  3.                       Robert H. Harsch
  4.                      ph: (916) 487-2216
  5.              2362 American River Dr, Suite 311
  6.                    Sacramento, Ca. 95825.
  7.                     All rights reserved.        }
  8.  
  9. { only the first 6 characters are significant }
  10.  
  11. CONST    $ENTRY_KEY='{@';  { string we look for to pick up entry
  12.             name and insert into file name.ZZZ }
  13.  
  14.     $MAIN_PROGRAM_BEGIN='L99'; { string to look for to stop
  15.             program.  Nothing is copied beyond
  16.             this point to file name.ZZZ }
  17.  
  18. TYPE
  19.     $STRING0= STRING 0;
  20.     $STRING32= STRING 80;
  21.     $STRING255= STRING 255;
  22.     BYTE= 0..255;
  23.  
  24.     SYM_LINK= ^SYM_TYPE; { symbol (entry points) linked }
  25.     SYM_TYPE= RECORD
  26.             $SYM: $STRING32;
  27.             PTR: SYM_LINK
  28.         END;
  29.  
  30. VAR
  31.     INFILE,OUTFILE: TEXT;
  32.     $SYMBOL, $LINE: $STRING255;
  33.     $CH, $TAB: CHAR;
  34.     K,I: INTEGER;
  35.     LOWERCASE, IDSTART, IDENTIFIER: SET OF CHAR;
  36.     PROGRAM_DONE, BADCHAR, PREV_DEFN, FOUND_ENTRY: BOOLEAN;
  37.     SYM_DEFN_ROOT: SYM_LINK;
  38.     UPPERCASE: ARRAY['a'..'z'] OF 'A'..'Z';
  39.  
  40.  
  41. FUNCTION LENGTH(X: $STRING255): INTEGER; EXTERNAL;
  42. FUNCTION INDEX(X,Y: $STRING255): INTEGER; EXTERNAL;
  43. PROCEDURE SETLENGTH(VAR X: $STRING0; Y: INTEGER); EXTERNAL;
  44.  
  45.  
  46.  
  47. PROCEDURE GET_FILE_NAME_FROM_COMMAND_LINE(VAR $INF: $STRING32);
  48. VAR    I: INTEGER;
  49.  
  50. FUNCTION PEEK(ADDR: INTEGER): BYTE;
  51.     TYPE    CONTENTS= PACKED RECORD
  52.                 BYT: BYTE { byte in memory }
  53.             END; { of record }
  54.         FORM=(INTEGR,ADDRESS);
  55.         REFERENCE= RECORD
  56.             CASE FORM OF
  57.                 INTEGR:  (I: INTEGER);
  58.                 ADDRESS: (P: ^CONTENTS)
  59.             END;
  60.  
  61.     VAR    TEMP: REFERENCE;
  62.  
  63.     BEGIN { of function peek }
  64.         TEMP.I:= ADDR;
  65.         PEEK:= TEMP.P^.BYT
  66.     END; { of function peek }
  67.  
  68.     BEGIN { of procedure GET_FILE_NAME_FROM_COMMAND_LINE }
  69.     SETLENGTH($INF,0);
  70.     FOR I:= 129 TO 128 + PEEK(128) DO
  71.             APPEND( $INF, CHR(PEEK(I)) )
  72.     END; { of procedure GET_FILE_NAME_FROM_COMMAND_LINE }
  73.  
  74.  
  75.  
  76. PROCEDURE OPENFILES;
  77. CONST    $M1= 'Input file (without entry points): ';
  78.     $M2= 'Output file (with entry points): ';
  79. VAR    $FILENAME, $NAME_EXT: $STRING32;
  80.     $CR : CHAR; { carriage return }
  81.     BEGIN
  82.         $CR:= CHR(13); { carriage return }
  83.         GET_FILE_NAME_FROM_COMMAND_LINE($FILENAME);
  84.         $NAME_EXT:= $FILENAME;
  85.         APPEND($NAME_EXT, '.SRC');
  86.         APPEND($NAME_EXT,$CR);    { see note #3 of
  87.                 hot news, filenames passed to
  88.                 rewrite or reset must be
  89.                 deleted with a carriage return}
  90.         RESET($NAME_EXT, INFILE);
  91.         WRITELN($M1, $NAME_EXT);
  92.         $NAME_EXT:= $FILENAME;
  93.         APPEND($NAME_EXT, '.ZZZ');
  94.         APPEND($NAME_EXT,$CR);    { see note #3 of
  95.                 hot news, filenames passed to
  96.                 rewrite or reset must be
  97.                 deleted with a carriage return}
  98.         REWRITE($NAME_EXT, OUTFILE);
  99.         WRITELN($M2, $NAME_EXT);
  100.     END; { of procedure openfiles }
  101.  
  102.  
  103.  
  104. PROCEDURE WRITEOUT(VAR $SYMBOL: $STRING32;
  105.             PREV_DEFN, BADCHAR: BOOLEAN);
  106. CONST    $MSG1= 'Error, symbol previously defined';
  107.     $MSG2= 'Error, "#" or "_" character in symbol defined';
  108. VAR    $TAB: CHAR;
  109.     SYM_NODE: SYM_LINK;
  110.     BEGIN
  111.         $TAB:= CHR(9);
  112.         WRITELN(OUTFILE,$TAB,'ENTRY',$TAB, $SYMBOL);
  113.         WRITELN(OUTFILE,$SYMBOL,':');
  114.  
  115.         { write info to screen }
  116.         WRITELN;
  117.         WRITELN('Entry symbol found:');
  118.         WRITELN($TAB,'ENTRY',$TAB, $SYMBOL);
  119.         WRITELN($SYMBOL,':');
  120.         IF PREV_DEFN THEN
  121.             WRITELN($MSG1);
  122.         IF BADCHAR THEN
  123.             WRITELN($MSG2);
  124.  
  125.         { insert new symbol into link list }
  126.         NEW(SYM_NODE);
  127.         SYM_NODE^.$SYM:= $SYMBOL;
  128.         SYM_NODE^.PTR:= SYM_DEFN_ROOT;
  129.         SYM_DEFN_ROOT:= SYM_NODE;
  130.     END; { of procedure writeout }
  131.  
  132.  
  133.  
  134. PROCEDURE WAS_$SYMBOL_PREVIOUSLY_DEFN(
  135.         VAR $SYMBOL: $STRING32;
  136.         VAR PREV_DEFN: BOOLEAN);
  137. VAR    SYM_NODE: SYM_LINK;
  138.     BEGIN
  139.         SYM_NODE:= SYM_DEFN_ROOT;
  140.         PREV_DEFN:= FALSE;
  141.         WHILE (SYM_NODE <> NIL) AND NOT PREV_DEFN DO
  142.             WITH SYM_NODE^ DO
  143.                 IF $SYM = $SYMBOL
  144.                     THEN PREV_DEFN:= TRUE
  145.                     ELSE SYM_NODE:= PTR;
  146.     END; { of procedure WAS_$SYMBOL_PREVIOUSLY_DEFN }
  147.  
  148.  
  149. BEGIN { of main program }
  150. WRITELN;
  151. WRITELN('Program for automatic insertion of entry points.');
  152. WRITELN('By Robert Harsch.');
  153. WRITELN;
  154. WRITELN('WORKING.');
  155.  
  156. { initialize global variables }
  157. SYM_DEFN_ROOT:= NIL;
  158. FOR $CH:='a' TO 'z' DO
  159.     UPPERCASE[$CH]:= CHR(ORD('A') + (ORD($CH) - ORD('a')));
  160. LOWERCASE:= ['a'..'z'];  { We will convert lower case
  161.         characters to upper case like the assembler. }
  162. { set of "IDentifier START" and "IDentifier" characters }
  163. IDSTART:= ['A'..'Z'] + LOWERCASE + ['$', '%', '.'] + ['#','_'];
  164. IDENTIFIER:= IDSTART + ['0'..'9'];
  165.  
  166. OPENFILES;
  167. REPEAT
  168.     SETLENGTH($LINE,0);
  169.     READLN(INFILE,$LINE);
  170.     WRITELN(OUTFILE,$LINE);
  171.     APPEND($LINE, ' ');     { sentinel }
  172.     I:= INDEX ($LINE, $ENTRY_KEY);
  173.     K:= I + LENGTH ( $ENTRY_KEY );
  174.     FOUND_ENTRY:= (I > 0) AND ( $LINE[K] IN IDSTART );
  175.     IF FOUND_ENTRY THEN
  176.         BEGIN
  177.         SETLENGTH($SYMBOL,0);
  178.  
  179.         { pick up first 6 significant chars, and
  180.         convert lower to upper case, store in $SYMBOL }
  181.         I:= K; BADCHAR:= FALSE;
  182.         REPEAT
  183.             IF $LINE[I] IN LOWERCASE THEN
  184.                 $LINE[I]:= UPPERCASE[$LINE[I]];
  185.             IF $LINE[I] IN ['#','_'] THEN
  186.                 BADCHAR:= TRUE;
  187.             APPEND($SYMBOL,$LINE[I]);
  188.             I:= I + 1
  189.         UNTIL NOT ($LINE[I] IN IDENTIFIER) OR (I-K =6);
  190.  
  191.         WAS_$SYMBOL_PREVIOUSLY_DEFN($SYMBOL,PREV_DEFN);
  192.         WRITEOUT($SYMBOL,PREV_DEFN,BADCHAR);
  193.         END;
  194.     PROGRAM_DONE:= (INDEX($LINE, $MAIN_PROGRAM_BEGIN) = 1)
  195.                 AND
  196.              NOT ($LINE[4] IN IDENTIFIER);
  197. UNTIL PROGRAM_DONE;
  198. WRITELN('PROGRAM IS DONE.');
  199.  
  200. END.