[BACK]Return to mlg.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/Attic/mlg.c between version 1.19 and 1.23

version 1.19, 2008/12/07 21:30:49 version 1.23, 2008/12/09 17:09:12
Line 24 
Line 24 
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
   
 #include "libmdocml.h"  
 #include "private.h"  #include "private.h"
 #include "ml.h"  #include "ml.h"
   
Line 59  struct md_mlg {
Line 58  struct md_mlg {
         void             *data;          void             *data;
 };  };
   
   static  int              mlg_roffmsg(void *arg,
 static  char            *mlg_literal(int);                                  enum roffmsg, const char *,
 static  char            *mlg_At_literal(const char *);                                  const char *, const char *);
 static  char            *mlg_fmt(int);  
 static  char            *mlg_St_literal(int);  
 static  void             mlg_roffmsg(void *arg, enum roffmsg,  
                                 const char *, const char *, char *);  
 static  int              mlg_roffhead(void *, const struct tm *,  static  int              mlg_roffhead(void *, const struct tm *,
                                 const char *, const char *,                                  const char *, const char *,
                                 const char *, const char *);                                  enum roffmsec, const char *);
 static  int              mlg_rofftail(void *);  static  int              mlg_rofftail(void *);
 static  int              mlg_roffin(void *, int, int *, char **);  static  int              mlg_roffin(void *, int,
                                   int *, const char **);
 static  int              mlg_roffdata(void *, int,  static  int              mlg_roffdata(void *, int,
                                 const char *, char *);                                  const char *, const char *);
 static  int              mlg_roffout(void *, int);  static  int              mlg_roffout(void *, int);
 static  int              mlg_roffblkin(void *, int, int *, char **);  static  int              mlg_roffblkin(void *, int, int *,
                                   const char **);
 static  int              mlg_roffblkout(void *, int);  static  int              mlg_roffblkout(void *, int);
 static  int              mlg_roffspecial(void *, int,  static  int              mlg_roffspecial(void *, int,
                                 const char *, const int *,                                  const char *, const int *,
                                 const char **, char **);                                  const char **, const char **);
 static  int              mlg_roffblkheadin(void *, int,  static  int              mlg_roffblkheadin(void *, int,
                                 int *, char **);                                  int *, const char **);
 static  int              mlg_roffblkheadout(void *, int);  static  int              mlg_roffblkheadout(void *, int);
 static  int              mlg_roffblkbodyin(void *, int,  static  int              mlg_roffblkbodyin(void *, int,
                                 int *, char **);                                  int *, const char **);
 static  int              mlg_roffblkbodyout(void *, int);  static  int              mlg_roffblkbodyout(void *, int);
   
   static  int              mlg_ref_special(struct md_mlg *, int,
                                   const char *, const char **);
   static  int              mlg_formatted_special(struct md_mlg *,
                                   int, const char *, const int *,
                                   const char **, const char **);
   static  int              mlg_literal_special(struct md_mlg *,
                                   int,  const char *, const int *,
                                   const char **, const char **);
   static  int              mlg_function_special(struct md_mlg *,
                                   const char *, const char **);
   static  int              mlg_atom_special(struct md_mlg *, int,
                                   const char *, const char **);
   
 static  int              mlg_begintag(struct md_mlg *, enum md_ns,  static  int              mlg_begintag(struct md_mlg *, enum md_ns,
                                 int, int *, char **);                                  int, int *, const char **);
 static  int              mlg_endtag(struct md_mlg *, enum md_ns, int);  static  int              mlg_endtag(struct md_mlg *, enum md_ns, int);
 static  int              mlg_indent(struct md_mlg *);  static  int              mlg_indent(struct md_mlg *);
 static  int              mlg_newline(struct md_mlg *);  static  int              mlg_newline(struct md_mlg *);
Line 97  static int   mlg_nstring(struct md_mlg *, 
Line 107  static int   mlg_nstring(struct md_mlg *, 
 static  int              mlg_string(struct md_mlg *,  static  int              mlg_string(struct md_mlg *,
                                 const char *, const char *);                                  const char *, const char *);
 static  int              mlg_data(struct md_mlg *, int,  static  int              mlg_data(struct md_mlg *, int,
                                 const char *, char *);                                  const char *, const char *);
 static  void             mlg_err(struct md_mlg *, const char *,  static  int              mlg_err(struct md_mlg *, const char *,
                                 const char *, const char *, ...);                                  const char *, const char *, ...);
 static  void             mlg_msg(struct md_mlg *, enum roffmsg,  static  int              mlg_msg(struct md_mlg *,
                                 const char *, const char *, char *);                                  enum roffmsg, const char *,
 static  void             mlg_vmsg(struct md_mlg *, enum roffmsg,                                  const char *, const char *);
   static  int              mlg_vmsg(struct md_mlg *, enum roffmsg,
                                 const char *, const char *,                                  const char *, const char *,
                                 const char *, va_list);                                  const char *, va_list);
   
Line 112  extern size_t   strlcpy(char *, const char *, size_t);
Line 123  extern size_t   strlcpy(char *, const char *, size_t);
 #endif  #endif
   
   
 static char *  
 mlg_St_literal(int argc)  
 {  
   
         switch (argc) {  
         case(ROFF_p1003_1_88):  
                 return("IEEE Std 1003.1-1988 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1_90):  
                 return("IEEE Std 1003.1-1990 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1_96):  
                 return("ISO/IEC 9945-1:1996 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1_2001):  
                 return("IEEE Std 1003.1-2001 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1_2004):  
                 return("IEEE Std 1003.1-2004 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1):  
                 return("IEEE Std 1003.1 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1b):  
                 return("IEEE Std 1003.1b (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1b_93):  
                 return("IEEE Std 1003.1b-1993 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1c_95):  
                 return("IEEE Std 1003.1c-1995 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_1g_2000):  
                 return("IEEE Std 1003.1g-2000 (&#8220;POSIX&#8221;)");  
         case(ROFF_p1003_2_92):  
                 return("IEEE Std 1003.2-1992 (&#8220;POSIX.2&#8221;)");  
         case(ROFF_p1387_2_95):  
                 return("IEEE Std 1387.2-1995 (&#8220;POSIX.7.2&#8221;)");  
         case(ROFF_p1003_2):  
                 return("IEEE Std 1003.2 (&#8220;POSIX.2&#8221;)");  
         case(ROFF_p1387_2):  
                 return("IEEE Std 1387.2 (&#8220;POSIX.7.2&#8221;)");  
         case(ROFF_isoC_90):  
                 return("ISO/IEC 9899:1990 (&#8220;ISO C90&#8221;)");  
         case(ROFF_isoC_amd1):  
                 return("ISO/IEC 9899/AMD1:1995 (&#8220;ISO C90&#8221;)");  
         case(ROFF_isoC_tcor1):  
                 return("ISO/IEC 9899/TCOR1:1994 (&#8220;ISO C90&#8221;)");  
         case(ROFF_isoC_tcor2):  
                 return("ISO/IEC 9899/TCOR2:1995 (&#8220;ISO C90&#8221;)");  
         case(ROFF_isoC_99):  
                 return("ISO/IEC 9899:1999 (&#8220;ISO C99&#8221;)");  
         case(ROFF_ansiC):  
                 return("ANSI X3.159-1989 (&#8220;ANSI C&#8221;)");  
         case(ROFF_ansiC_89):  
                 return("ANSI X3.159-1989 (&#8220;ANSI C&#8221;)");  
         case(ROFF_ansiC_99):  
                 return("ANSI/ISO/IEC 9899-1999 (&#8220;ANSI C99&#8221;)");  
         case(ROFF_ieee754):  
                 return("IEEE Std 754-1985");  
         case(ROFF_iso8802_3):  
                 return("ISO 8802-3: 1989");  
         case(ROFF_xpg3):  
                 return("X/Open Portability Guide Issue 3 (&#8220;XPG3&#8221;)");  
         case(ROFF_xpg4):  
                 return("X/Open Portability Guide Issue 4 (&#8220;XPG4&#8221;)");  
         case(ROFF_xpg4_2):  
                 return("X/Open Portability Guide Issue 4.2 (&#8220;XPG4.2&#8221;)");  
         case(ROFF_xpg4_3):  
                 return("X/Open Portability Guide Issue 4.3 (&#8220;XPG4.3&#8221;)");  
         case(ROFF_xbd5):  
                 return("X/Open System Interface Definitions Issue 5 (&#8220;XBD5&#8221;)");  
         case(ROFF_xcu5):  
                 return("X/Open Commands and Utilities Issue 5 (&#8220;XCU5&#8221;)");  
         case(ROFF_xsh5):  
                 return("X/Open System Interfaces and Headers Issue 5 (&#8220;XSH5&#8221;)");  
         case(ROFF_xns5):  
                 return("X/Open Networking Services Issue 5 (&#8220;XNS5&#8221;)");  
         case(ROFF_xns5_2d2_0):  
                 return("X/Open Networking Services Issue 5.2 Draft 2.0 (&#8220;XNS5.2D2.0&#8221;)");  
         case(ROFF_xcurses4_2):  
                 return("X/Open Curses Issue 4 Version 2 (&#8220;XCURSES4.2&#8221;)");  
         case(ROFF_susv2):  
                 return("Version 2 of the Single UNIX Specification");  
         case(ROFF_susv3):  
                 return("Version 3 of the Single UNIX Specification");  
         case(ROFF_svid4):  
                 return("System V Interface Definition, Fourth Edition (&#8220;SVID4&#8221;)");  
         default:  
                 break;  
         }  
   
         abort();  
         /* NOTREACHED */  
 }  
   
   
 static char *  
 mlg_At_literal(const char *p)  
 {  
   
         if (NULL == p)  
                 return("AT&amp;T UNIX");  
         if (0 == strcmp(p, "v6"))  
                 return("Version 6 AT&amp;T UNIX");  
         else if (0 == strcmp(p, "v7"))  
                 return("Version 7 AT&amp;T UNIX");  
         else if (0 == strcmp(p, "32v"))  
                 return("Version 32v AT&amp;T UNIX");  
         else if (0 == strcmp(p, "V.1"))  
                 return("AT&amp;T System V.1 UNIX");  
         else if (0 == strcmp(p, "V.4"))  
                 return("AT&amp;T System V.4 UNIX");  
   
         abort();  
         /* NOTREACHED */  
 }  
   
   
 static char *  
 mlg_fmt(int tok)  
 {  
   
         switch (tok) {  
         case (ROFF_Ex):  
                 return ("The %s utility exits 0 on success, and "  
                                 "&gt;0 if an error occurs.");  
         case (ROFF_Rv):  
                 return ("The %s() function returns the value 0 if "  
                                 "successful; otherwise the value -1 "  
                                 "is returned and the global variable "  
                                 "<span class=\"inline-Va\">errno</span> "  
                                 "is set to indicate the error.");  
         case (ROFF_In):  
                 return("#include &lt;%s&gt;");  
         default:  
                 break;  
         }  
   
         abort();  
         /* NOTREACHED */  
 }  
   
   
 static char *  
 mlg_literal(int tok)  
 {  
   
         switch (tok) {  
         case (ROFF_Bt):  
                 return("is currently in beta test.");  
         case (ROFF_Ud):  
                 return("currently under development.");  
         case (ROFF_Fx):  
                 return("FreeBSD");  
         case (ROFF_Nx):  
                 return("NetBSD");  
         case (ROFF_Ox):  
                 return("OpenBSD");  
         case (ROFF_Ux):  
                 return("UNIX");  
         case (ROFF_Bx):  
                 return("BSD");  
         case (ROFF_Bsx):  
                 return("BSDI BSD/OS");  
         default:  
                 break;  
         }  
         abort();  
         /* NOTREACHED */  
 }  
   
   
 static int  static int
 mlg_begintag(struct md_mlg *p, enum md_ns ns, int tok,  mlg_begintag(struct md_mlg *p, enum md_ns ns, int tok,
                 int *argc, char **argv)                  int *argc, const char **argv)
 {  {
         ssize_t          res;          ssize_t          res;
   
Line 317  mlg_begintag(struct md_mlg *p, enum md_ns ns, int tok,
Line 164  mlg_begintag(struct md_mlg *p, enum md_ns ns, int tok,
         if ( ! ml_nputs(p->mbuf, "<", 1, &p->pos))          if ( ! ml_nputs(p->mbuf, "<", 1, &p->pos))
                 return(0);                  return(0);
   
         res = (*p->cbs.ml_begintag)(p->mbuf, p->data, p->args, ns, tok,          res = (*p->cbs.ml_begintag)(p->mbuf, p->data,
                         argc, (const char **)argv);                          p->args, ns, tok, argc, argv);
         if (-1 == res)          if (-1 == res)
                 return(0);                  return(0);
   
Line 443  mlg_nstring(struct md_mlg *p, const char *start, 
Line 290  mlg_nstring(struct md_mlg *p, const char *start, 
         if (-1 == res)          if (-1 == res)
                 return(0);                  return(0);
   
         if (0 == (c = ml_nputstring(p->mbuf, buf, sz, &p->pos))) {          if (0 == (c = ml_nputstring(p->mbuf, buf, sz, &p->pos)))
                 mlg_err(p, start, buf, "bad string "                  return(mlg_err(p, start, buf, "bad string "
                                 "encoding: `%s'", buf);                                          "encoding: `%s'", buf));
           else if (-1 == c)
                 return(0);                  return(0);
         } else if (-1 == c)  
                 return(0);  
   
         res = (*p->cbs.ml_endstring)(p->mbuf, p->args, buf, sz);          res = (*p->cbs.ml_endstring)(p->mbuf, p->args, buf, sz);
         if (-1 == res)          if (-1 == res)
Line 459  mlg_nstring(struct md_mlg *p, const char *start, 
Line 305  mlg_nstring(struct md_mlg *p, const char *start, 
   
   
 static int  static int
 mlg_data(struct md_mlg *p, int space, const char *start, char *buf)  mlg_data(struct md_mlg *p, int space,
                   const char *start, const char *buf)
 {  {
         size_t           sz;          size_t           sz;
   
Line 513  mlg_exit(struct md_mlg *p, int flush)
Line 360  mlg_exit(struct md_mlg *p, int flush)
         int              c;          int              c;
   
         c = roff_free(p->tree, flush);          c = roff_free(p->tree, flush);
         free(p);  
   
         (*p->cbs.ml_free)(p->data);          (*p->cbs.ml_free)(p->data);
   
           free(p);
   
         return(c);          return(c);
 }  }
   
Line 566  mlg_alloc(const struct md_args *args, 
Line 413  mlg_alloc(const struct md_args *args, 
   
 static int  static int
 mlg_roffhead(void *arg, const struct tm *tm, const char *os,  mlg_roffhead(void *arg, const struct tm *tm, const char *os,
                 const char *title, const char *sec, const char *vol)                  const char *title, enum roffmsec sec, const char *vol)
 {  {
         struct md_mlg   *p;          struct md_mlg   *p;
   
Line 604  mlg_rofftail(void *arg)
Line 451  mlg_rofftail(void *arg)
 }  }
   
   
   static int
   mlg_literal_special(struct md_mlg *p, int tok, const char *start,
                   const int *argc, const char **argv, const char **more)
   {
           char             *lit;
   
           if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))
                   return(0);
   
           lit = roff_literal(tok, argc, argv, more);
           assert(lit);
   
           if ( ! mlg_string(p, start, lit))
                   return(0);
   
           while (*more) {
                   if ( ! ml_nputs(p->mbuf, " ", 1, &p->pos))
                           return(0);
                   if ( ! mlg_string(p, start, *more++))
                           return(0);
           }
   
           return(mlg_endtag(p, MD_NS_INLINE, tok));
   }
   
   
   static int
   mlg_ref_special(struct md_mlg *p, int tok,
                   const char *start, const char **more)
   {
   
           if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))
                   return(0);
   
           assert(*more);
           if ( ! ml_puts(p->mbuf, *more++, &p->pos))
                   return(0);
   
           if (*more) {
                   if ( ! ml_nputs(p->mbuf, "(", 1, &p->pos))
                           return(0);
                   if ( ! mlg_string(p, start, *more++))
                           return(0);
                   if ( ! ml_nputs(p->mbuf, ")", 1, &p->pos))
                           return(0);
           }
   
           assert(NULL == *more);
           return(mlg_endtag(p, MD_NS_INLINE, tok));
   }
   
   
   static int
   mlg_formatted_special(struct md_mlg *p, int tok, const char *start,
                   const int *argc, const char **argv, const char **more)
   {
           char             buf[256], *lit;
   
           if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))
                   return(0);
   
           lit = roff_fmtstring(tok);
   
           assert(lit);
           assert(*more);
           (void)snprintf(buf, sizeof(buf), lit, *more++);
           assert(NULL == *more);
   
           if ( ! mlg_string(p, start, buf))
                   return(0);
   
           return(mlg_endtag(p, MD_NS_INLINE, tok));
   }
   
   
   static int
   mlg_atom_special(struct md_mlg *p, int tok,
                   const char *start, const char **more)
   {
   
           if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))
                   return(0);
   
           assert(*more);
           if ( ! mlg_string(p, start, *more++))
                   return(0);
   
           /*assert(NULL == *more);*/ /* FIXME: ROFF_Sx */
           return(mlg_endtag(p, MD_NS_INLINE, tok));
   }
   
   
   static int
   mlg_function_special(struct md_mlg *p,
                   const char *start, const char **more)
   {
   
           assert(*more);
   
           if ( ! mlg_begintag(p, MD_NS_INLINE, ROFF_Fn, NULL, more))
                   return(0);
           if ( ! mlg_string(p, start, *more++))
                   return(0);
           if ( ! mlg_endtag(p, MD_NS_INLINE, ROFF_Fn))
                   return(0);
   
           if (NULL == *more)
                   return(1);
   
           if ( ! ml_nputs(p->mbuf, "(", 1, &p->pos))
                   return(0);
   
           p->flags |= ML_OVERRIDE_ONE;
   
           if ( ! mlg_begintag(p, MD_NS_INLINE, ROFF_Fa, NULL, more))
                   return(0);
           if ( ! mlg_string(p, start, *more++))
                   return(0);
           if ( ! mlg_endtag(p, MD_NS_INLINE, ROFF_Fa))
                   return(0);
   
           while (*more) {
                   if ( ! ml_nputs(p->mbuf, ", ", 2, &p->pos))
                           return(0);
                   if ( ! mlg_begintag(p, MD_NS_INLINE, ROFF_Fa, NULL, more))
                           return(0);
                   if ( ! mlg_string(p, start, *more++))
                           return(0);
                   if ( ! mlg_endtag(p, MD_NS_INLINE, ROFF_Fa))
                           return(0);
           }
   
           return(ml_nputs(p->mbuf, ")", 1, &p->pos));
   }
   
   
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 mlg_roffspecial(void *arg, int tok, const char *start,  mlg_roffspecial(void *arg, int tok, const char *start,
                 const int *argc, const char **argv, char **more)                  const int *argc, const char **argv, const char **more)
 {  {
         struct md_mlg   *p;          struct md_mlg   *p;
         char             buf[256];  
   
         assert(arg);          assert(arg);
         p = (struct md_mlg *)arg;          p = (struct md_mlg *)arg;
   
         /*  
          * First handle macros without content.  
          */  
   
         switch (tok) {          switch (tok) {
         case (ROFF_Ns):          case (ROFF_Ns):
                 p->flags |= ML_OVERRIDE_ONE;                  p->flags |= ML_OVERRIDE_ONE;
                 return(1);                  return(1);
   
         case (ROFF_Sm):          case (ROFF_Sm):
                 assert(*more);                  assert(*more);
                 if (0 == strcmp(*more, "on"))                  if (0 == strcmp(*more, "on"))
Line 630  mlg_roffspecial(void *arg, int tok, const char *start,
Line 609  mlg_roffspecial(void *arg, int tok, const char *start,
                 else                  else
                         p->flags &= ~ML_OVERRIDE_ALL;                          p->flags &= ~ML_OVERRIDE_ALL;
                 return(1);                  return(1);
         default:  
                 break;  
         }  
   
         /*  
          * Handle macros put into different-token tags.  
          */  
   
         switch (tok) {  
         case (ROFF_Fn):          case (ROFF_Fn):
                 assert(*more);                  return(mlg_function_special(p, start, more));
                 if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))  
                         return(0);  
                 if ( ! mlg_string(p, start, *more++))  
                         return(0);  
                 if ( ! mlg_endtag(p, MD_NS_INLINE, tok))  
                         return(0);  
                 if (*more) {  
                         if ( ! ml_nputs(p->mbuf, "(", 1, &p->pos))  
                                 return(0);  
                         p->flags |= ML_OVERRIDE_ONE;  
                         if ( ! mlg_begintag(p, MD_NS_INLINE,  
                                                 ROFF_Fa, NULL, more))  
                                 return(0);  
                         if ( ! mlg_string(p, start, *more++))  
                                 return(0);  
                         if ( ! mlg_endtag(p, MD_NS_INLINE, ROFF_Fa))  
                                 return(0);  
                         while (*more) {  
                                 if ( ! ml_nputs(p->mbuf, ", ", 2, &p->pos))  
                                         return(0);  
                                 if ( ! mlg_begintag(p, MD_NS_INLINE, ROFF_Fa, NULL, more))  
                                         return(0);  
                                 if ( ! mlg_string(p, start, *more++))  
                                         return(0);  
                                 if ( ! mlg_endtag(p, MD_NS_INLINE, ROFF_Fa))  
                                         return(0);  
                         }  
                         if ( ! ml_nputs(p->mbuf, ")", 1, &p->pos))  
                                 return(0);  
                 }  
                 return(1);  
         default:  
                 break;  
         }  
   
         /*  
          * Now handle macros in their environments.  
          */  
   
         if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))  
                 return(0);  
   
         switch (tok) {  
         case (ROFF_St):  
                 assert(NULL == *argv);  
                 assert(ROFF_ARGMAX != *argc);  
                 if ( ! ml_puts(p->mbuf, mlg_St_literal(*argc),  
                                         &p->pos))  
                         return(0);  
                 while (*more) {  
                         if ( ! ml_nputs(p->mbuf, " ", 1, &p->pos))  
                                 return(0);  
                         if ( ! mlg_string(p, start, *more++))  
                                 return(0);  
                 }  
                 break;  
   
         case (ROFF_Xr):          case (ROFF_Xr):
                 if ( ! *more) {                  return(mlg_ref_special(p, tok, start, more));
                         mlg_err(p, start, start, "missing argument");  
                         return(0);          case (ROFF_Sx): /* FIXME */
                 }  
                 if ( ! ml_puts(p->mbuf, *more++, &p->pos))  
                         return(0);  
                 if (*more) {  
                         if ( ! ml_nputs(p->mbuf, "(", 1, &p->pos))  
                                 return(0);  
                         if ( ! mlg_string(p, start, *more++))  
                                 return(0);  
                         if ( ! ml_nputs(p->mbuf, ")", 1, &p->pos))  
                                 return(0);  
                 }  
                 if (*more) {  
                         mlg_err(p, start, start, "too many arguments");  
                         return(0);  
                 }  
                 break;  
   
         case (ROFF_Sx):  
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_Nm):          case (ROFF_Nm):
                 assert(*more);                  return(mlg_atom_special(p, tok, start, more));
                 if ( ! mlg_string(p, start, *more++))  
                         return(0);  
                 assert(NULL == *more);  
                 break;  
   
         case (ROFF_In):          case (ROFF_In):
                 /* NOTREACHED */                  /* NOTREACHED */
         case (ROFF_Ex):          case (ROFF_Ex):
                 /* NOTREACHED */                  /* NOTREACHED */
         case (ROFF_Rv):          case (ROFF_Rv):
                 assert(*more);                  return(mlg_formatted_special(p, tok, start,
                 /* FIXME: *more must be ml-filtered. */                                          argc, argv, more));
                 (void)snprintf(buf, sizeof(buf),  
                                 mlg_fmt(tok), *more++);  
                 if ( ! ml_puts(p->mbuf, buf, &p->pos))  
                         return(0);  
                 assert(NULL == *more);  
                 break;  
   
         case (ROFF_At):          case (ROFF_At):
                 /* FIXME: *more must be ml-filtered. */                  /* FALLTHROUGH */
                 if ( ! ml_puts(p->mbuf, mlg_At_literal(*more), &p->pos))          case (ROFF_Bt):
                         return(0);                  /* FALLTHROUGH */
                 break;          case (ROFF_Ud):
                   /* FALLTHROUGH */
           case (ROFF_Ux):
                   /* FALLTHROUGH */
         case (ROFF_Bx):          case (ROFF_Bx):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_Bsx):          case (ROFF_Bsx):
Line 756  mlg_roffspecial(void *arg, int tok, const char *start,
Line 645  mlg_roffspecial(void *arg, int tok, const char *start,
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_Nx):          case (ROFF_Nx):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_Ox):          case (ROFF_St):
                 if ( ! ml_puts(p->mbuf, mlg_literal(tok), &p->pos))  
                         return(0);  
                 while (*more) {  
                         if ( ! ml_nputs(p->mbuf, " ", 1, &p->pos))  
                                 return(0);  
                         if ( ! mlg_string(p, start, *more++))  
                                 return(0);  
                 }  
                 break;  
   
         case (ROFF_Bt):  
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_Ud):          case (ROFF_Ox):
                 /* FALLTHROUGH */                  return(mlg_literal_special(p, tok, start,
         case (ROFF_Ux):                                          argc, argv, more));
                 assert(NULL == *more);  
                 if ( ! ml_puts(p->mbuf, mlg_literal(tok), &p->pos))  
                         return(0);  
                 break;  
   
         default:          default:
                 mlg_err(p, start, start, "`%s' not yet supported",                  break;
                                 toknames[tok]);  
                 return(0);  
         }          }
   
         return(mlg_endtag(p, MD_NS_INLINE, tok));          return(mlg_err(p, start, start, "`%s' not yet supported",
                                   toknames[tok]));
 }  }
   
   
 static int  static int
 mlg_roffblkin(void *arg, int tok, int *argc, char **argv)  mlg_roffblkin(void *arg, int tok,
                   int *argc, const char **argv)
 {  {
   
         return(mlg_begintag((struct md_mlg *)arg,          return(mlg_begintag((struct md_mlg *)arg,
Line 805  mlg_roffblkout(void *arg, int tok)
Line 678  mlg_roffblkout(void *arg, int tok)
   
   
 static int  static int
 mlg_roffblkbodyin(void *arg, int tok, int *argc, char **argv)  mlg_roffblkbodyin(void *arg, int tok,
                   int *argc, const char **argv)
 {  {
   
         return(mlg_begintag((struct md_mlg *)arg,          return(mlg_begintag((struct md_mlg *)arg,
Line 822  mlg_roffblkbodyout(void *arg, int tok)
Line 696  mlg_roffblkbodyout(void *arg, int tok)
   
   
 static int  static int
 mlg_roffblkheadin(void *arg, int tok, int *argc, char **argv)  mlg_roffblkheadin(void *arg, int tok,
                   int *argc, const char **argv)
 {  {
   
         return(mlg_begintag((struct md_mlg *)arg,          return(mlg_begintag((struct md_mlg *)arg,
Line 839  mlg_roffblkheadout(void *arg, int tok)
Line 714  mlg_roffblkheadout(void *arg, int tok)
   
   
 static int  static int
 mlg_roffin(void *arg, int tok, int *argc, char **argv)  mlg_roffin(void *arg, int tok, int *argc, const char **argv)
 {  {
   
         return(mlg_begintag((struct md_mlg *)arg,          return(mlg_begintag((struct md_mlg *)arg,
Line 855  mlg_roffout(void *arg, int tok)
Line 730  mlg_roffout(void *arg, int tok)
 }  }
   
   
 static void  static int
 mlg_roffmsg(void *arg, enum roffmsg lvl,  mlg_roffmsg(void *arg, enum roffmsg lvl, const char *buf,
                 const char *buf, const char *pos, char *msg)                  const char *pos, const char *msg)
 {  {
   
         mlg_msg((struct md_mlg *)arg, lvl, buf, pos, msg);          return(mlg_msg((struct md_mlg *)arg, lvl, buf, pos, msg));
 }  }
   
   
 static int  static int
 mlg_roffdata(void *arg, int space, const char *start, char *buf)  mlg_roffdata(void *arg, int space,
                   const char *start, const char *buf)
 {  {
         struct md_mlg   *p;          struct md_mlg   *p;
   
Line 876  mlg_roffdata(void *arg, int space, const char *start, 
Line 752  mlg_roffdata(void *arg, int space, const char *start, 
                 return(0);                  return(0);
   
         mlg_mode(p, MD_TEXT);          mlg_mode(p, MD_TEXT);
   
         return(1);          return(1);
 }  }
   
   
 static void  static int
 mlg_vmsg(struct md_mlg *p, enum roffmsg lvl, const char *start,  mlg_vmsg(struct md_mlg *p, enum roffmsg lvl, const char *start,
                 const char *pos, const char *fmt, va_list ap)                  const char *pos, const char *fmt, va_list ap)
 {  {
         char             buf[128];          char             buf[128];
   
         (void)vsnprintf(buf, sizeof(buf), fmt, ap);          (void)vsnprintf(buf, sizeof(buf), fmt, ap);
         mlg_msg(p, lvl, start, pos, buf);          return(mlg_msg(p, lvl, start, pos, buf));
 }  }
   
   
 static void  static int
 mlg_err(struct md_mlg *p, const char *start,  mlg_err(struct md_mlg *p, const char *start,
                 const char *pos, const char *fmt, ...)                  const char *pos, const char *fmt, ...)
 {  {
         va_list          ap;          va_list          ap;
           int              c;
   
         va_start(ap, fmt);          va_start(ap, fmt);
         mlg_vmsg(p, ROFF_ERROR, start, pos, fmt, ap);          c = mlg_vmsg(p, ROFF_ERROR, start, pos, fmt, ap);
         va_end(ap);          va_end(ap);
           return(c);
 }  }
   
   
 static void  static int
 mlg_msg(struct md_mlg *p, enum roffmsg lvl,  mlg_msg(struct md_mlg *p, enum roffmsg lvl,
                 const char *buf, const char *pos, char *msg)                  const char *buf, const char *pos, const char *msg)
 {  {
         char            *level;          char            *level;
           char             b[256];
           int              i;
   
         switch (lvl) {          switch (lvl) {
         case (ROFF_WARN):          case (ROFF_WARN):
                 if ( ! (MD_WARN_ALL & p->args->warnings))  
                         return;  
                 level = "warning";                  level = "warning";
                   if ( ! (MD_WARN_ALL & p->args->warnings))
                           return(1);
                 break;                  break;
         case (ROFF_ERROR):          case (ROFF_ERROR):
                 level = "error";                  level = "error";
                 break;                  break;
         default:          default:
                 abort();                  abort();
                   /* NOTREACHED */
         }          }
   
         if (pos)          if (pos) {
                 (void)fprintf(stderr, "%s:%zu: %s: %s (column %zu)\n",                  assert(pos >= buf);
                                 p->rbuf->name, p->rbuf->line, level,                  if (0 < p->args->verbosity) {
                                 msg, pos - buf);                          (void)snprintf(b, sizeof(b),
         else                                          "%s:%zu: %s: %s\n",
                 (void)fprintf(stderr, "%s: %s: %s\n",                                          p->rbuf->name, p->rbuf->line,
                                           level, msg);
                           (void)strlcat(b, "Error at: ", sizeof(b));
                           (void)strlcat(b, p->rbuf->linebuf, sizeof(b));
   
                           (void)strlcat(b, "\n          ", sizeof(b));
                           for (i = 0; i < pos - buf; i++)
                                   (void)strlcat(b, " ", sizeof(b));
                           (void)strlcat(b, "^", sizeof(b));
   
                   } else
                           (void)snprintf(b, sizeof(b),
                                           "%s:%zu: %s: %s (col %zu)",
                                           p->rbuf->name, p->rbuf->line,
                                           level, msg, pos - buf);
           } else
                   (void)snprintf(b, sizeof(b), "%s: %s: %s",
                                 p->rbuf->name, level, msg);                                  p->rbuf->name, level, msg);
   
           (void)fprintf(stderr, "%s\n", b);
           return(lvl == ROFF_WARN ? 1 : 0);
 }  }
   

Legend:
Removed from v.1.19  
changed lines
  Added in v.1.23

CVSweb