?? symtab.c
字號:
/* @(#)symtab.c 1.3 96/09/02 *//* * ==================================================== * Copyright (C) 1995 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */#include <string.h>#include "fpp.h"#include "service.h"#include "symtab.h"struct _sym { int type; int flag; SymPtr next; char name[MAXNAMELEN+1]; union { int i; char *s; } val;};static SymPtr symtab[MAXSYMTAB];static mask[256];typedef struct _mlist { struct _mlist *next; Sym *sym;} MList;MList *marked = NULL; /*************************************************** Functions */voidsympush(Sym *s) { MList *tmp; tmp = my_alloc(sizeof(MList),1); tmp->next = marked; tmp->sym = s; marked = tmp;}voidsympop() { MList *tmp; CHECK(marked); tmp = marked; marked = marked->next; free(tmp);}intsymrecurse(SymPtr s) { MList *p; CHECK(s); if (marked) { if (marked->sym == s) {/* fppmess(WARN_MREC,s->name); */ return 1; } } else return 0; CHECK(marked); p = marked; if (p->sym) p = p->next; /* `#define a(x) 1+a(x)` aren't recursed */ for (;p&&p->sym;p=p->next) { if (s == p->sym) { fppmess(ERR_MREC,s->name); return 1; } } return 0;}voidsymhide() { sympush(NULL);}voidsymunhide() { CHECK(marked->sym == NULL); sympop();}/****************************************************************** Hash */int factor[8] = { 11, 17, 13, 31, 59, 129, 83, 97};inthash(char *s, int n) { int i; int hs; hs = 0; if (n == 0) n = MAXNAMELEN; for (i=0;i<n;i++) { if (!*s) break; hs += factor[i%8]*(*s++); } return hs % MAXSYMTAB;}SymPtrsymget(char *p, int m) { Sym *s; unsigned char *q; int n; n = 1; q = (unsigned char*)p; do { if (!(mask[*q] & n)) return NULL; n <<= 1; if (n == 0x8000) break; /* not too long */ } while (*q++); for(s=symtab[hash(p,0)];s;s=s->next) { if (!strncmp(p,s->name,MAXNAMELEN)) { if (s->type & m) return s; else break; } } return NULL;}SymPtrsymgetm(char *p, int m) { Sym *s; int n; n = strlen(p); while (n) { for(s=symtab[hash(p,n)];s;s=s->next) { if (!strncmp(p,s->name,n)) { if (s->type & m) return s; else break; } } n--; } return NULL;}char *symname(SymPtr s) { CHECK(s); return (char *)&s->name;}char *symvals(SymPtr s) { CHECK(s); return s->val.s;}intsymvali(SymPtr s) { CHECK(s); return s->val.i;}intsymtype(SymPtr s) { CHECK(s); return s->type;}intsymflag(SymPtr s) { CHECK(s); return s->flag;}voidsymsetnm(char *name, char *val) { SymPtr s; unsigned char *p; int i,m; i = hash(name,0); s = my_alloc(sizeof(Sym),1); s->type = CL_NM; strncpy(s->name,name,MAXNAMELEN); s->val.s = val; if (symgetm(name, CL_KEY)) s->flag = 1; s->next = symtab[i]; symtab[i] = s; m = 1; p = (unsigned char *)&s->name; do { mask[*p] |= m; m <<= 1; } while (*p++);}voidsymsetkw(char *name, int val, int type) { SymPtr s; unsigned char *p; int i,j,m; j = 0; if (mmode & MOD_LCASE) j = 1; for (;j<2;j++) { s = my_alloc(sizeof(Sym),1); s->type = type; strncpy(s->name,name,MAXNAMELEN); if (j == 1) tolowcase(s->name); i = hash(s->name,0); s->val.i = val; s->next = symtab[i]; symtab[i] = s; m = 1; p = (unsigned char *)&s->name; do { mask[*p] |= m; m <<= 1; } while (*p++); }}voidsymsetvals(SymPtr s,char *v) { s->val.s = v;}voidsymdel(char *name) { SymPtr s; s = symget(name, CL_NM); if (s) s->name[0] = 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -