PROGRAM CREATE_ENTRY_FOR_EXTERNALDECLARATIONS; { by Robert H. Harsch ph: (916) 487-2216 2362 American River Dr, Suite 311 Sacramento, Ca. 95825. All rights reserved. } { only the first 6 characters are significant } CONST $ENTRY_KEY='{@'; { string we look for to pick up entry name and insert into file name.ZZZ } $MAIN_PROGRAM_BEGIN='L99'; { string to look for to stop program. Nothing is copied beyond this point to file name.ZZZ } TYPE $STRING0= STRING 0; $STRING32= STRING 80; $STRING255= STRING 255; BYTE= 0..255; SYM_LINK= ^SYM_TYPE; { symbol (entry points) linked } SYM_TYPE= RECORD $SYM: $STRING32; PTR: SYM_LINK END; VAR INFILE,OUTFILE: TEXT; $SYMBOL, $LINE: $STRING255; $CH, $TAB: CHAR; K,I: INTEGER; LOWERCASE, IDSTART, IDENTIFIER: SET OF CHAR; PROGRAM_DONE, BADCHAR, PREV_DEFN, FOUND_ENTRY: BOOLEAN; SYM_DEFN_ROOT: SYM_LINK; UPPERCASE: ARRAY['a'..'z'] OF 'A'..'Z'; FUNCTION LENGTH(X: $STRING255): INTEGER; EXTERNAL; FUNCTION INDEX(X,Y: $STRING255): INTEGER; EXTERNAL; PROCEDURE SETLENGTH(VAR X: $STRING0; Y: INTEGER); EXTERNAL; PROCEDURE GET_FILE_NAME_FROM_COMMAND_LINE(VAR $INF: $STRING32); VAR I: INTEGER; FUNCTION PEEK(ADDR: INTEGER): BYTE; TYPE CONTENTS= PACKED RECORD BYT: BYTE { byte in memory } END; { of record } FORM=(INTEGR,ADDRESS); REFERENCE= RECORD CASE FORM OF INTEGR: (I: INTEGER); ADDRESS: (P: ^CONTENTS) END; VAR TEMP: REFERENCE; BEGIN { of function peek } TEMP.I:= ADDR; PEEK:= TEMP.P^.BYT END; { of function peek } BEGIN { of procedure GET_FILE_NAME_FROM_COMMAND_LINE } SETLENGTH($INF,0); FOR I:= 129 TO 128 + PEEK(128) DO APPEND( $INF, CHR(PEEK(I)) ) END; { of procedure GET_FILE_NAME_FROM_COMMAND_LINE } PROCEDURE OPENFILES; CONST $M1= 'Input file (without entry points): '; $M2= 'Output file (with entry points): '; VAR $FILENAME, $NAME_EXT: $STRING32; $CR : CHAR; { carriage return } BEGIN $CR:= CHR(13); { carriage return } GET_FILE_NAME_FROM_COMMAND_LINE($FILENAME); $NAME_EXT:= $FILENAME; APPEND($NAME_EXT, '.SRC'); APPEND($NAME_EXT,$CR); { see note #3 of hot news, filenames passed to rewrite or reset must be deleted with a carriage return} RESET($NAME_EXT, INFILE); WRITELN($M1, $NAME_EXT); $NAME_EXT:= $FILENAME; APPEND($NAME_EXT, '.ZZZ'); APPEND($NAME_EXT,$CR); { see note #3 of hot news, filenames passed to rewrite or reset must be deleted with a carriage return} REWRITE($NAME_EXT, OUTFILE); WRITELN($M2, $NAME_EXT); END; { of procedure openfiles } PROCEDURE WRITEOUT(VAR $SYMBOL: $STRING32; PREV_DEFN, BADCHAR: BOOLEAN); CONST $MSG1= 'Error, symbol previously defined'; $MSG2= 'Error, "#" or "_" character in symbol defined'; VAR $TAB: CHAR; SYM_NODE: SYM_LINK; BEGIN $TAB:= CHR(9); WRITELN(OUTFILE,$TAB,'ENTRY',$TAB, $SYMBOL); WRITELN(OUTFILE,$SYMBOL,':'); { write info to screen } WRITELN; WRITELN('Entry symbol found:'); WRITELN($TAB,'ENTRY',$TAB, $SYMBOL); WRITELN($SYMBOL,':'); IF PREV_DEFN THEN WRITELN($MSG1); IF BADCHAR THEN WRITELN($MSG2); { insert new symbol into link list } NEW(SYM_NODE); SYM_NODE^.$SYM:= $SYMBOL; SYM_NODE^.PTR:= SYM_DEFN_ROOT; SYM_DEFN_ROOT:= SYM_NODE; END; { of procedure writeout } PROCEDURE WAS_$SYMBOL_PREVIOUSLY_DEFN( VAR $SYMBOL: $STRING32; VAR PREV_DEFN: BOOLEAN); VAR SYM_NODE: SYM_LINK; BEGIN SYM_NODE:= SYM_DEFN_ROOT; PREV_DEFN:= FALSE; WHILE (SYM_NODE <> NIL) AND NOT PREV_DEFN DO WITH SYM_NODE^ DO IF $SYM = $SYMBOL THEN PREV_DEFN:= TRUE ELSE SYM_NODE:= PTR; END; { of procedure WAS_$SYMBOL_PREVIOUSLY_DEFN } BEGIN { of main program } WRITELN; WRITELN('Program for automatic insertion of entry points.'); WRITELN('By Robert Harsch.'); WRITELN; WRITELN('WORKING.'); { initialize global variables } SYM_DEFN_ROOT:= NIL; FOR $CH:='a' TO 'z' DO UPPERCASE[$CH]:= CHR(ORD('A') + (ORD($CH) - ORD('a'))); LOWERCASE:= ['a'..'z']; { We will convert lower case characters to upper case like the assembler. } { set of "IDentifier START" and "IDentifier" characters } IDSTART:= ['A'..'Z'] + LOWERCASE + ['$', '%', '.'] + ['#','_']; IDENTIFIER:= IDSTART + ['0'..'9']; OPENFILES; REPEAT SETLENGTH($LINE,0); READLN(INFILE,$LINE); WRITELN(OUTFILE,$LINE); APPEND($LINE, ' '); { sentinel } I:= INDEX ($LINE, $ENTRY_KEY); K:= I + LENGTH ( $ENTRY_KEY ); FOUND_ENTRY:= (I > 0) AND ( $LINE[K] IN IDSTART ); IF FOUND_ENTRY THEN BEGIN SETLENGTH($SYMBOL,0); { pick up first 6 significant chars, and convert lower to upper case, store in $SYMBOL } I:= K; BADCHAR:= FALSE; REPEAT IF $LINE[I] IN LOWERCASE THEN $LINE[I]:= UPPERCASE[$LINE[I]]; IF $LINE[I] IN ['#','_'] THEN BADCHAR:= TRUE; APPEND($SYMBOL,$LINE[I]); I:= I + 1 UNTIL NOT ($LINE[I] IN IDENTIFIER) OR (I-K =6); WAS_$SYMBOL_PREVIOUSLY_DEFN($SYMBOL,PREV_DEFN); WRITEOUT($SYMBOL,PREV_DEFN,BADCHAR); END; PROGRAM_DONE:= (INDEX($LINE, $MAIN_PROGRAM_BEGIN) = 1) AND NOT ($LINE[4] IN IDENTIFIER); UNTIL PROGRAM_DONE; WRITELN('PROGRAM IS DONE.'); END. .