1153289Sbrueffer/*
2153289Sbrueffer** This file is in the public domain, so clarified as of
3153289Sbrueffer** 2006-07-17 by Arthur David Olson.
4153289Sbrueffer*/
5153289Sbrueffer
6153289Sbrueffer#ifndef lint
7153289Sbrueffer#ifndef NOID
8153289Sbruefferstatic const char	elsieid[] = "@(#)scheck.c	8.19";
9153289Sbrueffer#endif /* !defined lint */
10153289Sbrueffer#endif /* !defined NOID */
11153289Sbrueffer
12153289Sbrueffer#ifndef lint
13153289Sbruefferstatic const char rcsid[] =
14153289Sbrueffer  "$FreeBSD$";
15153289Sbrueffer#endif /* not lint */
16153289Sbrueffer
17153289Sbrueffer/*LINTLIBRARY*/
18153289Sbrueffer
19153289Sbrueffer#include "private.h"
20153289Sbrueffer
21153289Sbruefferconst char *
22153289Sbruefferscheck(string, format)
23153289Sbruefferconst char * const	string;
24153289Sbruefferconst char * const	format;
25153289Sbrueffer{
26153289Sbrueffer	register char *		fbuf;
27203689Sgavin	register const char *	fp;
28203689Sgavin	register char *		tp;
29153289Sbrueffer	register int		c;
30153289Sbrueffer	register const char *	result;
31153289Sbrueffer	char			dummy;
32160502Smr
33153289Sbrueffer	result = "";
34157355Sbrueffer	if (string == NULL || format == NULL)
35157355Sbrueffer		return result;
36157355Sbrueffer	fbuf = imalloc((int) (2 * strlen(format) + 4));
37157355Sbrueffer	if (fbuf == NULL)
38153289Sbrueffer		return result;
39153289Sbrueffer	fp = format;
40157355Sbrueffer	tp = fbuf;
41157355Sbrueffer	while ((*tp++ = c = *fp++) != '\0') {
42157355Sbrueffer		if (c != '%')
43157355Sbrueffer			continue;
44157355Sbrueffer		if (*fp == '%') {
45157355Sbrueffer			*tp++ = *fp++;
46157355Sbrueffer			continue;
47157355Sbrueffer		}
48153289Sbrueffer		*tp++ = '*';
49153289Sbrueffer		if (*fp == '*')
50160502Smr			++fp;
51160782Spjd		while (is_digit(*fp))
52160502Smr			*tp++ = *fp++;
53153289Sbrueffer		if (*fp == 'l' || *fp == 'h')
54153289Sbrueffer			*tp++ = *fp++;
55153289Sbrueffer		else if (*fp == '[')
56162871Sru			do *tp++ = *fp++;
57160782Spjd				while (*fp != '\0' && *fp != ']');
58153289Sbrueffer		if ((*tp++ = *fp++) == '\0')
59160782Spjd			break;
60160782Spjd	}
61162871Sru	*(tp - 1) = '%';
62159280Spjd	*tp++ = 'c';
63159280Spjd	*tp = '\0';
64171696Sbz	if (sscanf(string, fbuf, &dummy) != 1)
65153289Sbrueffer		result = (char *) format;
66153289Sbrueffer	ifree(fbuf);
67153289Sbrueffer	return result;
68153289Sbrueffer}
69162871Sru