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

Diff for /mandoc/eqn.c between version 1.65 and 1.66

version 1.65, 2017/06/21 18:38:26 version 1.66, 2017/06/21 20:50:50
Line 1 
Line 1 
 /*      $Id$ */  /*      $OpenBSD$ */
 /*  /*
  * Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
Line 20 
Line 20 
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
   #include <ctype.h>
 #include <limits.h>  #include <limits.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 718  static enum rofferr
Line 719  static enum rofferr
 eqn_parse(struct eqn_node *ep, struct eqn_box *parent)  eqn_parse(struct eqn_node *ep, struct eqn_box *parent)
 {  {
         char             sym[64];          char             sym[64];
         struct eqn_box  *cur;          struct eqn_box  *cur, *fontp, *nbox;
         const char      *start;          const char      *cp, *cpn, *start;
         char            *p;          char            *p;
         size_t           sz;          size_t           sz;
         enum eqn_tok     tok, subtok;          enum eqn_tok     tok, subtok;
Line 1092  this_tok:
Line 1093  this_tok:
                  */                   */
                 while (parent->args == parent->expectargs)                  while (parent->args == parent->expectargs)
                         parent = parent->parent;                          parent = parent->parent;
                 if (tok == EQN_TOK_FUNC) {                  /*
                         for (cur = parent; cur != NULL; cur = cur->parent)                   * Wrap well-known function names in a roman box,
                                 if (cur->font != EQNFONT_NONE)                   * unless they already are in roman context.
                                         break;                   */
                         if (cur == NULL || cur->font != EQNFONT_ROMAN) {                  for (fontp = parent; fontp != NULL; fontp = fontp->parent)
                                 parent = eqn_box_alloc(ep, parent);                          if (fontp->font != EQNFONT_NONE)
                                 parent->type = EQN_LISTONE;                                  break;
                                 parent->font = EQNFONT_ROMAN;                  if (tok == EQN_TOK_FUNC &&
                                 parent->expectargs = 1;                      (fontp == NULL || fontp->font != EQNFONT_ROMAN)) {
                         }                          parent = fontp = eqn_box_alloc(ep, parent);
                           parent->type = EQN_LISTONE;
                           parent->font = EQNFONT_ROMAN;
                           parent->expectargs = 1;
                 }                  }
                 cur = eqn_box_alloc(ep, parent);                  cur = eqn_box_alloc(ep, parent);
                 cur->type = EQN_TEXT;                  cur->type = EQN_TEXT;
                 cur->text = p;                  cur->text = p;
                   /*
                    * If not inside any explicit font context,
                    * give every letter its own box.
                    */
                   if (fontp == NULL && *p != '\0') {
                           cp = p;
                           for (;;) {
                                   cpn = cp + 1;
                                   if (*cp == '\\')
                                           mandoc_escape(&cpn, NULL, NULL);
                                   if (*cpn == '\0')
                                           break;
                                   if (isalpha((unsigned char)*cp) == 0 &&
                                       isalpha((unsigned char)*cpn) == 0) {
                                           cp = cpn;
                                           continue;
                                   }
                                   nbox = eqn_box_alloc(ep, parent);
                                   nbox->type = EQN_TEXT;
                                   nbox->text = mandoc_strdup(cpn);
                                   p = mandoc_strndup(cur->text,
                                       cpn - cur->text);
                                   free(cur->text);
                                   cur->text = p;
                                   cur = nbox;
                                   cp = nbox->text;
                           }
                   }
                 /*                  /*
                  * Post-process list status.                   * Post-process list status.
                  */                   */

Legend:
Removed from v.1.65  
changed lines
  Added in v.1.66

CVSweb