#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HASHSIZE 101
static struct Nlist *hashtab[HASHSIZE]; // pointer table
struct Nlist {
struct Nlist *next; // next entry in chain
char *name; // defined name
char *defn; // replacement text
};
char *strdup(char *s)
{
if(tmp != NULL)
return tmp;
}
unsigned hash(char *s)
{
unsigned hashval;
for(hashval = 0; *s != '\0'; s++)
hashval = *s + 31 * hashval;
return hashval % HASHSIZE;
}
struct Nlist *lookup(char *s, struct Nlist **previous)
{
struct Nlist *np;
int i = 0;
*previous = NULL;
for(np = hashtab[hash(s)]; np != NULL; np = np->next, i++)
return np;
if(i > 0)
*previous = np;
return NULL;
}
struct Nlist *install(char *name, char *defn)
{
struct Nlist *np;
struct Nlist *tmp;
unsigned hashval;
if((np = lookup(name, &tmp)) == NULL) {
if(np == NULL || (np->name = strdup(name)) == NULL)
return NULL;
hashval = hash(name);
np->next = hashtab[hashval];
hashtab[hashval] = np;
} else {
}
if((np->defn = strdup(defn)) == NULL)
return NULL;
return np;
}
void printList(char *name)
{
for(struct Nlist *tmp = hashtab[hash(name)]; tmp != NULL; tmp = tmp->next) {
}
}
void undef(char *name)
{
struct Nlist *tmp = hashtab[hash(name)];
if(!strcmp(tmp
->name
, name
)) { // delete the head node hashtab[hash(name)] = tmp->next;
return;
}
for(; strcmp(tmp
->next
->name
, name
); tmp
= tmp
->next
) ;
struct Nlist *save = tmp->next; // save the desired node for deletion
tmp->next = tmp->next->next; // adjust the links
}
int main()
{
install("test", "11");
install("estt", "qwe");
install("tset", "2323");
//undef("test");
undef("test");
printList("test");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBIQVNIU0laRSAxMDEKCnN0YXRpYyBzdHJ1Y3QgTmxpc3QgKmhhc2h0YWJbSEFTSFNJWkVdOyAvLyBwb2ludGVyIHRhYmxlCgpzdHJ1Y3QgTmxpc3QgewoJc3RydWN0IE5saXN0ICpuZXh0OyAvLyBuZXh0IGVudHJ5IGluIGNoYWluCgljaGFyICpuYW1lOyAvLyBkZWZpbmVkIG5hbWUKCWNoYXIgKmRlZm47IC8vIHJlcGxhY2VtZW50IHRleHQKfTsJCgpjaGFyICpzdHJkdXAoY2hhciAqcykKewoJY2hhciAqdG1wID0gbWFsbG9jKHN0cmxlbihzKSArIDEpOwoJaWYodG1wICE9IE5VTEwpIAoJCXN0cmNweSh0bXAsIHMpOwoJcmV0dXJuIHRtcDsKfQoKdW5zaWduZWQgaGFzaChjaGFyICpzKSAKewoJdW5zaWduZWQgaGFzaHZhbDsKCglmb3IoaGFzaHZhbCA9IDA7ICpzICE9ICdcMCc7IHMrKykgCgkJaGFzaHZhbCA9ICpzICsgMzEgKiBoYXNodmFsOwoJcmV0dXJuIGhhc2h2YWwgJSBIQVNIU0laRTsKfQoKc3RydWN0IE5saXN0ICpsb29rdXAoY2hhciAqcywgc3RydWN0IE5saXN0ICoqcHJldmlvdXMpCnsKCXN0cnVjdCBObGlzdCAqbnA7CglpbnQgaSA9IDA7CgkqcHJldmlvdXMgPSBOVUxMOwoKCWZvcihucCA9IGhhc2h0YWJbaGFzaChzKV07IG5wICE9IE5VTEw7IG5wID0gbnAtPm5leHQsIGkrKykKCQlpZihzdHJjbXAocywgbnAtPm5hbWUpID09IDApCgkJCXJldHVybiBucDsKCQlpZihpID4gMCkgCgkJCSpwcmV2aW91cyA9IG5wOwoKCXJldHVybiBOVUxMOwp9CgpzdHJ1Y3QgTmxpc3QgKmluc3RhbGwoY2hhciAqbmFtZSwgY2hhciAqZGVmbikKewoJc3RydWN0IE5saXN0ICpucDsKCXN0cnVjdCBObGlzdCAqdG1wOwoJdW5zaWduZWQgaGFzaHZhbDsKCglpZigobnAgPSBsb29rdXAobmFtZSwgJnRtcCkpID09IE5VTEwpIHsKCQlucCA9IG1hbGxvYyhzaXplb2YoKm5wKSk7CgkJaWYobnAgPT0gTlVMTCB8fCAobnAtPm5hbWUgPSBzdHJkdXAobmFtZSkpID09IE5VTEwpCgkJCXJldHVybiBOVUxMOwoJCWhhc2h2YWwgPSBoYXNoKG5hbWUpOwoJCW5wLT5uZXh0ID0gaGFzaHRhYltoYXNodmFsXTsKCQloYXNodGFiW2hhc2h2YWxdID0gbnA7Cgl9IGVsc2UgewoJCWZyZWUobnAtPmRlZm4pOwoJfQoKCWlmKChucC0+ZGVmbiA9IHN0cmR1cChkZWZuKSkgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCXJldHVybiBucDsKfQoKdm9pZCBwcmludExpc3QoY2hhciAqbmFtZSkKewoJZm9yKHN0cnVjdCBObGlzdCAqdG1wID0gaGFzaHRhYltoYXNoKG5hbWUpXTsgdG1wICE9IE5VTEw7IHRtcCA9IHRtcC0+bmV4dCkgeyAKCQlwcmludGYoIiVzXG4iLCB0bXAtPm5hbWUpOwoJfQp9Cgp2b2lkIHVuZGVmKGNoYXIgKm5hbWUpCnsKCXN0cnVjdCBObGlzdCAqdG1wICA9IGhhc2h0YWJbaGFzaChuYW1lKV07CgoJaWYoIXN0cmNtcCh0bXAtPm5hbWUsIG5hbWUpKSB7IC8vIGRlbGV0ZSB0aGUgaGVhZCBub2RlCgkJaGFzaHRhYltoYXNoKG5hbWUpXSA9IHRtcC0+bmV4dDsKCQlmcmVlKHRtcC0+bmFtZSk7CgkJZnJlZSh0bXApOwoKCQlyZXR1cm47Cgl9CgoJZm9yKDsgc3RyY21wKHRtcC0+bmV4dC0+bmFtZSwgbmFtZSk7IHRtcCA9IHRtcC0+bmV4dCkKCQk7CgoJc3RydWN0IE5saXN0ICpzYXZlID0gdG1wLT5uZXh0OyAvLyBzYXZlIHRoZSBkZXNpcmVkIG5vZGUgZm9yIGRlbGV0aW9uCgl0bXAtPm5leHQgICAgICAgICAgPSB0bXAtPm5leHQtPm5leHQ7IC8vIGFkanVzdCB0aGUgbGlua3MKCWZyZWUoc2F2ZS0+bmFtZSk7CglmcmVlKHNhdmUpOwp9CgoKaW50IG1haW4oKSAKewoJaW5zdGFsbCgidGVzdCIsICIxMSIpOwoJaW5zdGFsbCgiZXN0dCIsICJxd2UiKTsKCWluc3RhbGwoInRzZXQiLCAiMjMyMyIpOwoJLy91bmRlZigidGVzdCIpOwoKCXVuZGVmKCJ0ZXN0Iik7CglwcmludExpc3QoInRlc3QiKTsKCglyZXR1cm4gMDsKfQoK