#include <u.h>
#include <libc.h>
#include "dat.h"
void*
emalloc(int size)
{
void *a;
a = mallocz(size, 1);
if(a == nil)
sysfatal("%r");
return a;
}
char*
estrdup(char *s)
{
s = strdup(s);
if(s == nil)
sysfatal("%r");
return s;
}
/*
* like tokenize but obey "" quoting
*/
int
tokenize822(char *str, char **args, int max)
{
int na;
int intok = 0, inquote = 0;
if(max <= 0)
return 0;
for(na=0; ;str++)
switch(*str) {
case ' ':
case '\t':
if(inquote)
goto Default;
/* fall through */
case '\n':
*str = 0;
if(!intok)
continue;
intok = 0;
if(na < max)
continue;
/* fall through */
case 0:
return na;
case '"':
inquote ^= 1;
/* fall through */
Default:
default:
if(intok)
continue;
args[na++] = str;
intok = 1;
}
}
Addr*
readaddrs(char *file, Addr *a)
{
int fd;
int i, n;
char buf[8*1024];
char *f[128];
Addr **l;
Addr *first;
/* add to end */
first = a;
for(l = &first; *l != nil; l = &(*l)->next)
;
/* read in the addresses */
fd = open(file, OREAD);
if(fd < 0)
return first;
n = read(fd, buf, sizeof(buf)-1);
close(fd);
if(n <= 0)
return first;
buf[n] = 0;
n = tokenize822(buf, f, nelem(f));
for(i = 0; i < n; i++){
*l = a = emalloc(sizeof *a);
l = &a->next;
a->val = estrdup(f[i]);
}
return first;
}
|