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

Diff for /mandoc/Attic/validate.c between version 1.75 and 1.84

version 1.75, 2009/03/08 20:50:12 version 1.84, 2009/03/16 22:19:19
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 <stdarg.h>  #include <stdarg.h>
Line 38 
Line 40 
 #define POST_ARGS       struct mdoc *mdoc  #define POST_ARGS       struct mdoc *mdoc
   
 enum    merr {  enum    merr {
           EPRINT,
         ENODATA,          ENODATA,
         ENOPROLOGUE,          ENOPROLOGUE,
         ELINE,          ELINE,
Line 79  struct valids {
Line 82  struct valids {
   
 /* Utility checks. */  /* Utility checks. */
   
 static  int     nwarn(struct mdoc *,  static  int     pwarn(struct mdoc *, int, int, enum mwarn);
                         const struct mdoc_node *, enum mwarn);  static  int     perr(struct mdoc *, int, int, enum merr);
 static  int     nerr(struct mdoc *,  
                         const struct mdoc_node *, enum merr);  
 static  int     check_parent(PRE_ARGS, int, enum mdoc_type);  static  int     check_parent(PRE_ARGS, int, 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);
 static  int     check_text(struct mdoc *,  static  int     check_text(struct mdoc *, int, int, const char *);
                         int, int, const char *);  
 static  int     check_argv(struct mdoc *,  static  int     check_argv(struct mdoc *,
                         const struct mdoc_node *,                          const struct mdoc_node *,
                         const struct mdoc_argv *);                          const struct mdoc_argv *);
Line 135  static int bwarn_ge1(POST_ARGS);
Line 135  static int bwarn_ge1(POST_ARGS);
 static  int     hwarn_eq1(POST_ARGS);  static  int     hwarn_eq1(POST_ARGS);
 static  int     ewarn_ge1(POST_ARGS);  static  int     ewarn_ge1(POST_ARGS);
 static  int     ebool(POST_ARGS);  static  int     ebool(POST_ARGS);
   
 static  int     post_an(POST_ARGS);  static  int     post_an(POST_ARGS);
   static  int     post_args(POST_ARGS);
 static  int     post_at(POST_ARGS);  static  int     post_at(POST_ARGS);
 static  int     post_bf(POST_ARGS);  static  int     post_bf(POST_ARGS);
 static  int     post_bl(POST_ARGS);  static  int     post_bl(POST_ARGS);
 static  int     post_ex(POST_ARGS);  
 static  int     post_it(POST_ARGS);  static  int     post_it(POST_ARGS);
 static  int     post_nm(POST_ARGS);  static  int     post_nm(POST_ARGS);
 static  int     post_root(POST_ARGS);  static  int     post_root(POST_ARGS);
Line 148  static int post_sh_body(POST_ARGS);
Line 149  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);
   
   #define mwarn(m, t) nwarn((m), (m)->last, (t))
   #define merr(m, t) nerr((m), (m)->last, (t))
   #define nwarn(m, n, t) pwarn((m), (n)->line, (n)->pos, (t))
   #define nerr(m, n, t) perr((m), (n)->line, (n)->pos, (t))
   
 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 179  static v_post posts_pf[] = { eerr_eq1, NULL };
Line 185  static v_post posts_pf[] = { eerr_eq1, NULL };
 static  v_post  posts_lb[] = { eerr_eq1, NULL };  static  v_post  posts_lb[] = { eerr_eq1, 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_pp[] = { ewarn_eq0, NULL };  static  v_post  posts_pp[] = { ewarn_eq0, NULL };
 static  v_post  posts_ex[] = { eerr_eq0, post_ex, NULL };  static  v_post  posts_ex[] = { eerr_eq0, post_args, NULL };
   static  v_post  posts_rv[] = { eerr_eq0, post_args, NULL };
 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_xr[] = { eerr_ge1, eerr_le2, NULL };  static  v_post  posts_xr[] = { eerr_ge1, eerr_le2, NULL };
Line 227  const struct valids mdoc_valids[MDOC_MAX] = {
Line 234  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, posts_wline },                  /* Op */          { NULL, posts_wline },                  /* Op */
         { NULL, NULL },                         /* Ot */          { NULL, NULL },                         /* Ot */
         { NULL, NULL },                         /* Pa */          { NULL, NULL },                         /* Pa */
         { pres_rv, posts_notext },              /* Rv */          { pres_rv, posts_rv },                  /* Rv */
         { NULL, posts_st },                     /* St */          { NULL, posts_st },                     /* St */
         { NULL, posts_text },                   /* Va */          { NULL, posts_text },                   /* Va */
         { NULL, posts_text },                   /* Vt */          { NULL, posts_text },                   /* Vt */
Line 298  const struct valids mdoc_valids[MDOC_MAX] = {
Line 305  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, NULL },                         /* Fr */          { NULL, NULL },                         /* Fr */
         { NULL, posts_notext },                 /* Ud */          { NULL, posts_notext },                 /* Ud */
         { pres_lb, posts_lb },                  /* Lb */          { pres_lb, posts_lb },                  /* Lb */
         { NULL, NULL },                         /* Lb */          { NULL, NULL },                         /* Ap */
           { NULL, posts_pp },                     /* Lp */
           { NULL, posts_text },                   /* Lk */
           { NULL, posts_text },                   /* Mt */
           { NULL, posts_wline },                  /* Brq */
           { NULL, NULL },                         /* Bro */
           { NULL, NULL },                         /* Brc */
           { NULL, posts_text },                   /* %C */
           { NULL, NULL },                         /* Es */
           { NULL, NULL },                         /* En */
 };  };
   
   
 int  int
 mdoc_valid_pre(struct mdoc *mdoc,  mdoc_valid_pre(struct mdoc *mdoc,
                 const struct mdoc_node *node)                  const struct mdoc_node *n)
 {  {
         v_pre           *p;          v_pre           *p;
         int              line, pos;          int              line, pos;
         const char      *tp;          const char      *tp;
   
         if (MDOC_TEXT == node->type) {          if (MDOC_TEXT == n->type) {
                 tp = node->string;                  tp = n->string;
                 line = node->line;                  line = n->line;
                 pos = node->pos;                  pos = n->pos;
                 return(check_text(mdoc, line, pos, tp));                  return(check_text(mdoc, line, pos, tp));
         }          }
   
         if ( ! check_args(mdoc, node))          if ( ! check_args(mdoc, n))
                 return(0);                  return(0);
         if (NULL == mdoc_valids[node->tok].pre)          if (NULL == mdoc_valids[n->tok].pre)
                 return(1);                  return(1);
         for (p = mdoc_valids[node->tok].pre; *p; p++)          for (p = mdoc_valids[n->tok].pre; *p; p++)
                 if ( ! (*p)(mdoc, node))                  if ( ! (*p)(mdoc, n))
                         return(0);                          return(0);
         return(1);          return(1);
 }  }
Line 360  mdoc_valid_post(struct mdoc *mdoc)
Line 376  mdoc_valid_post(struct mdoc *mdoc)
 }  }
   
   
 #define merr(m, t) nerr((m), (m)->last, (t))  
 static int  static int
 nerr(struct mdoc *m, const struct mdoc_node *n, enum merr type)  perr(struct mdoc *m, int line, int pos, enum merr type)
 {  {
         char             *p;          char             *p;
   
         p = NULL;          p = NULL;
   
         switch (type) {          switch (type) {
           case (EPRINT):
                   p = "invalid character";
                   break;
         case (ENESTDISP):          case (ENESTDISP):
                 p = "displays may not be nested";                  p = "displays may not be nested";
                 break;                  break;
Line 406  nerr(struct mdoc *m, const struct mdoc_node *n, enum m
Line 423  nerr(struct mdoc *m, const struct mdoc_node *n, enum m
                 p = "default name not yet set";                  p = "default name not yet set";
                 break;                  break;
         }          }
   
         assert(p);          assert(p);
         return(mdoc_nerr(m, n, p));          return(mdoc_perr(m, line, pos, p));
 }  }
   
   
 #define mwarn(m, t) nwarn((m), (m)->last, (t))  
 static int  static int
 nwarn(struct mdoc *m, const struct mdoc_node *n, enum mwarn type)  pwarn(struct mdoc *m, int line, int pos, enum mwarn type)
 {  {
         char             *p;          char             *p;
         enum mdoc_warn    c;          enum mdoc_warn    c;
   
         c = WARN_SYNTAX;          c = WARN_SYNTAX;
         p = NULL;          p = NULL;
   
         switch (type) {          switch (type) {
         case (WBADMSEC):          case (WBADMSEC):
                 p = "inappropriate manual section";                  p = "inappropriate manual section";
Line 473  nwarn(struct mdoc *m, const struct mdoc_node *n, enum 
Line 487  nwarn(struct mdoc *m, const struct mdoc_node *n, enum 
                 break;                  break;
         }          }
         assert(p);          assert(p);
         return(mdoc_nwarn(m, n, c, p));          return(mdoc_pwarn(m, line, pos, c, p));
 }  }
   
   
Line 658  check_argv(struct mdoc *m, const struct mdoc_node *n, 
Line 672  check_argv(struct mdoc *m, const struct mdoc_node *n, 
                 if ( ! check_text(m, v->line, v->pos, v->value[i]))                  if ( ! check_text(m, v->line, v->pos, v->value[i]))
                         return(0);                          return(0);
   
         if (MDOC_Std == v->arg && MDOC_Ex == n->tok) {          if (MDOC_Std == v->arg) {
                 /* `Nm' name must be set. */                  /* `Nm' name must be set. */
                 if (v->sz || m->meta.name)                  if (v->sz || m->meta.name)
                         return(1);                          return(1);
Line 674  check_text(struct mdoc *mdoc, int line, int pos, const
Line 688  check_text(struct mdoc *mdoc, int line, int pos, const
 {  {
         size_t           c;          size_t           c;
   
         /* XXX - indicate deprecated escapes \*(xx and \*x. */          /* FIXME: indicate deprecated escapes \*(xx and \*x. */
           /* FIXME: don't allow tabs unless in literal mode. */
   
         for ( ; *p; p++) {          for ( ; *p; p++) {
                 if ( ! isprint((u_char)*p) && '\t' != *p)                  if ('\t' != *p && ! isprint((u_char)*p))
                         return(mdoc_perr(mdoc, line, pos,                          return(perr(mdoc, line, pos, EPRINT));
                                 "invalid non-printing character"));  
                 if ('\\' != *p)                  if ('\\' != *p)
                         continue;                          continue;
                 if ((c = mdoc_isescape(p))) {                  if ((c = mdoc_isescape(p))) {
Line 1073  post_an(POST_ARGS)
Line 1087  post_an(POST_ARGS)
   
   
 static int  static int
 post_ex(POST_ARGS)  post_args(POST_ARGS)
 {  {
   
         if (mdoc->last->args)          if (mdoc->last->args)
Line 1176  post_it(POST_ARGS)
Line 1190  post_it(POST_ARGS)
                 if (mdoc->last->body->child)                  if (mdoc->last->body->child)
                         if ( ! mwarn(mdoc, WNOMULTILINE))                          if ( ! mwarn(mdoc, WNOMULTILINE))
                                 return(0);                                  return(0);
                 c = mdoc->last->head->child;                  c = mdoc->last->child;
                 for (i = 0; c; c = c->next)                  for (i = 0; c && MDOC_HEAD == c->type; c = c->next)
                         i++;                          i++;
                 if (i == cols)                  if (i == cols)
                         break;                          break;
                 if ( ! mdoc_warn(mdoc, WARN_SYNTAX,                  return(mdoc_err(mdoc, "column mismatch (have "
                                         "column mismatch (have %d, want %d)", i, cols))                                          "%d, want %d)", i, cols));
                         return(0);  
                 break;  
         default:          default:
                 break;                  break;
         }          }

Legend:
Removed from v.1.75  
changed lines
  Added in v.1.84

CVSweb