summaryrefslogtreecommitdiff
path: root/sys/src/cmd/webfs/sub.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@rei2.9hal>2012-01-11 16:17:54 +0100
committercinap_lenrek <cinap_lenrek@rei2.9hal>2012-01-11 16:17:54 +0100
commit75e1ef0ab60acb6bccc54254b82770aec5786ead (patch)
treed273fc755a20e67801aa0a13df30ab75b2883419 /sys/src/cmd/webfs/sub.c
parent62fb4f97177d8e76f1fd49bb9d0073007b7c9bcc (diff)
new webfs, rc based hget
Diffstat (limited to 'sys/src/cmd/webfs/sub.c')
-rw-r--r--sys/src/cmd/webfs/sub.c119
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;
+}