plan9port

[fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port # fast
git clone https://src.adamsgaard.dk/plan9port.git # slow
Log | Files | Refs | README | LICENSE Back to index

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 }