version 1.65, 2017/06/21 18:38:26 |
version 1.66, 2017/06/21 20:50:50 |
|
|
/* $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> |
|
|
#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; |
|
|
*/ |
*/ |
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. |
*/ |
*/ |