[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.150 and 1.159

version 1.150, 2011/01/01 12:18:37 version 1.159, 2011/03/15 16:23:51
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
    * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * 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 53  enum check_ineq {
Line 54  enum check_ineq {
 enum    check_lvl {  enum    check_lvl {
         CHECK_WARN,          CHECK_WARN,
         CHECK_ERROR,          CHECK_ERROR,
         CHECK_FATAL  
 };  };
   
 typedef int     (*v_pre)(PRE_ARGS);  typedef int     (*v_pre)(PRE_ARGS);
Line 78  static int  concat(struct mdoc *, char *, 
Line 78  static int  concat(struct mdoc *, char *, 
 static  int      ebool(POST_ARGS);  static  int      ebool(POST_ARGS);
 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      eerr_eq0(POST_ARGS);  
 static  int      eerr_eq1(POST_ARGS);  
 static  int      eerr_ge1(POST_ARGS);  
 static  int      eerr_le1(POST_ARGS);  
 static  int      ewarn_eq0(POST_ARGS);  static  int      ewarn_eq0(POST_ARGS);
   static  int      ewarn_eq1(POST_ARGS);
 static  int      ewarn_ge1(POST_ARGS);  static  int      ewarn_ge1(POST_ARGS);
 static  int      herr_eq0(POST_ARGS);  static  int      ewarn_le1(POST_ARGS);
 static  int      herr_ge1(POST_ARGS);  
 static  int      hwarn_eq0(POST_ARGS);  static  int      hwarn_eq0(POST_ARGS);
 static  int      hwarn_eq1(POST_ARGS);  static  int      hwarn_eq1(POST_ARGS);
   static  int      hwarn_ge1(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 98  static int  post_bl_block(POST_ARGS);
Line 95  static int  post_bl_block(POST_ARGS);
 static  int      post_bl_block_width(POST_ARGS);  static  int      post_bl_block_width(POST_ARGS);
 static  int      post_bl_block_tag(POST_ARGS);  static  int      post_bl_block_tag(POST_ARGS);
 static  int      post_bl_head(POST_ARGS);  static  int      post_bl_head(POST_ARGS);
   static  int      post_bx(POST_ARGS);
 static  int      post_dd(POST_ARGS);  static  int      post_dd(POST_ARGS);
 static  int      post_dt(POST_ARGS);  static  int      post_dt(POST_ARGS);
 static  int      post_defaults(POST_ARGS);  static  int      post_defaults(POST_ARGS);
Line 106  static int  post_eoln(POST_ARGS);
Line 104  static int  post_eoln(POST_ARGS);
 static  int      post_it(POST_ARGS);  static  int      post_it(POST_ARGS);
 static  int      post_lb(POST_ARGS);  static  int      post_lb(POST_ARGS);
 static  int      post_nm(POST_ARGS);  static  int      post_nm(POST_ARGS);
   static  int      post_ns(POST_ARGS);
 static  int      post_os(POST_ARGS);  static  int      post_os(POST_ARGS);
 static  int      post_ignpar(POST_ARGS);  static  int      post_ignpar(POST_ARGS);
 static  int      post_prol(POST_ARGS);  static  int      post_prol(POST_ARGS);
Line 137  static v_post  posts_bd[] = { post_literal, hwarn_eq0,
Line 136  static v_post  posts_bd[] = { post_literal, hwarn_eq0,
 static  v_post   posts_bf[] = { hwarn_le1, post_bf, NULL };  static  v_post   posts_bf[] = { hwarn_le1, post_bf, NULL };
 static  v_post   posts_bk[] = { hwarn_eq0, bwarn_ge1, NULL };  static  v_post   posts_bk[] = { hwarn_eq0, bwarn_ge1, 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_bx[] = { post_bx, NULL };
   static  v_post   posts_bool[] = { ebool, NULL };
 static  v_post   posts_eoln[] = { post_eoln, NULL };  static  v_post   posts_eoln[] = { post_eoln, NULL };
 static  v_post   posts_defaults[] = { post_defaults, NULL };  static  v_post   posts_defaults[] = { post_defaults, NULL };
 static  v_post   posts_dd[] = { ewarn_ge1, post_dd, post_prol, NULL };  static  v_post   posts_dd[] = { post_dd, post_prol, NULL };
 static  v_post   posts_dl[] = { post_literal, bwarn_ge1, herr_eq0, NULL };  static  v_post   posts_dl[] = { post_literal, bwarn_ge1, NULL };
 static  v_post   posts_dt[] = { post_dt, post_prol, NULL };  static  v_post   posts_dt[] = { post_dt, post_prol, NULL };
 static  v_post   posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL };  static  v_post   posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL };
 static  v_post   posts_it[] = { post_it, NULL };  static  v_post   posts_it[] = { post_it, NULL };
 static  v_post   posts_lb[] = { eerr_eq1, post_lb, NULL };  static  v_post   posts_lb[] = { post_lb, NULL };
 static  v_post   posts_nd[] = { berr_ge1, NULL };  static  v_post   posts_nd[] = { berr_ge1, NULL };
 static  v_post   posts_nm[] = { post_nm, NULL };  static  v_post   posts_nm[] = { post_nm, NULL };
 static  v_post   posts_notext[] = { ewarn_eq0, NULL };  static  v_post   posts_notext[] = { ewarn_eq0, NULL };
   static  v_post   posts_ns[] = { post_ns, NULL };
 static  v_post   posts_os[] = { post_os, post_prol, NULL };  static  v_post   posts_os[] = { post_os, post_prol, NULL };
 static  v_post   posts_rs[] = { berr_ge1, herr_eq0, post_rs, NULL };  static  v_post   posts_rs[] = { post_rs, NULL };
 static  v_post   posts_sh[] = { post_ignpar, herr_ge1, bwarn_ge1, post_sh, NULL };  static  v_post   posts_sh[] = { post_ignpar, hwarn_ge1, bwarn_ge1, post_sh, NULL };
 static  v_post   posts_sp[] = { eerr_le1, NULL };  static  v_post   posts_sp[] = { ewarn_le1, NULL };
 static  v_post   posts_ss[] = { post_ignpar, herr_ge1, bwarn_ge1, NULL };  static  v_post   posts_ss[] = { post_ignpar, hwarn_ge1, bwarn_ge1, NULL };
 static  v_post   posts_st[] = { eerr_eq1, post_st, NULL };  static  v_post   posts_st[] = { post_st, NULL };
 static  v_post   posts_std[] = { post_std, NULL };  static  v_post   posts_std[] = { post_std, NULL };
 static  v_post   posts_text[] = { eerr_ge1, NULL };  static  v_post   posts_text[] = { ewarn_ge1, NULL };
 static  v_post   posts_text1[] = { eerr_eq1, NULL };  static  v_post   posts_text1[] = { ewarn_eq1, NULL };
 static  v_post   posts_vt[] = { post_vt, 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, NULL };
 static  v_post   posts_wtext[] = { 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, pre_literal, pre_par, NULL };  static  v_pre    pres_bd[] = { pre_display, pre_bd, pre_literal, pre_par, NULL };
 static  v_pre    pres_bl[] = { pre_bl, pre_par, NULL };  static  v_pre    pres_bl[] = { pre_bl, pre_par, NULL };
Line 192  const struct valids mdoc_valids[MDOC_MAX] = {
Line 192  const struct valids mdoc_valids[MDOC_MAX] = {
         { pres_bl, posts_bl },                  /* Bl */          { pres_bl, posts_bl },                  /* Bl */
         { NULL, NULL },                         /* El */          { NULL, NULL },                         /* El */
         { pres_it, posts_it },                  /* It */          { pres_it, posts_it },                  /* It */
         { NULL, posts_text },                   /* Ad */          { NULL, NULL },                         /* Ad */
         { pres_an, posts_an },                  /* An */          { pres_an, posts_an },                  /* An */
         { NULL, posts_defaults },               /* Ar */          { NULL, posts_defaults },               /* Ar */
         { NULL, posts_text },                   /* Cd */          { NULL, NULL },                         /* Cd */
         { NULL, NULL },                         /* Cm */          { NULL, NULL },                         /* Cm */
         { NULL, NULL },                         /* Dv */          { NULL, NULL },                         /* Dv */
         { pres_er, posts_text },                /* Er */          { pres_er, NULL },                      /* Er */
         { NULL, NULL },                         /* Ev */          { NULL, NULL },                         /* Ev */
         { pres_std, posts_std },                /* Ex */          { pres_std, posts_std },                /* Ex */
         { NULL, NULL },                         /* Fa */          { NULL, NULL },                         /* Fa */
         { pres_fd, posts_wtext },               /* Fd */          { pres_fd, posts_text },                /* Fd */
         { NULL, NULL },                         /* Fl */          { NULL, NULL },                         /* Fl */
         { NULL, posts_text },                   /* Fn */          { NULL, NULL },                         /* Fn */
         { NULL, posts_wtext },                  /* Ft */          { NULL, NULL },                         /* Ft */
         { NULL, posts_text },                   /* Ic */          { NULL, NULL },                         /* Ic */
         { NULL, posts_text1 },                  /* In */          { NULL, posts_text1 },                  /* In */
         { NULL, posts_defaults },               /* Li */          { NULL, posts_defaults },               /* Li */
         { NULL, posts_nd },                     /* Nd */          { NULL, posts_nd },                     /* Nd */
Line 218  const struct valids mdoc_valids[MDOC_MAX] = {
Line 218  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, posts_st },                     /* St */          { NULL, posts_st },                     /* St */
         { NULL, NULL },                         /* Va */          { NULL, NULL },                         /* Va */
         { NULL, posts_vt },                     /* Vt */          { NULL, posts_vt },                     /* Vt */
         { NULL, posts_wtext },                  /* Xr */          { NULL, posts_text },                   /* 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 */ /* FIXME: check date with mandoc_a2time(). */          { NULL, posts_text },                   /* %D */
         { 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 239  const struct valids mdoc_valids[MDOC_MAX] = {
Line 239  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, NULL },                         /* Bo */          { NULL, NULL },                         /* Bo */
         { NULL, NULL },                         /* Bq */          { NULL, NULL },                         /* Bq */
         { NULL, NULL },                         /* Bsx */          { NULL, NULL },                         /* Bsx */
         { NULL, NULL },                         /* Bx */          { NULL, posts_bx },                     /* Bx */
         { NULL, posts_bool },                   /* Db */          { NULL, posts_bool },                   /* Db */
         { NULL, NULL },                         /* Dc */          { NULL, NULL },                         /* Dc */
         { NULL, NULL },                         /* Do */          { NULL, NULL },                         /* Do */
Line 249  const struct valids mdoc_valids[MDOC_MAX] = {
Line 249  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, NULL },                         /* Em */          { NULL, NULL },                         /* Em */
         { NULL, NULL },                         /* Eo */          { NULL, NULL },                         /* Eo */
         { NULL, NULL },                         /* Fx */          { NULL, NULL },                         /* Fx */
         { NULL, posts_text },                   /* Ms */          { NULL, NULL },                         /* Ms */
         { NULL, posts_notext },                 /* No */          { NULL, posts_notext },                 /* No */
         { NULL, posts_notext },                 /* Ns */          { NULL, posts_ns },                     /* Ns */
         { NULL, NULL },                         /* Nx */          { NULL, NULL },                         /* Nx */
         { NULL, NULL },                         /* Ox */          { NULL, NULL },                         /* Ox */
         { NULL, NULL },                         /* Pc */          { NULL, NULL },                         /* Pc */
Line 268  const struct valids mdoc_valids[MDOC_MAX] = {
Line 268  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, NULL },                         /* So */          { NULL, NULL },                         /* So */
         { NULL, NULL },                         /* Sq */          { NULL, NULL },                         /* Sq */
         { NULL, posts_bool },                   /* Sm */          { NULL, posts_bool },                   /* Sm */
         { NULL, posts_text },                   /* Sx */          { NULL, NULL },                         /* Sx */
         { NULL, posts_text },                   /* Sy */          { NULL, NULL },                         /* Sy */
         { NULL, posts_text },                   /* Tn */          { NULL, NULL },                         /* Tn */
         { NULL, NULL },                         /* Ux */          { NULL, NULL },                         /* Ux */
         { NULL, NULL },                         /* Xc */          { NULL, NULL },                         /* Xc */
         { NULL, NULL },                         /* Xo */          { NULL, NULL },                         /* Xo */
Line 286  const struct valids mdoc_valids[MDOC_MAX] = {
Line 286  const struct valids mdoc_valids[MDOC_MAX] = {
         { NULL, posts_eoln },                   /* Ud */          { NULL, posts_eoln },                   /* Ud */
         { NULL, posts_lb },                     /* Lb */          { NULL, posts_lb },                     /* Lb */
         { NULL, posts_notext },                 /* Lp */          { NULL, posts_notext },                 /* Lp */
         { NULL, posts_text },                   /* Lk */          { NULL, NULL },                         /* Lk */
         { NULL, posts_defaults },               /* Mt */          { NULL, posts_defaults },               /* Mt */
         { NULL, NULL },                         /* Brq */          { NULL, NULL },                         /* Brq */
         { NULL, NULL },                         /* Bro */          { NULL, NULL },                         /* Bro */
Line 338  mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *n)
Line 338  mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *n)
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_TBL):          case (MDOC_TBL):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case (MDOC_EQN):
                   /* FALLTHROUGH */
         case (MDOC_ROOT):          case (MDOC_ROOT):
                 return(1);                  return(1);
         default:          default:
Line 367  mdoc_valid_post(struct mdoc *mdoc)
Line 369  mdoc_valid_post(struct mdoc *mdoc)
         switch (mdoc->last->type) {          switch (mdoc->last->type) {
         case (MDOC_TEXT):          case (MDOC_TEXT):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case (MDOC_EQN):
                   /* FALLTHROUGH */
         case (MDOC_TBL):          case (MDOC_TBL):
                 return(1);                  return(1);
         case (MDOC_ROOT):          case (MDOC_ROOT):
Line 389  check_count(struct mdoc *m, enum mdoc_type type, 
Line 393  check_count(struct mdoc *m, enum mdoc_type type, 
                 enum check_lvl lvl, enum check_ineq ineq, int val)                  enum check_lvl lvl, enum check_ineq ineq, int val)
 {  {
         const char      *p;          const char      *p;
           enum mandocerr   t;
   
         if (m->last->type != type)          if (m->last->type != type)
                 return(1);                  return(1);
Line 400  check_count(struct mdoc *m, enum mdoc_type type, 
Line 405  check_count(struct mdoc *m, enum mdoc_type type, 
                         return(1);                          return(1);
                 break;                  break;
         case (CHECK_GT):          case (CHECK_GT):
                 p = "greater than ";                  p = "more than ";
                 if (m->last->nchild > val)                  if (m->last->nchild > val)
                         return(1);                          return(1);
                 break;                  break;
Line 414  check_count(struct mdoc *m, enum mdoc_type type, 
Line 419  check_count(struct mdoc *m, enum mdoc_type type, 
                 /* NOTREACHED */                  /* NOTREACHED */
         }          }
   
         if (CHECK_WARN == lvl) {          t = lvl == CHECK_WARN ? MANDOCERR_ARGCWARN : MANDOCERR_ARGCOUNT;
                 return(mdoc_vmsg(m, MANDOCERR_ARGCOUNT,  
                                 m->last->line, m->last->pos,  
                                 "want %s%d children (have %d)",  
                                 p, val, m->last->nchild));  
         }  
   
         /* FIXME: THIS IS THE SAME AS THE ABOVE. */          return(mdoc_vmsg(m, t, m->last->line, m->last->pos,
                           "want %s%d children (have %d)",
         return(mdoc_vmsg(m, MANDOCERR_ARGCOUNT,  
                         m->last->line, m->last->pos,  
                         "require %s%d children (have %d)",  
                         p, val, m->last->nchild));                          p, val, m->last->nchild));
 }  }
   
Line 433  static int
Line 430  static int
 berr_ge1(POST_ARGS)  berr_ge1(POST_ARGS)
 {  {
   
         return(check_count(mdoc, MDOC_BODY, CHECK_FATAL, CHECK_GT, 0));          return(check_count(mdoc, MDOC_BODY, CHECK_ERROR, CHECK_GT, 0));
 }  }
   
 static int  static int
Line 443  bwarn_ge1(POST_ARGS)
Line 440  bwarn_ge1(POST_ARGS)
 }  }
   
 static int  static int
 eerr_eq0(POST_ARGS)  ewarn_eq0(POST_ARGS)
 {  {
         return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_EQ, 0));          return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0));
 }  }
   
 static int  static int
 eerr_eq1(POST_ARGS)  ewarn_eq1(POST_ARGS)
 {  {
         return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_EQ, 1));          return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1));
 }  }
   
 static int  static int
 eerr_ge1(POST_ARGS)  
 {  
         return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_GT, 0));  
 }  
   
 static int  
 eerr_le1(POST_ARGS)  
 {  
         return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_LT, 2));  
 }  
   
 static int  
 ewarn_eq0(POST_ARGS)  
 {  
         return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0));  
 }  
   
 static int  
 ewarn_ge1(POST_ARGS)  ewarn_ge1(POST_ARGS)
 {  {
         return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_GT, 0));          return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_GT, 0));
 }  }
   
 static int  static int
 herr_eq0(POST_ARGS)  ewarn_le1(POST_ARGS)
 {  {
         return(check_count(mdoc, MDOC_HEAD, CHECK_FATAL, CHECK_EQ, 0));          return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_LT, 2));
 }  }
   
 static int  static int
 herr_ge1(POST_ARGS)  
 {  
         return(check_count(mdoc, MDOC_HEAD, CHECK_FATAL, CHECK_GT, 0));  
 }  
   
 static int  
 hwarn_eq0(POST_ARGS)  hwarn_eq0(POST_ARGS)
 {  {
         return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_EQ, 0));          return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_EQ, 0));
Line 503  hwarn_eq1(POST_ARGS)
Line 476  hwarn_eq1(POST_ARGS)
 }  }
   
 static int  static int
   hwarn_ge1(POST_ARGS)
   {
           return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_GT, 0));
   }
   
   static int
 hwarn_le1(POST_ARGS)  hwarn_le1(POST_ARGS)
 {  {
         return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_LT, 2));          return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_LT, 2));
Line 940  static int
Line 919  static int
 pre_dt(PRE_ARGS)  pre_dt(PRE_ARGS)
 {  {
   
         if (0 == mdoc->meta.date || mdoc->meta.os)          if (NULL == mdoc->meta.date || mdoc->meta.os)
                 mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);                  mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);
   
         if (mdoc->meta.title)          if (mdoc->meta.title)
Line 953  static int
Line 932  static int
 pre_os(PRE_ARGS)  pre_os(PRE_ARGS)
 {  {
   
         if (NULL == mdoc->meta.title || 0 == mdoc->meta.date)          if (NULL == mdoc->meta.title || NULL == mdoc->meta.date)
                 mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);                  mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);
   
         if (mdoc->meta.os)          if (mdoc->meta.os)
Line 1055  post_lb(POST_ARGS)
Line 1034  post_lb(POST_ARGS)
         char            *buf;          char            *buf;
         size_t           sz;          size_t           sz;
   
           check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1);
   
         assert(mdoc->last->child);          assert(mdoc->last->child);
         assert(MDOC_TEXT == mdoc->last->child->type);          assert(MDOC_TEXT == mdoc->last->child->type);
   
Line 1098  post_vt(POST_ARGS)
Line 1079  post_vt(POST_ARGS)
         /*          /*
          * The Vt macro comes in both ELEM and BLOCK form, both of which           * The Vt macro comes in both ELEM and BLOCK form, both of which
          * have different syntaxes (yet more context-sensitive           * have different syntaxes (yet more context-sensitive
          * behaviour).  ELEM types must have a child; BLOCK types,           * behaviour).  ELEM types must have a child, which is already
            * guaranteed by the in_line parsing routine; BLOCK types,
          * specifically the BODY, should only have TEXT children.           * specifically the BODY, should only have TEXT children.
          */           */
   
         if (MDOC_ELEM == mdoc->last->type)  
                 return(eerr_ge1(mdoc));  
         if (MDOC_BODY != mdoc->last->type)          if (MDOC_BODY != mdoc->last->type)
                 return(1);                  return(1);
   
Line 1247  post_an(POST_ARGS)
Line 1227  post_an(POST_ARGS)
         struct mdoc_node *np;          struct mdoc_node *np;
   
         np = mdoc->last;          np = mdoc->last;
         if (AUTH__NONE != np->norm->An.auth && np->child)          if (AUTH__NONE == np->norm->An.auth) {
                 return(eerr_eq0(mdoc));                  if (0 == np->child)
                           check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_GT, 0);
           } else if (np->child)
                   check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0);
   
         /*  
          * FIXME: make this ewarn and make sure that the front-ends  
          * don't print the arguments.  
          */  
         if (AUTH__NONE != np->norm->An.auth || np->child)  
                 return(1);  
   
         mdoc_nmsg(mdoc, np, MANDOCERR_NOARGS);  
         return(1);          return(1);
 }  }
   
Line 1590  static int
Line 1565  static int
 ebool(struct mdoc *mdoc)  ebool(struct mdoc *mdoc)
 {  {
   
         if (NULL == mdoc->last->child)          if (NULL == mdoc->last->child) {
                   mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_MACROEMPTY);
                   mdoc_node_delete(mdoc, mdoc->last);
                 return(1);                  return(1);
           }
           check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1);
   
         assert(MDOC_TEXT == mdoc->last->child->type);          assert(MDOC_TEXT == mdoc->last->child->type);
   
Line 1640  post_root(POST_ARGS)
Line 1619  post_root(POST_ARGS)
 static int  static int
 post_st(POST_ARGS)  post_st(POST_ARGS)
 {  {
         const char      *p;          struct mdoc_node         *ch;
           const char               *p;
   
         assert(MDOC_TEXT == mdoc->last->child->type);          if (NULL == (ch = mdoc->last->child)) {
                   mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_MACROEMPTY);
                   mdoc_node_delete(mdoc, mdoc->last);
                   return(1);
           }
   
         p = mdoc_a2st(mdoc->last->child->string);          assert(MDOC_TEXT == ch->type);
   
         if (p == NULL) {          if (NULL == (p = mdoc_a2st(ch->string))) {
                 mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD);                  mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD);
                 mdoc_node_delete(mdoc, mdoc->last);                  mdoc_node_delete(mdoc, mdoc->last);
         } else {          } else {
                 free(mdoc->last->child->string);                  free(ch->string);
                 mdoc->last->child->string = mandoc_strdup(p);                  ch->string = mandoc_strdup(p);
         }          }
   
         return(1);          return(1);
Line 1663  post_rs(POST_ARGS)
Line 1647  post_rs(POST_ARGS)
         struct mdoc_node *nn, *next, *prev;          struct mdoc_node *nn, *next, *prev;
         int               i, j;          int               i, j;
   
         if (MDOC_BODY != mdoc->last->type)          switch (mdoc->last->type) {
           case (MDOC_HEAD):
                   check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_EQ, 0);
                 return(1);                  return(1);
           case (MDOC_BODY):
                   if (mdoc->last->child)
                           break;
                   check_count(mdoc, MDOC_BODY, CHECK_WARN, CHECK_GT, 0);
                   return(1);
           default:
                   return(1);
           }
   
         /*          /*
          * Make sure only certain types of nodes are allowed within the           * Make sure only certain types of nodes are allowed within the
Line 1679  post_rs(POST_ARGS)
Line 1673  post_rs(POST_ARGS)
                                 break;                                  break;
   
                 if (i < RSORD_MAX) {                  if (i < RSORD_MAX) {
                         if (MDOC__J == rsord[i])                          if (MDOC__J == rsord[i] || MDOC__B == rsord[i])
                                 mdoc->last->norm->Rs.child_J = nn;                                  mdoc->last->norm->Rs.quote_T++;
                         next = nn->next;                          next = nn->next;
                         continue;                          continue;
                 }                  }
Line 1756  post_rs(POST_ARGS)
Line 1750  post_rs(POST_ARGS)
 }  }
   
 static int  static int
   post_ns(POST_ARGS)
   {
   
           if (MDOC_LINE & mdoc->last->flags)
                   mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_IGNNS);
           return(1);
   }
   
   static int
 post_sh(POST_ARGS)  post_sh(POST_ARGS)
 {  {
   
Line 1968  post_dd(POST_ARGS)
Line 1971  post_dd(POST_ARGS)
         char              buf[DATESIZE];          char              buf[DATESIZE];
         struct mdoc_node *n;          struct mdoc_node *n;
   
         n = mdoc->last;          if (mdoc->meta.date)
                   free(mdoc->meta.date);
   
         if (NULL == n->child) {          n = mdoc->last;
                 mdoc->meta.date = time(NULL);          if (NULL == n->child || '\0' == n->child->string[0]) {
                   mdoc->meta.date = mandoc_normdate(NULL,
                       mdoc->msg, mdoc->data, n->line, n->pos);
                 return(1);                  return(1);
         }          }
   
         if ( ! concat(mdoc, buf, n->child, DATESIZE))          if ( ! concat(mdoc, buf, n->child, DATESIZE))
                 return(0);                  return(0);
   
         mdoc->meta.date = mandoc_a2time          mdoc->meta.date = mandoc_normdate(buf,
                 (MTIME_MDOCDATE | MTIME_CANONICAL, buf);              mdoc->msg, mdoc->data, n->line, n->pos);
   
         if (0 == mdoc->meta.date) {  
                 mdoc_nmsg(mdoc, n, MANDOCERR_BADDATE);  
                 mdoc->meta.date = time(NULL);  
         }  
   
         return(1);          return(1);
 }  }
   
Line 2109  post_prol(POST_ARGS)
Line 2110  post_prol(POST_ARGS)
         mdoc_node_delete(mdoc, mdoc->last);          mdoc_node_delete(mdoc, mdoc->last);
         if (mdoc->meta.title && mdoc->meta.date && mdoc->meta.os)          if (mdoc->meta.title && mdoc->meta.date && mdoc->meta.os)
                 mdoc->flags |= MDOC_PBODY;                  mdoc->flags |= MDOC_PBODY;
   
           return(1);
   }
   
   static int
   post_bx(POST_ARGS)
   {
           struct mdoc_node        *n;
   
           /*
            * Make `Bx's second argument always start with an uppercase
            * letter.  Groff checks if it's an "accepted" term, but we just
            * uppercase blindly.
            */
   
           n = mdoc->last->child;
           if (n && NULL != (n = n->next))
                   *n->string = (char)toupper
                           ((unsigned char)*n->string);
   
         return(1);          return(1);
 }  }

Legend:
Removed from v.1.150  
changed lines
  Added in v.1.159

CVSweb