version 1.71, 2017/06/26 20:09:04 |
version 1.74, 2017/07/06 00:19:54 |
Line 683 eqn_parse(struct eqn_node *ep, struct eqn_box *parent) |
|
Line 683 eqn_parse(struct eqn_node *ep, struct eqn_box *parent) |
|
if (ep->data == NULL) |
if (ep->data == NULL) |
return ROFF_IGN; |
return ROFF_IGN; |
|
|
ep->start = ep->end = ep->data; |
ep->start = ep->end = ep->data + strspn(ep->data, " ^~"); |
|
|
next_tok: |
next_tok: |
tok = eqn_next(ep, MODE_TOK); |
tok = eqn_next(ep, MODE_TOK); |
|
|
cur->text = mandoc_strdup(""); |
cur->text = mandoc_strdup(""); |
} |
} |
parent = eqn_box_makebinary(ep, EQNPOS_NONE, parent); |
parent = eqn_box_makebinary(ep, EQNPOS_NONE, parent); |
parent->type = EQN_LISTONE; |
parent->type = EQN_LIST; |
parent->expectargs = 1; |
parent->expectargs = 1; |
parent->font = EQNFONT_ROMAN; |
parent->font = EQNFONT_ROMAN; |
switch (tok) { |
switch (tok) { |
|
|
* exactly one of those. |
* exactly one of those. |
*/ |
*/ |
parent = eqn_box_alloc(ep, parent); |
parent = eqn_box_alloc(ep, parent); |
parent->type = EQN_LISTONE; |
parent->type = EQN_LIST; |
parent->expectargs = 1; |
parent->expectargs = 1; |
switch (tok) { |
switch (tok) { |
case EQN_TOK_FAT: |
case EQN_TOK_FAT: |
|
|
ep->gsize = size; |
ep->gsize = size; |
break; |
break; |
} |
} |
|
while (parent->args == parent->expectargs) |
|
parent = parent->parent; |
parent = eqn_box_alloc(ep, parent); |
parent = eqn_box_alloc(ep, parent); |
parent->type = EQN_LISTONE; |
parent->type = EQN_LIST; |
parent->expectargs = 1; |
parent->expectargs = 1; |
parent->size = size; |
parent->size = size; |
break; |
break; |
|
|
cur->type = EQN_TEXT; |
cur->type = EQN_TEXT; |
cur->text = mandoc_strdup(""); |
cur->text = mandoc_strdup(""); |
} |
} |
/* Handle the "subsup" and "fromto" positions. */ |
while (parent->expectargs == 1 && parent->args == 1) |
if (EQN_TOK_SUP == tok && parent->pos == EQNPOS_SUB) { |
parent = parent->parent; |
|
if (tok == EQN_TOK_FROM || tok == EQN_TOK_TO) { |
|
for (cur = parent; cur != NULL; cur = cur->parent) |
|
if (cur->pos == EQNPOS_SUB || |
|
cur->pos == EQNPOS_SUP || |
|
cur->pos == EQNPOS_SUBSUP || |
|
cur->pos == EQNPOS_SQRT || |
|
cur->pos == EQNPOS_OVER) |
|
break; |
|
if (cur != NULL) |
|
parent = cur->parent; |
|
} |
|
if (tok == EQN_TOK_SUP && parent->pos == EQNPOS_SUB) { |
parent->expectargs = 3; |
parent->expectargs = 3; |
parent->pos = EQNPOS_SUBSUP; |
parent->pos = EQNPOS_SUBSUP; |
break; |
break; |
} |
} |
if (EQN_TOK_TO == tok && parent->pos == EQNPOS_FROM) { |
if (tok == EQN_TOK_TO && parent->pos == EQNPOS_FROM) { |
parent->expectargs = 3; |
parent->expectargs = 3; |
parent->pos = EQNPOS_FROMTO; |
parent->pos = EQNPOS_FROMTO; |
break; |
break; |
|
|
cur->type = EQN_TEXT; |
cur->type = EQN_TEXT; |
cur->text = mandoc_strdup(""); |
cur->text = mandoc_strdup(""); |
} |
} |
|
while (parent->args == parent->expectargs) |
|
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, EQNPOS_OVER, parent); |
|
|
*/ |
*/ |
for (cur = parent; cur != NULL; cur = cur->parent) |
for (cur = parent; cur != NULL; cur = cur->parent) |
if (cur->type == EQN_LIST && |
if (cur->type == EQN_LIST && |
|
cur->expectargs > 1 && |
(tok == EQN_TOK_BRACE_CLOSE || |
(tok == EQN_TOK_BRACE_CLOSE || |
cur->left != NULL)) |
cur->left != NULL)) |
break; |
break; |
|
|
parent->type == EQN_MATRIX)) |
parent->type == EQN_MATRIX)) |
parent = parent->parent; |
parent = parent->parent; |
/* Close out any "singleton" lists. */ |
/* Close out any "singleton" lists. */ |
while (parent->type == EQN_LISTONE && |
while (parent->type == EQN_LIST && |
parent->args == parent->expectargs) |
parent->expectargs == 1 && |
|
parent->args == 1) |
parent = parent->parent; |
parent = parent->parent; |
break; |
break; |
case EQN_TOK_BRACE_OPEN: |
case EQN_TOK_BRACE_OPEN: |
|
|
parent = split->parent; |
parent = split->parent; |
break; |
break; |
} |
} |
/* |
|
* Post-process list status. |
|
*/ |
|
while (parent->type == EQN_LISTONE && |
|
parent->args == parent->expectargs) |
|
parent = parent->parent; |
|
break; |
break; |
default: |
default: |
abort(); |
abort(); |