Module Name: src Committed By: rillig Date: Sun Feb 27 22:26:12 UTC 2022
Modified Files: src/usr.bin/xlint/lint1: lex.c Log Message: lint: group symbol table functions No functional change. To generate a diff of this commit: cvs rdiff -u -r1.103 -r1.104 src/usr.bin/xlint/lint1/lex.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.103 src/usr.bin/xlint/lint1/lex.c:1.104 --- src/usr.bin/xlint/lint1/lex.c:1.103 Sun Feb 27 18:29:14 2022 +++ src/usr.bin/xlint/lint1/lex.c Sun Feb 27 22:26:12 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.103 2022/02/27 18:29:14 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.104 2022/02/27 22:26:12 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: lex.c,v 1.103 2022/02/27 18:29:14 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.104 2022/02/27 22:26:12 rillig Exp $"); #endif #include <ctype.h> @@ -68,8 +68,6 @@ bool in_gcc_attribute; bool in_system_header; static int inpc(void); -static unsigned int hash(const char *); -static sym_t * search(sbuf_t *); static int keyw(sym_t *); static int get_escaped_char(int); @@ -260,10 +258,24 @@ static sym_t *symtab[HSHSIZ1]; symt_t symtyp; +static unsigned int +hash(const char *s) +{ + unsigned int v; + const char *p; + + v = 0; + for (p = s; *p != '\0'; p++) { + v = (v << 4) + (unsigned char)*p; + v ^= v >> 28; + } + return v % HSHSIZ1; +} + static void symtab_add(sym_t *sym) { - size_t h; + unsigned int h; h = hash(sym->s_name); if ((sym->s_symtab_next = symtab[h]) != NULL) @@ -272,6 +284,27 @@ symtab_add(sym_t *sym) symtab[h] = sym; } +static sym_t * +symtab_search(sbuf_t *sb) +{ + + unsigned int h = hash(sb->sb_name); + for (sym_t *sym = symtab[h]; sym != NULL; sym = sym->s_symtab_next) { + if (strcmp(sym->s_name, sb->sb_name) != 0) + continue; + + const struct keyword *kw = sym->s_keyword; + if (kw != NULL && !kw->kw_attr) + return sym; + if (kw != NULL && in_gcc_attribute) + return sym; + if (kw == NULL && !in_gcc_attribute && sym->s_kind == symtyp) + return sym; + } + + return NULL; +} + static void symtab_remove(sym_t *sym) { @@ -281,6 +314,19 @@ symtab_remove(sym_t *sym) sym->s_symtab_next = NULL; } +static void +symtab_remove_locals(void) +{ + + for (size_t i = 0; i < HSHSIZ1; i++) { + for (sym_t *sym = symtab[i]; sym != NULL; ) { + sym_t *next = sym->s_symtab_next; + if (sym->s_block_level >= 1) + symtab_remove(sym); + sym = next; + } + } +} static void add_keyword(const struct keyword *kw, bool leading, bool trailing) @@ -356,20 +402,6 @@ inpc(void) return c; } -static unsigned int -hash(const char *s) -{ - unsigned int v; - const char *p; - - v = 0; - for (p = s; *p != '\0'; p++) { - v = (v << 4) + (unsigned char)*p; - v ^= v >> 28; - } - return v % HSHSIZ1; -} - /* * Lex has found a letter followed by zero or more letters or digits. * It looks for a symbol in the symbol table with the same name. This @@ -394,7 +426,7 @@ lex_name(const char *yytext, size_t yyle sb = xmalloc(sizeof(*sb)); sb->sb_name = yytext; sb->sb_len = yyleng; - if ((sym = search(sb)) != NULL && sym->s_keyword != NULL) { + if ((sym = symtab_search(sb)) != NULL && sym->s_keyword != NULL) { free(sb); return keyw(sym); } @@ -418,30 +450,6 @@ lex_name(const char *yytext, size_t yyle return tok; } -static sym_t * -search(sbuf_t *sb) -{ - unsigned int h; - sym_t *sym; - const struct keyword *kw; - - h = hash(sb->sb_name); - for (sym = symtab[h]; sym != NULL; sym = sym->s_symtab_next) { - if (strcmp(sym->s_name, sb->sb_name) != 0) - continue; - kw = sym->s_keyword; - - if (kw != NULL && !kw->kw_attr) - return sym; - if (kw != NULL && in_gcc_attribute) - return sym; - if (kw == NULL && !in_gcc_attribute && sym->s_kind == symtyp) - return sym; - } - - return NULL; -} - static int keyw(sym_t *sym) { @@ -1338,7 +1346,7 @@ getsym(sbuf_t *sb) */ if (symtyp == FMEMBER || symtyp == FLABEL) { if (sym == NULL || sym->s_kind == FVFT) - sym = search(sb); + sym = symtab_search(sb); } if (sym != NULL) { @@ -1475,18 +1483,10 @@ inssym(int bl, sym_t *sym) void cleanup(void) { - sym_t *sym, *nsym; - size_t i; - for (i = 0; i < HSHSIZ1; i++) { - for (sym = symtab[i]; sym != NULL; sym = nsym) { - nsym = sym->s_symtab_next; - if (sym->s_block_level >= 1) - symtab_remove(sym); - } - } + symtab_remove_locals(); - for (i = mem_block_level; i > 0; i--) + for (size_t i = mem_block_level; i > 0; i--) level_free_all(i); }