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

Diff for /mandoc/mdoc.c between version 1.247 and 1.252

version 1.247, 2015/04/19 13:50:26 version 1.252, 2015/04/23 16:17:44
Line 36 
Line 36 
 #include "libmdoc.h"  #include "libmdoc.h"
   
 const   char *const __mdoc_macronames[MDOC_MAX + 1] = {  const   char *const __mdoc_macronames[MDOC_MAX + 1] = {
           "text",
         "Ap",           "Dd",           "Dt",           "Os",          "Ap",           "Dd",           "Dt",           "Os",
         "Sh",           "Ss",           "Pp",           "D1",          "Sh",           "Ss",           "Pp",           "D1",
         "Dl",           "Bd",           "Ed",           "Bl",          "Dl",           "Bd",           "Ed",           "Bl",
Line 66  const char *const __mdoc_macronames[MDOC_MAX + 1] = {
Line 67  const char *const __mdoc_macronames[MDOC_MAX + 1] = {
         "Lk",           "Mt",           "Brq",          "Bro",          "Lk",           "Mt",           "Brq",          "Bro",
         "Brc",          "%C",           "Es",           "En",          "Brc",          "%C",           "Es",           "En",
         "Dx",           "%Q",           "br",           "sp",          "Dx",           "%Q",           "br",           "sp",
         "%U",           "Ta",           "ll",           "text",          "%U",           "Ta",           "ll",
         };  };
   
 const   char *const __mdoc_argnames[MDOC_ARG_MAX] = {  const   char *const __mdoc_argnames[MDOC_ARG_MAX] = {
         "split",                "nosplit",              "ragged",          "split",                "nosplit",              "ragged",
Line 81  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {
Line 82  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {
         "symbolic",             "nested",               "centered"          "symbolic",             "nested",               "centered"
         };          };
   
 const   char * const *mdoc_macronames = __mdoc_macronames;  const   char * const *mdoc_macronames = __mdoc_macronames + 1;
 const   char * const *mdoc_argnames = __mdoc_argnames;  const   char * const *mdoc_argnames = __mdoc_argnames;
   
 static  int               mdoc_ptext(struct roff_man *, int, char *, int);  static  int               mdoc_ptext(struct roff_man *, int, char *, int);
 static  int               mdoc_pmacro(struct roff_man *, int, char *, int);  static  int               mdoc_pmacro(struct roff_man *, int, char *, int);
   
   
 void  
 mdoc_endparse(struct roff_man *mdoc)  
 {  
   
         mdoc_macroend(mdoc);  
 }  
   
 void  
 mdoc_addeqn(struct roff_man *mdoc, const struct eqn *ep)  
 {  
         struct roff_node *n;  
   
         n = roff_node_alloc(mdoc, ep->ln, ep->pos, ROFFT_EQN, MDOC_MAX);  
         n->eqn = ep;  
         if (ep->ln > mdoc->last->line)  
                 n->flags |= MDOC_LINE;  
         roff_node_append(mdoc, n);  
         mdoc->next = ROFF_NEXT_SIBLING;  
 }  
   
 void  
 mdoc_addspan(struct roff_man *mdoc, const struct tbl_span *sp)  
 {  
         struct roff_node *n;  
   
         n = roff_node_alloc(mdoc, sp->line, 0, ROFFT_TBL, MDOC_MAX);  
         n->span = sp;  
         roff_node_append(mdoc, n);  
         mdoc_valid_post(mdoc);  
         mdoc->next = ROFF_NEXT_SIBLING;  
 }  
   
 /*  /*
  * Main parse routine.  Parses a single line -- really just hands off to   * Main parse routine.  Parses a single line -- really just hands off to
  * the macro (mdoc_pmacro()) or text parser (mdoc_ptext()).   * the macro (mdoc_pmacro()) or text parser (mdoc_ptext()).
Line 150  mdoc_parseln(struct roff_man *mdoc, int ln, char *buf,
Line 119  mdoc_parseln(struct roff_man *mdoc, int ln, char *buf,
 void  void
 mdoc_macro(MACRO_PROT_ARGS)  mdoc_macro(MACRO_PROT_ARGS)
 {  {
         assert(tok < MDOC_MAX);          assert(tok > TOKEN_NONE && tok < MDOC_MAX);
   
         if (mdoc->flags & MDOC_PBODY) {          if (mdoc->flags & MDOC_PBODY) {
                 if (tok == MDOC_Dt) {                  if (tok == MDOC_Dt) {
Line 254  mdoc_elem_alloc(struct roff_man *mdoc, int line, int p
Line 223  mdoc_elem_alloc(struct roff_man *mdoc, int line, int p
 }  }
   
 void  void
 mdoc_word_alloc(struct roff_man *mdoc, int line, int pos, const char *p)  
 {  
         struct roff_node *n;  
   
         n = roff_node_alloc(mdoc, line, pos, ROFFT_TEXT, MDOC_MAX);  
         n->string = roff_strdup(mdoc->roff, p);  
         roff_node_append(mdoc, n);  
         mdoc_valid_post(mdoc);  
         mdoc->next = ROFF_NEXT_SIBLING;  
 }  
   
 void  
 mdoc_word_append(struct roff_man *mdoc, const char *p)  
 {  
         struct roff_node        *n;  
         char                    *addstr, *newstr;  
   
         n = mdoc->last;  
         addstr = roff_strdup(mdoc->roff, p);  
         mandoc_asprintf(&newstr, "%s %s", n->string, addstr);  
         free(addstr);  
         free(n->string);  
         n->string = newstr;  
         mdoc->next = ROFF_NEXT_SIBLING;  
 }  
   
 void  
 mdoc_node_relink(struct roff_man *mdoc, struct roff_node *p)  mdoc_node_relink(struct roff_man *mdoc, struct roff_node *p)
 {  {
   
Line 380  mdoc_ptext(struct roff_man *mdoc, int line, char *buf,
Line 322  mdoc_ptext(struct roff_man *mdoc, int line, char *buf,
                  * blank lines aren't allowed, but enough manuals assume this                   * blank lines aren't allowed, but enough manuals assume this
                  * behaviour that we want to work around it.                   * behaviour that we want to work around it.
                  */                   */
                 mdoc_elem_alloc(mdoc, line, offs, MDOC_sp, NULL);                  roff_elem_alloc(mdoc, line, offs, MDOC_sp);
                 mdoc->next = ROFF_NEXT_SIBLING;                  mdoc->next = ROFF_NEXT_SIBLING;
                 mdoc_valid_post(mdoc);                  mdoc_valid_post(mdoc);
                 return(1);                  return(1);
         }          }
   
         mdoc_word_alloc(mdoc, line, offs, buf+offs);          roff_word_alloc(mdoc, line, offs, buf+offs);
   
         if (mdoc->flags & MDOC_LITERAL)          if (mdoc->flags & MDOC_LITERAL)
                 return(1);                  return(1);
Line 430  mdoc_pmacro(struct roff_man *mdoc, int ln, char *buf, 
Line 372  mdoc_pmacro(struct roff_man *mdoc, int ln, char *buf, 
   
         mac[i] = '\0';          mac[i] = '\0';
   
         tok = (i > 1 && i < 4) ? mdoc_hash_find(mac) : MDOC_MAX;          tok = (i > 1 && i < 4) ? mdoc_hash_find(mac) : TOKEN_NONE;
   
         if (tok == MDOC_MAX) {          if (tok == TOKEN_NONE) {
                 mandoc_msg(MANDOCERR_MACRO, mdoc->parse,                  mandoc_msg(MANDOCERR_MACRO, mdoc->parse,
                     ln, sv, buf + sv - 1);                      ln, sv, buf + sv - 1);
                 return(1);                  return(1);
Line 564  mdoc_isdelim(const char *p)
Line 506  mdoc_isdelim(const char *p)
                 return(DELIM_MIDDLE);                  return(DELIM_MIDDLE);
   
         return(DELIM_NONE);          return(DELIM_NONE);
 }  
   
 void  
 mdoc_deroff(char **dest, const struct roff_node *n)  
 {  
         char    *cp;  
         size_t   sz;  
   
         if (n->type != ROFFT_TEXT) {  
                 for (n = n->child; n; n = n->next)  
                         mdoc_deroff(dest, n);  
                 return;  
         }  
   
         /* Skip leading whitespace. */  
   
         for (cp = n->string; '\0' != *cp; cp++)  
                 if (0 == isspace((unsigned char)*cp))  
                         break;  
   
         /* Skip trailing whitespace. */  
   
         for (sz = strlen(cp); sz; sz--)  
                 if (0 == isspace((unsigned char)cp[sz-1]))  
                         break;  
   
         /* Skip empty strings. */  
   
         if (0 == sz)  
                 return;  
   
         if (NULL == *dest) {  
                 *dest = mandoc_strndup(cp, sz);  
                 return;  
         }  
   
         mandoc_asprintf(&cp, "%s %*s", *dest, (int)sz, cp);  
         free(*dest);  
         *dest = cp;  
 }  }

Legend:
Removed from v.1.247  
changed lines
  Added in v.1.252

CVSweb