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