define_t *search_defines (const char *name) { define_t *result = NULL; char *search_name; list_t *curr_arg_set = arg_list; unsigned int curr_hash; //make name uppercase if needed for case-insensitivity if (!case_sensitive) search_name = strup (name); else search_name = (char *)name; //first search all the sets of arguments in order while (curr_arg_set) { result = (define_t *)hash_lookup ((hash_t *)(curr_arg_set->data), search_name); if (result) break; curr_arg_set = curr_arg_set->next; } //if that doesn't work, look in the global define table if (!result) result = (define_t *)hash_lookup (define_table, search_name); #define MHASH(Z) (murmur_hash(Z, strlen(Z))) curr_hash = murmur_hash (search_name, strlen (search_name)); // Search all SPASM predefined values if (curr_hash == MHASH("__LINE")) { char line_buf[32]; sprintf (line_buf, "%d", line_num); if (result) set_define (result, line_buf, -1, false); } else if (curr_hash == MHASH("__FILE")) { char fn_buf[MAX_PATH + 2]; sprintf (fn_buf, "\"%s\"", curr_input_file); if (result) set_define (result, fn_buf, -1, false); } //printf("fail: %s %08x\n", search_name, murmur_hash(search_name, strlen(search_name))); if (!case_sensitive) free (search_name); //make sure any empty arguments get returned as undefined //if (result && result->contents == NULL) result = NULL; return result; }
int findmn(int i) { Contab *p; for (p = mhash[MHASH(i)]; p; p = p->link) if (i == p->rq) return(p - contabp); return(-1); }
void maddhash(Contab *rp) { Contab **hp; if (rp->rq == 0) return; hp = &mhash[MHASH(rp->rq)]; rp->link = *hp; *hp = rp; }
void mrehash(void) { Contab *p; int i; for (i=0; i < MHASHSIZE; i++) mhash[i] = 0; for (p=contabp; p < &contabp[nm]; p++) p->link = 0; for (p=contabp; p < &contabp[nm]; p++) { if (p->rq == 0) continue; i = MHASH(p->rq); p->link = mhash[i]; mhash[i] = p; } }
void munhash(Contab *mp) { Contab *p; Contab **lp; if (mp->rq == 0) return; lp = &mhash[MHASH(mp->rq)]; p = *lp; while (p) { if (p == mp) { *lp = p->link; p->link = 0; return; } lp = &p->link; p = p->link; } }