diff options
author | cinap_lenrek <cinap_lenrek@rei2.9hal> | 2012-01-11 16:17:54 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@rei2.9hal> | 2012-01-11 16:17:54 +0100 |
commit | 75e1ef0ab60acb6bccc54254b82770aec5786ead (patch) | |
tree | d273fc755a20e67801aa0a13df30ab75b2883419 /sys/src/cmd/webfs/sub.c | |
parent | 62fb4f97177d8e76f1fd49bb9d0073007b7c9bcc (diff) |
new webfs, rc based hget
Diffstat (limited to 'sys/src/cmd/webfs/sub.c')
-rw-r--r-- | sys/src/cmd/webfs/sub.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/sys/src/cmd/webfs/sub.c b/sys/src/cmd/webfs/sub.c new file mode 100644 index 000000000..274ef0b08 --- /dev/null +++ b/sys/src/cmd/webfs/sub.c @@ -0,0 +1,119 @@ +#include <u.h> +#include <libc.h> +#include <ctype.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> + +#include "dat.h" +#include "fns.h" + +void* +emalloc(int n) +{ + void *v; + v = emalloc9p(n); + setmalloctag(v, getcallerpc(&n)); + memset(v, 0, n); + return v; +} + +char* +estrdup(char *s) +{ + s = estrdup9p(s); + setmalloctag(s, getcallerpc(&s)); + return s; +} + +Key* +addkey(Key *h, char *key, char *val) +{ + Key *k; + int n; + + if(val == nil) + val = ""; + n = strlen(key)+1; + k = emalloc(sizeof(*k) + n + strlen(val)+1); + k->next = h; + k->val = k->key + n; + strcpy(k->key, key); + strcpy(k->val, val); + return k; +} + +Key* +delkey(Key *h, char *key) +{ + Key *k, *p; + + for(p = nil, k = h; k; p = k, k = k->next){ + if(!cistrcmp(k->key, key)){ + if(p) + p->next = k->next; + else + h = k->next; + memset(k->val, 0, strlen(k->val)); + free(k); + break; + } + } + return h; +} + +char* +lookkey(Key *k, char *key) +{ + while(k){ + if(!cistrcmp(k->key, key)) + return k->val; + k = k->next; + } + return nil; +} + +Key* +parsehdr(char *s) +{ + char *v; + + v = strchr(s, 0)-1; + while(v >= s && strchr("\n\r\t ", *v)) + *v-- = 0; + if(v = strchr(s, ':')){ + *v++ = 0; + while(strchr("\t ", *v)) + v++; + if(*s && *v) + return addkey(0, s, v); + } + return nil; +} + +char* +unquote(char *s, char **ps) +{ + char *p; + + if(*s != '"'){ + p = strpbrk(s, " \t\r\n"); + *p++ = 0; + *ps = p; + return s; + } + for(p=s+1; *p; p++){ + if(*p == '\"'){ + *p++ = 0; + break; + } + if(*p == '\\' && *(p+1)){ + p++; + continue; + } + } + memmove(s, s+1, p-(s+1)); + s[p-(s+1)] = 0; + *ps = p; + return s; +} |