ref: d3a0477d93e577b3a2d9e243fc3d3545f180ba85
dir: /symbol.h/
#pragma once
#ifndef SYMBOL_H
#define SYMBOL_H
#if ! __bool_true_false_are_defined
# include <stdbool.h>
#endif
enum namespace {
NS_IDEN,
NS_KEYWORD,
NS_STRUCT,
NS_LABEL,
NS_TYPEDEF
};
struct type;
struct symbol;
struct ctype {
bool c_typedef : 1;
bool c_extern : 1;
bool c_static : 1;
bool c_auto : 1;
bool c_register : 1;
bool c_const : 1;
bool c_volatile : 1;
struct type *base;
};
struct symbol {
struct ctype ctype;
unsigned char ns;
union {
struct {
char *str;
union {
unsigned char level;/* used in usual symbols */
unsigned char tok; /* used in keywords */
};
};
short val; /* used in integer constant */
};
struct symbol *next;
struct symbol *h_next, *h_prev;
};
struct symctx {
struct symbol *iden;
struct symctx *next;
};
extern void new_ctx(struct symctx *ctx);
extern void del_ctx(void);
extern struct symbol *install(const char *s, unsigned char key);
extern struct symbol *lookup(char *s, unsigned char key);
extern unsigned char hashfun(register const char *s);
#endif