]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/tzcode/zic/scheck.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / tzcode / zic / scheck.c
1 /*
2 ** This file is in the public domain, so clarified as of
3 ** 2006-07-17 by Arthur David Olson.
4 */
5
6 #ifndef lint
7 #ifndef NOID
8 static const char       elsieid[] = "@(#)scheck.c       8.19";
9 #endif /* !defined lint */
10 #endif /* !defined NOID */
11
12 #ifndef lint
13 static const char rcsid[] =
14   "$FreeBSD$";
15 #endif /* not lint */
16
17 /*LINTLIBRARY*/
18
19 #include "private.h"
20
21 const char *
22 scheck(string, format)
23 const char * const      string;
24 const char * const      format;
25 {
26         register char *         fbuf;
27         register const char *   fp;
28         register char *         tp;
29         register int            c;
30         register const char *   result;
31         char                    dummy;
32
33         result = "";
34         if (string == NULL || format == NULL)
35                 return result;
36         fbuf = imalloc((int) (2 * strlen(format) + 4));
37         if (fbuf == NULL)
38                 return result;
39         fp = format;
40         tp = fbuf;
41         while ((*tp++ = c = *fp++) != '\0') {
42                 if (c != '%')
43                         continue;
44                 if (*fp == '%') {
45                         *tp++ = *fp++;
46                         continue;
47                 }
48                 *tp++ = '*';
49                 if (*fp == '*')
50                         ++fp;
51                 while (is_digit(*fp))
52                         *tp++ = *fp++;
53                 if (*fp == 'l' || *fp == 'h')
54                         *tp++ = *fp++;
55                 else if (*fp == '[')
56                         do *tp++ = *fp++;
57                                 while (*fp != '\0' && *fp != ']');
58                 if ((*tp++ = *fp++) == '\0')
59                         break;
60         }
61         *(tp - 1) = '%';
62         *tp++ = 'c';
63         *tp = '\0';
64         if (sscanf(string, fbuf, &dummy) != 1)
65                 result = (char *) format;
66         ifree(fbuf);
67         return result;
68 }