diff --git a/lang/cem/cemcom.ansi/LLlex.c b/lang/cem/cemcom.ansi/LLlex.c index a25098e08..331a08e9e 100644 --- a/lang/cem/cemcom.ansi/LLlex.c +++ b/lang/cem/cemcom.ansi/LLlex.c @@ -5,64 +5,64 @@ /* $Id$ */ /* L E X I C A L A N A L Y Z E R */ -#include -#include -#include "parameters.h" -#include "input.h" -#include "arith.h" -#include "def.h" -#include "macro.h" -#include "idf.h" -#include "LLlex.h" -#include "Lpars.h" -#include "class.h" -#include "sizes.h" -#include "specials.h" /* registration of special identifiers */ +#include +#include +#include "parameters.h" +#include "input.h" +#include "arith.h" +#include "def.h" +#include "macro.h" +#include "idf.h" +#include "LLlex.h" +#include "Lpars.h" +#include "class.h" +#include "sizes.h" +#include "specials.h" /* registration of special identifiers */ /* Data about the token yielded */ struct token dot, ahead, aside; -int token_nmb = 0; /* number of the ahead token */ -int tk_nmb_at_last_syn_err = -5/*ERR_SHADOW*/; - /* token number at last syntax error */ +int token_nmb = 0; /* number of the ahead token */ +int tk_nmb_at_last_syn_err = -5 /*ERR_SHADOW*/; +/* token number at last syntax error */ int idfsize = IDFSIZE; -char sp_occurred[SP_TOTAL+1]; +char sp_occurred[SP_TOTAL + 1]; -#ifndef NOPP -int ReplaceMacros = 1; /* replacing macros */ -int AccDefined = 0; /* accept "defined(...)" */ -int UnknownIdIsZero = 0; /* interpret unknown id as integer 0 */ -int Unstacked = 0; /* an unstack is done */ +#ifndef NOPP +int ReplaceMacros = 1; /* replacing macros */ +int AccDefined = 0; /* accept "defined(...)" */ +int UnknownIdIsZero = 0; /* interpret unknown id as integer 0 */ +int Unstacked = 0; /* an unstack is done */ extern int InputLevel; #endif -int AccFileSpecifier = 0; /* return filespecifier <...> */ -int EoiForNewline = 0; /* return EOI upon encountering newline */ -int File_Inserted = 0; /* a file has just been inserted */ -int LexSave = 0; /* last character read by GetChar */ -#define MAX_LL_DEPTH 2 +int AccFileSpecifier = 0; /* return filespecifier <...> */ +int EoiForNewline = 0; /* return EOI upon encountering newline */ +int File_Inserted = 0; /* a file has just been inserted */ +int LexSave = 0; /* last character read by GetChar */ +#define MAX_LL_DEPTH 2 -#define FLG_ESEEN 0x01 /* possibly a floating point number */ -#define FLG_DOTSEEN 0x02 /* certainly a floating point number */ +#define FLG_ESEEN 0x01 /* possibly a floating point number */ +#define FLG_DOTSEEN 0x02 /* certainly a floating point number */ extern arith full_mask[]; #ifdef LINT extern int lint_skip_comment; #endif -#ifndef NOPP +#ifndef NOPP static struct token LexStack[MAX_LL_DEPTH]; static LexSP = 0; void skipcomment(); /* In PushLex() the actions are taken in order to initialise or - re-initialise the lexical scanner. - E.g. at the invocation of a sub-parser that uses LLlex(), the - state of the current parser should be saved. + re-initialise the lexical scanner. + E.g. at the invocation of a sub-parser that uses LLlex(), the + state of the current parser should be saved. */ PushLex() { assert(LexSP < MAX_LL_DEPTH); - assert(ASIDE == 0); /* ASIDE = 0; */ + assert(ASIDE == 0); /* ASIDE = 0; */ GetToken(&ahead); LexStack[LexSP++] = dot; } @@ -72,29 +72,30 @@ PopLex() assert(LexSP > 0); dot = LexStack[--LexSP]; } -#endif /* NOPP */ +#endif /* NOPP */ -int -LLlex() +int LLlex() { /* LLlex() plays the role of Lexical Analyzer for the C parser. - The look-ahead and putting aside of tokens are taken into - account. + The look-ahead and putting aside of tokens are taken into + account. */ - if (ASIDE) { /* a token is put aside */ + if (ASIDE) + { /* a token is put aside */ dot = aside; ASIDE = 0; } - else { /* read ahead and return the old one */ -#ifdef LINT + else + { /* read ahead and return the old one */ +#ifdef LINT lint_comment_ahead(); -#endif /* LINT */ +#endif /* LINT */ dot = ahead; /* the following test is performed due to the dual - task of LLlex(): it is also called for parsing the - restricted constant expression following a #if or - #elif. The newline character causes EOF to be - returned in this case to stop the LLgen parsing task. + task of LLlex(): it is also called for parsing the + restricted constant expression following a #if or + #elif. The newline character causes EOF to be + returned in this case to stop the LLgen parsing task. */ if (DOT != EOI) GetToken(&ahead); @@ -104,32 +105,30 @@ LLlex() return DOT; } +char* string_token(); +arith char_constant(); -char *string_token(); -arith char_constant(); - -int -GetToken(ptok) - register struct token *ptok; +int GetToken(ptok) register struct token* ptok; { /* GetToken() is the actual token recognizer. It calls the - control line interpreter if it encounters a "\n{w}*#" - combination. Macro replacement is also performed if it is - needed. + control line interpreter if it encounters a "\n{w}*#" + combination. Macro replacement is also performed if it is + needed. */ char buf[(IDFSIZE > NUMSIZE ? IDFSIZE : NUMSIZE) + 1]; register int ch, nch; token_nmb++; - if (File_Inserted) { + if (File_Inserted) + { File_Inserted = 0; goto firstline; } -again: /* rescan the input after an error or replacement */ +again: /* rescan the input after an error or replacement */ ch = GetChar(); -go_on: /* rescan, the following character has been read */ +go_on: /* rescan, the following character has been read */ if ((ch & 0200) && ch != EOI) /* stop on non-ascii character */ { fatal("non-ascii '\\%03o' read", ch & 0377); @@ -138,370 +137,411 @@ go_on: /* rescan, the following character has been read */ ptok->tk_file = FileName; ptok->tk_line = LineNumber; - switch (class(ch)) { /* detect character class */ - case STNL: /* newline, vertical space or formfeed */ -firstline: - LineNumber++; /* also at vs and ff */ - ptok->tk_file = FileName; - ptok->tk_line = LineNumber; - if (EoiForNewline) /* called in control line */ - /* a newline in a control line indicates the - end-of-information of the line. - */ - return ptok->tk_symb = EOI; + switch (class(ch)) + { /* detect character class */ + case STNL: /* newline, vertical space or formfeed */ + firstline: + LineNumber++; /* also at vs and ff */ + ptok->tk_file = FileName; + ptok->tk_line = LineNumber; + if (EoiForNewline) /* called in control line */ + /* a newline in a control line indicates the + end-of-information of the line. + */ + return ptok->tk_symb = EOI; - while ((ch = GetChar()), - (ch == '#' + while ((ch = GetChar()), (ch == '#' #ifndef NOPP - || ch == '/' + || ch == '/' #endif - || class(ch) == STSKIP)) { - /* blanks are allowed before hashes */ - if (ch == '#') { - /* a control line follows */ - domacro(); -#ifndef NOPP - if (File_Inserted) { - File_Inserted = 0; - goto firstline; + || class(ch) == STSKIP)) + { + /* blanks are allowed before hashes */ + if (ch == '#') + { + /* a control line follows */ + domacro(); +#ifndef NOPP + if (File_Inserted) + { + File_Inserted = 0; + goto firstline; + } } - } else if (ch == '/') { - if ((GetChar() == '*') && !InputLevel) { - skipcomment(); - } else { - UnGetChar(); - break; - } -#endif /* NOPP */ - } - } - /* We have to loop here, because in - `domacro' the nl, vt or ff is read. The - character following it may again be a `#'. - */ - goto go_on; - case STSKIP: /* just skip the skip characters */ - goto again; - case STGARB: /* garbage character */ -#ifndef NOPP -garbage: -#endif - if (040 < ch && ch < 0177) { - return ptok->tk_symb = ch; - } else { - lexerror("garbage char \\%03o", ch); - } - goto again; - case STSIMP: /* a simple character, no part of compound token*/ - return ptok->tk_symb = ch; - case STCOMP: /* maybe the start of a compound token */ - nch = GetChar(); /* character lookahead */ - switch (ch) { - case '!': - if (nch == '=') - return ptok->tk_symb = NOTEQUAL; - break; - case '&': - if (nch == '&') - return ptok->tk_symb = AND; - if (nch == '=') - return ptok->tk_symb = ANDAB; - break; - case '+': - if (nch == '+') - return ptok->tk_symb = PLUSPLUS; - if (nch == '=') - return ptok->tk_symb = PLUSAB; - break; - case '-': - if (nch == '-') - return ptok->tk_symb = MINMIN; - if (nch == '>') - return ptok->tk_symb = ARROW; - if (nch == '=') - return ptok->tk_symb = MINAB; - break; - case '<': - if (AccFileSpecifier) { - UnGetChar(); /* pushback nch */ - ptok->tk_bts = string_token("file specifier", - '>', &(ptok->tk_len)); - return ptok->tk_symb = FILESPECIFIER; - } - if (nch == '<') { - if ((nch = GetChar()) == '=') - return ptok->tk_symb = LEFTAB; - UnGetChar(); - return ptok->tk_symb = LEFT; - } - if (nch == '=') - return ptok->tk_symb = LESSEQ; - break; - case '=': - if (nch == '=') - return ptok->tk_symb = EQUAL; - break; - case '>': - if (nch == '=') - return ptok->tk_symb = GREATEREQ; - if (nch == '>') { - if ((nch = GetChar()) == '=') - return ptok->tk_symb = RIGHTAB; - UnGetChar(); - return ptok->tk_symb = RIGHT; - } - break; - case '|': - if (nch == '|') - return ptok->tk_symb = OR; - if (nch == '=') - return ptok->tk_symb = ORAB; - break; - case '%': - if (nch == '=') - return ptok->tk_symb = MODAB; - break; - case '*': - if (nch == '=') - return ptok->tk_symb = TIMESAB; - break; - case '^': - if (nch == '=') - return ptok->tk_symb = XORAB; - break; - case '/': -#ifndef NOPP - if (nch == '*' && !InputLevel) { - skipcomment(); - goto again; - } -#endif - if (nch == '=') - return ptok->tk_symb = DIVAB; - break; - default: - crash("bad class for char 0%o", ch); - /* NOTREACHED */ - } - UnGetChar(); - return ptok->tk_symb = ch; - case STCHAR: /* character constant */ - ptok->tk_ival = char_constant("character"); - ptok->tk_fund = INT; - return ptok->tk_symb = INTEGER; - case STSTR: /* string */ - ptok->tk_bts = string_token("string", '"', &(ptok->tk_len)); - ptok->tk_fund = CHAR; /* string of characters */ - return ptok->tk_symb = STRING; - case STELL: /* wide character constant/string prefix */ - nch = GetChar(); - if (nch == '"') { - ptok->tk_bts = string_token("wide character string", - '"', &(ptok->tk_len)); - ptok->tk_fund = WCHAR; /* string of wide characters */ - return ptok->tk_symb = STRING; - } else if (nch == '\'') { - ptok->tk_ival = char_constant("wide character"); - ptok->tk_fund = INT; - return ptok->tk_symb = INTEGER; - } - UnGetChar(); - /* fallthrough */ - case STIDF: - { - register char *tg = &buf[0]; - register int pos = -1; - register struct idf *idef; - extern int idfsize; /* ??? */ -#ifndef NOPP - int NoExpandNext = 0; - - if (Unstacked) EnableMacros(); /* unstack macro's when allowed. */ - if (ch == NOEXPM) { - NoExpandNext = 1; - ch = GetChar(); - } -#endif - do { /* read the identifier */ - if (++pos < idfsize) { - *tg++ = ch; - } - ch = GetChar(); - } while (in_idf(ch)); - - if (ch != EOI) - UnGetChar(); - *tg++ = '\0'; /* mark the end of the identifier */ - idef = ptok->tk_idf = str2idf(buf, 1); - sp_occurred[idef->id_special] = 1; - idef->id_file = ptok->tk_file; - idef->id_line = ptok->tk_line; -#ifndef NOPP - if (idef->id_macro && ReplaceMacros && !NoExpandNext) { - if (replace(idef)) - goto again; - } - if (UnknownIdIsZero && idef->id_reserved != SIZEOF) { - ptok->tk_ival = (arith)0; - ptok->tk_fund = INT; - return ptok->tk_symb = INTEGER; - } + else if (ch == '/') + { + if ((GetChar() == '*') && !InputLevel) + { + skipcomment(); + } + else + { + UnGetChar(); + break; + } #endif /* NOPP */ - ptok->tk_symb = ( - idef->id_reserved - ? idef->id_reserved - : idef->id_def && idef->id_def->df_sc == TYPEDEF - ? TYPE_IDENTIFIER - : IDENTIFIER - ); - return IDENTIFIER; - } - case STNUM: /* a numeric constant */ - { - register int siz_left = NUMSIZE - 1; - register char *np = &buf[0]; - int flags = 0; - -#define store(ch) if (--siz_left >= 0) \ - *np++ = ch; - - if (ch == '.') { - /* An embarrasing ambiguity. We have either a - pp-number, a field operator, an ELLIPSIS or - an error (..). + } + } + /* We have to loop here, because in + `domacro' the nl, vt or ff is read. The + character following it may again be a `#'. */ - ch = GetChar(); - if (!is_dig(ch)) { /* . or ... */ - if (ch == '.') { - if ((ch = GetChar()) == '.') - return ptok->tk_symb = ELLIPSIS; - UnGetChar(); /* not '.' */ - ChPushBack('.'); /* sigh ... */ - } else - UnGetChar(); /* not '.' */ - return ptok->tk_symb = '.'; + goto go_on; + case STSKIP: /* just skip the skip characters */ + goto again; + case STGARB: /* garbage character */ +#ifndef NOPP + garbage: +#endif + if (040 < ch && ch < 0177) + { + return ptok->tk_symb = ch; + } + else + { + lexerror("garbage char \\%03o", ch); + } + goto again; + case STSIMP: /* a simple character, no part of compound token*/ + return ptok->tk_symb = ch; + case STCOMP: /* maybe the start of a compound token */ + nch = GetChar(); /* character lookahead */ + switch (ch) + { + case '!': + if (nch == '=') + return ptok->tk_symb = NOTEQUAL; + break; + case '&': + if (nch == '&') + return ptok->tk_symb = AND; + if (nch == '=') + return ptok->tk_symb = ANDAB; + break; + case '+': + if (nch == '+') + return ptok->tk_symb = PLUSPLUS; + if (nch == '=') + return ptok->tk_symb = PLUSAB; + break; + case '-': + if (nch == '-') + return ptok->tk_symb = MINMIN; + if (nch == '>') + return ptok->tk_symb = ARROW; + if (nch == '=') + return ptok->tk_symb = MINAB; + break; + case '<': + if (AccFileSpecifier) + { + UnGetChar(); /* pushback nch */ + ptok->tk_bts = string_token("file specifier", '>', &(ptok->tk_len)); + return ptok->tk_symb = FILESPECIFIER; + } + if (nch == '<') + { + if ((nch = GetChar()) == '=') + return ptok->tk_symb = LEFTAB; + UnGetChar(); + return ptok->tk_symb = LEFT; + } + if (nch == '=') + return ptok->tk_symb = LESSEQ; + break; + case '=': + if (nch == '=') + return ptok->tk_symb = EQUAL; + break; + case '>': + if (nch == '=') + return ptok->tk_symb = GREATEREQ; + if (nch == '>') + { + if ((nch = GetChar()) == '=') + return ptok->tk_symb = RIGHTAB; + UnGetChar(); + return ptok->tk_symb = RIGHT; + } + break; + case '|': + if (nch == '|') + return ptok->tk_symb = OR; + if (nch == '=') + return ptok->tk_symb = ORAB; + break; + case '%': + if (nch == '=') + return ptok->tk_symb = MODAB; + break; + case '*': + if (nch == '=') + return ptok->tk_symb = TIMESAB; + break; + case '^': + if (nch == '=') + return ptok->tk_symb = XORAB; + break; + case '/': +#ifndef NOPP + if (nch == '*' && !InputLevel) + { + skipcomment(); + goto again; + } +#endif + if (nch == '=') + return ptok->tk_symb = DIVAB; + break; + default: + crash("bad class for char 0%o", ch); + /* NOTREACHED */ } UnGetChar(); - ch = '.'; - flags |= FLG_DOTSEEN; - } - store(ch); - ch = GetChar(); - while(in_idf(ch) || ch == '.') { - store(ch); - if (ch == '.') flags |= FLG_DOTSEEN; - if (ch == 'e' || ch == 'E') { - flags |= FLG_ESEEN; - ch = GetChar(); - if (ch == '+' || ch == '-') { - flags |= FLG_DOTSEEN; /* trick */ - store(ch); - ch = GetChar(); - } - } else ch = GetChar(); - } - store('\0'); - UnGetChar(); - - np = &buf[0]; - ch = *np++; - if (siz_left < 0) { - lexerror("number too long"); - if ((flags & FLG_DOTSEEN) - || (flags & FLG_ESEEN - && !(ch == '0' - && (*np == 'x' || *np == 'X')))) { - ptok->tk_fval = Salloc("0.0", (unsigned) 4); - ptok->tk_fund = DOUBLE; - return ptok->tk_symb = FLOATING; + return ptok->tk_symb = ch; + case STCHAR: /* character constant */ + ptok->tk_ival = char_constant("character"); + ptok->tk_fund = INT; + return ptok->tk_symb = INTEGER; + case STSTR: /* string */ + ptok->tk_bts = string_token("string", '"', &(ptok->tk_len)); + ptok->tk_fund = CHAR; /* string of characters */ + return ptok->tk_symb = STRING; + case STELL: /* wide character constant/string prefix */ + nch = GetChar(); + if (nch == '"') + { + ptok->tk_bts = string_token("wide character string", '"', &(ptok->tk_len)); + ptok->tk_fund = WCHAR; /* string of wide characters */ + return ptok->tk_symb = STRING; + } + else if (nch == '\'') + { + ptok->tk_ival = char_constant("wide character"); + ptok->tk_fund = INT; + return ptok->tk_symb = INTEGER; + } + UnGetChar(); + /* fallthrough */ + case STIDF: + { + register char* tg = &buf[0]; + register int pos = -1; + register struct idf* idef; + extern int idfsize; /* ??? */ +#ifndef NOPP + int NoExpandNext = 0; + + if (Unstacked) + EnableMacros(); /* unstack macro's when allowed. */ + if (ch == NOEXPM) + { + NoExpandNext = 1; + ch = GetChar(); } - ptok->tk_ival = 1; - ptok->tk_fund = ULONG; - ptok->tk_symb = INTEGER; - } - /* Now, the pp-number must be converted into a token */ - if ((flags & FLG_DOTSEEN) - || (flags & FLG_ESEEN - && !(ch == '0' && (*np == 'x' || *np == 'X')))) { - strflt2tok(&buf[0], ptok); - return ptok->tk_symb = FLOATING; - } - strint2tok(&buf[0], ptok); - return ptok->tk_symb = INTEGER; - } - case STEOI: /* end of text on source file */ - return ptok->tk_symb = EOI; -#ifndef NOPP - case STMSPEC: - if (!InputLevel) goto garbage; - if (ch == TOKSEP) goto again; - /* fallthrough shouldn't happen */ #endif - default: /* this cannot happen */ - crash("bad class for char 0%o", ch); + do + { /* read the identifier */ + if (++pos < idfsize) + { + *tg++ = ch; + } + ch = GetChar(); + } while (in_idf(ch)); + + if (ch != EOI) + UnGetChar(); + *tg++ = '\0'; /* mark the end of the identifier */ + idef = ptok->tk_idf = str2idf(buf, 1); + sp_occurred[idef->id_special] = 1; + idef->id_file = ptok->tk_file; + idef->id_line = ptok->tk_line; +#ifndef NOPP + if (idef->id_macro && ReplaceMacros && !NoExpandNext) + { + if (replace(idef)) + goto again; + } + if (UnknownIdIsZero && idef->id_reserved != SIZEOF) + { + ptok->tk_ival = (arith)0; + ptok->tk_fund = INT; + return ptok->tk_symb = INTEGER; + } +#endif /* NOPP */ + ptok->tk_symb + = (idef->id_reserved + ? idef->id_reserved + : idef->id_def && idef->id_def->df_sc == TYPEDEF ? TYPE_IDENTIFIER + : IDENTIFIER); + return IDENTIFIER; + } + case STNUM: /* a numeric constant */ + { + register int siz_left = NUMSIZE - 1; + register char* np = &buf[0]; + int flags = 0; + +#define store(ch) \ + if (--siz_left >= 0) \ + *np++ = ch; + + if (ch == '.') + { + /* An embarrasing ambiguity. We have either a + pp-number, a field operator, an ELLIPSIS or + an error (..). + */ + ch = GetChar(); + if (!is_dig(ch)) + { /* . or ... */ + if (ch == '.') + { + if ((ch = GetChar()) == '.') + return ptok->tk_symb = ELLIPSIS; + UnGetChar(); /* not '.' */ + ChPushBack('.'); /* sigh ... */ + } + else + UnGetChar(); /* not '.' */ + return ptok->tk_symb = '.'; + } + UnGetChar(); + ch = '.'; + flags |= FLG_DOTSEEN; + } + store(ch); + ch = GetChar(); + while (in_idf(ch) || ch == '.') + { + store(ch); + if (ch == '.') + flags |= FLG_DOTSEEN; + if (ch == 'e' || ch == 'E') + { + flags |= FLG_ESEEN; + ch = GetChar(); + if (ch == '+' || ch == '-') + { + flags |= FLG_DOTSEEN; /* trick */ + store(ch); + ch = GetChar(); + } + } + else + ch = GetChar(); + } + store('\0'); + UnGetChar(); + + np = &buf[0]; + ch = *np++; + if (siz_left < 0) + { + lexerror("number too long"); + if ((flags & FLG_DOTSEEN) + || (flags & FLG_ESEEN && !(ch == '0' && (*np == 'x' || *np == 'X')))) + { + ptok->tk_fval = Salloc("0.0", (unsigned)4); + ptok->tk_fund = DOUBLE; + return ptok->tk_symb = FLOATING; + } + ptok->tk_ival = 1; + ptok->tk_fund = ULONG; + ptok->tk_symb = INTEGER; + } + /* Now, the pp-number must be converted into a token */ + if ((flags & FLG_DOTSEEN) + || (flags & FLG_ESEEN && !(ch == '0' && (*np == 'x' || *np == 'X')))) + { + strflt2tok(&buf[0], ptok); + return ptok->tk_symb = FLOATING; + } + strint2tok(&buf[0], ptok); + return ptok->tk_symb = INTEGER; + } + case STEOI: /* end of text on source file */ + return ptok->tk_symb = EOI; +#ifndef NOPP + case STMSPEC: + if (!InputLevel) + goto garbage; + if (ch == TOKSEP) + goto again; +/* fallthrough shouldn't happen */ +#endif + default: /* this cannot happen */ + crash("bad class for char 0%o", ch); } /*NOTREACHED*/ } -#ifndef NOPP -void -skipcomment() +#ifndef NOPP +void skipcomment() { /* The last character read has been the '*' of '/_*'. The - characters, except NL and EOI, between '/_*' and the first - occurring '*_/' are not interpreted. - NL only affects the LineNumber. EOI is not legal. + characters, except NL and EOI, between '/_*' and the first + occurring '*_/' are not interpreted. + NL only affects the LineNumber. EOI is not legal. - Important note: it is not possible to stop skipping comment - beyond the end-of-file of an included file. - EOI is returned by LoadChar only on encountering EOF of the - top-level file... + Important note: it is not possible to stop skipping comment + beyond the end-of-file of an included file. + EOI is returned by LoadChar only on encountering EOF of the + top-level file... */ register int c, oldc = '\0'; NoUnstack++; c = GetChar(); -#ifdef LINT - if (! lint_skip_comment) { +#ifdef LINT + if (!lint_skip_comment) + { lint_start_comment(); lint_comment_char(c); } -#endif /* LINT */ - do { - while (c != '*') { - if (class(c) == STNL) { +#endif /* LINT */ + do + { + while (c != '*') + { + if (class(c) == STNL) + { ++LineNumber; - } else if (c == EOI) { + } + else if (c == EOI) + { NoUnstack--; -#ifdef LINT - if (! lint_skip_comment) lint_end_comment(); -#endif /* LINT */ +#ifdef LINT + if (!lint_skip_comment) + lint_end_comment(); +#endif /* LINT */ return; } oldc = c; c = GetChar(); -#ifdef LINT - if (! lint_skip_comment) lint_comment_char(c); -#endif /* LINT */ +#ifdef LINT + if (!lint_skip_comment) + lint_comment_char(c); +#endif /* LINT */ } /* last Character seen was '*' */ c = GetChar(); - if ( c != '/' && oldc == '/') + if (c != '/' && oldc == '/') lexwarning("comment inside comment ?"); oldc = '*'; -#ifdef LINT - if (! lint_skip_comment) lint_comment_char(c); -#endif /* LINT */ +#ifdef LINT + if (!lint_skip_comment) + lint_comment_char(c); +#endif /* LINT */ } while (c != '/'); -#ifdef LINT - if (! lint_skip_comment) lint_end_comment(); -#endif /* LINT */ +#ifdef LINT + if (!lint_skip_comment) + lint_end_comment(); +#endif /* LINT */ NoUnstack--; } -#endif /* NOPP */ +#endif /* NOPP */ -arith -char_constant(nm) - char *nm; +arith char_constant(nm) char* nm; { register arith val = 0; register int ch; @@ -511,20 +551,23 @@ char_constant(nm) if (ch == '\'') lexerror("%s constant too short", nm); else - while (ch != '\'') { - if (ch == '\n') { - lexerror("newline in %s constant", nm); - LineNumber++; - break; + while (ch != '\'') + { + if (ch == '\n') + { + lexerror("newline in %s constant", nm); + LineNumber++; + break; + } + if (ch == '\\') + ch = quoted(GetChar()); + if (ch >= 128) + ch -= 256; + if (size < (int)int_size) + val |= ch << 8 * size; + size++; + ch = GetChar(); } - if (ch == '\\') - ch = quoted(GetChar()); - if (ch >= 128) ch -= 256; - if (size < (int)int_size) - val |= ch << 8 * size; - size++; - ch = GetChar(); - } if (size > 1) lexstrict("%s constant includes more than one character", nm); if (size > (int)int_size) @@ -532,24 +575,25 @@ char_constant(nm) return val; } -char * -string_token(nm, stop_char, plen) - char *nm; - int *plen; +char* string_token(nm, stop_char, plen) char* nm; +int* plen; { register int ch; register int str_size; - register char *str = Malloc((unsigned) (str_size = ISTRSIZE)); + register char* str = Malloc((unsigned)(str_size = ISTRSIZE)); register int pos = 0; - + ch = GetChar(); - while (ch != stop_char) { - if (ch == '\n') { + while (ch != stop_char) + { + if (ch == '\n') + { lexerror("newline in %s", nm); LineNumber++; break; } - if (ch == EOI) { + if (ch == EOI) + { lexerror("end-of-file inside %s", nm); break; } @@ -557,7 +601,7 @@ string_token(nm, stop_char, plen) ch = quoted(GetChar()); str[pos++] = ch; if (pos == str_size) - str = Realloc(str, (unsigned) (str_size += RSTRSIZE)); + str = Realloc(str, (unsigned)(str_size += RSTRSIZE)); ch = GetChar(); } str[pos++] = '\0'; /* for filenames etc. */ @@ -565,82 +609,78 @@ string_token(nm, stop_char, plen) return str; } -int -quoted(ch) - register int ch; -{ +int quoted(ch) register int ch; +{ /* quoted() replaces an escaped character sequence by the - character meant. + character meant. */ /* first char after backslash already in ch */ - if (!is_oct(ch)) { /* a quoted char */ - switch (ch) { - case 'n': - ch = '\n'; - break; - case 't': - ch = '\t'; - break; - case 'b': - ch = '\b'; - break; - case 'r': - ch = '\r'; - break; - case 'f': - ch = '\f'; - break; - case 'a': /* alert */ - ch = '\007'; - break; - case 'v': /* vertical tab */ - ch = '\013'; - break; - case 'x': /* quoted hex */ + if (!is_oct(ch)) + { /* a quoted char */ + switch (ch) { - register int hex = 0; - register int vch; + case 'n': + ch = '\n'; + break; + case 't': + ch = '\t'; + break; + case 'b': + ch = '\b'; + break; + case 'r': + ch = '\r'; + break; + case 'f': + ch = '\f'; + break; + case 'a': /* alert */ + ch = '\007'; + break; + case 'v': /* vertical tab */ + ch = '\013'; + break; + case 'x': /* quoted hex */ + { + register int hex = 0; + register int vch; - for (;;) { - ch = GetChar(); - if ((vch = hex_val(ch)) == -1) - break; - hex = hex * 16 + vch; + for (;;) + { + ch = GetChar(); + if ((vch = hex_val(ch)) == -1) + break; + hex = hex * 16 + vch; + } + UnGetChar(); + ch = hex; } - UnGetChar(); - ch = hex; - } } } - else { /* a quoted octal */ + else + { /* a quoted octal */ register int oct = 0, cnt = 0; - do { - oct = oct*8 + (ch-'0'); + do + { + oct = oct * 8 + (ch - '0'); ch = GetChar(); } while (is_oct(ch) && ++cnt < 3); UnGetChar(); ch = oct; } - return ch&0377; + return ch & 0377; } - -int -hex_val(ch) - register int ch; +int hex_val(ch) register int ch; { - return is_dig(ch) ? ch - '0' - : is_hex(ch) ? (ch - 'a' + 10) & 017 - : -1; + return is_dig(ch) ? ch - '0' : is_hex(ch) ? (ch - 'a' + 10) & 017 : -1; } - -int -GetChar() +int GetChar() { /* The routines GetChar and trigraph parses the trigraph - sequences and removes occurences of \\\n. + sequences and removes occurences of \\\n. */ register int ch; @@ -655,9 +695,11 @@ again: ch = trigraph(); /* \ is removed from the input stream */ - if (ch == '\\') { + if (ch == '\\') + { LoadChar(ch); - if (ch == '\n') { + if (ch == '\n') + { ++LineNumber; goto again; } @@ -665,113 +707,133 @@ again: ch = '\\'; } #endif - return(LexSave = ch); + return (LexSave = ch); } #ifndef NOPP -int -trigraph() +int trigraph() { register int ch; LoadChar(ch); - if (ch == '?') { + if (ch == '?') + { LoadChar(ch); - switch (ch) { /* its a trigraph */ - case '=': - ch = '#'; - return(ch); - case '(': - ch = '['; - return(ch); - case '/': - ch = '\\'; - return(ch); - case ')': - ch = ']'; - return(ch); - case '\'': - ch = '^'; - return(ch); - case '<': - ch = '{'; - return(ch); - case '!': - ch = '|'; - return(ch); - case '>': - ch = '}'; - return(ch); - case '-': - ch = '~'; - return(ch); + switch (ch) + { /* its a trigraph */ + case '=': + ch = '#'; + return (ch); + case '(': + ch = '['; + return (ch); + case '/': + ch = '\\'; + return (ch); + case ')': + ch = ']'; + return (ch); + case '\'': + ch = '^'; + return (ch); + case '<': + ch = '{'; + return (ch); + case '!': + ch = '|'; + return (ch); + case '>': + ch = '}'; + return (ch); + case '-': + ch = '~'; + return (ch); } PushBack(); } PushBack(); - return('?'); + return ('?'); } #endif /* strflt2tok only checks the syntax of the floating-point number and * selects the right type for the number. */ -strflt2tok(fltbuf, ptok) -char fltbuf[]; -struct token *ptok; +strflt2tok(fltbuf, ptok) char fltbuf[]; +struct token* ptok; { - register char *cp = fltbuf; + register char* cp = fltbuf; int malformed = 0; - while (is_dig(*cp)) cp++; - if (*cp == '.') { + while (is_dig(*cp)) cp++; - while (is_dig(*cp)) cp++; + if (*cp == '.') + { + cp++; + while (is_dig(*cp)) + cp++; } - if (*cp == 'e' || *cp == 'E') { + if (*cp == 'e' || *cp == 'E') + { cp++; if (*cp == '+' || *cp == '-') cp++; - if (!is_dig(*cp)) malformed++; - while (is_dig(*cp)) cp++; + if (!is_dig(*cp)) + malformed++; + while (is_dig(*cp)) + cp++; } - if (*cp == 'f' || *cp == 'F') { - if (*(cp + 1)) malformed++; + if (*cp == 'f' || *cp == 'F') + { + if (*(cp + 1)) + malformed++; *cp = '\0'; ptok->tk_fund = FLOAT; - } else if (*cp == 'l' || *cp == 'L') { - if (*(cp + 1)) malformed++; + } + else if (*cp == 'l' || *cp == 'L') + { + if (*(cp + 1)) + malformed++; *cp = '\0'; ptok->tk_fund = LNGDBL; - } else { - if (*cp) malformed++; + } + else + { + if (*cp) + malformed++; ptok->tk_fund = DOUBLE; } - if (malformed) { + if (malformed) + { lexerror("malformed floating constant"); - ptok->tk_fval = Salloc("0.0", (unsigned) 4); - } else { - ptok->tk_fval = Salloc(fltbuf, (unsigned) (cp - fltbuf + 1)); + ptok->tk_fval = Salloc("0.0", (unsigned)4); + } + else + { + ptok->tk_fval = Salloc(fltbuf, (unsigned)(cp - fltbuf + 1)); } } -strint2tok(intbuf, ptok) -char intbuf[]; -struct token *ptok; +strint2tok(intbuf, ptok) char intbuf[]; +struct token* ptok; { - register char *cp = intbuf; + register char* cp = intbuf; int base = 10; arith val = 0, dig, ubound; int uns_flg = 0, lng_flg = 0, malformed = 0, ovfl = 0; int fund; assert(*cp != '-'); - if (*cp == '0') { + if (*cp == '0') + { cp++; - if (*cp == 'x' || *cp == 'X') { + if (*cp == 'x' || *cp == 'X') + { cp++; base = 16; - } else base = 8; + } + else + base = 8; } /* The upperbound will be the same as when computed with * max_unsigned_arith / base (since base is even). The problem here @@ -779,68 +841,99 @@ struct token *ptok; */ ubound = max_arith / (base / 2); - while (is_hex(*cp)) { + while (is_hex(*cp)) + { dig = hex_val(*cp); - if (dig >= base) { - malformed++; /* ignore */ + if (dig >= base) + { + malformed++; /* ignore */ } - else { - if (val < 0 || val > ubound) ovfl++; + else + { + if (val < 0 || val > ubound) + ovfl++; val *= base; - if (val < 0 && val + dig >= 0) ovfl++; + if (val < 0 && val + dig >= 0) + ovfl++; val += dig; } cp++; } - while (*cp) { - if (*cp == 'l' || *cp == 'L') lng_flg++; - else if (*cp == 'u' || *cp == 'U') uns_flg++; - else break; + while (*cp) + { + if (*cp == 'l' || *cp == 'L') + lng_flg++; + else if (*cp == 'u' || *cp == 'U') + uns_flg++; + else + break; cp++; } - if (*cp) { - malformed++; + if (*cp) + { + malformed++; } - if (malformed) { - lexerror("malformed %s integer constant", - (base == 10 ? "decimal" - : (base == 8 ? "octal" - : "hexadecimal"))); - } else { + if (malformed) + { + lexerror( + "malformed %s integer constant", + (base == 10 ? "decimal" : (base == 8 ? "octal" : "hexadecimal"))); + } + else + { if (lng_flg > 1) lexerror("only one long suffix allowed"); if (uns_flg > 1) lexerror("only one unsigned suffix allowed"); } - if (ovfl) { + if (ovfl) + { lexwarning("overflow in constant"); fund = ULONG; - } else if (!lng_flg && (val & full_mask[(int)int_size]) == val) { - if (val >= 0 && val <= max_int) { + } + else if (!lng_flg && (val & full_mask[(int)int_size]) == val) + { + if (val >= 0 && val <= max_int) + { fund = INT; - } else if (int_size == long_size) { + } + else if (int_size == long_size) + { fund = UNSIGNED; - } else if (base == 10 && !uns_flg) + } + else if (base == 10 && !uns_flg) fund = LONG; - else fund = UNSIGNED; - } else if((val & full_mask[(int)long_size]) == val) { - if (val >= 0) fund = LONG; - else fund = ULONG; - } else { /* sizeof(arith) is greater than long_size */ + else + fund = UNSIGNED; + } + else if ((val & full_mask[(int)long_size]) == val) + { + if (val >= 0) + fund = LONG; + else + fund = ULONG; + } + else + { /* sizeof(arith) is greater than long_size */ assert(arith_size > long_size); lexwarning("constant too large for target machine"); /* cut the size to prevent further complaints */ val &= full_mask[(int)long_size]; fund = ULONG; } - if (lng_flg) { + if (lng_flg) + { /* fund can't be INT */ - if (fund == UNSIGNED) fund = ULONG; + if (fund == UNSIGNED) + fund = ULONG; } - if (uns_flg) { - if (fund == INT) fund = UNSIGNED; - else if (fund == LONG) fund = ULONG; + if (uns_flg) + { + if (fund == INT) + fund = UNSIGNED; + else if (fund == LONG) + fund = ULONG; } ptok->tk_fund = fund; ptok->tk_ival = val; diff --git a/lang/cem/cpp.ansi/LLlex.c b/lang/cem/cpp.ansi/LLlex.c index a0ec21a0f..0fc9ec86c 100644 --- a/lang/cem/cpp.ansi/LLlex.c +++ b/lang/cem/cpp.ansi/LLlex.c @@ -5,350 +5,403 @@ /* $Id$ */ /* L E X I C A L A N A L Y Z E R */ -#include "parameters.h" +#include "parameters.h" -#include -#include -#include "input.h" -#include "arith.h" -#include "macro.h" -#include "idf.h" -#include "LLlex.h" -#include "Lpars.h" -#include "class.h" -#include "bits.h" +#include +#include +#include "input.h" +#include "arith.h" +#include "macro.h" +#include "idf.h" +#include "LLlex.h" +#include "Lpars.h" +#include "class.h" +#include "bits.h" -#define BUFSIZ 1024 +#define BUFSIZ 1024 struct token dot; -int ReplaceMacros = 1; /* replacing macros */ -int AccDefined = 0; /* accept "defined(...)" */ -int UnknownIdIsZero = 0; /* interpret unknown id as integer 0 */ -int Unstacked = 0; /* an unstack is done */ -int AccFileSpecifier = 0; /* return filespecifier <...> */ -int LexSave = 0; /* last character read by GetChar */ -extern int InputLevel; /* # of current macro expansions */ +int ReplaceMacros = 1; /* replacing macros */ +int AccDefined = 0; /* accept "defined(...)" */ +int UnknownIdIsZero = 0; /* interpret unknown id as integer 0 */ +int Unstacked = 0; /* an unstack is done */ +int AccFileSpecifier = 0; /* return filespecifier <...> */ +int LexSave = 0; /* last character read by GetChar */ +extern int InputLevel; /* # of current macro expansions */ -extern char *string_token(); -extern arith char_constant(); -#define FLG_ESEEN 0x01 /* possibly a floating point number */ -#define FLG_DOTSEEN 0x02 /* certainly a floating point number */ +extern char* string_token(); +extern arith char_constant(); +#define FLG_ESEEN 0x01 /* possibly a floating point number */ +#define FLG_DOTSEEN 0x02 /* certainly a floating point number */ void skipcomment(); -int -LLlex() +int LLlex() { return (DOT != EOF) ? GetToken(&dot) : EOF; } - -int -GetToken(ptok) - register struct token *ptok; +int GetToken(ptok) register struct token* ptok; { /* GetToken() is the actual token recognizer. It calls the - control line interpreter if it encounters a "\n{w}*#" - combination. Macro replacement is also performed if it is - needed. + control line interpreter if it encounters a "\n{w}*#" + combination. Macro replacement is also performed if it is + needed. */ char buf[BUFSIZ]; register int ch, nch; -again: /* rescan the input after an error or replacement */ +again: /* rescan the input after an error or replacement */ ch = GetChar(); /* rescan, the following character has been read */ if ((ch & 0200) && ch != EOI) /* stop on non-ascii character */ fatal("non-ascii '\\%03o' read", ch & 0377); /* keep track of the place of the token in the file */ - switch (class(ch)) { /* detect character class */ - case STNL: /* newline, vertical space or formfeed */ - LineNumber++; - return ptok->tk_symb = EOF; - case STSKIP: /* just skip the skip characters */ - goto again; - case STGARB: /* garbage character */ -garbage: - if (040 < ch && ch < 0177) - error("garbage char %c", ch); - else - error("garbage char \\%03o", ch); - goto again; - case STSIMP: /* a simple character, no part of compound token*/ - return ptok->tk_symb = ch; - case STCOMP: /* maybe the start of a compound token */ - nch = GetChar(); /* character lookahead */ - switch (ch) { - case '!': - if (nch == '=') - return ptok->tk_symb = NOTEQUAL; - UnGetChar(); + switch (class(ch)) + { /* detect character class */ + case STNL: /* newline, vertical space or formfeed */ + LineNumber++; + return ptok->tk_symb = EOF; + case STSKIP: /* just skip the skip characters */ + goto again; + case STGARB: /* garbage character */ + garbage: + if (040 < ch && ch < 0177) + error("garbage char %c", ch); + else + error("garbage char \\%03o", ch); + goto again; + case STSIMP: /* a simple character, no part of compound token*/ return ptok->tk_symb = ch; - case '&': - if (nch == '&') - return ptok->tk_symb = AND; - else if (nch == '=') - return ptok->tk_symb = ANDAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '+': - if (nch == '+') - return ptok->tk_symb = PLUSPLUS; - else if (nch == '=') - return ptok->tk_symb = PLUSAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '-': - if (nch == '-') - return ptok->tk_symb = MINMIN; - else if (nch == '>') - return ptok->tk_symb = ARROW; - else if (nch == '=') - return ptok->tk_symb = MINAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '<': - if (AccFileSpecifier) { - UnGetChar(); /* pushback nch */ - ptok->tk_str = - string_token("file specifier", '>'); - return ptok->tk_symb = FILESPECIFIER; - } else if (nch == '<') { - if ((nch = GetChar()) == '=') - return ptok->tk_symb = LEFTAB; - UnGetChar(); - return ptok->tk_symb = LEFT; - } else if (nch == '=') - return ptok->tk_symb = LESSEQ; - UnGetChar(); - return ptok->tk_symb = ch; - case '=': - if (nch == '=') - return ptok->tk_symb = EQUAL; - UnGetChar(); - return ptok->tk_symb = ch; - case '>': - if (nch == '=') - return ptok->tk_symb = GREATEREQ; - else if (nch == '>') { - if ((nch = GetChar()) == '=') - return ptok->tk_symb = RIGHTAB; - UnGetChar(); - return ptok->tk_symb = RIGHT; + case STCOMP: /* maybe the start of a compound token */ + nch = GetChar(); /* character lookahead */ + switch (ch) + { + case '!': + if (nch == '=') + return ptok->tk_symb = NOTEQUAL; + UnGetChar(); + return ptok->tk_symb = ch; + case '&': + if (nch == '&') + return ptok->tk_symb = AND; + else if (nch == '=') + return ptok->tk_symb = ANDAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '+': + if (nch == '+') + return ptok->tk_symb = PLUSPLUS; + else if (nch == '=') + return ptok->tk_symb = PLUSAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '-': + if (nch == '-') + return ptok->tk_symb = MINMIN; + else if (nch == '>') + return ptok->tk_symb = ARROW; + else if (nch == '=') + return ptok->tk_symb = MINAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '<': + if (AccFileSpecifier) + { + UnGetChar(); /* pushback nch */ + ptok->tk_str = string_token("file specifier", '>'); + return ptok->tk_symb = FILESPECIFIER; + } + else if (nch == '<') + { + if ((nch = GetChar()) == '=') + return ptok->tk_symb = LEFTAB; + UnGetChar(); + return ptok->tk_symb = LEFT; + } + else if (nch == '=') + return ptok->tk_symb = LESSEQ; + UnGetChar(); + return ptok->tk_symb = ch; + case '=': + if (nch == '=') + return ptok->tk_symb = EQUAL; + UnGetChar(); + return ptok->tk_symb = ch; + case '>': + if (nch == '=') + return ptok->tk_symb = GREATEREQ; + else if (nch == '>') + { + if ((nch = GetChar()) == '=') + return ptok->tk_symb = RIGHTAB; + UnGetChar(); + return ptok->tk_symb = RIGHT; + } + UnGetChar(); + return ptok->tk_symb = ch; + case '|': + if (nch == '|') + return ptok->tk_symb = OR; + else if (nch == '=') + return ptok->tk_symb = ORAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '%': + if (nch == '=') + return ptok->tk_symb = MODAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '*': + if (nch == '=') + return ptok->tk_symb = TIMESAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '^': + if (nch == '=') + return ptok->tk_symb = XORAB; + UnGetChar(); + return ptok->tk_symb = ch; + case '/': + if (nch == '*' && !InputLevel) + { + skipcomment(); + goto again; + } + else if (nch == '=') + return ptok->tk_symb = DIVAB; + UnGetChar(); + return ptok->tk_symb = ch; + default: + crash("bad class for char 0%o", ch); + /* NOTREACHED */ } - UnGetChar(); - return ptok->tk_symb = ch; - case '|': - if (nch == '|') - return ptok->tk_symb = OR; - else if (nch == '=') - return ptok->tk_symb = ORAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '%': - if (nch == '=') - return ptok->tk_symb = MODAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '*': - if (nch == '=') - return ptok->tk_symb = TIMESAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '^': - if (nch == '=') - return ptok->tk_symb = XORAB; - UnGetChar(); - return ptok->tk_symb = ch; - case '/': - if (nch == '*' && !InputLevel) { - skipcomment(); - goto again; - } - else if (nch == '=') - return ptok->tk_symb = DIVAB; - UnGetChar(); - return ptok->tk_symb = ch; - default: - crash("bad class for char 0%o", ch); - /* NOTREACHED */ - } - case STCHAR: /* character constant */ - ptok->tk_val = char_constant("character"); - return ptok->tk_symb = INTEGER; - case STSTR: /* string */ - ptok->tk_str = string_token("string", '"'); - return ptok->tk_symb = STRING; - case STELL: /* wide character constant/string prefix */ - nch = GetChar(); - if (nch == '"') { - ptok->tk_str = - string_token("wide character string", '"'); + case STCHAR: /* character constant */ + ptok->tk_val = char_constant("character"); + return ptok->tk_symb = INTEGER; + case STSTR: /* string */ + ptok->tk_str = string_token("string", '"'); return ptok->tk_symb = STRING; - } else if (nch == '\'') { - ptok->tk_val = char_constant("wide character"); - return ptok->tk_symb = INTEGER; - } - UnGetChar(); + case STELL: /* wide character constant/string prefix */ + nch = GetChar(); + if (nch == '"') + { + ptok->tk_str = string_token("wide character string", '"'); + return ptok->tk_symb = STRING; + } + else if (nch == '\'') + { + ptok->tk_val = char_constant("wide character"); + return ptok->tk_symb = INTEGER; + } + UnGetChar(); /* fallthrough */ - case STIDF: - { - extern int idfsize; /* ??? */ - register char *tg = &buf[0]; - register char *maxpos = &buf[idfsize]; - int NoExpandNext = 0; + case STIDF: + { + extern int idfsize; /* ??? */ + register char* tg = &buf[0]; + register char* maxpos = &buf[idfsize]; + int NoExpandNext = 0; -#define tstmac(bx) if (!(bits[ch] & bx)) goto nomac -#define cpy *tg++ = ch -#define load (ch = GetChar()); if (!in_idf(ch)) goto endidf +#define tstmac(bx) \ + if (!(bits[ch] & bx)) \ + goto nomac +#define cpy *tg++ = ch +#define load \ + (ch = GetChar()); \ + if (!in_idf(ch)) \ + goto endidf - if (Unstacked) EnableMacros(); /* unstack macro's when allowed. */ - if (ch == NOEXPM) { - NoExpandNext = 1; - ch = GetChar(); - } + if (Unstacked) + EnableMacros(); /* unstack macro's when allowed. */ + if (ch == NOEXPM) + { + NoExpandNext = 1; + ch = GetChar(); + } #ifdef DOBITS - cpy; tstmac(bit0); load; - cpy; tstmac(bit1); load; - cpy; tstmac(bit2); load; - cpy; tstmac(bit3); load; - cpy; tstmac(bit4); load; - cpy; tstmac(bit5); load; - cpy; tstmac(bit6); load; - cpy; tstmac(bit7); load; -#endif - for(;;) { - if (tg < maxpos) { - cpy; - - } + cpy; + tstmac(bit0); load; - } - endidf: - /*if (ch != EOI) UnGetChar();*/ - UnGetChar(); - *tg++ = '\0'; /* mark the end of the identifier */ - if (ReplaceMacros) { - register struct idf *idef = findidf(buf); - - if (idef && idef->id_macro && !NoExpandNext) { - if (replace(idef)) - goto again; + cpy; + tstmac(bit1); + load; + cpy; + tstmac(bit2); + load; + cpy; + tstmac(bit3); + load; + cpy; + tstmac(bit4); + load; + cpy; + tstmac(bit5); + load; + cpy; + tstmac(bit6); + load; + cpy; + tstmac(bit7); + load; +#endif + for (;;) + { + if (tg < maxpos) + { + cpy; + } + load; } - } + endidf: + /*if (ch != EOI) UnGetChar();*/ + UnGetChar(); + *tg++ = '\0'; /* mark the end of the identifier */ + if (ReplaceMacros) + { + register struct idf* idef = findidf(buf); - nomac: /* buf can already be null-terminated. soit */ - ch = GetChar(); - while (in_idf(ch)) { - if (tg < maxpos) *tg++ = ch; - ch = GetChar(); - } - UnGetChar(); - *tg++ = '\0'; /* mark the end of the identifier */ - - NoExpandNext = 0; - if (UnknownIdIsZero) { - ptok->tk_val = (arith)0; - return ptok->tk_symb = INTEGER; - } - ptok->tk_str = Malloc((unsigned)(tg - buf)); - strcpy(ptok->tk_str, buf); - return IDENTIFIER; - } - case STNUM: /* a numeric constant */ - { /* it may only be an integer constant */ - register int base = 10, vch; - register arith val = 0; - int ovfl = 0; - arith ubound = max_arith/(base/2); - - /* Since the preprocessor only knows integers and has - * nothing to do with ellipsis we just return when the - * pp-number starts with a '.' - */ - if (ch == '.') { - return ptok->tk_symb = ch; - } - if (ch == '0') { - ch = GetChar(); - if (ch == 'x' || ch == 'X') { - base = 16; - ch = GetChar(); - } else { - base = 8; + if (idef && idef->id_macro && !NoExpandNext) + { + if (replace(idef)) + goto again; + } } - } - while ((vch = val_in_base(ch, base)) >= 0) { - if (val < 0 || val > ubound) ovfl++; - val *= base; - if (val < 0 && val + vch >= 0) ovfl++; - val += vch; + nomac: /* buf can already be null-terminated. soit */ ch = GetChar(); - } - ptok->tk_unsigned = 0; - if (ch == 'u' || ch == 'U') { - ptok->tk_unsigned = 1; - ch = GetChar(); - if (ch == 'l' || ch == 'L') { + while (in_idf(ch)) + { + if (tg < maxpos) + *tg++ = ch; ch = GetChar(); } + UnGetChar(); + *tg++ = '\0'; /* mark the end of the identifier */ + + NoExpandNext = 0; + if (UnknownIdIsZero) + { + ptok->tk_val = (arith)0; + return ptok->tk_symb = INTEGER; + } + ptok->tk_str = Malloc((unsigned)(tg - buf)); + strcpy(ptok->tk_str, buf); + return IDENTIFIER; } - else if (ch == 'l' || ch == 'L') { - ch = GetChar(); - if (ch == 'u' || ch == 'U') { + case STNUM: /* a numeric constant */ + { /* it may only be an integer constant */ + register int base = 10, vch; + register arith val = 0; + int ovfl = 0; + arith ubound = max_arith / (base / 2); + + /* Since the preprocessor only knows integers and has + * nothing to do with ellipsis we just return when the + * pp-number starts with a '.' + */ + if (ch == '.') + { + return ptok->tk_symb = ch; + } + if (ch == '0') + { + ch = GetChar(); + if (ch == 'x' || ch == 'X') + { + base = 16; + ch = GetChar(); + } + else + { + base = 8; + } + } + while ((vch = val_in_base(ch, base)) >= 0) + { + if (val < 0 || val > ubound) + ovfl++; + val *= base; + if (val < 0 && val + vch >= 0) + ovfl++; + val += vch; + ch = GetChar(); + } + ptok->tk_unsigned = 0; + if (ch == 'u' || ch == 'U') + { ptok->tk_unsigned = 1; ch = GetChar(); + if (ch == 'l' || ch == 'L') + { + ch = GetChar(); + } } + else if (ch == 'l' || ch == 'L') + { + ch = GetChar(); + if (ch == 'u' || ch == 'U') + { + ptok->tk_unsigned = 1; + ch = GetChar(); + } + } + if (ovfl) + { + warning("overflow in constant"); + ptok->tk_unsigned = 1; + } + else if (val < 0) + { + /* give warning??? */ + ptok->tk_unsigned = 1; + } + UnGetChar(); + ptok->tk_val = val; + return ptok->tk_symb = INTEGER; } - if (ovfl) { - warning("overflow in constant"); - ptok->tk_unsigned = 1; - } - else if (val < 0) { - /* give warning??? */ - ptok->tk_unsigned = 1; - } - UnGetChar(); - ptok->tk_val = val; - return ptok->tk_symb = INTEGER; - } - case STEOI: /* end of text on source file */ - return ptok->tk_symb = EOF; - case STMSPEC: - if (!InputLevel) goto garbage; - if (ch == TOKSEP) goto again; + case STEOI: /* end of text on source file */ + return ptok->tk_symb = EOF; + case STMSPEC: + if (!InputLevel) + goto garbage; + if (ch == TOKSEP) + goto again; /* fallthrough shouldn't happen */ - default: /* this cannot happen */ - crash("bad class for char 0%o", ch); + default: /* this cannot happen */ + crash("bad class for char 0%o", ch); } /*NOTREACHED*/ } -void -skipcomment() +void skipcomment() { /* The last character read has been the '*' of '/_*'. The - characters, except NL and EOI, between '/_*' and the first - occurring '*_/' are not interpreted. - NL only affects the LineNumber. EOI is not legal. + characters, except NL and EOI, between '/_*' and the first + occurring '*_/' are not interpreted. + NL only affects the LineNumber. EOI is not legal. - Important note: it is not possible to stop skipping comment - beyond the end-of-file of an included file. - EOI is returned by LoadChar only on encountering EOF of the - top-level file... + Important note: it is not possible to stop skipping comment + beyond the end-of-file of an included file. + EOI is returned by LoadChar only on encountering EOF of the + top-level file... */ register int c; NoUnstack++; c = GetChar(); - do { - while (c != '*') { - if (class(c) == STNL) { + do + { + while (c != '*') + { + if (class(c) == STNL) + { ++LineNumber; - } else if (c == EOI) { + } + else if (c == EOI) + { NoUnstack--; return; } @@ -359,9 +412,7 @@ skipcomment() NoUnstack--; } -arith -char_constant(nm) - char *nm; +arith char_constant(nm) char* nm; { register arith val = 0; register int ch; @@ -371,20 +422,23 @@ char_constant(nm) if (ch == '\'') error("%s constant too short", nm); else - while (ch != '\'') { - if (ch == '\n') { - error("newline in %s constant", nm); - LineNumber++; - break; + while (ch != '\'') + { + if (ch == '\n') + { + error("newline in %s constant", nm); + LineNumber++; + break; + } + if (ch == '\\') + ch = quoted(GetChar()); + if (ch >= 128) + ch -= 256; + if (size < sizeof(arith)) + val |= ch << (8 * size); + size++; + ch = GetChar(); } - if (ch == '\\') - ch = quoted(GetChar()); - if (ch >= 128) ch -= 256; - if (size < sizeof(arith)) - val |= ch << (8 * size); - size++; - ch = GetChar(); - } if (size > sizeof(arith)) error("%s constant too long", nm); else if (size > 1) @@ -392,23 +446,24 @@ char_constant(nm) return val; } -char * -string_token(nm, stop_char) - char *nm; +char* string_token(nm, stop_char) char* nm; { register int ch; register int str_size; - register char *str = Malloc((unsigned) (str_size = ISTRSIZE)); + register char* str = Malloc((unsigned)(str_size = ISTRSIZE)); register int pos = 0; - + ch = GetChar(); - while (ch != stop_char) { - if (ch == '\n') { + while (ch != stop_char) + { + if (ch == '\n') + { error("newline in %s", nm); LineNumber++; break; } - if (ch == EOI) { + if (ch == EOI) + { error("end-of-file inside %s", nm); break; } @@ -424,91 +479,89 @@ string_token(nm, stop_char) return str; } -int -quoted(ch) - register int ch; -{ +int quoted(ch) register int ch; +{ /* quoted() replaces an escaped character sequence by the - character meant. + character meant. */ /* first char after backslash already in ch */ - if (!is_oct(ch)) { /* a quoted char */ - switch (ch) { - case 'n': - ch = '\n'; - break; - case 't': - ch = '\t'; - break; - case 'b': - ch = '\b'; - break; - case 'r': - ch = '\r'; - break; - case 'f': - ch = '\f'; - break; - case 'a': /* alert */ - ch = '\007'; - break; - case 'v': /* vertical tab */ - ch = '\013'; - break; - case 'x': /* quoted hex */ + if (!is_oct(ch)) + { /* a quoted char */ + switch (ch) { - register int hex = 0; - register int vch; + case 'n': + ch = '\n'; + break; + case 't': + ch = '\t'; + break; + case 'b': + ch = '\b'; + break; + case 'r': + ch = '\r'; + break; + case 'f': + ch = '\f'; + break; + case 'a': /* alert */ + ch = '\007'; + break; + case 'v': /* vertical tab */ + ch = '\013'; + break; + case 'x': /* quoted hex */ + { + register int hex = 0; + register int vch; - for (;;) { - ch = GetChar(); - if (vch = val_in_base(ch, 16), vch == -1) - break; - hex = hex * 16 + vch; + for (;;) + { + ch = GetChar(); + if (vch = val_in_base(ch, 16), vch == -1) + break; + hex = hex * 16 + vch; + } + UnGetChar(); + ch = hex; } - UnGetChar(); - ch = hex; } - } - } else { /* a quoted octal */ + } + else + { /* a quoted octal */ register int oct = 0, cnt = 0; - do { - oct = oct*8 + (ch-'0'); + do + { + oct = oct * 8 + (ch - '0'); ch = GetChar(); } while (is_oct(ch) && ++cnt < 3); UnGetChar(); ch = oct; } - return ch&0377; + return ch & 0377; } - -int -val_in_base(ch, base) - register int ch; +int val_in_base(ch, base) register int ch; { - switch (base) { - case 8: - return (is_dig(ch) && ch < '9') ? ch - '0' : -1; - case 10: - return is_dig(ch) ? ch - '0' : -1; - case 16: - return is_dig(ch) ? ch - '0' - : is_hex(ch) ? (ch - 'a' + 10) & 017 - : -1; - default: - fatal("(val_in_base) illegal base value %d", base); - /* NOTREACHED */ + switch (base) + { + case 8: + return (is_dig(ch) && ch < '9') ? ch - '0' : -1; + case 10: + return is_dig(ch) ? ch - '0' : -1; + case 16: + return is_dig(ch) ? ch - '0' : is_hex(ch) ? (ch - 'a' + 10) & 017 : -1; + default: + fatal("(val_in_base) illegal base value %d", base); + /* NOTREACHED */ } } - -int -GetChar() +int GetChar() { /* The routines GetChar and trigraph parses the trigraph - sequences and removes occurences of \\\n. + sequences and removes occurences of \\\n. */ register int ch; @@ -520,58 +573,60 @@ again: ch = trigraph(); /* \\\n are removed from the input stream */ - if (ch == '\\') { + if (ch == '\\') + { LoadChar(ch); - if (ch == '\n') { + if (ch == '\n') + { ++LineNumber; goto again; } PushBack(); ch = '\\'; } - return(LexSave = ch); + return (LexSave = ch); } - -int -trigraph() +int trigraph() { register int ch; LoadChar(ch); - if (ch == '?') { + if (ch == '?') + { LoadChar(ch); - switch (ch) { /* its a trigraph */ - case '=': - ch = '#'; - return(ch); - case '(': - ch = '['; - return(ch); - case '/': - ch = '\\'; - return(ch); - case ')': - ch = ']'; - return(ch); - case '\'': - ch = '^'; - return(ch); - case '<': - ch = '{'; - return(ch); - case '!': - ch = '|'; - return(ch); - case '>': - ch = '}'; - return(ch); - case '-': - ch = '~'; - return(ch); + switch (ch) + { /* its a trigraph */ + case '=': + ch = '#'; + return (ch); + case '(': + ch = '['; + return (ch); + case '/': + ch = '\\'; + return (ch); + case ')': + ch = ']'; + return (ch); + case '\'': + ch = '^'; + return (ch); + case '<': + ch = '{'; + return (ch); + case '!': + ch = '|'; + return (ch); + case '>': + ch = '}'; + return (ch); + case '-': + ch = '~'; + return (ch); } PushBack(); } PushBack(); - return('?'); + return ('?'); }