summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-07-20 14:09:38 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-07-20 14:09:38 +0000
commit94a9d688b92e28a5ccd562894a0046846845290d (patch)
tree0d74ef8e9b5958b3350fa6071e0eb8d18fedc4b3
parent34dca748dc29fb6f67ea985a67a6cb4b8ef2c127 (diff)
downloadmandoc-94a9d688b92e28a5ccd562894a0046846845290d.tar.gz
mandoc-94a9d688b92e28a5ccd562894a0046846845290d.tar.zst
mandoc-94a9d688b92e28a5ccd562894a0046846845290d.zip
Replaced ugly TABSEP handling with simpler routine.
-rw-r--r--libmdoc.h3
-rw-r--r--mdoc.c3
-rw-r--r--mdoc_argv.c79
3 files changed, 32 insertions, 53 deletions
diff --git a/libmdoc.h b/libmdoc.h
index d68f2964..5a86094d 100644
--- a/libmdoc.h
+++ b/libmdoc.h
@@ -1,4 +1,4 @@
-/* $Id: libmdoc.h,v 1.20 2009/07/19 21:26:27 kristaps Exp $ */
+/* $Id: libmdoc.h,v 1.21 2009/07/20 14:09:38 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -43,7 +43,6 @@ struct mdoc {
enum merr {
ETAILWS = 0,
- ECOLEMPTY,
EQUOTPARM,
EQUOTTERM,
EMALLOC,
diff --git a/mdoc.c b/mdoc.c
index 96d36d40..67cf61f0 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.94 2009/07/17 12:27:49 kristaps Exp $ */
+/* $Id: mdoc.c,v 1.95 2009/07/20 14:09:38 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -25,7 +25,6 @@
const char *const __mdoc_merrnames[MERRMAX] = {
"trailing whitespace", /* ETAILWS */
- "empty last list column", /* ECOLEMPTY */
"unexpected quoted parameter", /* EQUOTPARM */
"unterminated quoted parameter", /* EQUOTTERM */
"system: malloc error", /* EMALLOC */
diff --git a/mdoc_argv.c b/mdoc_argv.c
index cb3e2404..5e6865fc 100644
--- a/mdoc_argv.c
+++ b/mdoc_argv.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_argv.c,v 1.19 2009/07/19 21:26:27 kristaps Exp $ */
+/* $Id: mdoc_argv.c,v 1.20 2009/07/20 14:09:38 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -376,7 +376,7 @@ static int
args(struct mdoc *m, int line, int *pos,
char *buf, int fl, char **v)
{
- int i;
+ int i, psv;
char *p, *pp;
assert(*pos);
@@ -421,7 +421,9 @@ args(struct mdoc *m, int line, int *pos,
*/
if (ARGS_TABSEP & fl) {
- /* Scan ahead to unescaped tab. */
+ psv = *pos;
+
+ /* Scan ahead to tab (can't be escaped). */
p = strchr(*v, '\t');
/* Scan ahead to unescaped `Ta'. */
@@ -434,59 +436,38 @@ args(struct mdoc *m, int line, int *pos,
break;
}
- /* Choose delimiter tab/Ta. */
- if (p && pp)
- p = (p < pp ? p : pp);
- else if ( ! p && pp)
+ if (p && pp) {
+ *pos += pp < p ? 2 : 1;
+ p = pp < p ? pp : p;
+ } else if (p && ! pp) {
+ *pos += 1;
+ } else if (pp && ! p) {
p = pp;
+ *pos += 2;
+ } else
+ p = strchr(*v, 0);
- /* Strip delimiter's preceding whitespace. */
- /* FIXME: escaped whitespace? */
- if (p && p > *v) {
- pp = p - 1;
- while (pp > *v && ' ' == *pp)
- pp--;
- if (pp == *v && ' ' == *pp)
- *pp = 0;
- else if (' ' == *pp)
- *(pp + 1) = 0;
- }
-
- /* ...in- and proceding whitespace. */
- if (p && ('\t' != *p)) {
- *p++ = 0;
- *p++ = 0;
- } else if (p)
- *p++ = 0;
-
- if (p) {
- while (' ' == *p)
- p++;
- if (0 != *p)
- *(p - 1) = 0;
- *pos += (int)(p - *v);
- }
-
- /* Some warnings, if applicable. */
- if (p && 0 == *p)
- if ( ! mdoc_pwarn(m, line, *pos, ECOLEMPTY))
- return(ARGS_ERROR);
- if (p && 0 == *p && p > *v && ' ' == *(p - 1))
+ if (0 == *p && ' ' == *(p - 1))
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
return(ARGS_ERROR);
- /* Non-eoln case returns now. */
- if (p)
- return(ARGS_PHRASE);
+ *p = 0;
+ *pos += (int)(p - *v);
+
+ /* Strip delimiter's preceding whitespace. */
- /* Configure the eoln case, too. */
- p = strchr(*v, 0);
- assert(p);
+ pp = p - 1;
+ while (pp > *v && ' ' == *pp) {
+ if (pp > *v && '\\' == *(pp - 1))
+ break;
+ pp--;
+ }
+ *(pp + 1) = 0;
- if (p > *v && ' ' == *(p - 1))
- if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
- return(ARGS_ERROR);
- *pos += (int)(p - *v);
+ /* Strip delimiter's proceeding whitespace. */
+
+ for (pp = &buf[*pos]; ' ' == *pp; pp++, (*pos)++)
+ /* Skip ahead. */ ;
return(ARGS_PHRASE);
}