=================================================================== RCS file: /cvs/mandoc/mandoc.c,v retrieving revision 1.49 retrieving revision 1.54 diff -u -p -r1.49 -r1.54 --- mandoc/mandoc.c 2011/04/30 10:18:24 1.49 +++ mandoc/mandoc.c 2011/07/21 15:21:13 1.54 @@ -1,4 +1,4 @@ -/* $Id: mandoc.c,v 1.49 2011/04/30 10:18:24 kristaps Exp $ */ +/* $Id: mandoc.c,v 1.54 2011/07/21 15:21:13 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze @@ -23,6 +23,8 @@ #include #include +#include +#include #include #include #include @@ -123,6 +125,14 @@ mandoc_escape(const char **end, const char **start, in break; case ('['): gly = ESCAPE_SPECIAL; + /* + * Unicode escapes are defined in groff as \[uXXXX] to + * \[u10FFFF], where the contained value must be a valid + * Unicode codepoint. Here, however, only check whether + * it's not a zero-width escape. + */ + if ('u' == cp[i] && ']' != cp[i + 1]) + gly = ESCAPE_UNICODE; term = ']'; break; case ('C'): @@ -154,10 +164,6 @@ mandoc_escape(const char **end, const char **start, in if (ESCAPE_ERROR == gly) gly = ESCAPE_IGNORE; /* FALLTHROUGH */ - case ('*'): - if (ESCAPE_ERROR == gly) - gly = ESCAPE_PREDEF; - /* FALLTHROUGH */ case ('f'): if (ESCAPE_ERROR == gly) gly = ESCAPE_FONT; @@ -685,4 +691,35 @@ mandoc_getcontrol(const char *cp, int *ppos) *ppos = pos; return(1); +} + +/* + * Convert a string to a long that may not be <0. + * If the string is invalid, or is less than 0, return -1. + */ +int +mandoc_strntoi(const char *p, size_t sz, int base) +{ + char buf[32]; + char *ep; + long v; + + if (sz > 31) + return(-1); + + memcpy(buf, p, sz); + buf[(int)sz] = '\0'; + + errno = 0; + v = strtol(buf, &ep, base); + + if (buf[0] == '\0' || *ep != '\0') + return(-1); + + if (v > INT_MAX) + v = INT_MAX; + if (v < INT_MIN) + v = INT_MIN; + + return((int)v); }