summaryrefslogtreecommitdiff
path: root/src/iconc/cmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/iconc/cmem.c')
-rw-r--r--src/iconc/cmem.c114
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;
+ }