diff options
Diffstat (limited to 'src/iconc/cmem.c')
-rw-r--r-- | src/iconc/cmem.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/iconc/cmem.c b/src/iconc/cmem.c new file mode 100644 index 0000000..720a495 --- /dev/null +++ b/src/iconc/cmem.c @@ -0,0 +1,114 @@ +/* + * cmem.c -- memory initialization and allocation for the translator. + */ +#include "../h/gsupport.h" +#include "cglobals.h" +#include "ctrans.h" +#include "csym.h" +#include "ctree.h" +#include "ccode.h" +#include "cproto.h" + +struct centry *chash[CHSize]; /* hash area for constant table */ +struct fentry *fhash[FHSize]; /* hash area for field table */ +struct gentry *ghash[GHSize]; /* hash area for global table */ + +struct implement *bhash[IHSize]; /* hash area for built-in functions */ +struct implement *khash[IHSize]; /* hash area for keywords */ +struct implement *ohash[IHSize]; /* hash area for operators */ + +struct implement *spec_op[NumSpecOp]; /* table of ops with special syntax */ + +char pre[PrfxSz] = {'0', '0', '0'}; /* initial function name prefix */ + +extern struct str_buf lex_sbuf; + + +/* + * init - initialize memory for the translator + */ + +void init() +{ + int i; + + init_str(); + init_sbuf(&lex_sbuf); + + /* + * Zero out the hash tables. + */ + for (i = 0; i < CHSize; i++) + chash[i] = NULL; + for (i = 0; i < FHSize; i++) + fhash[i] = NULL; + for (i = 0; i < GHSize; i++) + ghash[i] = NULL; + for (i = 0; i < IHSize; i++) { + bhash[i] = NULL; + khash[i] = NULL; + ohash[i] = NULL; + } + + /* + * Clear table of operators with non-standard operator syntax. + */ + for (i = 0; i < NumSpecOp; ++i) + spec_op[i] = NULL; + } + +/* + * init_proc - add a new entry on front of procedure list. + */ +void init_proc(name) +char *name; + { + register struct pentry *p; + int i; + struct gentry *sym_ent; + + p = NewStruct(pentry); + p->name = name; + nxt_pre(p->prefix, pre, PrfxSz); + p->prefix[PrfxSz] = '\0'; + p->nargs = 0; + p->args = NULL; + p->ndynam = 0; + p->dynams = NULL; + p->nstatic = 0; + p->has_coexpr = 0; + p->statics = NULL; + p->ret_flag = DoesRet | DoesFail | DoesSusp; /* start out pessimistic */ + p->arg_lst = 0; + p->lhash = + (struct lentry **)alloc((unsigned int)((LHSize)*sizeof(struct lentry *))); + for (i = 0; i < LHSize; i++) + p->lhash[i] = NULL; + p->next = proc_lst; + proc_lst = p; + sym_ent = instl_p(name, F_Proc); + sym_ent->val.proc = proc_lst; + } + +/* + * init_rec - add a new entry on the front of the record list. + */ +void init_rec(name) +char *name; + { + register struct rentry *r; + struct gentry *sym_ent; + static int rec_num = 0; + + r = NewStruct(rentry); + r->name = name; + nxt_pre(r->prefix, pre, PrfxSz); + r->prefix[PrfxSz] = '\0'; + r->rec_num = rec_num++; + r->nfields = 0; + r->fields = NULL; + r->next = rec_lst; + rec_lst = r; + sym_ent= instl_p(name, F_Record); + sym_ent->val.rec = r; + } |