Return to tbl.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.42, 2017/07/08 17:52:50 | version 1.46, 2018/12/14 06:33:14 | ||
---|---|---|---|
|
|
||
#include <string.h> | #include <string.h> | ||
#include <time.h> | #include <time.h> | ||
#include "mandoc.h" | |||
#include "mandoc_aux.h" | #include "mandoc_aux.h" | ||
#include "mandoc.h" | |||
#include "tbl.h" | |||
#include "libmandoc.h" | #include "libmandoc.h" | ||
#include "libroff.h" | #include "tbl_parse.h" | ||
#include "tbl_int.h" | |||
void | void | ||
|
|
||
} | } | ||
struct tbl_node * | struct tbl_node * | ||
tbl_alloc(int pos, int line, struct mparse *parse) | tbl_alloc(int pos, int line, struct tbl_node *last_tbl) | ||
{ | { | ||
struct tbl_node *tbl; | struct tbl_node *tbl; | ||
tbl = mandoc_calloc(1, sizeof(*tbl)); | tbl = mandoc_calloc(1, sizeof(*tbl)); | ||
if (last_tbl != NULL) | |||
last_tbl->next = tbl; | |||
tbl->line = line; | tbl->line = line; | ||
tbl->pos = pos; | tbl->pos = pos; | ||
tbl->parse = parse; | |||
tbl->part = TBL_PART_OPTS; | tbl->part = TBL_PART_OPTS; | ||
tbl->opts.tab = '\t'; | tbl->opts.tab = '\t'; | ||
tbl->opts.decimal = '.'; | tbl->opts.decimal = '.'; | ||
|
|
||
void | void | ||
tbl_free(struct tbl_node *tbl) | tbl_free(struct tbl_node *tbl) | ||
{ | { | ||
struct tbl_node *old_tbl; | |||
struct tbl_row *rp; | struct tbl_row *rp; | ||
struct tbl_cell *cp; | struct tbl_cell *cp; | ||
struct tbl_span *sp; | struct tbl_span *sp; | ||
struct tbl_dat *dp; | struct tbl_dat *dp; | ||
while ((rp = tbl->first_row) != NULL) { | while (tbl != NULL) { | ||
tbl->first_row = rp->next; | while ((rp = tbl->first_row) != NULL) { | ||
while (rp->first != NULL) { | tbl->first_row = rp->next; | ||
cp = rp->first; | while (rp->first != NULL) { | ||
rp->first = cp->next; | cp = rp->first; | ||
free(cp->wstr); | rp->first = cp->next; | ||
free(cp); | free(cp->wstr); | ||
free(cp); | |||
} | |||
free(rp); | |||
} | } | ||
free(rp); | while ((sp = tbl->first_span) != NULL) { | ||
} | tbl->first_span = sp->next; | ||
while (sp->first != NULL) { | |||
while ((sp = tbl->first_span) != NULL) { | dp = sp->first; | ||
tbl->first_span = sp->next; | sp->first = dp->next; | ||
while (sp->first != NULL) { | free(dp->string); | ||
dp = sp->first; | free(dp); | ||
sp->first = dp->next; | } | ||
free(dp->string); | free(sp); | ||
free(dp); | |||
} | } | ||
free(sp); | old_tbl = tbl; | ||
tbl = tbl->next; | |||
free(old_tbl); | |||
} | } | ||
free(tbl); | |||
} | } | ||
void | void | ||
tbl_restart(int line, int pos, struct tbl_node *tbl) | tbl_restart(int line, int pos, struct tbl_node *tbl) | ||
{ | { | ||
if (tbl->part == TBL_PART_CDATA) | if (tbl->part == TBL_PART_CDATA) | ||
mandoc_msg(MANDOCERR_TBLDATA_BLK, tbl->parse, | mandoc_msg(MANDOCERR_TBLDATA_BLK, line, pos, "T&"); | ||
line, pos, "T&"); | |||
tbl->part = TBL_PART_LAYOUT; | tbl->part = TBL_PART_LAYOUT; | ||
tbl->line = line; | tbl->line = line; | ||
tbl->pos = pos; | tbl->pos = pos; | ||
} | } | ||
const struct tbl_span * | struct tbl_span * | ||
tbl_span(struct tbl_node *tbl) | tbl_span(struct tbl_node *tbl) | ||
{ | { | ||
struct tbl_span *span; | struct tbl_span *span; | ||
assert(tbl); | |||
span = tbl->current_span ? tbl->current_span->next | span = tbl->current_span ? tbl->current_span->next | ||
: tbl->first_span; | : tbl->first_span; | ||
if (span) | if (span != NULL) | ||
tbl->current_span = span; | tbl->current_span = span; | ||
return span; | return span; | ||
} | } | ||
int | int | ||
tbl_end(struct tbl_node *tbl) | tbl_end(struct tbl_node *tbl, int still_open) | ||
{ | { | ||
struct tbl_span *sp; | struct tbl_span *sp; | ||
if (tbl->part == TBL_PART_CDATA) | if (still_open) | ||
mandoc_msg(MANDOCERR_TBLDATA_BLK, tbl->parse, | mandoc_msg(MANDOCERR_BLK_NOEND, tbl->line, tbl->pos, "TS"); | ||
tbl->line, tbl->pos, "TE"); | else if (tbl->part == TBL_PART_CDATA) | ||
mandoc_msg(MANDOCERR_TBLDATA_BLK, tbl->line, tbl->pos, "TE"); | |||
sp = tbl->first_span; | sp = tbl->first_span; | ||
while (sp != NULL && sp->first == NULL) | while (sp != NULL && sp->first == NULL) | ||
sp = sp->next; | sp = sp->next; | ||
if (sp == NULL) { | if (sp == NULL) { | ||
mandoc_msg(MANDOCERR_TBLDATA_NONE, tbl->parse, | mandoc_msg(MANDOCERR_TBLDATA_NONE, tbl->line, tbl->pos, NULL); | ||
tbl->line, tbl->pos, NULL); | |||
return 0; | return 0; | ||
} | } | ||
return 1; | return 1; |