Home | History | Annotate | Download | only in io
      1 // Copyright (C) 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
     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
     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 */
     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 */
     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