From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]); by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id 9fa81e80; for ; Fri, 28 Nov 2014 18:21:33 -0500 (EST) Date: Fri, 28 Nov 2014 18:21:32 -0500 (EST) Message-Id: <1483275037788084169.enqueue@fantadrom.bsd.lv> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Fold the loop around mdoc_argv() into the function itself, it X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- Fold the loop around mdoc_argv() into the function itself, it was the same in all four cases. As a bonus, get rid of one enum type that was used for internal communication. No functional change, minus 40 lines of code. Modified Files: -------------- mdocml: libmdoc.h mdoc_argv.c mdoc_macro.c Revision Data ------------- Index: mdoc_argv.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/mdoc_argv.c,v retrieving revision 1.97 retrieving revision 1.98 diff -Lmdoc_argv.c -Lmdoc_argv.c -u -p -r1.97 -r1.98 --- mdoc_argv.c +++ mdoc_argv.c @@ -1,7 +1,7 @@ /* $OpenBSD$ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2012 Ingo Schwarze + * Copyright (c) 2012, 2014 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -270,98 +270,105 @@ static const struct mdocarg mdocargs[MDO /* - * Parse an argument from line text. This comes in the form of -key - * [value0...], which may either have a single mandatory value, at least - * one mandatory value, an optional single value, or no value. + * Parse flags and their arguments from the input line. + * These come in the form -flag [argument ...]. + * Some flags take no argument, some one, some multiple. */ -enum margverr +void mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok, - struct mdoc_arg **v, int *pos, char *buf) + struct mdoc_arg **reta, int *pos, char *buf) { - char *p, sv; - struct mdoc_argv tmp; - struct mdoc_arg *arg; - const enum mdocargt *ap; - - if ('\0' == buf[*pos]) - return(ARGV_EOLN); - else if (NULL == (ap = mdocargs[tok].argvs)) - return(ARGV_WORD); - else if ('-' != buf[*pos]) - return(ARGV_WORD); + struct mdoc_argv tmpv; + struct mdoc_argv **retv; + const enum mdocargt *argtable; + char *argname; + int ipos, retc; + char savechar; - /* Seek to the first unescaped space. */ + *reta = NULL; - p = &buf[++(*pos)]; + /* Which flags does this macro support? */ - assert(*pos > 0); + argtable = mdocargs[tok].argvs; + if (argtable == NULL) + return; - for ( ; buf[*pos] ; (*pos)++) - if (' ' == buf[*pos] && '\\' != buf[*pos - 1]) - break; + /* Loop over the flags on the input line. */ - /* - * We want to nil-terminate the word to look it up (it's easier - * that way). But we may not have a flag, in which case we need - * to restore the line as-is. So keep around the stray byte, - * which we'll reset upon exiting (if necessary). - */ - - if ('\0' != (sv = buf[*pos])) - buf[(*pos)++] = '\0'; - - /* - * Now look up the word as a flag. Use temporary storage that - * we'll copy into the node's flags, if necessary. - */ - - memset(&tmp, 0, sizeof(struct mdoc_argv)); - - tmp.line = line; - tmp.pos = *pos; - tmp.arg = MDOC_ARG_MAX; + ipos = *pos; + while (buf[ipos] == '-') { - while (MDOC_ARG_MAX != (tmp.arg = *ap++)) - if (0 == strcmp(p, mdoc_argnames[tmp.arg])) - break; + /* Seek to the first unescaped space. */ + + for (argname = buf + ++ipos; buf[ipos] != '\0'; ipos++) + if (buf[ipos] == ' ' && buf[ipos - 1] != '\\') + break; - if (MDOC_ARG_MAX == tmp.arg) { /* - * The flag was not found. - * Restore saved zeroed byte and return as a word. + * We want to nil-terminate the word to look it up. + * But we may not have a flag, in which case we need + * to restore the line as-is. So keep around the + * stray byte, which we'll reset upon exiting. */ - if (sv) - buf[*pos - 1] = sv; - return(ARGV_WORD); - } - /* Read to the next word (the argument). */ + if ((savechar = buf[ipos]) != '\0') + buf[ipos++] = '\0'; - while (buf[*pos] && ' ' == buf[*pos]) - (*pos)++; + /* + * Now look up the word as a flag. Use temporary + * storage that we'll copy into the node's flags. + */ - switch (argvflags[tmp.arg]) { - case ARGV_SINGLE: - argv_single(mdoc, line, &tmp, pos, buf); - break; - case ARGV_MULTI: - argv_multi(mdoc, line, &tmp, pos, buf); - break; - case ARGV_NONE: - break; - } + while ((tmpv.arg = *argtable++) != MDOC_ARG_MAX) + if ( ! strcmp(argname, mdoc_argnames[tmpv.arg])) + break; + + /* If it isn't a flag, restore the saved byte. */ + + if (tmpv.arg == MDOC_ARG_MAX) { + if (savechar != '\0') + buf[ipos - 1] = savechar; + break; + } + + /* Read to the next word (the first argument). */ - if (NULL == (arg = *v)) - arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg)); + while (buf[ipos] == ' ') + ipos++; - arg->argc++; - arg->argv = mandoc_reallocarray(arg->argv, - arg->argc, sizeof(struct mdoc_argv)); + /* Parse the arguments of the flag. */ - memcpy(&arg->argv[(int)arg->argc - 1], &tmp, - sizeof(struct mdoc_argv)); + tmpv.line = line; + tmpv.pos = ipos; + tmpv.sz = 0; + tmpv.value = NULL; - return(ARGV_ARG); + switch (argvflags[tmpv.arg]) { + case ARGV_SINGLE: + argv_single(mdoc, line, &tmpv, &ipos, buf); + break; + case ARGV_MULTI: + argv_multi(mdoc, line, &tmpv, &ipos, buf); + break; + case ARGV_NONE: + break; + } + + /* Append to the return values. */ + + if (*reta == NULL) + *reta = mandoc_calloc(1, sizeof(**reta)); + + retc = ++(*reta)->argc; + retv = &(*reta)->argv; + *retv = mandoc_reallocarray(*retv, retc, sizeof(**retv)); + memcpy(*retv + retc - 1, &tmpv, sizeof(**retv)); + + /* Prepare for parsing the next flag. */ + + *pos = ipos; + argtable = mdocargs[tok].argvs; + } } void Index: libmdoc.h =================================================================== RCS file: /home/cvs/mdocml/mdocml/libmdoc.h,v retrieving revision 1.93 retrieving revision 1.94 diff -Llibmdoc.h -Llibmdoc.h -u -p -r1.93 -r1.94 --- libmdoc.h +++ libmdoc.h @@ -77,13 +77,6 @@ enum margserr { ARGS_PEND /* last phrase (-column) */ }; -enum margverr { - ARGV_ERROR, - ARGV_EOLN, /* end of line */ - ARGV_ARG, /* valid argument */ - ARGV_WORD /* normal word (or bad argument---same thing) */ -}; - /* * A punctuation delimiter is opening, closing, or "middle mark" * punctuation. These govern spacing. @@ -127,7 +120,7 @@ const char *mdoc_a2st(const char *); const char *mdoc_a2arch(const char *); void mdoc_valid_pre(struct mdoc *, struct mdoc_node *); void mdoc_valid_post(struct mdoc *); -enum margverr mdoc_argv(struct mdoc *, int, enum mdoct, +void mdoc_argv(struct mdoc *, int, enum mdoct, struct mdoc_arg **, int *, char *); void mdoc_argv_free(struct mdoc_arg *); enum margserr mdoc_args(struct mdoc *, int, Index: mdoc_macro.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/mdoc_macro.c,v retrieving revision 1.151 retrieving revision 1.152 diff -Lmdoc_macro.c -Lmdoc_macro.c -u -p -r1.151 -r1.152 --- mdoc_macro.c +++ mdoc_macro.c @@ -843,7 +843,6 @@ static void in_line(MACRO_PROT_ARGS) { int la, scope, cnt, firstarg, mayopen, nc, nl; - enum margverr av; enum mdoct ntok; enum margserr ac; enum mdelim d; @@ -876,15 +875,7 @@ in_line(MACRO_PROT_ARGS) break; } - for (arg = NULL;; ) { - la = *pos; - av = mdoc_argv(mdoc, line, tok, &arg, pos, buf); - if (av == ARGV_ARG) - continue; - if (av == ARGV_WORD) - *pos = la; - break; - } + mdoc_argv(mdoc, line, tok, &arg, pos, buf); d = DELIM_NONE; firstarg = 1; @@ -1041,7 +1032,6 @@ blk_full(MACRO_PROT_ARGS) struct mdoc_node *n; enum mdoct ntok; enum margserr ac, lac; - enum margverr av; char *p; nl = MDOC_NEWLINE & mdoc->flags; @@ -1078,16 +1068,7 @@ blk_full(MACRO_PROT_ARGS) * regular child nodes. */ - for (arg = NULL;; ) { - la = *pos; - av = mdoc_argv(mdoc, line, tok, &arg, pos, buf); - if (av == ARGV_ARG) - continue; - if (av == ARGV_WORD) - *pos = la; - break; - } - + mdoc_argv(mdoc, line, tok, &arg, pos, buf); mdoc_block_alloc(mdoc, line, ppos, tok, arg); head = body = NULL; @@ -1402,7 +1383,6 @@ in_line_argn(MACRO_PROT_ARGS) { int la, flushed, j, maxargs, nl; enum margserr ac; - enum margverr av; struct mdoc_arg *arg; char *p; enum mdoct ntok; @@ -1437,15 +1417,7 @@ in_line_argn(MACRO_PROT_ARGS) break; } - for (arg = NULL; ; ) { - la = *pos; - av = mdoc_argv(mdoc, line, tok, &arg, pos, buf); - if (av == ARGV_ARG) - continue; - if (av == ARGV_WORD) - *pos = la; - break; - } + mdoc_argv(mdoc, line, tok, &arg, pos, buf); for (flushed = j = 0; ; ) { la = *pos; @@ -1502,7 +1474,6 @@ in_line_eoln(MACRO_PROT_ARGS) { int la; enum margserr ac; - enum margverr av; struct mdoc_arg *arg; char *p; enum mdoct ntok; @@ -1512,20 +1483,7 @@ in_line_eoln(MACRO_PROT_ARGS) if (tok == MDOC_Pp) rew_sub(MDOC_BLOCK, mdoc, MDOC_Nm, line, ppos); - /* Parse macro arguments. */ - - for (arg = NULL; ; ) { - la = *pos; - av = mdoc_argv(mdoc, line, tok, &arg, pos, buf); - if (av == ARGV_ARG) - continue; - if (av == ARGV_WORD) - *pos = la; - break; - } - - /* Open element scope. */ - + mdoc_argv(mdoc, line, tok, &arg, pos, buf); mdoc_elem_alloc(mdoc, line, ppos, tok, arg); /* Parse argument terms. */ -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv