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