]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/webfs/sub.c
git/branch: somewhere in the syncing, the fix for junk files was lost
[plan9front.git] / sys / src / cmd / webfs / sub.c
1 #include <u.h>
2 #include <libc.h>
3 #include <ctype.h>
4 #include <fcall.h>
5 #include <thread.h>
6 #include <9p.h>
7
8 #include "dat.h"
9 #include "fns.h"
10
11 char *whitespace = " \t\r\n";
12
13 void*
14 emalloc(int n)
15 {
16         void *v;
17         v = emalloc9p(n);
18         setmalloctag(v, getcallerpc(&n));
19         memset(v, 0, n);
20         return v;
21 }
22
23 char*
24 estrdup(char *s)
25 {
26         s = estrdup9p(s);
27         setmalloctag(s, getcallerpc(&s));
28         return s;
29 }
30
31 void
32 nstrcpy(char *to, char *from, int n)
33 {
34         strncpy(to, from, n);
35         to[n-1] = 0;
36 }
37
38 Key*
39 addkey(Key *h, char *key, char *val)
40 {
41         Key *k;
42         int n;
43
44         if(val == nil)
45                 val = "";
46         n = strlen(key)+1;
47         k = emalloc(sizeof(*k) + n + strlen(val)+1);
48         k->next = h;
49         k->val = k->key + n;
50         strcpy(k->key, key);
51         strcpy(k->val, val);
52         return k;
53 }
54
55 Key*
56 delkey(Key *h, char *key)
57 {
58         Key *k, *p;
59
60         for(p = nil, k = h; k; p = k, k = k->next){
61                 if(!cistrcmp(k->key, key)){
62                         if(p)
63                                 p->next = k->next;
64                         else
65                                 h = k->next;
66                         memset(k->val, 0, strlen(k->val));
67                         free(k);
68                         break;
69                 }
70         }
71         return h;
72 }
73
74 Key*
75 getkey(Key *k, char *key)
76 {
77         while(k){
78                 if(!cistrcmp(k->key, key))
79                         break;
80                 k = k->next;
81         }
82         return k;
83 }
84
85 char*
86 lookkey(Key *k, char *key)
87 {
88         if(k = getkey(k, key))
89                 return k->val;
90         return nil;
91 }
92
93 Key*
94 parsehdr(char *s)
95 {
96         char *v;
97
98         if(*s == 0)
99                 return nil;
100         v = strchr(s, 0)-1;
101         while(v >= s && strchr(whitespace, *v))
102                 *v-- = 0;
103         if(v = strchr(s, ':')){
104                 *v++ = 0;
105                 while(*v == ' ' || *v == '\t')
106                         v++;
107                 if(*s && *v)
108                         return addkey(0, s, v);
109         }
110         return nil;
111 }
112
113 char*
114 unquote(char *s, char **ps)
115 {
116         char *p;
117
118         if(*s != '"'){
119                 p = strpbrk(s, " \t\r\n");
120                 *p++ = 0;
121                 *ps = p;
122                 return s;
123         }
124         for(p=s+1; *p; p++){
125                 if(*p == '\"'){
126                         *p++ = 0;
127                         break;
128                 }
129                 if(*p == '\\' && *(p+1)){
130                         p++;
131                         continue;
132                 }
133         }
134         memmove(s, s+1, p-(s+1));
135         s[p-(s+1)] = 0;
136         *ps = p;
137         return s;
138 }