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

Diff for /mandoc/Attic/xml.c between version 1.3 and 1.8

version 1.3, 2008/12/01 09:25:18 version 1.8, 2008/12/02 13:20:24
Line 28 
Line 28 
 #include "libmdocml.h"  #include "libmdocml.h"
 #include "private.h"  #include "private.h"
   
 #define INDENT           4  #define MAXINDENT        8
 #define COLUMNS          60  #define COLUMNS          72
   
 #ifdef  __linux__ /* FIXME */  enum    md_ns {
 #define strlcat          strncat          MD_NS_BLOCK,
 #endif          MD_NS_INLINE,
           MD_NS_DEFAULT
   };
   
 enum    md_tok {  enum    md_tok {
         MD_BLKIN,          MD_BLKIN,               /* Controls spacing. */
         MD_BLKOUT,          MD_BLKOUT,
         MD_IN,          MD_IN,
         MD_OUT,          MD_OUT,
         MD_TEXT,          MD_TEXT
         MD_OVERRIDE  
 };  };
   
 struct  md_xml {  struct  md_xml {
Line 54  struct md_xml {
Line 55  struct md_xml {
         size_t           pos;          size_t           pos;
         enum md_tok      last;          enum md_tok      last;
         int              flags;          int              flags;
 #define MD_LITERAL      (1 << 0) /* FIXME */  #define MD_LITERAL      (1 << 0) /* TODO */
   #define MD_OVERRIDE_ONE (1 << 1)
   #define MD_OVERRIDE_ALL (1 << 2)
 };  };
   
 static  void             roffmsg(void *arg, enum roffmsg,  static  void             roffmsg(void *arg, enum roffmsg,
Line 66  static int   roffdata(void *, int, char *);
Line 69  static int   roffdata(void *, int, char *);
 static  int              roffout(void *, int);  static  int              roffout(void *, int);
 static  int              roffblkin(void *, int, int *, char **);  static  int              roffblkin(void *, int, int *, char **);
 static  int              roffblkout(void *, int);  static  int              roffblkout(void *, int);
 static  int              roffspecial(void *, int);  static  int              roffspecial(void *, int, int *, char **, char **);
   
   static  void             mbuf_mode(struct md_xml *, enum md_ns);
 static  int              mbuf_newline(struct md_xml *);  static  int              mbuf_newline(struct md_xml *);
 static  int              mbuf_indent(struct md_xml *);  static  int              mbuf_indent(struct md_xml *);
 static  int              mbuf_data(struct md_xml *, int, char *);  static  int              mbuf_data(struct md_xml *, int, char *);
Line 78  static int   mbuf_nputstring(struct md_xml *, 
Line 82  static int   mbuf_nputstring(struct md_xml *, 
 static  int              mbuf_puts(struct md_xml *, const char *);  static  int              mbuf_puts(struct md_xml *, const char *);
 static  int              mbuf_nputs(struct md_xml *,  static  int              mbuf_nputs(struct md_xml *,
                                 const char *, size_t);                                  const char *, size_t);
   static  int              mbuf_begintag(struct md_xml *, const char *,
                                   enum md_ns, int *, char **);
   static  int              mbuf_endtag(struct md_xml *,
                                   const char *, enum md_ns);
   
   
   static void
   mbuf_mode(struct md_xml *p, enum md_ns ns)
   {
           p->flags &= ~MD_OVERRIDE_ONE;
           p->last = ns;
   }
   
   
 static int  static int
   mbuf_begintag(struct md_xml *p, const char *name, enum md_ns ns,
                   int *argc, char **argv)
   {
           int              i;
   
           if ( ! mbuf_nputs(p, "<", 1))
                   return(0);
   
           switch (ns) {
                   case (MD_NS_BLOCK):
                           if ( ! mbuf_nputs(p, "block:", 6))
                                   return(0);
                           break;
                   case (MD_NS_INLINE):
                           if ( ! mbuf_nputs(p, "inline:", 7))
                                   return(0);
                           break;
                   default:
                           break;
           }
   
           if ( ! mbuf_puts(p, name))
                   return(0);
   
           for (i = 0; ROFF_ARGMAX != argc[i]; i++) {
                   if ( ! mbuf_nputs(p, " ", 1))
                           return(0);
                   if ( ! mbuf_puts(p, tokargnames[argc[i]]))
                           return(0);
                   if ( ! mbuf_nputs(p, "=\"", 2))
                           return(0);
                   if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true"))
                           return(0);
                   if ( ! mbuf_nputs(p, "\"", 1))
                           return(0);
           }
           return(mbuf_nputs(p, ">", 1));
   }
   
   
   static int
   mbuf_endtag(struct md_xml *p, const char *tag, enum md_ns ns)
   {
           if ( ! mbuf_nputs(p, "</", 2))
                   return(0);
   
           switch (ns) {
                   case (MD_NS_BLOCK):
                           if ( ! mbuf_nputs(p, "block:", 6))
                                   return(0);
                           break;
                   case (MD_NS_INLINE):
                           if ( ! mbuf_nputs(p, "inline:", 7))
                                   return(0);
                           break;
                   default:
                           break;
           }
   
           if ( ! mbuf_puts(p, tag))
                   return(0);
           return(mbuf_nputs(p, ">", 1));
   }
   
   
   static int
 mbuf_putstring(struct md_xml *p, const char *buf)  mbuf_putstring(struct md_xml *p, const char *buf)
 {  {
   
Line 91  mbuf_putstring(struct md_xml *p, const char *buf)
Line 173  mbuf_putstring(struct md_xml *p, const char *buf)
 static int  static int
 mbuf_nputstring(struct md_xml *p, const char *buf, size_t sz)  mbuf_nputstring(struct md_xml *p, const char *buf, size_t sz)
 {  {
         size_t           i;          int              i;
   
         for (i = 0; i < sz; i++) {          for (i = 0; i < (int)sz; i++) {
                 switch (buf[i]) {                  switch (buf[i]) {
                 case ('&'):                  case ('&'):
                         if ( ! md_buf_puts(p->mbuf, "&amp;", 5))                          if ( ! md_buf_puts(p->mbuf, "&amp;", 5))
Line 105  mbuf_nputstring(struct md_xml *p, const char *buf, siz
Line 187  mbuf_nputstring(struct md_xml *p, const char *buf, siz
                                 return(0);                                  return(0);
                         p->pos += 6;                          p->pos += 6;
                         break;                          break;
                   case ('<'):
                           if ( ! md_buf_puts(p->mbuf, "&lt;", 4))
                                   return(0);
                           p->pos += 4;
                           break;
                   case ('>'):
                           if ( ! md_buf_puts(p->mbuf, "&gt;", 4))
                                   return(0);
                           p->pos += 4;
                           break;
                 default:                  default:
                         if ( ! md_buf_putchar(p->mbuf, buf[i]))                          if ( ! md_buf_putchar(p->mbuf, buf[i]))
                                 return(0);                                  return(0);
Line 141  mbuf_indent(struct md_xml *p)
Line 233  mbuf_indent(struct md_xml *p)
         assert(p->pos == 0);          assert(p->pos == 0);
   
         /* LINTED */          /* LINTED */
         for (i = 0; i < MIN(p->indent, INDENT); i++)          for (i = 0; i < MIN(p->indent, MAXINDENT); i++)
                 if ( ! md_buf_putstring(p->mbuf, "    "))                  if ( ! md_buf_putstring(p->mbuf, "    "))
                         return(0);                          return(0);
   
         p->pos += i * INDENT;          p->pos += i * 4;
         return(1);          return(1);
 }  }
   
Line 171  mbuf_data(struct md_xml *p, int space, char *buf)
Line 263  mbuf_data(struct md_xml *p, int space, char *buf)
         assert(p->mbuf);          assert(p->mbuf);
         assert(0 != p->indent);          assert(0 != p->indent);
   
           if (MD_OVERRIDE_ONE & p->flags || MD_OVERRIDE_ALL & p->flags)
                   space = 0;
   
         if (MD_LITERAL & p->flags)          if (MD_LITERAL & p->flags)
                 return(mbuf_putstring(p, buf));                  return(mbuf_putstring(p, buf));
   
Line 195  mbuf_data(struct md_xml *p, int space, char *buf)
Line 290  mbuf_data(struct md_xml *p, int space, char *buf)
                                 return(0);                                  return(0);
                         if ( ! mbuf_nputstring(p, bufp, sz))                          if ( ! mbuf_nputstring(p, bufp, sz))
                                 return(0);                                  return(0);
                         if (p->indent * INDENT + sz >= COLUMNS) {                          if (p->indent * MAXINDENT + sz >= COLUMNS)
                                 if ( ! mbuf_newline(p))                                  if ( ! mbuf_newline(p))
                                         return(0);                                          return(0);
                                 continue;                          if ( ! (MD_OVERRIDE_ALL & p->flags))
                         }                                  space = 1;
                         continue;                          continue;
                 }                  }
   
Line 216  mbuf_data(struct md_xml *p, int space, char *buf)
Line 311  mbuf_data(struct md_xml *p, int space, char *buf)
                 if ( ! mbuf_nputstring(p, bufp, sz))                  if ( ! mbuf_nputstring(p, bufp, sz))
                         return(0);                          return(0);
   
                 if ( ! space && p->pos >= COLUMNS)                  if ( ! (MD_OVERRIDE_ALL & p->flags))
                         if ( ! mbuf_newline(p))                          space = 1;
                                 return(0);  
         }          }
   
         return(1);          return(1);
Line 302  roffhead(void *arg)
Line 396  roffhead(void *arg)
                 return(0);                  return(0);
   
         p->indent++;          p->indent++;
         p->last = MD_BLKIN;          mbuf_mode(p, MD_BLKIN);
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
   
Line 318  rofftail(void *arg)
Line 412  rofftail(void *arg)
         if (0 != p->pos && ! mbuf_newline(p))          if (0 != p->pos && ! mbuf_newline(p))
                 return(0);                  return(0);
   
         if ( ! mbuf_puts(p, "</mdoc>"))          mbuf_mode(p, MD_BLKOUT);
           if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT))
                 return(0);                  return(0);
   
         p->last = MD_BLKOUT;  
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
   
   
 /* ARGSUSED */  /* ARGSUSED */
 static int  static int
 roffspecial(void *arg, int tok)  roffspecial(void *arg, int tok, int *argc, char **argv, char **more)
 {  {
         struct md_xml   *p;          struct md_xml   *p;
   
         assert(arg);          assert(arg);
         p = (struct md_xml *)arg;          p = (struct md_xml *)arg;
   
           /* FIXME: this is completely ad hoc. */
   
         switch (tok) {          switch (tok) {
         case (ROFF_Ns):          case (ROFF_Ns):
                 p->last = MD_OVERRIDE;                  p->flags |= MD_OVERRIDE_ONE;
                 break;                  break;
           case (ROFF_Sm):
                   assert(*more);
                   if (0 == strcmp(*more, "on"))
                           p->flags |= MD_OVERRIDE_ALL;
                   else
                           p->flags &= ~MD_OVERRIDE_ALL;
                   break;
         default:          default:
                 break;                  break;
         }          }
Line 351  static int
Line 453  static int
 roffblkin(void *arg, int tok, int *argc, char **argv)  roffblkin(void *arg, int tok, int *argc, char **argv)
 {  {
         struct md_xml   *p;          struct md_xml   *p;
         int              i;  
   
         assert(arg);          assert(arg);
         p = (struct md_xml *)arg;          p = (struct md_xml *)arg;
Line 364  roffblkin(void *arg, int tok, int *argc, char **argv)
Line 465  roffblkin(void *arg, int tok, int *argc, char **argv)
         } else if ( ! mbuf_indent(p))          } else if ( ! mbuf_indent(p))
                 return(0);                  return(0);
   
         if ( ! mbuf_nputs(p, "<", 1))  
                 return(0);  
         if ( ! mbuf_nputs(p, "block:", 6))  
                 return(0);  
         if ( ! mbuf_puts(p, toknames[tok]))  
                 return(0);  
   
         /* FIXME: xml won't like standards args (e.g., p1003.1-90). */          /* FIXME: xml won't like standards args (e.g., p1003.1-90). */
   
         for (i = 0; ROFF_ARGMAX != argc[i]; i++) {          p->indent++;
                 if ( ! mbuf_nputs(p, " ", 1))          mbuf_mode(p, MD_BLKIN);
                         return(0);  
                 if ( ! mbuf_puts(p, tokargnames[argc[i]]))  
                         return(0);  
                 if ( ! mbuf_nputs(p, "=\"", 2))  
                         return(0);  
                 if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true"))  
                         return(0);  
                 if ( ! mbuf_nputs(p, "\"", 1))  
                         return(0);  
         }  
   
         if ( ! mbuf_nputs(p, ">", 1))          if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK,
                                   argc, argv))
                 return(0);                  return(0);
   
         p->last = MD_BLKIN;  
         p->indent++;  
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
   
Line 413  roffblkout(void *arg, int tok)
Line 495  roffblkout(void *arg, int tok)
         } else if ( ! mbuf_indent(p))          } else if ( ! mbuf_indent(p))
                 return(0);                  return(0);
   
         if ( ! mbuf_nputs(p, "</", 2))          mbuf_mode(p, MD_BLKOUT);
           if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK))
                 return(0);                  return(0);
         if ( ! mbuf_nputs(p, "block:", 6))  
                 return(0);  
         if ( ! mbuf_puts(p, toknames[tok]))  
                 return(0);  
         if ( ! mbuf_nputs(p, ">", 1))  
                 return(0);  
   
         p->last = MD_BLKOUT;  
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
   
Line 431  static int
Line 506  static int
 roffin(void *arg, int tok, int *argc, char **argv)  roffin(void *arg, int tok, int *argc, char **argv)
 {  {
         struct md_xml   *p;          struct md_xml   *p;
         int              i;  
   
         assert(arg);          assert(arg);
         p = (struct md_xml *)arg;          p = (struct md_xml *)arg;
   
         /*          if ( ! (MD_OVERRIDE_ONE & p->flags) &&
          * FIXME: put all of this in a buffer, then check the buffer                          ! (MD_OVERRIDE_ALL & p->flags) &&
          * length versus the column width for nicer output.  This is a                          p->pos + 11 > COLUMNS)
          * bit hacky.  
          */  
   
         if (p->pos + 11 > COLUMNS)  
                 if ( ! mbuf_newline(p))                  if ( ! mbuf_newline(p))
                         return(0);                          return(0);
   
         if (0 != p->pos) {          if (0 != p->pos && (MD_TEXT == p->last || MD_OUT == p->last)
                 switch (p->last) {                          && ! (MD_OVERRIDE_ONE & p->flags)
                 case (MD_TEXT):                          && ! (MD_OVERRIDE_ALL & p->flags))
                         /* FALLTHROUGH */                  if ( ! mbuf_nputs(p, " ", 1))
                 case (MD_OUT):                          return(0);
                         if ( ! mbuf_nputs(p, " ", 1))  
                                 return(0);  
                         break;  
                 default:  
                         break;  
                 }  
         } else if ( ! mbuf_indent(p))  
                 return(0);  
   
         p->last = MD_IN;          if (0 == p->pos && ! mbuf_indent(p))
   
         if ( ! mbuf_nputs(p, "<", 1))  
                 return(0);                  return(0);
         if ( ! mbuf_nputs(p, "inline:", 7))  
                 return(0);  
         if ( ! mbuf_puts(p, toknames[tok]))  
                 return(0);  
   
         for (i = 0; ROFF_ARGMAX != argc[i]; i++) {          mbuf_mode(p, MD_IN);
                 if ( ! mbuf_nputs(p, " ", 1))          return(mbuf_begintag(p, toknames[tok],
                         return(0);                                  MD_NS_INLINE, argc, argv));
                 if ( ! mbuf_puts(p, tokargnames[argc[i]]))  
                         return(0);  
                 if ( ! mbuf_nputs(p, "=\"", 2))  
                         return(0);  
                 if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true"))  
                         return(0);  
                 if ( ! mbuf_nputs(p, "\"", 1))  
                         return(0);  
         }  
         return(mbuf_nputs(p, ">", 1));  
 }  }
   
   
Line 493  roffout(void *arg, int tok)
Line 539  roffout(void *arg, int tok)
         assert(arg);          assert(arg);
         p = (struct md_xml *)arg;          p = (struct md_xml *)arg;
   
         /* Continue with a regular out token. */  
   
         if (0 == p->pos && ! mbuf_indent(p))          if (0 == p->pos && ! mbuf_indent(p))
                 return(0);                  return(0);
   
         p->last = MD_OUT;          mbuf_mode(p, MD_OUT);
           return(mbuf_endtag(p, toknames[tok], MD_NS_INLINE));
         if ( ! mbuf_nputs(p, "</", 2))  
                 return(0);  
         if ( ! mbuf_nputs(p, "inline:", 7))  
                 return(0);  
         if ( ! mbuf_puts(p, toknames[tok]))  
                 return(0);  
         return(mbuf_nputs(p, ">", 1));  
 }  }
   
   
Line 554  roffdata(void *arg, int space, char *buf)
Line 591  roffdata(void *arg, int space, char *buf)
         if ( ! mbuf_data(p, space, buf))          if ( ! mbuf_data(p, space, buf))
                 return(0);                  return(0);
   
         p->last = MD_TEXT;          mbuf_mode(p, MD_TEXT);
         return(1);          return(1);
 }  }
   

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.8

CVSweb