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

Diff for /mandoc/mdoc_validate.c between version 1.105 and 1.112

version 1.105, 2010/07/02 12:54:33 version 1.112, 2010/07/20 14:56:42
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *   *
  * 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 32 
Line 32 
 #include "libmandoc.h"  #include "libmandoc.h"
   
 /* FIXME: .Bl -diag can't have non-text children in HEAD. */  /* FIXME: .Bl -diag can't have non-text children in HEAD. */
 /* TODO: ignoring Pp (it's superfluous in some invocations). */  
   
 #define PRE_ARGS  struct mdoc *mdoc, struct mdoc_node *n  #define PRE_ARGS  struct mdoc *mdoc, struct mdoc_node *n
 #define POST_ARGS struct mdoc *mdoc  #define POST_ARGS struct mdoc *mdoc
Line 454  check_argv(struct mdoc *m, struct mdoc_node *n, struct
Line 453  check_argv(struct mdoc *m, struct mdoc_node *n, struct
   
   
 static int  static int
 check_text(struct mdoc *mdoc, int line, int pos, char *p)  check_text(struct mdoc *m, int ln, int pos, char *p)
 {  {
         int              c;          int              c;
           size_t           sz;
   
         /*  
          * FIXME: we absolutely cannot let \b get through or it will  
          * destroy some assumptions in terms of format.  
          */  
   
         for ( ; *p; p++, pos++) {          for ( ; *p; p++, pos++) {
                   sz = strcspn(p, "\t\\");
                   p += (int)sz;
   
                   if ('\0' == *p)
                           break;
   
                   pos += (int)sz;
   
                 if ('\t' == *p) {                  if ('\t' == *p) {
                         if ( ! (MDOC_LITERAL & mdoc->flags))                          if (MDOC_LITERAL & m->flags)
                                 if ( ! mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADCHAR))                                  continue;
                                         return(0);                          if (mdoc_pmsg(m, ln, pos, MANDOCERR_BADTAB))
                 } else if ( ! isprint((u_char)*p) && ASCII_HYPH != *p)                                  continue;
                         if ( ! mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADCHAR))                          return(0);
                                 return(0);                  }
   
                 if ('\\' != *p)                  /* Check the special character. */
                         continue;  
   
                 c = mandoc_special(p);                  c = mandoc_special(p);
                 if (c) {                  if (c) {
Line 482  check_text(struct mdoc *mdoc, int line, int pos, char 
Line 484  check_text(struct mdoc *mdoc, int line, int pos, char 
                         continue;                          continue;
                 }                  }
   
                 c = mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADESCAPE);                  c = mdoc_pmsg(m, ln, pos, MANDOCERR_BADESCAPE);
                 if ( ! (MDOC_IGN_ESCAPE & mdoc->pflags) && ! c)                  if ( ! (MDOC_IGN_ESCAPE & m->pflags) && ! c)
                         return(c);                          return(c);
         }          }
   
Line 491  check_text(struct mdoc *mdoc, int line, int pos, char 
Line 493  check_text(struct mdoc *mdoc, int line, int pos, char 
 }  }
   
   
   
   
 static int  static int
 check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t)  check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t)
 {  {
Line 510  check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type 
Line 510  check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type 
 }  }
   
   
   
 static int  static int
 pre_display(PRE_ARGS)  pre_display(PRE_ARGS)
 {  {
Line 647  pre_bl(PRE_ARGS)
Line 646  pre_bl(PRE_ARGS)
   
                 /* Assign list type. */                  /* Assign list type. */
   
                 if (LIST__NONE != lt && n->data.Bl->type == LIST__NONE)                  if (LIST__NONE != lt && n->data.Bl->type == LIST__NONE) {
                         n->data.Bl->type = lt;                          n->data.Bl->type = lt;
                           /* Set column information, too. */
                           if (LIST_column == lt) {
                                   n->data.Bl->ncols =
                                           n->args->argv[i].sz;
                                   n->data.Bl->cols = (const char **)
                                           n->args->argv[i].value;
                           }
                   }
   
                 /* The list type should come first. */                  /* The list type should come first. */
   
Line 849  static int
Line 856  static int
 pre_an(PRE_ARGS)  pre_an(PRE_ARGS)
 {  {
   
         if (NULL == n->args || 1 == n->args->argc)          if (NULL == n->args)
                 return(1);                  return(1);
         mdoc_vmsg(mdoc, MANDOCERR_SYNTARGCOUNT,          if (n->args->argc > 1)
                                 n->line, n->pos,                  if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_ARGCOUNT))
                                 "line arguments == 1 (have %d)",                          return(0);
                                 n->args->argc);  
         return(0);          if (MDOC_Split == n->args->argv[0].arg)
                   n->data.An.auth = AUTH_split;
           else if (MDOC_Nosplit == n->args->argv[0].arg)
                   n->data.An.auth = AUTH_nosplit;
           else
                   abort();
   
           return(1);
 }  }
   
   
Line 957  post_bf(POST_ARGS)
Line 971  post_bf(POST_ARGS)
         }          }
   
         np = mdoc->last;          np = mdoc->last;
           assert(MDOC_BLOCK == np->parent->type);
           assert(MDOC_Bf == np->parent->tok);
         np->data.Bf = mandoc_calloc(1, sizeof(struct mdoc_bf));          np->data.Bf = mandoc_calloc(1, sizeof(struct mdoc_bf));
   
         /*          /*
Line 964  post_bf(POST_ARGS)
Line 980  post_bf(POST_ARGS)
          * If neither is specified, let it through with a warning.           * If neither is specified, let it through with a warning.
          */           */
   
         if (np->args && np->child) {          if (np->parent->args && np->child) {
                 mdoc_nmsg(mdoc, np, MANDOCERR_SYNTARGVCOUNT);                  mdoc_nmsg(mdoc, np, MANDOCERR_SYNTARGVCOUNT);
                 return(0);                  return(0);
         } else if (NULL == np->args && NULL == np->child)          } else if (NULL == np->parent->args && NULL == np->child)
                 return(mdoc_nmsg(mdoc, np, MANDOCERR_FONTTYPE));                  return(mdoc_nmsg(mdoc, np, MANDOCERR_FONTTYPE));
   
         /* Extract argument into data. */          /* Extract argument into data. */
   
         if (np->args) {          if (np->parent->args) {
                 arg = np->args->argv[0].arg;                  arg = np->parent->args->argv[0].arg;
                 if (MDOC_Emphasis == arg)                  if (MDOC_Emphasis == arg)
                         np->data.Bf->font = FONT_Em;                          np->data.Bf->font = FONT_Em;
                 else if (MDOC_Literal == arg)                  else if (MDOC_Literal == arg)
Line 1074  post_at(POST_ARGS)
Line 1090  post_at(POST_ARGS)
 static int  static int
 post_an(POST_ARGS)  post_an(POST_ARGS)
 {  {
           struct mdoc_node *np;
   
         if (mdoc->last->args) {          np = mdoc->last;
                 if (NULL == mdoc->last->child)          if (AUTH__NONE != np->data.An.auth && np->child)
                         return(1);                  return(mdoc_nmsg(mdoc, np, MANDOCERR_ARGCOUNT));
                 return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGCOUNT));          if (AUTH__NONE != np->data.An.auth || np->child)
         }  
   
         if (mdoc->last->child)  
                 return(1);                  return(1);
         return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS));          return(mdoc_nmsg(mdoc, np, MANDOCERR_NOARGS));
 }  }
   
   
Line 1125  post_it(POST_ARGS)
Line 1139  post_it(POST_ARGS)
                 if (NULL == mdoc->last->head->child)                  if (NULL == mdoc->last->head->child)
                         if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS))                          if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS))
                                 return(0);                                  return(0);
                 if (NULL == mdoc->last->body->child)  
                         if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY))  
                                 return(0);  
                 break;                  break;
         case (LIST_bullet):          case (LIST_bullet):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
Line 1136  post_it(POST_ARGS)
Line 1147  post_it(POST_ARGS)
         case (LIST_enum):          case (LIST_enum):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_hyphen):          case (LIST_hyphen):
                   if (NULL == mdoc->last->body->child)
                           if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY))
                                   return(0);
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (LIST_item):          case (LIST_item):
                 if (mdoc->last->head->child)                  if (mdoc->last->head->child)
                         if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST))                          if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST))
                                 return(0);                                  return(0);
                 if (NULL == mdoc->last->body->child)  
                         if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY))  
                                 return(0);  
                 break;                  break;
         case (LIST_column):          case (LIST_column):
                 cols = -1;                  cols = (int)n->data.Bl->ncols;
                 for (i = 0; i < (int)n->args->argc; i++)  
                         if (MDOC_Column == n->args->argv[i].arg) {  
                                 cols = (int)n->args->argv[i].sz;  
                                 break;  
                         }  
   
                 assert(-1 != cols);  
                 assert(NULL == mdoc->last->head->child);                  assert(NULL == mdoc->last->head->child);
   
                 if (NULL == mdoc->last->body->child)                  if (NULL == mdoc->last->body->child)
Line 1193  post_bl_head(POST_ARGS) 
Line 1198  post_bl_head(POST_ARGS) 
         n = mdoc->last->parent;          n = mdoc->last->parent;
   
         if (LIST_column == n->data.Bl->type) {          if (LIST_column == n->data.Bl->type) {
                 for (i = 0; i < (int)n->args->argc; i++)                  if (n->data.Bl->ncols && mdoc->last->nchild) {
                         if (MDOC_Column == n->args->argv[i].arg)  
                                 break;  
                 assert(i < (int)n->args->argc);  
   
                 if (n->args->argv[i].sz && mdoc->last->nchild) {  
                         mdoc_nmsg(mdoc, n, MANDOCERR_COLUMNS);                          mdoc_nmsg(mdoc, n, MANDOCERR_COLUMNS);
                         return(0);                          return(0);
                 }                  }

Legend:
Removed from v.1.105  
changed lines
  Added in v.1.112

CVSweb