source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Stash `Bf' parameters into struct mdoc_bf.
@ 2010-07-02 12:54 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-07-02 12:54 UTC (permalink / raw)
  To: source

Log Message:
-----------
Stash `Bf' parameters into struct mdoc_bf.

Modified Files:
--------------
    mdocml:
        TODO
        main.c
        mandoc.h
        mdoc.c
        mdoc.h
        mdoc_html.c
        mdoc_term.c
        mdoc_validate.c

Revision Data
-------------
Index: mdoc_html.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_html.c,v
retrieving revision 1.91
retrieving revision 1.92
diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.91 -r1.92
--- mdoc_html.c
+++ mdoc_html.c
@@ -2015,46 +2015,33 @@ mdoc_ap_pre(MDOC_ARGS)
 static int
 mdoc_bf_pre(MDOC_ARGS)
 {
-	int		 i;
 	struct htmlpair	 tag[2];
 	struct roffsu	 su;
 
 	if (MDOC_HEAD == n->type)
 		return(0);
-	else if (MDOC_BLOCK != n->type)
+	else if (MDOC_BODY != n->type)
 		return(1);
 
-	PAIR_CLASS_INIT(&tag[0], "lit");
+	assert(n->data.Bf);
 
-	if (n->head->child) {
-		if ( ! strcmp("Em", n->head->child->string))
-			PAIR_CLASS_INIT(&tag[0], "emph");
-		else if ( ! strcmp("Sy", n->head->child->string))
-			PAIR_CLASS_INIT(&tag[0], "symb");
-		else if ( ! strcmp("Li", n->head->child->string))
-			PAIR_CLASS_INIT(&tag[0], "lit");
-	} else {
-		for (i = 0; n->args && i < (int)n->args->argc; i++) 
-			switch (n->args->argv[i].arg) {
-			case (MDOC_Symbolic):
-				PAIR_CLASS_INIT(&tag[0], "symb");
-				break;
-			case (MDOC_Literal):
-				PAIR_CLASS_INIT(&tag[0], "lit");
-				break;
-			case (MDOC_Emphasis):
-				PAIR_CLASS_INIT(&tag[0], "emph");
-				break;
-			default:
-				break;
-			}
-	}
-
-	/* FIXME: div's have spaces stripped--we want them. */
+	if (FONT_Em == n->data.Bf->font) 
+		PAIR_CLASS_INIT(&tag[0], "emph");
+	else if (FONT_Sy == n->data.Bf->font) 
+		PAIR_CLASS_INIT(&tag[0], "symb");
+	else if (FONT_Li == n->data.Bf->font) 
+		PAIR_CLASS_INIT(&tag[0], "lit");
+	else
+		PAIR_CLASS_INIT(&tag[0], "none");
 
+	/* 
+	 * We want this to be inline-formatted, but needs to be div to
+	 * accept block children. 
+	 */
 	bufcat_style(h, "display", "inline");
 	SCALE_HS_INIT(&su, 1);
-	bufcat_su(h, "margin-right", &su);
+	/* Needs a left-margin for spacing. */
+	bufcat_su(h, "margin-left", &su);
 	PAIR_STYLE_INIT(&tag[1], h);
 	print_otag(h, TAG_DIV, 2, tag);
 	return(1);
Index: mdoc.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.c,v
retrieving revision 1.155
retrieving revision 1.156
diff -Lmdoc.c -Lmdoc.c -u -p -r1.155 -r1.156
--- mdoc.c
+++ mdoc.c
@@ -518,12 +518,21 @@ static void
 mdoc_node_free(struct mdoc_node *p)
 {
 
+	/*
+	 * XXX: if these end up being problematic in terms of memory
+	 * management and dereferencing freed blocks, then make them
+	 * into reference-counted double-pointers.
+	 */
+
 	if (MDOC_Bd == p->tok && MDOC_BLOCK == p->type)
 		if (p->data.Bd)
 			free(p->data.Bd);
 	if (MDOC_Bl == p->tok && MDOC_BLOCK == p->type)
 		if (p->data.Bl)
 			free(p->data.Bl);
+	if (MDOC_Bf == p->tok && MDOC_HEAD == p->type)
+		if (p->data.Bf)
+			free(p->data.Bf);
 
 	if (p->string)
 		free(p->string);
Index: mandoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -Lmandoc.h -Lmandoc.h -u -p -r1.14 -r1.15
--- mandoc.h
+++ mandoc.h
@@ -81,14 +81,13 @@ enum	mandocerr {
 	MANDOCERR_NOTITLE, /* no title in document */
 	MANDOCERR_LISTTYPE, /* missing list type */
 	MANDOCERR_DISPTYPE, /* missing display type */
+	MANDOCERR_FONTTYPE, /* missing font type */
 	MANDOCERR_ARGSLOST, /* line argument(s) will be lost */
 	MANDOCERR_BODYLOST, /* body argument(s) will be lost */
 
 	MANDOCERR_FATAL, /* ===== end of fatal errors ===== */
 
 	MANDOCERR_COLUMNS, /* column syntax is inconsistent */
-	/* FIXME: this should be a MANDOCERR_ERROR */
-	MANDOCERR_FONTTYPE, /* missing font type */
 	/* FIXME: this should be a MANDOCERR_ERROR */
 	MANDOCERR_NESTEDDISP, /* displays may not be nested */
 	MANDOCERR_BADDISP, /* unsupported display type */
Index: main.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/main.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -Lmain.c -Lmain.c -u -p -r1.95 -r1.96
--- main.c
+++ main.c
@@ -153,13 +153,13 @@ static	const char * const	mandocerrs[MAN
 	"no title in document",
 	"missing list type",
 	"missing display type",
+	"missing font type",
 	"line argument(s) will be lost",
 	"body argument(s) will be lost",
 
 	"generic fatal error",
 
 	"column syntax is inconsistent",
-	"missing font type",
 	"displays may not be nested",
 	"unsupported display type",
 	"blocks badly nested",
Index: TODO
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/TODO,v
retrieving revision 1.20
retrieving revision 1.21
diff -LTODO -LTODO -u -p -r1.20 -r1.21
--- TODO
+++ TODO
@@ -105,7 +105,6 @@ Several areas can be cleaned up to make 
   that they need not be recalculated between front- and back-ends (also
   reduces code size and complexity):
     `Bl -column' pointer
-    `Bf' font type
 
 - improve hashing mechanism for macros (quite important: performance)
 
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.104
retrieving revision 1.105
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.104 -r1.105
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -931,38 +931,72 @@ pre_dd(PRE_ARGS)
 static int
 post_bf(POST_ARGS)
 {
-	char		 *p;
-	struct mdoc_node *head;
+	struct mdoc_node *np;
+	int		  arg;
 
-	if (MDOC_BLOCK != mdoc->last->type)
+	/*
+	 * Unlike other data pointers, these are "housed" by the HEAD
+	 * element, which contains the goods.
+	 */
+
+	if (MDOC_HEAD != mdoc->last->type) {
+		if (ENDBODY_NOT != mdoc->last->end) {
+			assert(mdoc->last->pending);
+			np = mdoc->last->pending->parent->head;
+		} else if (MDOC_BLOCK != mdoc->last->type) {
+			np = mdoc->last->parent->head;
+		} else 
+			np = mdoc->last->head;
+
+		assert(np);
+		assert(MDOC_HEAD == np->type);
+		assert(MDOC_Bf == np->tok);
+		assert(np->data.Bf);
+		mdoc->last->data.Bf = np->data.Bf;
 		return(1);
+	}
 
-	head = mdoc->last->head;
+	np = mdoc->last;
+	np->data.Bf = mandoc_calloc(1, sizeof(struct mdoc_bf));
 
-	if (mdoc->last->args && head->child) {
-		/* FIXME: this should provide a default. */
-		mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SYNTARGVCOUNT);
-		return(0);
-	} else if (mdoc->last->args)
-		return(1);
+	/* 
+	 * Cannot have both argument and parameter.
+	 * If neither is specified, let it through with a warning. 
+	 */
 
-	if (NULL == head->child || MDOC_TEXT != head->child->type) {
-		/* FIXME: this should provide a default. */
-		mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SYNTARGVCOUNT);
+	if (np->args && np->child) {
+		mdoc_nmsg(mdoc, np, MANDOCERR_SYNTARGVCOUNT);
 		return(0);
+	} else if (NULL == np->args && NULL == np->child)
+		return(mdoc_nmsg(mdoc, np, MANDOCERR_FONTTYPE));
+
+	/* Extract argument into data. */
+	
+	if (np->args) {
+		arg = np->args->argv[0].arg;
+		if (MDOC_Emphasis == arg)
+			np->data.Bf->font = FONT_Em;
+		else if (MDOC_Literal == arg)
+			np->data.Bf->font = FONT_Li;
+		else if (MDOC_Symbolic == arg)
+			np->data.Bf->font = FONT_Sy;
+		else
+			abort();
+		return(1);
 	}
 
-	p = head->child->string;
+	/* Extract parameter into data. */
 
-	if (0 == strcmp(p, "Em"))
-		return(1);
-	else if (0 == strcmp(p, "Li"))
-		return(1);
-	else if (0 == strcmp(p, "Sy"))
-		return(1);
+	if (0 == strcmp(np->child->string, "Em"))
+		np->data.Bf->font = FONT_Em;
+	else if (0 == strcmp(np->child->string, "Li"))
+		np->data.Bf->font = FONT_Li;
+	else if (0 == strcmp(np->child->string, "Sy"))
+		np->data.Bf->font = FONT_Sy;
+	else if ( ! mdoc_nmsg(mdoc, np, MANDOCERR_FONTTYPE))
+		return(0);
 
-	mdoc_nmsg(mdoc, head, MANDOCERR_FONTTYPE);
-	return(0);
+	return(1);
 }
 
 
Index: mdoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.h,v
retrieving revision 1.97
retrieving revision 1.98
diff -Lmdoc.h -Lmdoc.h -u -p -r1.97 -r1.98
--- mdoc.h
+++ mdoc.h
@@ -279,6 +279,13 @@ enum	mdoc_disp {
 	DISP_literal
 };
 
+enum	mdoc_font {
+	FONT__NONE = 0,
+	FONT_Em,
+	FONT_Li,
+	FONT_Sy
+};
+
 struct	mdoc_bd {
 	const char	 *offs; /* -offset */
 	enum mdoc_disp	  type; /* -ragged, etc. */
@@ -292,6 +299,10 @@ struct	mdoc_bl {
 	int		  comp; /* -compact */
 };
 
+struct	mdoc_bf {
+	enum mdoc_font	  font; /* font */
+};
+
 /* Node in AST. */
 struct	mdoc_node {
 	struct mdoc_node *parent; /* parent AST node */
@@ -321,8 +332,9 @@ struct	mdoc_node {
 	enum mdoc_endbody end;		/* BODY */
 
 	union {
-		struct mdoc_bl *Bl;
 		struct mdoc_bd *Bd;
+		struct mdoc_bf *Bf;
+		struct mdoc_bl *Bl;
 	} data;
 };
 
Index: mdoc_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_term.c,v
retrieving revision 1.166
retrieving revision 1.167
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.166 -r1.167
--- mdoc_term.c
+++ mdoc_term.c
@@ -2057,30 +2057,19 @@ termp_fo_post(DECL_ARGS)
 static int
 termp_bf_pre(DECL_ARGS)
 {
-	const struct mdoc_node	*nn;
 
 	if (MDOC_HEAD == n->type)
 		return(0);
 	else if (MDOC_BLOCK != n->type)
 		return(1);
 
-	if (NULL == (nn = n->head->child)) {
-		if (arg_hasattr(MDOC_Emphasis, n))
-			term_fontpush(p, TERMFONT_UNDER);
-		else if (arg_hasattr(MDOC_Symbolic, n))
-			term_fontpush(p, TERMFONT_BOLD);
-		else
-			term_fontpush(p, TERMFONT_NONE);
+	assert(n->data.Bf);
 
-		return(1);
-	} 
-
-	assert(MDOC_TEXT == nn->type);
-	if (0 == strcmp("Em", nn->string))
+	if (FONT_Em == n->data.Bf->font) 
 		term_fontpush(p, TERMFONT_UNDER);
-	else if (0 == strcmp("Sy", nn->string))
+	else if (FONT_Sy == n->data.Bf->font) 
 		term_fontpush(p, TERMFONT_BOLD);
-	else
+	else 
 		term_fontpush(p, TERMFONT_NONE);
 
 	return(1);
--
 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:[~2010-07-02 12:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-02 12:54 mdocml: Stash `Bf' parameters into struct mdoc_bf kristaps

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).