source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Allow `Sx' and `Ss' to have child nodes.
@ 2011-08-10 14:07 kristaps
  2011-08-10 14:19 ` Kristaps Dzonsons
  0 siblings, 1 reply; 2+ messages in thread
From: kristaps @ 2011-08-10 14:07 UTC (permalink / raw)
  To: source

Log Message:
-----------
Allow `Sx' and `Ss' to have child nodes.  Fixes manuals in NetBSD.
Originally pointed out by joerg@ then again by Thomas Klausner by way of
Nicolas Joy.  Note: don't use these constructions as you can't link to
the sections with `Sx'.

Modified Files:
--------------
    mdocml:
        mdoc.7
        mdoc_html.c
        mdoc_macro.c
        mdoc_validate.c

Revision Data
-------------
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.172
retrieving revision 1.173
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.172 -r1.173
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -72,9 +72,7 @@ static	void	 check_text(struct mdoc *, i
 static	void	 check_argv(struct mdoc *, 
 			struct mdoc_node *, struct mdoc_argv *);
 static	void	 check_args(struct mdoc *, struct mdoc_node *);
-
-static	int	 concat(struct mdoc *, char *, 
-			const struct mdoc_node *, size_t);
+static	int	 concat(char *, const struct mdoc_node *, size_t);
 static	enum mdoc_sec	a2sec(const char *);
 static	size_t		macro2len(enum mdoct);
 
@@ -1107,6 +1105,7 @@ static int
 post_nm(POST_ARGS)
 {
 	char		 buf[BUFSIZ];
+	int		 c;
 
 	/* If no child specified, make sure we have the meta name. */
 
@@ -1118,11 +1117,14 @@ post_nm(POST_ARGS)
 
 	/* If no meta name, set it from the child. */
 
-	if ( ! concat(mdoc, buf, mdoc->last->child, BUFSIZ))
+	buf[0] = '\0';
+	if (-1 == (c = concat(buf, mdoc->last->child, BUFSIZ))) {
+		mdoc_nmsg(mdoc, mdoc->last->child, MANDOCERR_MEM);
 		return(0);
+	}
 
+	assert(c);
 	mdoc->meta.name = mandoc_strdup(buf);
-
 	return(1);
 }
 
@@ -1818,6 +1820,7 @@ post_sh_head(POST_ARGS)
 {
 	char		 buf[BUFSIZ];
 	enum mdoc_sec	 sec;
+	int		 c;
 
 	/*
 	 * Process a new section.  Sections are either "named" or
@@ -1826,10 +1829,13 @@ post_sh_head(POST_ARGS)
 	 * manual sections.
 	 */
 
-	if ( ! concat(mdoc, buf, mdoc->last->child, BUFSIZ))
+	sec = SEC_CUSTOM;
+	buf[0] = '\0';
+	if (-1 == (c = concat(buf, mdoc->last->child, BUFSIZ))) {
+		mdoc_nmsg(mdoc, mdoc->last->child, MANDOCERR_MEM);
 		return(0);
-
-	sec = a2sec(buf);
+	} else if (1 == c)
+		sec = a2sec(buf);
 
 	/* The NAME should be first. */
 
@@ -1978,6 +1984,7 @@ post_dd(POST_ARGS)
 {
 	char		  buf[DATESIZE];
 	struct mdoc_node *n;
+	int		  c;
 
 	if (mdoc->meta.date)
 		free(mdoc->meta.date);
@@ -1989,9 +1996,13 @@ post_dd(POST_ARGS)
 		return(1);
 	}
 
-	if ( ! concat(mdoc, buf, n->child, DATESIZE))
+	buf[0] = '\0';
+	if (-1 == (c = concat(buf, n->child, DATESIZE))) {
+		mdoc_nmsg(mdoc, n->child, MANDOCERR_MEM);
 		return(0);
+	}
 
+	assert(c);
 	mdoc->meta.date = mandoc_normdate
 		(mdoc->parse, buf, n->line, n->pos);
 
@@ -2146,6 +2157,7 @@ post_os(POST_ARGS)
 {
 	struct mdoc_node *n;
 	char		  buf[BUFSIZ];
+	int		  c;
 #ifndef OSNAME
 	struct utsname	  utsname;
 #endif
@@ -2162,8 +2174,13 @@ post_os(POST_ARGS)
 	if (mdoc->meta.os)
 		free(mdoc->meta.os);
 
-	if ( ! concat(mdoc, buf, n->child, BUFSIZ))
+	buf[0] = '\0';
+	if (-1 == (c = concat(buf, n->child, BUFSIZ))) {
+		mdoc_nmsg(mdoc, n->child, MANDOCERR_MEM);
 		return(0);
+	}
+
+	assert(c);
 
 	/* XXX: yes, these can all be dynamically-adjusted buffers, but
 	 * it's really not worth the extra hackery.
@@ -2230,34 +2247,24 @@ post_std(POST_ARGS)
 	return(1);
 }
 
+/*
+ * Concatenate a node, stopping at the first non-text.
+ * Concatenation is separated by a single whitespace.  
+ * Returns -1 on fatal (string overrun) error, 0 if child nodes were
+ * encountered, 1 otherwise.
+ */
 static int
-concat(struct mdoc *m, char *p, const struct mdoc_node *n, size_t sz)
+concat(char *p, const struct mdoc_node *n, size_t sz)
 {
 
-	p[0] = '\0';
-
-	/*
-	 * Concatenate sibling nodes together.  All siblings must be of
-	 * type MDOC_TEXT or an assertion is raised.  Concatenation is
-	 * separated by a single whitespace.  Returns 0 on fatal (string
-	 * overrun) error.
-	 */
-
-	for ( ; n; n = n->next) {
-		assert(MDOC_TEXT == n->type);
-
-		if (strlcat(p, n->string, sz) >= sz) {
-			mdoc_nmsg(m, n, MANDOCERR_MEM);
-			return(0);
-		}
-
-		if (NULL == n->next)
-			continue;
-
-		if (strlcat(p, " ", sz) >= sz) {
-			mdoc_nmsg(m, n, MANDOCERR_MEM);
+	for ( ; NULL != n; n = n->next) {
+		if (MDOC_TEXT != n->type) 
 			return(0);
-		}
+		if ('\0' != p[0] && strlcat(p, " ", sz) >= sz)
+			return(-1);
+		if (strlcat(p, n->string, sz) >= sz)
+			return(-1);
+		concat(p, n->child, sz);
 	}
 
 	return(1);
Index: mdoc_macro.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_macro.c,v
retrieving revision 1.109
retrieving revision 1.110
diff -Lmdoc_macro.c -Lmdoc_macro.c -u -p -r1.109 -r1.110
--- mdoc_macro.c
+++ mdoc_macro.c
@@ -74,8 +74,8 @@ const	struct mdoc_macro __mdoc_macros[MD
 	{ in_line_eoln, MDOC_PROLOGUE }, /* Dd */
 	{ in_line_eoln, MDOC_PROLOGUE }, /* Dt */
 	{ in_line_eoln, MDOC_PROLOGUE }, /* Os */
-	{ blk_full, 0 }, /* Sh */
-	{ blk_full, 0 }, /* Ss */ 
+	{ blk_full, MDOC_PARSED }, /* Sh */
+	{ blk_full, MDOC_PARSED }, /* Ss */ 
 	{ in_line_eoln, 0 }, /* Pp */ 
 	{ blk_part_imp, MDOC_PARSED }, /* D1 */
 	{ blk_part_imp, MDOC_PARSED }, /* Dl */
Index: mdoc_html.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_html.c,v
retrieving revision 1.174
retrieving revision 1.175
diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.174 -r1.175
--- mdoc_html.c
+++ mdoc_html.c
@@ -608,18 +608,22 @@ mdoc_sh_pre(MDOC_ARGS)
 
 	bufinit(h);
 	bufcat(h, "x");
-	for (n = n->child; n; n = n->next) {
+
+	for (n = n->child; n && MDOC_TEXT == n->type; ) {
 		bufcat_id(h, n->string);
-		if (n->next)
+		if (NULL != (n = n->next))
 			bufcat_id(h, " ");
 	}
 
-	PAIR_ID_INIT(&tag, h->buf);
-	print_otag(h, TAG_H1, 1, &tag);
+	if (NULL == n) {
+		PAIR_ID_INIT(&tag, h->buf);
+		print_otag(h, TAG_H1, 1, &tag);
+	} else
+		print_otag(h, TAG_H1, 0, NULL);
+
 	return(1);
 }
 
-
 /* ARGSUSED */
 static int
 mdoc_ss_pre(MDOC_ARGS)
@@ -635,14 +639,19 @@ mdoc_ss_pre(MDOC_ARGS)
 
 	bufinit(h);
 	bufcat(h, "x");
-	for (n = n->child; n; n = n->next) {
+
+	for (n = n->child; n && MDOC_TEXT == n->type; ) {
 		bufcat_id(h, n->string);
-		if (n->next)
+		if (NULL != (n = n->next))
 			bufcat_id(h, " ");
 	}
 
-	PAIR_ID_INIT(&tag, h->buf);
-	print_otag(h, TAG_H2, 1, &tag);
+	if (NULL == n) {
+		PAIR_ID_INIT(&tag, h->buf);
+		print_otag(h, TAG_H2, 1, &tag);
+	} else
+		print_otag(h, TAG_H2, 0, NULL);
+
 	return(1);
 }
 
@@ -1171,9 +1180,10 @@ mdoc_sx_pre(MDOC_ARGS)
 
 	bufinit(h);
 	bufcat(h, "#x");
-	for (n = n->child; n; n = n->next) {
+
+	for (n = n->child; n; ) {
 		bufcat_id(h, n->string);
-		if (n->next)
+		if (NULL != (n = n->next))
 			bufcat_id(h, " ");
 	}
 
Index: mdoc.7
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.7,v
retrieving revision 1.196
retrieving revision 1.197
diff -Lmdoc.7 -Lmdoc.7 -u -p -r1.196 -r1.197
--- mdoc.7
+++ mdoc.7
@@ -664,11 +664,11 @@ has multiple heads.
 .Pp
 .Bl -column -compact -offset indent "MacroX" "CallableX" "ParsedX" "closed by XXXXXXXXXXX"
 .It Em Macro Ta Em Callable Ta Em Parsed Ta Em Scope
-.It Sx \&It  Ta    \&No     Ta    Yes      Ta    closed by Sx \&It , Sx \&El
-.It Sx \&Nd  Ta    \&No     Ta    \&No     Ta    closed by Sx \&Sh
-.It Sx \&Nm  Ta    \&No     Ta  Yes Ta closed by Sx \&Nm , Sx \&Sh , Sx \&Ss
-.It Sx \&Sh  Ta    \&No     Ta    \&No     Ta    closed by Sx \&Sh
-.It Sx \&Ss  Ta    \&No     Ta    \&No     Ta    closed by Sx \&Sh , Sx \&Ss
+.It Sx \&It Ta \&No Ta Yes  Ta closed by Sx \&It , Sx \&El
+.It Sx \&Nd Ta \&No Ta \&No Ta closed by Sx \&Sh
+.It Sx \&Nm Ta \&No Ta Yes  Ta closed by Sx \&Nm , Sx \&Sh , Sx \&Ss
+.It Sx \&Sh Ta \&No Ta Yes  Ta closed by Sx \&Sh
+.It Sx \&Ss Ta \&No Ta Yes  Ta closed by Sx \&Sh , Sx \&Ss
 .El
 .Pp
 Note that the
@@ -2613,6 +2613,9 @@ custom sections be used.
 .Pp
 Section names should be unique so that they may be keyed by
 .Sx \&Sx .
+Although this macro is parsed, it should not consist of child node or it
+may not be linked with
+.Sx \&Sx .
 .Pp
 See also
 .Sx \&Pp ,
@@ -2655,6 +2658,9 @@ Conventional sections, as described in
 rarely have sub-sections.
 .Pp
 Sub-section names should be unique so that they may be keyed by
+.Sx \&Sx .
+Although this macro is parsed, it should not consist of child node or it
+may not be linked with
 .Sx \&Sx .
 .Pp
 See also
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: mdocml: Allow `Sx' and `Ss' to have child nodes.
  2011-08-10 14:07 mdocml: Allow `Sx' and `Ss' to have child nodes kristaps
@ 2011-08-10 14:19 ` Kristaps Dzonsons
  0 siblings, 0 replies; 2+ messages in thread
From: Kristaps Dzonsons @ 2011-08-10 14:19 UTC (permalink / raw)
  To: source

On 10/08/2011 16:07, kristaps@mdocml.bsd.lv wrote:
> Log Message:
> -----------
> Allow `Sx' and `Ss' to have child nodes.  Fixes manuals in NetBSD.
> Originally pointed out by joerg@ then again by Thomas Klausner by way of
> Nicolas Joy.  Note: don't use these constructions as you can't link to
> the sections with `Sx'.

Noted by Thomas:

s!Nicolas Joy!Nicolas Joly!
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-08-10 14:19 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-10 14:07 mdocml: Allow `Sx' and `Ss' to have child nodes kristaps
2011-08-10 14:19 ` Kristaps Dzonsons

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