[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.54 and 1.64

version 1.54, 2009/11/02 06:22:46 version 1.64, 2010/04/06 11:28:17
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
   #ifdef HAVE_CONFIG_H
   #include "config.h"
   #endif
   
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
Line 40  struct valids {
Line 44  struct valids {
         v_post  *post;          v_post  *post;
 };  };
   
 static  int      check_parent(PRE_ARGS, int, enum mdoc_type);  static  int      check_parent(PRE_ARGS, enum mdoct, enum mdoc_type);
 static  int      check_msec(PRE_ARGS, ...);  static  int      check_msec(PRE_ARGS, ...);
 static  int      check_sec(PRE_ARGS, ...);  static  int      check_sec(PRE_ARGS, ...);
 static  int      check_stdarg(PRE_ARGS);  static  int      check_stdarg(PRE_ARGS);
Line 62  static int  warn_count(struct mdoc *, const char *, 
Line 66  static int  warn_count(struct mdoc *, const char *, 
 static  int      err_count(struct mdoc *, const char *,  static  int      err_count(struct mdoc *, const char *,
                         int, const char *, int);                          int, const char *, int);
   
 #ifdef __linux__  
 extern  size_t   strlcat(char *, const char *, size_t);  
 #endif  
   
 static  int      berr_ge1(POST_ARGS);  static  int      berr_ge1(POST_ARGS);
 static  int      bwarn_ge1(POST_ARGS);  static  int      bwarn_ge1(POST_ARGS);
 static  int      ebool(POST_ARGS);  static  int      ebool(POST_ARGS);
 static  int      eerr_eq0(POST_ARGS);  static  int      eerr_eq0(POST_ARGS);
 static  int      eerr_eq1(POST_ARGS);  static  int      eerr_eq1(POST_ARGS);
 static  int      eerr_ge1(POST_ARGS);  static  int      eerr_ge1(POST_ARGS);
 static  int      eerr_le2(POST_ARGS);  
 static  int      eerr_le1(POST_ARGS);  static  int      eerr_le1(POST_ARGS);
 static  int      ewarn_ge1(POST_ARGS);  static  int      ewarn_ge1(POST_ARGS);
 static  int      herr_eq0(POST_ARGS);  static  int      herr_eq0(POST_ARGS);
Line 94  static int  post_sh(POST_ARGS);
Line 93  static int  post_sh(POST_ARGS);
 static  int      post_sh_body(POST_ARGS);  static  int      post_sh_body(POST_ARGS);
 static  int      post_sh_head(POST_ARGS);  static  int      post_sh_head(POST_ARGS);
 static  int      post_st(POST_ARGS);  static  int      post_st(POST_ARGS);
   static  int      post_vt(POST_ARGS);
 static  int      pre_an(PRE_ARGS);  static  int      pre_an(PRE_ARGS);
 static  int      pre_bd(PRE_ARGS);  static  int      pre_bd(PRE_ARGS);
 static  int      pre_bl(PRE_ARGS);  static  int      pre_bl(PRE_ARGS);
Line 130  static v_post  posts_ss[] = { herr_ge1, NULL };
Line 130  static v_post  posts_ss[] = { herr_ge1, NULL };
 static  v_post   posts_st[] = { eerr_eq1, post_st, NULL };  static  v_post   posts_st[] = { eerr_eq1, post_st, NULL };
 static  v_post   posts_text[] = { eerr_ge1, NULL };  static  v_post   posts_text[] = { eerr_ge1, NULL };
 static  v_post   posts_text1[] = { eerr_eq1, NULL };  static  v_post   posts_text1[] = { eerr_eq1, NULL };
   static  v_post   posts_vt[] = { post_vt, NULL };
 static  v_post   posts_wline[] = { bwarn_ge1, herr_eq0, NULL };  static  v_post   posts_wline[] = { bwarn_ge1, herr_eq0, NULL };
 static  v_post   posts_wtext[] = { ewarn_ge1, NULL };  static  v_post   posts_wtext[] = { ewarn_ge1, NULL };
 static  v_post   posts_xr[] = { eerr_ge1, eerr_le2, NULL };  static  v_post   posts_xr[] = { ewarn_ge1, NULL };
 static  v_pre    pres_an[] = { pre_an, NULL };  static  v_pre    pres_an[] = { pre_an, NULL };
 static  v_pre    pres_bd[] = { pre_display, pre_bd, NULL };  static  v_pre    pres_bd[] = { pre_display, pre_bd, NULL };
 static  v_pre    pres_bl[] = { pre_bl, NULL };  static  v_pre    pres_bl[] = { pre_bl, NULL };
Line 190  const struct valids mdoc_valids[MDOC_MAX] = {
Line 191  const struct valids mdoc_valids[MDOC_MAX] = {
         { pres_rv, NULL },                      /* Rv */          { pres_rv, NULL },                      /* Rv */
         { NULL, posts_st },                     /* St */          { NULL, posts_st },                     /* St */
         { NULL, NULL },                         /* Va */          { NULL, NULL },                         /* Va */
         { NULL, posts_text },                   /* Vt */          { NULL, posts_vt },                     /* Vt */
         { NULL, posts_xr },                     /* Xr */          { NULL, posts_xr },                     /* Xr */
         { NULL, posts_text },                   /* %A */          { NULL, posts_text },                   /* %A */
         { NULL, posts_text },                   /* %B */ /* FIXME: can be used outside Rs/Re. */          { NULL, posts_text },                   /* %B */ /* FIXME: can be used outside Rs/Re. */
Line 406  CHECK_BODY_DEFN(ge1, warn, warn_child_gt, 0) /* bwarn_
Line 407  CHECK_BODY_DEFN(ge1, warn, warn_child_gt, 0) /* bwarn_
 CHECK_BODY_DEFN(ge1, err, err_child_gt, 0)      /* berr_ge1() */  CHECK_BODY_DEFN(ge1, err, err_child_gt, 0)      /* berr_ge1() */
 CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0)    /* ewarn_gt1() */  CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0)    /* ewarn_gt1() */
 CHECK_ELEM_DEFN(eq1, err, err_child_eq, 1)      /* eerr_eq1() */  CHECK_ELEM_DEFN(eq1, err, err_child_eq, 1)      /* eerr_eq1() */
 CHECK_ELEM_DEFN(le2, err, err_child_lt, 3)      /* eerr_le2() */  
 CHECK_ELEM_DEFN(le1, err, err_child_lt, 2)      /* eerr_le1() */  CHECK_ELEM_DEFN(le1, err, err_child_lt, 2)      /* eerr_le1() */
 CHECK_ELEM_DEFN(eq0, err, err_child_eq, 0)      /* eerr_eq0() */  CHECK_ELEM_DEFN(eq0, err, err_child_eq, 0)      /* eerr_eq0() */
 CHECK_ELEM_DEFN(ge1, err, err_child_gt, 0)      /* eerr_ge1() */  CHECK_ELEM_DEFN(ge1, err, err_child_gt, 0)      /* eerr_ge1() */
Line 547  check_text(struct mdoc *mdoc, int line, int pos, const
Line 547  check_text(struct mdoc *mdoc, int line, int pos, const
   
   
 static int  static int
 check_parent(PRE_ARGS, int tok, enum mdoc_type t)  check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t)
 {  {
   
         assert(n->parent);          assert(n->parent);
Line 621  pre_bl(PRE_ARGS)
Line 621  pre_bl(PRE_ARGS)
                 case (MDOC_Inset):                  case (MDOC_Inset):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_Column):                  case (MDOC_Column):
                         if (type >= 0)                          /*
                                 return(mdoc_nerr(mdoc, n, EMULTILIST));                           * Note that if a duplicate is detected, we
                            * remove the duplicate instead of passing it
                            * over.  If we don't do this, mdoc_action will
                            * become confused when it scans over multiple
                            * types whilst setting its bitmasks.
                            *
                            * FIXME: this should occur in mdoc_action.c.
                            */
                           if (type >= 0) {
                                   if ( ! mdoc_nwarn(mdoc, n, EMULTILIST))
                                           return(0);
                                   mdoc_argn_free(n->args, pos);
                                   break;
                           }
                         type = n->args->argv[pos].arg;                          type = n->args->argv[pos].arg;
                         break;                          break;
                 case (MDOC_Compact):                  case (MDOC_Compact):
Line 891  post_lb(POST_ARGS)
Line 904  post_lb(POST_ARGS)
   
   
 static int  static int
   post_vt(POST_ARGS)
   {
           const struct mdoc_node *n;
   
           /*
            * The Vt macro comes in both ELEM and BLOCK form, both of which
            * have different syntaxes (yet more context-sensitive
            * behaviour).  ELEM types must have a child; BLOCK types,
            * specifically the BODY, should only have TEXT children.
            */
   
           if (MDOC_ELEM == mdoc->last->type)
                   return(eerr_ge1(mdoc));
           if (MDOC_BODY != mdoc->last->type)
                   return(1);
   
           for (n = mdoc->last->child; n; n = n->next)
                   if (MDOC_TEXT != n->type)
                           if ( ! mdoc_nwarn(mdoc, n, EBADCHILD))
                                   return(0);
   
           return(1);
   }
   
   
   static int
 post_nm(POST_ARGS)  post_nm(POST_ARGS)
 {  {
   
Line 1064  post_bl_head(POST_ARGS) 
Line 1103  post_bl_head(POST_ARGS) 
                 if (n->args->argv[i].arg == MDOC_Column)                  if (n->args->argv[i].arg == MDOC_Column)
                         break;                          break;
   
         if (i == (int)n->args->argc)          if (i == (int)n->args->argc && n->nchild)
                 return(1);                  return(warn_count(mdoc, "==", 0,
                                   "line arguments", n->nchild));
   
         if (n->args->argv[i].sz && mdoc->last->child)          if (n->args->argv[i].sz && mdoc->last->child)
                 return(mdoc_nerr(mdoc, n, ECOLMIS));                  return(mdoc_nerr(mdoc, n, ECOLMIS));
Line 1086  post_bl(POST_ARGS)
Line 1126  post_bl(POST_ARGS)
         if (NULL == mdoc->last->child)          if (NULL == mdoc->last->child)
                 return(1);                  return(1);
   
           /*
            * We only allow certain children of `Bl'.  This is usually on
            * `It', but apparently `Sm' occurs here and there, so we let
            * that one through, too.
            */
   
         /* LINTED */          /* LINTED */
         for (n = mdoc->last->child; n; n = n->next) {          for (n = mdoc->last->child; n; n = n->next) {
                 if (MDOC_BLOCK == n->type)                  if (MDOC_BLOCK == n->type && MDOC_It == n->tok)
                         if (MDOC_It == n->tok)                          continue;
                                 continue;                  if (MDOC_Sm == n->tok)
                           continue;
                 return(mdoc_nerr(mdoc, n, EBADCHILD));                  return(mdoc_nerr(mdoc, n, EBADCHILD));
         }          }
   
Line 1275  post_sh_head(POST_ARGS)
Line 1322  post_sh_head(POST_ARGS)
          * non-CUSTOM has a conventional order to be followed.           * non-CUSTOM has a conventional order to be followed.
          */           */
   
         if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed)          if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed &&
                 return(mdoc_nerr(mdoc, mdoc->last, ESECNAME));                          ! mdoc_nwarn(mdoc, mdoc->last, ESECNAME))
                   return(0);
         if (SEC_CUSTOM == sec)          if (SEC_CUSTOM == sec)
                 return(1);                  return(1);
         if (sec == mdoc->lastnamed)          if (sec == mdoc->lastnamed)

Legend:
Removed from v.1.54  
changed lines
  Added in v.1.64

CVSweb