diff options
Diffstat (limited to 'intl/icu/source/tools/tzcode/scheck.c')
-rw-r--r-- | intl/icu/source/tools/tzcode/scheck.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/intl/icu/source/tools/tzcode/scheck.c b/intl/icu/source/tools/tzcode/scheck.c new file mode 100644 index 000000000..8bd01a858 --- /dev/null +++ b/intl/icu/source/tools/tzcode/scheck.c @@ -0,0 +1,64 @@ +/* +** This file is in the public domain, so clarified as of +** 2006-07-17 by Arthur David Olson. +*/ + +/*LINTLIBRARY*/ + +#include "private.h" + +const char * +scheck(const char *const string, const char *const format) +{ + register char * fbuf; + register const char * fp; + register char * tp; + register int c; + register const char * result; + char dummy; + + result = ""; + if (string == NULL || format == NULL) + return result; + fbuf = malloc(2 * strlen(format) + 4); + if (fbuf == NULL) + return result; + fp = format; + tp = fbuf; + + /* + ** Copy directives, suppressing each conversion that is not + ** already suppressed. Scansets containing '%' are not + ** supported; e.g., the conversion specification "%[%]" is not + ** supported. Also, multibyte characters containing a + ** non-leading '%' byte are not supported. + */ + while ((*tp++ = c = *fp++) != '\0') { + if (c != '%') + continue; + if (is_digit(*fp)) { + char const *f = fp; + char *t = tp; + do { + *t++ = c = *f++; + } while (is_digit(c)); + if (c == '$') { + fp = f; + tp = t; + } + } + *tp++ = '*'; + if (*fp == '*') + ++fp; + if ((*tp++ = *fp++) == '\0') + break; + } + + *(tp - 1) = '%'; + *tp++ = 'c'; + *tp = '\0'; + if (sscanf(string, fbuf, &dummy) != 1) + result = format; + free(fbuf); + return result; +} |