URI:
       treadaddrs.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       treadaddrs.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 }