Rocco Rutte:
[apps/madmutt.git] / makedoc.c
index cbbc427..279168b 100644 (file)
--- a/makedoc.c
+++ b/makedoc.c
@@ -1,20 +1,14 @@
 /*
+ * Copyright notice from original mutt:
  * Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
- * 
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- * 
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- * 
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
- */ 
+ *
+ * Parts were written/modified by:
+ * Rocco Rutte <pdmef@cs.tu-berlin.de>
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
+ */
 
 /**
  ** This program parses mutt's init.h and generates documentation in
@@ -59,27 +53,40 @@ extern int optind;
 
 #define BUFFSIZE 2048
 
-static char lastvar[BUFFSIZE];
-static int sort_error = 0;
+#define STRLEN(s) (s ? strlen(s) : 0)
+
+typedef struct {
+  short seen;
+  char *name;
+  char *descr;
+} var_t;
+
+static int outcount = 0;
+static var_t *outbuf = NULL;
 
-enum output_formats_t
+static int var_cmp (const void *a, const void *b)
 {
+  return (strcmp (((var_t *) a)->name, ((var_t *) b)->name));
+}
+
+enum output_formats_t {
   F_CONF, F_MAN, F_SGML, F_NONE
 };
 
-#define D_NL           (1 << 0)
-#define D_EM           (1 << 1)
-#define D_BF           (1 << 2)
-#define D_TAB          (1 << 3)
-#define D_NP           (1 << 4)
-#define D_INIT         (1 << 5)
-#define D_DL           (1 << 6)
-#define D_DT           (1 << 7)
-
-enum
-{
+#define D_NL            (1 << 0)
+#define D_EM            (1 << 1)
+#define D_BF            (1 << 2)
+#define D_TT            (1 << 3)
+#define D_TAB           (1 << 4)
+#define D_NP            (1 << 5)
+#define D_INIT          (1 << 6)
+#define D_D           (1 << 7)
+#define D_DT            (1 << 8)
+
+enum {
   SP_START_EM,
   SP_START_BF,
+  SP_START_TT,
   SP_END_FT,
   SP_NEWLINE,
   SP_NEWPAR,
@@ -101,15 +108,18 @@ static char *get_token (char *, size_t, char *);
 static char *skip_ws (char *);
 static const char *type2human (int);
 static int buff2type (const char *);
-static int flush_doc (int, FILE *);
-static int handle_docline (char *, FILE *, int);
-static int print_it (int, char *, FILE *, int);
-static void print_confline (const char *, int, const char *, FILE *);
-static void handle_confline (char *, FILE *);
+static int flush_doc (int);
+static int handle_docline (char *, int);
+static int print_it (int, char *, int);
+static void print_confline (const char *, int, const char *);
+static void handle_confline (char *);
 static void makedoc (FILE *, FILE *);
 static void pretty_default (char *, size_t, const char *, int);
-static int sgml_fputc (int, FILE *);
-static int sgml_fputs (const char *, FILE *);
+static int sgml_fputc (int);
+static int sgml_fputs (const char *);
+static void add_var (const char *);
+static int add_s (const char *);
+static int add_c (int);
 
 int main (int argc, char *argv[])
 {
@@ -120,65 +130,97 @@ int main (int argc, char *argv[])
     Progname++;
   else
     Progname = argv[0];
-  
-  while ((c = getopt (argc, argv, "cmsd")) != EOF)
-  {
-    switch (c)
-    {
-      case 'c': OutputFormat = F_CONF; break;
-      case 'm': OutputFormat = F_MAN; break;
-      case 's': OutputFormat = F_SGML; break;
-      case 'd': Debug++; break;
-      default: 
+
+  while ((c = getopt (argc, argv, "cmsd")) != EOF) {
+    switch (c) {
+    case 'c':
+      OutputFormat = F_CONF;
+      break;
+    case 'm':
+      OutputFormat = F_MAN;
+      break;
+    case 's':
+      OutputFormat = F_SGML;
+      break;
+    case 'd':
+      Debug++;
+      break;
+    default:
       {
-       fprintf (stderr, "%s: bad command line parameter.\n", Progname);
-       exit (1);
+        fprintf (stderr, "%s: bad command line parameter.\n", Progname);
+        exit (1);
       }
     }
   }
 
-  if (optind != argc)
-  {
-    if ((f = fopen (argv[optind], "r")) == NULL)
-    {
+  if (optind != argc) {
+    if ((f = fopen (argv[optind], "r")) == NULL) {
       fprintf (stderr, "%s: Can't open %s (%s).\n",
-              Progname, argv[optind], strerror (errno));
+               Progname, argv[optind], strerror (errno));
       exit (1);
     }
   }
-  else 
+  else
     f = stdin;
 
-  switch (OutputFormat)
-  {
-    case F_CONF: 
-    case F_MAN:  
-    case F_SGML:
-      lastvar[0] = '\0';
-      makedoc (f, stdout); break;
-    default:
+  switch (OutputFormat) {
+  case F_CONF:
+  case F_MAN:
+  case F_SGML:
+    makedoc (f, stdout);
+    break;
+  default:
     {
-      fprintf (stderr, "%s: No output format specified.\n",
-              Progname);
+      fprintf (stderr, "%s: No output format specified.\n", Progname);
       exit (1);
     }
   }
-  
+
   if (f != stdin)
     fclose (f);
-  
+
   exit (1);
 }
 
-static void remember (const char* s)
+static void add_var (const char *name)
 {
-  int l = strlen (s);
-  lastvar[0] = '\0';
-  strncpy (lastvar, s, strlen (s));
-  lastvar[l] = '\0';
+  outbuf = realloc (outbuf, (++outcount) * sizeof (var_t));
+  outbuf[outcount - 1].seen = 0;
+  outbuf[outcount - 1].name = strdup (name);
+  outbuf[outcount - 1].descr = NULL;
 }
 
-static void makedoc (FILE *in, FILE *out)
+static int add_s (const char *s)
+{
+  size_t lnew = STRLEN (s), lold = STRLEN (outbuf[outcount - 1].descr);
+
+  if (lnew == 0)
+    return (0);
+  if (!outbuf[outcount - 1].seen) {
+    lold = 0;
+    outbuf[outcount - 1].seen = 1;
+  }
+
+  if (lold == 0)
+    outbuf[outcount - 1].descr = strdup (s);
+  else {
+    outbuf[outcount - 1].descr =
+      realloc (outbuf[outcount - 1].descr, lold + lnew + 1);
+    memcpy (&(outbuf[outcount - 1].descr[lold - 1]) + 1, s, lnew);
+  }
+  outbuf[outcount - 1].descr[lold + lnew] = '\0';
+  return (1);
+}
+
+static int add_c (int c)
+{
+  char buf[2] = "\0\0";
+
+  buf[0] = c;
+  return (add_s (buf));
+}
+
+static void makedoc (FILE * in, FILE * out)
 {
   char buffer[BUFFSIZE];
   char token[BUFFSIZE];
@@ -187,13 +229,11 @@ static void makedoc (FILE *in, FILE *out)
   int line = 0;
   int docstat = D_INIT;
 
-  while ((fgets (buffer, sizeof (buffer), in)))
-  {
+  while ((fgets (buffer, sizeof (buffer), in))) {
     line++;
-    if ((p = strchr (buffer, '\n')) == NULL)
-    {
+    if ((p = strchr (buffer, '\n')) == NULL) {
       fprintf (stderr, "%s: Line %d too long.  Ask a wizard to enlarge\n"
-                      "%s: my buffer size.\n", Progname, line, Progname);
+               "%s: my buffer size.\n", Progname, line, Progname);
       exit (1);
     }
     else
@@ -202,31 +242,35 @@ static void makedoc (FILE *in, FILE *out)
     if (!(p = get_token (token, sizeof (token), buffer)))
       continue;
 
-    if (Debug)
-    {
+    if (Debug) {
       fprintf (stderr, "%s: line %d.  first token: \"%s\".\n",
-              Progname, line, token);
+               Progname, line, token);
     }
-    
+
     if (!strcmp (token, "/*++*/"))
       active = 1;
-    else if (!strcmp (token, "/*--*/"))
-    {
-      docstat = flush_doc (docstat, out);
+    else if (!strcmp (token, "/*--*/")) {
+      docstat = flush_doc (docstat);
       active = 0;
     }
     else if (active && (!strcmp (token, "/**") || !strcmp (token, "**")))
-      docstat = handle_docline (p, out, docstat);
-    else if (active && !strcmp (token, "{"))
-    {
-      docstat = flush_doc (docstat, out);
-      handle_confline (p, out);
+      docstat = handle_docline (p, docstat);
+    else if (active && !strcmp (token, "{")) {
+      docstat = flush_doc (docstat);
+      handle_confline (p);
     }
   }
-  flush_doc (docstat, out);
+  flush_doc (docstat);
   fputs ("\n", out);
-  if (sort_error == 1)
-    fputs ("makedoc: warning: there're sorting errors in vars\n", stderr);
+  qsort (outbuf, outcount, sizeof (var_t), &var_cmp);
+  for (line = 0; line < outcount; line++) {
+    if (outbuf[line].descr) {
+      fprintf (out, "%s\n", outbuf[line].descr);
+      free (outbuf[line].descr);
+    }
+    free (outbuf[line].name);
+  }
+  free (outbuf);
 }
 
 /* skip whitespace */
@@ -250,66 +294,63 @@ static char *get_token (char *d, size_t l, char *s)
   char *dd = d;
 
   if (Debug)
-     fprintf (stderr, "%s: get_token called for `%s'.\n",
-             Progname, s);
-  
+    fprintf (stderr, "%s: get_token called for `%s'.\n", Progname, s);
+
   s = skip_ws (s);
 
   if (Debug > 1)
-    fprintf (stderr, "%s: argumet after skip_ws():  `%s'.\n",
-            Progname, s);
+    fprintf (stderr, "%s: argumet after skip_ws():  `%s'.\n", Progname, s);
 
-  if (!*s)
-  {
+  if (!*s) {
     if (Debug)
       fprintf (stderr, "%s: no more tokens on this line.\n", Progname);
     return NULL;
   }
 
-  if (strchr (single_char_tokens, *s))
-  {
-    if (Debug)
-    {
+  if (strchr (single_char_tokens, *s)) {
+    if (Debug) {
       fprintf (stderr, "%s: found single character token `%c'.\n",
-              Progname, *s);
+               Progname, *s);
     }
     d[0] = *s++;
     d[1] = 0;
     return s;
   }
 
-  if (*s == '"')
-  {
-    if (Debug)
-    {
+  if (*s == '"') {
+    if (Debug) {
       fprintf (stderr, "%s: found quote character.\n", Progname);
     }
-      
+
     s++;
     is_quoted = 1;
   }
 
-  for (t = s; *t && --l > 0; t++)
-  {
+  for (t = s; *t && --l > 0; t++) {
     if (*t == '\\' && !t[1])
       break;
 
-    if (is_quoted && *t == '\\')
-    {
-      switch ((*d = *++t))
-      {
-       case 'n': *d = '\n'; break;
-       case 't': *d = '\t'; break;
-       case 'r': *d = '\r'; break;
-       case 'a': *d = '\a'; break;
+    if (is_quoted && *t == '\\') {
+      switch ((*d = *++t)) {
+      case 'n':
+        *d = '\n';
+        break;
+      case 't':
+        *d = '\t';
+        break;
+      case 'r':
+        *d = '\r';
+        break;
+      case 'a':
+        *d = '\a';
+        break;
       }
 
       d++;
       continue;
     }
 
-    if (is_quoted && *t == '"')
-    {
+    if (is_quoted && *t == '"') {
       t++;
       break;
     }
@@ -323,14 +364,12 @@ static char *get_token (char *d, size_t l, char *s)
 
   *d = '\0';
 
-  if (Debug)
-  {
+  if (Debug) {
     fprintf (stderr, "%s: Got %stoken: `%s'.\n",
-            Progname, is_quoted ? "quoted " : "", dd);
-    fprintf (stderr, "%s: Remainder: `%s'.\n",
-            Progname, t);
+             Progname, is_quoted ? "quoted " : "", dd);
+    fprintf (stderr, "%s: Remainder: `%s'.\n", Progname, t);
   }
-  
+
   return t;
 }
 
@@ -347,8 +386,7 @@ static char *get_token (char *d, size_t l, char *s)
  * following string definitions!
  */
 
-enum 
-{
+enum {
   DT_NONE = 0,
   DT_BOOL,
   DT_NUM,
@@ -362,36 +400,34 @@ enum
   DT_ADDR
 };
 
-struct 
-{
+struct {
   char *machine;
   char *human;
-}
-types[] = 
-{
-  { "DT_NONE", "-none-"        },
-  { "DT_BOOL",  "boolean"      },
-  { "DT_NUM",   "number"       },
-  { "DT_STR",  "string"        },
-  { "DT_PATH", "path"          },
-  { "DT_QUAD", "quadoption"    },
-  { "DT_SORT", "sort order"    },
-  { "DT_RX",   "regular expression" },
-  { "DT_MAGIC",        "folder magic" },
-  { "DT_SYN",  NULL },
-  { "DT_ADDR", "e-mail address" },
-  { NULL, NULL }
+} types[] = {
+  {
+  "DT_NONE", "-none-"}, {
+  "DT_BOOL", "boolean"}, {
+  "DT_NUM", "number"}, {
+  "DT_STR", "string"}, {
+  "DT_PATH", "path"}, {
+  "DT_QUAD", "quadoption"}, {
+  "DT_SORT", "sort order"}, {
+  "DT_RX", "regular expression"}, {
+  "DT_MAGIC", "folder magic"}, {
+  "DT_SYN", NULL}, {
+  "DT_ADDR", "e-mail address"}, {
+  NULL, NULL}
 };
-    
+
 
 static int buff2type (const char *s)
 {
   int type;
-  
+
   for (type = DT_NONE; types[type].machine; type++)
     if (!strcmp (types[type].machine, s))
-       return type;
-  
+      return type;
+
   return DT_NONE;
 }
 
@@ -399,13 +435,13 @@ static const char *type2human (int type)
 {
   return types[type].human;
 }
-static void handle_confline (char *s, FILE *out)
+static void handle_confline (char *s)
 {
   char varname[BUFFSIZE];
   char buff[BUFFSIZE];
   char tmp[BUFFSIZE];
   int type;
-  
+
   char val[BUFFSIZE];
 
   /* xxx - put this into an actual state machine? */
@@ -413,72 +449,77 @@ static void handle_confline (char *s, FILE *out)
   /* variable name */
   if (!(s = get_token (varname, sizeof (varname), s)))
     return;
-  else
-  {
-    if (lastvar[0] && strncmp (lastvar, varname, strlen (lastvar)) > 0)
-      sort_error = 1;
-    remember (varname);
-  }
-  
+
   /* comma */
-  if (!(s = get_token (buff, sizeof (buff), s))) return;
-    
+  if (!(s = get_token (buff, sizeof (buff), s)))
+    return;
+
   /* type */
-  if (!(s = get_token (buff, sizeof (buff), s))) return;
+  if (!(s = get_token (buff, sizeof (buff), s)))
+    return;
 
   type = buff2type (buff);
 
   /* possibly a "|" or comma */
-  if (!(s = get_token (buff, sizeof (buff), s))) return;
+  if (!(s = get_token (buff, sizeof (buff), s)))
+    return;
 
-  if (!strcmp (buff, "|"))
-  {
-    if (Debug) fprintf (stderr, "%s: Expecting <subtype> <comma>.\n", Progname);
+  if (!strcmp (buff, "|")) {
+    if (Debug)
+      fprintf (stderr, "%s: Expecting <subtype> <comma>.\n", Progname);
     /* ignore subtype and comma */
-    if (!(s = get_token (buff, sizeof (buff), s))) return;
-    if (!(s = get_token (buff, sizeof (buff), s))) return;
+    if (!(s = get_token (buff, sizeof (buff), s)))
+      return;
+    if (!(s = get_token (buff, sizeof (buff), s)))
+      return;
   }
 
   /* redraw, comma */
-  
-  while (1)
-  {
-    if (!(s = get_token (buff, sizeof (buff), s))) return;
+
+  while (1) {
+    if (!(s = get_token (buff, sizeof (buff), s)))
+      return;
     if (!strcmp (buff, ","))
       break;
   }
 
   /* option name or UL &address */
-  if (!(s = get_token (buff, sizeof (buff), s))) return;
+  if (!(s = get_token (buff, sizeof (buff), s)))
+    return;
   if (!strcmp (buff, "UL"))
-    if (!(s = get_token (buff, sizeof (buff), s))) return;
+    if (!(s = get_token (buff, sizeof (buff), s)))
+      return;
 
   /* comma */
-  if (!(s = get_token (buff, sizeof (buff), s))) return;
+  if (!(s = get_token (buff, sizeof (buff), s)))
+    return;
+
+  if (Debug)
+    fprintf (stderr, "%s: Expecting default value.\n", Progname);
 
-  if (Debug) fprintf (stderr, "%s: Expecting default value.\n", Progname);
-  
   /* <default value> or UL <default value> */
-  if (!(s = get_token (buff, sizeof (buff), s))) return;
-  if (!strcmp (buff, "UL"))
-  {
-    if (Debug) fprintf (stderr, "%s: Skipping UL.\n", Progname);
-    if (!(s = get_token (buff, sizeof (buff), s))) return;
+  if (!(s = get_token (buff, sizeof (buff), s)))
+    return;
+  if (!strcmp (buff, "UL")) {
+    if (Debug)
+      fprintf (stderr, "%s: Skipping UL.\n", Progname);
+    if (!(s = get_token (buff, sizeof (buff), s)))
+      return;
   }
 
   memset (tmp, 0, sizeof (tmp));
 
-  do 
-  {
+  do {
     if (!strcmp (buff, "}"))
       break;
 
-    strncpy (tmp + strlen (tmp), buff, sizeof (tmp) - strlen (tmp));
+    strncpy (tmp + STRLEN (tmp), buff, sizeof (tmp) - STRLEN (tmp));
   }
   while ((s = get_token (buff, sizeof (buff), s)));
 
   pretty_default (val, sizeof (val), tmp, type);
-  print_confline (varname, type, val, out);
+  add_var (varname);
+  print_confline (varname, type, val);
 }
 
 static void pretty_default (char *t, size_t l, const char *s, int type)
@@ -486,48 +527,53 @@ static void pretty_default (char *t, size_t l, const char *s, int type)
   memset (t, 0, l);
   l--;
 
-  switch (type)
-  {
-    case DT_QUAD:
-    {    
-      if (!strcasecmp (s, "M_YES")) strncpy (t, "yes", l);
-      else if (!strcasecmp (s, "M_NO")) strncpy (t, "no", l);
-      else if (!strcasecmp (s, "M_ASKYES")) strncpy (t, "ask-yes", l);
-      else if (!strcasecmp (s, "M_ASKNO")) strncpy (t, "ask-no", l);
+  switch (type) {
+  case DT_QUAD:
+    {
+      if (!strcasecmp (s, "M_YES"))
+        strncpy (t, "yes", l);
+      else if (!strcasecmp (s, "M_NO"))
+        strncpy (t, "no", l);
+      else if (!strcasecmp (s, "M_ASKYES"))
+        strncpy (t, "ask-yes", l);
+      else if (!strcasecmp (s, "M_ASKNO"))
+        strncpy (t, "ask-no", l);
       break;
     }
-    case DT_BOOL:
+  case DT_BOOL:
     {
       if (atoi (s))
-       strncpy (t, "yes", l);
+        strncpy (t, "yes", l);
       else
-       strncpy (t, "no", l);
+        strncpy (t, "no", l);
       break;
     }
-    case DT_SORT:
+  case DT_SORT:
     {
       /* heuristic! */
       strncpy (t, s + 5, l);
-      for (; *t; t++) *t = tolower ((unsigned char) *t);
+      for (; *t; t++)
+        *t = tolower ((unsigned char) *t);
       break;
     }
-    case DT_MAGIC:
+  case DT_MAGIC:
     {
       /* heuristic! */
       strncpy (t, s + 2, l);
-      for (; *t; t++) *t = tolower ((unsigned char) *t);
+      for (; *t; t++)
+        *t = tolower ((unsigned char) *t);
       break;
     }
-    case DT_STR:
-    case DT_RX:
-    case DT_ADDR:
-    case DT_PATH:
+  case DT_STR:
+  case DT_RX:
+  case DT_ADDR:
+  case DT_PATH:
     {
       if (!strcmp (s, "0"))
-       break;
+        break;
       /* fallthrough */
     }
-    default:
+  default:
     {
       strncpy (t, s, l);
       break;
@@ -537,174 +583,213 @@ static void pretty_default (char *t, size_t l, const char *s, int type)
 
 static void char_to_escape (char *dest, unsigned int c)
 {
-  switch (c)
-  {
-    case '\r': strcpy (dest, "\\r"); break;    /* __STRCPY_CHECKED__ */
-    case '\n': strcpy (dest, "\\n"); break;    /* __STRCPY_CHECKED__ */
-    case '\t': strcpy (dest, "\\t"); break;    /* __STRCPY_CHECKED__ */
-    case '\f': strcpy (dest, "\\f"); break;    /* __STRCPY_CHECKED__ */
-    default: sprintf (dest, "\\%03o", c); break;
+  switch (c) {
+  case '\r':
+    strcpy (dest, "\\r");
+    break;                      /* __STRCPY_CHECKED__ */
+  case '\n':
+    strcpy (dest, "\\n");
+    break;                      /* __STRCPY_CHECKED__ */
+  case '\t':
+    strcpy (dest, "\\t");
+    break;                      /* __STRCPY_CHECKED__ */
+  case '\f':
+    strcpy (dest, "\\f");
+    break;                      /* __STRCPY_CHECKED__ */
+  default:
+    sprintf (dest, "\\%03o", c);
+    break;
   }
 }
-static void conf_char_to_escape (unsigned int c , FILE *out)
+static void conf_char_to_escape (unsigned int c)
 {
   char buff[16];
+
   char_to_escape (buff, c);
-  fputs (buff, out);
+  add_s (buff);
 }
 
-static void conf_print_strval (const char *v, FILE *out)
+static void conf_print_strval (const char *v)
 {
-  for (; *v; v++)
-  {
-    if (*v < ' ' || *v & 0x80)
-    {
-      conf_char_to_escape ((unsigned int) *v, out);
+  for (; *v; v++) {
+    if (*v < ' ' || *v & 0x80) {
+      conf_char_to_escape ((unsigned int) *v);
       continue;
     }
 
-    if (*v == '"'  || *v == '\\')
-      fputc ('\\', out);
-    fputc (*v, out);
+    if (*v == '"' || *v == '\\')
+      add_c ('\\');
+    add_c (*v);
   }
 }
 
-static void man_print_strval (const char *v, FILE *out)
+static void man_print_strval (const char *v)
 {
-  for (; *v; v++)
-  {
-    if (*v < ' ' || *v & 0x80)
-    {
-      fputc ('\\', out);
-      conf_char_to_escape ((unsigned int) *v, out);
+  for (; *v; v++) {
+    if (*v < ' ' || *v & 0x80) {
+      add_c ('\\');
+      conf_char_to_escape ((unsigned int) *v);
       continue;
     }
-    
+
     if (*v == '"')
-      fputs ("\\(rq", out);
+      add_s ("\\(rq");
     else if (*v == '\\')
-      fputs ("\\\\", out);
+      add_s ("\\\\");
     else
-      fputc (*v, out);
+      add_c (*v);
   }
 }
 
-static void sgml_print_strval (const char *v, FILE *out)
+static void sgml_print_strval (const char *v)
 {
   char buff[16];
-  for (; *v; v++)
-  {
-    if (*v <  ' ' || *v & 0x80)
-    {
+
+  for (; *v; v++) {
+    if (*v < ' ' || *v & 0x80) {
       char_to_escape (buff, (unsigned int) *v);
-      sgml_fputs (buff, out);
+      sgml_fputs (buff);
       continue;
     }
-    sgml_fputc ((unsigned int) *v, out);
+    sgml_fputc ((unsigned int) *v);
   }
 }
 
-static int sgml_fputc (int c, FILE *out)
+static int sgml_fputc (int c)
 {
-  switch (c)
-  {
-    case '<': return fputs ("&lt;", out);
-    case '>': return fputs ("&gt;", out);
-    case '$': return fputs ("&dollar;", out);
-    case '_': return fputs ("&lowbar;", out);
-    case '%': return fputs ("&percnt;", out);
-    case '&': return fputs ("&amp;", out);
-    case '\\': return fputs ("&bsol;", out);
-    case '"': return fputs ("&dquot;", out);
-    case '[': return fputs ("&lsqb;", out);
-    case ']': return fputs ("&rsqb;", out);
-    case '~': return fputs ("&tilde;", out);
-    default:  return fputc (c, out);
+  switch (c) {
+  case '<':
+    return add_s ("&lt;");
+  case '>':
+    return add_s ("&gt;");
+  case '$':
+    return add_s ("&dollar;");
+  case '_':
+    return add_s ("&lowbar;");
+  case '%':
+    return add_s ("&percnt;");
+  case '&':
+    return add_s ("&amp;");
+  case '\\':
+    return add_s ("&bsol;");
+  case '"':
+    return add_s ("&dquot;");
+  case '[':
+    return add_s ("&lsqb;");
+  case ']':
+    return add_s ("&rsqb;");
+  case '~':
+    return add_s ("&tilde;");
+  default:
+    return add_c (c);
   }
 }
 
-static int sgml_fputs (const char *s, FILE *out)
+static int sgml_fputs (const char *s)
 {
   for (; *s; s++)
-    if (sgml_fputc ((unsigned int) *s, out) == EOF)
+    if (sgml_fputc ((unsigned int) *s) == EOF)
       return EOF;
-  
+
   return 0;
 }
 
-static void print_confline (const char *varname, int type, const char *val, FILE *out)
+static void print_confline (const char *varname, int type, const char *val)
 {
-  if (type == DT_SYN) return;
-  
-  switch (OutputFormat)
-  {
+  if (type == DT_SYN)
+    return;
+
+  switch (OutputFormat) {
     /* configuration file */
-    case F_CONF:
+  case F_CONF:
     {
-      if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH)
-      {
-       fprintf (out, "\n# set %s=\"", varname);
-       conf_print_strval (val, out);
-       fputs ("\"", out);
+      if (type == DT_STR || type == DT_RX || type == DT_ADDR
+          || type == DT_PATH) {
+        add_s ("\n# set ");
+        add_s (varname);
+        add_s ("=\"");
+        conf_print_strval (val);
+        add_s ("\"");
       }
-      else if (type != DT_SYN)
-       fprintf (out, "\n# set %s=%s", varname, val);
-      
-      fprintf (out, "\n#\n# Name: %s", varname);
-      fprintf (out, "\n# Type: %s", type2human (type));
-      if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH)
-      {
-       fputs ("\n# Default: \"", out);
-       conf_print_strval (val, out);
-       fputs ("\"", out);
+      else if (type != DT_SYN) {
+        add_s ("\n# set ");
+        add_s (varname);
+        add_s ("=");
+        add_s (val);
+      }
+
+      add_s ("\n#\n# Name: ");
+      add_s (varname);
+      add_s ("\n# Type: ");
+      add_s (type2human (type));
+      if (type == DT_STR || type == DT_RX || type == DT_ADDR
+          || type == DT_PATH) {
+        add_s ("\n# Default: \"");
+        conf_print_strval (val);
+        add_s ("\"");
+      }
+      else {
+        add_s ("\n# Default: ");
+        add_s (val);
       }
-      else
-       fprintf (out, "\n# Default: %s", val);
 
-      fputs ("\n# ", out);
+      add_s ("\n# ");
       break;
     }
 
     /* manual page */
-    case F_MAN:
+  case F_MAN:
     {
-      fprintf (out, "\n.TP\n.B %s\n", varname);
-      fputs (".nf\n", out);
-      fprintf (out, "Type: %s\n", type2human (type));
-      if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH)
-      {
-       fputs ("Default: \\(lq", out);
-       man_print_strval (val, out);
-       fputs ("\\(rq\n", out);
+      add_s (".TP\n.B ");
+      add_s (varname);
+      add_s ("\n.nf\n");
+      add_s ("Type: ");
+      add_s (type2human (type));
+      add_c ('\n');
+      if (type == DT_STR || type == DT_RX || type == DT_ADDR
+          || type == DT_PATH) {
+        add_s ("Default: \\(lq");
+        man_print_strval (val);
+        add_s ("\\(rq\n");
       }
-      else
-       fprintf (out, "Default: %s\n", val);
-
-      fputs (".fi", out);
+      else {
+        add_s ("Default: ");
+        add_s (val);
+        add_c ('\n');
+      }
+      add_s (".fi");
 
       break;
     }
-    
+
     /* SGML based manual */
-    case F_SGML:
+  case F_SGML:
     {
-      fputs ("\n<sect2>", out);  sgml_fputs (varname, out);
-      fprintf (out, "<label id=\"%s\">", varname);
-      fprintf (out, "\n<p>\nType: %s<newline>", type2human (type));
-      
-      if (type == DT_STR || type == DT_RX || type == DT_ADDR || type == DT_PATH)
-      {
-       fputs ("\nDefault: &dquot;", out);
-       sgml_print_strval (val, out);
-       fputs ("&dquot;\n", out);
+      add_s ("\n<sect1>");
+      sgml_fputs (varname);
+      add_s ("<label id=\"");
+      add_s (varname);
+      add_s ("\">");
+      add_s ("\n<p>\nType: <tt>");
+      add_s (type2human (type));
+      add_s ("</tt>\n\n");
+
+      if (type == DT_STR || type == DT_RX || type == DT_ADDR
+          || type == DT_PATH) {
+        add_s ("<p>\nDefault: <tt>&dquot;");
+        sgml_print_strval (val);
+        add_s ("&dquot;</tt>");
+      }
+      else {
+        add_s ("<p>\nDefault: <tt>");
+        add_s (val);
+        add_s ("</tt>");
       }
-      else
-       fprintf (out, "\nDefault: %s\n", val);
       break;
     }
     /* make gcc happy */
-    default:
-      break;
+  default:
+    break;
   }
 }
 
@@ -720,6 +805,7 @@ static void print_confline (const char *varname, int type, const char *val, FILE
  **
  ** - \fI switches to italics
  ** - \fB switches to boldface
+ ** - \fT switches to typewriter for SGML
  ** - \fP switches to normal display
  ** - .dl on a line starts a definition list (name taken taken from HTML).
  ** - .dt starts a term in a definition list.
@@ -738,27 +824,27 @@ static void print_confline (const char *varname, int type, const char *val, FILE
 
 static int fd_recurse = 0;
 
-static int flush_doc (int docstat, FILE *out)
+static int flush_doc (int docstat)
 {
   if (docstat & D_INIT)
     return D_INIT;
 
-  if (fd_recurse++)
-  {
-    fprintf (stderr, "%s: Internal error, recursion in flush_doc()!\n", Progname);
+  if (fd_recurse++) {
+    fprintf (stderr, "%s: Internal error, recursion in flush_doc()!\n",
+             Progname);
     exit (1);
   }
 
   if (docstat & (D_TAB))
-    docstat = print_it (SP_END_TAB, NULL, out, docstat);
+    docstat = print_it (SP_END_TAB, NULL, docstat);
 
   if (docstat & (D_DL))
-    docstat = print_it (SP_END_DL, NULL, out, docstat);
+    docstat = print_it (SP_END_DL, NULL, docstat);
 
-  if (docstat & (D_EM | D_BF))
-    docstat = print_it (SP_END_FT, NULL, out, docstat);
+  if (docstat & (D_EM | D_BF | D_TT))
+    docstat = print_it (SP_END_FT, NULL, docstat);
 
-  docstat = print_it (SP_NEWLINE, NULL, out, 0);
+  docstat = print_it (SP_NEWLINE, NULL, 0);
 
   fd_recurse--;
   return D_INIT;
@@ -766,348 +852,359 @@ static int flush_doc (int docstat, FILE *out)
 
 /* print something. */
 
-static int print_it (int special, char *str, FILE *out, int docstat)
+static int print_it (int special, char *str, int docstat)
 {
-  int onl = docstat & (D_NL|D_NP);
-  
-  docstat &= ~(D_NL|D_NP|D_INIT);
+  int onl = docstat & (D_NL | D_NP);
 
-  switch (OutputFormat)
-  {
+  docstat &= ~(D_NL | D_NP | D_INIT);
+
+  switch (OutputFormat) {
     /* configuration file */
-    case F_CONF:
+  case F_CONF:
     {
-      switch (special)
-      {
-       static int Continuation = 0;
-
-       case SP_END_FT: docstat &= ~(D_EM|D_BF); break;
-       case SP_START_BF: docstat |= D_BF; break;
-       case SP_START_EM: docstat |= D_EM; break;
-       case SP_NEWLINE: 
-       {
-         if (onl)
-           docstat |= onl;
-         else
-         {
-           fputs ("\n# ", out);
-           docstat |= D_NL;
-         }
-         if (docstat & D_DL)
-           ++ Continuation;
-         break;
-       }
-       case SP_NEWPAR:
-       {
-         if (onl & D_NP)
-         {
-           docstat |= onl;
-           break;
-         }
-
-         if (!(onl & D_NL))
-           fputs ("\n# ", out);
-         fputs ("\n# ", out);
-         docstat |= D_NP;
-         break;
-       }
-       case SP_START_TAB: 
-       {
-         if (!onl) 
-           fputs ("\n# ", out);
-         docstat |= D_TAB;
-         break;
-       }
-       case SP_END_TAB:
-       {
-         docstat &= ~D_TAB;
-         docstat |= D_NL;
-         break;
-       }
-       case SP_START_DL:
-       {
-         docstat |= D_DL;
-         break;
-       }
-       case SP_DT:
-       {
-         Continuation = 0;
-         docstat |= D_DT;
-         break;
-       }
-       case SP_DD:
-       {
-         Continuation = 0;
-         break;
-       }
-       case SP_END_DL:
-       {
-         Continuation = 0;
-         docstat &= ~D_DL;
-         break;
-       }
-       case SP_STR:
-       {
-         if (Continuation)
-         {
-           Continuation = 0;
-           fputs ("        ", out);
-         }
-         fputs (str, out);
-         if (docstat & D_DT)
-         { 
-           int i;
-
-           for (i = strlen (str) ; i < 8 ; i++)
-             putc (' ', out);
-           docstat &= ~D_DT;
-           docstat |= D_NL;
-         }
-         break;
-       }
+      switch (special) {
+        static int Continuation = 0;
+
+      case SP_END_FT:
+        docstat &= ~(D_EM | D_BF | D_TT);
+        break;
+      case SP_START_BF:
+        docstat |= D_BF;
+        break;
+      case SP_START_EM:
+        docstat |= D_EM;
+        break;
+      case SP_START_TT:
+        docstat |= D_TT;
+        break;
+      case SP_NEWLINE:
+        {
+          if (onl)
+            docstat |= onl;
+          else {
+            add_s ("\n# ");
+            docstat |= D_NL;
+          }
+          if (docstat & D_DL)
+            ++Continuation;
+          break;
+        }
+      case SP_NEWPAR:
+        {
+          if (onl & D_NP) {
+            docstat |= onl;
+            break;
+          }
+
+          if (!(onl & D_NL))
+            add_s ("\n# ");
+          add_s ("\n# ");
+          docstat |= D_NP;
+          break;
+        }
+      case SP_START_TAB:
+        {
+          if (!onl)
+            add_s ("\n# ");
+          docstat |= D_TAB;
+          break;
+        }
+      case SP_END_TAB:
+        {
+          docstat &= ~D_TAB;
+          docstat |= D_NL;
+          break;
+        }
+      case SP_START_DL:
+        {
+          docstat |= D_DL;
+          break;
+        }
+      case SP_DT:
+        {
+          Continuation = 0;
+          docstat |= D_DT;
+          break;
+        }
+      case SP_DD:
+        {
+          Continuation = 0;
+          break;
+        }
+      case SP_END_DL:
+        {
+          Continuation = 0;
+          docstat &= ~D_DL;
+          break;
+        }
+      case SP_STR:
+        {
+          if (Continuation) {
+            Continuation = 0;
+            add_s ("        ");
+          }
+          add_s (str);
+          if (docstat & D_DT) {
+            int i;
+
+            for (i = STRLEN (str); i < 8; i++)
+              add_c (' ');
+            docstat &= ~D_DT;
+            docstat |= D_NL;
+          }
+          break;
+        }
       }
       break;
     }
 
     /* manual page */
-    case F_MAN:
+  case F_MAN:
     {
-      switch (special)
-      {
-       case SP_END_FT: 
-       {
-         fputs ("\\fP", out);
-         docstat &= ~(D_EM|D_BF);
-         break;
-       }
-       case SP_START_BF: 
-       {
-         fputs ("\\fB", out);
-         docstat |= D_BF;
-         docstat &= ~D_EM;
-         break;
-       }
-       case SP_START_EM:
-       {
-         fputs ("\\fI", out);
-         docstat |= D_EM;
-         docstat &= ~D_BF;
-         break;
-       }
-       case SP_NEWLINE:
-       {
-         if (onl)
-           docstat |= onl;
-         else
-         {
-           fputc ('\n', out);
-           docstat |= D_NL;
-         }
-         break;
-       }
-       case SP_NEWPAR:
-       {
-         if (onl & D_NP)
-         {
-           docstat |= onl;
-           break;
-         }
-
-         if (!(onl & D_NL))
-           fputc ('\n', out);
-         fputs (".IP\n", out);
-
-         docstat |= D_NP;
-         break;
-       }
-       case SP_START_TAB:
-       {
-         fputs ("\n.IP\n.DS\n.sp\n.ft CR\n.nf\n", out);
-         docstat |= D_TAB | D_NL;
-         break;
-       }
-       case SP_END_TAB:
-       {
-         fputs ("\n.fi\n.ec\n.ft P\n.sp\n", out);
-         docstat &= ~D_TAB;
-         docstat |= D_NL;
-         break;
-       }
-       case SP_START_DL:
-       {
-         fputs ("\n.RS", out);
-         docstat |= D_DL;
-         break;
-       }
-       case SP_DT:
-       {
-         fputs ("\n.IP ", out);
-         break;
-       }
-       case SP_DD:
-       {
-         fputs ("\n", out);
-         break;
-       }
-       case SP_END_DL:
-       {
-         fputs ("\n.RE", out);
-         docstat &= ~D_DL;
-         break;
-       }
-       case SP_STR:
-       {
-         while (*str)
-         {
-           for (; *str; str++)
-           {
-             if (*str == '"')
-               fputs ("\\(rq", out);
-             else if (*str == '\\')
-               fputs ("\\\\", out);
-             else if (!strncmp (str, "``", 2))
-             {
-               fputs ("\\(lq", out);
-               str++;
-             }
-             else if (!strncmp (str, "''", 2))
-             {
-               fputs ("\\(rq", out);
-               str++;
-             }
-             else
-               fputc (*str, out);
-           }
-         }
-         break;
-       }
+      switch (special) {
+      case SP_END_FT:
+        {
+          add_s ("\\fP");
+          docstat &= ~(D_EM | D_BF | D_TT);
+          break;
+        }
+      case SP_START_BF:
+        {
+          add_s ("\\fB");
+          docstat |= D_BF;
+          docstat &= ~(D_EM | D_TT);
+          break;
+        }
+      case SP_START_EM:
+        {
+          add_s ("\\fI");
+          docstat |= D_EM;
+          docstat &= ~(D_BF | D_TT);
+          break;
+        }
+      case SP_START_TT:
+        {
+          docstat |= D_TT;
+          docstat &= ~(D_BF | D_EM);
+          break;
+        }
+      case SP_NEWLINE:
+        {
+          if (onl)
+            docstat |= onl;
+          else {
+            add_c ('\n');
+            docstat |= D_NL;
+          }
+          break;
+        }
+      case SP_NEWPAR:
+        {
+          if (onl & D_NP) {
+            docstat |= onl;
+            break;
+          }
+
+          if (!(onl & D_NL))
+            add_c ('\n');
+          add_s (".IP\n");
+
+          docstat |= D_NP;
+          break;
+        }
+      case SP_START_TAB:
+        {
+          add_s ("\n.IP\n.DS\n.sp\n.ft CR\n.nf\n");
+          docstat |= D_TAB | D_NL;
+          break;
+        }
+      case SP_END_TAB:
+        {
+          add_s ("\n.fi\n.ec\n.ft P\n.sp\n");
+          docstat &= ~D_TAB;
+          docstat |= D_NL;
+          break;
+        }
+      case SP_START_DL:
+        {
+          add_s ("\n.RS");
+          docstat |= D_DL;
+          break;
+        }
+      case SP_DT:
+        {
+          add_s ("\n.IP ");
+          break;
+        }
+      case SP_DD:
+        {
+          add_s ("\n");
+          break;
+        }
+      case SP_END_DL:
+        {
+          add_s ("\n.RE");
+          docstat &= ~D_DL;
+          break;
+        }
+      case SP_STR:
+        {
+          while (*str) {
+            for (; *str; str++) {
+              if (*str == '"')
+                add_s ("\\(rq");
+              else if (*str == '\\')
+                add_s ("\\\\");
+              else if (!strncmp (str, "``", 2)) {
+                add_s ("\\(lq");
+                str++;
+              }
+              else if (!strncmp (str, "''", 2)) {
+                add_s ("\\(rq");
+                str++;
+              }
+              else
+                add_c (*str);
+            }
+          }
+          break;
+        }
       }
       break;
     }
 
     /* SGML based manual */
-    case F_SGML:
+  case F_SGML:
     {
-      switch (special)
-      {
-       case SP_END_FT: 
-       {
-         if (docstat & D_EM) fputs ("</em>", out);
-         if (docstat & D_BF) fputs ("</bf>", out);
-         docstat &= ~(D_EM|D_BF);
-         break;
-       }
-       case SP_START_BF: 
-       {
-         fputs ("<bf>", out);
-         docstat |= D_BF;
-         docstat &= ~D_EM;
-         break;
-       }
-       case SP_START_EM:
-       {
-         fputs ("<em>", out);
-         docstat |= D_EM;
-         docstat &= ~D_BF;
-         break;
-       }
-       case SP_NEWLINE:
-       {
-         if (onl)
-           docstat |= onl;
-         else
-         {
-           fputc ('\n', out);
-           docstat |= D_NL;
-         }
-         break;
-       }
-       case SP_NEWPAR:
-       {
-         if (onl & D_NP)
-         {
-           docstat |= onl;
-           break;
-         }
-
-         if (!(onl & D_NL))
-           fputc ('\n', out);
-         fputs ("<p>\n", out);
-
-         docstat |= D_NP;
-         break;
-       }
-       case SP_START_TAB:
-       {
-         fputs ("\n<tscreen><verb>\n", out);
-         docstat |= D_TAB | D_NL;
-         break;
-       }
-       case SP_END_TAB:
-       {
-         fputs ("\n</verb></tscreen>", out);
-         docstat &= ~D_TAB;
-         docstat |= D_NL;
-         break;
-       }
-       case SP_START_DL:
-       {
-         fputs ("\n<descrip>\n", out);
-         docstat |= D_DL;
-         break;
-       }
-       case SP_DT:
-       {
-         fputs ("<tag>", out);
-         break;
-       }
-       case SP_DD:
-       {
-         fputs ("</tag>", out);
-         break;
-       }
-       case SP_END_DL:
-       {
-         fputs ("</descrip>\n", out);
-         docstat &= ~D_DL;
-         break;
-       }
-       case SP_STR:
-       {
-         if (docstat & D_TAB)
-           fputs (str, out);
-         else
-           sgml_fputs (str, out);
-         break;
-       }
+      switch (special) {
+      case SP_END_FT:
+        {
+          if (docstat & D_EM)
+            add_s ("</em>");
+          if (docstat & D_BF)
+            add_s ("</bf>");
+          if (docstat & D_TT)
+            add_s ("</tt>");
+          docstat &= ~(D_EM | D_BF | D_TT);
+          break;
+        }
+      case SP_START_BF:
+        {
+          add_s ("<bf>");
+          docstat |= D_BF;
+          docstat &= ~(D_EM | D_TT);
+          break;
+        }
+      case SP_START_EM:
+        {
+          add_s ("<em>");
+          docstat |= D_EM;
+          docstat &= ~(D_BF | D_TT);
+          break;
+        }
+      case SP_START_TT:
+        {
+          add_s ("<tt>");
+          docstat |= D_TT;
+          docstat &= ~(D_EM | D_BF);
+          break;
+        }
+      case SP_NEWLINE:
+        {
+          if (onl)
+            docstat |= onl;
+          else {
+            add_s ("\n");
+            docstat |= D_NL;
+          }
+          break;
+        }
+      case SP_NEWPAR:
+        {
+          if (onl & D_NP) {
+            docstat |= onl;
+            break;
+          }
+
+          if (!(onl & D_NL))
+            add_s ("\n");
+          add_s ("\n<p>\n");
+
+          docstat |= D_NP;
+          break;
+        }
+      case SP_START_TAB:
+        {
+          add_s ("\n<tscreen><verb>\n");
+          docstat |= D_TAB | D_NL;
+          break;
+        }
+      case SP_END_TAB:
+        {
+          add_s ("\n</verb></tscreen>");
+          docstat &= ~D_TAB;
+          docstat |= D_NL;
+          break;
+        }
+      case SP_START_DL:
+        {
+          add_s ("\n<descrip>\n");
+          docstat |= D_DL;
+          break;
+        }
+      case SP_DT:
+        {
+          add_s ("<tag>");
+          break;
+        }
+      case SP_DD:
+        {
+          add_s ("</tag>");
+          break;
+        }
+      case SP_END_DL:
+        {
+          add_s ("</descrip>\n");
+          docstat &= ~D_DL;
+          break;
+        }
+      case SP_STR:
+        {
+          if (docstat & D_TAB)
+            add_s (str);
+          else
+            sgml_fputs (str);
+          break;
+        }
       }
       break;
     }
     /* make gcc happy (unreached) */
-    default:
-      break;
+  default:
+    break;
   }
 
   return docstat;
 }
 
-void print_ref (FILE *out, int output_dollar, const char *ref)
+void print_ref (int output_dollar, const char *ref)
 {
-  switch (OutputFormat)
-  {
+  switch (OutputFormat) {
   case F_CONF:
   case F_MAN:
     if (output_dollar)
-      putc ('$', out);
-    fputs (ref, out);
+      add_c ('$');
+    add_s (ref);
     break;
 
   case F_SGML:
-    fprintf (out, "<ref id=\"%s\" name=\"", ref);
+    add_s ("<ref id=\"");
+    add_s (ref);
+    add_s ("\" name=\"");
     if (output_dollar)
-      fputs ("&dollar;", out);
-    sgml_fputs (ref, out);
-    fputs ("\">", out);
+      add_s ("&dollar;");
+    sgml_fputs (ref);
+    add_s ("\">");
     break;
 
   default:
@@ -1115,116 +1212,109 @@ void print_ref (FILE *out, int output_dollar, const char *ref)
   }
 }
 
-static int commit_buff (char *buff, char **d, FILE *out, int docstat)
+static int commit_buff (char *buff, char **d, int docstat)
 {
-  if (*d > buff)
-  {
+  if (*d > buff) {
     **d = '\0';
-    docstat = print_it (SP_STR, buff, out, docstat);
+    docstat = print_it (SP_STR, buff, docstat);
     *d = buff;
   }
 
   return docstat;
 }
 
-static int handle_docline (char *l, FILE *out, int docstat)
+static int handle_docline (char *l, int docstat)
 {
   char buff[BUFFSIZE];
   char *s, *d;
+
   l = skip_ws (l);
 
   if (Debug)
     fprintf (stderr, "%s: handle_docline `%s'\n", Progname, l);
-  
+
   if (!strncmp (l, ".pp", 3))
-    return print_it (SP_NEWPAR, NULL, out, docstat);
+    return print_it (SP_NEWPAR, NULL, docstat);
   else if (!strncmp (l, ".ts", 3))
-    return print_it (SP_START_TAB, NULL, out, docstat);
+    return print_it (SP_START_TAB, NULL, docstat);
   else if (!strncmp (l, ".te", 3))
-    return print_it (SP_END_TAB, NULL, out, docstat);
+    return print_it (SP_END_TAB, NULL, docstat);
   else if (!strncmp (l, ".dl", 3))
-    return print_it (SP_START_DL, NULL, out, docstat);
+    return print_it (SP_START_DL, NULL, docstat);
   else if (!strncmp (l, ".de", 3))
-    return print_it (SP_END_DL, NULL, out, docstat);
+    return print_it (SP_END_DL, NULL, docstat);
   else if (!strncmp (l, ". ", 2))
     *l = ' ';
 
-  for (s = l, d = buff; *s; s++)
-  {
-    if (!strncmp (s, "\\(as", 4))
-    {
+  for (s = l, d = buff; *s; s++) {
+    if (!strncmp (s, "\\(as", 4)) {
       *d++ = '*';
       s += 3;
     }
-    else if (!strncmp (s, "\\(rs", 4))
-    {
+    else if (!strncmp (s, "\\(rs", 4)) {
       *d++ = '\\';
       s += 3;
     }
-    else if (!strncmp (s, "\\fI", 3))
-    {
-      docstat = commit_buff (buff, &d, out, docstat);
-      docstat = print_it (SP_START_EM, NULL, out, docstat);
+    else if (!strncmp (s, "\\fI", 3)) {
+      docstat = commit_buff (buff, &d, docstat);
+      docstat = print_it (SP_START_EM, NULL, docstat);
       s += 2;
     }
-    else if (!strncmp (s, "\\fB", 3))
-    {
-      docstat = commit_buff (buff, &d, out, docstat);
-      docstat = print_it (SP_START_BF, NULL, out, docstat);
+    else if (!strncmp (s, "\\fB", 3)) {
+      docstat = commit_buff (buff, &d, docstat);
+      docstat = print_it (SP_START_BF, NULL, docstat);
       s += 2;
     }
-    else if (!strncmp (s, "\\fP", 3))
-    {
-      docstat = commit_buff (buff, &d, out, docstat);
-      docstat = print_it (SP_END_FT, NULL, out, docstat);
+    else if (!strncmp (s, "\\fT", 3)) {
+      docstat = commit_buff (buff, &d, docstat);
+      docstat = print_it (SP_START_TT, NULL, docstat);
       s += 2;
     }
-    else if (!strncmp (s, ".dt", 3))
-    {
-      docstat = commit_buff (buff, &d, out, docstat);
-      docstat = print_it (SP_DT, NULL, out, docstat);
+    else if (!strncmp (s, "\\fP", 3)) {
+      docstat = commit_buff (buff, &d, docstat);
+      docstat = print_it (SP_END_FT, NULL, docstat);
+      s += 2;
+    }
+    else if (!strncmp (s, ".dt", 3)) {
+      docstat = commit_buff (buff, &d, docstat);
+      docstat = print_it (SP_DT, NULL, docstat);
       s += 3;
     }
-    else if (!strncmp (s, ".dd", 3))
-    {
-      docstat = commit_buff (buff, &d, out, docstat);
-      docstat = print_it (SP_DD, NULL, out, docstat);
+    else if (!strncmp (s, ".dd", 3)) {
+      docstat = commit_buff (buff, &d, docstat);
+      docstat = print_it (SP_DD, NULL, docstat);
       s += 3;
     }
-    else if (*s == '$')
-    {
+    else if (*s == '$') {
       int output_dollar = 0;
       char *ref;
       char save;
 
       ++s;
-      if (*s == '$')
-      {
-       output_dollar = 1;
-       ++s;
+      if (*s == '$') {
+        output_dollar = 1;
+        ++s;
       }
-      if (*s == '$')
-      {
-       *d++ = '$';
+      if (*s == '$') {
+        *d++ = '$';
       }
-      else
-      {
-       ref = s;
-       while (isalnum ((unsigned char) *s) || *s == '-' || *s == '_')
-         ++s;
-
-       docstat = commit_buff (buff, &d, out, docstat);
-       save = *s;
-       *s = 0;
-       print_ref (out, output_dollar, ref);
-       *s = save;
-       --s;
+      else {
+        ref = s;
+        while (isalnum ((unsigned char) *s) || *s == '-' || *s == '_')
+          ++s;
+
+        docstat = commit_buff (buff, &d, docstat);
+        save = *s;
+        *s = 0;
+        print_ref (output_dollar, ref);
+        *s = save;
+        --s;
       }
     }
     else
       *d++ = *s;
   }
 
-  docstat = commit_buff (buff, &d, out, docstat);
-  return print_it (SP_NEWLINE, NULL, out, docstat);
+  docstat = commit_buff (buff, &d, docstat);
+  return print_it (SP_NEWLINE, NULL, docstat);
 }