Return to tbl.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.11, 2010/12/31 18:19:43 | version 1.24, 2011/03/22 09:48:13 | ||
---|---|---|---|
|
|
||
/* $Id$ */ | /* $Id$ */ | ||
/* | /* | ||
* Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> | * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> | ||
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> | |||
* | * | ||
* Permission to use, copy, modify, and distribute this software for any | * Permission to use, copy, modify, and distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | * purpose with or without fee is hereby granted, provided that the above | ||
|
|
||
#include <time.h> | #include <time.h> | ||
#include "mandoc.h" | #include "mandoc.h" | ||
#include "roff.h" | |||
#include "libmandoc.h" | #include "libmandoc.h" | ||
#include "libroff.h" | #include "libroff.h" | ||
enum rofferr | enum rofferr | ||
tbl_read(struct tbl *tbl, int ln, const char *p, int offs) | tbl_read(struct tbl_node *tbl, int ln, const char *p, int offs) | ||
{ | { | ||
int len; | int len; | ||
const char *cp; | const char *cp; | ||
|
|
||
return(tbl_option(tbl, ln, p) ? ROFF_IGN : ROFF_ERR); | return(tbl_option(tbl, ln, p) ? ROFF_IGN : ROFF_ERR); | ||
case (TBL_PART_LAYOUT): | case (TBL_PART_LAYOUT): | ||
return(tbl_layout(tbl, ln, p) ? ROFF_IGN : ROFF_ERR); | return(tbl_layout(tbl, ln, p) ? ROFF_IGN : ROFF_ERR); | ||
case (TBL_PART_DATA): | case (TBL_PART_CDATA): | ||
return(tbl_cdata(tbl, ln, p) ? ROFF_TBL : ROFF_IGN); | |||
default: | |||
break; | break; | ||
} | } | ||
/* | /* | ||
* FIXME: allow the original string to slip through for the time | * This only returns zero if the line is empty, so we ignore it | ||
* being. | * and continue on. | ||
*/ | */ | ||
return(tbl_data(tbl, ln, p) ? ROFF_CONT : ROFF_ERR); | return(tbl_data(tbl, ln, p) ? ROFF_TBL : ROFF_IGN); | ||
} | } | ||
struct tbl * | struct tbl_node * | ||
tbl_alloc(void *data, const mandocmsg msg) | tbl_alloc(int pos, int line, struct mparse *parse) | ||
{ | { | ||
struct tbl *p; | struct tbl_node *p; | ||
p = mandoc_calloc(1, sizeof(struct tbl)); | p = mandoc_calloc(1, sizeof(struct tbl_node)); | ||
p->data = data; | p->line = line; | ||
p->msg = msg; | p->pos = pos; | ||
p->parse = parse; | |||
p->part = TBL_PART_OPTS; | p->part = TBL_PART_OPTS; | ||
p->tab = '\t'; | p->opts.tab = '\t'; | ||
p->linesize = 12; | p->opts.linesize = 12; | ||
p->decimal = '.'; | p->opts.decimal = '.'; | ||
return(p); | return(p); | ||
} | } | ||
void | void | ||
tbl_free(struct tbl *p) | tbl_free(struct tbl_node *p) | ||
{ | { | ||
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; | ||
struct tbl_head *hp; | |||
while (p->first_row) { | while (NULL != (rp = p->first_row)) { | ||
rp = p->first_row; | |||
p->first_row = rp->next; | p->first_row = rp->next; | ||
while (rp->first) { | while (rp->first) { | ||
cp = rp->first; | cp = rp->first; | ||
|
|
||
free(rp); | free(rp); | ||
} | } | ||
while (p->first_span) { | while (NULL != (sp = p->first_span)) { | ||
sp = p->first_span; | |||
p->first_span = sp->next; | p->first_span = sp->next; | ||
while (sp->first) { | while (sp->first) { | ||
dp = sp->first; | dp = sp->first; | ||
|
|
||
free(sp); | free(sp); | ||
} | } | ||
while (NULL != (hp = p->first_head)) { | |||
p->first_head = hp->next; | |||
free(hp); | |||
} | |||
free(p); | free(p); | ||
} | } | ||
void | void | ||
tbl_restart(struct tbl *tbl) | tbl_restart(int line, int pos, struct tbl_node *tbl) | ||
{ | { | ||
if (TBL_PART_CDATA == tbl->part) | |||
mandoc_msg(MANDOCERR_TBLBLOCK, tbl->parse, | |||
tbl->line, tbl->pos, NULL); | |||
tbl->part = TBL_PART_LAYOUT; | tbl->part = TBL_PART_LAYOUT; | ||
tbl->line = line; | |||
tbl->pos = pos; | |||
if (NULL == tbl->first_span || NULL == tbl->first_span->first) | |||
mandoc_msg(MANDOCERR_TBLNODATA, tbl->parse, | |||
tbl->line, tbl->pos, NULL); | |||
} | } | ||
const struct tbl_span * | const struct tbl_span * | ||
tbl_span(const struct tbl *tbl) | tbl_span(struct tbl_node *tbl) | ||
{ | { | ||
struct tbl_span *span; | |||
assert(tbl); | assert(tbl); | ||
return(tbl->last_span); | span = tbl->current_span ? tbl->current_span->next | ||
: tbl->first_span; | |||
if (span) | |||
tbl->current_span = span; | |||
return(span); | |||
} | } | ||
void | |||
tbl_end(struct tbl_node *tbl) | |||
{ | |||
if (NULL == tbl->first_span || NULL == tbl->first_span->first) | |||
mandoc_msg(MANDOCERR_TBLNODATA, tbl->parse, | |||
tbl->line, tbl->pos, NULL); | |||
if (tbl->last_span) | |||
tbl->last_span->flags |= TBL_SPAN_LAST; | |||
if (TBL_PART_CDATA == tbl->part) | |||
mandoc_msg(MANDOCERR_TBLBLOCK, tbl->parse, | |||
tbl->line, tbl->pos, NULL); | |||
} | |||