* mdocml: Fold the loop around mdoc_argv() into the function itself, it
@ 2014-11-28 23:21 schwarze
0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-11-28 23:21 UTC (permalink / raw)
To: source
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 <kristaps@bsd.lv>
- * Copyright (c) 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2012, 2014 Ingo Schwarze <schwarze@openbsd.org>
*
* 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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2014-11-28 23:21 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-28 23:21 mdocml: Fold the loop around mdoc_argv() into the function itself, it schwarze
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).