| version 1.2, 2000/08/21 08:31:46 |
version 1.8, 2018/03/29 01:32:54 |
|
|
| * shall be made on your publication or presentation in any form of the |
* shall be made on your publication or presentation in any form of the |
| * results obtained by use of the SOFTWARE. |
* results obtained by use of the SOFTWARE. |
| * (4) In the event that you modify the SOFTWARE, you shall notify FLL by |
* (4) In the event that you modify the SOFTWARE, you shall notify FLL by |
| * e-mail at risa-admin@flab.fujitsu.co.jp of the detailed specification |
* e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification |
| * for such modification or the source code of the modified part of the |
* for such modification or the source code of the modified part of the |
| * SOFTWARE. |
* SOFTWARE. |
| * |
* |
|
|
| * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
| * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
| * |
* |
| * $OpenXM: OpenXM_contrib2/asir2000/parse/cpp.c,v 1.1.1.1 1999/12/03 07:39:12 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/parse/cpp.c,v 1.7 2015/08/14 13:51:56 fujimoto Exp $ |
| */ |
*/ |
| #if defined(__MWERKS__) |
|
| #define THINK_C |
|
| #endif |
|
| |
|
| #include <stdio.h> |
#include <stdio.h> |
| #include <ctype.h> |
#include <ctype.h> |
| #include <setjmp.h> |
#include <setjmp.h> |
|
|
| #include "unctrl.h" |
#include "unctrl.h" |
| #endif |
#endif |
| |
|
| #if defined(THINK_C) |
|
| #include <string.h> |
|
| |
|
| int define(char *,int,unsigned char *,int); |
|
| void Bcopy(char *,char *,int); |
|
| #endif |
|
| |
|
| |
|
| #include "cpp.h" |
#include "cpp.h" |
| |
|
| char *init_accum(void) |
char *init_accum(void) |
| Line 339 void read_formals(void) |
|
| Line 328 void read_formals(void) |
|
| nargs ++; |
nargs ++; |
| c = getnonspace(); |
c = getnonspace(); |
| if (c == ')') |
if (c == ')') |
| { return; |
{ return; |
| } |
} |
| else if (c != ',') |
else if (c != ',') |
| { err_head(); |
{ err_head(); |
| fprintf(stderr,"invalid macro parameter delimiter\n"); |
fprintf(stderr,"invalid macro parameter delimiter\n"); |
| } |
} |
| } |
} |
| else |
else |
| { c = Get(); |
{ c = Get(); |
| if ((c == ')') && (nargs == 0)) |
if ((c == ')') && (nargs == 0)) |
| { return; |
{ return; |
| } |
} |
| else |
else |
| { Push(c); |
{ Push(c); |
| } |
} |
| err_head(); |
err_head(); |
| fprintf(stderr,"missing/illegal macro parameter\n"); |
fprintf(stderr,"missing/illegal macro parameter\n"); |
| while (1) |
while (1) |
| { c = Get(); |
{ c = Get(); |
| if (c == ')') |
if (c == ')') |
| { return; |
{ return; |
| } |
|
| if (isbsymchar(c)) |
|
| { Push(c); |
|
| break; |
|
| } |
|
| } |
|
| } |
} |
| |
if (isbsymchar(c)) |
| |
{ Push(c); |
| |
break; |
| |
} |
| } |
} |
| |
} |
| |
} |
| } |
} |
| |
|
| void do_define(int sharp, int redef) |
void do_define(int sharp, int redef) |
| Line 387 void do_define(int sharp, int redef) |
|
| Line 376 void do_define(int sharp, int redef) |
|
| { char e = '\0'; |
{ char e = '\0'; |
| if (sharp) |
if (sharp) |
| { while (1) |
{ while (1) |
| { c = e; |
{ c = e; |
| e = Get(); |
e = Get(); |
| if (e == '\n') |
if (e == '\n') |
| { if (c == '\\') |
{ if (c == '\\') |
| { maybe_print('\n'); |
{ maybe_print('\n'); |
| } |
} |
| else |
else |
| { break; |
{ break; |
| } |
} |
| } |
|
| } |
|
| } |
} |
| |
} |
| |
} |
| else |
else |
| { do |
{ do |
| { c = e; |
{ c = e; |
| e = Get(); |
e = Get(); |
| } while ((c != '@') || (e == '@')); |
} while ((c != '@') || (e == '@')); |
| Push(e); |
Push(e); |
| } |
} |
| return; |
return; |
| Line 440 void do_define(int sharp, int redef) |
|
| Line 429 void do_define(int sharp, int redef) |
|
| { while (1) |
{ while (1) |
| { c = Get(); |
{ c = Get(); |
| if (quoted && (c == '\n')) |
if (quoted && (c == '\n')) |
| { quoted = 0; |
{ quoted = 0; |
| maybe_print('\n'); |
maybe_print('\n'); |
| } |
} |
| else if (quoted) |
else if (quoted) |
| { accum_char(acc,'\\'); |
{ accum_char(acc,'\\'); |
| accum_char(acc,c); |
accum_char(acc,c); |
| quoted = 0; |
quoted = 0; |
| } |
} |
| else if (c == '/') |
else if (c == '/') |
| { char d = Get(); |
{ char d = Get(); |
| accum_char(acc,'/'); |
accum_char(acc,'/'); |
| if (d == '*') |
if (d == '*') |
| { accum_char(acc,'*'); |
{ accum_char(acc,'*'); |
| incomment = 1; |
incomment = 1; |
| } |
} |
| else |
else |
| { Push(d); |
{ Push(d); |
| } |
} |
| } |
} |
| else if (incomment) |
else if (incomment) |
| { accum_char(acc,c); |
{ accum_char(acc,c); |
| if (c == '*') |
if (c == '*') |
| { char d = Get(); |
{ char d = Get(); |
| if (d == '/') |
if (d == '/') |
| { accum_char(acc,'/'); |
{ accum_char(acc,'/'); |
| incomment = 0; |
incomment = 0; |
| } |
} |
| else |
else |
| { Push(d); |
{ Push(d); |
| } |
} |
| } |
} |
| else if (c == '\n') |
else if (c == '\n') |
| { maybe_print('\n'); |
{ maybe_print('\n'); |
| } |
} |
| } |
} |
| else if (c == '\\') |
else if (c == '\\') |
| { quoted = 1; |
{ quoted = 1; |
| } |
} |
| else if (c == '\n') |
else if (c == '\n') |
| { break; |
{ break; |
| } |
} |
| else |
else |
| { accum_char(acc,c); |
{ accum_char(acc,c); |
| } |
} |
| } |
} |
| } |
} |
| else |
else |
| { while (1) |
{ while (1) |
| { c = Get(); |
{ c = Get(); |
| if (quoted && (c == '@')) |
if (quoted && (c == '@')) |
| { accum_char(acc,'@'); |
{ accum_char(acc,'@'); |
| quoted = 0; |
quoted = 0; |
| } |
} |
| else if (quoted) |
else if (quoted) |
| { Push(c); |
{ Push(c); |
| break; |
break; |
| } |
} |
| else if (c == '/') |
else if (c == '/') |
| { char d = Get(); |
{ char d = Get(); |
| accum_char(acc,'/'); |
accum_char(acc,'/'); |
| if (d == '*') |
if (d == '*') |
| { accum_char(acc,'*'); |
{ accum_char(acc,'*'); |
| incomment = 1; |
incomment = 1; |
| } |
} |
| else |
else |
| { Push(d); |
{ Push(d); |
| } |
} |
| } |
} |
| else if (incomment) |
else if (incomment) |
| { accum_char(acc,c); |
{ accum_char(acc,c); |
| if (c == '*') |
if (c == '*') |
| { char d = Get(); |
{ char d = Get(); |
| if (d == '/') |
if (d == '/') |
| { accum_char(acc,'/'); |
{ accum_char(acc,'/'); |
| incomment = 0; |
incomment = 0; |
| } |
} |
| else |
else |
| { Push(d); |
{ Push(d); |
| } |
} |
| } |
} |
| else if (c == '\n') |
else if (c == '\n') |
| { maybe_print('\n'); |
{ maybe_print('\n'); |
| } |
} |
| } |
} |
| else if (c == '@') |
else if (c == '@') |
| { quoted = 1; |
{ quoted = 1; |
| } |
} |
| else |
else |
| { if (c == '\n') |
{ if (c == '\n') |
| { maybe_print('\n'); |
{ maybe_print('\n'); |
| } |
|
| accum_char(acc,c); |
|
| } |
|
| } |
} |
| |
accum_char(acc,c); |
| } |
} |
| |
} |
| |
} |
| repl = (unsigned char *) accum_result(acc); |
repl = (unsigned char *) accum_result(acc); |
| f = repl; |
f = repl; |
| t = repl; |
t = repl; |
| Line 544 void do_define(int sharp, int redef) |
|
| Line 533 void do_define(int sharp, int redef) |
|
| c = *g; |
c = *g; |
| *g = '\0'; |
*g = '\0'; |
| for (i=0;i<nargs;i++) |
for (i=0;i<nargs;i++) |
| { if (strcmp((char *)f,argnames[i]) == 0) |
{ if (strcmp((char *)f,argnames[i]) == 0) |
| { break; |
{ break; |
| } |
} |
| } |
} |
| if (i < nargs) |
if (i < nargs) |
| { *t++ = 0x80 | i; |
{ *t++ = 0x80 | i; |
| f = g; |
f = g; |
| } |
} |
| else |
else |
| { while (*t++ = *f++) ; |
{ while (*t++ = *f++) ; |
| f --; |
f --; |
| t --; |
t --; |
| } |
} |
| *g = c; |
*g = c; |
| } |
} |
| else if ((f[0] == '/') && (f[1] == '*')) |
else if ((f[0] == '/') && (f[1] == '*')) |
| Line 601 void do_dump(void) |
|
| Line 590 void do_dump(void) |
|
| extern int fstackdepth; |
extern int fstackdepth; |
| |
|
| fprintf(stderr, |
fprintf(stderr, |
| "\n\n\tDump of definition table (%d entries in %d buckets):\n\n", |
"\n\n\tDump of definition table (%d entries in %d buckets):\n\n", |
| n_in_table,symtbl_size); |
n_in_table,symtbl_size); |
| for (i=0;i<symtbl_size;i++) |
for (i=0;i<symtbl_size;i++) |
| { fprintf(stderr,"Bucket %d:\n",i); |
{ fprintf(stderr,"Bucket %d:\n",i); |
| for (d=symtbl[i];d;d=d->link) |
for (d=symtbl[i];d;d=d->link) |
| Line 744 void read_actuals(DEF *d) |
|
| Line 733 void read_actuals(DEF *d) |
|
| c = Get(); |
c = Get(); |
| accum_char(acc,c); |
accum_char(acc,c); |
| if (comment) |
if (comment) |
| { if ((last == '*') && (c == '/')) |
{ if ((last == '*') && (c == '/')) |
| { comment = 0; |
{ comment = 0; |
| } |
} |
| } |
} |
| else |
else |
| { if (backslash) |
{ if (backslash) |
| { backslash = 0; |
{ backslash = 0; |
| } |
|
| else if (quote && (c == quote)) |
|
| { quote = 0; |
|
| } |
|
| else if (c == '\\') |
|
| { backslash = 1; |
|
| } |
|
| else if (quote) |
|
| { |
|
| } |
|
| else if ((last == '/') && (c == '*')) |
|
| { comment = 1; |
|
| } |
|
| else if ((c == '\'') || (c == '"')) |
|
| { quote = c; |
|
| } |
|
| else if (c == '(') |
|
| { pc ++; |
|
| } |
|
| else if (c == ')') |
|
| { if (pc > 0) |
|
| { pc --; |
|
| } |
|
| else |
|
| { accum_regret(acc); |
|
| break; |
|
| } |
|
| } |
|
| else if ((c == ',') && (pc == 0)) |
|
| { accum_regret(acc); |
|
| break; |
|
| } |
|
| } |
|
| } |
} |
| |
else if (quote && (c == quote)) |
| |
{ quote = 0; |
| |
} |
| |
else if (c == '\\') |
| |
{ backslash = 1; |
| |
} |
| |
else if (quote) |
| |
{ |
| |
} |
| |
else if ((last == '/') && (c == '*')) |
| |
{ comment = 1; |
| |
} |
| |
else if ((c == '\'') || (c == '"')) |
| |
{ quote = c; |
| |
} |
| |
else if (c == '(') |
| |
{ pc ++; |
| |
} |
| |
else if (c == ')') |
| |
{ if (pc > 0) |
| |
{ pc --; |
| |
} |
| |
else |
| |
{ accum_regret(acc); |
| |
break; |
| |
} |
| |
} |
| |
else if ((c == ',') && (pc == 0)) |
| |
{ accum_regret(acc); |
| |
break; |
| |
} |
| |
} |
| |
} |
| if (i < n) |
if (i < n) |
| { actuals[i] = accum_result(acc); |
{ actuals[i] = accum_result(acc); |
| actlens[i] = strlen(actuals[i]); |
actlens[i] = strlen(actuals[i]); |
| Line 834 void expand_def(DEF *d) |
|
| Line 823 void expand_def(DEF *d) |
|
| else if (d->nargs > 0) |
else if (d->nargs > 0) |
| { int i; |
{ int i; |
| for (i=0;i<d->nargs;i++) |
for (i=0;i<d->nargs;i++) |
| { outputc((char)(i?',':'(')); |
{ outputc((char)(i?',':'(')); |
| outputs(actuals[i]); |
outputs(actuals[i]); |
| } |
} |
| outputc(')'); |
outputc(')'); |
| } |
} |
| outputs("-->"); |
outputs("-->"); |
| Line 853 void expand_def(DEF *d) |
|
| Line 842 void expand_def(DEF *d) |
|
| int i; |
int i; |
| i = *cp & ~0x80; |
i = *cp & ~0x80; |
| for (dp=actuals[i];*dp;dp++) |
for (dp=actuals[i];*dp;dp++) |
| { accum_char(result,*dp); |
{ accum_char(result,*dp); |
| } |
} |
| } |
} |
| else |
else |
| { accum_char(result,*cp); |
{ accum_char(result,*cp); |
| Line 878 void expand_def(DEF *d) |
|
| Line 867 void expand_def(DEF *d) |
|
| { if (!incomm && (last == '/') && (*ep == '*')) |
{ if (!incomm && (last == '/') && (*ep == '*')) |
| { incomm = 1; |
{ incomm = 1; |
| if (!keep_comments || (strncmp(ep,"**/",3) == 0)) |
if (!keep_comments || (strncmp(ep,"**/",3) == 0)) |
| { accum_regret(result); |
{ accum_regret(result); |
| ok = 0; |
ok = 0; |
| } |
} |
| } |
} |
| if (ok) |
if (ok) |
| { accum_char(result,*ep); |
{ accum_char(result,*ep); |
| Line 925 void expand_def(DEF *d) |
|
| Line 914 void expand_def(DEF *d) |
|
| #define AND TWOCHAR('&','&') |
#define AND TWOCHAR('&','&') |
| #define OR TWOCHAR('|','|') |
#define OR TWOCHAR('|','|') |
| |
|
| #define ALLBINS \ |
#define ALLBINS \ |
| BIN('*',*) \ |
BIN('*',*) \ |
| BIN('/',/) \ |
BIN('/',/) \ |
| BIN('%',%) \ |
BIN('%',%) \ |
| BIN('+',+) \ |
BIN('+',+) \ |
| BIN(LSH,<<) \ |
BIN(LSH,<<) \ |
| BIN(RSH,>>) \ |
BIN(RSH,>>) \ |
| BIN('<',<) \ |
BIN('<',<) \ |
| BIN('>',>) \ |
BIN('>',>) \ |
| BIN(LEQ,<=) \ |
BIN(LEQ,<=) \ |
| BIN(GEQ,>=) \ |
BIN(GEQ,>=) \ |
| BIN(EQL,==) \ |
BIN(EQL,==) \ |
| BIN(NEQ,!=) \ |
BIN(NEQ,!=) \ |
| BIN('&',&) \ |
BIN('&',&) \ |
| BIN('^',^) \ |
BIN('^',^) \ |
| BIN('|',|) \ |
BIN('|',|) \ |
| BIN(AND,&&) \ |
BIN(AND,&&) \ |
| BIN(OR ,||) |
BIN(OR ,||) |
| |
|
| char *Index(char *s, int c); |
char *Index(char *s, int c); |
| |
|
| Line 962 void free_expr(NODE *n) |
|
| Line 951 void free_expr(NODE *n) |
|
| break; |
break; |
| case '-': |
case '-': |
| if (n->left) |
if (n->left) |
| { free_expr(n->left); |
{ free_expr(n->left); |
| } |
} |
| free_expr(n->right); |
free_expr(n->right); |
| break; |
break; |
| case '!': |
case '!': |
| Line 993 int exec_free(NODE *n) |
|
| Line 982 int exec_free(NODE *n) |
|
| break; |
break; |
| case '-': |
case '-': |
| if (n->left) |
if (n->left) |
| { rv = exec_free(n->left); |
{ rv = exec_free(n->left); |
| } |
} |
| else |
else |
| { rv = 0; |
{ rv = 0; |
| } |
} |
| rv -= exec_free(n->right); |
rv -= exec_free(n->right); |
| break; |
break; |
| case '!': |
case '!': |
| Line 1028 int exec_nofree(NODE *n) |
|
| Line 1017 int exec_nofree(NODE *n) |
|
| break; |
break; |
| case '-': |
case '-': |
| if (n->left) |
if (n->left) |
| { rv = exec_nofree(n->left); |
{ rv = exec_nofree(n->left); |
| } |
} |
| else |
else |
| { rv = 0; |
{ rv = 0; |
| } |
} |
| rv -= exec_nofree(n->right); |
rv -= exec_nofree(n->right); |
| break; |
break; |
| case '!': |
case '!': |
| Line 1114 int get_quote_char(void) |
|
| Line 1103 int get_quote_char(void) |
|
| { d = (d << 3) + c - '0'; |
{ d = (d << 3) + c - '0'; |
| c = Get(); |
c = Get(); |
| if ((c >= '0') && (c <= '7')) |
if ((c >= '0') && (c <= '7')) |
| { d = (d << 3) + c - '0'; |
{ d = (d << 3) + c - '0'; |
| } |
} |
| else |
else |
| { Push(c); |
{ Push(c); |
| } |
} |
| } |
} |
| else |
else |
| { Push(c); |
{ Push(c); |
| Line 1169 NODE *read_expr_11(void) |
|
| Line 1158 NODE *read_expr_11(void) |
|
| NODE *read_expr_(void); |
NODE *read_expr_(void); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("()"); |
{ outputs("()"); |
| } |
} |
| #endif |
#endif |
| n = read_expr_(); |
n = read_expr_(); |
| c = getnhsexpand(); |
c = getnhsexpand(); |
| if (c != ')') |
if (c != ')') |
| { err_head(); |
{ err_head(); |
| fprintf(stderr,"expression syntax error -- missing ) supplied\n"); |
fprintf(stderr,"expression syntax error -- missing ) supplied\n"); |
| Push(c); |
Push(c); |
| } |
} |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| return(n); |
return(n); |
| } |
} |
| Line 1190 NODE *read_expr_11(void) |
|
| Line 1179 NODE *read_expr_11(void) |
|
| { int base; |
{ int base; |
| static char digits[] = "0123456789abcdefABCDEF"; |
static char digits[] = "0123456789abcdefABCDEF"; |
| static char values[] = |
static char values[] = |
| "\0\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\12\13\14\15\16\17"; |
"\0\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\12\13\14\15\16\17"; |
| char *d; |
char *d; |
| int v; |
int v; |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("N"); |
{ outputs("N"); |
| } |
} |
| #endif |
#endif |
| base = 10; |
base = 10; |
| if (c == '0') |
if (c == '0') |
| { base = 8; |
{ base = 8; |
| c = Get(); |
c = Get(); |
| if ((c == 'x') || (c == 'X')) |
if ((c == 'x') || (c == 'X')) |
| { base = 16; |
{ base = 16; |
| c = Get(); |
c = Get(); |
| } |
} |
| } |
} |
| v = 0; |
v = 0; |
| while (1) |
while (1) |
| { d = Index(digits,c); |
{ d = Index(digits,c); |
| if (d == 0) |
if (d == 0) |
| { Push(c); |
{ Push(c); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputd(v); |
{ outputd(v); |
| outputs("~"); |
outputs("~"); |
| } |
} |
| #endif |
#endif |
| return(newleaf(v)); |
return(newleaf(v)); |
| } |
|
| else if (values[d-digits] >= base) |
|
| { err_head(); |
|
| fprintf(stderr,"warning: illegal %sdigit `%c'\n", |
|
| (base==16)?"hex ":(base==8)?"octal ":"",c); |
|
| } |
|
| v = (v * base) + values[d-digits]; |
|
| c = Get(); |
|
| } |
|
| } |
} |
| |
else if (values[d-digits] >= base) |
| |
{ err_head(); |
| |
fprintf(stderr,"warning: illegal %sdigit `%c'\n", |
| |
(base==16)?"hex ":(base==8)?"octal ":"",c); |
| |
} |
| |
v = (v * base) + values[d-digits]; |
| |
c = Get(); |
| |
} |
| |
} |
| else if (c == '\'') |
else if (c == '\'') |
| { int i; |
{ int i; |
| int j; |
int j; |
| Line 1236 NODE *read_expr_11(void) |
|
| Line 1225 NODE *read_expr_11(void) |
|
| i = 0; |
i = 0; |
| n = 0; |
n = 0; |
| while (1) |
while (1) |
| { j = get_quote_char(); |
{ j = get_quote_char(); |
| if (j < 0) |
if (j < 0) |
| { break; |
{ break; |
| } |
} |
| i = (i << 8) | j; |
i = (i << 8) | j; |
| n ++; |
n ++; |
| } |
} |
| if (n > 4) |
if (n > 4) |
| { err_head(); |
{ err_head(); |
| fprintf(stderr,"warning: too many characters in character constant\n"); |
fprintf(stderr,"warning: too many characters in character constant\n"); |
| } |
} |
| return(newleaf(i)); |
return(newleaf(i)); |
| } |
} |
| else if ((c == '\n') && !sharp) |
else if ((c == '\n') && !sharp) |
| Line 1255 NODE *read_expr_11(void) |
|
| Line 1244 NODE *read_expr_11(void) |
|
| else |
else |
| { char *id; |
{ char *id; |
| if (complain) |
if (complain) |
| { err_head(); |
{ err_head(); |
| fprintf(stderr,"expression syntax error -- number expected\n"); |
fprintf(stderr,"expression syntax error -- number expected\n"); |
| } |
} |
| if (isbsymchar(c)) |
if (isbsymchar(c)) |
| { Push(c); |
{ Push(c); |
| id = read_ident(); |
id = read_ident(); |
| } |
} |
| else |
else |
| { id = 0; |
{ id = 0; |
| } |
} |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("0("); |
{ outputs("0("); |
| outputc(c); |
outputc(c); |
| outputs(":"); |
outputs(":"); |
| outputs(id?id:"(none)"); |
outputs(id?id:"(none)"); |
| outputs(")~"); |
outputs(")~"); |
| } |
} |
| #endif |
#endif |
| if (id) |
if (id) |
| { free(id); |
{ free(id); |
| } |
} |
| return(newleaf(0)); |
return(newleaf(0)); |
| } |
} |
| } |
} |
| Line 1300 NODE *read_expr_10(void) |
|
| Line 1289 NODE *read_expr_10(void) |
|
| case '~': |
case '~': |
| case '!': |
case '!': |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| } |
} |
| #endif |
#endif |
| n = read_expr_10(); |
n = read_expr_10(); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| return(newnode(0,c,n)); |
return(newnode(0,c,n)); |
| break; |
break; |
| case 'd': |
case 'd': |
| Push(c); |
Push(c); |
| input_mark(); |
input_mark(); |
| w = read_ident(); |
w = read_ident(); |
| if (strcmp(w,"defined") == 0) |
if (strcmp(w,"defined") == 0) |
| { c = getnonspace(); |
{ c = getnonspace(); |
| if (c == '(') |
if (c == '(') |
| { char *id; |
{ char *id; |
| id = read_ident(); |
id = read_ident(); |
| if (id) |
if (id) |
| { c = getnonspace(); |
{ c = getnonspace(); |
| if (c == ')') |
if (c == ')') |
| { input_unmark(); |
{ input_unmark(); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("ifdef"); |
{ outputs("ifdef"); |
| } |
} |
| #endif |
#endif |
| return(newname(id)); |
return(newname(id)); |
| } |
} |
| } |
} |
| } |
} |
| else if (isbsymchar(c)) |
else if (isbsymchar(c)) |
| { char *id; |
{ char *id; |
| Push(c); |
Push(c); |
| id = read_ident(); |
id = read_ident(); |
| if (id) |
if (id) |
| { input_unmark(); |
{ input_unmark(); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("ifdef"); |
{ outputs("ifdef"); |
| } |
} |
| #endif |
#endif |
| return(newname(id)); |
return(newname(id)); |
| } |
} |
| } |
} |
| } |
} |
| input_recover(); |
input_recover(); |
| n = read_expr_11(); |
n = read_expr_11(); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| return(n); |
return(n); |
| break; |
break; |
| default: |
default: |
| Push(c); |
Push(c); |
| n = read_expr_11(); |
n = read_expr_11(); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| return(n); |
return(n); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1391 NODE *read_expr_9(void) |
|
| Line 1380 NODE *read_expr_9(void) |
|
| case '/': |
case '/': |
| case '%': |
case '%': |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| } |
} |
| #endif |
#endif |
| r = read_expr_10(); |
r = read_expr_10(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| break; |
break; |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1429 NODE *read_expr_8(void) |
|
| Line 1418 NODE *read_expr_8(void) |
|
| { case '+': |
{ case '+': |
| case '-': |
case '-': |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| } |
} |
| #endif |
#endif |
| r = read_expr_9(); |
r = read_expr_9(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| break; |
break; |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1467 NODE *read_expr_7(void) |
|
| Line 1456 NODE *read_expr_7(void) |
|
| switch (c) |
switch (c) |
| { case '<': |
{ case '<': |
| case '>': |
case '>': |
| d = Get(); |
d = Get(); |
| if (d == c) |
if (d == c) |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| outputc(d); |
outputc(d); |
| } |
} |
| #endif |
#endif |
| r = read_expr_8(); |
r = read_expr_8(); |
| l = newnode(l,(c=='<')?LSH:RSH,r); |
l = newnode(l,(c=='<')?LSH:RSH,r); |
| break; |
break; |
| } |
} |
| Push(d); |
Push(d); |
| /* fall through ... */ |
/* fall through ... */ |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1513 NODE *read_expr_6(void) |
|
| Line 1502 NODE *read_expr_6(void) |
|
| switch (c) |
switch (c) |
| { case '<': |
{ case '<': |
| case '>': |
case '>': |
| d = Get(); |
d = Get(); |
| if (d == '=') |
if (d == '=') |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| outputc(d); |
outputc(d); |
| } |
} |
| #endif |
#endif |
| r = read_expr_7(); |
r = read_expr_7(); |
| l = newnode(l,(c=='<')?LEQ:GEQ,r); |
l = newnode(l,(c=='<')?LEQ:GEQ,r); |
| } |
} |
| else |
else |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| } |
} |
| #endif |
#endif |
| Push(d); |
Push(d); |
| r = read_expr_7(); |
r = read_expr_7(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| } |
} |
| break; |
break; |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1568 NODE *read_expr_5(void) |
|
| Line 1557 NODE *read_expr_5(void) |
|
| switch (c) |
switch (c) |
| { case '=': |
{ case '=': |
| case '!': |
case '!': |
| d = Get(); |
d = Get(); |
| if (d == '=') |
if (d == '=') |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| outputc(d); |
outputc(d); |
| } |
} |
| #endif |
#endif |
| r = read_expr_6(); |
r = read_expr_6(); |
| l = newnode(l,(c=='=')?EQL:NEQ,r); |
l = newnode(l,(c=='=')?EQL:NEQ,r); |
| break; |
break; |
| } |
} |
| Push(d); |
Push(d); |
| /* fall through ... */ |
/* fall through ... */ |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1613 NODE *read_expr_4(void) |
|
| Line 1602 NODE *read_expr_4(void) |
|
| { c = getnhsexpand(); |
{ c = getnhsexpand(); |
| switch (c) |
switch (c) |
| { case '&': |
{ case '&': |
| d = Get(); |
d = Get(); |
| if (d != '&') |
if (d != '&') |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| outputc(d); |
outputc(d); |
| } |
} |
| #endif |
#endif |
| r = read_expr_5(); |
r = read_expr_5(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| break; |
break; |
| } |
} |
| Push(d); |
Push(d); |
| /* fall through ... */ |
/* fall through ... */ |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1658 NODE *read_expr_3(void) |
|
| Line 1647 NODE *read_expr_3(void) |
|
| switch (c) |
switch (c) |
| { case '^': |
{ case '^': |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| } |
} |
| #endif |
#endif |
| r = read_expr_4(); |
r = read_expr_4(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| break; |
break; |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1695 NODE *read_expr_2(void) |
|
| Line 1684 NODE *read_expr_2(void) |
|
| { c = getnhsexpand(); |
{ c = getnhsexpand(); |
| switch (c) |
switch (c) |
| { case '|': |
{ case '|': |
| d = Get(); |
d = Get(); |
| if (d != '|') |
if (d != '|') |
| { Push(d); |
{ Push(d); |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| } |
} |
| #endif |
#endif |
| r = read_expr_3(); |
r = read_expr_3(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| break; |
break; |
| } |
} |
| Push(d); |
Push(d); |
| /* fall through ... */ |
/* fall through ... */ |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1739 NODE *read_expr_1(void) |
|
| Line 1728 NODE *read_expr_1(void) |
|
| { c = getnhsexpand(); |
{ c = getnhsexpand(); |
| switch (c) |
switch (c) |
| { case '&': |
{ case '&': |
| d = Get(); |
d = Get(); |
| if (d == c) |
if (d == c) |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| outputc(d); |
outputc(d); |
| } |
} |
| #endif |
#endif |
| r = read_expr_2(); |
r = read_expr_2(); |
| l = newnode(l,AND,r); |
l = newnode(l,AND,r); |
| break; |
break; |
| } |
} |
| Push(d); |
Push(d); |
| /* fall through ... */ |
/* fall through ... */ |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1784 NODE *read_expr_0(void) |
|
| Line 1773 NODE *read_expr_0(void) |
|
| { c = getnhsexpand(); |
{ c = getnhsexpand(); |
| switch (c) |
switch (c) |
| { case '|': |
{ case '|': |
| d = Get(); |
d = Get(); |
| if (d == c) |
if (d == c) |
| { |
{ |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputc(c); |
{ outputc(c); |
| outputc(d); |
outputc(d); |
| } |
} |
| #endif |
#endif |
| r = read_expr_1(); |
r = read_expr_1(); |
| l = newnode(l,OR,r); |
l = newnode(l,OR,r); |
| break; |
break; |
| } |
} |
| Push(d); |
Push(d); |
| /* fall through ... */ |
/* fall through ... */ |
| default: |
default: |
| #ifdef DEBUG_EXPR |
#ifdef DEBUG_EXPR |
| if (debugging) |
if (debugging) |
| { outputs("~"); |
{ outputs("~"); |
| } |
} |
| #endif |
#endif |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1829 NODE *read_expr_(void) |
|
| Line 1818 NODE *read_expr_(void) |
|
| switch (c) |
switch (c) |
| { case '\n': |
{ case '\n': |
| case ')': |
case ')': |
| Push(c); |
Push(c); |
| return(l); |
return(l); |
| break; |
break; |
| case ',': |
case ',': |
| r = read_expr_0(); |
r = read_expr_0(); |
| l = newnode(l,c,r); |
l = newnode(l,c,r); |
| break; |
break; |
| default: |
default: |
| err_head(); |
err_head(); |
| fprintf(stderr,"expression syntax error -- bad operator `%c'\n",c); |
fprintf(stderr,"expression syntax error -- bad operator `%c'\n",c); |
| return(l); |
return(l); |
| break; |
break; |
| } |
} |
| } |
} |
| } |
} |
| Line 1917 void dump_expr(NODE *n) |
|
| Line 1906 void dump_expr(NODE *n) |
|
| break; |
break; |
| case '-': |
case '-': |
| if (n->left) |
if (n->left) |
| { dump_expr(n->left); |
{ dump_expr(n->left); |
| } |
} |
| outputc('-'); |
outputc('-'); |
| dump_expr(n->right); |
dump_expr(n->right); |
| break; |
break; |
| Line 1936 void dump_expr(NODE *n) |
|
| Line 1925 void dump_expr(NODE *n) |
|
| outputc(')'); |
outputc(')'); |
| break; |
break; |
| #define BIN(key,op) case key:dump_expr(n->left);\ |
#define BIN(key,op) case key:dump_expr(n->left);\ |
| putx(key);\ |
putx(key);\ |
| dump_expr(n->right);\ |
dump_expr(n->right);\ |
| break; |
break; |
| ALLBINS |
ALLBINS |
| #undef BIN |
#undef BIN |
| } |
} |
| Line 1981 void do_if(int expr_sharp) |
|
| Line 1970 void do_if(int expr_sharp) |
|
| if (sharp) |
if (sharp) |
| { d = '\0'; |
{ d = '\0'; |
| do |
do |
| { c = d; |
{ c = d; |
| d = Get(); |
d = Get(); |
| } while ((c == '\\') || (d != '\n')); |
} while ((c == '\\') || (d != '\n')); |
| } |
} |
| return; |
return; |
| } |
} |
| Line 1996 void do_if(int expr_sharp) |
|
| Line 1985 void do_if(int expr_sharp) |
|
| iffalse(); |
iffalse(); |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputc('>'); |
{ outputc('>'); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| return; |
return; |
| } |
} |
| Line 2044 void do_ifdef(int expr_sharp) |
|
| Line 2033 void do_ifdef(int expr_sharp) |
|
| { |
{ |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs("no ident "); |
{ outputs("no ident "); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| iffalse(); |
iffalse(); |
| } |
} |
| Line 2054 void do_ifdef(int expr_sharp) |
|
| Line 2043 void do_ifdef(int expr_sharp) |
|
| { |
{ |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs(w); |
{ outputs(w); |
| outputc(' '); |
outputc(' '); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| if (find_def(w)) |
if (find_def(w)) |
| { iftrue(); |
{ iftrue(); |
| } |
} |
| else |
else |
| { iffalse(); |
{ iffalse(); |
| } |
} |
| free(w); |
free(w); |
| } |
} |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| Line 2106 void do_ifndef(int expr_sharp) |
|
| Line 2095 void do_ifndef(int expr_sharp) |
|
| { |
{ |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs("no ident "); |
{ outputs("no ident "); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| iftrue(); |
iftrue(); |
| } |
} |
| Line 2116 void do_ifndef(int expr_sharp) |
|
| Line 2105 void do_ifndef(int expr_sharp) |
|
| { |
{ |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs(w); |
{ outputs(w); |
| outputc(' '); |
outputc(' '); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| if (find_def(w)) |
if (find_def(w)) |
| { iffalse(); |
{ iffalse(); |
| } |
} |
| else |
else |
| { iftrue(); |
{ iftrue(); |
| } |
} |
| free(w); |
free(w); |
| } |
} |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| Line 2156 void do_else(int expr_sharp) |
|
| Line 2145 void do_else(int expr_sharp) |
|
| { |
{ |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs("top "); |
{ outputs("top "); |
| output_ifstate(ifstack->condstate); |
output_ifstate(ifstack->condstate); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| switch (ifstack->condstate) |
switch (ifstack->condstate) |
| { case IFSTATE_TRUE: |
{ case IFSTATE_TRUE: |
| ifstack->condstate = IFSTATE_STAYFALSE; |
ifstack->condstate = IFSTATE_STAYFALSE; |
| break; |
break; |
| case IFSTATE_FALSE: |
case IFSTATE_FALSE: |
| ifstack->condstate = IFSTATE_TRUE; |
ifstack->condstate = IFSTATE_TRUE; |
| break; |
break; |
| } |
} |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs(" now "); |
{ outputs(" now "); |
| output_ifstate(ifstack->condstate); |
output_ifstate(ifstack->condstate); |
| outputc('>'); |
outputc('>'); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| } |
} |
| else |
else |
| { |
{ |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs(" no if>"); |
{ outputs(" no if>"); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| err_head(); |
err_head(); |
| fprintf(stderr,"if-less else\n"); |
fprintf(stderr,"if-less else\n"); |
| Line 2256 void do_elif(int expr_sharp) |
|
| Line 2245 void do_elif(int expr_sharp) |
|
| if (sharp) |
if (sharp) |
| { d = '\0'; |
{ d = '\0'; |
| do |
do |
| { c = d; |
{ c = d; |
| d = Get(); |
d = Get(); |
| } while ((c == '\\') || (d != '\n')); |
} while ((c == '\\') || (d != '\n')); |
| } |
} |
| return; |
return; |
| } |
} |
| Line 2271 void do_elif(int expr_sharp) |
|
| Line 2260 void do_elif(int expr_sharp) |
|
| ifstack->condstate = IFSTATE_STAYFALSE; |
ifstack->condstate = IFSTATE_STAYFALSE; |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| if (debugging) |
if (debugging) |
| { outputs("forcing STAYFALSE>"); |
{ outputs("forcing STAYFALSE>"); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| return; |
return; |
| } |
} |
| Line 2300 void do_elif(int expr_sharp) |
|
| Line 2289 void do_elif(int expr_sharp) |
|
| break; |
break; |
| case IFSTATE_FALSE: |
case IFSTATE_FALSE: |
| if (e) |
if (e) |
| { ifstack->condstate = IFSTATE_TRUE; |
{ ifstack->condstate = IFSTATE_TRUE; |
| } |
} |
| break; |
break; |
| } |
} |
| #ifdef DEBUG_IF |
#ifdef DEBUG_IF |
| Line 2451 void do_include(int expr_sharp) |
|
| Line 2440 void do_include(int expr_sharp) |
|
| DEF *d; |
DEF *d; |
| cp = init_accum(); |
cp = init_accum(); |
| while (issymchar(c)) |
while (issymchar(c)) |
| { accum_char(cp,c); |
{ accum_char(cp,c); |
| c = Get(); |
c = Get(); |
| } |
} |
| Push(c); |
Push(c); |
| cp = accum_result(cp); |
cp = accum_result(cp); |
| d = find_def(cp); |
d = find_def(cp); |
| if (d) |
if (d) |
| { expand_def(d); |
{ expand_def(d); |
| n_hits ++; |
n_hits ++; |
| } |
} |
| else |
else |
| { char *dp; |
{ char *dp; |
| for (dp=cp+strlen(cp);dp>cp;dp--) Push(*dp); |
for (dp=cp+strlen(cp);dp>cp;dp--) Push(*dp); |
| n_misses ++; |
n_misses ++; |
| } |
} |
| } |
} |
| else |
else |
| { break; |
{ break; |
| Line 2476 void do_include(int expr_sharp) |
|
| Line 2465 void do_include(int expr_sharp) |
|
| { while (1) |
{ while (1) |
| { c = Get(); |
{ c = Get(); |
| if (c == '\n') |
if (c == '\n') |
| { Push('\n'); |
{ Push('\n'); |
| c = '"'; |
c = '"'; |
| err_head(); |
err_head(); |
| fprintf(stderr,"warning: unterminated %cinclude filename\n", |
fprintf(stderr,"warning: unterminated %cinclude filename\n", |
| sharp?'#':'@'); |
sharp?'#':'@'); |
| } |
} |
| if (c == '"') |
if (c == '"') |
| { break; |
{ break; |
| } |
} |
| accum_char(acc,c); |
accum_char(acc,c); |
| } |
} |
| if (sharp) |
if (sharp) |
| Line 2496 void do_include(int expr_sharp) |
|
| Line 2485 void do_include(int expr_sharp) |
|
| { while (1) |
{ while (1) |
| { c = Get(); |
{ c = Get(); |
| if (c == '\n') |
if (c == '\n') |
| { Push('\n'); |
{ Push('\n'); |
| c = '>'; |
c = '>'; |
| err_head(); |
err_head(); |
| fprintf(stderr,"warning: unterminated %cinclude filename\n", |
fprintf(stderr,"warning: unterminated %cinclude filename\n", |
| sharp?'#':'@'); |
sharp?'#':'@'); |
| } |
} |
| if (c == '>') |
if (c == '>') |
| { break; |
{ break; |
| } |
} |
| accum_char(acc,c); |
accum_char(acc,c); |
| } |
} |
| if (sharp) |
if (sharp) |
| Line 2519 void do_include(int expr_sharp) |
|
| Line 2508 void do_include(int expr_sharp) |
|
| } |
} |
| } |
} |
| |
|
| #if defined(THINK_C) |
|
| #if defined(DELIM) |
|
| #undef DELIM |
|
| #endif |
|
| #define DELIM ':' |
|
| #endif |
|
| |
|
| #if defined(SYSV) |
#if defined(SYSV) |
| #else |
#else |
| #if defined(DELIM) |
#if defined(DELIM) |
| Line 2534 void do_include(int expr_sharp) |
|
| Line 2516 void do_include(int expr_sharp) |
|
| #define DELIM '/' |
#define DELIM '/' |
| #endif |
#endif |
| |
|
| #if defined(VISUAL) |
#if defined(VISUAL) || defined(__MINGW32__) |
| #if defined(DELIM) |
#if defined(DELIM) |
| #undef DELIM |
#undef DELIM |
| #endif |
#endif |
| Line 2570 void read_include_file(char *name, int dohere, int exp |
|
| Line 2552 void read_include_file(char *name, int dohere, int exp |
|
| { int i; |
{ int i; |
| n = temp; |
n = temp; |
| for (i=0;i<nIfiles;i++) |
for (i=0;i<nIfiles;i++) |
| { sprintf(temp,"%s%c%s",Ifiles[i],DELIM,name); |
{ sprintf(temp,"%s%c%s",Ifiles[i],DELIM,name); |
| f = fopen(temp,"r"); |
f = fopen(temp,"r"); |
| if (f != NULL) |
if (f != NULL) |
| { break; |
{ break; |
| } |
|
| } |
|
| } |
} |
| } |
} |
| |
} |
| |
} |
| if (f == NULL) |
if (f == NULL) |
| { err_head(); |
{ err_head(); |
| fprintf(stderr,"can't find include file %s\n",name); |
fprintf(stderr,"can't find include file %s\n",name); |
| Line 2635 char *cur_incldir; |
|
| Line 2617 char *cur_incldir; |
|
| int cur_lineno; |
int cur_lineno; |
| |
|
| typedef struct _mark { |
typedef struct _mark { |
| struct _mark *link; |
struct _mark *link; |
| char *acc; |
char *acc; |
| int startdepth; |
int startdepth; |
| int incs[MAXFILES]; |
int incs[MAXFILES]; |
| int nincs; |
int nincs; |
| int nignore; } MARK; |
int nignore; } MARK; |
| |
|
| static MARK *marks; |
static MARK *marks; |
| static int atline; |
static int atline; |
|
|
| while (1) |
while (1) |
| { if (cur_npushed > 0) |
{ if (cur_npushed > 0) |
| { do |
{ do |
| { c = GET(); |
{ c = GET(); |
| } while (c == NOEXPAND); |
} while (c == NOEXPAND); |
| if (c == MARKLINE) |
if (c == MARKLINE) |
| { mark_get_line(); |
{ mark_get_line(); |
| continue; |
continue; |
| } |
} |
| mark_got_from_pushback(c); |
mark_got_from_pushback(c); |
| #ifdef DEBUG_IO |
#ifdef DEBUG_IO |
| if (debugging) |
if (debugging) |
| { outputc('('); |
{ outputc('('); |
| outputs(unctrl(c)); |
outputs(unctrl(c)); |
| outputc(')'); |
outputc(')'); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| break; |
break; |
| } |
} |
| else |
else |
| { c = getc(cur_fstack); |
{ c = getc(cur_fstack); |
| if (feof(cur_fstack)) |
if (feof(cur_fstack)) |
| { if (fstackdepth > 0) |
{ if (fstackdepth > 0) |
| { |
{ |
| #ifdef DEBUG_INCL |
#ifdef DEBUG_INCL |
| if (debugging) |
if (debugging) |
| { outputs("--eof:"); |
{ outputs("--eof:"); |
| outputs(cur_fn); |
outputs(cur_fn); |
| outputs("--"); |
outputs("--"); |
| } |
} |
| #endif |
#endif |
| fclose(cur_fstack); |
fclose(cur_fstack); |
| free(cur_fn); |
free(cur_fn); |
| free(cur_incldir); |
free(cur_incldir); |
| change_fstackdepth(-1); |
change_fstackdepth(-1); |
| mark_file_ending(); |
mark_file_ending(); |
| out_at(cur_lineno,cur_fn); |
out_at(cur_lineno,cur_fn); |
| autodef_file(curfile()); |
autodef_file(curfile()); |
| autodef_line(curline()); |
autodef_line(curline()); |
| continue; |
continue; |
| } |
} |
| else |
else |
| { flush_final_nl(); |
{ flush_final_nl(); |
| save_stats(); |
save_stats(); |
| #if 0 |
#if 0 |
| exit(0); |
exit(0); |
| #endif |
#endif |
| longjmp(cpp_env,1); |
longjmp(cpp_env,1); |
| } |
} |
| } |
} |
| mark_got_from_file(c); |
mark_got_from_file(c); |
| #ifdef DEBUG_IO |
#ifdef DEBUG_IO |
| if (debugging) |
if (debugging) |
| { outputc('<'); |
{ outputc('<'); |
| outputs(unctrl(c)); |
outputs(unctrl(c)); |
| outputc('>'); |
outputc('>'); |
| fflush(outfile); |
fflush(outfile); |
| } |
} |
| #endif |
#endif |
| break; |
break; |
| } |
} |
| Line 2874 char getnhsexpand(void) |
|
| Line 2856 char getnhsexpand(void) |
|
| if (expr_sharp && (c == '\\')) |
if (expr_sharp && (c == '\\')) |
| { c = Get(); |
{ c = Get(); |
| if (c == '\n') |
if (c == '\n') |
| { continue; |
{ continue; |
| } |
} |
| else |
else |
| { Push(c); |
{ Push(c); |
| c = '\\'; |
c = '\\'; |
| } |
} |
| } |
} |
| break; |
break; |
| } |
} |
| Line 2898 char getexpand(void) |
|
| Line 2880 char getexpand(void) |
|
| { char d; |
{ char d; |
| d = Get(); |
d = Get(); |
| if (d == '*') |
if (d == '*') |
| { d = '\0'; |
{ d = '\0'; |
| do |
do |
| { c = d; |
{ c = d; |
| d = Get(); |
d = Get(); |
| } while ((c != '*') || (d != '/')); |
} while ((c != '*') || (d != '/')); |
| continue; |
continue; |
| } |
} |
| else |
else |
| { Push(d); |
{ Push(d); |
| return('/'); |
return('/'); |
| } |
} |
| } |
} |
| else if (c == NOEXPAND) |
else if (c == NOEXPAND) |
| { c = Get(); |
{ c = Get(); |
| if (issymchar(c)) |
if (issymchar(c)) |
| { Push(NOEXPAND); |
{ Push(NOEXPAND); |
| } |
} |
| return(c); |
return(c); |
| } |
} |
| else if (! isbsymchar(c)) |
else if (! isbsymchar(c)) |
| Line 2934 char getexpand(void) |
|
| Line 2916 char getexpand(void) |
|
| else |
else |
| { int i; |
{ int i; |
| for (i=strlen(str)-1;i>0;i--) |
for (i=strlen(str)-1;i>0;i--) |
| { Push(str[i]); |
{ Push(str[i]); |
| } |
} |
| Push(NOEXPAND); |
Push(NOEXPAND); |
| c = str[0]; |
c = str[0]; |
| free(str); |
free(str); |
| Line 3019 void outputc(char c) |
|
| Line 3001 void outputc(char c) |
|
| { atline += nnls; |
{ atline += nnls; |
| nnls = 0; |
nnls = 0; |
| if (no_line_lines) |
if (no_line_lines) |
| { fprintf(outfile,"\n"); |
{ fprintf(outfile,"\n"); |
| } |
} |
| else |
else |
| { fprintf(outfile,"\n# %d \"%s\"\n",atline,atfile); |
{ fprintf(outfile,"\n# %d \"%s\"\n",atline,atfile); |
| } |
} |
| done_line = 1; |
done_line = 1; |
| } |
} |
| for (;nnls;nnls--) |
for (;nnls;nnls--) |
| Line 3125 void input_recover(void) |
|
| Line 3107 void input_recover(void) |
|
| while (m->nincs > 0) |
while (m->nincs > 0) |
| { l = m->incs[--m->nincs]; |
{ l = m->incs[--m->nincs]; |
| for (;i>=l;i--) |
for (;i>=l;i--) |
| { Push(txt[i]); |
{ Push(txt[i]); |
| } |
} |
| Push(MARKLEND); |
Push(MARKLEND); |
| c = txt[i]; |
c = txt[i]; |
| for (i--;txt[i]!=c;i--) |
for (i--;txt[i]!=c;i--) |
| { Push(txt[i]); |
{ Push(txt[i]); |
| } |
} |
| Push('A'); |
Push('A'); |
| Push('@'); |
Push('@'); |
| Push('@'); |
Push('@'); |
| Line 3181 void mark_file_ending(void) |
|
| Line 3163 void mark_file_ending(void) |
|
| { to = m->incs[--m->nincs]; |
{ to = m->incs[--m->nincs]; |
| acc = m->acc; |
acc = m->acc; |
| for (i=accum_howfar(acc);i>to;i--) |
for (i=accum_howfar(acc);i>to;i--) |
| { accum_regret(acc); |
{ accum_regret(acc); |
| } |
} |
| } |
} |
| } |
} |
| } |
} |
|
|
| char *incldep_o; |
char *incldep_o; |
| int do_at_ctrls; |
int do_at_ctrls; |
| extern char *predefs[]; |
extern char *predefs[]; |
| |
|
| #if defined(SYSV) |
#if defined(SYSV) |
| void main(ac,av) |
void main(ac,av) |
| #else |
#else |
| Line 3333 void cpp_main(int ac, char **av) |
|
| Line 3315 void cpp_main(int ac, char **av) |
|
| int i; |
int i; |
| |
|
| if ( setjmp(cpp_env) ) { |
if ( setjmp(cpp_env) ) { |
| if ( inf != stdin ) |
if ( inf != stdin ) |
| fclose(inf); |
fclose(inf); |
| if ( outf == stdout ) |
if ( outf == stdout ) |
| fflush(outf); |
fflush(outf); |
| else |
else |
| fclose(outf); |
fclose(outf); |
| return; |
return; |
| } |
} |
| |
|
| init_symtbl(); |
init_symtbl(); |
| #define predef(str) ( (cp=copyofstr("1")), \ |
#define predef(str) ( (cp=copyofstr("1")), \ |
| check_malloc(cp), \ |
check_malloc(cp), \ |
| define((str),-1,(unsigned char *)cp,DEF_PREDEF) ) |
define((str),-1,(unsigned char *)cp,DEF_PREDEF) ) |
| for (i=0;predefs[i];i++) |
for (i=0;predefs[i];i++) |
| { predef(predefs[i]); |
{ predef(predefs[i]); |
| } |
} |
| Line 3362 void cpp_main(int ac, char **av) |
|
| Line 3344 void cpp_main(int ac, char **av) |
|
| { if (**av == '-') |
{ if (**av == '-') |
| { rest = 0; |
{ rest = 0; |
| if (!strcmp(*av,"-undef")) |
if (!strcmp(*av,"-undef")) |
| { undef_predefs(); |
{ undef_predefs(); |
| } |
} |
| else |
else |
| { for (++*av;(**av)&&!rest;++*av) |
{ for (++*av;(**av)&&!rest;++*av) |
| { switch (**av) |
{ switch (**av) |
| { case 'C': |
{ case 'C': |
| keep_comments = 1; |
keep_comments = 1; |
| break; |
break; |
| case 'D': |
case 'D': |
| rest = 1; |
rest = 1; |
| ++*av; |
++*av; |
| if (strcmp(*av,"@") == 0) |
if (strcmp(*av,"@") == 0) |
| { do_at_ctrls = 1; |
{ do_at_ctrls = 1; |
| } |
} |
| else |
else |
| { cp = Index(*av,'='); |
{ cp = Index(*av,'='); |
| if (cp) |
if (cp) |
| { if (cp != *av) |
{ if (cp != *av) |
| { char *dp; |
{ char *dp; |
| *cp++ = '\0'; |
*cp++ = '\0'; |
| dp = copyofstr(cp); |
dp = copyofstr(cp); |
| check_malloc(dp); |
check_malloc(dp); |
| define(*av,-1,(unsigned char *)dp,DEF_CMDLINE); |
define(*av,-1,(unsigned char *)dp,DEF_CMDLINE); |
| } |
} |
| else |
else |
| { fprintf(stderr,"Must give a name for -D\n"); |
{ fprintf(stderr,"Must give a name for -D\n"); |
| } |
} |
| } |
} |
| else |
else |
| { char *dp; |
{ char *dp; |
| dp = copyofstr("1"); |
dp = copyofstr("1"); |
| check_malloc(dp); |
check_malloc(dp); |
| define(*av,-1,(unsigned char *)dp,DEF_CMDLINE); |
define(*av,-1,(unsigned char *)dp,DEF_CMDLINE); |
| } |
} |
| } |
} |
| break; |
break; |
| case 'E': |
case 'E': |
| break; |
break; |
| case 'I': |
case 'I': |
| rest = 1; |
rest = 1; |
| ++*av; |
++*av; |
| if (**av) |
if (**av) |
| { Ifile(*av); |
{ Ifile(*av); |
| } |
} |
| else |
else |
| { fprintf(stderr,"Must give a directory name for -I\n"); |
{ fprintf(stderr,"Must give a directory name for -I\n"); |
| } |
} |
| break; |
break; |
| case 'M': |
case 'M': |
| incldep = 1; |
incldep = 1; |
| break; |
break; |
| case 'P': |
case 'P': |
| no_line_lines = 1; |
no_line_lines = 1; |
| break; |
break; |
| case 'R': |
case 'R': |
| break; |
break; |
| case 'U': |
case 'U': |
| rest = 1; |
rest = 1; |
| ++*av; |
++*av; |
| if (**av) |
if (**av) |
| { undef(*av); |
{ undef(*av); |
| } |
} |
| else |
else |
| { fprintf(stderr,"Must give a name for -U\n"); |
{ fprintf(stderr,"Must give a name for -U\n"); |
| } |
} |
| break; |
break; |
| default: |
default: |
| fprintf(stderr,"Unknown flag -%c\n",**av); |
fprintf(stderr,"Unknown flag -%c\n",**av); |
| break; |
break; |
| } |
} |
| } |
|
| } |
|
| } |
} |
| |
} |
| |
} |
| else |
else |
| { switch (argno++) |
{ switch (argno++) |
| { case 0: |
{ case 0: |
| if (strcmp(*av,"-") != 0) |
if (strcmp(*av,"-") != 0) |
| { FILE *f; |
{ FILE *f; |
| f = fopen(*av,"r"); |
f = fopen(*av,"r"); |
| if (f == NULL) |
if (f == NULL) |
| { fprintf(stderr,"Cannot open source file %s\n",*av); |
{ fprintf(stderr,"Cannot open source file %s\n",*av); |
| } |
|
| else |
|
| { inf = f; |
|
| inname = *av; |
|
| } |
|
| } |
|
| break; |
|
| case 1: |
|
| if (strcmp(*av,"-") != 0) |
|
| { FILE *f; |
|
| f = fopen(*av,"w"); |
|
| if (f == NULL) |
|
| { fprintf(stderr,"Can't create %s\n",*av); |
|
| } |
|
| else |
|
| { outf = f; |
|
| } |
|
| } |
|
| break; |
|
| default: |
|
| fprintf(stderr,"Extra name %s ignored\n",*av); |
|
| break; |
|
| } |
|
| } |
} |
| |
else |
| |
{ inf = f; |
| |
inname = *av; |
| |
} |
| |
} |
| |
break; |
| |
case 1: |
| |
if (strcmp(*av,"-") != 0) |
| |
{ FILE *f; |
| |
f = fopen(*av,"w"); |
| |
if (f == NULL) |
| |
{ fprintf(stderr,"Can't create %s\n",*av); |
| |
} |
| |
else |
| |
{ outf = f; |
| |
} |
| |
} |
| |
break; |
| |
default: |
| |
fprintf(stderr,"Extra name %s ignored\n",*av); |
| |
break; |
| } |
} |
| |
} |
| |
} |
| if (incldep && !inname[0]) |
if (incldep && !inname[0]) |
| { fprintf(stderr,"No input file for -M flag\n"); |
{ fprintf(stderr,"No input file for -M flag\n"); |
| #if 0 |
#if 0 |
| exit(1); |
exit(1); |
| #endif |
#endif |
| longjmp(cpp_env,1); |
longjmp(cpp_env,1); |
| } |
} |
| if (do_at_ctrls) |
if (do_at_ctrls) |
| { predef("at_sign_ctrls"); |
{ predef("at_sign_ctrls"); |
| Line 3534 void cpp_main(int ac, char **av) |
|
| Line 3516 void cpp_main(int ac, char **av) |
|
| if (!incldep && (isdigit(c) || (c == '.'))) |
if (!incldep && (isdigit(c) || (c == '.'))) |
| { haddigit = 0; |
{ haddigit = 0; |
| while (isdigit(c) || (c == '.')) |
while (isdigit(c) || (c == '.')) |
| { haddigit |= isdigit(c); |
{ haddigit |= isdigit(c); |
| maybe_print(c); |
maybe_print(c); |
| c = Get(); |
c = Get(); |
| } |
} |
| if (haddigit && ((c == 'e') || (c == 'E'))) |
if (haddigit && ((c == 'e') || (c == 'E'))) |
| { maybe_print(c); |
{ maybe_print(c); |
| c = Get(); |
c = Get(); |
| while (isdigit(c)) |
while (isdigit(c)) |
| { maybe_print(c); |
{ maybe_print(c); |
| c = Get(); |
c = Get(); |
| } |
} |
| } |
} |
| Push(c); |
Push(c); |
| continue; |
continue; |
| } |
} |
| if (quote) |
if (quote) |
| { if (c == '\\') |
{ if (c == '\\') |
| { maybe_print(c); |
{ maybe_print(c); |
| backslash = 1; |
backslash = 1; |
| continue; |
continue; |
| } |
} |
| else if ((c == quote) || (c == '\n')) |
else if ((c == quote) || (c == '\n')) |
| { maybe_print(c); |
{ maybe_print(c); |
| quote = 0; |
quote = 0; |
| continue; |
continue; |
| } |
} |
| else |
else |
| { maybe_print(c); |
{ maybe_print(c); |
| continue; |
continue; |
| } |
} |
| } |
} |
| if (c == '\\') /* this weirdness is Reiser semantics.... */ |
if (c == '\\') /* this weirdness is Reiser semantics.... */ |
| { backslash = 1; |
{ backslash = 1; |
| Line 3582 void cpp_main(int ac, char **av) |
|
| Line 3564 void cpp_main(int ac, char **av) |
|
| } |
} |
| else if (! incldep) |
else if (! incldep) |
| { if (isbsymchar(c) && !in_false_if()) |
{ if (isbsymchar(c) && !in_false_if()) |
| { char *cp; |
{ char *cp; |
| DEF *d; |
DEF *d; |
| cp = init_accum(); |
cp = init_accum(); |
| while (issymchar(c)) |
while (issymchar(c)) |
| { accum_char(cp,c); |
{ accum_char(cp,c); |
| c = Get(); |
c = Get(); |
| } |
} |
| Push(c); |
Push(c); |
| cp = accum_result(cp); |
cp = accum_result(cp); |
| #ifdef DEBUG_MAIN |
#ifdef DEBUG_MAIN |
| if (debugging) |
if (debugging) |
| { outputs("<word:"); |
{ outputs("<word:"); |
| outputs(cp); |
outputs(cp); |
| outputs(">"); |
outputs(">"); |
| } |
} |
| #endif |
#endif |
| d = find_def(cp); |
d = find_def(cp); |
| if (d) |
if (d) |
| { expand_def(d); |
{ expand_def(d); |
| n_hits ++; |
n_hits ++; |
| } |
} |
| else |
else |
| { for (;*cp;cp++) |
{ for (;*cp;cp++) |
| { maybe_print(*cp); |
{ maybe_print(*cp); |
| } |
} |
| n_misses ++; |
n_misses ++; |
| } |
} |
| } |
} |
| else if (c == '/') |
else if (c == '/') |
| { char d; |
{ char d; |
| d = Get(); |
d = Get(); |
| if (d == '*') |
if (d == '*') |
| { d = '\0'; |
{ d = '\0'; |
| if (keep_comments) |
if (keep_comments) |
| { maybe_print('/'); |
{ maybe_print('/'); |
| maybe_print('*'); |
maybe_print('*'); |
| } |
} |
| do |
do |
| { c = d; |
{ c = d; |
| d = Get(); |
d = Get(); |
| if ((d == '\n') || keep_comments) |
if ((d == '\n') || keep_comments) |
| { maybe_print(d); |
{ maybe_print(d); |
| } |
} |
| } while ((c != '*') || (d != '/')); |
} while ((c != '*') || (d != '/')); |
| } |
} |
| else |
else |
| { Push(d); |
{ Push(d); |
| maybe_print(c); |
maybe_print(c); |
| } |
} |
| } |
} |
| else |
else |
| { maybe_print(c); |
{ maybe_print(c); |
| } |
} |
| } |
} |
| } |
} |
| } |
} |
| Line 3662 void do_pragma(void) |
|
| Line 3644 void do_pragma(void) |
|
| } |
} |
| |
|
| char *predefs[] = { |
char *predefs[] = { |
| "mc68000", |
"mc68000", |
| "unix", |
"unix", |
| "NeXT", |
"NeXT", |
| "__MACH__", |
"__MACH__", |
| 0 |
0 |
| }; |
}; |
| |
|
| void do_set(void) |
void do_set(void) |
| Line 3747 void do_sharp(void) |
|
| Line 3729 void do_sharp(void) |
|
| if (strcmp(w,"") == 0) |
if (strcmp(w,"") == 0) |
| { c = Get(); |
{ c = Get(); |
| if (c != '\n') |
if (c != '\n') |
| { Push(c); |
{ Push(c); |
| } |
} |
| else |
else |
| { isnull = 1; |
{ isnull = 1; |
| } |
} |
| } |
} |
| if (!isnull && !in_false_if()) |
if (!isnull && !in_false_if()) |
| { err_head(); |
{ err_head(); |
| Line 3784 void flush_sharp_line(void) |
|
| Line 3766 void flush_sharp_line(void) |
|
| } |
} |
| if (comment) |
if (comment) |
| { if (c == '\\') |
{ if (c == '\\') |
| { backslash = 1; |
{ backslash = 1; |
| } |
} |
| else if ((c == '/') && (lastc == '*')) |
else if ((c == '/') && (lastc == '*')) |
| { comment = 0; |
{ comment = 0; |
| } |
} |
| continue; |
continue; |
| } |
} |
| if (quote) |
if (quote) |
| { if (c == '\\') |
{ if (c == '\\') |
| { backslash = 1; |
{ backslash = 1; |
| } |
} |
| else if (c == quote) |
else if (c == quote) |
| { quote = 0; |
{ quote = 0; |
| } |
} |
| } |
} |
| switch (c) |
switch (c) |
| { case '\\': |
{ case '\\': |
| backslash = 1; |
backslash = 1; |
| continue; |
continue; |
| break; |
break; |
| case '"': case '\'': |
case '"': case '\'': |
| quote = c; |
quote = c; |
| continue; |
continue; |
| break; |
break; |
| case '*': |
case '*': |
| comment = (lastc == '/'); |
comment = (lastc == '/'); |
| continue; |
continue; |
| break; |
break; |
| default: |
default: |
| continue; |
continue; |
| break; |
break; |
| case '\n': |
case '\n': |
| break; |
break; |
| } |
} |
| break; |
break; |
| } |
} |
| Line 3843 void save_stats(void) |
|
| Line 3825 void save_stats(void) |
|
| f = fopen("/@larry/u1/mouse/Mouse-C/cpp.stats","a"); |
f = fopen("/@larry/u1/mouse/Mouse-C/cpp.stats","a"); |
| if (f) |
if (f) |
| { fprintf(f,"%d def, %d undef, %d hits, %d misses\n", |
{ fprintf(f,"%d def, %d undef, %d hits, %d misses\n", |
| n_defines,n_undefines,n_hits,n_misses); |
n_defines,n_undefines,n_hits,n_misses); |
| fclose(f); |
fclose(f); |
| } |
} |
| } |
} |
| Line 4021 void undef_predefs(void) |
|
| Line 4003 void undef_predefs(void) |
|
| while (*D) |
while (*D) |
| { d = *D; |
{ d = *D; |
| if (d->how == DEF_PREDEF) |
if (d->how == DEF_PREDEF) |
| { free(d->name); |
{ free(d->name); |
| free((char *)d->repl); |
free((char *)d->repl); |
| *D = d->link; |
*D = d->link; |
| OLD(d); |
OLD(d); |
| n_in_table --; |
n_in_table --; |
| } |
} |
| else |
else |
| { D = &d->link; |
{ D = &d->link; |
| } |
} |
| } |
} |
| } |
} |
| } |
} |
| |
|
| char *_unctrl[0400] = { "^@", |
char *_unctrl[0400] = { "^@", |
| "^A", |
"^A", |
| "^B", |
"^B", |
| "^C", |
"^C", |
| "^D", |
"^D", |
| "^E", |
"^E", |
| "^F", |
"^F", |
| "^G", |
"^G", |
| "^H", |
"^H", |
| "^I", |
"^I", |
| "^J", |
"^J", |
| "^K", |
"^K", |
| "^L", |
"^L", |
| "^M", |
"^M", |
| "^N", |
"^N", |
| "^O", |
"^O", |
| "^P", |
"^P", |
| "^Q", |
"^Q", |
| "^R", |
"^R", |
| "^S", |
"^S", |
| "^T", |
"^T", |
| "^U", |
"^U", |
| "^V", |
"^V", |
| "^W", |
"^W", |
| "^X", |
"^X", |
| "^Y", |
"^Y", |
| "^Z", |
"^Z", |
| "^[", |
"^[", |
| "^\\", |
"^\\", |
| "^]", |
"^]", |
| "^^", |
"^^", |
| "^_", |
"^_", |
| " ", |
" ", |
| "!", |
"!", |
| "\"", |
"\"", |
| "#", |
"#", |
| "$", |
"$", |
| "%", |
"%", |
| "&", |
"&", |
| "'", |
"'", |
| "(", |
"(", |
| ")", |
")", |
| "*", |
"*", |
| "+", |
"+", |
| ",", |
",", |
| "-", |
"-", |
| ".", |
".", |
| "/", |
"/", |
| "0", |
"0", |
| "1", |
"1", |
| "2", |
"2", |
| "3", |
"3", |
| "4", |
"4", |
| "5", |
"5", |
| "6", |
"6", |
| "7", |
"7", |
| "8", |
"8", |
| "9", |
"9", |
| ":", |
":", |
| ";", |
";", |
| "<", |
"<", |
| "=", |
"=", |
| ">", |
">", |
| "?", |
"?", |
| "@", |
"@", |
| "A", |
"A", |
| "B", |
"B", |
| "C", |
"C", |
| "D", |
"D", |
| "E", |
"E", |
| "F", |
"F", |
| "G", |
"G", |
| "H", |
"H", |
| "I", |
"I", |
| "J", |
"J", |
| "K", |
"K", |
| "L", |
"L", |
| "M", |
"M", |
| "N", |
"N", |
| "O", |
"O", |
| "P", |
"P", |
| "Q", |
"Q", |
| "R", |
"R", |
| "S", |
"S", |
| "T", |
"T", |
| "U", |
"U", |
| "V", |
"V", |
| "W", |
"W", |
| "X", |
"X", |
| "Y", |
"Y", |
| "Z", |
"Z", |
| "[", |
"[", |
| "\\", |
"\\", |
| "]", |
"]", |
| "^", |
"^", |
| "_", |
"_", |
| "`", |
"`", |
| "a", |
"a", |
| "b", |
"b", |
| "c", |
"c", |
| "d", |
"d", |
| "e", |
"e", |
| "f", |
"f", |
| "g", |
"g", |
| "h", |
"h", |
| "i", |
"i", |
| "j", |
"j", |
| "k", |
"k", |
| "l", |
"l", |
| "m", |
"m", |
| "n", |
"n", |
| "o", |
"o", |
| "p", |
"p", |
| "q", |
"q", |
| "r", |
"r", |
| "s", |
"s", |
| "t", |
"t", |
| "u", |
"u", |
| "v", |
"v", |
| "w", |
"w", |
| "x", |
"x", |
| "y", |
"y", |
| "z", |
"z", |
| "{"/*}*/, |
"{"/*}*/, |
| "|", |
"|", |
| /*{*/"}", |
/*{*/"}", |
| "~", |
"~", |
| "^?", |
"^?", |
| "|^@", |
"|^@", |
| "|^A", |
"|^A", |
| "|^B", |
"|^B", |
| "|^C", |
"|^C", |
| "|^D", |
"|^D", |
| "|^E", |
"|^E", |
| "|^F", |
"|^F", |
| "|^G", |
"|^G", |
| "|^H", |
"|^H", |
| "|^I", |
"|^I", |
| "|^J", |
"|^J", |
| "|^K", |
"|^K", |
| "|^L", |
"|^L", |
| "|^M", |
"|^M", |
| "|^N", |
"|^N", |
| "|^O", |
"|^O", |
| "|^P", |
"|^P", |
| "|^Q", |
"|^Q", |
| "|^R", |
"|^R", |
| "|^S", |
"|^S", |
| "|^T", |
"|^T", |
| "|^U", |
"|^U", |
| "|^V", |
"|^V", |
| "|^W", |
"|^W", |
| "|^X", |
"|^X", |
| "|^Y", |
"|^Y", |
| "|^Z", |
"|^Z", |
| "|^[", |
"|^[", |
| "|^\\", |
"|^\\", |
| "|^]", |
"|^]", |
| "|^^", |
"|^^", |
| "|^_", |
"|^_", |
| "| ", |
"| ", |
| "|!", |
"|!", |
| "|\"", |
"|\"", |
| "|#", |
"|#", |
| "|$", |
"|$", |
| "|%", |
"|%", |
| "|&", |
"|&", |
| "|'", |
"|'", |
| "|(", |
"|(", |
| "|)", |
"|)", |
| "|*", |
"|*", |
| "|+", |
"|+", |
| "|,", |
"|,", |
| "|-", |
"|-", |
| "|.", |
"|.", |
| "|/", |
"|/", |
| "|0", |
"|0", |
| "|1", |
"|1", |
| "|2", |
"|2", |
| "|3", |
"|3", |
| "|4", |
"|4", |
| "|5", |
"|5", |
| "|6", |
"|6", |
| "|7", |
"|7", |
| "|8", |
"|8", |
| "|9", |
"|9", |
| "|:", |
"|:", |
| "|;", |
"|;", |
| "|<", |
"|<", |
| "|=", |
"|=", |
| "|>", |
"|>", |
| "|?", |
"|?", |
| "|@", |
"|@", |
| "|A", |
"|A", |
| "|B", |
"|B", |
| "|C", |
"|C", |
| "|D", |
"|D", |
| "|E", |
"|E", |
| "|F", |
"|F", |
| "|G", |
"|G", |
| "|H", |
"|H", |
| "|I", |
"|I", |
| "|J", |
"|J", |
| "|K", |
"|K", |
| "|L", |
"|L", |
| "|M", |
"|M", |
| "|N", |
"|N", |
| "|O", |
"|O", |
| "|P", |
"|P", |
| "|Q", |
"|Q", |
| "|R", |
"|R", |
| "|S", |
"|S", |
| "|T", |
"|T", |
| "|U", |
"|U", |
| "|V", |
"|V", |
| "|W", |
"|W", |
| "|X", |
"|X", |
| "|Y", |
"|Y", |
| "|Z", |
"|Z", |
| "|[", |
"|[", |
| "|\\", |
"|\\", |
| "|]", |
"|]", |
| "|^", |
"|^", |
| "|_", |
"|_", |
| "|`", |
"|`", |
| "|a", |
"|a", |
| "|b", |
"|b", |
| "|c", |
"|c", |
| "|d", |
"|d", |
| "|e", |
"|e", |
| "|f", |
"|f", |
| "|g", |
"|g", |
| "|h", |
"|h", |
| "|i", |
"|i", |
| "|j", |
"|j", |
| "|k", |
"|k", |
| "|l", |
"|l", |
| "|m", |
"|m", |
| "|n", |
"|n", |
| "|o", |
"|o", |
| "|p", |
"|p", |
| "|q", |
"|q", |
| "|r", |
"|r", |
| "|s", |
"|s", |
| "|t", |
"|t", |
| "|u", |
"|u", |
| "|v", |
"|v", |
| "|w", |
"|w", |
| "|x", |
"|x", |
| "|y", |
"|y", |
| "|z", |
"|z", |
| "|{"/*}*/, |
"|{"/*}*/, |
| "||", |
"||", |
| /*{*/"|}", |
/*{*/"|}", |
| "|~", |
"|~", |
| "|^?" }; |
"|^?" }; |
| |
|
| char *_Unctrl[0400] = { "^@", |
char *_Unctrl[0400] = { "^@", |
| "^A", |
"^A", |
| "^B", |
"^B", |
| "^C", |
"^C", |
| "^D", |
"^D", |
| "^E", |
"^E", |
| "^F", |
"^F", |
| "^G", |
"^G", |
| "^H", |
"^H", |
| "^I", |
"^I", |
| "^J", |
"^J", |
| "^K", |
"^K", |
| "^L", |
"^L", |
| "^M", |
"^M", |
| "^N", |
"^N", |
| "^O", |
"^O", |
| "^P", |
"^P", |
| "^Q", |
"^Q", |
| "^R", |
"^R", |
| "^S", |
"^S", |
| "^T", |
"^T", |
| "^U", |
"^U", |
| "^V", |
"^V", |
| "^W", |
"^W", |
| "^X", |
"^X", |
| "^Y", |
"^Y", |
| "^Z", |
"^Z", |
| "^[", |
"^[", |
| "^\\", |
"^\\", |
| "^]", |
"^]", |
| "^^", |
"^^", |
| "^_", |
"^_", |
| "sp", |
"sp", |
| "!", |
"!", |
| "\"", |
"\"", |
| "#", |
"#", |
| "$", |
"$", |
| "%", |
"%", |
| "&", |
"&", |
| "'", |
"'", |
| "(", |
"(", |
| ")", |
")", |
| "*", |
"*", |
| "+", |
"+", |
| ",", |
",", |
| "-", |
"-", |
| ".", |
".", |
| "/", |
"/", |
| "0", |
"0", |
| "1", |
"1", |
| "2", |
"2", |
| "3", |
"3", |
| "4", |
"4", |
| "5", |
"5", |
| "6", |
"6", |
| "7", |
"7", |
| "8", |
"8", |
| "9", |
"9", |
| ":", |
":", |
| ";", |
";", |
| "<", |
"<", |
| "=", |
"=", |
| ">", |
">", |
| "?", |
"?", |
| "@", |
"@", |
| "A", |
"A", |
| "B", |
"B", |
| "C", |
"C", |
| "D", |
"D", |
| "E", |
"E", |
| "F", |
"F", |
| "G", |
"G", |
| "H", |
"H", |
| "I", |
"I", |
| "J", |
"J", |
| "K", |
"K", |
| "L", |
"L", |
| "M", |
"M", |
| "N", |
"N", |
| "O", |
"O", |
| "P", |
"P", |
| "Q", |
"Q", |
| "R", |
"R", |
| "S", |
"S", |
| "T", |
"T", |
| "U", |
"U", |
| "V", |
"V", |
| "W", |
"W", |
| "X", |
"X", |
| "Y", |
"Y", |
| "Z", |
"Z", |
| "[", |
"[", |
| "\\", |
"\\", |
| "]", |
"]", |
| "^", |
"^", |
| "_", |
"_", |
| "`", |
"`", |
| "a", |
"a", |
| "b", |
"b", |
| "c", |
"c", |
| "d", |
"d", |
| "e", |
"e", |
| "f", |
"f", |
| "g", |
"g", |
| "h", |
"h", |
| "i", |
"i", |
| "j", |
"j", |
| "k", |
"k", |
| "l", |
"l", |
| "m", |
"m", |
| "n", |
"n", |
| "o", |
"o", |
| "p", |
"p", |
| "q", |
"q", |
| "r", |
"r", |
| "s", |
"s", |
| "t", |
"t", |
| "u", |
"u", |
| "v", |
"v", |
| "w", |
"w", |
| "x", |
"x", |
| "y", |
"y", |
| "z", |
"z", |
| "{"/*}*/, |
"{"/*}*/, |
| "|", |
"|", |
| /*{*/"}", |
/*{*/"}", |
| "~", |
"~", |
| "^?", |
"^?", |
| "|^@", |
"|^@", |
| "|^A", |
"|^A", |
| "|^B", |
"|^B", |
| "|^C", |
"|^C", |
| "|^D", |
"|^D", |
| "|^E", |
"|^E", |
| "|^F", |
"|^F", |
| "|^G", |
"|^G", |
| "|^H", |
"|^H", |
| "|^I", |
"|^I", |
| "|^J", |
"|^J", |
| "|^K", |
"|^K", |
| "|^L", |
"|^L", |
| "|^M", |
"|^M", |
| "|^N", |
"|^N", |
| "|^O", |
"|^O", |
| "|^P", |
"|^P", |
| "|^Q", |
"|^Q", |
| "|^R", |
"|^R", |
| "|^S", |
"|^S", |
| "|^T", |
"|^T", |
| "|^U", |
"|^U", |
| "|^V", |
"|^V", |
| "|^W", |
"|^W", |
| "|^X", |
"|^X", |
| "|^Y", |
"|^Y", |
| "|^Z", |
"|^Z", |
| "|^[", |
"|^[", |
| "|^\\", |
"|^\\", |
| "|^]", |
"|^]", |
| "|^^", |
"|^^", |
| "|^_", |
"|^_", |
| "|sp", |
"|sp", |
| "|!", |
"|!", |
| "|\"", |
"|\"", |
| "|#", |
"|#", |
| "|$", |
"|$", |
| "|%", |
"|%", |
| "|&", |
"|&", |
| "|'", |
"|'", |
| "|(", |
"|(", |
| "|)", |
"|)", |
| "|*", |
"|*", |
| "|+", |
"|+", |
| "|,", |
"|,", |
| "|-", |
"|-", |
| "|.", |
"|.", |
| "|/", |
"|/", |
| "|0", |
"|0", |
| "|1", |
"|1", |
| "|2", |
"|2", |
| "|3", |
"|3", |
| "|4", |
"|4", |
| "|5", |
"|5", |
| "|6", |
"|6", |
| "|7", |
"|7", |
| "|8", |
"|8", |
| "|9", |
"|9", |
| "|:", |
"|:", |
| "|;", |
"|;", |
| "|<", |
"|<", |
| "|=", |
"|=", |
| "|>", |
"|>", |
| "|?", |
"|?", |
| "|@", |
"|@", |
| "|A", |
"|A", |
| "|B", |
"|B", |
| "|C", |
"|C", |
| "|D", |
"|D", |
| "|E", |
"|E", |
| "|F", |
"|F", |
| "|G", |
"|G", |
| "|H", |
"|H", |
| "|I", |
"|I", |
| "|J", |
"|J", |
| "|K", |
"|K", |
| "|L", |
"|L", |
| "|M", |
"|M", |
| "|N", |
"|N", |
| "|O", |
"|O", |
| "|P", |
"|P", |
| "|Q", |
"|Q", |
| "|R", |
"|R", |
| "|S", |
"|S", |
| "|T", |
"|T", |
| "|U", |
"|U", |
| "|V", |
"|V", |
| "|W", |
"|W", |
| "|X", |
"|X", |
| "|Y", |
"|Y", |
| "|Z", |
"|Z", |
| "|[", |
"|[", |
| "|\\", |
"|\\", |
| "|]", |
"|]", |
| "|^", |
"|^", |
| "|_", |
"|_", |
| "|`", |
"|`", |
| "|a", |
"|a", |
| "|b", |
"|b", |
| "|c", |
"|c", |
| "|d", |
"|d", |
| "|e", |
"|e", |
| "|f", |
"|f", |
| "|g", |
"|g", |
| "|h", |
"|h", |
| "|i", |
"|i", |
| "|j", |
"|j", |
| "|k", |
"|k", |
| "|l", |
"|l", |
| "|m", |
"|m", |
| "|n", |
"|n", |
| "|o", |
"|o", |
| "|p", |
"|p", |
| "|q", |
"|q", |
| "|r", |
"|r", |
| "|s", |
"|s", |
| "|t", |
"|t", |
| "|u", |
"|u", |
| "|v", |
"|v", |
| "|w", |
"|w", |
| "|x", |
"|x", |
| "|y", |
"|y", |
| "|z", |
"|z", |
| "|{"/*}*/, |
"|{"/*}*/, |
| "||", |
"||", |
| /*{*/"|}", |
/*{*/"|}", |
| "|~", |
"|~", |
| "|^?" }; |
"|^?" }; |
| |
|
| void do_undef(int expr_sharp) |
void do_undef(int expr_sharp) |
| { |
{ |
| Line 4560 void do_undef(int expr_sharp) |
|
| Line 4542 void do_undef(int expr_sharp) |
|
| } |
} |
| else |
else |
| { if (undef(mac)) |
{ if (undef(mac)) |
| { n_undefines ++; |
{ n_undefines ++; |
| } |
} |
| } |
} |
| } |
} |
| if (sharp) |
if (sharp) |
| Line 4606 void do_endwhile(void) |
|
| Line 4588 void do_endwhile(void) |
|
| |
|
| char *Index(char *s, int c) |
char *Index(char *s, int c) |
| { |
{ |
| return strchr(s,c); |
return strchr(s,c); |
| } |
} |
| |
|
| char *Rindex(char *s, int c) |
char *Rindex(char *s, int c) |
| { |
{ |
| return strrchr(s,c); |
return strrchr(s,c); |
| } |
} |
| |
|
| void Bcopy(char *from, char *to, int len) |
void Bcopy(char *from, char *to, int len) |
| { |
{ |
| #if defined(GO32) |
#if defined(GO32) |
| bcopy(from,to,len); |
bcopy(from,to,len); |
| #else |
#else |
| memmove((void *)from,(void *)to,(int)len); |
memmove((void *)from,(void *)to,(int)len); |
| #endif |
#endif |
| } |
} |