]> git.saurik.com Git - apple/system_cmds.git/blob - zic.tproj/scheck.c
system_cmds-230.0.2.tar.gz
[apple/system_cmds.git] / zic.tproj / scheck.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25 #if defined(LIBC_SCCS) && !defined(lint)
26 #if 0
27 static char elsieid[] = "@(#)scheck.c 8.13";
28 #else
29 static char rcsid[] = "$OpenBSD: scheck.c,v 1.4 1997/01/14 03:16:49 millert Exp $";
30 #endif
31 #endif /* LIBC_SCCS and not lint */
32
33 /*LINTLIBRARY*/
34
35 #include "private.h"
36
37 extern char * imalloc P((int n));
38 extern void ifree P((char * p));
39
40 char *
41 scheck(string, format)
42 const char * const string;
43 char * const format;
44 {
45 register char * fbuf;
46 register const char * fp;
47 register char * tp;
48 register int c;
49 register char * result;
50 char dummy;
51 static char nada;
52
53 result = &nada;
54 if (string == NULL || format == NULL)
55 return result;
56 fbuf = imalloc((int) (2 * strlen(format) + 4));
57 if (fbuf == NULL)
58 return result;
59 fp = format;
60 tp = fbuf;
61 while ((*tp++ = c = *fp++) != '\0') {
62 if (c != '%')
63 continue;
64 if (*fp == '%') {
65 *tp++ = *fp++;
66 continue;
67 }
68 *tp++ = '*';
69 if (*fp == '*')
70 ++fp;
71 while (is_digit(*fp))
72 *tp++ = *fp++;
73 if (*fp == 'l' || *fp == 'h')
74 *tp++ = *fp++;
75 else if (*fp == '[')
76 do *tp++ = *fp++;
77 while (*fp != '\0' && *fp != ']');
78 if ((*tp++ = *fp++) == '\0')
79 break;
80 }
81 *(tp - 1) = '%';
82 *tp++ = 'c';
83 *tp = '\0';
84 if (sscanf(string, fbuf, &dummy) != 1)
85 result = (char *) format;
86 ifree(fbuf);
87 return result;
88 }