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

Diff for /mandoc/html.c between version 1.177 and 1.185

version 1.177, 2014/10/26 17:12:03 version 1.185, 2015/01/21 20:33:25
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 30 
Line 30 
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "libmandoc.h"  
 #include "out.h"  #include "out.h"
 #include "html.h"  #include "html.h"
 #include "main.h"  #include "main.h"
Line 122  static const char *const roffscales[SCALE_MAX] = {
Line 121  static const char *const roffscales[SCALE_MAX] = {
 };  };
   
 static  void     bufncat(struct html *, const char *, size_t);  static  void     bufncat(struct html *, const char *, size_t);
 static  void     print_ctag(struct html *, enum htmltag);  static  void     print_ctag(struct html *, struct tag *);
 static  int      print_escape(char);  static  int      print_escape(char);
 static  int      print_encode(struct html *, const char *, int);  static  int      print_encode(struct html *, const char *, int);
 static  void     print_metaf(struct html *, enum mandoc_esc);  static  void     print_metaf(struct html *, enum mandoc_esc);
 static  void     print_attr(struct html *, const char *, const char *);  static  void     print_attr(struct html *, const char *, const char *);
 static  void     *ml_alloc(char *);  
   
   
 static void *  void *
 ml_alloc(char *outopts)  html_alloc(const struct mchars *mchars, char *outopts)
 {  {
         struct html     *h;          struct html     *h;
         const char      *toks[5];          const char      *toks[5];
Line 146  ml_alloc(char *outopts)
Line 144  ml_alloc(char *outopts)
         h = mandoc_calloc(1, sizeof(struct html));          h = mandoc_calloc(1, sizeof(struct html));
   
         h->tags.head = NULL;          h->tags.head = NULL;
         h->symtab = mchars_alloc();          h->symtab = mchars;
   
         while (outopts && *outopts)          while (outopts && *outopts)
                 switch (getsubopt(&outopts, UNCONST(toks), &v)) {                  switch (getsubopt(&outopts, UNCONST(toks), &v)) {
Line 169  ml_alloc(char *outopts)
Line 167  ml_alloc(char *outopts)
         return(h);          return(h);
 }  }
   
 void *  
 html_alloc(char *outopts)  
 {  
   
         return(ml_alloc(outopts));  
 }  
   
 void *  
 xhtml_alloc(char *outopts)  
 {  
   
         return(ml_alloc(outopts));  
 }  
   
 void  void
 html_free(void *p)  html_free(void *p)
 {  {
Line 196  html_free(void *p)
Line 180  html_free(void *p)
                 free(tag);                  free(tag);
         }          }
   
         if (h->symtab)  
                 mchars_free(h->symtab);  
   
         free(h);          free(h);
 }  }
   
Line 326  html_strlen(const char *cp)
Line 307  html_strlen(const char *cp)
                 case ESCAPE_NUMBERED:                  case ESCAPE_NUMBERED:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case ESCAPE_SPECIAL:                  case ESCAPE_SPECIAL:
                           /* FALLTHROUGH */
                   case ESCAPE_OVERSTRIKE:
                         if (skip)                          if (skip)
                                 skip = 0;                                  skip = 0;
                         else                          else
Line 437  print_encode(struct html *h, const char *p, int norecu
Line 420  print_encode(struct html *h, const char *p, int norecu
                 case ESCAPE_UNICODE:                  case ESCAPE_UNICODE:
                         /* Skip past "u" header. */                          /* Skip past "u" header. */
                         c = mchars_num2uc(seq + 1, len - 1);                          c = mchars_num2uc(seq + 1, len - 1);
   
                         /*  
                          * XXX Security warning:  
                          * For now, forbid Unicode obfuscation of ASCII  
                          * characters.  An audit of the callers is  
                          * required before this can be removed.  
                          */  
   
                         if (c < 0x80)  
                                 c = 0xFFFD;  
   
                         printf("&#x%x;", c);  
                         break;                          break;
                 case ESCAPE_NUMBERED:                  case ESCAPE_NUMBERED:
                         c = mchars_num2char(seq, len);                          c = mchars_num2char(seq, len);
                         if ( ! ('\0' == c || print_escape(c)))                          if (c < 0)
                                 putchar(c);                                  continue;
                         break;                          break;
                 case ESCAPE_SPECIAL:                  case ESCAPE_SPECIAL:
                         c = mchars_spec2cp(h->symtab, seq, len);                          c = mchars_spec2cp(h->symtab, seq, len);
                         if (c > 0)                          if (c <= 0)
                                 printf("&#%d;", c);                                  continue;
                         else if (-1 == c && 1 == len &&  
                             !print_escape(*seq))  
                                 putchar((int)*seq);  
                         break;                          break;
                 case ESCAPE_NOSPACE:                  case ESCAPE_NOSPACE:
                         if ('\0' == *p)                          if ('\0' == *p)
                                 nospace = 1;                                  nospace = 1;
                           continue;
                   case ESCAPE_OVERSTRIKE:
                           if (len == 0)
                                   continue;
                           c = seq[len - 1];
                         break;                          break;
                 default:                  default:
                         break;                          continue;
                 }                  }
                   if ((c < 0x20 && c != 0x09) ||
                       (c > 0x7E && c < 0xA0))
                           c = 0xFFFD;
                   if (c > 0x7E)
                           printf("&#%d;", c);
                   else if ( ! print_escape(c))
                           putchar(c);
         }          }
   
         return(nospace);          return(nospace);
Line 538  print_otag(struct html *h, enum htmltag tag,
Line 518  print_otag(struct html *h, enum htmltag tag,
 }  }
   
 static void  static void
 print_ctag(struct html *h, enum htmltag tag)  print_ctag(struct html *h, struct tag *tag)
 {  {
   
         printf("</%s>", htmltags[tag].name);          /*
         if (HTML_CLRLINE & htmltags[tag].flags) {           * Remember to close out and nullify the current
            * meta-font and table, if applicable.
            */
           if (tag == h->metaf)
                   h->metaf = NULL;
           if (tag == h->tblt)
                   h->tblt = NULL;
   
           printf("</%s>", htmltags[tag->tag].name);
           if (HTML_CLRLINE & htmltags[tag->tag].flags) {
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE;
                 putchar('\n');                  putchar('\n');
         }          }
   
           h->tags.head = tag->next;
           free(tag);
 }  }
   
 void  void
Line 589  print_text(struct html *h, const char *word)
Line 581  print_text(struct html *h, const char *word)
         if ( ! print_encode(h, word, 0)) {          if ( ! print_encode(h, word, 0)) {
                 if ( ! (h->flags & HTML_NONOSPACE))                  if ( ! (h->flags & HTML_NONOSPACE))
                         h->flags &= ~HTML_NOSPACE;                          h->flags &= ~HTML_NOSPACE;
                   h->flags &= ~HTML_NONEWLINE;
         } else          } else
                 h->flags |= HTML_NOSPACE;                  h->flags |= HTML_NOSPACE | HTML_NONEWLINE;
   
         if (h->metaf) {          if (h->metaf) {
                 print_tagq(h, h->metaf);                  print_tagq(h, h->metaf);
Line 606  print_tagq(struct html *h, const struct tag *until)
Line 599  print_tagq(struct html *h, const struct tag *until)
         struct tag      *tag;          struct tag      *tag;
   
         while ((tag = h->tags.head) != NULL) {          while ((tag = h->tags.head) != NULL) {
                 /*                  print_ctag(h, tag);
                  * Remember to close out and nullify the current  
                  * meta-font and table, if applicable.  
                  */  
                 if (tag == h->metaf)  
                         h->metaf = NULL;  
                 if (tag == h->tblt)  
                         h->tblt = NULL;  
                 print_ctag(h, tag->tag);  
                 h->tags.head = tag->next;  
                 free(tag);  
                 if (until && tag == until)                  if (until && tag == until)
                         return;                          return;
         }          }
Line 630  print_stagq(struct html *h, const struct tag *suntil)
Line 613  print_stagq(struct html *h, const struct tag *suntil)
         while ((tag = h->tags.head) != NULL) {          while ((tag = h->tags.head) != NULL) {
                 if (suntil && tag == suntil)                  if (suntil && tag == suntil)
                         return;                          return;
                 /*                  print_ctag(h, tag);
                  * Remember to close out and nullify the current  
                  * meta-font and table, if applicable.  
                  */  
                 if (tag == h->metaf)  
                         h->metaf = NULL;  
                 if (tag == h->tblt)  
                         h->tblt = NULL;  
                 print_ctag(h, tag->tag);  
                 h->tags.head = tag->next;  
                 free(tag);  
         }          }
 }  }
   

Legend:
Removed from v.1.177  
changed lines
  Added in v.1.185

CVSweb