aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-22 19:01:11 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-22 19:01:11 +0000
commit7f5e6c325d7501f482f01a516a4bcd4fcde4d255 (patch)
tree82470d31e8b8c11cf36a23770b8151da394dd3ea
parent161e91f1e1aba8f876c65a8533432516e2dce548 (diff)
downloadmandoc-7f5e6c325d7501f482f01a516a4bcd4fcde4d255.tar.gz
mandoc-7f5e6c325d7501f482f01a516a4bcd4fcde4d255.tar.zst
mandoc-7f5e6c325d7501f482f01a516a4bcd4fcde4d255.zip
Stripping of Xo/Xc macros in main.c (ifdef STRIP_XO).
-rw-r--r--Makefile6
-rw-r--r--macro.c9
-rw-r--r--main.c84
-rw-r--r--manuals.7102
4 files changed, 136 insertions, 65 deletions
diff --git a/Makefile b/Makefile
index b7d83b37..f186e817 100644
--- a/Makefile
+++ b/Makefile
@@ -13,10 +13,14 @@ VERSION = 1.6.8
VDATE = 21 March 2009
VFLAGS = -DVERSION=\"$(VERSION)\"
-CFLAGS += -W -Wall -Wstrict-prototypes -Wno-unused-parameter -g
+CFLAGS += -W -Wall -Wstrict-prototypes -Wno-unused-parameter -g
LINTFLAGS += $(VFLAGS)
CFLAGS += $(VFLAGS)
+# If you want to strip `Xo/Xc' macro pairs, enable this. Really, only
+# OpenBSD should be doing this while it kicks its cruft.
+CFLAGS += -DSTRIP_XO
+
LIBLNS = macro.ln mdoc.ln hash.ln strings.ln xstd.ln argv.ln \
validate.ln action.ln lib.ln att.ln arch.ln vol.ln \
msec.ln st.ln
diff --git a/macro.c b/macro.c
index 9549004d..6b3e4fe3 100644
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $Id: macro.c,v 1.76 2009/03/21 09:42:07 kristaps Exp $ */
+/* $Id: macro.c,v 1.77 2009/03/22 19:01:11 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
*
@@ -33,6 +33,7 @@
/* FIXME: .Fl, .Ar, .Cd handling of `|'. */
enum mwarn {
+ WIMPBRK,
WMACPARM,
WOBS
};
@@ -236,6 +237,9 @@ pwarn(struct mdoc *mdoc, int line, int pos, enum mwarn type)
p = NULL;
switch (type) {
+ case (WIMPBRK):
+ p = "crufty end-of-line scope violation";
+ break;
case (WMACPARM):
p = "macro-like parameter";
break;
@@ -1058,6 +1062,9 @@ blk_part_imp(MACRO_PROT_ARGS)
if (body == n)
break;
+ if (NULL == n && ! pwarn(mdoc, body->line, body->pos, WIMPBRK))
+ return(0);
+
if (n && ! rew_last(mdoc, body))
return(0);
diff --git a/main.c b/main.c
index 773700e9..889b3387 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.7 2009/03/20 21:58:38 kristaps Exp $ */
+/* $Id: main.c,v 1.8 2009/03/22 19:01:11 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
*
@@ -264,6 +264,9 @@ fdesc(struct buf *blk, struct buf *ln,
ssize_t ssz;
struct stat st;
int j, i, pos, lnn;
+#ifdef STRIP_XO
+ int macro, xo, xeoln;
+#endif
/*
* Two buffers: ln and buf. buf is the input buffer, optimised
@@ -288,6 +291,9 @@ fdesc(struct buf *blk, struct buf *ln,
/*
* Fill buf with file blocksize and parse newlines into ln.
*/
+#ifdef STRIP_XO
+ macro = xo = xeoln = 0;
+#endif
for (lnn = 1, pos = 0; ; ) {
if (-1 == (ssz = read(fd, blk->buf, sz))) {
@@ -305,6 +311,66 @@ fdesc(struct buf *blk, struct buf *ln,
}
if ('\n' != blk->buf[i]) {
+ /*
+ * Ugly of uglies. Here we handle the
+ * dreaded `Xo/Xc' scoping. Cover the
+ * eyes of any nearby children. This
+ * makes `Xo/Xc' enclosures look like
+ * one huge line.
+ */
+#ifdef STRIP_XO
+ /*
+ * First, note whether we're in a macro
+ * line.
+ */
+ if (0 == pos && '.' == blk->buf[i])
+ macro = 1;
+
+ /*
+ * If we're in an `Xo' context and just
+ * nixed a newline, remove the control
+ * character for new macro lines:
+ * they're going to show up as all part
+ * of the same line.
+ */
+ if (xo && xeoln && '.' == blk->buf[i]) {
+ xeoln = 0;
+ continue;
+ }
+ xeoln = 0;
+
+ /*
+ * If we've parsed `Xo', enter an xo
+ * context. `Xo' must be in a parsable
+ * state. This is the ugly part. IT IS
+ * NOT SMART ENOUGH TO HANDLE ESCAPED
+ * WHITESPACE.
+ */
+ if (macro && pos && 'o' == blk->buf[i]) {
+ if (xo && 'X' == ln->buf[pos - 1]) {
+ if (' ' == ln->buf[pos - 2])
+ xo++;
+ } else if ('X' == ln->buf[pos - 1]) {
+ if (2 == pos && '.' == ln->buf[pos - 2])
+ xo++;
+ else if (' ' == ln->buf[pos - 2])
+ xo++;
+ }
+ }
+
+ /*
+ * If we're parsed `Xc', leave an xo
+ * context if one's already pending.
+ * `Xc' must be in a parsable state.
+ * THIS IS NOT SMART ENOUGH TO HANDLE
+ * ESCAPED WHITESPACE.
+ */
+ if (macro && pos && 'c' == blk->buf[i])
+ if (xo && 'X' == ln->buf[pos - 1])
+ if (' ' == ln->buf[pos - 2])
+ xo--;
+#endif /* STRIP_XO */
+
ln->buf[pos++] = blk->buf[i];
continue;
}
@@ -323,11 +389,25 @@ fdesc(struct buf *blk, struct buf *ln,
}
}
+#ifdef STRIP_XO
+ /*
+ * If we're in an xo context, put a space in
+ * place of the newline and continue parsing.
+ * Mark that we just did a newline.
+ */
+ if (xo) {
+ xeoln = 1;
+ ln->buf[pos++] = ' ';
+ lnn++;
+ continue;
+ }
+#endif /* STRIP_XO */
+
ln->buf[pos] = 0;
if ( ! mdoc_parseln(mdoc, lnn, ln->buf))
return(0);
lnn++;
- pos = 0;
+ macro = pos = 0;
}
}
diff --git a/manuals.7 b/manuals.7
index 01301213..5ce9b645 100644
--- a/manuals.7
+++ b/manuals.7
@@ -25,22 +25,20 @@ documentation
If you add something to your operating system, whether it's a new file
format or directory structure or device driver, it needs documentation.
.\" SECTION
-.Sh CLASSIFICATION
-Classify your system component. In
-.Ux ,
-each component has a manual section , which categorises the component's
-function. The section of a manual is usually listed in parenthesis next
-to the component name, such as
-.Xr ps 1 ,
-section 1. You can query a manual explicitly by its section:
-.Bd -literal -offset XXXX
-% man \-s 1 ps
-% apropos ps
-.Ed
-.Pp
-The following table lists classifications and the applicable manual
-sections:
+.Sh COMPOSITION
+Prepare your composition environment by copying over the manual template
+from
+.Pa /usr/share/misc/mdoc.template .
+.Em \&Do not
+start afresh or by copying another manual unless you know exactly what
+you're doing!
+.\" SUBSECTION
+.Ss Section Numbering
+Find an appropriate section for your manual. There may exist multiple
+manual names per section, so be specific. A table of all available
+manual sections follows:
.Pp
+.\" LIST
.Bl -tag -width "XXXXXXXXXXXX" -offset indent -compact
.It Em Section
.Em Description
@@ -62,52 +60,30 @@ administrator utilities
in-kernel routines
.El
.Pp
-Some examples in regular name/section form:
-.Pp
-.\" LIST
-.Bl -tag -width "File-formatX" -offset indent -compact
-.It Em Manual
-.Em Description
-.It Xr dc 4
-DEC/Intel 10/100 Ethernet device
-.It Xr usermod 8
-modify user login information
-.It Xr cc 1
-the C compiler
-.It Xr fortune 6
-print a random adage
-.It Xr open 2
-open or create a file for reading or writing
-.It Xr isspace 3
-whitespace character test
-.It Xr Pod::Man 3p
-convert POD data to formatted roff
-.It Xr tsleep 9
-process context sleep
-.It Xr passwd 5
-format of the password file
-.It Xr symlink 7
-symbolic link handling
-.El
-.\" SECTION
-.Sh COMPOSITION
-Prepare your composition environment by copying over the manual template
-from
-.Pa /usr/share/misc/mdoc.template .
-.Em \&Do not
-start afresh or by copying another manual unless you know exactly what
-you're doing!
+If your manual falls into multiple categories, choose the most
+widely-used or, better, re-consider the topic of your manual to be more
+specific. You can list all manuals per section by invoking
+.Xr apropos 1 ,
+then provide the
+.Fl s
+flag to
+.Xr man 1
+to see the specific section manual (section 1, in this example):
+.\" DISPLAY
+.Bd -literal -offset indent
+% apropos myname
+myname (1) - some description here
+% man \-s 1 myname
+.Ed
.\" SUBSECTION
.Ss Naming
-Your component will need a name by which to query its contents via
-.Xr man 1 .
-Keep it simple. You may want to look for other manuals by that same
-name before committing:
+Name your component. Be terse, erring on the side of clarity. You may
+want to look for other manuals by that same name before committing:
.Pp
.Dl % apropos myname
.Pp
-Conventionally, manual files are named
-.Pa myname.section ,
+Manual files are named
+.Pa myname.mysection ,
such as
.Pa manuals.7
for this document.
@@ -129,13 +105,13 @@ packages of
.Xr roff 7 ;
newer languages such as DocBook, texinfo or schema-driven XML; or even
ad-hoc conventions such as README files.
-.Em Stay away from these methods!
+.Em Avoid these formats .
Historical formats fail to capture a manual's semantic content, instead
only modelling its style. Newer methods requires special,
system-specific tools and may change or become obsolete over the
life-time of your component.
.Pp
-There are two canonical references for writing mdoc manuals:
+There are two canonical references for writing mdoc. Read them.
.Pp
.\" LIST
.Bl -tag -width XXXXXXXXXXXXXXXX -offset indent -compact
@@ -200,10 +176,8 @@ output:
\&.in.1:
mandoc -Wall,error -Tlint $<
cp -f $< $@
-
\&.1.html:
mandoc -Thtml $< >$@
-
\&.1.txt:
mandoc -Tascii $< | col -b >$@
.Ed
@@ -238,7 +212,7 @@ symbols and so on), use the escapes dictated in
.\" SUBSECTION
.Ss References
Other components may be referenced with the
-.Sq \&Xr ,
+.Sq \&Xr
and
.Sq \&Sx
macros. Make sure that these exist. If you intend to distribute your
@@ -266,3 +240,9 @@ lists), assume that your output device is a fixed-width terminal window:
You may assume that the width calculated by the string literal
.Qq Fl o Ar outfile
will be covered by the \-width argument.
+.\" SECTION
+.Sh MAINTENANCE
+As your component changes and bugs are fixed, your manual may become out
+of date. You may be tempted to use automation tools like Doxygen to
+smooth the development of your manuals. Don't. Source documentation is
+different from a component manual.