aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--libmandoc.h3
-rw-r--r--mandoc.c40
-rw-r--r--roff.c53
3 files changed, 34 insertions, 62 deletions
diff --git a/libmandoc.h b/libmandoc.h
index 1515633a..61b3a57f 100644
--- a/libmandoc.h
+++ b/libmandoc.h
@@ -1,4 +1,4 @@
-/* $Id: libmandoc.h,v 1.25 2011/07/25 15:37:00 kristaps Exp $ */
+/* $Id: libmandoc.h,v 1.26 2011/07/27 07:32:26 kristaps Exp $ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -47,7 +47,6 @@ void mandoc_vmsg(enum mandocerr, struct mparse *,
char *mandoc_getarg(struct mparse *, char **, int, int *);
char *mandoc_normdate(struct mparse *, char *, int, int);
int mandoc_eos(const char *, size_t, int);
-int mandoc_hyph(const char *, const char *);
int mandoc_getcontrol(const char *, int *);
int mandoc_strntoi(const char *, size_t, int);
diff --git a/mandoc.c b/mandoc.c
index 8c470f9c..807692ac 100644
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,4 +1,4 @@
-/* $Id: mandoc.c,v 1.57 2011/07/27 07:06:29 kristaps Exp $ */
+/* $Id: mandoc.c,v 1.58 2011/07/27 07:32:26 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -654,44 +654,6 @@ mandoc_eos(const char *p, size_t sz, int enclosed)
}
/*
- * Choose whether to break at a hyphenated character (identified by the
- * ASCII_HYPH value in the input string).
- */
-int
-mandoc_hyph(const char *start, const char *c)
-{
- char l, r;
-
- l = *(c - 1);
- r = *(c + 1);
-
- /* Skip first/last character of buffer. */
- if (c == start || '\0' == r)
- return(0);
-
- /* Skip a number on either side of the hyphen. */
- if (isdigit((unsigned char)r) || isdigit((unsigned char)l))
- return(0);
-
- /* Skip first/last character of word. */
- if ('\t' == r || '\t' == l)
- return(0);
-
- if (' ' == r || ' ' == l)
- return(0);
-
- /* Skip double invocations. */
- if ('-' == r || '-' == l)
- return(0);
-
- /* Skip escapes. */
- if ('\\' == l)
- return(0);
-
- return(1);
-}
-
-/*
* Find out whether a line is a macro line or not. If it is, adjust the
* current position and return one; if it isn't, return zero and don't
* change the current position.
diff --git a/roff.c b/roff.c
index e287a80b..607065fd 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.154 2011/07/27 07:09:41 kristaps Exp $ */
+/* $Id: roff.c,v 1.155 2011/07/27 07:32:26 kristaps Exp $ */
/*
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -143,6 +143,12 @@ struct predef {
#define PREDEF(__name, __str) \
{ (__name), (__str) },
+static enum rofft roffhash_find(const char *, size_t);
+static void roffhash_init(void);
+static void roffnode_cleanscope(struct roff *);
+static void roffnode_pop(struct roff *);
+static void roffnode_push(struct roff *, enum rofft,
+ const char *, int, int);
static enum rofferr roff_block(ROFF_ARGS);
static enum rofferr roff_block_text(ROFF_ARGS);
static enum rofferr roff_block_sub(ROFF_ARGS);
@@ -153,12 +159,15 @@ static enum rofferr roff_cond_text(ROFF_ARGS);
static enum rofferr roff_cond_sub(ROFF_ARGS);
static enum rofferr roff_ds(ROFF_ARGS);
static enum roffrule roff_evalcond(const char *, int *);
+static void roff_free1(struct roff *);
static void roff_freestr(struct roff *);
static char *roff_getname(struct roff *, char **, int, int);
static const char *roff_getstrn(const struct roff *,
const char *, size_t);
static enum rofferr roff_line_ignore(ROFF_ARGS);
static enum rofferr roff_nr(ROFF_ARGS);
+static enum rofft roff_parse(struct roff *, const char *, int *);
+static enum rofferr roff_parsetext(char *);
static void roff_res(struct roff *,
char **, size_t *, int, int);
static enum rofferr roff_rm(ROFF_ARGS);
@@ -172,7 +181,7 @@ static enum rofferr roff_EN(ROFF_ARGS);
static enum rofferr roff_T_(ROFF_ARGS);
static enum rofferr roff_userdef(ROFF_ARGS);
-/* See roff_hash_find() */
+/* See roffhash_find() */
#define ASCII_HI 126
#define ASCII_LO 33
@@ -220,20 +229,11 @@ static const struct predef predefs[PREDEFS_MAX] = {
#include "predefs.in"
};
-static void roff_free1(struct roff *);
-static enum rofft roff_hash_find(const char *, size_t);
-static void roff_hash_init(void);
-static void roffnode_cleanscope(struct roff *);
-static void roffnode_push(struct roff *, enum rofft,
- const char *, int, int);
-static void roffnode_pop(struct roff *);
-static enum rofft roff_parse(struct roff *, const char *, int *);
-
-/* See roff_hash_find() */
+/* See roffhash_find() */
#define ROFF_HASH(p) (p[0] - ASCII_LO)
static void
-roff_hash_init(void)
+roffhash_init(void)
{
struct roffmac *n;
int buc, i;
@@ -258,7 +258,7 @@ roff_hash_init(void)
* the nil-terminated string name could be found.
*/
static enum rofft
-roff_hash_find(const char *p, size_t s)
+roffhash_find(const char *p, size_t s)
{
int buc;
struct roffmac *n;
@@ -387,7 +387,7 @@ roff_alloc(struct mparse *parse)
r->parse = parse;
r->rstackpos = -1;
- roff_hash_init();
+ roffhash_init();
for (i = 0; i < PREDEFS_MAX; i++)
roff_setstr(r, predefs[i].name, predefs[i].str, 0);
@@ -517,6 +517,7 @@ again:
static enum rofferr
roff_parsetext(char *p)
{
+ char l, r;
size_t sz;
const char *start;
enum mandoc_esc esc;
@@ -534,11 +535,21 @@ roff_parsetext(char *p)
((const char **)&p, NULL, NULL);
if (ESCAPE_ERROR == esc)
break;
- } else if ('-' == *p) {
- if (mandoc_hyph(start, p))
- *p = ASCII_HYPH;
- p++;
- }
+ continue;
+ } else if ('-' != *p || p == start)
+ continue;
+
+ l = *(p - 1);
+ r = *(p + 1);
+
+ if ('\\' != l &&
+ '\t' != r && '\t' != l &&
+ ' ' != r && ' ' != l &&
+ '-' != r && '-' != l &&
+ ! isdigit((unsigned char)l) &&
+ ! isdigit((unsigned char)r))
+ *p = ASCII_HYPH;
+ p++;
}
return(ROFF_CONT);
@@ -668,7 +679,7 @@ roff_parse(struct roff *r, const char *buf, int *pos)
maclen = strcspn(mac + 1, " \\\t\0") + 1;
t = (r->current_string = roff_getstrn(r, mac, maclen))
- ? ROFF_USERDEF : roff_hash_find(mac, maclen);
+ ? ROFF_USERDEF : roffhash_find(mac, maclen);
*pos += (int)maclen;