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