static struct vparse_state *vcard_string_as_vparser(const struct buf *buf) { struct vparse_state *vparser; int vr; vparser = (struct vparse_state *) xzmalloc(sizeof(struct vparse_state)); vparser->base = buf_cstring(buf); vparse_set_multival(vparser, "adr"); vparse_set_multival(vparser, "org"); vparse_set_multival(vparser, "n"); vr = vparse_parse(vparser, 0); if (vr) return NULL; // XXX report error return vparser; }
int main(int argv, const char **argc) { const char *fname = argc[1]; struct stat sbuf; int fd = open(fname, O_RDONLY); struct vparse_state parser; char *data; int r; memset(&parser, 0, sizeof(struct vparse_state)); fstat(fd, &sbuf); data = malloc(sbuf.st_size+1); read(fd, data, sbuf.st_size); data[sbuf.st_size] = '\0'; parser.base = data; r = vparse_parse(&parser); if (r) { struct vparse_errorpos pos; vparse_fillpos(&parser, &pos); printf("error %s at line %d char %d: %.*s ... %.*s <--- (started at line %d char %d)\n", vparse_errstr(r), pos.errorline, pos.errorchar, 20, parser.base + pos.startpos, 20, parser.base + pos.errorpos - 20, pos.startline, pos.startchar); return 1; } _dump(parser.card); vparse_free(&parser); return 0; }