/* ------------------------------------------------------------------------- */ /* "symbols" : The symbols table */ /* */ /* Part of Inform release 5 */ /* */ /* ------------------------------------------------------------------------- */ #include "header.h" int used_local_variable[16]; zip *local_varname[16]; int routine_starts_line; /* ------------------------------------------------------------------------- */ /* Symbols table arrays */ /* ------------------------------------------------------------------------- */ #ifndef ALLOCATE_BIG_ARRAYS static char * symbs[MAX_SYMBOLS]; int32 svals[MAX_SYMBOLS]; #ifdef VAX char stypes[MAX_SYMBOLS]; #else signed char stypes[MAX_SYMBOLS]; #endif static int bank1_next[MAX_BANK_SIZE]; static int32 bank1_hash[HASH_TAB_SIZE]; static int bank6_next[MAX_BANK_SIZE]; static int32 bank6_hash[HASH_TAB_SIZE]; static int routine_keys[MAX_ROUTINES+1]; #else static int32 * *symbs; int32 *svals; #ifdef VAX char *stypes; #else signed char *stypes; #endif static int *routine_keys; static int *bank1_next; static int32 *bank1_hash; static int *bank6_next; static int32 *bank6_hash; #endif static int banksize[7]; static int bank_chunks_made[7]; static int32 *bank_chunks[7][32]; static char** symbs_ptrs; static int no_symbs_ptrs; extern void symbols_allocate_arrays(void) { #ifdef ALLOCATE_BIG_ARRAYS symbs = my_calloc(sizeof(char *), MAX_SYMBOLS, "symbols"); svals = my_calloc(sizeof(int32), MAX_SYMBOLS, "symbol values"); stypes = my_calloc(sizeof(char), MAX_SYMBOLS, "symbol types"); bank1_next = my_calloc(sizeof(int), MAX_BANK_SIZE, "bank 1 next"); bank1_hash = my_calloc(sizeof(int32), MAX_BANK_SIZE, "bank 1 hash"); bank6_next = my_calloc(sizeof(int), MAX_BANK_SIZE, "bank 6 next"); bank6_hash = my_calloc(sizeof(int32), MAX_BANK_SIZE, "bank 6 hash"); routine_keys = my_calloc(sizeof(int), MAX_ROUTINES+1, "routine keys"); symbs_ptrs = my_calloc(sizeof(char *), MAX_SYMBOLS/MAX_BANK_SIZE+100, "symbol pointers"); #endif } extern void symbols_free_arrays(void) { #ifdef ALLOCATE_BIG_ARRAYS int i, j; for (i=0; i %d\n", number, entry, chunk, i, value); */ while (bank_chunks_made[number] < chunk) { j=++bank_chunks_made[number]; if (j==32) memoryerror("BANK_CHUNK_SIZE", BANK_CHUNK_SIZE); bank_chunks[number][j] = my_calloc(sizeof(int), BANK_CHUNK_SIZE, "symbols banks chunk"); for (k=0; k=MAX_BANK_SIZE) memoryerror("MAX_BANK_SIZE", MAX_BANK_SIZE); write_banks(bank,j,no_symbols); if (bank==0) { if (routine_keys[no_routines]==-1) routine_keys[no_routines]=j; if (nowarnings_mode==0) { local_varname[value]=symbols_p; } } if (bank==1) { if (last==-1) {bank1_next[j]=bank1_hash[key];bank1_hash[key]=j;} else {bank1_next[j]=this; bank1_next[last]=j;} } if (bank==6) { if (last==-1) {bank6_next[j]=bank6_hash[key];bank6_hash[key]=j;} else {bank6_next[j]=this; bank6_next[last]=j;} } if (no_symbols==MAX_SYMBOLS) memoryerror("MAX_SYMBOLS", MAX_SYMBOLS); if (symbols_p+strlen(p)+1 >= symbols_top) { symbols_p=my_malloc(SYMBOLS_CHUNK_SIZE,"symbols table chunk"); symbols_top=symbols_p+SYMBOLS_CHUNK_SIZE; symbs_ptrs[no_symbs_ptrs] = (char *)symbols_p; no_symbs_ptrs++; } strcpy((char *)symbols_p,p); symbs[no_symbols]=(int32 *) symbols_p; symbols_p+=strlen((char *)symbols_p)+1; svals[no_symbols]=value; stypes[no_symbols]=type; no_symbols++; } extern int prim_find_symbol(char *q, int bank) { char c[50], *r; int i, j, start, finish=banksize[bank]; int32 key, this; if (strlen(q)>49) return -1; strcpy(c,q); make_lower_case(c); if (bank==0) { start=routine_keys[no_routines]; if (start<0) return -1; i=routine_keys[no_routines+1]; if (i>=0) finish=i; if (finish>start+15) finish=start+15; for (i=start; iMAX_IDENTIFIER_LENGTH) { error_named("Symbol name is too long:",p); return; } if (type==3) { prim_new_symbol(p,value,type,0); return; } if (p[0]!='_') { prim_new_symbol(p,value,type,1); return; } if (p[1]=='s') { prim_new_symbol(p,value,type,2); return; } if (p[1]=='S') { prim_new_symbol(p,value,type,2); return; } if (p[1]=='w') { prim_new_symbol(p,value,type,3); return; } if (p[1]=='W') { prim_new_symbol(p,value,type,3); return; } if (p[1]=='f') { prim_new_symbol(p,value,type,4); return; } if (p[1]=='F') { prim_new_symbol(p,value,type,4); return; } if (p[1]=='x') { prim_new_symbol(p,value,type,5); return; } if (p[1]=='X') { prim_new_symbol(p,value,type,5); return; } error("Symbol names are not permitted to start with an '_'"); } extern void lose_local_symbols(void) { /* For future consideration */ } /* ------------------------------------------------------------------------- */ /* Printing diagnostics */ /* ------------------------------------------------------------------------- */ static char *typename(int type) { switch(type) { case 1: return("Global label"); case 2: return("Global variable"); case 3: return("Local variable"); case 4: return("Reserved word"); case 5: return("Static string"); case 6: return("Local label"); case 7: return("Attribute"); case 8: return("Integer constant"); case 9: return("Object"); case 10: return("Condition"); case 11: return("Constant string address"); case 12: return("Property"); case 13: return("Class"); case 14: return("Assembler directive"); case 15: return("Compiler-modified opcode"); case 16: return("Compiled command"); case 17: return("Opcode"); case 18: return("Fake action"); case 19: return("Replacement name"); case 20: return("Compiler-moved label"); default: return("(Unknown type)"); } } extern void list_symbols(void) { int i, j, k; for (j=0; j<2; j++) { printf("In bank %d\n", j); for (i=0; i