source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Provide a helper function macro_or_word() and use it to prune
@ 2014-11-29  3:37 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-11-29  3:37 UTC (permalink / raw)
  To: source

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-11-29  3:37 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-29  3:37 mdocml: Provide a helper function macro_or_word() and use it to prune 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).