scheck.c revision 79858
1219820Sjeff#ifndef lint
2219820Sjeff#ifndef NOID
3219820Sjeffstatic const char	elsieid[] = "@(#)scheck.c	8.15";
4219820Sjeff#endif /* !defined lint */
5219820Sjeff#endif /* !defined NOID */
6219820Sjeff
7219820Sjeff#ifndef lint
8219820Sjeffstatic const char rcsid[] =
9219820Sjeff  "$FreeBSD: head/usr.sbin/zic/scheck.c 79858 2001-07-18 11:27:04Z dd $";
10219820Sjeff#endif /* not lint */
11219820Sjeff
12219820Sjeff/*LINTLIBRARY*/
13219820Sjeff
14219820Sjeff#include "private.h"
15219820Sjeff
16219820Sjeffchar *
17219820Sjeffscheck(string, format)
18219820Sjeffconst char * const	string;
19219820Sjeffconst char * const	format;
20219820Sjeff{
21219820Sjeff	register char *		fbuf;
22219820Sjeff	register const char *	fp;
23219820Sjeff	register char *		tp;
24219820Sjeff	register int		c;
25219820Sjeff	register char *		result;
26219820Sjeff	char			dummy;
27219820Sjeff	static char		nada;
28219820Sjeff
29219820Sjeff	result = &nada;
30219820Sjeff	if (string == NULL || format == NULL)
31219820Sjeff		return result;
32219820Sjeff	fbuf = imalloc((int) (2 * strlen(format) + 4));
33219820Sjeff	if (fbuf == NULL)
34219820Sjeff		return result;
35219820Sjeff	fp = format;
36219820Sjeff	tp = fbuf;
37219820Sjeff	while ((*tp++ = c = *fp++) != '\0') {
38219820Sjeff		if (c != '%')
39219820Sjeff			continue;
40219820Sjeff		if (*fp == '%') {
41219820Sjeff			*tp++ = *fp++;
42219820Sjeff			continue;
43219820Sjeff		}
44219820Sjeff		*tp++ = '*';
45219820Sjeff		if (*fp == '*')
46219820Sjeff			++fp;
47219820Sjeff		while (is_digit(*fp))
48219820Sjeff			*tp++ = *fp++;
49219820Sjeff		if (*fp == 'l' || *fp == 'h')
50219820Sjeff			*tp++ = *fp++;
51219820Sjeff		else if (*fp == '[')
52219820Sjeff			do *tp++ = *fp++;
53219820Sjeff				while (*fp != '\0' && *fp != ']');
54219820Sjeff		if ((*tp++ = *fp++) == '\0')
55219820Sjeff			break;
56219820Sjeff	}
57219820Sjeff	*(tp - 1) = '%';
58219820Sjeff	*tp++ = 'c';
59219820Sjeff	*tp = '\0';
60219820Sjeff	if (sscanf(string, fbuf, &dummy) != 1)
61219820Sjeff		result = (char *) format;
62219820Sjeff	ifree(fbuf);
63219820Sjeff	return result;
64219820Sjeff}
65219820Sjeff