⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbol.c

📁 calc大数库
💻 C
字号:
/* symbol.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "integer.h"
#include "calc.h"
#include "fun.h"
#include "stack.h"
#ifdef _WIN32
#include "ytab.h"
#else
#include "y.tab.h"
#endif

static Symbol *symlist = NULL; /* symbol table */


Argument createArg(void *arg, int type, int defined)
{
  Symbol *sym;
  Argument Arg;
  if (!(Arg = malloc(sizeof(struct _Argument))))
  {
    printf("Not enough memory to allocate argument\n");
    exit(1);
  }
  sym = (Symbol *) arg; 
  Arg->defined = defined;
  switch (type) {
  case NUM: 
    Arg->type = NUM;
    Arg->u.num = arg;

    break;
  case VARADR:
    Arg->type = VARADR;
    Arg->u.varAdr = &(sym->u.symval);

    break;
  case ARR: 
    Arg->type = ARR;
    /* in this case a symbol has been passed to createArg. it's ok */
    Arg->u.array=sym->u.symarr;
    break;
  case ARRADR: 
    Arg->type = ARRADR;
    Arg->u.arrayAdr=&(sym->u.symarr);
    break;
  case POLY: 
    Arg->type = POLY;
    Arg->u.poly = arg;
    break;
  }
  return Arg;
}

void freeArg(Argument Arg)
{

  switch((Arg)->type) {
  case NUM:
    FREEMPI((Arg)->u.num);
    break;
  case POLY:
    DELETEPI((Arg)->u.poly);
    break;
  }
  free(Arg);
}


Symbol *lookup(char *s, int typ)  /* find s of type  typ  in symbol table */
{
	Symbol *sp;

	for (sp = symlist; sp !=  NULL; sp = sp->next)
	  if (strcmp(sp->name, s) == 0 && (sp->type==typ))
	    return sp;
	return NULL;  /* NULL ==> not found */
}

Symbol *installFunc(char *s, int t, int *argTypes)
{
	Symbol *sp;

	sp = (Symbol *)mmalloc(sizeof(Symbol));
	sp->name = (char *)mmalloc(1 + strlen(s));
	strcpy(sp->name, s);
	sp->type = t;
	sp->argTypes=argTypes;
	sp->next = symlist;  /* put at front of list */
	symlist = sp;
	return sp;
}


Symbol *install (char *s, int t)  /* install s in symbol table */
{
	Symbol *sp;

	sp = (Symbol *)mmalloc(sizeof(Symbol));
	sp->name = (char *)mmalloc(1 + strlen(s));
	strcpy(sp->name, s);
	sp->type = t;
	sp->argTypes=NULL;
	sp->next = symlist;  /* put at front of list */
	symlist = sp;
	return sp;
}

void clean_symtab()
/* deallocates all memory allocated during the CALC session. */
{
	Symbol *tmp;
	int typ;


	while (symlist)
	{
		tmp = symlist->next;
		typ = symlist->type;
		if (typ == VAR && symlist->u.symval != NULL )
			FREEMPI(symlist->u.symval);
		if (typ == ARRAY)
		{
		  FREEMPIA(symlist->u.symarr);
		}	
		if (typ == POLYVAR && symlist->u.sympval != NULL) {
		  DELETEPI(symlist->u.sympval);
		}
		ffree((char*)(symlist->name), 1 + strlen(symlist->name));
		ffree((char*)symlist, sizeof(Symbol));
		symlist=tmp;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -