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

Diff for /mandoc/man.c between version 1.168 and 1.171

version 1.168, 2017/03/03 13:55:31 version 1.171, 2017/05/01 23:27:39
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011 Joerg Sonnenberger <joerg@netbsd.org>   * Copyright (c) 2011 Joerg Sonnenberger <joerg@netbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
Line 35 
Line 35 
 #include "roff_int.h"  #include "roff_int.h"
 #include "libman.h"  #include "libman.h"
   
 const   char *const __man_macronames[MAN_MAX] = {  
         "br",           "TH",           "SH",           "SS",  
         "TP",           "LP",           "PP",           "P",  
         "IP",           "HP",           "SM",           "SB",  
         "BI",           "IB",           "BR",           "RB",  
         "R",            "B",            "I",            "IR",  
         "RI",           "sp",           "nf",  
         "fi",           "RE",           "RS",           "DT",  
         "UC",           "PD",           "AT",           "in",  
         "ft",           "OP",           "EX",           "EE",  
         "UR",           "UE",           "ll"  
         };  
   
 const   char * const *man_macronames = __man_macronames;  
   
 static  void             man_descope(struct roff_man *, int, int);  static  void             man_descope(struct roff_man *, int, int);
 static  int              man_ptext(struct roff_man *, int, char *, int);  static  int              man_ptext(struct roff_man *, int, char *, int);
 static  int              man_pmacro(struct roff_man *, int, char *, int);  static  int              man_pmacro(struct roff_man *, int, char *, int);
Line 160  man_pmacro(struct roff_man *man, int ln, char *buf, in
Line 145  man_pmacro(struct roff_man *man, int ln, char *buf, in
 {  {
         struct roff_node *n;          struct roff_node *n;
         const char      *cp;          const char      *cp;
         int              tok;          size_t           sz;
         int              i, ppos;          enum roff_tok    tok;
           int              ppos;
         int              bline;          int              bline;
         char             mac[5];  
   
         ppos = offs;          /* Determine the line macro. */
   
         /*          ppos = offs;
          * Copy the first word into a nil-terminated buffer.          tok = TOKEN_NONE;
          * Stop when a space, tab, escape, or eoln is encountered.          for (sz = 0; sz < 4 && strchr(" \t\\", buf[offs]) == NULL; sz++)
          */                  offs++;
           if (sz > 0 && sz < 4)
         i = 0;                  tok = roffhash_find(man->manmac, buf + ppos, sz);
         while (i < 4 && strchr(" \t\\", buf[offs]) == NULL)  
                 mac[i++] = buf[offs++];  
   
         mac[i] = '\0';  
   
         tok = (i > 0 && i < 4) ? man_hash_find(mac) : TOKEN_NONE;  
   
         if (tok == TOKEN_NONE) {          if (tok == TOKEN_NONE) {
                 mandoc_msg(MANDOCERR_MACRO, man->parse,                  mandoc_msg(MANDOCERR_MACRO, man->parse,
                     ln, ppos, buf + ppos - 1);                      ln, ppos, buf + ppos - 1);
Line 223  man_pmacro(struct roff_man *man, int ln, char *buf, in
Line 201  man_pmacro(struct roff_man *man, int ln, char *buf, in
         man_breakscope(man, tok);          man_breakscope(man, tok);
         bline = man->flags & MAN_BLINE;          bline = man->flags & MAN_BLINE;
   
           /*
            * If the line in next-line scope ends with \c, keep the
            * next-line scope open for the subsequent input line.
            * That is not at all portable, only groff >= 1.22.4
            * does it, but *if* this weird idiom occurs in a manual
            * page, that's very likely what the author intended.
            */
   
           if (bline) {
                   cp = strchr(buf + offs, '\0') - 2;
                   if (cp >= buf && cp[0] == '\\' && cp[1] == 'c')
                           bline = 0;
           }
   
         /* Call to handler... */          /* Call to handler... */
   
         assert(man_macros[tok].fp);          assert(man_macros[tok].fp);
Line 275  man_breakscope(struct roff_man *man, int tok)
Line 267  man_breakscope(struct roff_man *man, int tok)
   
                 mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,                  mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,
                     n->line, n->pos, "%s breaks %s",                      n->line, n->pos, "%s breaks %s",
                     tok == TOKEN_NONE ? "TS" : man_macronames[tok],                      tok == TOKEN_NONE ? "TS" : roff_name[tok],
                     man_macronames[n->tok]);                      roff_name[n->tok]);
   
                 roff_node_delete(man, n);                  roff_node_delete(man, n);
                 man->flags &= ~MAN_ELINE;                  man->flags &= ~MAN_ELINE;
Line 317  man_breakscope(struct roff_man *man, int tok)
Line 309  man_breakscope(struct roff_man *man, int tok)
   
                 mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,                  mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,
                     n->line, n->pos, "%s breaks %s",                      n->line, n->pos, "%s breaks %s",
                     tok == TOKEN_NONE ? "TS" : man_macronames[tok],                      tok == TOKEN_NONE ? "TS" : roff_name[tok],
                     man_macronames[n->tok]);                      roff_name[n->tok]);
   
                 roff_node_delete(man, n);                  roff_node_delete(man, n);
                 man->flags &= ~MAN_BLINE;                  man->flags &= ~MAN_BLINE;

Legend:
Removed from v.1.168  
changed lines
  Added in v.1.171

CVSweb