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 }
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.');