|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_FREE_COPYRIGHT@
24: */
25: /*
26: * HISTORY
27: *
28: * Revision 1.1.1.1 1998/09/22 21:05:32 wsanchez
29: * Import of Mac OS X kernel (~semeria)
30: *
31: * Revision 1.1.1.1 1998/03/07 02:25:56 wsanchez
32: * Import of OSF Mach kernel (~mburg)
33: *
34: * Revision 1.1.8.2 1997/02/12 12:52:33 stephen
35: * New file, reimplemented to be sure of copyright status
36: * Initially only supports character matching and '%d'
37: * [1997/02/12 12:43:09 stephen]
38: *
39: * $EndLog$
40: */
41:
42: #include <stdarg.h>
43: #include <kern/misc_protos.h>
44:
45: #define isdigit(c) ((unsigned) ((c) - '0') < 10U)
46:
47: /*
48: * Scan items from a string in accordance with a format. This is much
49: * simpler than the C standard function: it only recognises %d without a
50: * field width, and does not treat space in the format string or the
51: * input any differently from other characters. The return value is the
52: * number of characters from the input string that were successfully
53: * scanned, not the number of format items matched as in standard sscanf.
54: * [email protected], 12 Feb 97
55: */
56: int
57: sscanf(const char *str, const char *format, ...)
58: {
59: const char *start = str;
60: va_list args;
61:
62: va_start(args, format);
63: for ( ; *format != '\0'; format++) {
64: if (*format == '%' && format[1] == 'd') {
65: int positive;
66: int value;
67: int *valp;
68:
69: if (*str == '-') {
70: positive = 0;
71: str++;
72: } else
73: positive = 1;
74: if (!isdigit(*str))
75: break;
76: value = 0;
77: do {
78: value = (value * 10) - (*str - '0');
79: str++;
80: } while (isdigit(*str));
81: if (positive)
82: value = -value;
83: valp = va_arg(args, int *);
84: *valp = value;
85: format++;
86: } else if (*format == *str) {
87: str++;
88: } else
89: break;
90: }
91: va_end(args);
92: return str - start;
93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.