summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--libroff.h19
-rw-r--r--tbl.c15
-rw-r--r--tbl_data.c96
4 files changed, 132 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index 4c885280..6a4336b4 100644
--- a/Makefile
+++ b/Makefile
@@ -31,11 +31,11 @@ CFLAGS += -g $(WFLAGS) $(VFLAGS) -DHAVE_CONFIG_H
LINTFLAGS += $(VFLAGS)
-ROFFLNS = roff.ln tbl.ln tbl_opts.ln tbl_layout.ln
+ROFFLNS = roff.ln tbl.ln tbl_opts.ln tbl_layout.ln tbl_data.ln
-ROFFSRCS = roff.c tbl.c tbl_opts.c tbl_layout.c
+ROFFSRCS = roff.c tbl.c tbl_opts.c tbl_layout.c tbl_data.c
-ROFFOBJS = roff.o tbl.o tbl_opts.o tbl_layout.o
+ROFFOBJS = roff.o tbl.o tbl_opts.o tbl_layout.o tbl_data.o
MANDOCLNS = mandoc.ln
diff --git a/libroff.h b/libroff.h
index 05889954..3a7275c3 100644
--- a/libroff.h
+++ b/libroff.h
@@ -60,6 +60,24 @@ struct tbl_row {
struct tbl_cell *last;
};
+struct tbl_dat {
+ struct tbl_dat *next;
+ char *string;
+ int flags;
+#define TBL_DATA_HORIZ (1 << 0)
+#define TBL_DATA_DHORIZ (1 << 1)
+#define TBL_DATA_NHORIZ (1 << 2)
+#define TBL_DATA_NDHORIZ (1 << 3)
+};
+
+struct tbl_span {
+ struct tbl_dat *first;
+ struct tbl_dat *last;
+ int flags;
+#define TBL_SPAN_HORIZ (1 << 0)
+#define TBL_SPAN_DHORIZ (1 << 1)
+};
+
struct tbl {
mandocmsg msg; /* status messages */
void *data; /* privdata for messages */
@@ -90,6 +108,7 @@ void tbl_reset(struct tbl *);
enum rofferr tbl_read(struct tbl *, int, const char *, int);
int tbl_option(struct tbl *, int, const char *);
int tbl_layout(struct tbl *, int, const char *);
+struct tbl_span *tbl_data(struct tbl *, int, const char *);
__END_DECLS
diff --git a/tbl.c b/tbl.c
index db468617..14fd32b9 100644
--- a/tbl.c
+++ b/tbl.c
@@ -63,6 +63,8 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
{
int len;
const char *cp;
+ struct tbl_dat *dp;
+ struct tbl_span *sp;
cp = &p[offs];
len = (int)strlen(cp);
@@ -85,9 +87,20 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
return(tbl_option(tbl, ln, p) ? ROFF_IGN : ROFF_ERR);
case (TBL_PART_LAYOUT):
return(tbl_layout(tbl, ln, p) ? ROFF_IGN : ROFF_ERR);
- default:
+ case (TBL_PART_DATA):
break;
}
+
+ /* XXX: throw away data for now. */
+ if (NULL != (sp = tbl_data(tbl, ln, p))) {
+ while (NULL != (dp = sp->first)) {
+ sp->first = sp->first->next;
+ if (dp->string)
+ free(dp->string);
+ free(dp);
+ }
+ free(sp);
+ }
return(ROFF_CONT);
}
diff --git a/tbl_data.c b/tbl_data.c
new file mode 100644
index 00000000..b50ce7f6
--- /dev/null
+++ b/tbl_data.c
@@ -0,0 +1,96 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <assert.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "mandoc.h"
+#include "libmandoc.h"
+#include "libroff.h"
+
+static void data(struct tbl *, struct tbl_span *,
+ int, const char *, int *);
+
+void
+data(struct tbl *tbl, struct tbl_span *dp,
+ int ln, const char *p, int *pos)
+{
+ struct tbl_dat *dat;
+ int sv;
+
+ /* FIXME: warn about losing data contents if cell is HORIZ. */
+
+ dat = mandoc_calloc(1, sizeof(struct tbl_dat));
+
+ if (dp->last) {
+ dp->last->next = dat;
+ dp->last = dat;
+ } else
+ dp->last = dp->first = dat;
+
+ sv = *pos;
+ while (p[*pos] && p[*pos] != tbl->tab)
+ (*pos)++;
+
+ dat->string = mandoc_malloc(*pos - sv + 1);
+ memcpy(dat->string, &p[sv], *pos - sv);
+ dat->string[*pos - sv] = '\0';
+
+ if (p[*pos])
+ (*pos)++;
+
+ /* XXX: do the strcmps, then malloc(). */
+
+ if ( ! strcmp(dat->string, "_"))
+ dat->flags |= TBL_DATA_HORIZ;
+ else if ( ! strcmp(dat->string, "="))
+ dat->flags |= TBL_DATA_DHORIZ;
+ else if ( ! strcmp(dat->string, "\\_"))
+ dat->flags |= TBL_DATA_NHORIZ;
+ else if ( ! strcmp(dat->string, "\\="))
+ dat->flags |= TBL_DATA_NDHORIZ;
+}
+
+struct tbl_span *
+tbl_data(struct tbl *tbl, int ln, const char *p)
+{
+ struct tbl_span *dp;
+ int pos;
+
+ pos = 0;
+
+ if ('\0' == p[pos]) {
+ TBL_MSG(tbl, MANDOCERR_TBL, ln, pos);
+ return(NULL);
+ }
+
+ dp = mandoc_calloc(1, sizeof(struct tbl_span));
+
+ if ( ! strcmp(p, "_")) {
+ dp->flags |= TBL_SPAN_HORIZ;
+ return(dp);
+ } else if ( ! strcmp(p, "=")) {
+ dp->flags |= TBL_SPAN_DHORIZ;
+ return(dp);
+ }
+
+ while ('\0' != p[pos])
+ data(tbl, dp, ln, p, &pos);
+
+ return(dp);
+}