1/*
2******************************************************************************
3*
4*   Copyright (C) 1998-2004, 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
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
34U_CAPI int32_t U_EXPORT2
35u_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
49U_CAPI int32_t U_EXPORT2
50u_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
64U_CAPI int32_t  U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
65u_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
97U_CAPI int32_t  U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
98u_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