From 61fb396c8d05a2962048d0555165f4958be68c85 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Mon, 27 Jul 2009 12:02:49 +0000 Subject: Correct handling of \*(xx, \*[xxx], \*x versus \x, \(xx, \([xxx]: predefined strings and escape characters, respectively. --- ascii.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) (limited to 'ascii.c') diff --git a/ascii.c b/ascii.c index 24554ee7..7bd50693 100644 --- a/ascii.c +++ b/ascii.c @@ -27,9 +27,12 @@ struct line { const char *code; const char *out; - /* 32- and 64-bit alignment safe. */ size_t codesz; size_t outsz; + int type; +#define ASCII_CHAR (1 << 0) +#define ASCII_STRING (1 << 1) +#define ASCII_BOTH (0x03) }; struct linep { @@ -37,8 +40,12 @@ struct linep { struct linep *next; }; -#define LINE(w, x, y, z) \ - { (w), (y), (x), (z) }, +#define CHAR(w, x, y, z) \ + { (w), (y), (x), (z), ASCII_CHAR }, +#define STRING(w, x, y, z) \ + { (w), (y), (x), (z), ASCII_STRING }, +#define BOTH(w, x, y, z) \ + { (w), (y), (x), (z), ASCII_BOTH }, static const struct line lines[] = { #include "ascii.in" }; @@ -50,7 +57,9 @@ struct asciitab { static inline int match(const struct line *, - const char *, size_t); + const char *, size_t, int); +static const char * lookup(struct asciitab *, const char *, + size_t, size_t *, int); void @@ -125,14 +134,29 @@ term_ascii2htab(void) const char * term_a2ascii(void *arg, const char *p, size_t sz, size_t *rsz) { - struct asciitab *tab; + + return(lookup((struct asciitab *)arg, p, + sz, rsz, ASCII_CHAR)); +} + + +const char * +term_a2res(void *arg, const char *p, size_t sz, size_t *rsz) +{ + + return(lookup((struct asciitab *)arg, p, + sz, rsz, ASCII_STRING)); +} + + +static const char * +lookup(struct asciitab *tab, const char *p, + size_t sz, size_t *rsz, int type) +{ struct linep *pp, *prev; void **htab; int hash; - tab = (struct asciitab *)arg; - htab = tab->htab; - assert(p); assert(sz > 0); @@ -147,19 +171,20 @@ term_a2ascii(void *arg, const char *p, size_t sz, size_t *rsz) */ hash = (int)p[0] - ASCII_PRINT_LO; + htab = tab->htab; if (NULL == (pp = ((struct linep **)htab)[hash])) return(NULL); if (NULL == pp->next) { - if ( ! match(pp->line, p, sz)) + if ( ! match(pp->line, p, sz, type)) return(NULL); *rsz = pp->line->outsz; return(pp->line->out); } for (prev = NULL; pp; pp = pp->next) { - if ( ! match(pp->line, p, sz)) { + if ( ! match(pp->line, p, sz, type)) { prev = pp; continue; } @@ -181,9 +206,11 @@ term_a2ascii(void *arg, const char *p, size_t sz, size_t *rsz) static inline int -match(const struct line *line, const char *p, size_t sz) +match(const struct line *line, const char *p, size_t sz, int type) { + if ( ! (line->type & type)) + return(0); if (line->codesz != sz) return(0); return(0 == strncmp(line->code, p, sz)); -- cgit