Return to tbl_layout.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.33, 2015/01/27 05:21:45 | version 1.41, 2015/10/12 00:08:16 | ||
---|---|---|---|
|
|
||
switch (tolower((unsigned char)p[(*pos)++])) { | switch (tolower((unsigned char)p[(*pos)++])) { | ||
case 'b': | case 'b': | ||
/* FALLTHROUGH */ | cp->flags |= TBL_CELL_BOLD; | ||
case 'i': | goto mod; | ||
/* FALLTHROUGH */ | |||
case 'r': | |||
(*pos)--; | |||
break; | |||
case 'd': | case 'd': | ||
cp->flags |= TBL_CELL_BALIGN; | cp->flags |= TBL_CELL_BALIGN; | ||
goto mod; | goto mod; | ||
|
|
||
goto mod; | goto mod; | ||
case 'f': | case 'f': | ||
break; | break; | ||
case 'i': | |||
cp->flags |= TBL_CELL_ITALIC; | |||
goto mod; | |||
case 'm': | case 'm': | ||
mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, tbl->parse, | mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, tbl->parse, | ||
ln, *pos, "m"); | ln, *pos, "m"); | ||
goto mod; | goto mod; | ||
case 'p': | case 'p': | ||
/* FALLTHROUGH */ | |||
case 'v': | case 'v': | ||
if (p[*pos] == '-' || p[*pos] == '+') | if (p[*pos] == '-' || p[*pos] == '+') | ||
(*pos)++; | (*pos)++; | ||
|
|
||
goto mod; | goto mod; | ||
} | } | ||
switch (tolower((unsigned char)p[(*pos)++])) { | /* Ignore parenthised font names for now. */ | ||
if (p[*pos] == '(') | |||
goto mod; | |||
/* Support only one-character font-names for now. */ | |||
if (p[*pos] == '\0' || (p[*pos + 1] != ' ' && p[*pos + 1] != '.')) { | |||
mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse, | |||
ln, *pos, "TS %s", p + *pos - 1); | |||
if (p[*pos] != '\0') | |||
(*pos)++; | |||
if (p[*pos] != '\0') | |||
(*pos)++; | |||
goto mod; | |||
} | |||
switch (p[(*pos)++]) { | |||
case '3': | case '3': | ||
/* FALLTHROUGH */ | case 'B': | ||
case 'b': | |||
cp->flags |= TBL_CELL_BOLD; | cp->flags |= TBL_CELL_BOLD; | ||
goto mod; | goto mod; | ||
case '2': | case '2': | ||
/* FALLTHROUGH */ | case 'I': | ||
case 'i': | |||
cp->flags |= TBL_CELL_ITALIC; | cp->flags |= TBL_CELL_ITALIC; | ||
goto mod; | goto mod; | ||
case '1': | case '1': | ||
/* FALLTHROUGH */ | case 'R': | ||
case 'r': | |||
goto mod; | goto mod; | ||
default: | default: | ||
mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse, | mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse, | ||
|
|
||
} | } | ||
void | void | ||
tbl_layout(struct tbl_node *tbl, int ln, const char *p) | tbl_layout(struct tbl_node *tbl, int ln, const char *p, int pos) | ||
{ | { | ||
struct tbl_row *rp; | struct tbl_row *rp; | ||
int pos; | |||
pos = 0; | |||
rp = NULL; | rp = NULL; | ||
for (;;) { | for (;;) { | ||
/* Skip whitespace before and after each cell. */ | /* Skip whitespace before and after each cell. */ | ||
|
|
||
*/ | */ | ||
if (tbl->first_row == NULL) { | if (tbl->first_row == NULL) { | ||
tbl->first_row = tbl->last_row = | |||
mandoc_calloc(1, sizeof(*rp)); | |||
} | |||
if (tbl->first_row->first == NULL) { | |||
mandoc_msg(MANDOCERR_TBLLAYOUT_NONE, | mandoc_msg(MANDOCERR_TBLLAYOUT_NONE, | ||
tbl->parse, ln, pos, NULL); | tbl->parse, ln, pos, NULL); | ||
rp = mandoc_calloc(1, sizeof(*rp)); | cell_alloc(tbl, tbl->first_row, | ||
cell_alloc(tbl, rp, TBL_CELL_LEFT); | TBL_CELL_LEFT); | ||
tbl->first_row = tbl->last_row = rp; | |||
return; | return; | ||
} | } | ||
|
|
||
if (tbl->opts.lvert < rp->vert) | if (tbl->opts.lvert < rp->vert) | ||
tbl->opts.lvert = rp->vert; | tbl->opts.lvert = rp->vert; | ||
if (rp->last != NULL && | if (rp->last != NULL && | ||
rp->last->head == tbl->last_head && | rp->last->col + 1 == tbl->opts.cols && | ||
tbl->opts.rvert < rp->last->vert) | tbl->opts.rvert < rp->last->vert) | ||
tbl->opts.rvert = rp->last->vert; | tbl->opts.rvert = rp->last->vert; | ||
/* If the last line is empty, drop it. */ | |||
if (rp->next != NULL && | |||
rp->next->first == NULL) { | |||
free(rp->next); | |||
rp->next = NULL; | |||
tbl->last_row = rp; | |||
} | |||
} | } | ||
return; | return; | ||
default: /* Cell. */ | default: /* Cell. */ | ||
break; | break; | ||
} | } | ||
if (rp == NULL) { /* First cell on this line. */ | /* | ||
rp = mandoc_calloc(1, sizeof(*rp)); | * If the last line had at least one cell, | ||
if (tbl->last_row) | * start a new one; otherwise, continue it. | ||
tbl->last_row->next = rp; | */ | ||
else | |||
tbl->first_row = rp; | if (rp == NULL) { | ||
tbl->last_row = rp; | if (tbl->last_row == NULL || | ||
tbl->last_row->first != NULL) { | |||
rp = mandoc_calloc(1, sizeof(*rp)); | |||
if (tbl->last_row) | |||
tbl->last_row->next = rp; | |||
else | |||
tbl->first_row = rp; | |||
tbl->last_row = rp; | |||
} else | |||
rp = tbl->last_row; | |||
} | } | ||
cell(tbl, rp, ln, p, &pos); | cell(tbl, rp, ln, p, &pos); | ||
} | } | ||
|
|
||
cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos) | cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos) | ||
{ | { | ||
struct tbl_cell *p, *pp; | struct tbl_cell *p, *pp; | ||
struct tbl_head *h, *hp; | |||
p = mandoc_calloc(1, sizeof(struct tbl_cell)); | p = mandoc_calloc(1, sizeof(*p)); | ||
p->pos = pos; | |||
if (NULL != (pp = rp->last)) { | if ((pp = rp->last) != NULL) { | ||
pp->next = p; | pp->next = p; | ||
h = pp->head->next; | p->col = pp->col + 1; | ||
} else { | } else | ||
rp->first = p; | rp->first = p; | ||
h = tbl->first_head; | |||
} | |||
rp->last = p; | rp->last = p; | ||
p->pos = pos; | if (tbl->opts.cols <= p->col) | ||
tbl->opts.cols = p->col + 1; | |||
/* Re-use header. */ | return p; | ||
if (h) { | |||
p->head = h; | |||
return(p); | |||
} | |||
hp = mandoc_calloc(1, sizeof(struct tbl_head)); | |||
hp->ident = tbl->opts.cols++; | |||
if (tbl->last_head) { | |||
hp->prev = tbl->last_head; | |||
tbl->last_head->next = hp; | |||
} else | |||
tbl->first_head = hp; | |||
tbl->last_head = hp; | |||
p->head = hp; | |||
return(p); | |||
} | } |