Merge branch 'vendor/LIBARCHIVE' (early part)
[dragonfly.git] / usr.sbin / zic / scheck.c
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 }