| Index: source/tools/tzcode/scheck.c
|
| diff --git a/source/tools/tzcode/scheck.c b/source/tools/tzcode/scheck.c
|
| index 74d9b07c149bb963c25a417c2e48cd8d3e8b9266..8bd01a858f05e3a629ec578092ca0b414cf5ab3f 100644
|
| --- a/source/tools/tzcode/scheck.c
|
| +++ b/source/tools/tzcode/scheck.c
|
| @@ -3,20 +3,12 @@
|
| ** 2006-07-17 by Arthur David Olson.
|
| */
|
|
|
| -#ifndef lint
|
| -#ifndef NOID
|
| -static char elsieid[] = "@(#)scheck.c 8.19";
|
| -#endif /* !defined lint */
|
| -#endif /* !defined NOID */
|
| -
|
| /*LINTLIBRARY*/
|
|
|
| #include "private.h"
|
|
|
| const char *
|
| -scheck(string, format)
|
| -const char * const string;
|
| -const char * const format;
|
| +scheck(const char *const string, const char *const format)
|
| {
|
| register char * fbuf;
|
| register const char * fp;
|
| @@ -28,36 +20,45 @@ const char * const format;
|
| result = "";
|
| if (string == NULL || format == NULL)
|
| return result;
|
| - fbuf = imalloc((int) (2 * strlen(format) + 4));
|
| + 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 (*fp == '%') {
|
| - *tp++ = *fp++;
|
| - 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;
|
| - while (is_digit(*fp))
|
| - *tp++ = *fp++;
|
| - if (*fp == 'l' || *fp == 'h')
|
| - *tp++ = *fp++;
|
| - else if (*fp == '[')
|
| - do *tp++ = *fp++;
|
| - while (*fp != '\0' && *fp != ']');
|
| if ((*tp++ = *fp++) == '\0')
|
| break;
|
| }
|
| +
|
| *(tp - 1) = '%';
|
| *tp++ = 'c';
|
| *tp = '\0';
|
| if (sscanf(string, fbuf, &dummy) != 1)
|
| - result = (char *) format;
|
| - ifree(fbuf);
|
| + result = format;
|
| + free(fbuf);
|
| return result;
|
| }
|
|
|