- kb_key *newone = &tab[tsize];
-
- // --- convert list to hash table if necessary ----------------------
-
- if(size>= 0 && tsize>= 32) {
- kb_key *oldtab = tab;
- kb_key **nht = new kb_key*[KB_HASHSIZE];
- for(int i = 0; i < KB_HASHSIZE; i++)
- nht[i] = 0;
- htable = nht;
- size = -KB_HASHSIZE;
-
- // --- copy old keys to new hash table ---
- int hashval;
- for(kb_key *tu = oldtab; tu->code != NoSymbol; tu++){
- // copy values from oldtab to htable
- hashval = (tu->code&0xffff);
- hashval = ((hashval&0xff) ^ ((hashval>>8)&0xff)) % KB_HASHSIZE;
- tab = htable[hashval];
-
- if(!tab){
- htable[hashval] = tab = new kb_key[KB_PREALLOC];
- tab->code = NoSymbol;
- }
- int ts = 1;
- for(kb_key *tt = tab; tt->code != NoSymbol; tt++)
- ts++;
- if(ts % KB_PREALLOC == 0){
- // extend table
- kb_key *nt = new kb_key[ts+KB_PREALLOC];
- memcpy(nt, tab, ts*sizeof(kb_key));
- htable[hashval] = nt;
- delete[] tab;
- tab = nt;
- }
- tab[ts--].code = NoSymbol;
- tab[ts].code = tu->code;
- tab[ts].mod = tu->mod;
- tab[ts].action = tu->action;
- tab[ts].table = tu->table;
-
- if(tu == newone)
- newone = &tab[ts];
- }
- delete[] oldtab;
- }