version 1.25, 2019/04/08 23:40:17 |
version 1.29, 2019/04/09 15:23:51 |
Line 213 static const struct element elements[] = { |
|
Line 213 static const struct element elements[] = { |
|
{ "varname", NODE_VARNAME }, |
{ "varname", NODE_VARNAME }, |
{ "warning", NODE_WARNING }, |
{ "warning", NODE_WARNING }, |
{ "wordasword", NODE_WORDASWORD }, |
{ "wordasword", NODE_WORDASWORD }, |
{ "xi:include", NODE_DELETE_WARN }, |
{ "xi:include", NODE_INCLUDE }, |
{ "year", NODE_YEAR }, |
{ "year", NODE_YEAR }, |
{ NULL, NODE_IGNORE } |
{ NULL, NODE_IGNORE } |
}; |
}; |
Line 280 static void parse_fd(struct parse *, int); |
|
Line 280 static void parse_fd(struct parse *, int); |
|
|
|
|
|
static void |
static void |
|
fatal(struct parse *p) |
|
{ |
|
fprintf(stderr, "%s:%d:%d: FATAL: ", p->fname, p->line, p->col); |
|
perror(NULL); |
|
exit(6); |
|
} |
|
|
|
static void |
error_msg(struct parse *p, const char *fmt, ...) |
error_msg(struct parse *p, const char *fmt, ...) |
{ |
{ |
va_list ap; |
va_list ap; |
|
|
fprintf(stderr, "%s:%d:%d: ", p->fname, p->line, p->col); |
fprintf(stderr, "%s:%d:%d: ERROR: ", p->fname, p->line, p->col); |
va_start(ap, fmt); |
va_start(ap, fmt); |
vfprintf(stderr, fmt, ap); |
vfprintf(stderr, fmt, ap); |
va_end(ap); |
va_end(ap); |
fputc('\n', stderr); |
fputc('\n', stderr); |
p->tree->flags |= TREE_FAIL; |
p->tree->flags |= TREE_ERROR; |
} |
} |
|
|
static void |
static void |
Line 300 warn_msg(struct parse *p, const char *fmt, ...) |
|
Line 308 warn_msg(struct parse *p, const char *fmt, ...) |
|
if ((p->flags & PFLAG_WARN) == 0) |
if ((p->flags & PFLAG_WARN) == 0) |
return; |
return; |
|
|
fprintf(stderr, "%s:%d:%d: warning: ", p->fname, p->line, p->col); |
fprintf(stderr, "%s:%d:%d: WARNING: ", p->fname, p->line, p->col); |
va_start(ap, fmt); |
va_start(ap, fmt); |
vfprintf(stderr, fmt, ap); |
vfprintf(stderr, fmt, ap); |
va_end(ap); |
va_end(ap); |
fputc('\n', stderr); |
fputc('\n', stderr); |
|
p->tree->flags |= TREE_WARN; |
} |
} |
|
|
/* |
/* |
Line 327 xml_char(struct parse *ps, const char *p, int sz) |
|
Line 336 xml_char(struct parse *ps, const char *p, int sz) |
|
} |
} |
|
|
if (ps->cur->node != NODE_TEXT) { |
if (ps->cur->node != NODE_TEXT) { |
if ((dat = calloc(1, sizeof(*dat))) == NULL) { |
if ((dat = calloc(1, sizeof(*dat))) == NULL) |
perror(NULL); |
fatal(ps); |
exit(1); |
|
} |
|
dat->node = NODE_TEXT; |
dat->node = NODE_TEXT; |
dat->spc = (ps->flags & PFLAG_SPC) != 0; |
dat->spc = (ps->flags & PFLAG_SPC) != 0; |
dat->parent = ps->cur; |
dat->parent = ps->cur; |
Line 348 xml_char(struct parse *ps, const char *p, int sz) |
|
Line 355 xml_char(struct parse *ps, const char *p, int sz) |
|
|
|
assert(sz >= 0); |
assert(sz >= 0); |
newsz = ps->cur->bsz + (ps->cur->bsz && (ps->flags & PFLAG_SPC)) + sz; |
newsz = ps->cur->bsz + (ps->cur->bsz && (ps->flags & PFLAG_SPC)) + sz; |
ps->cur->b = realloc(ps->cur->b, newsz + 1); |
if ((ps->cur->b = realloc(ps->cur->b, newsz + 1)) == NULL) |
if (ps->cur->b == NULL) { |
fatal(ps); |
perror(NULL); |
|
exit(1); |
|
} |
|
if (ps->cur->bsz && (ps->flags & PFLAG_SPC)) |
if (ps->cur->bsz && (ps->flags & PFLAG_SPC)) |
ps->cur->b[ps->cur->bsz++] = ' '; |
ps->cur->b[ps->cur->bsz++] = ' '; |
memcpy(ps->cur->b + ps->cur->bsz, p, sz); |
memcpy(ps->cur->b + ps->cur->bsz, p, sz); |
Line 420 xml_entity(struct parse *p, const char *name) |
|
Line 424 xml_entity(struct parse *p, const char *name) |
|
if ((ccp = pnode_getattr_raw(dat, |
if ((ccp = pnode_getattr_raw(dat, |
ATTRKEY_DEFINITION, NULL)) == NULL) |
ATTRKEY_DEFINITION, NULL)) == NULL) |
continue; |
continue; |
if ((cp = strdup(ccp)) == NULL) { |
if ((cp = strdup(ccp)) == NULL) |
perror(NULL); |
fatal(p); |
exit(1); |
|
} |
|
pstate = PARSE_ELEM; |
pstate = PARSE_ELEM; |
parse_string(p, cp, strlen(cp), &pstate, 0); |
parse_string(p, cp, strlen(cp), &pstate, 0); |
p->flags &= ~PFLAG_SPC; |
p->flags &= ~PFLAG_SPC; |
Line 437 xml_entity(struct parse *p, const char *name) |
|
Line 439 xml_entity(struct parse *p, const char *name) |
|
|
|
/* Create, append, and close out an entity node. */ |
/* Create, append, and close out an entity node. */ |
if ((dat = calloc(1, sizeof(*dat))) == NULL || |
if ((dat = calloc(1, sizeof(*dat))) == NULL || |
(dat->b = dat->real = strdup(entity->roff)) == NULL) { |
(dat->b = dat->real = strdup(entity->roff)) == NULL) |
perror(NULL); |
fatal(p); |
exit(1); |
|
} |
|
dat->node = NODE_ESCAPE; |
dat->node = NODE_ESCAPE; |
dat->bsz = strlen(dat->b); |
dat->bsz = strlen(dat->b); |
dat->spc = (p->flags & PFLAG_SPC) != 0; |
dat->spc = (p->flags & PFLAG_SPC) != 0; |
Line 503 xml_elem_start(struct parse *ps, const char *name) |
|
Line 503 xml_elem_start(struct parse *ps, const char *name) |
|
if (ps->tree->flags & TREE_CLOSED && ps->cur->parent == NULL) |
if (ps->tree->flags & TREE_CLOSED && ps->cur->parent == NULL) |
warn_msg(ps, "element after end of document: <%s>", name); |
warn_msg(ps, "element after end of document: <%s>", name); |
|
|
if ((dat = calloc(1, sizeof(*dat))) == NULL) { |
if ((dat = calloc(1, sizeof(*dat))) == NULL) |
perror(NULL); |
fatal(ps); |
exit(1); |
|
} |
|
|
|
/* |
/* |
* Nodes that begin a new macro or request line or start by |
* Nodes that begin a new macro or request line or start by |
Line 595 xml_attrkey(struct parse *ps, const char *name) |
|
Line 593 xml_attrkey(struct parse *ps, const char *name) |
|
ps->flags &= ~PFLAG_ATTR; |
ps->flags &= ~PFLAG_ATTR; |
return; |
return; |
} |
} |
if ((attr = calloc(1, sizeof(*attr))) == NULL) { |
if ((attr = calloc(1, sizeof(*attr))) == NULL) |
perror(NULL); |
fatal(ps); |
exit(1); |
|
} |
|
attr->key = key; |
attr->key = key; |
attr->val = ATTRVAL__MAX; |
attr->val = ATTRVAL__MAX; |
if (value == NULL) { |
if (value == NULL) { |
attr->rawval = NULL; |
attr->rawval = NULL; |
ps->flags |= PFLAG_ATTR; |
ps->flags |= PFLAG_ATTR; |
} else { |
} else { |
if ((attr->rawval = strdup(value)) == NULL) { |
if ((attr->rawval = strdup(value)) == NULL) |
perror(NULL); |
fatal(ps); |
exit(1); |
|
} |
|
ps->flags &= ~PFLAG_ATTR; |
ps->flags &= ~PFLAG_ATTR; |
} |
} |
TAILQ_INSERT_TAIL(&ps->cur->attrq, attr, child); |
TAILQ_INSERT_TAIL(&ps->cur->attrq, attr, child); |
Line 627 xml_attrval(struct parse *ps, const char *name) |
|
Line 622 xml_attrval(struct parse *ps, const char *name) |
|
if ((attr = TAILQ_LAST(&ps->cur->attrq, pattrq)) == NULL) |
if ((attr = TAILQ_LAST(&ps->cur->attrq, pattrq)) == NULL) |
return; |
return; |
if ((attr->val = attrval_parse(name)) == ATTRVAL__MAX && |
if ((attr->val = attrval_parse(name)) == ATTRVAL__MAX && |
(attr->rawval = strdup(name)) == NULL) { |
(attr->rawval = strdup(name)) == NULL) |
perror(NULL); |
fatal(ps); |
exit(1); |
ps->flags &= ~PFLAG_ATTR; |
} |
|
} |
} |
|
|
/* |
/* |
|
|
xml_elem_end(struct parse *ps, const char *name) |
xml_elem_end(struct parse *ps, const char *name) |
{ |
{ |
const struct element *elem; |
const struct element *elem; |
|
struct pnode *n; |
|
const char *cp; |
enum nodeid node; |
enum nodeid node; |
|
|
/* |
/* |
Line 671 xml_elem_end(struct parse *ps, const char *name) |
|
Line 667 xml_elem_end(struct parse *ps, const char *name) |
|
break; |
break; |
case NODE_IGNORE: |
case NODE_IGNORE: |
break; |
break; |
|
case NODE_INCLUDE: |
|
n = ps->cur; |
|
ps->cur = ps->cur->parent; |
|
cp = pnode_getattr_raw(n, ATTRKEY_HREF, NULL); |
|
if (cp == NULL) |
|
error_msg(ps, "<xi:include> element " |
|
"without href attribute"); |
|
else |
|
parse_file(ps, -1, cp); |
|
pnode_unlink(n); |
|
ps->flags &= ~PFLAG_SPC; |
|
break; |
case NODE_DOCTYPE: |
case NODE_DOCTYPE: |
ps->flags &= ~PFLAG_EEND; |
ps->flags &= ~PFLAG_EEND; |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
Line 961 parse_string(struct parse *p, char *b, size_t rlen, |
|
Line 969 parse_string(struct parse *p, char *b, size_t rlen, |
|
/* Process text up to the next tag, entity, or EOL. */ |
/* Process text up to the next tag, entity, or EOL. */ |
|
|
} else { |
} else { |
advance(p, b, rlen, &pend, "<&", refill); |
advance(p, b, rlen, &pend, |
|
p->ncur == NODE_DOCTYPE ? "<&]" : "<&", |
|
refill); |
xml_char(p, b + poff, pend - poff); |
xml_char(p, b + poff, pend - poff); |
} |
} |
} |
} |