ref: f43b5b9a6d055938ad4f497e7e556a1e3ad5365c
dir: /libvcard/vcard.c/
#include <u.h>
#include <libc.h>
#include "vcard.h"
extern Vcard *vcparsecard;
extern char *vcparsestr;
extern int yyparse(void);
static Vcard*
parse(char *s)
{
memset(&vcstate, sizeof vcstate, 0);
vcparsestr = s;
vcparsecard = nil;
yyparse();
return vcparsecard;
}
static void
fold(char *str)
{
char *s;
char *end;
end = strchr(str, 0);
while (str < end) {
s = strchr(str, '\r');
if (!s)
break;
if (s[1] == 0)
break;
if (s[1] == '\n' && (s[2] == ' ' || s[2] == '\t')) {
memmove(s, s+3, end-s-3);
end -= 3;
}
str = s+1;
}
*end = 0;
}
#ifdef TEST
void
_vc_t_fold(char *s)
{
fold(s);
}
#endif
Vcard*
vcparse(char *s)
{
fold(s);
return parse(s);
}
Vcard*
vcparsefile(char *file)
{
int fd, step;
char *s, *t;
long n;
Vcard *vc;
fd = open(file, OREAD);
if (fd < 0)
return nil;
step = 1;
s = mallocz(8192, 1);
t = s;
while ((n = read(fd, t, 8191)) > 0) {
t += n;
step++;
s = realloc(s, 8192 * step);
memset(s + 8192*(step-1), 0, 8192);
}
close(fd);
vc = vcparse(s);
free(s);
return vc;
}