home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1988 by Sozobon, Limited. Author: Tony Andrews
- *
- * Permission is granted to anyone to use this software for any purpose
- * on any computer system, and to redistribute it freely, with the
- * following restrictions:
- * 1) No charge may be made other than reasonable charges for reproduction.
- * 2) Modified versions must be clearly marked as such.
- * 3) The authors are not responsible for any harmful consequences
- * of using this software, even if they result from defects in it.
- */
- #include "top.h"
-
- /*
- * Symbol table:
- *
- * For each symbol, contains a pointer to the block starting at the
- * given symbol, and a pointer to the next symbol in the symbol table.
- */
- struct sym {
- char *name;
- BLOCK *bp;
- struct sym *next;
- };
-
- struct sym *sfirst = NULL;
- struct sym *slast = NULL;
-
- /*
- * newblock(name) - allocate a new block structure and initialize it
- */
- BLOCK *
- newblock(name)
- register char *name;
- {
- register BLOCK *bp;
-
- if ((bp = (BLOCK *) alloc(sizeof(BLOCK))) == NULL)
- return NULL;
-
- /*
- * Initialize the allocated block structure.
- */
-
- if ((bp->name = strsave(name)) == NULL) {
- free(bp);
- return NULL;
- }
-
- bp->flags = 0;
- bp->ref = 0;
- bp->bcode = 0;
- bp->first = NULL;
- bp->last = NULL;
- bp->bcond = NULL;
- bp->bfall = NULL;
- bp->chain = NULL;
- bp->next = NULL;
- bp->rref = bp->rset = 0;
-
- return bp;
- }
-
- /*
- * mksym(name) - make a new symbol table entry
- *
- * mksym creates new symbol table entries, and allocates space for the
- * 'block' structure that will be used for the symbol. This can happen
- * when a reference to a block is detected, but before the block has
- * been encountered. Since we allocate the block structure here, other
- * blocks can reference it before we actually read it in.
- */
- BLOCK *
- mksym(name)
- register char *name;
- {
- register struct sym *new;
-
- if ((new = (struct sym *) alloc(sizeof(struct sym))) == NULL)
- return NULL;
-
- if ((new->bp = newblock(name)) == NULL) {
- free(new);
- return NULL;
- }
-
- new->name = new->bp->name;
- new->next = NULL;
-
- if (sfirst == NULL)
- sfirst = slast = new;
- else {
- slast->next = new;
- slast = new;
- }
-
- return new->bp;
- }
-
- /*
- * getsym(name) - return a pointer to the block for symbol 'name'
- *
- * Scans the symbol table for the given symbol and returns a pointer
- * to its block, when found, or NULL if not present.
- */
- BLOCK *
- getsym(name)
- register char *name;
- {
- register struct sym *sp;
-
- for (sp = sfirst; sp != NULL ;sp = sp->next) {
- if (strcmp(sp->name, name) == 0)
- return sp->bp;
- }
- return NULL;
- }
-
- /*
- * freeop() - free an operand
- */
- void
- freeop(op)
- struct opnd *op;
- {
- if (is_astr(op->amode) && op->astr != NULL)
- free(op->astr);
- }
-
- /*
- * freesym() - free all symbol table space
- */
- void
- freesym()
- {
- register struct sym *sp, *nexts;
- register INST *ip, *nexti;
-
- for (sp = sfirst; sp != NULL ;sp = nexts) {
- nexts = sp->next;
- for (ip = sp->bp->first; ip != NULL ; ip = nexti) {
- nexti = ip->next;
-
- freeop(&ip->src);
- freeop(&ip->dst);
- free(ip);
- }
- free(sp->name);
- free(sp->bp);
- free(sp);
- }
- sfirst = slast = NULL;
- }
-
- char *
- mktmp()
- {
- static char tname[32];
- static int tnum = 0;
-
- sprintf(tname, "T%d", tnum++);
-
- return tname;
- }
-