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

Diff for /mandoc/roff_validate.c between version 1.6 and 1.20

version 1.6, 2017/06/04 22:44:15 version 1.20, 2020/06/22 19:20:40
Line 1 
Line 1 
 /*      $Id$ */  /* $Id$ */
 /*  /*
  * Copyright (c) 2010, 2017 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010, 2017, 2018, 2020 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 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.
  */   */
   #include "config.h"
   
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <stddef.h>  #include <stdio.h>
   #include <string.h>
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "roff.h"  #include "roff.h"
Line 28 
Line 31 
   
 typedef void    (*roff_valid_fp)(ROFF_VALID_ARGS);  typedef void    (*roff_valid_fp)(ROFF_VALID_ARGS);
   
   static  void      roff_valid_br(ROFF_VALID_ARGS);
   static  void      roff_valid_fi(ROFF_VALID_ARGS);
 static  void      roff_valid_ft(ROFF_VALID_ARGS);  static  void      roff_valid_ft(ROFF_VALID_ARGS);
   static  void      roff_valid_nf(ROFF_VALID_ARGS);
   static  void      roff_valid_sp(ROFF_VALID_ARGS);
   
 static  const roff_valid_fp roff_valids[ROFF_MAX] = {  static  const roff_valid_fp roff_valids[ROFF_MAX] = {
         NULL,  /* br */          roff_valid_br,  /* br */
           NULL,  /* ce */
           roff_valid_fi,  /* fi */
         roff_valid_ft,  /* ft */          roff_valid_ft,  /* ft */
         NULL,  /* ll */          NULL,  /* ll */
         NULL,  /* mc */          NULL,  /* mc */
         NULL,  /* sp */          roff_valid_nf,  /* nf */
           NULL,  /* po */
           NULL,  /* rj */
           roff_valid_sp,  /* sp */
         NULL,  /* ta */          NULL,  /* ta */
         NULL,  /* ti */          NULL,  /* ti */
 };  };
Line 53  roff_validate(struct roff_man *man)
Line 65  roff_validate(struct roff_man *man)
 }  }
   
 static void  static void
   roff_valid_br(ROFF_VALID_ARGS)
   {
           struct roff_node        *np;
   
           if (n->next != NULL && n->next->type == ROFFT_TEXT &&
               *n->next->string == ' ') {
                   mandoc_msg(MANDOCERR_PAR_SKIP, n->line, n->pos,
                       "br before text line with leading blank");
                   roff_node_delete(man, n);
                   return;
           }
   
           if ((np = roff_node_prev(n)) == NULL)
                   return;
   
           switch (np->tok) {
           case ROFF_br:
           case ROFF_sp:
           case MDOC_Pp:
                   mandoc_msg(MANDOCERR_PAR_SKIP,
                       n->line, n->pos, "br after %s", roff_name[np->tok]);
                   roff_node_delete(man, n);
                   break;
           default:
                   break;
           }
   }
   
   static void
   roff_valid_fi(ROFF_VALID_ARGS)
   {
           if ((n->flags & NODE_NOFILL) == 0)
                   mandoc_msg(MANDOCERR_FI_SKIP, n->line, n->pos, "fi");
   }
   
   static void
 roff_valid_ft(ROFF_VALID_ARGS)  roff_valid_ft(ROFF_VALID_ARGS)
 {  {
         char    *cp;          const char              *cp;
   
         if (n->child == NULL) {          if (n->child == NULL) {
                 man->next = ROFF_NEXT_CHILD;                  man->next = ROFF_NEXT_CHILD;
Line 65  roff_valid_ft(ROFF_VALID_ARGS)
Line 113  roff_valid_ft(ROFF_VALID_ARGS)
         }          }
   
         cp = n->child->string;          cp = n->child->string;
         switch (*cp) {          if (mandoc_font(cp, (int)strlen(cp)) != ESCAPE_ERROR)
         case '1':                  return;
         case '2':          mandoc_msg(MANDOCERR_FT_BAD, n->line, n->pos, "ft %s", cp);
         case '3':          roff_node_delete(man, n);
         case '4':  }
         case 'I':  
         case 'P':  static void
         case 'R':  roff_valid_nf(ROFF_VALID_ARGS)
                 if (cp[1] == '\0')  {
                         return;          if (n->flags & NODE_NOFILL)
                   mandoc_msg(MANDOCERR_NF_SKIP, n->line, n->pos, "nf");
   }
   
   static void
   roff_valid_sp(ROFF_VALID_ARGS)
   {
           struct roff_node        *np;
   
           if ((np = roff_node_prev(n)) == NULL)
                   return;
   
           switch (np->tok) {
           case ROFF_br:
                   mandoc_msg(MANDOCERR_PAR_SKIP,
                       np->line, np->pos, "br before sp");
                   roff_node_delete(man, np);
                 break;                  break;
         case 'B':          case MDOC_Pp:
                 if (cp[1] == '\0' || (cp[1] == 'I' && cp[2] == '\0'))                  mandoc_msg(MANDOCERR_PAR_SKIP,
                         return;                      n->line, n->pos, "sp after Pp");
                   roff_node_delete(man, n);
                 break;                  break;
         case 'C':  
                 if (cp[1] == 'W' && cp[2] == '\0')  
                         return;  
                 break;  
         default:          default:
                 break;                  break;
         }          }
   
         mandoc_vmsg(MANDOCERR_FT_BAD, man->parse,  
             n->line, n->pos, "ft %s", cp);  
         roff_node_delete(man, n);  
 }  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.20

CVSweb