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

Diff for /mandoc/eqn.c between version 1.38 and 1.46

version 1.38, 2011/07/25 15:37:00 version 1.46, 2014/09/28 11:32:08
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
   #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <limits.h>  #include <limits.h>
 #include <stdio.h>  #include <stdio.h>
Line 26 
Line 26 
 #include <time.h>  #include <time.h>
   
 #include "mandoc.h"  #include "mandoc.h"
   #include "mandoc_aux.h"
 #include "libmandoc.h"  #include "libmandoc.h"
 #include "libroff.h"  #include "libroff.h"
   
Line 137  struct eqnsym {
Line 138  struct eqnsym {
         const char      *sym;          const char      *sym;
 };  };
   
   
 static  enum eqn_rest    eqn_box(struct eqn_node *, struct eqn_box *);  static  enum eqn_rest    eqn_box(struct eqn_node *, struct eqn_box *);
 static  struct eqn_box  *eqn_box_alloc(struct eqn_node *,  static  struct eqn_box  *eqn_box_alloc(struct eqn_node *,
                                 struct eqn_box *);                                  struct eqn_box *);
 static  void             eqn_box_free(struct eqn_box *);  static  void             eqn_box_free(struct eqn_box *);
 static  struct eqn_def  *eqn_def_find(struct eqn_node *,  static  struct eqn_def  *eqn_def_find(struct eqn_node *,
                                 const char *, size_t);                                  const char *, size_t);
 static  int              eqn_do_gfont(struct eqn_node *);  static  int              eqn_do_gfont(struct eqn_node *);
 static  int              eqn_do_gsize(struct eqn_node *);  static  int              eqn_do_gsize(struct eqn_node *);
Line 156  static enum eqn_rest  eqn_list(struct eqn_node *, stru
Line 156  static enum eqn_rest  eqn_list(struct eqn_node *, stru
 static  enum eqn_rest    eqn_matrix(struct eqn_node *, struct eqn_box *);  static  enum eqn_rest    eqn_matrix(struct eqn_node *, struct eqn_box *);
 static  const char      *eqn_nexttok(struct eqn_node *, size_t *);  static  const char      *eqn_nexttok(struct eqn_node *, size_t *);
 static  const char      *eqn_nextrawtok(struct eqn_node *, size_t *);  static  const char      *eqn_nextrawtok(struct eqn_node *, size_t *);
 static  const char      *eqn_next(struct eqn_node *,  static  const char      *eqn_next(struct eqn_node *,
                                 char, size_t *, int);                                  char, size_t *, int);
 static  void             eqn_rewind(struct eqn_node *);  static  void             eqn_rewind(struct eqn_node *);
   
Line 198  static const struct eqnstr eqnposs[EQNPOS__MAX] = {
Line 198  static const struct eqnstr eqnposs[EQNPOS__MAX] = {
         { "", 0 }, /* EQNPOS_NONE */          { "", 0 }, /* EQNPOS_NONE */
         { "over", 4 }, /* EQNPOS_OVER */          { "over", 4 }, /* EQNPOS_OVER */
         { "sup", 3 }, /* EQNPOS_SUP */          { "sup", 3 }, /* EQNPOS_SUP */
           { NULL, 0 }, /* EQNPOS_SUPSUB */
         { "sub", 3 }, /* EQNPOS_SUB */          { "sub", 3 }, /* EQNPOS_SUB */
         { "to", 2 }, /* EQNPOS_TO */          { "to", 2 }, /* EQNPOS_TO */
         { "from", 4 }, /* EQNPOS_FROM */          { "from", 4 }, /* EQNPOS_FROM */
Line 277  static const struct eqnsym eqnsyms[EQNSYM__MAX] = {
Line 278  static const struct eqnsym eqnsyms[EQNSYM__MAX] = {
         { { ">=", 2 }, ">=" }, /* EQNSYM_moreequal */          { { ">=", 2 }, ">=" }, /* EQNSYM_moreequal */
 };  };
   
 /* ARGSUSED */  
 enum rofferr  enum rofferr
 eqn_read(struct eqn_node **epp, int ln,  eqn_read(struct eqn_node **epp, int ln,
                 const char *p, int pos, int *offs)                  const char *p, int pos, int *offs)
 {  {
         size_t           sz;          size_t           sz;
Line 298  eqn_read(struct eqn_node **epp, int ln, 
Line 299  eqn_read(struct eqn_node **epp, int ln, 
                 p += 3;                  p += 3;
                 while (' ' == *p || '\t' == *p)                  while (' ' == *p || '\t' == *p)
                         p++;                          p++;
                 if ('\0' == *p)                  if ('\0' == *p)
                         return(er);                          return(er);
                 mandoc_msg(MANDOCERR_ARGSLOST, ep->parse, ln, pos, NULL);                  mandoc_vmsg(MANDOCERR_ARG_SKIP, ep->parse,
                       ln, pos, "EN %s", p);
                 return(er);                  return(er);
         }          }
   
Line 413  eqn_matrix(struct eqn_node *ep, struct eqn_box *last)
Line 415  eqn_matrix(struct eqn_node *ep, struct eqn_box *last)
   
         while (EQN_OK == (c = eqn_box(ep, bp)))          while (EQN_OK == (c = eqn_box(ep, bp)))
                 switch (bp->last->pile) {                  switch (bp->last->pile) {
                 case (EQNPILE_LCOL):                  case EQNPILE_LCOL:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (EQNPILE_CCOL):                  case EQNPILE_CCOL:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (EQNPILE_RCOL):                  case EQNPILE_RCOL:
                         continue;                          continue;
                 default:                  default:
                         EQN_MSG(MANDOCERR_EQNSYNT, ep);                          EQN_MSG(MANDOCERR_EQNSYNT, ep);
Line 512  eqn_box(struct eqn_node *ep, struct eqn_box *last)
Line 514  eqn_box(struct eqn_node *ep, struct eqn_box *last)
         for (i = 0; i < (int)EQN__MAX; i++) {          for (i = 0; i < (int)EQN__MAX; i++) {
                 if ( ! EQNSTREQ(&eqnparts[i].str, start, sz))                  if ( ! EQNSTREQ(&eqnparts[i].str, start, sz))
                         continue;                          continue;
                 return((*eqnparts[i].fp)(ep) ?                  return((*eqnparts[i].fp)(ep) ? EQN_OK : EQN_ERR);
                                 EQN_OK : EQN_ERR);          }
         }  
   
         if (STRNEQ(start, sz, "{", 1)) {          if (STRNEQ(start, sz, "{", 1)) {
                 if (EQN_DESCOPE != (c = eqn_eqn(ep, last))) {                  if (EQN_DESCOPE != (c = eqn_eqn(ep, last))) {
Line 529  eqn_box(struct eqn_node *ep, struct eqn_box *last)
Line 530  eqn_box(struct eqn_node *ep, struct eqn_box *last)
                         return(EQN_OK);                          return(EQN_OK);
                 EQN_MSG(MANDOCERR_EQNBADSCOPE, ep);                  EQN_MSG(MANDOCERR_EQNBADSCOPE, ep);
                 return(EQN_ERR);                  return(EQN_ERR);
         }          }
   
         for (i = 0; i < (int)EQNPILE__MAX; i++) {          for (i = 0; i < (int)EQNPILE__MAX; i++) {
                 if ( ! EQNSTREQ(&eqnpiles[i], start, sz))                  if ( ! EQNSTREQ(&eqnpiles[i], start, sz))
Line 569  eqn_box(struct eqn_node *ep, struct eqn_box *last)
Line 570  eqn_box(struct eqn_node *ep, struct eqn_box *last)
                 return(EQN_OK);                  return(EQN_OK);
         }          }
   
           /*
            * Positional elements (e.g., over, sub, sup, ...).
            */
         for (i = 0; i < (int)EQNPOS__MAX; i++) {          for (i = 0; i < (int)EQNPOS__MAX; i++) {
                 if ( ! EQNSTREQ(&eqnposs[i], start, sz))                  /* Some elements don't have names (are virtual). */
                   if (NULL == eqnposs[i].name)
                         continue;                          continue;
                   else if ( ! EQNSTREQ(&eqnposs[i], start, sz))
                           continue;
                 if (NULL == last->last) {                  if (NULL == last->last) {
                         EQN_MSG(MANDOCERR_EQNSYNT, ep);                          EQN_MSG(MANDOCERR_EQNSYNT, ep);
                         return(EQN_ERR);                          return(EQN_ERR);
                 }                  }
                 last->last->pos = (enum eqn_post)i;                  /*
                    * If we encounter x sub y sup z, then according to the
                    * eqn manual, we regard this as x subsup y z.
                    */
                   if (EQNPOS_SUP == i &&
                           NULL != last->last->prev &&
                           EQNPOS_SUB == last->last->prev->pos)
                           last->last->prev->pos = EQNPOS_SUBSUP;
                   else
                           last->last->pos = (enum eqn_post)i;
   
                 if (EQN_EOF == (c = eqn_box(ep, last))) {                  if (EQN_EOF == (c = eqn_box(ep, last))) {
                         EQN_MSG(MANDOCERR_EQNEOF, ep);                          EQN_MSG(MANDOCERR_EQNEOF, ep);
                         return(EQN_ERR);                          return(EQN_ERR);
Line 590  eqn_box(struct eqn_node *ep, struct eqn_box *last)
Line 607  eqn_box(struct eqn_node *ep, struct eqn_box *last)
                 if (NULL == last->last) {                  if (NULL == last->last) {
                         EQN_MSG(MANDOCERR_EQNSYNT, ep);                          EQN_MSG(MANDOCERR_EQNSYNT, ep);
                         return(EQN_ERR);                          return(EQN_ERR);
                 }                  }
                 last->last->mark = (enum eqn_markt)i;                  last->last->mark = (enum eqn_markt)i;
                 if (EQN_EOF == (c = eqn_box(ep, last))) {                  if (EQN_EOF == (c = eqn_box(ep, last))) {
                         EQN_MSG(MANDOCERR_EQNEOF, ep);                          EQN_MSG(MANDOCERR_EQNEOF, ep);
Line 629  eqn_box(struct eqn_node *ep, struct eqn_box *last)
Line 646  eqn_box(struct eqn_node *ep, struct eqn_box *last)
         for (i = 0; i < (int)EQNSYM__MAX; i++)          for (i = 0; i < (int)EQNSYM__MAX; i++)
                 if (EQNSTREQ(&eqnsyms[i].str, start, sz)) {                  if (EQNSTREQ(&eqnsyms[i].str, start, sz)) {
                         sym[63] = '\0';                          sym[63] = '\0';
                         snprintf(sym, 62, "\\[%s]", eqnsyms[i].sym);                          (void)snprintf(sym, 62, "\\[%s]", eqnsyms[i].sym);
                         bp->text = mandoc_strdup(sym);                          bp->text = mandoc_strdup(sym);
                         return(EQN_OK);                          return(EQN_OK);
                 }                  }
Line 665  eqn_box_alloc(struct eqn_node *ep, struct eqn_box *par
Line 682  eqn_box_alloc(struct eqn_node *ep, struct eqn_box *par
         bp->parent = parent;          bp->parent = parent;
         bp->size = ep->gsize;          bp->size = ep->gsize;
   
         if (NULL == parent->first)          if (NULL != parent->first) {
                 parent->first = bp;  
         else  
                 parent->last->next = bp;                  parent->last->next = bp;
                   bp->prev = parent->last;
           } else
                   parent->first = bp;
   
         parent->last = bp;          parent->last = bp;
         return(bp);          return(bp);
Line 762  again:
Line 780  again:
                 if (q)                  if (q)
                         ep->cur++;                          ep->cur++;
                 while (' ' == ep->data[(int)ep->cur] ||                  while (' ' == ep->data[(int)ep->cur] ||
                                 '\t' == ep->data[(int)ep->cur] ||                      '\t' == ep->data[(int)ep->cur] ||
                                 '^' == ep->data[(int)ep->cur] ||                      '^' == ep->data[(int)ep->cur] ||
                                 '~' == ep->data[(int)ep->cur])                      '~' == ep->data[(int)ep->cur])
                         ep->cur++;                          ep->cur++;
         } else {          } else {
                 if (q)                  if (q)
                         EQN_MSG(MANDOCERR_BADQUOTE, ep);                          EQN_MSG(MANDOCERR_ARG_QUOTE, ep);
                 next = strchr(start, '\0');                  next = strchr(start, '\0');
                 *sz = (size_t)(next - start);                  *sz = (size_t)(next - start);
                 ep->cur += *sz;                  ep->cur += *sz;
Line 790  again:
Line 808  again:
                 }                  }
   
                 diff = def->valsz - *sz;                  diff = def->valsz - *sz;
                 memmove(start + *sz + diff, start + *sz,                  memmove(start + *sz + diff, start + *sz,
                                 (strlen(start) - *sz) + 1);                      (strlen(start) - *sz) + 1);
                 memcpy(start, def->val, def->valsz);                  memcpy(start, def->val, def->valsz);
                 goto again;                  goto again;
         }          }
Line 852  eqn_do_define(struct eqn_node *ep)
Line 870  eqn_do_define(struct eqn_node *ep)
                 return(0);                  return(0);
         }          }
   
         /*          /*
          * Search for a key that already exists.           * Search for a key that already exists.
          * Create a new key if none is found.           * Create a new key if none is found.
          */           */
   
Line 865  eqn_do_define(struct eqn_node *ep)
Line 883  eqn_do_define(struct eqn_node *ep)
   
                 if (i == (int)ep->defsz) {                  if (i == (int)ep->defsz) {
                         ep->defsz++;                          ep->defsz++;
                         ep->defs = mandoc_realloc                          ep->defs = mandoc_reallocarray(ep->defs,
                                 (ep->defs, ep->defsz *                              ep->defsz, sizeof(struct eqn_def));
                                  sizeof(struct eqn_def));  
                         ep->defs[i].key = ep->defs[i].val = NULL;                          ep->defs[i].key = ep->defs[i].val = NULL;
                 }                  }
   
                 ep->defs[i].keysz = sz;                  ep->defs[i].keysz = sz;
                 ep->defs[i].key = mandoc_realloc                  ep->defs[i].key = mandoc_realloc(
                         (ep->defs[i].key, sz + 1);                      ep->defs[i].key, sz + 1);
   
                 memcpy(ep->defs[i].key, start, sz);                  memcpy(ep->defs[i].key, start, sz);
                 ep->defs[i].key[(int)sz] = '\0';                  ep->defs[i].key[(int)sz] = '\0';
Line 901  eqn_do_gfont(struct eqn_node *ep)
Line 918  eqn_do_gfont(struct eqn_node *ep)
         if (NULL == eqn_nextrawtok(ep, NULL)) {          if (NULL == eqn_nextrawtok(ep, NULL)) {
                 EQN_MSG(MANDOCERR_EQNEOF, ep);                  EQN_MSG(MANDOCERR_EQNEOF, ep);
                 return(0);                  return(0);
         }          }
         return(1);          return(1);
 }  }
   
Line 914  eqn_do_gsize(struct eqn_node *ep)
Line 931  eqn_do_gsize(struct eqn_node *ep)
         if (NULL == (start = eqn_nextrawtok(ep, &sz))) {          if (NULL == (start = eqn_nextrawtok(ep, &sz))) {
                 EQN_MSG(MANDOCERR_EQNEOF, ep);                  EQN_MSG(MANDOCERR_EQNEOF, ep);
                 return(0);                  return(0);
         }          }
         ep->gsize = mandoc_strntoi(start, sz, 10);          ep->gsize = mandoc_strntoi(start, sz, 10);
         return(1);          return(1);
 }  }
Line 940  eqn_def_find(struct eqn_node *ep, const char *key, siz
Line 957  eqn_def_find(struct eqn_node *ep, const char *key, siz
 {  {
         int              i;          int              i;
   
         for (i = 0; i < (int)ep->defsz; i++)          for (i = 0; i < (int)ep->defsz; i++)
                 if (ep->defs[i].keysz && STRNEQ(ep->defs[i].key,                  if (ep->defs[i].keysz && STRNEQ(ep->defs[i].key,
                                         ep->defs[i].keysz, key, sz))                      ep->defs[i].keysz, key, sz))
                         return(&ep->defs[i]);                          return(&ep->defs[i]);
   
         return(NULL);          return(NULL);

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.46

CVSweb