scheck.c revision 2702
1#ifndef lint
2#ifndef NOID
3static char	elsieid[] = "@(#)scheck.c	8.11";
4#endif /* !defined lint */
5#endif /* !defined NOID */
6
7/*LINTLIBRARY*/
8
9#include "private.h"
10
11extern char *	imalloc P((int n));
12extern void	ifree P((char * p));
13
14char *
15scheck(string, format)
16const char * const	string;
17const char * const	format;
18{
19	register char *		fbuf;
20	register const char *	fp;
21	register char *		tp;
22	register int		c;
23	register char *		result;
24	char			dummy;
25	static char		nada[1];
26
27	result = nada;
28	if (string == NULL || format == NULL)
29		return result;
30	fbuf = imalloc(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 (isascii(*fp) && isdigit(*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