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

📄 pelsymbl.cc

📁 Gambit 是一个游戏库理论软件
💻 CC
字号:
/***    copyright (c) 1995  Birk Huber*/#include "pelsymbl.h"#define HASHSIZE 100static Sym_ent hashtab[HASHSIZE];/*-----------------------------------------------------------------empty_symbol_table()free all data structures on the symbol table;------------------------------------------------------------------*/void init_symbol_table(){ int i; for(i=0;i<HASHSIZE;i++) hashtab[i]=0;}void empty_symbol_table(){int i;Sym_ent np,np1;for(i=0;i<HASHSIZE;i++) {   np=hashtab[i];   while(np!=0) { np1=np;                  np=np->next;                  free_Gen_list(np1->def);                  mem_free(np1->name);                   mem_free(np1);                  }    }}/*-------------------------------------------------------------------hashing functiion---------------------------------------------------------------------*/int hash(char *s){ int hashval=0; while( *s !='\0') hashval+=*s++; return hashval % HASHSIZE;}/* -----------------------------------------------------------------  lookup takes a string and returns the value on   the hashtable corresponding to the string, or returns NULL if      there is no such entry----------------------------------------------------------------- */Sym_ent Slookup(char *s) { Sym_ent np;   for(np=hashtab[hash(s)]; np!=0;np=np->next)       if (strcmp(s,np->name)== 0) return(np);  return 0;  }/* --------------------------------------------------------------------Sym_ent install(char *s, Gen_node t) if s is already on the symbol table and is unlocked its value     is freed and replaced by t; if s is already on the symbol table and is locked a warning is      printed to stderr, and NULL is returned. otherwise a new_node is created and the values for s and t are      placed on the symbol tableError Conditions: if either s or t is NULL then nothing is done and NULL is returned A malloc failure in the attempt to create a newnode is treated  as an unrecoverable error.--------------------------------------------------------------------*/ Sym_ent install(char *s, Gen_node t){ Sym_ent np,lookup(); int hashval; if (s==NULL||t==NULL) return NULL; if((np=Slookup(s))==NULL) {    np=(Sym_ent)mem_malloc(sizeof(struct Sym_ent_tag));     if (np==NULL) bad_error("malloc bad malloc in install");    np->name=Copy_String(s);     hashval=hash(np->name);    np->next=hashtab[hashval];    hashtab[hashval]=np;    np->lock=0;    np->def=t; } else    if (np->lock==0){         free_Gen_list(np->def);         np->def=t;         np->lock=0;    }    else {      fprintf(stderr /* was Pel_Err */,"warning trying to reinstall a reserved symbol (%s)\n",s);     return NULL;    }return np;}/* ---------------------------------------------------------------Sym_ent lock(Sym_ent s)    Sets lock switch on Symbol table entry so that it is marked as         belonging to a reserved word (If s is NULL does nothing).   return s;Int locked(Sym_ent s)     Returns value of lock switch on s if s is nonNULL. If s is NULL    returns 0 indicate symbol is unlocked (this case could legitimatly    happen if one does try to lock the result of a lookup on a string     wich has no value on the symbol table. Such a symbol is undefined    and clearly should not be considered reserved).-----------------------------------------------------------------*/  Sym_ent lock(Sym_ent s){ if (s!=NULL) s->lock=1;  return s;}int locked(Sym_ent s){ if (s==NULL) return 0;  return s->lock;}

⌨️ 快捷键说明

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