3 Copyright (C) 1989-1995 Alan R. Baldwin
4 721 Berkeley St., Kent, Ohio 44240
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 * The module lklex.c contains the general lexical analysis
26 * functions used to scan the text lines from the .rel files.
28 * lklex.c contains the fllowing functions:
41 * lklex.c contains no local variables.
44 /*)Function VOID getid(id,c)
46 * char * id a pointer to a string of
49 * >=0 this is first character to
50 * copy to the string buffer
53 * The function getid() scans the current input text line
54 * from the current position copying the next LETTER | DIGIT string
55 * into the external string buffer (id). The string ends when a non
56 * LETTER or DIGIT character is found. The maximum number of
57 * characters copied is NCPS. If the input string is larger than
58 * NCPS characters then the string is truncated, if the input string
59 * is shorter than NCPS characters then the string is NULL filled.
60 * If the mode argument (c) is >=0 then (c) is the first character
61 * copied to the string buffer, if (c) is <0 then intervening white
62 * space (SPACES and TABS) are skipped.
65 * char * p pointer to external string buffer
66 * int c current character value
69 * char ctype[] a character array which defines the
70 * type of character being processed.
71 * This index is the character
76 * char getnb() lklex.c
77 * VOID unget() lklex.c
80 * use of getnb(), get(), and unget() updates the
81 * global pointer ip the position in the current
99 } while (ctype[c=get()] & (LETTER|DIGIT));
101 while (p < &id[NCPS])
105 /*)Function VOID getSid (char *id)
107 * char * id a pointer to a string of
108 * maximum length NCPS
110 * getSid is derived from getid. It is called from newsym()
111 * in lksym.c, when an S-record has to be scanned. getSid accepts
112 * much more characters than getid, which is necessary for SDCC.
114 * The function getSid() scans the current input text line
115 * from the current position copying the next string
116 * into the external string buffer (id). The string ends when a space
117 * character (space, tab, \0) is found. The maximum number of
118 * characters copied is NCPS. If the input string is larger than
119 * NCPS characters then the string is truncated, if the input string
120 * is shorter than NCPS characters then the string is NULL filled.
121 * Intervening white space (SPACES and TABS) are skipped.
124 * char * p pointer to external string buffer
125 * int c current character value
128 * char ctype[] a character array which defines the
129 * type of character being processed.
130 * This index is the character
135 * char getnb() lklex.c
136 * VOID unget() lklex.c
139 * use of getnb(), get(), and unget() updates the
140 * global pointer ip the position in the current
156 } while (c != '\0' && c != ' ' && c != '\t');
158 while (p < &id[NCPS])
162 /*)Function VOID getfid(fid,c)
164 * char * str a pointer to a string of
165 * maximum length PATH_MAX
166 * int c this is first character to
167 * copy to the string buffer
169 * The function getfid() scans the current input text line from
170 * the current position copying the next string into the external
171 * string buffer (str). The string ends when end of line is found.
172 * Trailing spaces are removed. The maximum number of characters
173 * copied is PATH_MAX. If the input string is larger than PATH_MAX
174 * characters then the string is truncated. The string is NULL
178 * char * p pointer to external string buffer
179 * int c current character value
182 * char ctype[] a character array which defines the
183 * type of character being processed.
184 * This index is the character
191 * use of get() updates the global pointer ip
192 * the position in the current input text line.
196 getfid(char *str, register int c)
203 if (p < &str[PATH_MAX-1])
210 /* trim trailing spaces */
212 while (p >= str && ctype[(int)*p] == SPACE)
214 /* terminate the string */
218 /*)Function char getnb()
220 * The function getnb() scans the current input text
221 * line returning the first character not a SPACE or TAB.
224 * int c current character from input
233 * use of get() updates the global pointer ip, the position
234 * in the current input text line
242 while ((c=get())==' ' || c=='\t')
247 /*)Function VOID skip()
249 * The function skip() scans the input text skipping all
250 * letters and digits.
256 * char ctype[] array of character types, one per
261 * char getnb() lklex.c
262 * VOID unget() lklex.c
265 * Input letters and digits are skipped.
273 while (ctype[c=get()] & (LETTER|DIGIT)) { ; }
277 /*)Function char get()
279 * The function get() returns the next character in the
280 * input text line, at the end of the line a
281 * NULL character is returned.
284 * int c current character from
288 * char * ip pointer into the current
295 * updates ip to the next character position in the
296 * input text line. If ip is at the end of the
297 * line, ip is not updated.
310 /*)Function VOID unget(c)
312 * int c value of last character
313 * read from input text line
315 * If (c) is not a NULL character then the global pointer ip
316 * is updated to point to the preceeding character in the
319 * NOTE: This function does not push the character (c)
320 * back into the input text line, only
321 * the pointer ip is changed.
324 * int c last character read
325 * from input text line
328 * char * ip position into the current
335 * ip decremented by 1 character position
345 /*)Function int getmap(d)
347 * int d value to compare with the
348 * input text line character
350 * The function getmap() converts the 'C' style characters \b, \f,
351 * \n, \r, and \t to their equivalent ascii values and also
352 * converts 'C' style octal constants '\123' to their equivalent
353 * numeric values. If the first character is equivalent to (d) then
354 * a (-1) is returned, if the end of the line is detected then
355 * a 'q' error terminates the parse for this line, or if the first
356 * character is not a \ then the character value is returned.
359 * int c value of character
360 * from input text line
361 * int n looping counter
362 * int v current value of numeric conversion
369 * VOID unget() lklex.c
372 * use of get() updates the global pointer ip the position
373 * in the current input text line
379 register int c, n, v;
381 if ((c = get()) == '\0')
419 while (++n<=3 && c>='0' && c<='7') {
420 v = (v<<3) + c - '0';
431 /*)Function int lk_getline()
433 * The function lk_getline() reads a line of input text from a
434 * .rel source text file, a .lnk command file or from stdin.
435 * Lines of text are processed from a single .lnk file or
436 * multiple .rel files until all files have been read.
437 * The input text line is copied into the global string ib[]
438 * and converted to a NULL terminated string. The function
439 * lk_getline() returns a (1) after succesfully reading a line
440 * or a (0) if all files have been read.
441 * This function also opens each input .lst file and output
442 * .rst file as each .rel file is processed.
445 * int i string length
446 * int ftype file type
447 * char * fid file name
450 * lfile *cfp The pointer *cfp points to the
451 * current lfile structure
452 * lfile *filep The pointer *filep points to the
453 * beginning of a linked list of
455 * int gline get a line from the LST file
456 * to translate for the RST file
457 * char ib[NINPUT] REL file text line
458 * int pass linker pass number
459 * int pflag print linker command file flag
460 * FILE *rfp The file handle to the current
462 * FILE *sfp The file handle sfp points to the
463 * currently open file
464 * FILE * stdin c_library
465 * FILE * stdout c_library
466 * FILE *tfp The file handle to the current
467 * LST file being scanned
468 * int uflag update listing flag
471 * FILE * afile() lkmain.c
472 * int fclose() c_library
473 * char * fgets() c_library
474 * int fprintf() c_library
475 * VOID lkulist() lklist.c
476 * VOID lkexit() lkmain.c
477 * int strlen() c_library
480 * The input stream is scanned. The .rel files will be
481 * opened and closed sequentially scanning each in turn.
490 loop: if (pflag && cfp && cfp->f_type == F_STD)
491 fprintf(stdout, "ASlink >> ");
493 if (sfp == NULL || fgets(ib, sizeof ib, sfp) == NULL) {
507 if (ftype == F_STD) {
510 if (ftype == F_LNK) {
511 sfp = afile(fid, "lnk", 0);
513 if (ftype == F_REL) {
514 sfp = afile(fid, LKOBJEXT, 0);
515 /* if a .adb file exists then copy it over */
516 if (dflag && sfp && dfp && pass == 0) {
517 FILE *xfp = afile(fid,"adb",0); //JCF: Nov 30, 2002
523 if (uflag && pass != 0) {
524 SaveLinkedFilePath(fid); //Save the linked path for aomf51
525 if ((tfp = afile(fid, "lst", 0)) != NULL) {
526 if ((rfp = afile(fid, "rst", 1)) == NULL) {
534 fprintf(stderr, "Invalid file type\n");
550 /*)Function int more()
552 * The function more() scans the input text line
553 * skipping white space (SPACES and TABS) and returns a (0)
554 * if the end of the line or a comment delimeter (;) is found,
555 * or a (1) if their are additional characters in the line.
558 * int c next character from
559 * the input text line
565 * char getnb() lklex.c
566 * VOID unget() lklex.c
569 * use of getnb() and unget() updates the global pointer ip
570 * the position in the current input text line
580 return( (c == '\0' || c == ';') ? 0 : 1 );
583 /*)Function char endline()
585 * The function endline() scans the input text line
586 * skipping white space (SPACES and TABS) and returns the next
587 * character or a (0) if the end of the line is found or a
588 * comment delimiter (;) is found.
591 * int c next character from
592 * the input text line
598 * char getnb() lklex.c
601 * Use of getnb() updates the global pointer ip the
602 * position in the current input text line.
611 return( (c == '\0' || c == ';') ? 0 : c );
614 /*)Function VOID chop_crlf(str)
616 * char *str string to chop
618 * The function chop_crlf() removes trailing LF or CR/LF from
622 * int i string length
640 if (i >= 1 && str[i-1] == '\n') str[i-1] = 0;
641 if (i >= 2 && str[i-2] == '\r') str[i-2] = 0;