Blame


1 5cdb1798 2005-10-29 devnull #include <u.h>
2 5cdb1798 2005-10-29 devnull #include <libc.h>
3 5cdb1798 2005-10-29 devnull #include "dat.h"
4 5cdb1798 2005-10-29 devnull
5 5cdb1798 2005-10-29 devnull void*
6 5cdb1798 2005-10-29 devnull emalloc(int size)
7 5cdb1798 2005-10-29 devnull {
8 5cdb1798 2005-10-29 devnull void *a;
9 5cdb1798 2005-10-29 devnull
10 5cdb1798 2005-10-29 devnull a = mallocz(size, 1);
11 5cdb1798 2005-10-29 devnull if(a == nil)
12 5cdb1798 2005-10-29 devnull sysfatal("%r");
13 5cdb1798 2005-10-29 devnull return a;
14 5cdb1798 2005-10-29 devnull }
15 5cdb1798 2005-10-29 devnull
16 5cdb1798 2005-10-29 devnull char*
17 5cdb1798 2005-10-29 devnull estrdup(char *s)
18 5cdb1798 2005-10-29 devnull {
19 5cdb1798 2005-10-29 devnull s = strdup(s);
20 5cdb1798 2005-10-29 devnull if(s == nil)
21 5cdb1798 2005-10-29 devnull sysfatal("%r");
22 5cdb1798 2005-10-29 devnull return s;
23 5cdb1798 2005-10-29 devnull }
24 5cdb1798 2005-10-29 devnull
25 5cdb1798 2005-10-29 devnull /*
26 5cdb1798 2005-10-29 devnull * like tokenize but obey "" quoting
27 5cdb1798 2005-10-29 devnull */
28 5cdb1798 2005-10-29 devnull int
29 5cdb1798 2005-10-29 devnull tokenize822(char *str, char **args, int max)
30 5cdb1798 2005-10-29 devnull {
31 5cdb1798 2005-10-29 devnull int na;
32 5cdb1798 2005-10-29 devnull int intok = 0, inquote = 0;
33 5cdb1798 2005-10-29 devnull
34 5cdb1798 2005-10-29 devnull if(max <= 0)
35 fa325e9b 2020-01-10 cross return 0;
36 5cdb1798 2005-10-29 devnull for(na=0; ;str++)
37 5cdb1798 2005-10-29 devnull switch(*str) {
38 5cdb1798 2005-10-29 devnull case ' ':
39 5cdb1798 2005-10-29 devnull case '\t':
40 5cdb1798 2005-10-29 devnull if(inquote)
41 5cdb1798 2005-10-29 devnull goto Default;
42 5cdb1798 2005-10-29 devnull /* fall through */
43 5cdb1798 2005-10-29 devnull case '\n':
44 5cdb1798 2005-10-29 devnull *str = 0;
45 5cdb1798 2005-10-29 devnull if(!intok)
46 5cdb1798 2005-10-29 devnull continue;
47 5cdb1798 2005-10-29 devnull intok = 0;
48 5cdb1798 2005-10-29 devnull if(na < max)
49 5cdb1798 2005-10-29 devnull continue;
50 5cdb1798 2005-10-29 devnull /* fall through */
51 5cdb1798 2005-10-29 devnull case 0:
52 5cdb1798 2005-10-29 devnull return na;
53 5cdb1798 2005-10-29 devnull case '"':
54 5cdb1798 2005-10-29 devnull inquote ^= 1;
55 5cdb1798 2005-10-29 devnull /* fall through */
56 5cdb1798 2005-10-29 devnull Default:
57 5cdb1798 2005-10-29 devnull default:
58 5cdb1798 2005-10-29 devnull if(intok)
59 5cdb1798 2005-10-29 devnull continue;
60 5cdb1798 2005-10-29 devnull args[na++] = str;
61 5cdb1798 2005-10-29 devnull intok = 1;
62 5cdb1798 2005-10-29 devnull }
63 5cdb1798 2005-10-29 devnull return 0; /* can't get here; silence compiler */
64 5cdb1798 2005-10-29 devnull }
65 5cdb1798 2005-10-29 devnull
66 5cdb1798 2005-10-29 devnull Addr*
67 5cdb1798 2005-10-29 devnull readaddrs(char *file, Addr *a)
68 5cdb1798 2005-10-29 devnull {
69 5cdb1798 2005-10-29 devnull int fd;
70 5cdb1798 2005-10-29 devnull int i, n;
71 5cdb1798 2005-10-29 devnull char buf[8*1024];
72 5cdb1798 2005-10-29 devnull char *f[128];
73 5cdb1798 2005-10-29 devnull Addr **l;
74 5cdb1798 2005-10-29 devnull Addr *first;
75 5cdb1798 2005-10-29 devnull
76 5cdb1798 2005-10-29 devnull /* add to end */
77 5cdb1798 2005-10-29 devnull first = a;
78 5cdb1798 2005-10-29 devnull for(l = &first; *l != nil; l = &(*l)->next)
79 5cdb1798 2005-10-29 devnull ;
80 5cdb1798 2005-10-29 devnull
81 5cdb1798 2005-10-29 devnull /* read in the addresses */
82 5cdb1798 2005-10-29 devnull fd = open(file, OREAD);
83 5cdb1798 2005-10-29 devnull if(fd < 0)
84 5cdb1798 2005-10-29 devnull return first;
85 5cdb1798 2005-10-29 devnull n = read(fd, buf, sizeof(buf)-1);
86 5cdb1798 2005-10-29 devnull close(fd);
87 5cdb1798 2005-10-29 devnull if(n <= 0)
88 5cdb1798 2005-10-29 devnull return first;
89 5cdb1798 2005-10-29 devnull buf[n] = 0;
90 5cdb1798 2005-10-29 devnull
91 5cdb1798 2005-10-29 devnull n = tokenize822(buf, f, nelem(f));
92 5cdb1798 2005-10-29 devnull for(i = 0; i < n; i++){
93 5cdb1798 2005-10-29 devnull *l = a = emalloc(sizeof *a);
94 5cdb1798 2005-10-29 devnull l = &a->next;
95 5cdb1798 2005-10-29 devnull a->val = estrdup(f[i]);
96 5cdb1798 2005-10-29 devnull }
97 5cdb1798 2005-10-29 devnull return first;
98 5cdb1798 2005-10-29 devnull }