version 1.25, 2014/01/08 22:55:59 |
version 1.26, 2014/01/10 23:01:29 |
|
|
void copy_ident(void); |
void copy_ident(void); |
void copy_text(void); |
void copy_text(void); |
void copy_union(void); |
void copy_union(void); |
int hexval(int); |
|
bucket * get_literal(void); |
bucket * get_literal(void); |
int is_reserved(char *); |
int is_reserved(char *); |
bucket * get_name(void); |
bucket * get_name(void); |
|
|
} |
} |
|
|
|
|
int |
|
hexval(int c) |
|
{ |
|
if (c >= '0' && c <= '9') |
|
return (c - '0'); |
|
if (c >= 'A' && c <= 'F') |
|
return (c - 'A' + 10); |
|
if (c >= 'a' && c <= 'f') |
|
return (c - 'a' + 10); |
|
return (-1); |
|
} |
|
|
|
|
|
bucket * |
bucket * |
get_literal(void) |
get_literal(void) |
{ |
{ |
|
|
if (c == '\\') |
if (c == '\\') |
{ |
{ |
char *c_cptr = cptr - 1; |
char *c_cptr = cptr - 1; |
|
unsigned long ulval; |
|
|
c = (unsigned char)*cptr++; |
c = (unsigned char)*cptr++; |
switch (c) |
switch (c) |
|
|
|
|
case '0': case '1': case '2': case '3': |
case '0': case '1': case '2': case '3': |
case '4': case '5': case '6': case '7': |
case '4': case '5': case '6': case '7': |
n = c - '0'; |
ulval = strtoul(cptr - 1, &s, 8); |
c = (unsigned char)*cptr; |
if (s == cptr - 1 || ulval > MAXCHAR) illegal_character(c_cptr); |
if (IS_OCTAL(c)) |
c = (int)ulval; |
{ |
cptr = s; |
n = (n << 3) + (c - '0'); |
|
c = (unsigned char)*++cptr; |
|
if (IS_OCTAL(c)) |
|
{ |
|
n = (n << 3) + (c - '0'); |
|
++cptr; |
|
} |
|
} |
|
if (n > MAXCHAR) illegal_character(c_cptr); |
|
c = n; |
|
break; |
break; |
|
|
case 'x': |
case 'x': |
c = (unsigned char)*cptr++; |
ulval = strtoul(cptr, &s, 16); |
n = hexval(c); |
if (s == cptr || ulval > MAXCHAR) illegal_character(c_cptr); |
if (n < 0 || n >= 16) |
c = (int)ulval; |
illegal_character(c_cptr); |
cptr = s; |
for (;;) |
break; |
{ |
|
c = (unsigned char)*cptr; |
|
i = hexval(c); |
|
if (i < 0 || i >= 16) break; |
|
++cptr; |
|
n = (n << 4) + i; |
|
if (n > MAXCHAR) illegal_character(c_cptr); |
|
} |
|
c = n; |
|
break; |
|
|
|
case 'a': c = 7; break; |
case 'a': c = 7; break; |
case 'b': c = '\b'; break; |
case 'b': c = '\b'; break; |