[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.51 and 1.60

version 1.51, 2009/10/26 04:09:46 version 1.60, 2010/04/03 13:02:35
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>
 #include <ctype.h>  #include <ctype.h>
 #include <errno.h>  
 #include <limits.h>  #include <limits.h>
 #include <stdarg.h>  #include <stdarg.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 41  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 63  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 95  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 131  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[] = { eerr_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 191  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. */
         { 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 407  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 548  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 666  pre_bl(PRE_ARGS)
Line 665  pre_bl(PRE_ARGS)
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Diag):          case (MDOC_Diag):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case (MDOC_Ohang):
                   /* FALLTHROUGH */
         case (MDOC_Inset):          case (MDOC_Inset):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Item):          case (MDOC_Item):
Line 807  static int
Line 808  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 888  post_lb(POST_ARGS)
Line 891  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 1083  post_bl(POST_ARGS)
Line 1112  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 1272  post_sh_head(POST_ARGS)
Line 1308  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.51  
changed lines
  Added in v.1.60

CVSweb