=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/chars.c,v retrieving revision 1.8 retrieving revision 1.9 diff -c -r1.8 -r1.9 *** src/usr.bin/mandoc/chars.c 2010/06/06 20:30:08 1.8 --- src/usr.bin/mandoc/chars.c 2010/07/25 18:05:54 1.9 *************** *** 1,6 **** ! /* $Id: chars.c,v 1.8 2010/06/06 20:30:08 schwarze Exp $ */ /* ! * Copyright (c) 2009 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above --- 1,6 ---- ! /* $Id: chars.c,v 1.9 2010/07/25 18:05:54 schwarze Exp $ */ /* ! * Copyright (c) 2009, 2010 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above *************** *** 29,38 **** struct ln *next; const char *code; const char *ascii; - const char *html; - size_t codesz; size_t asciisz; ! size_t htmlsz; int type; #define CHARS_CHAR (1 << 0) #define CHARS_STRING (1 << 1) --- 29,36 ---- struct ln *next; const char *code; const char *ascii; size_t asciisz; ! int unicode; int type; #define CHARS_CHAR (1 << 0) #define CHARS_STRING (1 << 1) *************** *** 41,52 **** #define LINES_MAX 370 ! #define CHAR(w, x, y, z, a, b) \ ! { NULL, (w), (y), (a), (x), (z), (b), CHARS_CHAR }, ! #define STRING(w, x, y, z, a, b) \ ! { NULL, (w), (y), (a), (x), (z), (b), CHARS_STRING }, ! #define BOTH(w, x, y, z, a, b) \ ! { NULL, (w), (y), (a), (x), (z), (b), CHARS_BOTH }, #define CHAR_TBL_START static struct ln lines[LINES_MAX] = { #define CHAR_TBL_END }; --- 39,50 ---- #define LINES_MAX 370 ! #define CHAR(in, ch, chsz, code) \ ! { NULL, (in), (ch), (chsz), (code), CHARS_CHAR }, ! #define STRING(in, ch, chsz, code) \ ! { NULL, (in), (ch), (chsz), (code), CHARS_STRING }, ! #define BOTH(in, ch, chsz, code) \ ! { NULL, (in), (ch), (chsz), (code), CHARS_BOTH }, #define CHAR_TBL_START static struct ln lines[LINES_MAX] = { #define CHAR_TBL_END }; *************** *** 60,67 **** static inline int match(const struct ln *, const char *, size_t, int); ! static const char *find(struct tbl *, const char *, ! size_t, size_t *, int); void --- 58,64 ---- static inline int match(const struct ln *, const char *, size_t, int); ! static const struct ln *find(struct tbl *, const char *, size_t, int); void *************** *** 122,152 **** } const char * ! chars_a2ascii(void *arg, const char *p, size_t sz, size_t *rsz) { ! return(find((struct tbl *)arg, p, sz, rsz, CHARS_CHAR)); } const char * ! chars_a2res(void *arg, const char *p, size_t sz, size_t *rsz) { ! return(find((struct tbl *)arg, p, sz, rsz, CHARS_STRING)); } ! static const char * ! find(struct tbl *tab, const char *p, size_t sz, size_t *rsz, int type) { struct ln *pp, *prev; struct ln **htab; int hash; assert(p); ! assert(sz > 0); if (p[0] < PRINT_LO || p[0] > PRINT_HI) return(NULL); --- 119,198 ---- } + /* + * Special character to Unicode codepoint. + */ + int + chars_spec2cp(void *arg, const char *p, size_t sz) + { + const struct ln *ln; + + ln = find((struct tbl *)arg, p, sz, CHARS_CHAR); + if (NULL == ln) + return(-1); + return(ln->unicode); + } + + + /* + * Reserved word to Unicode codepoint. + */ + int + chars_res2cp(void *arg, const char *p, size_t sz) + { + const struct ln *ln; + + ln = find((struct tbl *)arg, p, sz, CHARS_STRING); + if (NULL == ln) + return(-1); + return(ln->unicode); + } + + + /* + * Special character to string array. + */ const char * ! chars_spec2str(void *arg, const char *p, size_t sz, size_t *rsz) { + const struct ln *ln; ! ln = find((struct tbl *)arg, p, sz, CHARS_CHAR); ! if (NULL == ln) ! return(NULL); ! ! *rsz = ln->asciisz; ! return(ln->ascii); } + /* + * Reserved word to string array. + */ const char * ! chars_res2str(void *arg, const char *p, size_t sz, size_t *rsz) { + const struct ln *ln; ! ln = find((struct tbl *)arg, p, sz, CHARS_STRING); ! if (NULL == ln) ! return(NULL); ! ! *rsz = ln->asciisz; ! return(ln->ascii); } ! static const struct ln * ! find(struct tbl *tab, const char *p, size_t sz, int type) { struct ln *pp, *prev; struct ln **htab; int hash; assert(p); ! if (0 == sz) ! return(NULL); if (p[0] < PRINT_LO || p[0] > PRINT_HI) return(NULL); *************** *** 175,186 **** htab[hash] = pp; } ! if (CHARS_HTML == tab->type) { ! *rsz = pp->htmlsz; ! return(pp->html); ! } ! *rsz = pp->asciisz; ! return(pp->ascii); } return(NULL); --- 221,227 ---- htab[hash] = pp; } ! return(pp); } return(NULL); *************** *** 193,199 **** if ( ! (ln->type & type)) return(0); ! if (ln->codesz != sz) return(0); ! return(0 == strncmp(ln->code, p, sz)); } --- 234,240 ---- if ( ! (ln->type & type)) return(0); ! if (strncmp(ln->code, p, sz)) return(0); ! return('\0' == ln->code[(int)sz]); }