|
1 /* |
|
2 ****************************************************************************** |
|
3 * |
|
4 * Copyright (C) 2000-2004, International Business Machines |
|
5 * Corporation and others. All Rights Reserved. |
|
6 * |
|
7 ****************************************************************************** |
|
8 * |
|
9 * File sscanf.c |
|
10 * |
|
11 * Modification History: |
|
12 * |
|
13 * Date Name Description |
|
14 * 02/08/00 george Creation. Copied from uscanf.c |
|
15 ****************************************************************************** |
|
16 */ |
|
17 |
|
18 #include "unicode/utypes.h" |
|
19 |
|
20 #if !UCONFIG_NO_FORMATTING |
|
21 |
|
22 #include "unicode/putil.h" |
|
23 #include "unicode/ustdio.h" |
|
24 #include "unicode/ustring.h" |
|
25 #include "uscanf.h" |
|
26 #include "ufile.h" |
|
27 #include "ufmt_cmn.h" |
|
28 |
|
29 #include "cmemory.h" |
|
30 #include "cstring.h" |
|
31 |
|
32 |
|
33 U_CAPI int32_t U_EXPORT2 |
|
34 u_sscanf(const UChar *buffer, |
|
35 const char *patternSpecification, |
|
36 ... ) |
|
37 { |
|
38 va_list ap; |
|
39 int32_t converted; |
|
40 |
|
41 va_start(ap, patternSpecification); |
|
42 converted = u_vsscanf(buffer, patternSpecification, ap); |
|
43 va_end(ap); |
|
44 |
|
45 return converted; |
|
46 } |
|
47 |
|
48 U_CAPI int32_t U_EXPORT2 |
|
49 u_sscanf_u(const UChar *buffer, |
|
50 const UChar *patternSpecification, |
|
51 ... ) |
|
52 { |
|
53 va_list ap; |
|
54 int32_t converted; |
|
55 |
|
56 va_start(ap, patternSpecification); |
|
57 converted = u_vsscanf_u(buffer, patternSpecification, ap); |
|
58 va_end(ap); |
|
59 |
|
60 return converted; |
|
61 } |
|
62 |
|
63 U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ |
|
64 u_vsscanf(const UChar *buffer, |
|
65 const char *patternSpecification, |
|
66 va_list ap) |
|
67 { |
|
68 int32_t converted; |
|
69 UChar *pattern; |
|
70 UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE]; |
|
71 int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1; |
|
72 |
|
73 /* convert from the default codepage to Unicode */ |
|
74 if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { |
|
75 pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); |
|
76 if(pattern == 0) { |
|
77 return 0; |
|
78 } |
|
79 } |
|
80 else { |
|
81 pattern = patBuffer; |
|
82 } |
|
83 u_charsToUChars(patternSpecification, pattern, size); |
|
84 |
|
85 /* do the work */ |
|
86 converted = u_vsscanf_u(buffer, pattern, ap); |
|
87 |
|
88 /* clean up */ |
|
89 if (pattern != patBuffer) { |
|
90 uprv_free(pattern); |
|
91 } |
|
92 |
|
93 return converted; |
|
94 } |
|
95 |
|
96 U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ |
|
97 u_vsscanf_u(const UChar *buffer, |
|
98 const UChar *patternSpecification, |
|
99 va_list ap) |
|
100 { |
|
101 int32_t converted; |
|
102 UFILE inStr; |
|
103 |
|
104 inStr.fConverter = NULL; |
|
105 inStr.fFile = NULL; |
|
106 inStr.fOwnFile = FALSE; |
|
107 #if !UCONFIG_NO_TRANSLITERATION |
|
108 inStr.fTranslit = NULL; |
|
109 #endif |
|
110 inStr.fUCBuffer[0] = 0; |
|
111 inStr.str.fBuffer = (UChar *)buffer; |
|
112 inStr.str.fPos = (UChar *)buffer; |
|
113 inStr.str.fLimit = buffer + u_strlen(buffer); |
|
114 |
|
115 if(u_locbund_init(&inStr.str.fBundle, "en_US_POSIX") == 0) { |
|
116 return 0; |
|
117 } |
|
118 |
|
119 converted = u_scanf_parse(&inStr, patternSpecification, ap); |
|
120 |
|
121 u_locbund_close(&inStr.str.fBundle); |
|
122 |
|
123 /* return # of items converted */ |
|
124 return converted; |
|
125 } |
|
126 |
|
127 #endif /* #if !UCONFIG_NO_FORMATTING */ |
|
128 |