diff options
-rw-r--r-- | libmandoc.h | 1 | ||||
-rw-r--r-- | mandoc.c | 38 | ||||
-rw-r--r-- | roff.c | 51 |
3 files changed, 31 insertions, 59 deletions
diff --git a/libmandoc.h b/libmandoc.h index c7f0b41d..ad657337 100644 --- a/libmandoc.h +++ b/libmandoc.h @@ -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); @@ -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. @@ -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; |