From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: Provide a helper function macro_or_word() and use it to prune
Date: Fri, 28 Nov 2014 22:37:44 -0500 (EST) [thread overview]
Message-ID: <17403815899031393844.enqueue@fantadrom.bsd.lv> (raw)
Log Message:
-----------
Provide a helper function macro_or_word() and use it to prune the
same chunk of argument parsing code out of five of the eight callback
functions. The other three have too much special handling to
participate.
As a bonus, let lookup() and mdoc_args() deal with line macros and
retire the lookup_raw() helper and the mdoc_zargs() internal interface
function.
No functional change, minus 40 lines of code.
Modified Files:
--------------
mdocml:
libmdoc.h
mdoc_argv.c
mdoc_macro.c
Revision Data
-------------
Index: mdoc_macro.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_macro.c,v
retrieving revision 1.152
retrieving revision 1.153
diff -Lmdoc_macro.c -Lmdoc_macro.c -u -p -r1.152 -r1.153
--- mdoc_macro.c
+++ mdoc_macro.c
@@ -54,10 +54,10 @@ static void dword(struct mdoc *, int, i
enum mdelim, int);
static void append_delims(struct mdoc *, int, int *, char *);
static enum mdoct lookup(enum mdoct, const char *);
-static enum mdoct lookup_raw(const char *);
+static int macro_or_word(MACRO_PROT_ARGS, int);
static int make_pending(struct mdoc_node *, enum mdoct,
struct mdoc *, int, int);
-static void phrase(struct mdoc *, int, int, char *);
+static void phrase(struct mdoc *, int, int *, char *);
static enum mdoct rew_alt(enum mdoct);
static enum rew rew_dohalt(enum mdoct, enum mdoc_type,
const struct mdoc_node *);
@@ -240,29 +240,19 @@ mdoc_macroend(struct mdoc *mdoc)
}
/*
- * Look up a macro from within a subsequent context.
+ * Look up the macro at *p called by "from",
+ * or as a line macro if from == MDOC_MAX.
*/
static enum mdoct
lookup(enum mdoct from, const char *p)
{
-
- if ( ! (MDOC_PARSED & mdoc_macros[from].flags))
- return(MDOC_MAX);
- return(lookup_raw(p));
-}
-
-/*
- * Lookup a macro following the initial line macro.
- */
-static enum mdoct
-lookup_raw(const char *p)
-{
enum mdoct res;
- if (MDOC_MAX == (res = mdoc_hash_find(p)))
- return(MDOC_MAX);
- if (MDOC_CALLABLE & mdoc_macros[res].flags)
- return(res);
+ if (from == MDOC_MAX || mdoc_macros[from].flags & MDOC_PARSED) {
+ res = mdoc_hash_find(p);
+ if (res != MDOC_MAX && mdoc_macros[res].flags & MDOC_CALLABLE)
+ return(res);
+ }
return(MDOC_MAX);
}
@@ -633,17 +623,15 @@ dword(struct mdoc *mdoc, int line, int c
static void
append_delims(struct mdoc *mdoc, int line, int *pos, char *buf)
{
- int la;
- enum margserr ac;
char *p;
+ int la;
if (buf[*pos] == '\0')
return;
for (;;) {
la = *pos;
- ac = mdoc_zargs(mdoc, line, pos, buf, &p);
- if (ac == ARGS_EOLN)
+ if (mdoc_args(mdoc, line, pos, buf, MDOC_MAX, &p) == ARGS_EOLN)
break;
dword(mdoc, line, la, p, DELIM_MAX, 1);
@@ -665,6 +653,40 @@ append_delims(struct mdoc *mdoc, int lin
}
/*
+ * Parse one word.
+ * If it is a macro, call it and return 1.
+ * Otherwise, allocate it and return 0.
+ */
+static int
+macro_or_word(MACRO_PROT_ARGS, int parsed)
+{
+ char *p;
+ enum mdoct ntok;
+
+ p = buf + ppos;
+ ntok = MDOC_MAX;
+ if (mdoc->flags & MDOC_PHRASELIT)
+ /* nothing */;
+ else if (*p == '"')
+ p++;
+ else if (parsed)
+ ntok = lookup(tok, p);
+
+ if (ntok == MDOC_MAX) {
+ dword(mdoc, line, ppos, p, DELIM_MAX, tok == MDOC_MAX ||
+ mdoc_macros[tok].flags & MDOC_JOIN);
+ return(0);
+ } else {
+ if (mdoc_macros[tok].fp == in_line_eoln)
+ rew_elem(mdoc, tok);
+ mdoc_macro(mdoc, ntok, line, ppos, pos, buf);
+ if (tok == MDOC_MAX)
+ append_delims(mdoc, line, pos, buf);
+ return(1);
+ }
+}
+
+/*
* Close out block partial/full explicit.
*/
static void
@@ -1025,12 +1047,11 @@ in_line(MACRO_PROT_ARGS)
static void
blk_full(MACRO_PROT_ARGS)
{
- int la, nl, nparsed;
+ int la, nl, parsed;
struct mdoc_arg *arg;
struct mdoc_node *head; /* save of head macro */
struct mdoc_node *body; /* save of body macro */
struct mdoc_node *n;
- enum mdoct ntok;
enum margserr ac, lac;
char *p;
@@ -1077,9 +1098,9 @@ blk_full(MACRO_PROT_ARGS)
* parsed, even though `It' macros in general are parsed.
*/
- nparsed = tok == MDOC_It &&
- mdoc->last->parent->tok == MDOC_Bl &&
- mdoc->last->parent->norm->Bl.type == LIST_diag;
+ parsed = tok != MDOC_It ||
+ mdoc->last->parent->tok != MDOC_Bl ||
+ mdoc->last->parent->norm->Bl.type != LIST_diag;
/*
* The `Nd' macro has all arguments in its body: it's a hybrid
@@ -1160,20 +1181,13 @@ blk_full(MACRO_PROT_ARGS)
mdoc->flags |= MDOC_PPHRASE;
if (ac == ARGS_PEND && lac == ARGS_PPHRASE)
mdoc->flags |= MDOC_PPHRASE;
- phrase(mdoc, line, la, buf);
+ phrase(mdoc, line, &la, buf);
mdoc->flags &= ~MDOC_PPHRASE;
continue;
}
- ntok = nparsed || ac == ARGS_QWORD ?
- MDOC_MAX : lookup(tok, p);
-
- if (ntok != MDOC_MAX) {
- mdoc_macro(mdoc, ntok, line, la, pos, buf);
+ if (macro_or_word(mdoc, tok, line, la, pos, buf, parsed))
break;
- }
- dword(mdoc, line, la, p, DELIM_MAX,
- MDOC_JOIN & mdoc_macros[tok].flags);
}
if (head == NULL)
@@ -1214,7 +1228,6 @@ static void
blk_part_imp(MACRO_PROT_ARGS)
{
int la, nl;
- enum mdoct ntok;
enum margserr ac;
char *p;
struct mdoc_node *blk; /* saved block context */
@@ -1257,14 +1270,8 @@ blk_part_imp(MACRO_PROT_ARGS)
if (body == NULL)
body = mdoc_body_alloc(mdoc, line, ppos, tok);
- ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup(tok, p);
-
- if (ntok != MDOC_MAX) {
- mdoc_macro(mdoc, ntok, line, la, pos, buf);
+ if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))
break;
- }
- dword(mdoc, line, la, p, DELIM_MAX,
- MDOC_JOIN & mdoc_macros[tok].flags);
}
if (body == NULL)
body = mdoc_body_alloc(mdoc, line, ppos, tok);
@@ -1308,7 +1315,6 @@ blk_part_exp(MACRO_PROT_ARGS)
struct mdoc_node *head; /* keep track of head */
struct mdoc_node *body; /* keep track of body */
char *p;
- enum mdoct ntok;
nl = MDOC_NEWLINE & mdoc->flags;
@@ -1356,13 +1362,8 @@ blk_part_exp(MACRO_PROT_ARGS)
}
assert(head != NULL && body != NULL);
- ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup(tok, p);
- if (ntok != MDOC_MAX) {
- mdoc_macro(mdoc, ntok, line, la, pos, buf);
+ if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))
break;
- }
- dword(mdoc, line, la, p, DELIM_MAX,
- MDOC_JOIN & mdoc_macros[tok].flags);
}
/* Clean-up to leave in a consistent state. */
@@ -1473,12 +1474,7 @@ static void
in_line_eoln(MACRO_PROT_ARGS)
{
int la;
- enum margserr ac;
struct mdoc_arg *arg;
- char *p;
- enum mdoct ntok;
-
- assert( ! (MDOC_PARSED & mdoc_macros[tok].flags));
if (tok == MDOC_Pp)
rew_sub(MDOC_BLOCK, mdoc, MDOC_Nm, line, ppos);
@@ -1486,27 +1482,13 @@ in_line_eoln(MACRO_PROT_ARGS)
mdoc_argv(mdoc, line, tok, &arg, pos, buf);
mdoc_elem_alloc(mdoc, line, ppos, tok, arg);
- /* Parse argument terms. */
-
for (;;) {
la = *pos;
- ac = mdoc_args(mdoc, line, pos, buf, tok, &p);
- if (ac == ARGS_EOLN)
+ if (mdoc_args(mdoc, line, pos, buf, tok, NULL) == ARGS_EOLN)
break;
-
- ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup(tok, p);
-
- if (ntok != MDOC_MAX) {
- rew_elem(mdoc, tok);
- mdoc_macro(mdoc, ntok, line, la, pos, buf);
+ if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))
return;
- }
- dword(mdoc, line, la, p, DELIM_MAX,
- MDOC_JOIN & mdoc_macros[tok].flags);
}
-
- /* Close out (no delimiters). */
-
rew_elem(mdoc, tok);
}
@@ -1530,39 +1512,20 @@ ctx_synopsis(MACRO_PROT_ARGS)
* macro is encountered.
*/
static void
-phrase(struct mdoc *mdoc, int line, int ppos, char *buf)
+phrase(struct mdoc *mdoc, int line, int *pos, char *buf)
{
- int la, pos;
- enum margserr ac;
- enum mdoct ntok;
- char *p;
-
- for (pos = ppos; ; ) {
- la = pos;
-
- ac = mdoc_zargs(mdoc, line, &pos, buf, &p);
- if (ac == ARGS_EOLN)
- break;
-
- ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup_raw(p);
+ int la;
- if (ntok != MDOC_MAX) {
- mdoc_macro(mdoc, ntok, line, la, &pos, buf);
- append_delims(mdoc, line, &pos, buf);
- return;
- }
- dword(mdoc, line, la, p, DELIM_MAX, 1);
- }
+ do
+ la = *pos;
+ while (mdoc_args(mdoc, line, pos, buf, MDOC_MAX, NULL) != ARGS_EOLN &&
+ !macro_or_word(mdoc, MDOC_MAX, line, la, pos, buf, 1));
}
static void
phrase_ta(MACRO_PROT_ARGS)
{
struct mdoc_node *n;
- int la;
- enum mdoct ntok;
- enum margserr ac;
- char *p;
/* Make sure we are in a column list or ignore this macro. */
@@ -1579,21 +1542,5 @@ phrase_ta(MACRO_PROT_ARGS)
rew_sub(MDOC_BODY, mdoc, MDOC_It, line, ppos);
mdoc_body_alloc(mdoc, line, ppos, MDOC_It);
-
- for (;;) {
- la = *pos;
- ac = mdoc_zargs(mdoc, line, pos, buf, &p);
- if (ac == ARGS_EOLN)
- break;
-
- ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup_raw(p);
-
- if (ntok != MDOC_MAX) {
- mdoc_macro(mdoc, ntok, line, la, pos, buf);
- append_delims(mdoc, line, pos, buf);
- return;
- }
- dword(mdoc, line, la, p, DELIM_MAX,
- MDOC_JOIN & mdoc_macros[tok].flags);
- }
+ phrase(mdoc, line, pos, buf);
}
Index: mdoc_argv.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_argv.c,v
retrieving revision 1.98
retrieving revision 1.99
diff -Lmdoc_argv.c -Lmdoc_argv.c -u -p -r1.98 -r1.99
--- mdoc_argv.c
+++ mdoc_argv.c
@@ -412,22 +412,17 @@ argn_free(struct mdoc_arg *p, int iarg)
}
enum margserr
-mdoc_zargs(struct mdoc *mdoc, int line, int *pos, char *buf, char **v)
-{
-
- return(args(mdoc, line, pos, buf, ARGSFL_NONE, v));
-}
-
-enum margserr
mdoc_args(struct mdoc *mdoc, int line, int *pos,
char *buf, enum mdoct tok, char **v)
{
- enum argsflag fl;
struct mdoc_node *n;
+ char *v_local;
+ enum argsflag fl;
- fl = mdocargs[tok].flags;
-
- if (MDOC_It != tok)
+ if (v == NULL)
+ v = &v_local;
+ fl = tok == MDOC_MAX ? ARGSFL_NONE : mdocargs[tok].flags;
+ if (tok != MDOC_It)
return(args(mdoc, line, pos, buf, fl, v));
/*
Index: libmdoc.h
===================================================================
RCS file: /home/cvs/mdocml/mdocml/libmdoc.h,v
retrieving revision 1.94
retrieving revision 1.95
diff -Llibmdoc.h -Llibmdoc.h -u -p -r1.94 -r1.95
--- libmdoc.h
+++ libmdoc.h
@@ -125,8 +125,6 @@ void mdoc_argv(struct mdoc *, int, en
void mdoc_argv_free(struct mdoc_arg *);
enum margserr mdoc_args(struct mdoc *, int,
int *, char *, enum mdoct, char **);
-enum margserr mdoc_zargs(struct mdoc *, int,
- int *, char *, char **);
void mdoc_macroend(struct mdoc *);
enum mdelim mdoc_isdelim(const char *);
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
reply other threads:[~2014-11-29 3:37 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=17403815899031393844.enqueue@fantadrom.bsd.lv \
--to=schwarze@mdocml.bsd.lv \
--cc=source@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).