69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
|
#ifndef RKEYTABLE_H
|
||
|
#define RKEYTABLE_H
|
||
|
/*
|
||
|
DERIVED FROM HASH TABLE K&R
|
||
|
*/
|
||
|
#include "rmalloc.h"
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <stdbool.h>
|
||
|
|
||
|
typedef struct rnklist {
|
||
|
struct rnklist *next;
|
||
|
struct rnklist *last;
|
||
|
char *name;
|
||
|
char *defn;
|
||
|
} rnklist;
|
||
|
|
||
|
static rnklist *rkeytab = NULL;
|
||
|
|
||
|
rnklist *rlkget(char *s) {
|
||
|
rnklist *np;
|
||
|
for (np = rkeytab; np != NULL; np = np->next)
|
||
|
if (strcmp(s, np->name) == 0)
|
||
|
return np; // Found
|
||
|
return NULL; // Not found
|
||
|
}
|
||
|
|
||
|
char *rkget(char *s) {
|
||
|
rnklist *np = rlkget(s);
|
||
|
return np ? np->defn : NULL;
|
||
|
}
|
||
|
|
||
|
rnklist *rkset(char *name, char *defn) {
|
||
|
rnklist *np;
|
||
|
if ((np = (rlkget(name))) == NULL) { // Not found
|
||
|
np = (rnklist *)malloc(sizeof(rnklist));
|
||
|
np->name = strdup(name);
|
||
|
np->next = NULL;
|
||
|
np->last = NULL;
|
||
|
|
||
|
if (defn) {
|
||
|
np->defn = strdup(defn);
|
||
|
} else {
|
||
|
np->defn = NULL;
|
||
|
}
|
||
|
|
||
|
if (rkeytab == NULL) {
|
||
|
rkeytab = np;
|
||
|
rkeytab->last = np;
|
||
|
} else {
|
||
|
if (rkeytab->last)
|
||
|
rkeytab->last->next = np;
|
||
|
|
||
|
rkeytab->last = np;
|
||
|
}
|
||
|
} else {
|
||
|
if (np->defn)
|
||
|
free((void *)np->defn);
|
||
|
if (defn) {
|
||
|
np->defn = strdup(defn);
|
||
|
} else {
|
||
|
np->defn = NULL;
|
||
|
}
|
||
|
}
|
||
|
return np;
|
||
|
}
|
||
|
#endif
|