D_Sym * find_D_Sym_in_Scope(D_Scope *st, D_Scope *cur, char *name, char *end) { int len = end ? end - name : strlen(name); uint h = strhashl(name, len); D_Sym *s = find_D_Sym_in_Scope_internal(cur, name, len, h); if (s) return current_D_Sym(st, s); return NULL; }
D_Sym * find_global_D_Sym(D_Scope *st, char *name, char *end) { D_Sym *s; int len = end ? end - name : strlen(name); uint h = strhashl(name, len); D_Scope *cur = st; while (cur->up) cur = cur->search; s = find_D_Sym_internal(cur, name, len, h); if (s) return current_D_Sym(st, s); return NULL; }
D_Sym * new_D_Sym(D_Scope *st, char *name, char *end, int sizeof_D_Sym) { int len = end - name; D_Sym *s = MALLOC(sizeof_D_Sym); memset(s, 0, sizeof_D_Sym); s->name = name; s->len = len; s->hash = strhashl(name, len); if (st->hash) { symhash_add(st->hash, s); } else { s->next = st->ll; st->ll = s; } return s; }
D_Sym * new_D_Sym(D_Scope *st, char *name, char *end, int sizeof_D_Sym) { int len = end ? end - name : name ? strlen(name) : 0; D_Sym *s = reinterpret_cast<D_Sym*>(MALLOC(sizeof_D_Sym)); memset(s, 0, sizeof_D_Sym); s->name = name; s->len = len; s->hash = strhashl(name, len); s->scope = st; if (st) { if (st->hash) { symhash_add(st->hash, s); } else { s->next = st->ll; st->ll = s; } } return s; }
D_Sym * find_D_Sym_in_Scope(D_Scope *st, char *name, char *end) { D_Sym *ll; int len = end - name; uint h = strhashl(name, len); for (; st ; st = st->search) { if (st->hash) ll = st->hash->syms.v[h % st->hash->syms.n]; else ll = st->ll; while (ll) { if (ll->hash == h && ll->len == len && !strncmp(ll->name, name, len)) return ll; ll = ll->next; } if (!st->search || st->search->up != st->up) break; } return NULL; }
D_Sym * find_D_Sym(D_Scope *st, char *name, char *end) { int len = end - name; uint h = strhashl(name, len); return find_sym_internal(st, st, name, len, h); }