xref: /original-bsd/share/zoneinfo/scheck.c (revision 208c3823)
1 #ifndef lint
2 #ifndef NOID
3 static char	elsieid[] = "@(#)scheck.c	8.9";
4 #endif /* !defined lint */
5 #endif /* !defined NOID */
6 
7 /*LINTLIBRARY*/
8 
9 #include "stdio.h"
10 #include "ctype.h"
11 #include "string.h"
12 #include "stdlib.h"
13 #include "nonstd.h"
14 
15 extern char *	imalloc P((int n));
16 extern void	ifree P((char * p));
17 
18 char *
19 scheck(string, format)
20 const char * const	string;
21 const char * const	format;
22 {
23 	register char *		fbuf;
24 	register const char *	fp;
25 	register char *		tp;
26 	register int		c;
27 	register char *		result;
28 	char			dummy;
29 
30 	result = "";
31 	if (string == NULL || format == NULL)
32 		return result;
33 	fbuf = imalloc(2 * strlen(format) + 4);
34 	if (fbuf == NULL)
35 		return result;
36 	fp = format;
37 	tp = fbuf;
38 	while ((*tp++ = c = *fp++) != '\0') {
39 		if (c != '%')
40 			continue;
41 		if (*fp == '%') {
42 			*tp++ = *fp++;
43 			continue;
44 		}
45 		*tp++ = '*';
46 		if (*fp == '*')
47 			++fp;
48 		while (isascii(*fp) && isdigit(*fp))
49 			*tp++ = *fp++;
50 		if (*fp == 'l' || *fp == 'h')
51 			*tp++ = *fp++;
52 		else if (*fp == '[')
53 			do *tp++ = *fp++;
54 				while (*fp != '\0' && *fp != ']');
55 		if ((*tp++ = *fp++) == '\0')
56 			break;
57 	}
58 	*(tp - 1) = '%';
59 	*tp++ = 'c';
60 	*tp = '\0';
61 	if (sscanf(string, fbuf, &dummy) != 1)
62 		result = (char *) format;
63 	ifree(fbuf);
64 	return result;
65 }
66