ANSI requires separate name space for labels, and made to use idf module
This commit is contained in:
parent
3a074a6f99
commit
9f43986877
|
@ -22,12 +22,15 @@
|
|||
#include "class.h"
|
||||
#include "assert.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 idfsize = IDFSIZE;
|
||||
char sp_occurred[SP_TOTAL+1];
|
||||
|
||||
#ifndef NOPP
|
||||
int ReplaceMacros = 1; /* replacing macros */
|
||||
|
@ -307,7 +310,6 @@ garbage:
|
|||
{
|
||||
register char *tg = &buf[0];
|
||||
register int pos = -1;
|
||||
register int hash;
|
||||
register struct idf *idef;
|
||||
extern int idfsize; /* ??? */
|
||||
#ifndef NOPP
|
||||
|
@ -319,20 +321,18 @@ garbage:
|
|||
ch = GetChar();
|
||||
}
|
||||
#endif
|
||||
hash = STARTHASH();
|
||||
do { /* read the identifier */
|
||||
if (++pos < idfsize) {
|
||||
*tg++ = ch;
|
||||
hash = ENHASH(hash, ch);
|
||||
}
|
||||
ch = GetChar();
|
||||
} while (in_idf(ch));
|
||||
|
||||
hash = STOPHASH(hash);
|
||||
if (ch != EOI)
|
||||
UnGetChar();
|
||||
*tg++ = '\0'; /* mark the end of the identifier */
|
||||
idef = ptok->tk_idf = idf_hashed(buf, (int) (tg - buf), hash);
|
||||
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
|
||||
|
|
|
@ -41,7 +41,7 @@ insert_token(tk)
|
|||
dot.tk_idf = gen_idf();
|
||||
break;
|
||||
case TYPE_IDENTIFIER:
|
||||
dot.tk_idf = str2idf("int");
|
||||
dot.tk_idf = str2idf("int", 0);
|
||||
break;
|
||||
case STRING:
|
||||
dot.tk_bts = Salloc("", 1);
|
||||
|
|
|
@ -277,7 +277,7 @@ initializer(struct idf *idf; int sc;)
|
|||
stb_string(idf->id_def, sc, idf->id_text);
|
||||
}
|
||||
#endif /* DBSYMTAB */
|
||||
init_idf(idf);
|
||||
idf_initialized(idf);
|
||||
}
|
||||
;
|
||||
|
||||
|
|
|
@ -59,6 +59,8 @@ newline() {
|
|||
print(" ");
|
||||
}
|
||||
|
||||
int dumpidf();
|
||||
|
||||
dumpidftab(msg, opt)
|
||||
char msg[];
|
||||
{
|
||||
|
@ -68,18 +70,10 @@ dumpidftab(msg, opt)
|
|||
Unless opt & 2, reserved identifiers are not dumped.
|
||||
Unless opt & 4, universal identifiers are not dumped.
|
||||
*/
|
||||
int i;
|
||||
|
||||
print(">>> DUMPIDF, %s (start)", msg);
|
||||
dumpstack();
|
||||
for (i = 0; i < HASHSIZE; i++) {
|
||||
register struct idf *notch = idf_hashtable[i];
|
||||
|
||||
while (notch) {
|
||||
dumpidf(notch, opt);
|
||||
notch = notch->next;
|
||||
}
|
||||
}
|
||||
idfappfun(dumpidf, opt);
|
||||
newline();
|
||||
print(">>> DUMPIDF, %s (end)\n", msg);
|
||||
}
|
||||
|
@ -151,13 +145,6 @@ dumpidf(idf, opt)
|
|||
}
|
||||
dumptags(idf->id_struct);
|
||||
}
|
||||
if (idf->id_enum) {
|
||||
if (!started++) {
|
||||
newline();
|
||||
print("%s:", idf->id_text);
|
||||
}
|
||||
dumptags(idf->id_enum);
|
||||
}
|
||||
}
|
||||
|
||||
dumpdefs(def, opt)
|
||||
|
|
|
@ -154,25 +154,19 @@ idf2expr(expr)
|
|||
def = idf->id_def;
|
||||
}
|
||||
/* now def != 0 */
|
||||
if (def->df_type->tp_fund == LABEL) {
|
||||
expr_error(expr, "illegal use of label %s", idf->id_text);
|
||||
expr->ex_type = error_type;
|
||||
}
|
||||
else {
|
||||
#ifndef LINT
|
||||
if (!InSizeof) {
|
||||
if (! def->df_used) {
|
||||
if (!InSizeof) {
|
||||
if (! def->df_used) {
|
||||
#ifndef PREPEND_SCOPES
|
||||
code_scope(idf->id_text, def);
|
||||
code_scope(idf->id_text, def);
|
||||
#endif /* PREPEND_SCOPES */
|
||||
def->df_used = 1;
|
||||
}
|
||||
def->df_used = 1;
|
||||
}
|
||||
}
|
||||
#endif LINT
|
||||
expr->ex_type = def->df_type;
|
||||
if (expr->ex_type == error_type) {
|
||||
expr->ex_flags |= EX_ERROR;
|
||||
}
|
||||
expr->ex_type = def->df_type;
|
||||
if (expr->ex_type == error_type) {
|
||||
expr->ex_flags |= EX_ERROR;
|
||||
}
|
||||
expr->ex_lvalue =
|
||||
( def->df_type->tp_fund == FUNCTION ||
|
||||
|
|
|
@ -29,146 +29,16 @@
|
|||
#include "sizes.h"
|
||||
#include "Lpars.h"
|
||||
#include "assert.h"
|
||||
#include "specials.h" /* registration of special identifiers */
|
||||
|
||||
int idfsize = IDFSIZE;
|
||||
extern char options[];
|
||||
extern arith NewLocal();
|
||||
extern char *symbol2str();
|
||||
|
||||
char sp_occurred[SP_TOTAL+1]; /* indicate occurrence of special id */
|
||||
#ifdef DEBUG
|
||||
#define IDF_DEBUG
|
||||
#endif
|
||||
|
||||
struct idf *idf_hashtable[HASHSIZE];
|
||||
/* All identifiers can in principle be reached through
|
||||
idf_hashtable; idf_hashtable[hc] is the start of a chain of
|
||||
idf's whose tags all hash to hc. Each idf is the start of
|
||||
a chain of def's for that idf, sorted according to level,
|
||||
with the most recent one on top.
|
||||
Any identifier occurring on a level is entered into this
|
||||
list, regardless of the nature of its declaration
|
||||
(variable, selector, structure tag, etc.).
|
||||
*/
|
||||
|
||||
static struct idf *
|
||||
idf_new(tg, size)
|
||||
register char *tg;
|
||||
register int size;
|
||||
{
|
||||
#define IBUFSIZ 2048
|
||||
static unsigned int icnt;
|
||||
static char *ip;
|
||||
register char *p;
|
||||
register struct idf *id = new_idf();
|
||||
|
||||
if (size > icnt) {
|
||||
icnt = size > IBUFSIZ ? size : IBUFSIZ;
|
||||
p = malloc(icnt); /* yes, malloc, not Malloc */
|
||||
if (! p) p = Malloc(size);
|
||||
}
|
||||
else p = ip;
|
||||
icnt -= size;
|
||||
id->id_text = p;
|
||||
while (size--) {
|
||||
*p++ = *tg++;
|
||||
}
|
||||
ip = p;
|
||||
return id;
|
||||
}
|
||||
|
||||
struct idf *
|
||||
idf_hashed(tg, size, hc)
|
||||
char *tg;
|
||||
int size; /* includes the '\0' character */
|
||||
int hc;
|
||||
{
|
||||
/* The tag tg with length size and known hash value hc is
|
||||
looked up in the identifier table; if not found, it is
|
||||
entered. A pointer to it is returned.
|
||||
The identifier has already been truncated to idfsize
|
||||
characters.
|
||||
*/
|
||||
register struct idf **hook = &idf_hashtable[hc], *notch;
|
||||
|
||||
while ((notch = *hook)) {
|
||||
register char *s1 = tg;
|
||||
register char *cp = notch->id_text;
|
||||
register int cmp;
|
||||
|
||||
while (!(cmp = (*s1 - *cp++))) {
|
||||
if (*s1++ == '\0') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmp < 0)
|
||||
break;
|
||||
if (cmp == 0) {
|
||||
/* suppose that special identifiers, as
|
||||
"__setjmp", are already inserted
|
||||
*/
|
||||
sp_occurred[notch->id_special] = 1;
|
||||
return notch;
|
||||
}
|
||||
hook = ¬ch->next;
|
||||
}
|
||||
/* a new struct idf must be inserted at the hook */
|
||||
notch = idf_new(tg, size);
|
||||
notch->next = *hook;
|
||||
*hook = notch; /* hooked in */
|
||||
#ifndef NOPP
|
||||
/* notch->id_resmac = 0; */
|
||||
#endif NOPP
|
||||
return notch;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
hash_stat()
|
||||
{
|
||||
if (options['h']) {
|
||||
register int i;
|
||||
|
||||
print("Hash table tally:\n");
|
||||
for (i = 0; i < HASHSIZE; i++) {
|
||||
register struct idf *notch = idf_hashtable[i];
|
||||
int cnt = 0;
|
||||
|
||||
while (notch) {
|
||||
cnt++;
|
||||
notch = notch->next;
|
||||
}
|
||||
print("%d %d\n", i, cnt);
|
||||
}
|
||||
print("End hash table tally\n");
|
||||
}
|
||||
}
|
||||
#endif DEBUG
|
||||
|
||||
struct idf *
|
||||
str2idf(tg)
|
||||
char tg[];
|
||||
{
|
||||
/* str2idf() returns an entry in the symbol table for the
|
||||
identifier tg. If necessary, an entry is created.
|
||||
It is used where the text of the identifier is available
|
||||
but its hash value is not; otherwise idf_hashed() is to
|
||||
be used.
|
||||
*/
|
||||
register char *cp = tg;
|
||||
register int hash;
|
||||
register int pos = -1;
|
||||
register int ch;
|
||||
char ntg[IDFSIZE + 1];
|
||||
register char *ncp = ntg;
|
||||
|
||||
hash = STARTHASH();
|
||||
while (++pos < idfsize && (ch = *cp++)) {
|
||||
*ncp++ = ch;
|
||||
hash = ENHASH(hash, ch);
|
||||
}
|
||||
hash = STOPHASH(hash);
|
||||
*ncp++ = '\0';
|
||||
return idf_hashed(ntg, (int) (ncp - ntg), hash);
|
||||
}
|
||||
#include <idf_pkg.body>
|
||||
|
||||
struct idf *
|
||||
gen_idf()
|
||||
|
@ -181,7 +51,7 @@ gen_idf()
|
|||
|
||||
sprint(buff, "#%d in %s, line %u",
|
||||
++name_cnt, dot.tk_file, dot.tk_line);
|
||||
return str2idf(buff);
|
||||
return str2idf(buff, 1);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -236,10 +106,7 @@ declare_idf(ds, dc, lvl)
|
|||
symbol2str(type->tp_fund));
|
||||
} else error("void is not a complete type");
|
||||
}
|
||||
else if (type->tp_fund != LABEL) {
|
||||
/* CJ */
|
||||
strict("%s has size 0", idf->id_text);
|
||||
}
|
||||
else strict("%s has size 0", idf->id_text);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -522,7 +389,7 @@ declare_params(dc)
|
|||
}
|
||||
}
|
||||
|
||||
init_idf(idf)
|
||||
idf_initialized(idf)
|
||||
register struct idf *idf;
|
||||
{
|
||||
/* The topmost definition of idf is set to initialized.
|
||||
|
|
|
@ -7,30 +7,35 @@
|
|||
|
||||
#include "nopp.h"
|
||||
|
||||
#define HASHSIZE 307 /* must be odd */
|
||||
|
||||
#define STARTHASH() (0)
|
||||
#define ENHASH(hs,ch) ((hs << 2) + ch)
|
||||
#define STOPHASH(hs) ((unsigned)hs % HASHSIZE)
|
||||
|
||||
struct idf {
|
||||
struct idf *next;
|
||||
char *id_text;
|
||||
struct id_u {
|
||||
#ifndef NOPP
|
||||
struct macro *id_macro;
|
||||
int id_resmac; /* if nonzero: keyword of macroproc. */
|
||||
struct macro *idd_macro;
|
||||
int idd_resmac; /* if nonzero: keyword of macroproc. */
|
||||
#endif NOPP
|
||||
int id_reserved; /* non-zero for reserved words */
|
||||
char *id_file; /* file containing the occurrence */
|
||||
unsigned int id_line; /* line number of the occurrence */
|
||||
struct def *id_def; /* variables, typedefs, enum-constants */
|
||||
struct sdef *id_sdef; /* selector tags */
|
||||
struct tag *id_struct; /* struct and union tags */
|
||||
struct tag *id_enum; /* enum tags */
|
||||
int id_special; /* special action needed at occurrence */
|
||||
int idd_reserved; /* non-zero for reserved words */
|
||||
char *idd_file; /* file containing the occurrence */
|
||||
unsigned int idd_line; /* line number of the occurrence */
|
||||
struct def *idd_label; /* labels */
|
||||
struct def *idd_def; /* variables, typedefs, enum-constants */
|
||||
struct sdef *idd_sdef; /* selector tags */
|
||||
struct tag *idd_struct; /* struct and union tags */
|
||||
int idd_special; /* special action needed at occurrence */
|
||||
};
|
||||
|
||||
/* ALLOCDEF "idf" 50 */
|
||||
#define IDF_TYPE struct id_u
|
||||
#define id_macro id_user.idd_macro
|
||||
#define id_resmac id_user.idd_resmac
|
||||
#define id_reserved id_user.idd_reserved
|
||||
#define id_file id_user.idd_file
|
||||
#define id_line id_user.idd_line
|
||||
#define id_label id_user.idd_label
|
||||
#define id_def id_user.idd_def
|
||||
#define id_sdef id_user.idd_sdef
|
||||
#define id_struct id_user.idd_struct
|
||||
#define id_enum id_user.idd_struct
|
||||
#define id_special id_user.idd_special
|
||||
|
||||
#include <idf_pkg.spec>
|
||||
|
||||
#ifndef NOPP
|
||||
struct dependency {
|
||||
|
@ -41,7 +46,5 @@ struct dependency {
|
|||
/* ALLOCDEF "dependency" 10 */
|
||||
#endif /* NOPP */
|
||||
|
||||
extern struct idf *str2idf(), *idf_hashed();
|
||||
|
||||
extern int level;
|
||||
extern struct idf *gen_idf();
|
||||
|
|
|
@ -56,7 +56,7 @@ init_pp()
|
|||
register struct mkey *mk = &mkey[0];
|
||||
|
||||
while (mk->mk_reserved) {
|
||||
register struct idf *idf = str2idf(mk->mk_reserved);
|
||||
register struct idf *idf = str2idf(mk->mk_reserved, 0);
|
||||
|
||||
if (idf->id_resmac)
|
||||
fatal("maximum identifier length insufficient");
|
||||
|
@ -75,22 +75,22 @@ init_pp()
|
|||
sprint(dbuf, "\"%s %02d %d\"", months[tp->tm_mon],
|
||||
tp->tm_mday, tp->tm_year+1900);
|
||||
if (tp->tm_mday < 10) dbuf[5] = ' '; /* hack */
|
||||
macro_def(str2idf("__DATE__"), dbuf, -1, strlen(dbuf), NOUNDEF);
|
||||
macro_def(str2idf("__DATE__", 0), dbuf, -1, strlen(dbuf), NOUNDEF);
|
||||
|
||||
/* __TIME__ */
|
||||
sprint(tbuf, "\"%02d:%02d:%02d\"", tp->tm_hour, tp->tm_min, tp->tm_sec);
|
||||
macro_def(str2idf("__TIME__"), tbuf, -1, strlen(tbuf), NOUNDEF);
|
||||
macro_def(str2idf("__TIME__", 0), tbuf, -1, strlen(tbuf), NOUNDEF);
|
||||
|
||||
/* __LINE__ */
|
||||
macro_def(str2idf("__LINE__"), "0", -1, 1, NOUNDEF | FUNC);
|
||||
macro_def(str2idf("__LINE__", 0), "0", -1, 1, NOUNDEF | FUNC);
|
||||
|
||||
/* __FILE__ */
|
||||
macro_def(str2idf("__FILE__"), "", -1, 1, NOUNDEF | FUNC);
|
||||
macro_def(str2idf("__FILE__", 0), "", -1, 1, NOUNDEF | FUNC);
|
||||
|
||||
/* __STDC__ */
|
||||
macro_def(str2idf("__STDC__"), "1", -1, 1, NOUNDEF);
|
||||
macro_def(str2idf("__STDC__", 0), "1", -1, 1, NOUNDEF);
|
||||
|
||||
/* defined(??) */
|
||||
macro_def(str2idf("defined"), "", 1, 1, NOUNDEF | FUNC);
|
||||
macro_def(str2idf("defined", 0), "", 1, 1, NOUNDEF | FUNC);
|
||||
}
|
||||
#endif NOPP
|
||||
|
|
|
@ -128,10 +128,12 @@ end_brace(stl)
|
|||
|
||||
while (se) {
|
||||
register struct idf *idf = se->se_idf;
|
||||
register struct def *def = idf->id_def;
|
||||
|
||||
if (def) {
|
||||
lint_1_local(idf, def);
|
||||
if (idf->id_def) {
|
||||
lint_1_local(idf, idf->id_def);
|
||||
}
|
||||
if (stl->sl_level == L_LOCAL && idf->id_label) {
|
||||
lint_1_local(idf, idf->id_label);
|
||||
}
|
||||
se = se->next;
|
||||
}
|
||||
|
|
|
@ -23,26 +23,19 @@ enter_label(idf, defining)
|
|||
scope, i.e., on the lowest possible level.
|
||||
If defining, the label comes from a label statement.
|
||||
*/
|
||||
register struct def *def = idf->id_def;
|
||||
register struct def *def = idf->id_label;
|
||||
|
||||
if (def) {
|
||||
if (def->df_sc == LABEL) {
|
||||
if (defining && def->df_initialized)
|
||||
error("redeclaration of label %s",
|
||||
idf->id_text);
|
||||
}
|
||||
else { /* there may still be room for it */
|
||||
if (def->df_level == level) /* but alas, no */
|
||||
error("%s is not a label", idf->id_text);
|
||||
else {
|
||||
add_def(idf, LABEL, label_type, L_LOCAL);
|
||||
}
|
||||
}
|
||||
if (defining && def->df_initialized)
|
||||
error("redeclaration of label %s", idf->id_text);
|
||||
}
|
||||
else {
|
||||
add_def(idf, LABEL, label_type, L_LOCAL);
|
||||
def = new_def();
|
||||
def->df_sc = LABEL;
|
||||
idf->id_label = def;
|
||||
def->df_file = idf->id_file;
|
||||
def->df_line = idf->id_line;
|
||||
}
|
||||
def = idf->id_def; /* might be changed by 1 of the 2 add_defs */
|
||||
if (def->df_address == 0)
|
||||
def->df_address = (arith) text_label();
|
||||
if (defining)
|
||||
|
@ -54,6 +47,6 @@ unstack_label(idf)
|
|||
{
|
||||
/* The scope in which the label idf occurred is left.
|
||||
*/
|
||||
if (!idf->id_def->df_initialized && !is_anon_idf(idf))
|
||||
if (!idf->id_label->df_initialized && !is_anon_idf(idf))
|
||||
error("label %s not defined", idf->id_text);
|
||||
}
|
||||
|
|
|
@ -121,7 +121,7 @@ main(argc, argv)
|
|||
compile(argc - 1, &argv[1]);
|
||||
|
||||
#ifdef DEBUG
|
||||
hash_stat();
|
||||
if (options['h']) hash_stat();
|
||||
if (options['m']) Info();
|
||||
#endif DEBUG
|
||||
|
||||
|
@ -175,7 +175,7 @@ char *source;
|
|||
add_dependency(s)
|
||||
char *s;
|
||||
{
|
||||
register struct idf *p = str2idf(s);
|
||||
register struct idf *p = str2idf(s, 1);
|
||||
|
||||
if (! p->id_resmac) {
|
||||
register struct dependency *q = new_dependency();
|
||||
|
@ -347,7 +347,6 @@ init()
|
|||
double_type = standard_type(DOUBLE, 0, double_align, double_size);
|
||||
lngdbl_type = standard_type(LNGDBL, 0, lngdbl_align, lngdbl_size);
|
||||
void_type = standard_type(VOID, 0, 1, (arith)-1);
|
||||
label_type = standard_type(LABEL, 0, 0, (arith)0);
|
||||
error_type = standard_type(ERRONEOUS, 0, 1, (arith)1);
|
||||
|
||||
/* Pointer Arithmetic type: all arithmetics concerning
|
||||
|
@ -375,11 +374,11 @@ init()
|
|||
string_type = construct_type(POINTER, schar_type, 0, (arith)0, NO_PROTO);
|
||||
|
||||
/* Define the standard type identifiers. */
|
||||
add_def(str2idf("char"), TYPEDEF, schar_type, L_UNIVERSAL);
|
||||
add_def(str2idf("int"), TYPEDEF, int_type, L_UNIVERSAL);
|
||||
add_def(str2idf("float"), TYPEDEF, float_type, L_UNIVERSAL);
|
||||
add_def(str2idf("double"), TYPEDEF, double_type, L_UNIVERSAL);
|
||||
add_def(str2idf("void"), TYPEDEF, void_type, L_UNIVERSAL);
|
||||
add_def(str2idf("char", 0), TYPEDEF, schar_type, L_UNIVERSAL);
|
||||
add_def(str2idf("int", 0), TYPEDEF, int_type, L_UNIVERSAL);
|
||||
add_def(str2idf("float", 0), TYPEDEF, float_type, L_UNIVERSAL);
|
||||
add_def(str2idf("double", 0), TYPEDEF, double_type, L_UNIVERSAL);
|
||||
add_def(str2idf("void", 0), TYPEDEF, void_type, L_UNIVERSAL);
|
||||
stack_level();
|
||||
}
|
||||
|
||||
|
@ -387,7 +386,7 @@ init_specials(si)
|
|||
register struct sp_id *si;
|
||||
{
|
||||
while (si->si_identifier) {
|
||||
struct idf *idf = str2idf(si->si_identifier);
|
||||
struct idf *idf = str2idf(si->si_identifier, 0);
|
||||
|
||||
if (idf->id_special)
|
||||
fatal("maximum identifier length insufficient");
|
||||
|
@ -473,7 +472,7 @@ Info()
|
|||
extern int cnt_string_cst, cnt_formal,
|
||||
cnt_decl_unary, cnt_def, cnt_expr, cnt_field,
|
||||
cnt_e_stack, cnt_localvar, cnt_proto, cnt_repl,
|
||||
cnt_args, cnt_idf, cnt_macro, cnt_stack_level,
|
||||
cnt_args, cnt_macro, cnt_stack_level,
|
||||
cnt_stack_entry, cnt_stmt_block, cnt_sdef, cnt_tag,
|
||||
cnt_switch_hdr, cnt_case_entry, cnt_type, cnt_brace,
|
||||
cnt_lint_stack_entry, cnt_state, cnt_auto_def,
|
||||
|
@ -482,7 +481,7 @@ Info()
|
|||
%6d string_cst\n%6d formal\n\
|
||||
%6d decl_unary\n%6d def\n%6d expr\n%6d field\n\
|
||||
%6d e_stack\n%6d localvar\n%6d proto\n%6d repl\n\
|
||||
%6d args\n%6d idf\n%6d macro\n%6d stack_level\n\
|
||||
%6d args\n%6d macro\n%6d stack_level\n\
|
||||
%6d stack_entry\n%6d stmt_block\n%6d sdef\n%6d tag\n\
|
||||
%6d switch_hdr\n%6d case_entry\n%6d type\n%6d brace\n\
|
||||
%6d lint_stack_entry\n%6d state\n%6d auto_def\n\
|
||||
|
@ -490,7 +489,7 @@ Info()
|
|||
cnt_string_cst, cnt_formal,
|
||||
cnt_decl_unary, cnt_def, cnt_expr, cnt_field,
|
||||
cnt_e_stack, cnt_localvar, cnt_proto, cnt_repl,
|
||||
cnt_args, cnt_idf, cnt_macro, cnt_stack_level,
|
||||
cnt_args, cnt_macro, cnt_stack_level,
|
||||
cnt_stack_entry, cnt_stmt_block, cnt_sdef, cnt_tag,
|
||||
cnt_switch_hdr, cnt_case_entry, cnt_type, cnt_brace,
|
||||
cnt_lint_stack_entry, cnt_state, cnt_auto_def,
|
||||
|
|
|
@ -146,7 +146,7 @@ next_option: /* to allow combined one-char options */
|
|||
break;
|
||||
}
|
||||
|
||||
macro_def(str2idf(name), mactext, -1, (int)maclen, NOFLAG);
|
||||
macro_def(str2idf(name, 0), mactext, -1, (int)maclen, NOFLAG);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -203,7 +203,7 @@ next_option: /* to allow combined one-char options */
|
|||
|
||||
#ifndef NOPP
|
||||
case 'U' : /* -Uname : undefine predefined */
|
||||
if (*text) do_undef(str2idf(text));
|
||||
if (*text) do_undef(str2idf(text, 0));
|
||||
break;
|
||||
#endif NOPP
|
||||
|
||||
|
|
|
@ -205,7 +205,7 @@ function(struct decspecs *ds; struct declarator *dc;)
|
|||
#ifdef LINT
|
||||
lint_start_function();
|
||||
#endif LINT
|
||||
init_idf(idf);
|
||||
idf_initialized(idf);
|
||||
stack_level(); /* L_FORMAL1 declarations */
|
||||
declare_params(dc);
|
||||
begin_proc(ds, idf); /* sets global function info */
|
||||
|
|
|
@ -181,7 +181,7 @@ struct idf **idpp;
|
|||
}
|
||||
*idpp = tp->tp_idf;
|
||||
switch(tp->tp_fund) {
|
||||
case ENUM: tg = tp->tp_idf->id_enum; break;
|
||||
case ENUM:
|
||||
case UNION:
|
||||
case STRUCT: tg = tp->tp_idf->id_struct; break;
|
||||
}
|
||||
|
@ -331,7 +331,7 @@ struct type *tp;
|
|||
|
||||
ident = tp->tp_idf;
|
||||
switch (tp->tp_fund) {
|
||||
case ENUM: tgpp = &(ident->id_enum); break;
|
||||
case ENUM:
|
||||
case STRUCT:
|
||||
case UNION: tgpp = &(ident->id_struct); break;
|
||||
default: return;
|
||||
|
|
|
@ -326,7 +326,6 @@ actual(repl)
|
|||
register char *p = buf;
|
||||
register struct idf *idef;
|
||||
register int pos = -1;
|
||||
register int hash;
|
||||
extern int idfsize;
|
||||
int NoExpandMacro;
|
||||
|
||||
|
@ -335,26 +334,23 @@ actual(repl)
|
|||
ch = GetChar();
|
||||
} else NoExpandMacro = 0;
|
||||
|
||||
hash = STARTHASH();
|
||||
do {
|
||||
if (++pos < idfsize) {
|
||||
*p++ = ch;
|
||||
hash = ENHASH(hash, ch);
|
||||
}
|
||||
ch = GetChar();
|
||||
} while (in_idf(ch));
|
||||
hash = STOPHASH(hash);
|
||||
*p++ = '\0';
|
||||
UnGetChar();
|
||||
|
||||
/* When the identifier has an associated macro
|
||||
replacement list, it's expanded.
|
||||
*/
|
||||
idef = idf_hashed(buf, (int) (p - buf), hash);
|
||||
if (NoExpandMacro || !replace(idef)) {
|
||||
if ((idef->id_macro
|
||||
&& (idef->id_macro->mc_flag & NOREPLACE))
|
||||
|| NoExpandMacro)
|
||||
idef = findidf(buf);
|
||||
if (!idef || NoExpandMacro || !replace(idef)) {
|
||||
if (NoExpandMacro
|
||||
|| (idef && idef->id_macro
|
||||
&& (idef->id_macro->mc_flag & NOREPLACE)))
|
||||
stash(repl, NOEXPM, !nostashraw);
|
||||
for (p = buf; *p != '\0'; p++)
|
||||
stash(repl, *p, !nostashraw);
|
||||
|
|
|
@ -130,11 +130,14 @@ unstack_level()
|
|||
local_level->sl_entry = se->next;
|
||||
free_stack_entry(se);
|
||||
|
||||
if (level == L_LOCAL && (def = idf->id_label)) {
|
||||
unstack_label(idf);
|
||||
free_def(def);
|
||||
idf->id_label = 0;
|
||||
}
|
||||
while ((def = idf->id_def) && def->df_level >= level) {
|
||||
/* unlink it from the def list under the idf block */
|
||||
if (def->df_sc == LABEL)
|
||||
unstack_label(idf);
|
||||
else if (def->df_sc == REGISTER || def->df_sc == AUTO)
|
||||
if (def->df_sc == REGISTER || def->df_sc == AUTO)
|
||||
FreeLocal(def->df_address);
|
||||
idf->id_def = def->next;
|
||||
free_def(def);
|
||||
|
@ -154,11 +157,6 @@ unstack_level()
|
|||
idf->id_struct = tag->next;
|
||||
free_tag(tag);
|
||||
}
|
||||
while ((tag = idf->id_enum) && tag->tg_level >= level) {
|
||||
/* unlink it from the enum list under the idf block */
|
||||
idf->id_enum = tag->next;
|
||||
free_tag(tag);
|
||||
}
|
||||
}
|
||||
/* Unlink the local stack level from the stack.
|
||||
*/
|
||||
|
|
|
@ -128,7 +128,7 @@ label
|
|||
lint_label();
|
||||
#endif LINT
|
||||
define_label(idf);
|
||||
C_df_ilb((label)idf->id_def->df_address);
|
||||
C_df_ilb((label)idf->id_label->df_address);
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -455,7 +455,7 @@ jump
|
|||
';'
|
||||
{
|
||||
apply_label(idf);
|
||||
C_bra((label)idf->id_def->df_address);
|
||||
C_bra((label)idf->id_label->df_address);
|
||||
#ifdef LINT
|
||||
lint_jump_stmt(idf);
|
||||
#endif LINT
|
||||
|
|
|
@ -183,7 +183,7 @@ declare_struct(fund, idf, tpp)
|
|||
if (*tpp) error("multiple types in declaration");
|
||||
if (!idf)
|
||||
idf = gen_idf();
|
||||
tgp = (fund == ENUM ? &idf->id_enum : &idf->id_struct);
|
||||
tgp = &idf->id_struct;
|
||||
tg = *tgp;
|
||||
if (tg
|
||||
&& tg->tg_type->tp_size < 0
|
||||
|
@ -243,7 +243,7 @@ apply_struct(fund, idf, tpp)
|
|||
*/
|
||||
register struct tag **tgp;
|
||||
|
||||
tgp = (is_struct_or_union(fund) ? &idf->id_struct : &idf->id_enum);
|
||||
tgp = &idf->id_struct;
|
||||
|
||||
if (*tgp)
|
||||
*tpp = (*tgp)->tg_type;
|
||||
|
|
|
@ -138,7 +138,7 @@ reserve(resv)
|
|||
as reserved words.
|
||||
*/
|
||||
while (resv->tn_symbol) {
|
||||
struct idf *idf = str2idf(resv->tn_name);
|
||||
struct idf *idf = str2idf(resv->tn_name, 0);
|
||||
|
||||
if (idf->id_reserved)
|
||||
fatal("maximum identifier length insufficient");
|
||||
|
|
|
@ -34,7 +34,7 @@ struct type
|
|||
*int_type, *uint_type,
|
||||
*long_type, *ulong_type,
|
||||
*float_type, *double_type, *lngdbl_type,
|
||||
*void_type, *label_type,
|
||||
*void_type,
|
||||
*string_type, *funint_type, *error_type;
|
||||
|
||||
struct type *pa_type; /* Pointer-Arithmetic type */
|
||||
|
|
|
@ -73,7 +73,7 @@ extern struct type
|
|||
*int_type, *uint_type,
|
||||
*long_type, *ulong_type,
|
||||
*float_type, *double_type, *lngdbl_type,
|
||||
*void_type, *label_type,
|
||||
*void_type,
|
||||
*string_type, *funint_type, *error_type;
|
||||
|
||||
extern struct type *pa_type; /* type.c */
|
||||
|
|
Loading…
Reference in a new issue