summaryrefslogtreecommitdiffstats
path: root/intl/icu/source/tools/tzcode/scheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'intl/icu/source/tools/tzcode/scheck.c')
-rw-r--r--intl/icu/source/tools/tzcode/scheck.c64
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;
+}