xref: /dragonfly/usr.sbin/zic/scheck.c (revision 2cd2d2b5)
1 #ifndef lint
2 #ifndef NOID
3 static char	elsieid[] = "@(#)scheck.c	8.15";
4 #endif /* !defined lint */
5 #endif /* !defined NOID */
6 
7 /*
8  * @(#)scheck.c	8.15
9  * $FreeBSD: src/usr.sbin/zic/scheck.c,v 1.4 1999/08/28 01:21:19 peter Exp $
10  * $DragonFly: src/usr.sbin/zic/scheck.c,v 1.3 2004/02/29 16:55:28 joerg Exp $
11  */
12 /*LINTLIBRARY*/
13 
14 #include "private.h"
15 
16 char *
17 scheck(const char * const string, const char * const format)
18 {
19 	char *fbuf;
20 	const char *fp;
21 	char *tp;
22 	int c;
23 	char *result;
24 	char dummy;
25 	static char nada;
26 
27 	result = &nada;
28 	if (string == NULL || format == NULL)
29 		return result;
30 	fbuf = imalloc((int) (2 * strlen(format) + 4));
31 	if (fbuf == NULL)
32 		return result;
33 	fp = format;
34 	tp = fbuf;
35 	while ((*tp++ = c = *fp++) != '\0') {
36 		if (c != '%')
37 			continue;
38 		if (*fp == '%') {
39 			*tp++ = *fp++;
40 			continue;
41 		}
42 		*tp++ = '*';
43 		if (*fp == '*')
44 			++fp;
45 		while (is_digit(*fp))
46 			*tp++ = *fp++;
47 		if (*fp == 'l' || *fp == 'h')
48 			*tp++ = *fp++;
49 		else if (*fp == '[')
50 			do *tp++ = *fp++;
51 				while (*fp != '\0' && *fp != ']');
52 		if ((*tp++ = *fp++) == '\0')
53 			break;
54 	}
55 	*(tp - 1) = '%';
56 	*tp++ = 'c';
57 	*tp = '\0';
58 	if (sscanf(string, fbuf, &dummy) != 1)
59 		result = (char *) format;
60 	ifree(fbuf);
61 	return result;
62 }
63