version 1.74, 2017/07/06 00:19:54 |
version 1.75, 2017/07/07 17:16:17 |
Line 286 enum parse_mode { |
|
Line 286 enum parse_mode { |
|
static struct eqn_box *eqn_box_alloc(struct eqn_node *, struct eqn_box *); |
static struct eqn_box *eqn_box_alloc(struct eqn_node *, struct eqn_box *); |
static void eqn_box_free(struct eqn_box *); |
static void eqn_box_free(struct eqn_box *); |
static struct eqn_box *eqn_box_makebinary(struct eqn_node *, |
static struct eqn_box *eqn_box_makebinary(struct eqn_node *, |
enum eqn_post, struct eqn_box *); |
struct eqn_box *); |
static void eqn_def(struct eqn_node *); |
static void eqn_def(struct eqn_node *); |
static struct eqn_def *eqn_def_find(struct eqn_node *); |
static struct eqn_def *eqn_def_find(struct eqn_node *); |
static void eqn_delim(struct eqn_node *); |
static void eqn_delim(struct eqn_node *); |
Line 541 eqn_box_alloc(struct eqn_node *ep, struct eqn_box *par |
|
Line 541 eqn_box_alloc(struct eqn_node *ep, struct eqn_box *par |
|
* The new EQN_SUBEXPR will have a two-child limit. |
* The new EQN_SUBEXPR will have a two-child limit. |
*/ |
*/ |
static struct eqn_box * |
static struct eqn_box * |
eqn_box_makebinary(struct eqn_node *ep, |
eqn_box_makebinary(struct eqn_node *ep, struct eqn_box *parent) |
enum eqn_post pos, struct eqn_box *parent) |
|
{ |
{ |
struct eqn_box *b, *newb; |
struct eqn_box *b, *newb; |
|
|
Line 554 eqn_box_makebinary(struct eqn_node *ep, |
|
Line 553 eqn_box_makebinary(struct eqn_node *ep, |
|
parent->last = b->prev; |
parent->last = b->prev; |
b->prev = NULL; |
b->prev = NULL; |
newb = eqn_box_alloc(ep, parent); |
newb = eqn_box_alloc(ep, parent); |
newb->pos = pos; |
|
newb->type = EQN_SUBEXPR; |
newb->type = EQN_SUBEXPR; |
newb->expectargs = 2; |
newb->expectargs = 2; |
newb->args = 1; |
newb->args = 1; |
Line 669 eqn_parse(struct eqn_node *ep, struct eqn_box *parent) |
|
Line 667 eqn_parse(struct eqn_node *ep, struct eqn_box *parent) |
|
const char *cp, *cpn; |
const char *cp, *cpn; |
char *p; |
char *p; |
enum eqn_tok tok; |
enum eqn_tok tok; |
enum eqn_post pos; |
|
enum { CCL_LET, CCL_DIG, CCL_PUN } ccl, ccln; |
enum { CCL_LET, CCL_DIG, CCL_PUN } ccl, ccln; |
int size; |
int size; |
|
|
|
|
cur->type = EQN_TEXT; |
cur->type = EQN_TEXT; |
cur->text = mandoc_strdup(""); |
cur->text = mandoc_strdup(""); |
} |
} |
parent = eqn_box_makebinary(ep, EQNPOS_NONE, parent); |
parent = eqn_box_makebinary(ep, parent); |
parent->type = EQN_LIST; |
parent->type = EQN_LIST; |
parent->expectargs = 1; |
parent->expectargs = 1; |
parent->font = EQNFONT_ROMAN; |
parent->font = EQNFONT_ROMAN; |
|
|
parent->pos = EQNPOS_FROMTO; |
parent->pos = EQNPOS_FROMTO; |
break; |
break; |
} |
} |
|
parent = eqn_box_makebinary(ep, parent); |
switch (tok) { |
switch (tok) { |
case EQN_TOK_FROM: |
case EQN_TOK_FROM: |
pos = EQNPOS_FROM; |
parent->pos = EQNPOS_FROM; |
break; |
break; |
case EQN_TOK_TO: |
case EQN_TOK_TO: |
pos = EQNPOS_TO; |
parent->pos = EQNPOS_TO; |
break; |
break; |
case EQN_TOK_SUP: |
case EQN_TOK_SUP: |
pos = EQNPOS_SUP; |
parent->pos = EQNPOS_SUP; |
break; |
break; |
case EQN_TOK_SUB: |
case EQN_TOK_SUB: |
pos = EQNPOS_SUB; |
parent->pos = EQNPOS_SUB; |
break; |
break; |
default: |
default: |
abort(); |
abort(); |
} |
} |
parent = eqn_box_makebinary(ep, pos, parent); |
|
break; |
break; |
case EQN_TOK_SQRT: |
case EQN_TOK_SQRT: |
while (parent->args == parent->expectargs) |
while (parent->args == parent->expectargs) |
|
|
parent = parent->parent; |
parent = parent->parent; |
while (EQN_SUBEXPR == parent->type) |
while (EQN_SUBEXPR == parent->type) |
parent = parent->parent; |
parent = parent->parent; |
parent = eqn_box_makebinary(ep, EQNPOS_OVER, parent); |
parent = eqn_box_makebinary(ep, parent); |
|
parent->pos = EQNPOS_OVER; |
break; |
break; |
case EQN_TOK_RIGHT: |
case EQN_TOK_RIGHT: |
case EQN_TOK_BRACE_CLOSE: |
case EQN_TOK_BRACE_CLOSE: |