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

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

version 1.6, 2008/12/02 00:10:37 version 1.8, 2008/12/02 13:20:24
Line 31 
Line 31 
 #define MAXINDENT        8  #define MAXINDENT        8
 #define COLUMNS          72  #define COLUMNS          72
   
 #ifdef  __linux__ /* FIXME */  
 #define strlcat          strncat  
 #endif  
   
 enum    md_ns {  enum    md_ns {
         MD_NS_BLOCK,          MD_NS_BLOCK,
         MD_NS_INLINE,          MD_NS_INLINE,
Line 42  enum md_ns {
Line 38  enum md_ns {
 };  };
   
 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 60  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 72  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 90  static int   mbuf_endtag(struct md_xml *, 
Line 88  static int   mbuf_endtag(struct md_xml *, 
                                 const char *, enum md_ns);                                  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,  mbuf_begintag(struct md_xml *p, const char *name, enum md_ns ns,
                 int *argc, char **argv)                  int *argc, char **argv)
Line 167  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 257  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 281  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 * MAXINDENT + 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 302  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 388  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 404  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);
   
         p->last = MD_BLKOUT;          mbuf_mode(p, MD_BLKOUT);
         if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT))          if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT))
                 return(0);                  return(0);
   
         return(mbuf_newline(p));          return(mbuf_newline(p));
 }  }
   
   
   /* 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;
   
Line 424  roffspecial(void *arg, int tok)
Line 432  roffspecial(void *arg, int tok)
   
         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 452  roffblkin(void *arg, int tok, int *argc, char **argv)
Line 467  roffblkin(void *arg, int tok, int *argc, char **argv)
   
         /* FIXME: xml won't like standards args (e.g., p1003.1-90). */          /* FIXME: xml won't like standards args (e.g., p1003.1-90). */
   
         p->last = MD_BLKIN;  
         p->indent++;          p->indent++;
           mbuf_mode(p, MD_BLKIN);
   
         if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK,          if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK,
                                 argc, argv))                                  argc, argv))
Line 480  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);
   
         p->last = MD_BLKOUT;          mbuf_mode(p, MD_BLKOUT);
   
         if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK))          if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK))
                 return(0);                  return(0);
         return(mbuf_newline(p));          return(mbuf_newline(p));
Line 496  roffin(void *arg, int tok, int *argc, char **argv)
Line 510  roffin(void *arg, int tok, int *argc, char **argv)
         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);          if (0 == p->pos && ! mbuf_indent(p))
                         break;  
                 default:  
                         break;  
                 }  
         } else if ( ! mbuf_indent(p))  
                 return(0);                  return(0);
   
         p->last = MD_IN;          mbuf_mode(p, MD_IN);
         return(mbuf_begintag(p, toknames[tok],          return(mbuf_begintag(p, toknames[tok],
                                 MD_NS_INLINE, argc, argv));                                  MD_NS_INLINE, argc, argv));
 }  }
Line 537  roffout(void *arg, int tok)
Line 542  roffout(void *arg, int tok)
         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));          return(mbuf_endtag(p, toknames[tok], MD_NS_INLINE));
 }  }
   
Line 586  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.6  
changed lines
  Added in v.1.8

CVSweb