summaryrefslogtreecommitdiffstats
path: root/intl/icu/source/io/sscanf.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--intl/icu/source/io/sscanf.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/intl/icu/source/io/sscanf.cpp b/intl/icu/source/io/sscanf.cpp
new file mode 100644
index 0000000000..8940127eb1
--- /dev/null
+++ b/intl/icu/source/io/sscanf.cpp
@@ -0,0 +1,130 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+/*
+******************************************************************************
+*
+* Copyright (C) 2000-2014, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+******************************************************************************
+*
+* File sscanf.c
+*
+* Modification History:
+*
+* Date Name Description
+* 02/08/00 george Creation. Copied from uscanf.c
+******************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_CONVERSION
+
+#include "unicode/putil.h"
+#include "unicode/ustdio.h"
+#include "unicode/ustring.h"
+#include "uscanf.h"
+#include "ufile.h"
+#include "ufmt_cmn.h"
+
+#include "cmemory.h"
+#include "cstring.h"
+
+
+U_CAPI int32_t U_EXPORT2
+u_sscanf(const char16_t *buffer,
+ const char *patternSpecification,
+ ... )
+{
+ va_list ap;
+ int32_t converted;
+
+ va_start(ap, patternSpecification);
+ converted = u_vsscanf(buffer, patternSpecification, ap);
+ va_end(ap);
+
+ return converted;
+}
+
+U_CAPI int32_t U_EXPORT2
+u_sscanf_u(const char16_t *buffer,
+ const char16_t *patternSpecification,
+ ... )
+{
+ va_list ap;
+ int32_t converted;
+
+ va_start(ap, patternSpecification);
+ converted = u_vsscanf_u(buffer, patternSpecification, ap);
+ va_end(ap);
+
+ return converted;
+}
+
+U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
+u_vsscanf(const char16_t *buffer,
+ const char *patternSpecification,
+ va_list ap)
+{
+ int32_t converted;
+ char16_t *pattern;
+ char16_t patBuffer[UFMT_DEFAULT_BUFFER_SIZE];
+ int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1;
+
+ /* convert from the default codepage to Unicode */
+ if (size >= (int32_t)MAX_UCHAR_BUFFER_SIZE(patBuffer)) {
+ pattern = (char16_t *)uprv_malloc(size * sizeof(char16_t));
+ if(pattern == 0) {
+ return 0;
+ }
+ }
+ else {
+ pattern = patBuffer;
+ }
+ u_charsToUChars(patternSpecification, pattern, size);
+
+ /* do the work */
+ converted = u_vsscanf_u(buffer, pattern, ap);
+
+ /* clean up */
+ if (pattern != patBuffer) {
+ uprv_free(pattern);
+ }
+
+ return converted;
+}
+
+U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
+u_vsscanf_u(const char16_t *buffer,
+ const char16_t *patternSpecification,
+ va_list ap)
+{
+ int32_t converted;
+ UFILE inStr;
+
+ inStr.fConverter = nullptr;
+ inStr.fFile = nullptr;
+ inStr.fOwnFile = false;
+#if !UCONFIG_NO_TRANSLITERATION
+ inStr.fTranslit = nullptr;
+#endif
+ inStr.fUCBuffer[0] = 0;
+ inStr.str.fBuffer = (char16_t *)buffer;
+ inStr.str.fPos = (char16_t *)buffer;
+ inStr.str.fLimit = buffer + u_strlen(buffer);
+
+ if(u_locbund_init(&inStr.str.fBundle, "en_US_POSIX") == 0) {
+ return 0;
+ }
+
+ converted = u_scanf_parse(&inStr, patternSpecification, ap);
+
+ u_locbund_close(&inStr.str.fBundle);
+
+ /* return # of items converted */
+ return converted;
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+