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

Diff for /mandoc/roff.c between version 1.193 and 1.197

version 1.193, 2014/02/14 23:05:20 version 1.197, 2014/03/07 18:37:37
Line 42  enum rofft {
Line 42  enum rofft {
         ROFF_am1,          ROFF_am1,
         ROFF_as,          ROFF_as,
         ROFF_cc,          ROFF_cc,
           ROFF_ce,
         ROFF_de,          ROFF_de,
         ROFF_dei,          ROFF_dei,
         ROFF_de1,          ROFF_de1,
Line 71  enum rofft {
Line 72  enum rofft {
         ROFF_EQ,          ROFF_EQ,
         ROFF_EN,          ROFF_EN,
         ROFF_cblock,          ROFF_cblock,
         ROFF_ccond,  
         ROFF_USERDEF,          ROFF_USERDEF,
         ROFF_MAX          ROFF_MAX
 };  };
Line 179  static enum rofferr  roff_block_text(ROFF_ARGS);
Line 179  static enum rofferr  roff_block_text(ROFF_ARGS);
 static  enum rofferr     roff_block_sub(ROFF_ARGS);  static  enum rofferr     roff_block_sub(ROFF_ARGS);
 static  enum rofferr     roff_cblock(ROFF_ARGS);  static  enum rofferr     roff_cblock(ROFF_ARGS);
 static  enum rofferr     roff_cc(ROFF_ARGS);  static  enum rofferr     roff_cc(ROFF_ARGS);
 static  enum rofferr     roff_ccond(ROFF_ARGS);  static  void             roff_ccond(struct roff *, int, int);
 static  enum rofferr     roff_cond(ROFF_ARGS);  static  enum rofferr     roff_cond(ROFF_ARGS);
 static  enum rofferr     roff_cond_text(ROFF_ARGS);  static  enum rofferr     roff_cond_text(ROFF_ARGS);
 static  enum rofferr     roff_cond_sub(ROFF_ARGS);  static  enum rofferr     roff_cond_sub(ROFF_ARGS);
Line 236  static struct roffmac  roffs[ROFF_MAX] = {
Line 236  static struct roffmac  roffs[ROFF_MAX] = {
         { "am1", roff_block, roff_block_text, roff_block_sub, 0, NULL },          { "am1", roff_block, roff_block_text, roff_block_sub, 0, NULL },
         { "as", roff_ds, NULL, NULL, 0, NULL },          { "as", roff_ds, NULL, NULL, 0, NULL },
         { "cc", roff_cc, NULL, NULL, 0, NULL },          { "cc", roff_cc, NULL, NULL, 0, NULL },
           { "ce", roff_line_ignore, NULL, NULL, 0, NULL },
         { "de", roff_block, roff_block_text, roff_block_sub, 0, NULL },          { "de", roff_block, roff_block_text, roff_block_sub, 0, NULL },
         { "dei", roff_block, roff_block_text, roff_block_sub, 0, NULL },          { "dei", roff_block, roff_block_text, roff_block_sub, 0, NULL },
         { "de1", roff_block, roff_block_text, roff_block_sub, 0, NULL },          { "de1", roff_block, roff_block_text, roff_block_sub, 0, NULL },
Line 265  static struct roffmac  roffs[ROFF_MAX] = {
Line 266  static struct roffmac  roffs[ROFF_MAX] = {
         { "EQ", roff_EQ, NULL, NULL, 0, NULL },          { "EQ", roff_EQ, NULL, NULL, 0, NULL },
         { "EN", roff_EN, NULL, NULL, 0, NULL },          { "EN", roff_EN, NULL, NULL, 0, NULL },
         { ".", roff_cblock, NULL, NULL, 0, NULL },          { ".", roff_cblock, NULL, NULL, 0, NULL },
         { "\\}", roff_ccond, NULL, NULL, 0, NULL },  
         { NULL, roff_userdef, NULL, NULL, 0, NULL },          { NULL, roff_userdef, NULL, NULL, 0, NULL },
 };  };
   
Line 788  roff_parse(struct roff *r, const char *buf, int *pos)
Line 788  roff_parse(struct roff *r, const char *buf, int *pos)
                         '\t' == buf[*pos] || ' ' == buf[*pos])                          '\t' == buf[*pos] || ' ' == buf[*pos])
                 return(ROFF_MAX);                  return(ROFF_MAX);
   
         /*          /* We stop the macro parse at an escape, tab, space, or nil. */
          * We stop the macro parse at an escape, tab, space, or nil.  
          * However, `\}' is also a valid macro, so make sure we don't  
          * clobber it by seeing the `\' as the end of token.  
          */  
   
         mac = buf + *pos;          mac = buf + *pos;
         maclen = strcspn(mac + 1, " \\\t\0") + 1;          maclen = strcspn(mac, " \\\t\0");
   
         t = (r->current_string = roff_getstrn(r, mac, maclen))          t = (r->current_string = roff_getstrn(r, mac, maclen))
             ? ROFF_USERDEF : roffhash_find(mac, maclen);              ? ROFF_USERDEF : roffhash_find(mac, maclen);
Line 864  roffnode_cleanscope(struct roff *r)
Line 860  roffnode_cleanscope(struct roff *r)
 }  }
   
   
 /* ARGSUSED */  static void
 static enum rofferr  roff_ccond(struct roff *r, int ln, int ppos)
 roff_ccond(ROFF_ARGS)  
 {  {
   
         if (NULL == r->last) {          if (NULL == r->last) {
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);
                 return(ROFF_IGN);                  return;
         }          }
   
         switch (r->last->tok) {          switch (r->last->tok) {
Line 883  roff_ccond(ROFF_ARGS)
Line 878  roff_ccond(ROFF_ARGS)
                 break;                  break;
         default:          default:
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);
                 return(ROFF_IGN);                  return;
         }          }
   
         if (r->last->endspan > -1) {          if (r->last->endspan > -1) {
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);
                 return(ROFF_IGN);                  return;
         }          }
   
         if ((*bufp)[pos])  
                 mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL);  
   
         roffnode_pop(r);          roffnode_pop(r);
         roffnode_cleanscope(r);          roffnode_cleanscope(r);
         return(ROFF_IGN);          return;
 }  }
   
   
Line 1071  roff_cond_sub(ROFF_ARGS)
Line 1063  roff_cond_sub(ROFF_ARGS)
          */           */
   
         if ((ROFF_MAX != t) &&          if ((ROFF_MAX != t) &&
             (ROFF_ccond == t || ROFFRULE_ALLOW == rr ||              (ROFFRULE_ALLOW == rr ||
              ROFFMAC_STRUCT & roffs[t].flags)) {               ROFFMAC_STRUCT & roffs[t].flags)) {
                 assert(roffs[t].proc);                  assert(roffs[t].proc);
                 return((*roffs[t].proc)(r, t, bufp, szp,                  return((*roffs[t].proc)(r, t, bufp, szp,
                                         ln, ppos, pos, offs));                                          ln, ppos, pos, offs));
         }          }
   
         /* Always check for the closing delimiter `\}'. */          /*
            * If `\}' occurs on a macro line without a preceding macro,
            * drop the line completely.
            */
   
         ep = &(*bufp)[pos];          ep = *bufp + pos;
         while (NULL != (ep = strchr(ep, '\\'))) {          if ('\\' == ep[0] && '}' == ep[1])
                 if ('}' != *(++ep))                  rr = ROFFRULE_DENY;
                         continue;  
   
                 /*          /* Always check for the closing delimiter `\}'. */
                  * If we're at the end of line, then just chop  
                  * off the \} and resize the buffer.  
                  * If we aren't, then convert it to spaces.  
                  */  
   
                 if ('\0' == *(ep + 1)) {          while (NULL != (ep = strchr(ep, '\\'))) {
                         *--ep = '\0';                  if ('}' == *(++ep)) {
                         *szp -= 2;                          *ep = '&';
                 } else                          roff_ccond(r, ln, ep - *bufp - 1);
                         *(ep - 1) = *ep = ' ';                  }
                   ++ep;
                 roff_ccond(r, ROFF_ccond, bufp, szp,  
                                 ln, pos, pos + 2, offs);  
                 break;  
         }          }
         return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);          return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);
 }  }
Line 1114  roff_cond_text(ROFF_ARGS)
Line 1101  roff_cond_text(ROFF_ARGS)
         rr = r->last->rule;          rr = r->last->rule;
         roffnode_cleanscope(r);          roffnode_cleanscope(r);
   
         ep = &(*bufp)[pos];          ep = *bufp + pos;
         for ( ; NULL != (ep = strchr(ep, '\\')); ep++) {          while (NULL != (ep = strchr(ep, '\\'))) {
                 ep++;                  if ('}' == *(++ep)) {
                 if ('}' != *ep)                          *ep = '&';
                         continue;                          roff_ccond(r, ln, ep - *bufp - 1);
                 *ep = '&';                  }
                 roff_ccond(r, ROFF_ccond, bufp, szp,                  ++ep;
                                 ln, pos, pos + 2, offs);  
         }          }
         return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);          return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);
 }  }

Legend:
Removed from v.1.193  
changed lines
  Added in v.1.197

CVSweb