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

Diff for /mandoc/mdoc.c between version 1.189 and 1.201

version 1.189, 2011/07/18 07:46:41 version 1.201, 2012/07/18 11:11:12
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) 2010 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010, 2012 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 97  static struct mdoc_node *node_alloc(struct mdoc *, int
Line 97  static struct mdoc_node *node_alloc(struct mdoc *, int
                                 enum mdoct, enum mdoc_type);                                  enum mdoct, enum mdoc_type);
 static  int               node_append(struct mdoc *,  static  int               node_append(struct mdoc *,
                                 struct mdoc_node *);                                  struct mdoc_node *);
   #if 0
   static  int               mdoc_preptext(struct mdoc *, int, char *, int);
   #endif
 static  int               mdoc_ptext(struct mdoc *, int, char *, int);  static  int               mdoc_ptext(struct mdoc *, int, char *, int);
 static  int               mdoc_pmacro(struct mdoc *, int, char *, int);  static  int               mdoc_pmacro(struct mdoc *, int, char *, int);
   
Line 157  mdoc_alloc1(struct mdoc *mdoc)
Line 160  mdoc_alloc1(struct mdoc *mdoc)
         mdoc->last = mandoc_calloc(1, sizeof(struct mdoc_node));          mdoc->last = mandoc_calloc(1, sizeof(struct mdoc_node));
         mdoc->first = mdoc->last;          mdoc->first = mdoc->last;
         mdoc->last->type = MDOC_ROOT;          mdoc->last->type = MDOC_ROOT;
           mdoc->last->tok = MDOC_MAX;
         mdoc->next = MDOC_NEXT_CHILD;          mdoc->next = MDOC_NEXT_CHILD;
 }  }
   
Line 193  mdoc_free(struct mdoc *mdoc)
Line 197  mdoc_free(struct mdoc *mdoc)
  * Allocate volatile and non-volatile parse resources.   * Allocate volatile and non-volatile parse resources.
  */   */
 struct mdoc *  struct mdoc *
 mdoc_alloc(struct roff *roff, struct mparse *parse)  mdoc_alloc(struct roff *roff, struct mparse *parse, char *defos)
 {  {
         struct mdoc     *p;          struct mdoc     *p;
   
         p = mandoc_calloc(1, sizeof(struct mdoc));          p = mandoc_calloc(1, sizeof(struct mdoc));
   
         p->parse = parse;          p->parse = parse;
           p->defos = defos;
         p->roff = roff;          p->roff = roff;
   
         mdoc_hash_init();          mdoc_hash_init();
Line 233  mdoc_addeqn(struct mdoc *m, const struct eqn *ep)
Line 238  mdoc_addeqn(struct mdoc *m, const struct eqn *ep)
         /* No text before an initial macro. */          /* No text before an initial macro. */
   
         if (SEC_NONE == m->lastnamed) {          if (SEC_NONE == m->lastnamed) {
                 mdoc_pmsg(m, ep->line, ep->pos, MANDOCERR_NOTEXT);                  mdoc_pmsg(m, ep->ln, ep->pos, MANDOCERR_NOTEXT);
                 return(1);                  return(1);
         }          }
   
         n = node_alloc(m, ep->line, ep->pos, MDOC_MAX, MDOC_EQN);          n = node_alloc(m, ep->ln, ep->pos, MDOC_MAX, MDOC_EQN);
         n->eqn = ep;          n->eqn = ep;
   
         if ( ! node_append(m, n))          if ( ! node_append(m, n))
Line 297  mdoc_parseln(struct mdoc *m, int ln, char *buf, int of
Line 302  mdoc_parseln(struct mdoc *m, int ln, char *buf, int of
                         m->flags &= ~MDOC_SYNOPSIS;                          m->flags &= ~MDOC_SYNOPSIS;
         }          }
   
         return(mandoc_getcontrol(buf, &offs) ?          return(roff_getcontrol(m->roff, buf, &offs) ?
                         mdoc_pmacro(m, ln, buf, offs) :                          mdoc_pmacro(m, ln, buf, offs) :
                         mdoc_ptext(m, ln, buf, offs));                          mdoc_ptext(m, ln, buf, offs));
 }  }
Line 565  int
Line 570  int
 mdoc_word_alloc(struct mdoc *m, int line, int pos, const char *p)  mdoc_word_alloc(struct mdoc *m, int line, int pos, const char *p)
 {  {
         struct mdoc_node *n;          struct mdoc_node *n;
         size_t            sv, len;  
   
         len = strlen(p);  
   
         n = node_alloc(m, line, pos, MDOC_MAX, MDOC_TEXT);          n = node_alloc(m, line, pos, MDOC_MAX, MDOC_TEXT);
         n->string = mandoc_malloc(len + 1);          n->string = roff_strdup(m->roff, p);
         sv = strlcpy(n->string, p, len + 1);  
   
         /* Prohibit truncation. */  
         assert(sv < len + 1);  
   
         if ( ! node_append(m, n))          if ( ! node_append(m, n))
                 return(0);                  return(0);
   
Line 650  mdoc_node_delete(struct mdoc *m, struct mdoc_node *p)
Line 648  mdoc_node_delete(struct mdoc *m, struct mdoc_node *p)
         mdoc_node_free(p);          mdoc_node_free(p);
 }  }
   
   int
   mdoc_node_relink(struct mdoc *m, struct mdoc_node *p)
   {
   
           mdoc_node_unlink(m, p);
           return(node_append(m, p));
   }
   
   #if 0
 /*  /*
    * Pre-treat a text line.
    * Text lines can consist of equations, which must be handled apart from
    * the regular text.
    * Thus, use this function to step through a line checking if it has any
    * equations embedded in it.
    * This must handle multiple equations AND equations that do not end at
    * the end-of-line, i.e., will re-enter in the next roff parse.
    */
   static int
   mdoc_preptext(struct mdoc *m, int line, char *buf, int offs)
   {
           char            *start, *end;
           char             delim;
   
           while ('\0' != buf[offs]) {
                   /* Mark starting position if eqn is set. */
                   start = NULL;
                   if ('\0' != (delim = roff_eqndelim(m->roff)))
                           if (NULL != (start = strchr(buf + offs, delim)))
                                   *start++ = '\0';
   
                   /* Parse text as normal. */
                   if ( ! mdoc_ptext(m, line, buf, offs))
                           return(0);
   
                   /* Continue only if an equation exists. */
                   if (NULL == start)
                           break;
   
                   /* Read past the end of the equation. */
                   offs += start - (buf + offs);
                   assert(start == &buf[offs]);
                   if (NULL != (end = strchr(buf + offs, delim))) {
                           *end++ = '\0';
                           while (' ' == *end)
                                   end++;
                   }
   
                   /* Parse the equation itself. */
                   roff_openeqn(m->roff, NULL, line, offs, buf);
   
                   /* Process a finished equation? */
                   if (roff_closeeqn(m->roff))
                           if ( ! mdoc_addeqn(m, roff_eqn(m->roff)))
                                   return(0);
                   offs += (end - (buf + offs));
           }
   
           return(1);
   }
   #endif
   
   /*
  * Parse free-form text, that is, a line that does not begin with the   * Parse free-form text, that is, a line that does not begin with the
  * control character.   * control character.
  */   */
Line 703  mdoc_ptext(struct mdoc *m, int line, char *buf, int of
Line 762  mdoc_ptext(struct mdoc *m, int line, char *buf, int of
         ws = NULL;          ws = NULL;
         for (c = end = buf + offs; *c; c++) {          for (c = end = buf + offs; *c; c++) {
                 switch (*c) {                  switch (*c) {
                 case '-':  
                         if (mandoc_hyph(buf + offs, c))  
                                 *c = ASCII_HYPH;  
                         ws = NULL;  
                         break;  
                 case ' ':                  case ' ':
                         if (NULL == ws)                          if (NULL == ws)
                                 ws = c;                                  ws = c;
Line 755  mdoc_ptext(struct mdoc *m, int line, char *buf, int of
Line 809  mdoc_ptext(struct mdoc *m, int line, char *buf, int of
                         return(0);                          return(0);
   
                 m->next = MDOC_NEXT_SIBLING;                  m->next = MDOC_NEXT_SIBLING;
                 return(1);  
                   return(mdoc_valid_post(m));
         }          }
   
         if ( ! mdoc_word_alloc(m, line, offs, buf+offs))          if ( ! mdoc_word_alloc(m, line, offs, buf+offs))
Line 935  mdoc_isdelim(const char *p)
Line 990  mdoc_isdelim(const char *p)
   
         if (0 == strcmp(p + 1, "."))          if (0 == strcmp(p + 1, "."))
                 return(DELIM_CLOSE);                  return(DELIM_CLOSE);
         if (0 == strcmp(p + 1, "*(Ba"))          if (0 == strcmp(p + 1, "fR|\\fP"))
                 return(DELIM_MIDDLE);                  return(DELIM_MIDDLE);
   
         return(DELIM_NONE);          return(DELIM_NONE);

Legend:
Removed from v.1.189  
changed lines
  Added in v.1.201

CVSweb