1 /*
2 ******************************************************************************
3 *
4 *   Copyright (C) 1998-2014, International Business Machines
5 *   Corporation and others.  All Rights Reserved.
6 *
7 ******************************************************************************
8 *
9 * File uscanf.c
10 *
11 * Modification History:
12 *
13 *   Date        Name        Description
14 *   12/02/98    stephen        Creation.
15 *   03/13/99    stephen     Modified for new C API.
16 ******************************************************************************
17 */
18 
19 #include "unicode/utypes.h"
20 
21 #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_CONVERSION
22 
23 #include "unicode/putil.h"
24 #include "unicode/ustdio.h"
25 #include "unicode/ustring.h"
26 #include "uscanf.h"
27 #include "ufile.h"
28 #include "ufmt_cmn.h"
29 
30 #include "cmemory.h"
31 #include "cstring.h"
32 
33 
34 U_CAPI int32_t U_EXPORT2
u_fscanf(UFILE * f,const char * patternSpecification,...)35 u_fscanf(UFILE        *f,
36          const char    *patternSpecification,
37          ... )
38 {
39     va_list ap;
40     int32_t converted;
41 
42     va_start(ap, patternSpecification);
43     converted = u_vfscanf(f, patternSpecification, ap);
44     va_end(ap);
45 
46     return converted;
47 }
48 
49 U_CAPI int32_t U_EXPORT2
u_fscanf_u(UFILE * f,const UChar * patternSpecification,...)50 u_fscanf_u(UFILE        *f,
51            const UChar    *patternSpecification,
52            ... )
53 {
54     va_list ap;
55     int32_t converted;
56 
57     va_start(ap, patternSpecification);
58     converted = u_vfscanf_u(f, patternSpecification, ap);
59     va_end(ap);
60 
61     return converted;
62 }
63 
64 U_CAPI int32_t  U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
u_vfscanf(UFILE * f,const char * patternSpecification,va_list ap)65 u_vfscanf(UFILE        *f,
66           const char    *patternSpecification,
67           va_list        ap)
68 {
69     int32_t converted;
70     UChar *pattern;
71     UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE];
72     int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1;
73 
74     /* convert from the default codepage to Unicode */
75     if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) {
76         pattern = (UChar *)uprv_malloc(size * sizeof(UChar));
77         if(pattern == 0) {
78             return 0;
79         }
80     }
81     else {
82         pattern = patBuffer;
83     }
84     u_charsToUChars(patternSpecification, pattern, size);
85 
86     /* do the work */
87     converted = u_vfscanf_u(f, pattern, ap);
88 
89     /* clean up */
90     if (pattern != patBuffer) {
91         uprv_free(pattern);
92     }
93 
94     return converted;
95 }
96 
97 U_CAPI int32_t  U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
u_vfscanf_u(UFILE * f,const UChar * patternSpecification,va_list ap)98 u_vfscanf_u(UFILE       *f,
99             const UChar *patternSpecification,
100             va_list     ap)
101 {
102     return u_scanf_parse(f, patternSpecification, ap);
103 }
104 
105 #endif /* #if !UCONFIG_NO_FORMATTING */
106 
107