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