=================================================================== RCS file: /cvs/mandoc/eqn.c,v retrieving revision 1.22 retrieving revision 1.24 diff -u -p -r1.22 -r1.24 --- mandoc/eqn.c 2011/07/22 00:16:37 1.22 +++ mandoc/eqn.c 2011/07/22 10:22:47 1.24 @@ -1,4 +1,4 @@ -/* $Id: eqn.c,v 1.22 2011/07/22 00:16:37 kristaps Exp $ */ +/* $Id: eqn.c,v 1.24 2011/07/22 10:22:47 kristaps Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * @@ -44,6 +44,11 @@ struct eqnstr { size_t sz; }; +#define STRNEQ(p1, sz1, p2, sz2) \ + (sz1) == (sz2) && 0 == strncmp((p1), (p2), (sz1)) +#define EQNSTREQ(x, p, sz) \ + STRNEQ((x)->name, (x)->sz, (p), (sz)) + struct eqnpart { struct eqnstr str; int (*fp)(struct eqn_node *); @@ -56,6 +61,7 @@ enum eqnpartt { EQN__MAX }; +static enum eqn_rest eqn_box(struct eqn_node *, struct eqn_box *); static struct eqn_box *eqn_box_alloc(struct eqn_box *); static void eqn_box_free(struct eqn_box *); static struct eqn_def *eqn_def_find(struct eqn_node *, @@ -63,13 +69,13 @@ static struct eqn_def *eqn_def_find(struct eqn_node *, static int eqn_do_define(struct eqn_node *); static int eqn_do_set(struct eqn_node *); static int eqn_do_undef(struct eqn_node *); +static enum eqn_rest eqn_eqn(struct eqn_node *, struct eqn_box *); +static enum eqn_rest eqn_list(struct eqn_node *, struct eqn_box *); static const char *eqn_nexttok(struct eqn_node *, size_t *); static const char *eqn_nextrawtok(struct eqn_node *, size_t *); static const char *eqn_next(struct eqn_node *, char, size_t *, int); static void eqn_rewind(struct eqn_node *); -static enum eqn_rest eqn_eqn(struct eqn_node *, struct eqn_box *); -static enum eqn_rest eqn_box(struct eqn_node *, struct eqn_box *); static const struct eqnpart eqnparts[EQN__MAX] = { { { "define", 6 }, eqn_do_define }, /* EQN_DEFINE */ @@ -204,6 +210,51 @@ eqn_eqn(struct eqn_node *ep, struct eqn_box *last) } static enum eqn_rest +eqn_list(struct eqn_node *ep, struct eqn_box *last) +{ + struct eqn_box *bp; + const char *start; + size_t sz; + enum eqn_rest c; + + bp = eqn_box_alloc(last); + bp->type = EQN_LIST; + + if (NULL == (start = eqn_nexttok(ep, &sz))) { + EQN_MSG(MANDOCERR_EQNEOF, ep); + return(EQN_ERR); + } + if ( ! STRNEQ(start, sz, "{", 1)) { + EQN_MSG(MANDOCERR_EQNSYNT, ep); + return(EQN_ERR); + } + + while (EQN_DESCOPE == (c = eqn_eqn(ep, bp))) { + eqn_rewind(ep); + start = eqn_nexttok(ep, &sz); + assert(start); + if ( ! STRNEQ(start, sz, "above", 5)) + break; + bp->last->above = 1; + } + + if (EQN_DESCOPE != c) { + if (EQN_ERR != c) + EQN_MSG(MANDOCERR_EQNSCOPE, ep); + return(EQN_ERR); + } + + eqn_rewind(ep); + start = eqn_nexttok(ep, &sz); + assert(start); + if (STRNEQ(start, sz, "}", 1)) + return(EQN_OK); + + EQN_MSG(MANDOCERR_EQNBADSCOPE, ep); + return(EQN_ERR); +} + +static enum eqn_rest eqn_box(struct eqn_node *ep, struct eqn_box *last) { size_t sz; @@ -216,22 +267,20 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) if (NULL == (start = eqn_nexttok(ep, &sz))) return(EQN_EOF); - if (1 == sz && 0 == strncmp("}", start, 1)) + if (STRNEQ(start, sz, "}", 1)) return(EQN_DESCOPE); - else if (5 == sz && 0 == strncmp("right", start, 5)) + else if (STRNEQ(start, sz, "right", 5)) return(EQN_DESCOPE); - else if (5 == sz && 0 == strncmp("above", start, 5)) + else if (STRNEQ(start, sz, "above", 5)) return(EQN_DESCOPE); for (i = 0; i < (int)EQN__MAX; i++) { - if (eqnparts[i].str.sz != sz) + if ( ! EQNSTREQ(&eqnparts[i].str, start, sz)) continue; - if (strncmp(eqnparts[i].str.name, start, sz)) - continue; return((*eqnparts[i].fp)(ep) ? EQN_OK : EQN_ERR); } - if (1 == sz && 0 == strncmp("{", start, 1)) { + if (STRNEQ(start, sz, "{", 1)) { if (EQN_DESCOPE != (c = eqn_eqn(ep, last))) { if (EQN_ERR != c) EQN_MSG(MANDOCERR_EQNSCOPE, ep); @@ -240,54 +289,21 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) eqn_rewind(ep); start = eqn_nexttok(ep, &sz); assert(start); - if (1 == sz && 0 == strncmp("}", start, 1)) + if (STRNEQ(start, sz, "}", 1)) return(EQN_OK); EQN_MSG(MANDOCERR_EQNBADSCOPE, ep); return(EQN_ERR); } for (i = 0; i < (int)EQNPILE__MAX; i++) { - if (eqnpiles[i].sz != sz) + if ( ! EQNSTREQ(&eqnpiles[i], start, sz)) continue; - if (strncmp(eqnpiles[i].name, start, sz)) - continue; - if (NULL == (start = eqn_nexttok(ep, &sz))) { - EQN_MSG(MANDOCERR_EQNEOF, ep); - return(EQN_ERR); - } - if (1 != sz || strncmp("{", start, 1)) { - EQN_MSG(MANDOCERR_EQNSYNT, ep); - return(EQN_ERR); - } - - while (EQN_DESCOPE == (c = eqn_eqn(ep, last))) { - assert(last->last); + if (EQN_OK == (c = eqn_list(ep, last))) last->last->pile = (enum eqn_pilet)i; - eqn_rewind(ep); - start = eqn_nexttok(ep, &sz); - assert(start); - if (5 != sz || strncmp("above", start, 5)) - break; - last->last->above = 1; - } - - if (EQN_DESCOPE != c) { - if (EQN_ERR != c) - EQN_MSG(MANDOCERR_EQNSCOPE, ep); - return(EQN_ERR); - } - - eqn_rewind(ep); - start = eqn_nexttok(ep, &sz); - assert(start); - if (1 == sz && 0 == strncmp("}", start, 1)) - return(EQN_OK); - - EQN_MSG(MANDOCERR_EQNBADSCOPE, ep); - return(EQN_ERR); + return(c); } - if (4 == sz && 0 == strncmp("left", start, 4)) { + if (STRNEQ(start, sz, "left", 4)) { if (NULL == (start = eqn_nexttok(ep, &sz))) { EQN_MSG(MANDOCERR_EQNEOF, ep); return(EQN_ERR); @@ -300,7 +316,7 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) eqn_rewind(ep); start = eqn_nexttok(ep, &sz); assert(start); - if (5 != sz || strncmp("right", start, 5)) + if (STRNEQ(start, sz, "right", 5)) return(EQN_DESCOPE); if (NULL == (start = eqn_nexttok(ep, &sz))) { EQN_MSG(MANDOCERR_EQNEOF, ep); @@ -311,10 +327,8 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) } for (i = 0; i < (int)EQNPOS__MAX; i++) { - if (eqnposs[i].sz != sz) + if ( ! EQNSTREQ(&eqnposs[i], start, sz)) continue; - if (strncmp(eqnposs[i].name, start, sz)) - continue; if (NULL == last->last) { EQN_MSG(MANDOCERR_EQNSYNT, ep); return(EQN_ERR); @@ -328,10 +342,8 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) } for (i = 0; i < (int)EQNMARK__MAX; i++) { - if (eqnmarks[i].sz != sz) + if ( ! EQNSTREQ(&eqnmarks[i], start, sz)) continue; - if (strncmp(eqnmarks[i].name, start, sz)) - continue; if (NULL == last->last) { EQN_MSG(MANDOCERR_EQNSYNT, ep); return(EQN_ERR); @@ -345,10 +357,8 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) } for (i = 0; i < (int)EQNFONT__MAX; i++) { - if (eqnfonts[i].sz != sz) + if ( ! EQNSTREQ(&eqnfonts[i], start, sz)) continue; - if (strncmp(eqnfonts[i].name, start, sz)) - continue; if (EQN_EOF == (c = eqn_box(ep, last))) { EQN_MSG(MANDOCERR_EQNEOF, ep); return(EQN_ERR); @@ -357,7 +367,7 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) return(c); } - if (4 == sz && 0 == strncmp("size", start, 4)) { + if (STRNEQ(start, sz, "size", 4)) { if (NULL == (start = eqn_nexttok(ep, &sz))) { EQN_MSG(MANDOCERR_EQNEOF, ep); return(EQN_ERR); @@ -628,8 +638,8 @@ eqn_def_find(struct eqn_node *ep, const char *key, siz int i; for (i = 0; i < (int)ep->defsz; i++) - if (ep->defs[i].keysz && ep->defs[i].keysz == sz && - 0 == strncmp(ep->defs[i].key, key, sz)) + if (ep->defs[i].keysz && STRNEQ(ep->defs[i].key, + ep->defs[i].keysz, key, sz)) return(&ep->defs[i]); return(NULL);