[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.53 and 1.66

version 1.53, 2009/10/31 08:34:12 version 1.66, 2010/04/06 16:27:53
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);
 static  int      herr_ge1(POST_ARGS);  static  int      herr_ge1(POST_ARGS);
 static  int      hwarn_eq1(POST_ARGS);  static  int      hwarn_eq1(POST_ARGS);
   static  int      hwarn_eq0(POST_ARGS);
 static  int      hwarn_le1(POST_ARGS);  static  int      hwarn_le1(POST_ARGS);
   
 static  int      post_an(POST_ARGS);  static  int      post_an(POST_ARGS);
Line 94  static int  post_sh(POST_ARGS);
Line 94  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 113  static int  pre_ss(PRE_ARGS);
Line 114  static int  pre_ss(PRE_ARGS);
   
 static  v_post   posts_an[] = { post_an, NULL };  static  v_post   posts_an[] = { post_an, NULL };
 static  v_post   posts_at[] = { post_at, NULL };  static  v_post   posts_at[] = { post_at, NULL };
 static  v_post   posts_bd[] = { herr_eq0, bwarn_ge1, NULL };  static  v_post   posts_bd[] = { hwarn_eq0, bwarn_ge1, NULL };
 static  v_post   posts_bf[] = { hwarn_le1, post_bf, NULL };  static  v_post   posts_bf[] = { hwarn_le1, post_bf, NULL };
 static  v_post   posts_bl[] = { bwarn_ge1, post_bl, NULL };  static  v_post   posts_bl[] = { bwarn_ge1, post_bl, NULL };
 static  v_post   posts_bool[] = { eerr_eq1, ebool, NULL };  static  v_post   posts_bool[] = { eerr_eq1, ebool, NULL };
Line 130  static v_post  posts_ss[] = { herr_ge1, NULL };
Line 131  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 192  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. */
         { NULL, posts_text },                   /* %D */          { NULL, posts_text },                   /* %D */ /* FIXME: check date with mandoc_a2time(). */
         { NULL, posts_text },                   /* %I */          { NULL, posts_text },                   /* %I */
         { NULL, posts_text },                   /* %J */          { NULL, posts_text },                   /* %J */
         { NULL, posts_text },                   /* %N */          { NULL, posts_text },                   /* %N */
Line 406  CHECK_BODY_DEFN(ge1, warn, warn_child_gt, 0) /* bwarn_
Line 408  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 414  CHECK_HEAD_DEFN(eq0, err, err_child_eq, 0) /* herr_eq0
Line 415  CHECK_HEAD_DEFN(eq0, err, err_child_eq, 0) /* herr_eq0
 CHECK_HEAD_DEFN(le1, warn, warn_child_lt, 2)    /* hwarn_le1() */  CHECK_HEAD_DEFN(le1, warn, warn_child_lt, 2)    /* hwarn_le1() */
 CHECK_HEAD_DEFN(ge1, err, err_child_gt, 0)      /* herr_ge1() */  CHECK_HEAD_DEFN(ge1, err, err_child_gt, 0)      /* herr_ge1() */
 CHECK_HEAD_DEFN(eq1, warn, warn_child_eq, 1)    /* hwarn_eq1() */  CHECK_HEAD_DEFN(eq1, warn, warn_child_eq, 1)    /* hwarn_eq1() */
   CHECK_HEAD_DEFN(eq0, warn, warn_child_eq, 0)    /* hwarn_eq0() */
   
   
 static int  static int
Line 547  check_text(struct mdoc *mdoc, int line, int pos, const
Line 549  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 623  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 808  static int
Line 823  static int
 pre_dt(PRE_ARGS)  pre_dt(PRE_ARGS)
 {  {
   
           /* FIXME: make sure is capitalised. */
   
         if (0 == mdoc->meta.date || mdoc->meta.os)          if (0 == mdoc->meta.date || mdoc->meta.os)
                 if ( ! mdoc_nwarn(mdoc, n, EPROLOOO))                  if ( ! mdoc_nwarn(mdoc, n, EPROLOOO))
                         return(0);                          return(0);
Line 889  post_lb(POST_ARGS)
Line 906  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 1054  post_bl_head(POST_ARGS) 
Line 1097  post_bl_head(POST_ARGS) 
 {  {
         int                     i;          int                     i;
         const struct mdoc_node *n;          const struct mdoc_node *n;
           const struct mdoc_argv *a;
   
         n = mdoc->last->parent;          n = mdoc->last->parent;
         assert(n->args);          assert(n->args);
   
         for (i = 0; i < (int)n->args->argc; i++)          for (i = 0; i < (int)n->args->argc; i++) {
                 if (n->args->argv[i].arg == MDOC_Column)                  a = &n->args->argv[i];
                         break;                  if (a->arg == MDOC_Column) {
                           if (a->sz && mdoc->last->nchild)
                                   return(mdoc_nerr(mdoc, n, ECOLMIS));
                           return(1);
                   }
           }
   
         if (i == (int)n->args->argc)          if (0 == (i = mdoc->last->nchild))
                 return(1);                  return(1);
           return(warn_count(mdoc, "==", 0, "line arguments", i));
         if (n->args->argv[i].sz && mdoc->last->child)  
                 return(mdoc_nerr(mdoc, n, ECOLMIS));  
   
         return(1);  
 }  }
   
   
Line 1084  post_bl(POST_ARGS)
Line 1129  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 1273  post_sh_head(POST_ARGS)
Line 1325  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.53  
changed lines
  Added in v.1.66

CVSweb