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

Diff for /mandoc/Attic/mdocterm.c between version 1.34 and 1.38

version 1.34, 2009/03/06 14:13:47 version 1.38, 2009/03/10 11:16:43
Line 16 
Line 16 
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.   * PERFORMANCE OF THIS SOFTWARE.
  */   */
   #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #include <err.h>  #include <err.h>
Line 23 
Line 25 
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #ifndef __OpenBSD__  
 #include <time.h>  
 #endif  
   
 #include "mmain.h"  #include "mmain.h"
 #include "term.h"  #include "term.h"
Line 53  static void    chara(struct termp *, char);
Line 52  static void    chara(struct termp *, char);
 static  void              stringa(struct termp *,  static  void              stringa(struct termp *,
                                 const char *, size_t);                                  const char *, size_t);
 static  void              symbola(struct termp *, enum tsym);  static  void              symbola(struct termp *, enum tsym);
   static  void              sanity(const struct mdoc_node *);
 static  void              stylea(struct termp *, enum tstyle);  static  void              stylea(struct termp *, enum tstyle);
   
 #ifdef __linux__  #ifdef __linux__
Line 476  body(struct termp *p, struct termpair *ppair,
Line 476  body(struct termp *p, struct termpair *ppair,
         int              dochild;          int              dochild;
         struct termpair  pair;          struct termpair  pair;
   
           /* Some quick sanity-checking. */
   
           sanity(node);
   
         /* Pre-processing. */          /* Pre-processing. */
   
         dochild = 1;          dochild = 1;
Line 490  body(struct termp *p, struct termpair *ppair,
Line 494  body(struct termp *p, struct termpair *ppair,
                         if ( ! (*termacts[node->tok].pre)(p, &pair, meta, node))                          if ( ! (*termacts[node->tok].pre)(p, &pair, meta, node))
                                 dochild = 0;                                  dochild = 0;
         } else /* MDOC_TEXT == node->type */          } else /* MDOC_TEXT == node->type */
                 word(p, node->data.text.string);                  word(p, node->string);
   
         /* Children. */          /* Children. */
   
Line 681  pescape(struct termp *p, const char *word, size_t *i, 
Line 685  pescape(struct termp *p, const char *word, size_t *i, 
 {  {
         size_t           j;          size_t           j;
   
         (*i)++;          if (++(*i) >= len) {
         assert(*i < len);                  warnx("ignoring bad escape sequence");
                   return;
           }
   
         if ('(' == word[*i]) {          if ('(' == word[*i]) {
                 (*i)++;                  (*i)++;
                 assert(*i + 1 < len);                  if (*i + 1 >= len) {
                           warnx("ignoring bad escape sequence");
                           return;
                   }
                 nescape(p, &word[*i], 2);                  nescape(p, &word[*i], 2);
                 (*i)++;                  (*i)++;
                 return;                  return;
   
         } else if ('*' == word[*i]) {          } else if ('*' == word[*i]) {
                 /* XXX - deprecated! */  
                 (*i)++;                  (*i)++;
                 assert(*i < len);                  if (*i >= len) {
                           warnx("ignoring bad escape sequence");
                           return;
                   }
                 switch (word[*i]) {                  switch (word[*i]) {
                 case ('('):                  case ('('):
                         (*i)++;                          (*i)++;
                         assert(*i + 1 < len);                          if (*i + 1 >= len) {
                                   warnx("ignoring bad escape sequence");
                                   return;
                           }
                         nescape(p, &word[*i], 2);                          nescape(p, &word[*i], 2);
                         (*i)++;                          (*i)++;
                         return;                          return;
Line 718  pescape(struct termp *p, const char *word, size_t *i, 
Line 732  pescape(struct termp *p, const char *word, size_t *i, 
         for (j = 0; word[*i] && ']' != word[*i]; (*i)++, j++)          for (j = 0; word[*i] && ']' != word[*i]; (*i)++, j++)
                 /* Loop... */ ;                  /* Loop... */ ;
   
         assert(word[*i]);          if (0 == word[*i]) {
                   warnx("ignoring bad escape sequence");
                   return;
           }
         nescape(p, &word[*i - j], j);          nescape(p, &word[*i - j], j);
 }  }
   
Line 833  chara(struct termp *p, char c)
Line 850  chara(struct termp *p, char c)
         }          }
         p->buf[(p->col)++] = c;          p->buf[(p->col)++] = c;
 }  }
   
   
   static void
   sanity(const struct mdoc_node *n)
   {
   
           switch (n->type) {
           case (MDOC_TEXT):
                   if (n->child)
                           errx(1, "regular form violated (1)");
                   if (NULL == n->parent)
                           errx(1, "regular form violated (2)");
                   if (NULL == n->string)
                           errx(1, "regular form violated (3)");
                   switch (n->parent->type) {
                   case (MDOC_TEXT):
                           /* FALLTHROUGH */
                   case (MDOC_ROOT):
                           errx(1, "regular form violated (4)");
                           /* NOTREACHED */
                   default:
                           break;
                   }
                   break;
           case (MDOC_ELEM):
                   if (NULL == n->parent)
                           errx(1, "regular form violated (5)");
                   switch (n->parent->type) {
                   case (MDOC_TAIL):
                           /* FALLTHROUGH */
                   case (MDOC_BODY):
                           /* FALLTHROUGH */
                   case (MDOC_HEAD):
                           break;
                   default:
                           errx(1, "regular form violated (6)");
                           /* NOTREACHED */
                   }
                   if (n->child) switch (n->child->type) {
                   case (MDOC_TEXT):
                           break;
                   default:
                           errx(1, "regular form violated (7(");
                           /* NOTREACHED */
                   }
                   break;
           case (MDOC_HEAD):
                   /* FALLTHROUGH */
           case (MDOC_BODY):
                   /* FALLTHROUGH */
           case (MDOC_TAIL):
                   if (NULL == n->parent)
                           errx(1, "regular form violated (8)");
                   if (MDOC_BLOCK != n->parent->type)
                           errx(1, "regular form violated (9)");
                   if (n->child) switch (n->child->type) {
                   case (MDOC_BLOCK):
                           /* FALLTHROUGH */
                   case (MDOC_ELEM):
                           /* FALLTHROUGH */
                   case (MDOC_TEXT):
                           break;
                   default:
                           errx(1, "regular form violated (a)");
                           /* NOTREACHED */
                   }
                   break;
           case (MDOC_BLOCK):
                   if (NULL == n->parent)
                           errx(1, "regular form violated (b)");
                   if (NULL == n->child)
                           errx(1, "regular form violated (c)");
                   switch (n->parent->type) {
                   case (MDOC_ROOT):
                           /* FALLTHROUGH */
                   case (MDOC_HEAD):
                           /* FALLTHROUGH */
                   case (MDOC_BODY):
                           /* FALLTHROUGH */
                   case (MDOC_TAIL):
                           break;
                   default:
                           errx(1, "regular form violated (d)");
                           /* NOTREACHED */
                   }
                   switch (n->child->type) {
                   case (MDOC_ROOT):
                           /* FALLTHROUGH */
                   case (MDOC_ELEM):
                           errx(1, "regular form violated (e)");
                           /* NOTREACHED */
                   default:
                           break;
                   }
                   break;
           case (MDOC_ROOT):
                   if (n->parent)
                           errx(1, "regular form violated (f)");
                   if (NULL == n->child)
                           errx(1, "regular form violated (10)");
                   switch (n->child->type) {
                   case (MDOC_BLOCK):
                           break;
                   default:
                           errx(1, "regular form violated (11)");
                           /* NOTREACHED */
                   }
                   break;
           }
   }
   

Legend:
Removed from v.1.34  
changed lines
  Added in v.1.38

CVSweb