about summary refs log tree commit diff
path: root/timezone/scheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'timezone/scheck.c')
-rw-r--r--timezone/scheck.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/timezone/scheck.c b/timezone/scheck.c
new file mode 100644
index 0000000000..39feeba701
--- /dev/null
+++ b/timezone/scheck.c
@@ -0,0 +1,59 @@
+#ifndef lint
+#ifndef NOID
+static char	elsieid[] = "@(#)scheck.c	8.15";
+#endif /* !defined lint */
+#endif /* !defined NOID */
+
+/*LINTLIBRARY*/
+
+#include "private.h"
+
+char *
+scheck(string, format)
+const char * const	string;
+const char * const	format;
+{
+	register char *		fbuf;
+	register const char *	fp;
+	register char *		tp;
+	register int		c;
+	register char *		result;
+	char			dummy;
+	static char		nada;
+
+	result = &nada;
+	if (string == NULL || format == NULL)
+		return result;
+	fbuf = imalloc((int) (2 * strlen(format) + 4));
+	if (fbuf == NULL)
+		return result;
+	fp = format;
+	tp = fbuf;
+	while ((*tp++ = c = *fp++) != '\0') {
+		if (c != '%')
+			continue;
+		if (*fp == '%') {
+			*tp++ = *fp++;
+			continue;
+		}
+		*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);
+	return result;
+}