readaddrs.c (1380B)
1 #include <u.h> 2 #include <libc.h> 3 #include "dat.h" 4 5 void* 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* 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 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* 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 }