1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#include <u.h>
#include <libc.h>
#include <ctype.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
#include "dat.h"
#include "fns.h"
char *whitespace = " \t\r\n";
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;
}
void
nstrcpy(char *to, char *from, int n)
{
strncpy(to, from, n);
to[n-1] = 0;
}
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;
if(*s == 0)
return nil;
v = strchr(s, 0)-1;
while(v >= s && strchr(whitespace, *v))
*v-- = 0;
if(v = strchr(s, ':')){
*v++ = 0;
while(*v == ' ' || *v == '\t')
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;
}
|