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