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

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

version 1.8, 2008/12/02 13:20:24 version 1.9, 2008/12/02 18:26:57
Line 28 
Line 28 
 #include "libmdocml.h"  #include "libmdocml.h"
 #include "private.h"  #include "private.h"
   
 #define MAXINDENT        8  
 #define COLUMNS          72  #define COLUMNS          72
   
 enum    md_ns {  enum    md_ns {
Line 73  static int   roffspecial(void *, int, int *, char **, 
Line 72  static int   roffspecial(void *, int, int *, char **, 
   
 static  void             mbuf_mode(struct md_xml *, enum md_ns);  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              xml_indent(struct md_xml *);
 static  int              mbuf_data(struct md_xml *, int, char *);  static  int              mbuf_data(struct md_xml *, int, char *);
 static  int              mbuf_putstring(struct md_xml *,  static  int              xml_nputstring(struct md_xml *,
                                 const char *);  
 static  int              mbuf_nputstring(struct md_xml *,  
                                 const char *, size_t);                                  const char *, size_t);
 static  int              mbuf_puts(struct md_xml *, const char *);  static  int              xml_puts(struct md_xml *, const char *);
 static  int              mbuf_nputs(struct md_xml *,  static  int              xml_nputs(struct md_xml *,
                                 const char *, size_t);                                  const char *, size_t);
 static  int              mbuf_begintag(struct md_xml *, const char *,  static  int              xml_begintag(struct md_xml *, const char *,
                                 enum md_ns, int *, char **);                                  enum md_ns, int *, char **);
 static  int              mbuf_endtag(struct md_xml *,  static  int              xml_endtag(struct md_xml *,
                                 const char *, enum md_ns);                                  const char *, enum md_ns);
   
   #ifdef __linux__ /* FIXME: remove */
   static  size_t            strlcat(char *, const char *, size_t);
   static  size_t            strlcpy(char *, const char *, size_t);
   #endif
   
   
 static void  static void
 mbuf_mode(struct md_xml *p, enum md_ns ns)  mbuf_mode(struct md_xml *p, enum md_ns ns)
 {  {
Line 97  mbuf_mode(struct md_xml *p, enum md_ns ns)
Line 99  mbuf_mode(struct md_xml *p, enum md_ns ns)
   
   
 static int  static int
 mbuf_begintag(struct md_xml *p, const char *name, enum md_ns ns,  xml_begintag(struct md_xml *p, const char *name, enum md_ns ns,
                 int *argc, char **argv)                  int *argc, char **argv)
 {  {
         int              i;          char             buf[64];
           ssize_t          sz;
           size_t           res;
   
         if ( ! mbuf_nputs(p, "<", 1))  
                 return(0);  
   
         switch (ns) {          switch (ns) {
                 case (MD_NS_BLOCK):          case (MD_NS_BLOCK):
                         if ( ! mbuf_nputs(p, "block:", 6))                  res = strlcpy(buf, "block:", sizeof(buf));
                                 return(0);                  assert(res < sizeof(buf));
                         break;                  break;
                 case (MD_NS_INLINE):          case (MD_NS_INLINE):
                         if ( ! mbuf_nputs(p, "inline:", 7))                  res = strlcpy(buf, "inline:", sizeof(buf));
                                 return(0);                  assert(res < sizeof(buf));
                         break;                  break;
                 default:          default:
                         break;                  *buf = 0;
                   break;
         }          }
   
         if ( ! mbuf_puts(p, name))          res = strlcat(buf, name, sizeof(buf));
           assert(res < sizeof(buf));
   
           if (-1 == (sz = ml_begintag(p->mbuf, buf, argc, argv)))
                 return(0);                  return(0);
   
         for (i = 0; ROFF_ARGMAX != argc[i]; i++) {          p->pos += sz;
                 if ( ! mbuf_nputs(p, " ", 1))          return(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  static int
 mbuf_endtag(struct md_xml *p, const char *tag, enum md_ns ns)  xml_endtag(struct md_xml *p, const char *name, enum md_ns ns)
 {  {
         if ( ! mbuf_nputs(p, "</", 2))          char             buf[64];
                 return(0);          ssize_t          sz;
           size_t           res;
   
         switch (ns) {          switch (ns) {
                 case (MD_NS_BLOCK):          case (MD_NS_BLOCK):
                         if ( ! mbuf_nputs(p, "block:", 6))                  res = strlcpy(buf, "block:", sizeof(buf));
                                 return(0);                  assert(res < sizeof(buf));
                         break;                  break;
                 case (MD_NS_INLINE):          case (MD_NS_INLINE):
                         if ( ! mbuf_nputs(p, "inline:", 7))                  res = strlcpy(buf, "inline:", sizeof(buf));
                                 return(0);                  assert(res < sizeof(buf));
                         break;                  break;
                 default:          default:
                         break;                  *buf = 0;
                   break;
         }          }
   
         if ( ! mbuf_puts(p, tag))          res = strlcat(buf, name, sizeof(buf));
           assert(res < sizeof(buf));
   
           if (-1 == (sz = ml_endtag(p->mbuf, buf)))
                 return(0);                  return(0);
         return(mbuf_nputs(p, ">", 1));  
 }  
   
           p->pos += sz;
 static int          return(1);
 mbuf_putstring(struct md_xml *p, const char *buf)  
 {  
   
         return(mbuf_nputstring(p, buf, strlen(buf)));  
 }  }
   
   
 static int  static int
 mbuf_nputstring(struct md_xml *p, const char *buf, size_t sz)  xml_nputstring(struct md_xml *p, const char *buf, size_t sz)
 {  {
         int              i;          ssize_t          res;
   
         for (i = 0; i < (int)sz; i++) {          if (-1 == (res = ml_nputstring(p->mbuf, buf, sz)))
                 switch (buf[i]) {                  return(0);
                 case ('&'):          p->pos += res;
                         if ( ! md_buf_puts(p->mbuf, "&amp;", 5))  
                                 return(0);  
                         p->pos += 5;  
                         break;  
                 case ('"'):  
                         if ( ! md_buf_puts(p->mbuf, "&quot;", 6))  
                                 return(0);  
                         p->pos += 6;  
                         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:  
                         if ( ! md_buf_putchar(p->mbuf, buf[i]))  
                                 return(0);  
                         p->pos++;  
                         break;  
                 }  
         }  
         return(1);          return(1);
 }  }
   
   
 static int  static int
 mbuf_nputs(struct md_xml *p, const char *buf, size_t sz)  xml_nputs(struct md_xml *p, const char *buf, size_t sz)
 {  {
           ssize_t          res;
   
         p->pos += sz;          if (-1 == (res = ml_nputs(p->mbuf, buf, sz)))
         return(md_buf_puts(p->mbuf, buf, sz));                  return(0);
           p->pos += res;
           return(1);
 }  }
   
   
 static int  static int
 mbuf_puts(struct md_xml *p, const char *buf)  xml_puts(struct md_xml *p, const char *buf)
 {  {
   
         return(mbuf_nputs(p, buf, strlen(buf)));          return(xml_nputs(p, buf, strlen(buf)));
 }  }
   
   
 static int  static int
 mbuf_indent(struct md_xml *p)  xml_indent(struct md_xml *p)
 {  {
         size_t           i;          ssize_t          res;
   
         assert(p->pos == 0);          if (-1 == (res = ml_indent(p->mbuf, p->indent)))
                   return(0);
         /* LINTED */          p->pos += res;
         for (i = 0; i < MIN(p->indent, MAXINDENT); i++)  
                 if ( ! md_buf_putstring(p->mbuf, "    "))  
                         return(0);  
   
         p->pos += i * 4;  
         return(1);          return(1);
 }  }
   
Line 267  mbuf_data(struct md_xml *p, int space, char *buf)
Line 232  mbuf_data(struct md_xml *p, int space, char *buf)
                 space = 0;                  space = 0;
   
         if (MD_LITERAL & p->flags)          if (MD_LITERAL & p->flags)
                 return(mbuf_putstring(p, buf));                  return(xml_nputstring(p, buf, sizeof(buf)));
   
         while (*buf) {          while (*buf) {
                 while (*buf && isspace(*buf))                  while (*buf && isspace(*buf))
Line 286  mbuf_data(struct md_xml *p, int space, char *buf)
Line 251  mbuf_data(struct md_xml *p, int space, char *buf)
                 sz = strlen(bufp);                  sz = strlen(bufp);
   
                 if (0 == p->pos) {                  if (0 == p->pos) {
                         if ( ! mbuf_indent(p))                          if ( ! xml_indent(p))
                                 return(0);                                  return(0);
                         if ( ! mbuf_nputstring(p, bufp, sz))                          if ( ! xml_nputstring(p, bufp, sz))
                                 return(0);                                  return(0);
                         if (p->indent * MAXINDENT + sz >= COLUMNS)                          if (p->indent * MAXINDENT + sz >= COLUMNS)
                                 if ( ! mbuf_newline(p))                                  if ( ! mbuf_newline(p))
Line 301  mbuf_data(struct md_xml *p, int space, char *buf)
Line 266  mbuf_data(struct md_xml *p, int space, char *buf)
                 if (space && sz + p->pos >= COLUMNS) {                  if (space && sz + p->pos >= COLUMNS) {
                         if ( ! mbuf_newline(p))                          if ( ! mbuf_newline(p))
                                 return(0);                                  return(0);
                         if ( ! mbuf_indent(p))                          if ( ! xml_indent(p))
                                 return(0);                                  return(0);
                 } else if (space) {                  } else if (space) {
                         if ( ! mbuf_nputs(p, " ", 1))                          if ( ! xml_nputs(p, " ", 1))
                                 return(0);                                  return(0);
                 }                  }
   
                 if ( ! mbuf_nputstring(p, bufp, sz))                  if ( ! xml_nputstring(p, bufp, sz))
                         return(0);                          return(0);
   
                 if ( ! (MD_OVERRIDE_ALL & p->flags))                  if ( ! (MD_OVERRIDE_ALL & p->flags))
Line 387  roffhead(void *arg)
Line 352  roffhead(void *arg)
         assert(arg);          assert(arg);
         p = (struct md_xml *)arg;          p = (struct md_xml *)arg;
   
         if ( ! mbuf_puts(p, "<?xml version=\"1.0\" "          if (-1 == xml_puts(p, "<?xml version=\"1.0\" "
                                 "encoding=\"UTF-8\"?>\n"))                                  "encoding=\"UTF-8\"?>\n"))
                 return(0);                  return(0);
         if ( ! mbuf_puts(p, "<mdoc xmlns:block=\"block\" "          if (-1 == xml_puts(p, "<mdoc xmlns:block=\"block\" "
                                 "xmlns:special=\"special\" "                                  "xmlns:special=\"special\" "
                                 "xmlns:inline=\"inline\">"))                                  "xmlns:inline=\"inline\">"))
                 return(0);                  return(0);
Line 413  rofftail(void *arg)
Line 378  rofftail(void *arg)
                 return(0);                  return(0);
   
         mbuf_mode(p, MD_BLKOUT);          mbuf_mode(p, MD_BLKOUT);
         if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT))          if ( ! xml_endtag(p, "mdoc", MD_NS_DEFAULT))
                 return(0);                  return(0);
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
Line 460  roffblkin(void *arg, int tok, int *argc, char **argv)
Line 425  roffblkin(void *arg, int tok, int *argc, char **argv)
         if (0 != p->pos) {          if (0 != p->pos) {
                 if ( ! mbuf_newline(p))                  if ( ! mbuf_newline(p))
                         return(0);                          return(0);
                 if ( ! mbuf_indent(p))                  if ( ! xml_indent(p))
                         return(0);                          return(0);
         } else if ( ! mbuf_indent(p))          } else if ( ! xml_indent(p))
                 return(0);                  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). */
Line 470  roffblkin(void *arg, int tok, int *argc, char **argv)
Line 435  roffblkin(void *arg, int tok, int *argc, char **argv)
         p->indent++;          p->indent++;
         mbuf_mode(p, MD_BLKIN);          mbuf_mode(p, MD_BLKIN);
   
         if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK,          if ( ! xml_begintag(p, toknames[tok], MD_NS_BLOCK,
                                 argc, argv))                                  argc, argv))
                 return(0);                  return(0);
         return(mbuf_newline(p));          return(mbuf_newline(p));
Line 490  roffblkout(void *arg, int tok)
Line 455  roffblkout(void *arg, int tok)
         if (0 != p->pos) {          if (0 != p->pos) {
                 if ( ! mbuf_newline(p))                  if ( ! mbuf_newline(p))
                         return(0);                          return(0);
                 if ( ! mbuf_indent(p))                  if ( ! xml_indent(p))
                         return(0);                          return(0);
         } else if ( ! mbuf_indent(p))          } else if ( ! xml_indent(p))
                 return(0);                  return(0);
   
         mbuf_mode(p, MD_BLKOUT);          mbuf_mode(p, MD_BLKOUT);
         if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK))          if ( ! xml_endtag(p, toknames[tok], MD_NS_BLOCK))
                 return(0);                  return(0);
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
Line 519  roffin(void *arg, int tok, int *argc, char **argv)
Line 484  roffin(void *arg, int tok, int *argc, char **argv)
         if (0 != p->pos && (MD_TEXT == p->last || MD_OUT == p->last)          if (0 != p->pos && (MD_TEXT == p->last || MD_OUT == p->last)
                         && ! (MD_OVERRIDE_ONE & p->flags)                          && ! (MD_OVERRIDE_ONE & p->flags)
                         && ! (MD_OVERRIDE_ALL & p->flags))                          && ! (MD_OVERRIDE_ALL & p->flags))
                 if ( ! mbuf_nputs(p, " ", 1))                  if ( ! xml_nputs(p, " ", 1))
                         return(0);                          return(0);
   
         if (0 == p->pos && ! mbuf_indent(p))          if (0 == p->pos && ! xml_indent(p))
                 return(0);                  return(0);
   
         mbuf_mode(p, MD_IN);          mbuf_mode(p, MD_IN);
         return(mbuf_begintag(p, toknames[tok],          return(xml_begintag(p, toknames[tok],
                                 MD_NS_INLINE, argc, argv));                                  MD_NS_INLINE, argc, argv));
 }  }
   
Line 539  roffout(void *arg, int tok)
Line 504  roffout(void *arg, int tok)
         assert(arg);          assert(arg);
         p = (struct md_xml *)arg;          p = (struct md_xml *)arg;
   
         if (0 == p->pos && ! mbuf_indent(p))          if (0 == p->pos && ! xml_indent(p))
                 return(0);                  return(0);
   
         mbuf_mode(p, MD_OUT);          mbuf_mode(p, MD_OUT);
         return(mbuf_endtag(p, toknames[tok], MD_NS_INLINE));          return(xml_endtag(p, toknames[tok], MD_NS_INLINE));
 }  }
   
   
Line 595  roffdata(void *arg, int space, char *buf)
Line 560  roffdata(void *arg, int space, char *buf)
         return(1);          return(1);
 }  }
   
   
   #ifdef __linux /* FIXME: remove. */
   /*      $OpenBSD$       */
   
   /*
    * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
    *
    * Permission to use, copy, modify, and distribute this software for any
    * purpose with or without fee is hereby granted, provided that the
    * above copyright notice and this permission notice appear in all
    * copies.
    *
    * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
    * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
    * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
    * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
    * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
    * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
    * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    * PERFORMANCE OF THIS SOFTWARE.
    */
   static size_t
   strlcat(char *dst, const char *src, size_t siz)
   {
           char *d = dst;
           const char *s = src;
           size_t n = siz;
           size_t dlen;
   
           /* Find the end of dst and adjust bytes left but don't go past
            * end */
           while (n-- != 0 && *d != '\0')
                   d++;
           dlen = d - dst;
           n = siz - dlen;
   
           if (n == 0)
                   return(dlen + strlen(s));
           while (*s != '\0') {
                   if (n != 1) {
                           *d++ = *s;
                           n--;
                   }
                   s++;
           }
           *d = '\0';
   
           return(dlen + (s - src));       /* count does not include NUL */
   }
   
   
   static size_t
   strlcpy(char *dst, const char *src, size_t siz)
   {
           char *d = dst;
           const char *s = src;
           size_t n = siz;
   
           /* Copy as many bytes as will fit */
           if (n != 0) {
                   while (--n != 0) {
                           if ((*d++ = *s++) == '\0')
                                   break;
                   }
           }
   
           /* Not enough room in dst, add NUL and traverse rest of src */
           if (n == 0) {
                   if (siz != 0)
                           *d = '\0';              /* NUL-terminate dst */
                   while (*s++)
                           ;
           }
   
           return(s - src - 1);    /* count does not include NUL */
   }
   #endif /*__linux__*/

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

CVSweb