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

Diff for /mandoc/roff.c between version 1.226 and 1.231

version 1.226, 2014/08/19 16:52:32 version 1.231, 2014/10/16 01:28:38
Line 60  enum rofft {
Line 60  enum rofft {
         ROFF_nh,          ROFF_nh,
         ROFF_nr,          ROFF_nr,
         ROFF_ns,          ROFF_ns,
           ROFF_pl,
         ROFF_ps,          ROFF_ps,
         ROFF_rm,          ROFF_rm,
         ROFF_rr,          ROFF_rr,
Line 119  struct roff {
Line 120  struct roff {
         struct eqn_node *last_eqn; /* last equation parsed */          struct eqn_node *last_eqn; /* last equation parsed */
         struct eqn_node *first_eqn; /* first equation parsed */          struct eqn_node *first_eqn; /* first equation parsed */
         struct eqn_node *eqn; /* current equation being parsed */          struct eqn_node *eqn; /* current equation being parsed */
           int              eqn_inline; /* current equation is inline */
         int              options; /* parse options */          int              options; /* parse options */
         int              rstacksz; /* current size limit of rstack */          int              rstacksz; /* current size limit of rstack */
         int              rstackpos; /* position in rstack */          int              rstackpos; /* position in rstack */
           int              format; /* current file in mdoc or man format */
         char             control; /* control character */          char             control; /* control character */
 };  };
   
Line 181  static enum rofferr  roff_cond(ROFF_ARGS);
Line 184  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);
 static  enum rofferr     roff_ds(ROFF_ARGS);  static  enum rofferr     roff_ds(ROFF_ARGS);
   static  enum rofferr     roff_eqndelim(struct roff *,
                                   char **, size_t *, int);
 static  int              roff_evalcond(const char *, int *);  static  int              roff_evalcond(const char *, int *);
 static  int              roff_evalnum(const char *, int *, int *, int);  static  int              roff_evalnum(const char *, int *, int *, int);
 static  int              roff_evalpar(const char *, int *, int *);  static  int              roff_evalpar(const char *, int *, int *);
Line 255  static struct roffmac  roffs[ROFF_MAX] = {
Line 260  static struct roffmac  roffs[ROFF_MAX] = {
         { "nh", roff_line_ignore, NULL, NULL, 0, NULL },          { "nh", roff_line_ignore, NULL, NULL, 0, NULL },
         { "nr", roff_nr, NULL, NULL, 0, NULL },          { "nr", roff_nr, NULL, NULL, 0, NULL },
         { "ns", roff_line_ignore, NULL, NULL, 0, NULL },          { "ns", roff_line_ignore, NULL, NULL, 0, NULL },
           { "pl", roff_line_ignore, NULL, NULL, 0, NULL },
         { "ps", roff_line_ignore, NULL, NULL, 0, NULL },          { "ps", roff_line_ignore, NULL, NULL, 0, NULL },
         { "rm", roff_rm, NULL, NULL, 0, NULL },          { "rm", roff_rm, NULL, NULL, 0, NULL },
         { "rr", roff_rr, NULL, NULL, 0, NULL },          { "rr", roff_rr, NULL, NULL, 0, NULL },
Line 456  roff_reset(struct roff *r)
Line 462  roff_reset(struct roff *r)
 {  {
   
         roff_free1(r);          roff_free1(r);
           r->format = r->options & (MPARSE_MDOC | MPARSE_MAN);
         r->control = 0;          r->control = 0;
 }  }
   
Line 475  roff_alloc(struct mparse *parse, int options)
Line 482  roff_alloc(struct mparse *parse, int options)
         r = mandoc_calloc(1, sizeof(struct roff));          r = mandoc_calloc(1, sizeof(struct roff));
         r->parse = parse;          r->parse = parse;
         r->options = options;          r->options = options;
           r->format = options & (MPARSE_MDOC | MPARSE_MAN);
         r->rstackpos = -1;          r->rstackpos = -1;
   
         roffhash_init();          roffhash_init();
Line 719  roff_parseln(struct roff *r, int ln, char **bufp,
Line 727  roff_parseln(struct roff *r, int ln, char **bufp,
         enum rofferr     e;          enum rofferr     e;
         int              ppos, ctl;          int              ppos, ctl;
   
         /*          /* Handle in-line equation delimiters. */
          * Run the reserved-word filter only if we have some reserved  
          * words to fill in.  
          */  
   
           if (r->last_eqn != NULL && r->last_eqn->delim &&
               (r->eqn == NULL || r->eqn_inline)) {
                   e = roff_eqndelim(r, bufp, szp, pos);
                   if (e == ROFF_REPARSE)
                           return(e);
                   assert(e == ROFF_CONT);
           }
   
           /* Expand some escape sequences. */
   
         e = roff_res(r, bufp, szp, ln, pos);          e = roff_res(r, bufp, szp, ln, pos);
         if (ROFF_IGN == e)          if (ROFF_IGN == e)
                 return(e);                  return(e);
Line 756  roff_parseln(struct roff *r, int ln, char **bufp,
Line 771  roff_parseln(struct roff *r, int ln, char **bufp,
                 return(roff_parsetext(bufp, szp, pos, offs));                  return(roff_parsetext(bufp, szp, pos, offs));
         }          }
   
           /* Skip empty request lines. */
   
           if ((*bufp)[pos] == '"') {
                   mandoc_msg(MANDOCERR_COMMENT_BAD, r->parse,
                       ln, pos, NULL);
                   return(ROFF_IGN);
           } else if ((*bufp)[pos] == '\0')
                   return(ROFF_IGN);
   
         /*          /*
          * If a scope is open, go to the child handler for that macro,           * If a scope is open, go to the child handler for that macro,
          * as it may want to preprocess before doing anything with it.           * as it may want to preprocess before doing anything with it.
Line 1776  roff_Dd(ROFF_ARGS)
Line 1800  roff_Dd(ROFF_ARGS)
 {  {
         const char *const       *cp;          const char *const       *cp;
   
         if (0 == ((MPARSE_MDOC | MPARSE_QUICK) & r->options))          if ((r->options & (MPARSE_MDOC | MPARSE_QUICK)) == 0)
                 for (cp = __mdoc_reserved; *cp; cp++)                  for (cp = __mdoc_reserved; *cp; cp++)
                         roff_setstr(r, *cp, NULL, 0);                          roff_setstr(r, *cp, NULL, 0);
   
           if (r->format == 0)
                   r->format = MPARSE_MDOC;
   
         return(ROFF_CONT);          return(ROFF_CONT);
 }  }
   
Line 1788  roff_TH(ROFF_ARGS)
Line 1815  roff_TH(ROFF_ARGS)
 {  {
         const char *const       *cp;          const char *const       *cp;
   
         if (0 == (MPARSE_QUICK & r->options))          if ((r->options & MPARSE_QUICK) == 0)
                 for (cp = __man_reserved; *cp; cp++)                  for (cp = __man_reserved; *cp; cp++)
                         roff_setstr(r, *cp, NULL, 0);                          roff_setstr(r, *cp, NULL, 0);
   
           if (r->format == 0)
                   r->format = MPARSE_MAN;
   
         return(ROFF_CONT);          return(ROFF_CONT);
 }  }
   
Line 1821  roff_T_(ROFF_ARGS)
Line 1851  roff_T_(ROFF_ARGS)
         return(ROFF_IGN);          return(ROFF_IGN);
 }  }
   
 #if 0  /*
 static int   * Handle in-line equation delimiters.
 roff_closeeqn(struct roff *r)   */
   static enum rofferr
   roff_eqndelim(struct roff *r, char **bufp, size_t *szp, int pos)
 {  {
           char    *cp1, *cp2;
   
         return(r->eqn && ROFF_EQN == eqn_end(&r->eqn) ? 1 : 0);          /*
            * Outside equations, look for an opening delimiter.
            * If we are inside an equation, we already know it is
            * in-line, or this function wouldn't have been called;
            * so look for a closing delimiter.
            */
   
           cp1 = *bufp + pos;
           cp2 = strchr(cp1, r->eqn == NULL ?
               r->last_eqn->odelim : r->last_eqn->cdelim);
           if (cp2 == NULL)
                   return(ROFF_CONT);
   
           /* Found a delimiter; get rid of surrounding blanks. */
   
           cp1 = cp2++;
           while (cp2[0] == ' ')
                   cp2++;
           while (cp1[-1] == ' ')
                   cp1--;
           *cp1 = '\0';
   
           /* Replace the delimiter with an equation macro. */
   
           *szp = mandoc_asprintf(&cp1, "%s\n.E%s%s", *bufp,
               r->eqn == NULL ? "Q\n" : "N\n\\&", cp2) + 1;
           free(*bufp);
           *bufp = cp1;
   
           /* Toggle the in-line state of the eqn subsystem. */
   
           r->eqn_inline = r->eqn == NULL;
           return(ROFF_REPARSE);
 }  }
 #endif  
   
 static void  static void
 roff_openeqn(struct roff *r, const char *name, int line,  roff_openeqn(struct roff *r, const char *name, int line,
Line 1840  roff_openeqn(struct roff *r, const char *name, int lin
Line 1904  roff_openeqn(struct roff *r, const char *name, int lin
         assert(NULL == r->eqn);          assert(NULL == r->eqn);
         e = eqn_alloc(name, offs, line, r->parse);          e = eqn_alloc(name, offs, line, r->parse);
   
         if (r->last_eqn)          if (r->last_eqn) {
                 r->last_eqn->next = e;                  r->last_eqn->next = e;
         else                  e->delim = r->last_eqn->delim;
                   e->odelim = r->last_eqn->odelim;
                   e->cdelim = r->last_eqn->cdelim;
           } else
                 r->first_eqn = r->last_eqn = e;                  r->first_eqn = r->last_eqn = e;
   
         r->eqn = r->last_eqn = e;          r->eqn = r->last_eqn = e;
Line 2305  roff_strdup(const struct roff *r, const char *p)
Line 2372  roff_strdup(const struct roff *r, const char *p)
   
         res[(int)ssz] = '\0';          res[(int)ssz] = '\0';
         return(res);          return(res);
   }
   
   int
   roff_getformat(const struct roff *r)
   {
   
           return(r->format);
 }  }
   
 /*  /*

Legend:
Removed from v.1.226  
changed lines
  Added in v.1.231

CVSweb