deps: delete deps/icu-small/source/io
The previous commit removed the dependency on the code in that directory. This commit removes the directory itself and shrinks the source tarball by about 200 kB. PR-URL: https://github.com/nodejs/node/pull/13656 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
parent
2ea60e926e
commit
6bf4c23295
109
deps/icu-small/source/io/io.rc
vendored
109
deps/icu-small/source/io/io.rc
vendored
@ -1,109 +0,0 @@
|
||||
// Do not edit with Microsoft Developer Studio Resource Editor.
|
||||
// It will permanently substitute version numbers that are intended to be
|
||||
// picked up by the pre-processor during each build.
|
||||
// Copyright (C) 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Copyright (c) 2001-2010 International Business Machines
|
||||
// Corporation and others. All Rights Reserved.
|
||||
//
|
||||
#include "../common/msvcres.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include <winresrc.h>
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
#pragma code_page(1252)
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"../../common/msvcres.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include <winresrc.h>\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
#define STR(s) #s
|
||||
#define CommaVersionString(a, b, c, d) STR(a) ", " STR(b) ", " STR(c) ", " STR(d) "\0"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM
|
||||
PRODUCTVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS VOS__WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "00000000"
|
||||
BEGIN
|
||||
VALUE "Comments", ICU_WEBSITE "\0"
|
||||
VALUE "CompanyName", ICU_COMPANY "\0"
|
||||
VALUE "FileDescription", ICU_PRODUCT_PREFIX " I/O DLL\0"
|
||||
VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM)
|
||||
VALUE "LegalCopyright", U_COPYRIGHT_STRING "\0"
|
||||
#ifdef _DEBUG
|
||||
VALUE "OriginalFilename", "icuio" U_ICU_VERSION_SHORT "d.dll\0"
|
||||
#else
|
||||
VALUE "OriginalFilename", "icuio" U_ICU_VERSION_SHORT ".dll\0"
|
||||
#endif
|
||||
VALUE "PrivateBuild", "\0"
|
||||
VALUE "ProductName", ICU_PRODUCT "\0"
|
||||
VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM)
|
||||
VALUE "SpecialBuild", "\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x000, 0000
|
||||
END
|
||||
END
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
185
deps/icu-small/source/io/locbund.cpp
vendored
185
deps/icu-small/source/io/locbund.cpp
vendored
@ -1,185 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
*******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
*******************************************************************************
|
||||
*
|
||||
* File locbund.cpp
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 11/18/98 stephen Creation.
|
||||
* 12/10/1999 bobbyr(at)optiosoftware.com Fix for memory leak + string allocation bugs
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include "locbund.h"
|
||||
|
||||
#include "cmemory.h"
|
||||
#include "cstring.h"
|
||||
#include "ucln_io.h"
|
||||
#include "mutex.h"
|
||||
#include "umutex.h"
|
||||
#include "unicode/ustring.h"
|
||||
#include "unicode/uloc.h"
|
||||
|
||||
static UNumberFormat *gPosixNumberFormat[ULOCALEBUNDLE_NUMBERFORMAT_COUNT];
|
||||
|
||||
U_CDECL_BEGIN
|
||||
static UBool U_CALLCONV locbund_cleanup(void) {
|
||||
int32_t style;
|
||||
for (style = 0; style < ULOCALEBUNDLE_NUMBERFORMAT_COUNT; style++) {
|
||||
unum_close(gPosixNumberFormat[style]);
|
||||
gPosixNumberFormat[style] = NULL;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
U_CDECL_END
|
||||
|
||||
static UMutex gLock = U_MUTEX_INITIALIZER;
|
||||
static inline UNumberFormat * copyInvariantFormatter(ULocaleBundle *result, UNumberFormatStyle style) {
|
||||
U_NAMESPACE_USE
|
||||
Mutex lock(&gLock);
|
||||
if (result->fNumberFormat[style-1] == NULL) {
|
||||
if (gPosixNumberFormat[style-1] == NULL) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
UNumberFormat *formatAlias = unum_open(style, NULL, 0, "en_US_POSIX", NULL, &status);
|
||||
if (U_SUCCESS(status)) {
|
||||
gPosixNumberFormat[style-1] = formatAlias;
|
||||
ucln_io_registerCleanup(UCLN_IO_LOCBUND, locbund_cleanup);
|
||||
}
|
||||
}
|
||||
/* Copy the needed formatter. */
|
||||
if (gPosixNumberFormat[style-1] != NULL) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
result->fNumberFormat[style-1] = unum_clone(gPosixNumberFormat[style-1], &status);
|
||||
}
|
||||
}
|
||||
return result->fNumberFormat[style-1];
|
||||
}
|
||||
|
||||
U_CAPI ULocaleBundle *
|
||||
u_locbund_init(ULocaleBundle *result, const char *loc)
|
||||
{
|
||||
int32_t len;
|
||||
|
||||
if(result == 0)
|
||||
return 0;
|
||||
|
||||
if (loc == NULL) {
|
||||
loc = uloc_getDefault();
|
||||
}
|
||||
|
||||
uprv_memset(result, 0, sizeof(ULocaleBundle));
|
||||
|
||||
len = (int32_t)strlen(loc);
|
||||
result->fLocale = (char*) uprv_malloc(len + 1);
|
||||
if(result->fLocale == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uprv_strcpy(result->fLocale, loc);
|
||||
|
||||
result->isInvariantLocale = uprv_strcmp(result->fLocale, "en_US_POSIX") == 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*U_CAPI ULocaleBundle *
|
||||
u_locbund_new(const char *loc)
|
||||
{
|
||||
ULocaleBundle *result = (ULocaleBundle*) uprv_malloc(sizeof(ULocaleBundle));
|
||||
return u_locbund_init(result, loc);
|
||||
}
|
||||
|
||||
U_CAPI ULocaleBundle *
|
||||
u_locbund_clone(const ULocaleBundle *bundle)
|
||||
{
|
||||
ULocaleBundle *result = (ULocaleBundle*)uprv_malloc(sizeof(ULocaleBundle));
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
int32_t styleIdx;
|
||||
|
||||
if(result == 0)
|
||||
return 0;
|
||||
|
||||
result->fLocale = (char*) uprv_malloc(strlen(bundle->fLocale) + 1);
|
||||
if(result->fLocale == 0) {
|
||||
uprv_free(result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
strcpy(result->fLocale, bundle->fLocale );
|
||||
|
||||
for (styleIdx = 0; styleIdx < ULOCALEBUNDLE_NUMBERFORMAT_COUNT; styleIdx++) {
|
||||
status = U_ZERO_ERROR;
|
||||
if (result->fNumberFormat[styleIdx]) {
|
||||
result->fNumberFormat[styleIdx] = unum_clone(bundle->fNumberFormat[styleIdx], &status);
|
||||
if (U_FAILURE(status)) {
|
||||
result->fNumberFormat[styleIdx] = NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
result->fNumberFormat[styleIdx] = NULL;
|
||||
}
|
||||
}
|
||||
result->fDateFormat = (bundle->fDateFormat == 0 ? 0 :
|
||||
udat_clone(bundle->fDateFormat, &status));
|
||||
result->fTimeFormat = (bundle->fTimeFormat == 0 ? 0 :
|
||||
udat_clone(bundle->fTimeFormat, &status));
|
||||
|
||||
return result;
|
||||
}*/
|
||||
|
||||
U_CAPI void
|
||||
u_locbund_close(ULocaleBundle *bundle)
|
||||
{
|
||||
int32_t styleIdx;
|
||||
|
||||
uprv_free(bundle->fLocale);
|
||||
|
||||
for (styleIdx = 0; styleIdx < ULOCALEBUNDLE_NUMBERFORMAT_COUNT; styleIdx++) {
|
||||
if (bundle->fNumberFormat[styleIdx]) {
|
||||
unum_close(bundle->fNumberFormat[styleIdx]);
|
||||
}
|
||||
}
|
||||
|
||||
uprv_memset(bundle, 0, sizeof(ULocaleBundle));
|
||||
/* uprv_free(bundle);*/
|
||||
}
|
||||
|
||||
U_CAPI UNumberFormat *
|
||||
u_locbund_getNumberFormat(ULocaleBundle *bundle, UNumberFormatStyle style)
|
||||
{
|
||||
UNumberFormat *formatAlias = NULL;
|
||||
if (style > UNUM_IGNORE) {
|
||||
formatAlias = bundle->fNumberFormat[style-1];
|
||||
if (formatAlias == NULL) {
|
||||
if (bundle->isInvariantLocale) {
|
||||
formatAlias = copyInvariantFormatter(bundle, style);
|
||||
}
|
||||
else {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
formatAlias = unum_open(style, NULL, 0, bundle->fLocale, NULL, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
unum_close(formatAlias);
|
||||
formatAlias = NULL;
|
||||
}
|
||||
else {
|
||||
bundle->fNumberFormat[style-1] = formatAlias;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return formatAlias;
|
||||
}
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
82
deps/icu-small/source/io/locbund.h
vendored
82
deps/icu-small/source/io/locbund.h
vendored
@ -1,82 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
*******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2011, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
*******************************************************************************
|
||||
*
|
||||
* File locbund.h
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 10/16/98 stephen Creation.
|
||||
* 02/25/99 stephen Modified for new C API.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef LOCBUND_H
|
||||
#define LOCBUND_H
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
|
||||
#include "unicode/unum.h"
|
||||
|
||||
#define ULOCALEBUNDLE_NUMBERFORMAT_COUNT ((int32_t)UNUM_SPELLOUT)
|
||||
|
||||
typedef struct ULocaleBundle {
|
||||
char *fLocale;
|
||||
|
||||
UNumberFormat *fNumberFormat[ULOCALEBUNDLE_NUMBERFORMAT_COUNT];
|
||||
UBool isInvariantLocale;
|
||||
} ULocaleBundle;
|
||||
|
||||
|
||||
/**
|
||||
* Initialize a ULocaleBundle, initializing all formatters to 0.
|
||||
* @param result A ULocaleBundle to initialize.
|
||||
* @param loc The locale of the ULocaleBundle.
|
||||
* @return A pointer to a ULocaleBundle, or 0 if <TT>loc</TT> was invalid.
|
||||
*/
|
||||
U_CAPI ULocaleBundle *
|
||||
u_locbund_init(ULocaleBundle *result, const char *loc);
|
||||
|
||||
/**
|
||||
* Create a new ULocaleBundle, initializing all formatters to 0.
|
||||
* @param loc The locale of the ULocaleBundle.
|
||||
* @return A pointer to a ULocaleBundle, or 0 if <TT>loc</TT> was invalid.
|
||||
*/
|
||||
/*U_CAPI ULocaleBundle *
|
||||
u_locbund_new(const char *loc);*/
|
||||
|
||||
/**
|
||||
* Create a deep copy of this ULocaleBundle;
|
||||
* @param bundle The ULocaleBundle to clone.
|
||||
* @return A new ULocaleBundle.
|
||||
*/
|
||||
/*U_CAPI ULocaleBundle *
|
||||
u_locbund_clone(const ULocaleBundle *bundle);*/
|
||||
|
||||
/**
|
||||
* Delete the specified ULocaleBundle, freeing all associated memory.
|
||||
* @param bundle The ULocaleBundle to delete
|
||||
*/
|
||||
U_CAPI void
|
||||
u_locbund_close(ULocaleBundle *bundle);
|
||||
|
||||
/**
|
||||
* Get the NumberFormat used to format and parse numbers in a ULocaleBundle.
|
||||
* @param bundle The ULocaleBundle to use
|
||||
* @return A pointer to the NumberFormat used for number formatting and parsing.
|
||||
*/
|
||||
U_CAPI UNumberFormat *
|
||||
u_locbund_getNumberFormat(ULocaleBundle *bundle, UNumberFormatStyle style);
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
||||
|
||||
#endif
|
261
deps/icu-small/source/io/sprintf.cpp
vendored
261
deps/icu-small/source/io/sprintf.cpp
vendored
@ -1,261 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2001-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File sprintf.c
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 02/08/2001 george Creation. Copied from uprintf.c
|
||||
* 03/27/2002 Mark Schneckloth Many fixes regarding alignment, null termination
|
||||
* (mschneckloth@atomz.com) and other various problems.
|
||||
* 08/07/2003 george Reunify printf implementations
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include "unicode/ustdio.h"
|
||||
#include "unicode/ustring.h"
|
||||
#include "unicode/putil.h"
|
||||
|
||||
#include "uprintf.h"
|
||||
#include "locbund.h"
|
||||
|
||||
#include "cmemory.h"
|
||||
#include <ctype.h>
|
||||
|
||||
/* u_minstrncpy copies the minimum number of code units of (count or output->available) */
|
||||
static int32_t
|
||||
u_sprintf_write(void *context,
|
||||
const UChar *str,
|
||||
int32_t count)
|
||||
{
|
||||
u_localized_print_string *output = (u_localized_print_string *)context;
|
||||
int32_t size = ufmt_min(count, output->available);
|
||||
|
||||
u_strncpy(output->str + (output->len - output->available), str, size);
|
||||
output->available -= size;
|
||||
return size;
|
||||
}
|
||||
|
||||
static int32_t
|
||||
u_sprintf_pad_and_justify(void *context,
|
||||
const u_printf_spec_info *info,
|
||||
const UChar *result,
|
||||
int32_t resultLen)
|
||||
{
|
||||
u_localized_print_string *output = (u_localized_print_string *)context;
|
||||
int32_t written = 0;
|
||||
int32_t lengthOfResult = resultLen;
|
||||
|
||||
resultLen = ufmt_min(resultLen, output->available);
|
||||
|
||||
/* pad and justify, if needed */
|
||||
if(info->fWidth != -1 && resultLen < info->fWidth) {
|
||||
int32_t paddingLeft = info->fWidth - resultLen;
|
||||
int32_t outputPos = output->len - output->available;
|
||||
|
||||
if (paddingLeft + resultLen > output->available) {
|
||||
paddingLeft = output->available - resultLen;
|
||||
if (paddingLeft < 0) {
|
||||
paddingLeft = 0;
|
||||
}
|
||||
/* paddingLeft = output->available - resultLen;*/
|
||||
}
|
||||
written += paddingLeft;
|
||||
|
||||
/* left justify */
|
||||
if(info->fLeft) {
|
||||
written += u_sprintf_write(output, result, resultLen);
|
||||
u_memset(&output->str[outputPos + resultLen], info->fPadChar, paddingLeft);
|
||||
output->available -= paddingLeft;
|
||||
}
|
||||
/* right justify */
|
||||
else {
|
||||
u_memset(&output->str[outputPos], info->fPadChar, paddingLeft);
|
||||
output->available -= paddingLeft;
|
||||
written += u_sprintf_write(output, result, resultLen);
|
||||
}
|
||||
}
|
||||
/* just write the formatted output */
|
||||
else {
|
||||
written = u_sprintf_write(output, result, resultLen);
|
||||
}
|
||||
|
||||
if (written >= 0 && lengthOfResult > written) {
|
||||
return lengthOfResult;
|
||||
}
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_sprintf(UChar *buffer,
|
||||
const char *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t written;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
written = u_vsnprintf(buffer, INT32_MAX, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_sprintf_u(UChar *buffer,
|
||||
const UChar *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t written;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
written = u_vsnprintf_u(buffer, INT32_MAX, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_vsprintf(UChar *buffer,
|
||||
const char *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
return u_vsnprintf(buffer, INT32_MAX, patternSpecification, ap);
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_snprintf(UChar *buffer,
|
||||
int32_t count,
|
||||
const char *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t written;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
written = u_vsnprintf(buffer, count, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_snprintf_u(UChar *buffer,
|
||||
int32_t count,
|
||||
const UChar *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t written;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
written = u_vsnprintf_u(buffer, count, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_vsnprintf(UChar *buffer,
|
||||
int32_t count,
|
||||
const char *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t written;
|
||||
UChar *pattern;
|
||||
UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE];
|
||||
int32_t size = (int32_t)strlen(patternSpecification) + 1;
|
||||
|
||||
/* convert from the default codepage to Unicode */
|
||||
if (size >= (int32_t)MAX_UCHAR_BUFFER_SIZE(patBuffer)) {
|
||||
pattern = (UChar *)uprv_malloc(size * sizeof(UChar));
|
||||
if(pattern == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pattern = patBuffer;
|
||||
}
|
||||
u_charsToUChars(patternSpecification, pattern, size);
|
||||
|
||||
/* do the work */
|
||||
written = u_vsnprintf_u(buffer, count, pattern, ap);
|
||||
|
||||
/* clean up */
|
||||
if (pattern != patBuffer) {
|
||||
uprv_free(pattern);
|
||||
}
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_vsprintf_u(UChar *buffer,
|
||||
const UChar *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
return u_vsnprintf_u(buffer, INT32_MAX, patternSpecification, ap);
|
||||
}
|
||||
|
||||
static const u_printf_stream_handler g_sprintf_stream_handler = {
|
||||
u_sprintf_write,
|
||||
u_sprintf_pad_and_justify
|
||||
};
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_vsnprintf_u(UChar *buffer,
|
||||
int32_t count,
|
||||
const UChar *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t written = 0; /* haven't written anything yet */
|
||||
int32_t result = 0; /* test the return value of u_printf_parse */
|
||||
|
||||
u_localized_print_string outStr;
|
||||
|
||||
if (count < 0) {
|
||||
count = INT32_MAX;
|
||||
}
|
||||
|
||||
outStr.str = buffer;
|
||||
outStr.len = count;
|
||||
outStr.available = count;
|
||||
|
||||
if(u_locbund_init(&outStr.fBundle, "en_US_POSIX") == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* parse and print the whole format string */
|
||||
result = u_printf_parse(&g_sprintf_stream_handler, patternSpecification, &outStr, &outStr, &outStr.fBundle, &written, ap);
|
||||
|
||||
/* Terminate the buffer, if there's room. */
|
||||
if (outStr.available > 0) {
|
||||
buffer[outStr.len - outStr.available] = 0x0000;
|
||||
}
|
||||
|
||||
/* Release the cloned bundle, if we cloned it. */
|
||||
u_locbund_close(&outStr.fBundle);
|
||||
|
||||
/* parsing error */
|
||||
if (result < 0) {
|
||||
return result;
|
||||
}
|
||||
/* return # of UChars written */
|
||||
return written;
|
||||
}
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
129
deps/icu-small/source/io/sscanf.cpp
vendored
129
deps/icu-small/source/io/sscanf.cpp
vendored
@ -1,129 +0,0 @@
|
||||
// © 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 UChar *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 UChar *buffer,
|
||||
const UChar *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 UChar *buffer,
|
||||
const char *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t converted;
|
||||
UChar *pattern;
|
||||
UChar 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 = (UChar *)uprv_malloc(size * sizeof(UChar));
|
||||
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 UChar *buffer,
|
||||
const UChar *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t converted;
|
||||
UFILE inStr;
|
||||
|
||||
inStr.fConverter = NULL;
|
||||
inStr.fFile = NULL;
|
||||
inStr.fOwnFile = FALSE;
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
inStr.fTranslit = NULL;
|
||||
#endif
|
||||
inStr.fUCBuffer[0] = 0;
|
||||
inStr.str.fBuffer = (UChar *)buffer;
|
||||
inStr.str.fPos = (UChar *)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 */
|
70
deps/icu-small/source/io/ucln_io.cpp
vendored
70
deps/icu-small/source/io/ucln_io.cpp
vendored
@ -1,70 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
* *
|
||||
* Copyright (C) 2001-2014, International Business Machines *
|
||||
* Corporation and others. All Rights Reserved. *
|
||||
* *
|
||||
******************************************************************************
|
||||
* file name: ucln_io.cpp
|
||||
* encoding: UTF-8
|
||||
* tab size: 8 (not used)
|
||||
* indentation:4
|
||||
*
|
||||
* created on: 2006August11
|
||||
* created by: George Rhoten
|
||||
*/
|
||||
|
||||
#include "mutex.h"
|
||||
#include "ucln.h"
|
||||
#include "ucln_io.h"
|
||||
#include "uassert.h"
|
||||
|
||||
#ifndef U_IO_IMPLEMENTATION
|
||||
#error U_IO_IMPLEMENTATION not set - must be set for all ICU source files in io/ - see http://userguide.icu-project.org/howtouseicu
|
||||
#endif
|
||||
|
||||
|
||||
/** Auto-client */
|
||||
#define UCLN_TYPE UCLN_IO
|
||||
#include "ucln_imp.h"
|
||||
|
||||
/* Leave this copyright notice here! It needs to go somewhere in this library. */
|
||||
static const char copyright[] = U_COPYRIGHT_STRING;
|
||||
|
||||
static cleanupFunc *gCleanupFunctions[UCLN_IO_COUNT];
|
||||
|
||||
static UBool U_CALLCONV io_cleanup(void)
|
||||
{
|
||||
int32_t libType = UCLN_IO_START;
|
||||
|
||||
(void)copyright; // Suppress unused variable warning.
|
||||
while (++libType<UCLN_IO_COUNT) {
|
||||
if (gCleanupFunctions[libType])
|
||||
{
|
||||
gCleanupFunctions[libType]();
|
||||
gCleanupFunctions[libType] = NULL;
|
||||
}
|
||||
}
|
||||
#if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
|
||||
ucln_unRegisterAutomaticCleanup();
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ucln_io_registerCleanup(ECleanupIOType type,
|
||||
cleanupFunc *func) {
|
||||
U_ASSERT(UCLN_IO_START < type && type < UCLN_IO_COUNT);
|
||||
{
|
||||
icu::Mutex m; // See ticket 10295 for discussion.
|
||||
ucln_registerCleanup(UCLN_IO, io_cleanup);
|
||||
if (UCLN_IO_START < type && type < UCLN_IO_COUNT) {
|
||||
gCleanupFunctions[type] = func;
|
||||
}
|
||||
}
|
||||
|
||||
#if !UCLN_NO_AUTO_CLEANUP && (defined(UCLN_AUTO_ATEXIT) || defined(UCLN_AUTO_LOCAL))
|
||||
ucln_registerAutomaticCleanup();
|
||||
#endif
|
||||
}
|
40
deps/icu-small/source/io/ucln_io.h
vendored
40
deps/icu-small/source/io/ucln_io.h
vendored
@ -1,40 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
* *
|
||||
* Copyright (C) 2001-2011, International Business Machines *
|
||||
* Corporation and others. All Rights Reserved. *
|
||||
* *
|
||||
******************************************************************************
|
||||
* file name: ucln_io.h
|
||||
* encoding: UTF-8
|
||||
* tab size: 8 (not used)
|
||||
* indentation:4
|
||||
*
|
||||
* created on: 2006August11
|
||||
* created by: George Rhoten
|
||||
*/
|
||||
|
||||
#ifndef __UCLN_IO_H__
|
||||
#define __UCLN_IO_H__
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
#include "ucln.h"
|
||||
|
||||
/*
|
||||
Please keep the order of enums declared in same order
|
||||
as the functions are suppose to be called. */
|
||||
typedef enum ECleanupIOType {
|
||||
UCLN_IO_START = -1,
|
||||
UCLN_IO_LOCBUND,
|
||||
UCLN_IO_PRINTF,
|
||||
UCLN_IO_COUNT /* This must be last */
|
||||
} ECleanupIOType;
|
||||
|
||||
/* Main library cleanup registration function. */
|
||||
/* See common/ucln.h for details on adding a cleanup function. */
|
||||
U_CFUNC void U_EXPORT2 ucln_io_registerCleanup(ECleanupIOType type,
|
||||
cleanupFunc *func);
|
||||
|
||||
#endif
|
343
deps/icu-small/source/io/ufile.cpp
vendored
343
deps/icu-small/source/io/ufile.cpp
vendored
@ -1,343 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2015, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File ufile.cpp
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 11/19/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
* 06/16/99 stephen Changed T_LocaleBundle to u_locbund
|
||||
* 07/19/99 stephen Fixed to use ucnv's default codepage.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "unicode/platform.h"
|
||||
#if defined(__GNUC__) && !defined(__clang__) && defined(__STRICT_ANSI__)
|
||||
// g++, fileno isn't defined if __STRICT_ANSI__ is defined.
|
||||
// clang fails to compile the <string> header unless __STRICT_ANSI__ is defined.
|
||||
// __GNUC__ is set by both gcc and clang.
|
||||
#undef __STRICT_ANSI__
|
||||
#endif
|
||||
|
||||
#include "locmap.h"
|
||||
#include "unicode/ustdio.h"
|
||||
|
||||
#if !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "ufile.h"
|
||||
#include "unicode/uloc.h"
|
||||
#include "unicode/ures.h"
|
||||
#include "unicode/ucnv.h"
|
||||
#include "unicode/ustring.h"
|
||||
#include "cstring.h"
|
||||
#include "cmemory.h"
|
||||
|
||||
#if U_PLATFORM_USES_ONLY_WIN32_API && !defined(fileno)
|
||||
/* Windows likes to rename Unix-like functions */
|
||||
#define fileno _fileno
|
||||
#endif
|
||||
|
||||
static UFILE*
|
||||
finit_owner(FILE *f,
|
||||
const char *locale,
|
||||
const char *codepage,
|
||||
UBool takeOwnership
|
||||
)
|
||||
{
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
UFILE *result;
|
||||
if(f == NULL) {
|
||||
return 0;
|
||||
}
|
||||
result = (UFILE*) uprv_malloc(sizeof(UFILE));
|
||||
if(result == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uprv_memset(result, 0, sizeof(UFILE));
|
||||
result->fFileno = fileno(f);
|
||||
result->fFile = f;
|
||||
|
||||
result->str.fBuffer = result->fUCBuffer;
|
||||
result->str.fPos = result->fUCBuffer;
|
||||
result->str.fLimit = result->fUCBuffer;
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
/* if locale is 0, use the default */
|
||||
if(u_locbund_init(&result->str.fBundle, locale) == 0) {
|
||||
/* DO NOT FCLOSE HERE! */
|
||||
uprv_free(result);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If the codepage is not "" use the ucnv_open default behavior */
|
||||
if(codepage == NULL || *codepage != '\0') {
|
||||
result->fConverter = ucnv_open(codepage, &status);
|
||||
}
|
||||
/* else result->fConverter is already memset'd to NULL. */
|
||||
|
||||
if(U_SUCCESS(status)) {
|
||||
result->fOwnFile = takeOwnership;
|
||||
}
|
||||
else {
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
u_locbund_close(&result->str.fBundle);
|
||||
#endif
|
||||
/* DO NOT fclose here!!!!!! */
|
||||
uprv_free(result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_finit(FILE *f,
|
||||
const char *locale,
|
||||
const char *codepage)
|
||||
{
|
||||
return finit_owner(f, locale, codepage, FALSE);
|
||||
}
|
||||
|
||||
U_CAPI UFILE* U_EXPORT2
|
||||
u_fadopt(FILE *f,
|
||||
const char *locale,
|
||||
const char *codepage)
|
||||
{
|
||||
return finit_owner(f, locale, codepage, TRUE);
|
||||
}
|
||||
|
||||
U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fopen(const char *filename,
|
||||
const char *perm,
|
||||
const char *locale,
|
||||
const char *codepage)
|
||||
{
|
||||
UFILE *result;
|
||||
FILE *systemFile = fopen(filename, perm);
|
||||
if(systemFile == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
result = finit_owner(systemFile, locale, codepage, TRUE);
|
||||
|
||||
if (!result) {
|
||||
/* Something bad happened.
|
||||
Maybe the converter couldn't be opened. */
|
||||
fclose(systemFile);
|
||||
}
|
||||
|
||||
return result; /* not a file leak */
|
||||
}
|
||||
|
||||
U_CAPI UFILE* U_EXPORT2
|
||||
u_fopen_u(const UChar *filename,
|
||||
const char *perm,
|
||||
const char *locale,
|
||||
const char *codepage)
|
||||
{
|
||||
UFILE *result;
|
||||
char buffer[256];
|
||||
|
||||
u_austrcpy(buffer, filename);
|
||||
|
||||
result = u_fopen(buffer, perm, locale, codepage);
|
||||
#if U_PLATFORM_USES_ONLY_WIN32_API
|
||||
/* Try Windows API _wfopen if the above fails. */
|
||||
if (!result) {
|
||||
// TODO: test this code path, including wperm.
|
||||
wchar_t wperm[40] = {};
|
||||
size_t retVal;
|
||||
mbstowcs_s(&retVal, wperm, perm, _TRUNCATE);
|
||||
FILE *systemFile = _wfopen((const wchar_t *)filename, wperm);
|
||||
if (systemFile) {
|
||||
result = finit_owner(systemFile, locale, codepage, TRUE);
|
||||
}
|
||||
if (!result) {
|
||||
/* Something bad happened.
|
||||
Maybe the converter couldn't be opened. */
|
||||
fclose(systemFile);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return result; /* not a file leak */
|
||||
}
|
||||
|
||||
U_CAPI UFILE* U_EXPORT2
|
||||
u_fstropen(UChar *stringBuf,
|
||||
int32_t capacity,
|
||||
const char *locale)
|
||||
{
|
||||
UFILE *result;
|
||||
|
||||
if (capacity < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = (UFILE*) uprv_malloc(sizeof(UFILE));
|
||||
/* Null pointer test */
|
||||
if (result == NULL) {
|
||||
return NULL; /* Just get out. */
|
||||
}
|
||||
uprv_memset(result, 0, sizeof(UFILE));
|
||||
result->str.fBuffer = stringBuf;
|
||||
result->str.fPos = stringBuf;
|
||||
result->str.fLimit = stringBuf+capacity;
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
/* if locale is 0, use the default */
|
||||
if(u_locbund_init(&result->str.fBundle, locale) == 0) {
|
||||
/* DO NOT FCLOSE HERE! */
|
||||
uprv_free(result);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
U_CAPI UBool U_EXPORT2
|
||||
u_feof(UFILE *f)
|
||||
{
|
||||
UBool endOfBuffer;
|
||||
if (f == NULL) {
|
||||
return TRUE;
|
||||
}
|
||||
endOfBuffer = (UBool)(f->str.fPos >= f->str.fLimit);
|
||||
if (f->fFile != NULL) {
|
||||
return endOfBuffer && feof(f->fFile);
|
||||
}
|
||||
return endOfBuffer;
|
||||
}
|
||||
|
||||
U_CAPI void U_EXPORT2
|
||||
u_fflush(UFILE *file)
|
||||
{
|
||||
ufile_flush_translit(file);
|
||||
ufile_flush_io(file);
|
||||
if (file->fFile) {
|
||||
fflush(file->fFile);
|
||||
}
|
||||
else if (file->str.fPos < file->str.fLimit) {
|
||||
*(file->str.fPos++) = 0;
|
||||
}
|
||||
/* TODO: flush input */
|
||||
}
|
||||
|
||||
U_CAPI void
|
||||
u_frewind(UFILE *file)
|
||||
{
|
||||
u_fflush(file);
|
||||
ucnv_reset(file->fConverter);
|
||||
if (file->fFile) {
|
||||
rewind(file->fFile);
|
||||
file->str.fLimit = file->fUCBuffer;
|
||||
file->str.fPos = file->fUCBuffer;
|
||||
}
|
||||
else {
|
||||
file->str.fPos = file->str.fBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
U_CAPI void U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fclose(UFILE *file)
|
||||
{
|
||||
if (file) {
|
||||
u_fflush(file);
|
||||
ufile_close_translit(file);
|
||||
|
||||
if(file->fOwnFile)
|
||||
fclose(file->fFile);
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
u_locbund_close(&file->str.fBundle);
|
||||
#endif
|
||||
|
||||
ucnv_close(file->fConverter);
|
||||
uprv_free(file);
|
||||
}
|
||||
}
|
||||
|
||||
U_CAPI FILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgetfile( UFILE *f)
|
||||
{
|
||||
return f->fFile;
|
||||
}
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
|
||||
U_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgetlocale( UFILE *file)
|
||||
{
|
||||
return file->str.fBundle.fLocale;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fsetlocale(UFILE *file,
|
||||
const char *locale)
|
||||
{
|
||||
u_locbund_close(&file->str.fBundle);
|
||||
|
||||
return u_locbund_init(&file->str.fBundle, locale) == 0 ? -1 : 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
U_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgetcodepage(UFILE *file)
|
||||
{
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
const char *codepage = NULL;
|
||||
|
||||
if (file->fConverter) {
|
||||
codepage = ucnv_getName(file->fConverter, &status);
|
||||
if(U_FAILURE(status))
|
||||
return 0;
|
||||
}
|
||||
return codepage;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fsetcodepage( const char *codepage,
|
||||
UFILE *file)
|
||||
{
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
int32_t retVal = -1;
|
||||
|
||||
/* We use the normal default codepage for this system, and not the one for the locale. */
|
||||
if ((file->str.fPos == file->str.fBuffer) && (file->str.fLimit == file->str.fBuffer)) {
|
||||
ucnv_close(file->fConverter);
|
||||
file->fConverter = ucnv_open(codepage, &status);
|
||||
if(U_SUCCESS(status)) {
|
||||
retVal = 0;
|
||||
}
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
||||
U_CAPI UConverter * U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgetConverter(UFILE *file)
|
||||
{
|
||||
return file->fConverter;
|
||||
}
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
U_CAPI const UNumberFormat* U_EXPORT2 u_fgetNumberFormat(UFILE *file)
|
||||
{
|
||||
return u_locbund_getNumberFormat(&file->str.fBundle, UNUM_DECIMAL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
140
deps/icu-small/source/io/ufile.h
vendored
140
deps/icu-small/source/io/ufile.h
vendored
@ -1,140 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
*******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
*******************************************************************************
|
||||
*
|
||||
* File ufile.h
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 12/01/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef UFILE_H
|
||||
#define UFILE_H
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "unicode/ucnv.h"
|
||||
#include "unicode/utrans.h"
|
||||
#include "locbund.h"
|
||||
|
||||
/* The buffer size for fromUnicode calls */
|
||||
#define UFILE_CHARBUFFER_SIZE 1024
|
||||
|
||||
/* The buffer size for toUnicode calls */
|
||||
#define UFILE_UCHARBUFFER_SIZE 1024
|
||||
|
||||
/* A UFILE */
|
||||
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
|
||||
typedef struct {
|
||||
UChar *buffer; /* Beginning of buffer */
|
||||
int32_t capacity; /* Capacity of buffer */
|
||||
int32_t pos; /* Beginning of untranslitted data */
|
||||
int32_t length; /* Length *from beginning of buffer* of untranslitted data */
|
||||
UTransliterator *translit;
|
||||
} UFILETranslitBuffer;
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct u_localized_string {
|
||||
UChar *fPos; /* current pos in fUCBuffer */
|
||||
const UChar *fLimit; /* data limit in fUCBuffer */
|
||||
UChar *fBuffer; /* Place to write the string */
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
ULocaleBundle fBundle; /* formatters */
|
||||
#endif
|
||||
} u_localized_string;
|
||||
|
||||
struct UFILE {
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
UFILETranslitBuffer *fTranslit;
|
||||
#endif
|
||||
|
||||
FILE *fFile; /* the actual filesystem interface */
|
||||
|
||||
UConverter *fConverter; /* for codeset conversion */
|
||||
|
||||
u_localized_string str; /* struct to handle strings for number formatting */
|
||||
|
||||
UChar fUCBuffer[UFILE_UCHARBUFFER_SIZE];/* buffer used for toUnicode */
|
||||
|
||||
UBool fOwnFile; /* TRUE if fFile should be closed */
|
||||
|
||||
int32_t fFileno; /* File number. Useful to determine if it's stdin. */
|
||||
};
|
||||
|
||||
/**
|
||||
* Like u_file_write but takes a flush parameter
|
||||
*/
|
||||
U_CFUNC int32_t U_EXPORT2
|
||||
u_file_write_flush( const UChar *chars,
|
||||
int32_t count,
|
||||
UFILE *f,
|
||||
UBool flushIO,
|
||||
UBool flushTranslit);
|
||||
|
||||
/**
|
||||
* Fill a UFILE's buffer with converted codepage data.
|
||||
* @param f The UFILE containing the buffer to fill.
|
||||
*/
|
||||
void
|
||||
ufile_fill_uchar_buffer(UFILE *f);
|
||||
|
||||
/**
|
||||
* Get one code unit and detect whether the end of file has been reached.
|
||||
* @param f The UFILE containing the characters.
|
||||
* @param ch The read in character
|
||||
* @return TRUE if the character is valid, or FALSE when EOF has been detected
|
||||
*/
|
||||
U_CFUNC UBool U_EXPORT2
|
||||
ufile_getch(UFILE *f, UChar *ch);
|
||||
|
||||
/**
|
||||
* Get one character and detect whether the end of file has been reached.
|
||||
* @param f The UFILE containing the characters.
|
||||
* @param ch The read in character
|
||||
* @return TRUE if the character is valid, or FALSE when EOF has been detected
|
||||
*/
|
||||
U_CFUNC UBool U_EXPORT2
|
||||
ufile_getch32(UFILE *f, UChar32 *ch);
|
||||
|
||||
/**
|
||||
* Close out the transliterator and flush any data therein.
|
||||
* @param f flu
|
||||
*/
|
||||
void
|
||||
ufile_close_translit(UFILE *f);
|
||||
|
||||
/**
|
||||
* Flush the buffer in the transliterator
|
||||
* @param f UFile to flush
|
||||
*/
|
||||
void
|
||||
ufile_flush_translit(UFILE *f);
|
||||
|
||||
/**
|
||||
* Flush the IO buffer
|
||||
* @param f UFile to flush
|
||||
*/
|
||||
void
|
||||
ufile_flush_io(UFILE *f);
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
259
deps/icu-small/source/io/ufmt_cmn.cpp
vendored
259
deps/icu-small/source/io/ufmt_cmn.cpp
vendored
@ -1,259 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File ufmt_cmn.c
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 12/02/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
* 03/15/99 stephen Added defaultCPToUnicode, unicodeToDefaultCP
|
||||
* 07/19/99 stephen Fixed bug in defaultCPToUnicode
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "cstring.h"
|
||||
#include "cmemory.h"
|
||||
#include "ufmt_cmn.h"
|
||||
#include "unicode/uchar.h"
|
||||
#include "unicode/ucnv.h"
|
||||
#include "ustr_cnv.h"
|
||||
|
||||
#if !UCONFIG_NO_CONVERSION
|
||||
|
||||
|
||||
#define DIGIT_0 0x0030
|
||||
#define DIGIT_9 0x0039
|
||||
#define LOWERCASE_A 0x0061
|
||||
#define UPPERCASE_A 0x0041
|
||||
#define LOWERCASE_Z 0x007A
|
||||
#define UPPERCASE_Z 0x005A
|
||||
|
||||
int
|
||||
ufmt_digitvalue(UChar c)
|
||||
{
|
||||
if( ((c>=DIGIT_0)&&(c<=DIGIT_9)) ||
|
||||
((c>=LOWERCASE_A)&&(c<=LOWERCASE_Z)) ||
|
||||
((c>=UPPERCASE_A)&&(c<=UPPERCASE_Z)) )
|
||||
{
|
||||
return c - DIGIT_0 - (c >= 0x0041 ? (c >= 0x0061 ? 39 : 7) : 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
UBool
|
||||
ufmt_isdigit(UChar c,
|
||||
int32_t radix)
|
||||
{
|
||||
int digitVal = ufmt_digitvalue(c);
|
||||
|
||||
return (UBool)(digitVal < radix && digitVal >= 0);
|
||||
}
|
||||
|
||||
#define TO_UC_DIGIT(a) a <= 9 ? (DIGIT_0 + a) : (0x0037 + a)
|
||||
#define TO_LC_DIGIT(a) a <= 9 ? (DIGIT_0 + a) : (0x0057 + a)
|
||||
|
||||
void
|
||||
ufmt_64tou(UChar *buffer,
|
||||
int32_t *len,
|
||||
uint64_t value,
|
||||
uint8_t radix,
|
||||
UBool uselower,
|
||||
int32_t minDigits)
|
||||
{
|
||||
int32_t length = 0;
|
||||
uint32_t digit;
|
||||
UChar *left, *right, temp;
|
||||
|
||||
do {
|
||||
digit = (uint32_t)(value % radix);
|
||||
value = value / radix;
|
||||
buffer[length++] = (UChar)(uselower ? TO_LC_DIGIT(digit)
|
||||
: TO_UC_DIGIT(digit));
|
||||
} while(value);
|
||||
|
||||
/* pad with zeroes to make it minDigits long */
|
||||
if(minDigits != -1 && length < minDigits) {
|
||||
while(length < minDigits && length < *len)
|
||||
buffer[length++] = DIGIT_0; /*zero padding */
|
||||
}
|
||||
|
||||
/* reverse the buffer */
|
||||
left = buffer;
|
||||
right = buffer + length;
|
||||
while(left < --right) {
|
||||
temp = *left;
|
||||
*left++ = *right;
|
||||
*right = temp;
|
||||
}
|
||||
|
||||
*len = length;
|
||||
}
|
||||
|
||||
void
|
||||
ufmt_ptou(UChar *buffer,
|
||||
int32_t *len,
|
||||
void *value,
|
||||
UBool uselower)
|
||||
{
|
||||
int32_t i;
|
||||
int32_t length = 0;
|
||||
uint8_t *ptrIdx = (uint8_t *)&value;
|
||||
|
||||
#if U_IS_BIG_ENDIAN
|
||||
for (i = 0; i < (int32_t)sizeof(void *); i++)
|
||||
#else
|
||||
for (i = (int32_t)sizeof(void *)-1; i >= 0 ; i--)
|
||||
#endif
|
||||
{
|
||||
uint8_t byteVal = ptrIdx[i];
|
||||
uint16_t firstNibble = (uint16_t)(byteVal>>4);
|
||||
uint16_t secondNibble = (uint16_t)(byteVal&0xF);
|
||||
if (uselower) {
|
||||
buffer[length++]=TO_LC_DIGIT(firstNibble);
|
||||
buffer[length++]=TO_LC_DIGIT(secondNibble);
|
||||
}
|
||||
else {
|
||||
buffer[length++]=TO_UC_DIGIT(firstNibble);
|
||||
buffer[length++]=TO_UC_DIGIT(secondNibble);
|
||||
}
|
||||
}
|
||||
|
||||
*len = length;
|
||||
}
|
||||
|
||||
int64_t
|
||||
ufmt_uto64(const UChar *buffer,
|
||||
int32_t *len,
|
||||
int8_t radix)
|
||||
{
|
||||
const UChar *limit;
|
||||
int32_t count;
|
||||
int64_t result;
|
||||
|
||||
|
||||
/* intialize parameters */
|
||||
limit = buffer + *len;
|
||||
count = 0;
|
||||
result = 0;
|
||||
|
||||
/* iterate through buffer */
|
||||
while(ufmt_isdigit(*buffer, radix) && buffer < limit) {
|
||||
|
||||
/* read the next digit */
|
||||
result *= radix;
|
||||
result += ufmt_digitvalue(*buffer++);
|
||||
|
||||
/* increment our count */
|
||||
++count;
|
||||
}
|
||||
|
||||
*len = count;
|
||||
return result;
|
||||
}
|
||||
|
||||
#define NIBBLE_PER_BYTE 2
|
||||
void *
|
||||
ufmt_utop(const UChar *buffer,
|
||||
int32_t *len)
|
||||
{
|
||||
int32_t count, resultIdx, incVal, offset;
|
||||
/* This union allows the pointer to be written as an array. */
|
||||
union {
|
||||
void *ptr;
|
||||
uint8_t bytes[sizeof(void*)];
|
||||
} result;
|
||||
|
||||
/* intialize variables */
|
||||
count = 0;
|
||||
offset = 0;
|
||||
result.ptr = NULL;
|
||||
|
||||
/* Skip the leading zeros */
|
||||
while(buffer[count] == DIGIT_0 || u_isspace(buffer[count])) {
|
||||
count++;
|
||||
offset++;
|
||||
}
|
||||
|
||||
/* iterate through buffer, stop when you hit the end */
|
||||
while(ufmt_isdigit(buffer[count], 16) && count < *len) {
|
||||
/* increment the count consumed */
|
||||
++count;
|
||||
}
|
||||
|
||||
/* detect overflow */
|
||||
if (count - offset > (int32_t)(sizeof(void*)*NIBBLE_PER_BYTE)) {
|
||||
offset = count - (int32_t)(sizeof(void*)*NIBBLE_PER_BYTE);
|
||||
}
|
||||
|
||||
/* Initialize the direction of the input */
|
||||
#if U_IS_BIG_ENDIAN
|
||||
incVal = -1;
|
||||
resultIdx = (int32_t)(sizeof(void*) - 1);
|
||||
#else
|
||||
incVal = 1;
|
||||
resultIdx = 0;
|
||||
#endif
|
||||
/* Write how much was consumed. */
|
||||
*len = count;
|
||||
while(--count >= offset) {
|
||||
/* Get the first nibble of the byte */
|
||||
uint8_t byte = (uint8_t)ufmt_digitvalue(buffer[count]);
|
||||
|
||||
if (count > offset) {
|
||||
/* Get the second nibble of the byte when available */
|
||||
byte = (uint8_t)(byte + (ufmt_digitvalue(buffer[--count]) << 4));
|
||||
}
|
||||
/* Write the byte into the array */
|
||||
result.bytes[resultIdx] = byte;
|
||||
resultIdx += incVal;
|
||||
}
|
||||
|
||||
return result.ptr;
|
||||
}
|
||||
|
||||
UChar*
|
||||
ufmt_defaultCPToUnicode(const char *s, int32_t sSize,
|
||||
UChar *target, int32_t tSize)
|
||||
{
|
||||
UChar *alias;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
UConverter *defConverter = u_getDefaultConverter(&status);
|
||||
|
||||
if(U_FAILURE(status) || defConverter == 0)
|
||||
return 0;
|
||||
|
||||
if(sSize <= 0) {
|
||||
sSize = uprv_strlen(s) + 1;
|
||||
}
|
||||
|
||||
/* perform the conversion in one swoop */
|
||||
if(target != 0) {
|
||||
|
||||
alias = target;
|
||||
ucnv_toUnicode(defConverter, &alias, alias + tSize, &s, s + sSize - 1,
|
||||
NULL, TRUE, &status);
|
||||
|
||||
|
||||
/* add the null terminator */
|
||||
*alias = 0x0000;
|
||||
}
|
||||
|
||||
u_releaseDefaultConverter(defConverter);
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
161
deps/icu-small/source/io/ufmt_cmn.h
vendored
161
deps/icu-small/source/io/ufmt_cmn.h
vendored
@ -1,161 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2011, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File ufmt_cmn.h
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 12/02/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
* 03/15/99 stephen Added defaultCPToUnicode, unicodeToDefaultCP
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef UFMT_CMN_H
|
||||
#define UFMT_CMN_H
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
#include "unicode/utf16.h"
|
||||
|
||||
#define UFMT_DEFAULT_BUFFER_SIZE 128
|
||||
#define MAX_UCHAR_BUFFER_SIZE(buffer) ((int32_t)(sizeof(buffer)/(U16_MAX_LENGTH*sizeof(UChar))))
|
||||
#define MAX_UCHAR_BUFFER_NEEDED(strLen) ((strLen+1)*U16_MAX_LENGTH*sizeof(UChar))
|
||||
|
||||
/**
|
||||
* Enum representing the possible argument types for uprintf/uscanf
|
||||
*/
|
||||
typedef enum ufmt_type_info {
|
||||
ufmt_empty = 0,
|
||||
ufmt_simple_percent, /* %% do nothing */
|
||||
ufmt_count, /* special flag for count */
|
||||
ufmt_int, /* int */
|
||||
ufmt_char, /* int, cast to char */
|
||||
ufmt_string, /* char* */
|
||||
ufmt_pointer, /* void* */
|
||||
ufmt_float, /* float */
|
||||
ufmt_double, /* double */
|
||||
ufmt_uchar, /* int, cast to UChar */
|
||||
ufmt_ustring /* UChar* */
|
||||
/*ufmt_wchar,*/ /* wchar_t */
|
||||
/*ufmt_wstring,*/ /* wchar_t* */
|
||||
/*ufmt_date,*/ /* Date */
|
||||
/*ufmt_last*/
|
||||
} ufmt_type_info;
|
||||
|
||||
/**
|
||||
* Union representing a uprintf/uscanf argument
|
||||
*/
|
||||
typedef union ufmt_args {
|
||||
int64_t int64Value; /* int, UChar */
|
||||
float floatValue; /* float */
|
||||
double doubleValue; /* double */
|
||||
void *ptrValue; /* any pointer - void*, char*, wchar_t*, UChar* */
|
||||
/*wchar_t wcharValue;*/ /* wchar_t */ /* TODO: Should wchar_t be used? */
|
||||
/*UDate dateValue;*/ /* Date */
|
||||
} ufmt_args;
|
||||
|
||||
/**
|
||||
* Macro for determining the minimum of two numbers.
|
||||
* @param a An integer
|
||||
* @param b An integer
|
||||
* @return <TT>a</TT> if </TT>a < b</TT>, <TT>b</TT> otherwise
|
||||
*/
|
||||
#define ufmt_min(a,b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
/**
|
||||
* Convert a UChar in hex radix to an integer value.
|
||||
* @param c The UChar to convert.
|
||||
* @return The integer value of <TT>c</TT>.
|
||||
*/
|
||||
int
|
||||
ufmt_digitvalue(UChar c);
|
||||
|
||||
/**
|
||||
* Determine if a UChar is a digit for a specified radix.
|
||||
* @param c The UChar to check.
|
||||
* @param radix The desired radix.
|
||||
* @return TRUE if <TT>c</TT> is a digit in <TT>radix</TT>, FALSE otherwise.
|
||||
*/
|
||||
UBool
|
||||
ufmt_isdigit(UChar c,
|
||||
int32_t radix);
|
||||
|
||||
/**
|
||||
* Convert an int64_t to a UChar* in a specified radix
|
||||
* @param buffer The target buffer
|
||||
* @param len On input, the size of <TT>buffer</TT>. On output,
|
||||
* the number of UChars written to <TT>buffer</TT>.
|
||||
* @param value The value to be converted
|
||||
* @param radix The desired radix
|
||||
* @param uselower TRUE means lower case will be used, FALSE means upper case
|
||||
* @param minDigits The minimum number of digits for for the formatted number,
|
||||
* which will be padded with zeroes. -1 means do not pad.
|
||||
*/
|
||||
void
|
||||
ufmt_64tou(UChar *buffer,
|
||||
int32_t *len,
|
||||
uint64_t value,
|
||||
uint8_t radix,
|
||||
UBool uselower,
|
||||
int32_t minDigits);
|
||||
|
||||
/**
|
||||
* It's like ufmt_64tou, but with a pointer.
|
||||
* This functions avoids size constraints of 64-bit types.
|
||||
* Pointers can be at 32-128 bits in size.
|
||||
*/
|
||||
void
|
||||
ufmt_ptou(UChar *buffer,
|
||||
int32_t *len,
|
||||
void *value,
|
||||
UBool uselower);
|
||||
|
||||
/**
|
||||
* Convert a UChar* in a specified radix to an int64_t.
|
||||
* @param buffer The target buffer
|
||||
* @param len On input, the size of <TT>buffer</TT>. On output,
|
||||
* the number of UChars read from <TT>buffer</TT>.
|
||||
* @param radix The desired radix
|
||||
* @return The numeric value.
|
||||
*/
|
||||
int64_t
|
||||
ufmt_uto64(const UChar *buffer,
|
||||
int32_t *len,
|
||||
int8_t radix);
|
||||
|
||||
/**
|
||||
* Convert a UChar* in a specified radix to a pointer,
|
||||
* @param buffer The target buffer
|
||||
* @param len On input, the size of <TT>buffer</TT>. On output,
|
||||
* the number of UChars read from <TT>buffer</TT>.
|
||||
* @param radix The desired radix
|
||||
* @return The pointer value.
|
||||
*/
|
||||
void *
|
||||
ufmt_utop(const UChar *buffer,
|
||||
int32_t *len);
|
||||
|
||||
/**
|
||||
* Convert a string from the default codepage to Unicode.
|
||||
* @param s The string to convert, in the default codepage.
|
||||
* @param sSize The size of s to convert.
|
||||
* @param target The buffer to convert to.
|
||||
* @param tSize The size of target
|
||||
* @return A pointer to a newly allocated converted version of s, or 0
|
||||
* on error.
|
||||
*/
|
||||
UChar*
|
||||
ufmt_defaultCPToUnicode(const char *s, int32_t sSize,
|
||||
UChar *target, int32_t tSize);
|
||||
|
||||
|
||||
|
||||
#endif
|
1016
deps/icu-small/source/io/unicode/ustdio.h
vendored
1016
deps/icu-small/source/io/unicode/ustdio.h
vendored
File diff suppressed because it is too large
Load Diff
70
deps/icu-small/source/io/unicode/ustream.h
vendored
70
deps/icu-small/source/io/unicode/ustream.h
vendored
@ -1,70 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
**********************************************************************
|
||||
* Copyright (C) 2001-2014 International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
**********************************************************************
|
||||
* FILE NAME : ustream.h
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 06/25/2001 grhoten Move iostream from unistr.h
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef USTREAM_H
|
||||
#define USTREAM_H
|
||||
|
||||
#include "unicode/unistr.h"
|
||||
|
||||
#if !UCONFIG_NO_CONVERSION // not available without conversion
|
||||
|
||||
/**
|
||||
* \file
|
||||
* \brief C++ API: Unicode iostream like API
|
||||
*
|
||||
* At this time, this API is very limited. It contains
|
||||
* operator<< and operator>> for UnicodeString manipulation with the
|
||||
* C++ I/O stream API.
|
||||
*/
|
||||
|
||||
#if defined(__GLIBCXX__)
|
||||
namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364
|
||||
#endif
|
||||
|
||||
#if U_IOSTREAM_SOURCE >= 199711
|
||||
#if (__GNUC__ == 2)
|
||||
#include <iostream>
|
||||
#else
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#endif
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
/**
|
||||
* Write the contents of a UnicodeString to a C++ ostream. This functions writes
|
||||
* the characters in a UnicodeString to an ostream. The UChars in the
|
||||
* UnicodeString are converted to the char based ostream with the default
|
||||
* converter.
|
||||
* @stable 3.0
|
||||
*/
|
||||
U_IO_API std::ostream & U_EXPORT2 operator<<(std::ostream& stream, const UnicodeString& s);
|
||||
|
||||
/**
|
||||
* Write the contents from a C++ istream to a UnicodeString. The UChars in the
|
||||
* UnicodeString are converted from the char based istream with the default
|
||||
* converter.
|
||||
* @stable 3.0
|
||||
*/
|
||||
U_IO_API std::istream & U_EXPORT2 operator>>(std::istream& stream, UnicodeString& s);
|
||||
U_NAMESPACE_END
|
||||
|
||||
#endif
|
||||
|
||||
/* No operator for UChar because it can conflict with wchar_t */
|
||||
|
||||
#endif
|
||||
#endif
|
218
deps/icu-small/source/io/uprintf.cpp
vendored
218
deps/icu-small/source/io/uprintf.cpp
vendored
@ -1,218 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File uprintf.cpp
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 11/19/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
* Added conversion from default codepage.
|
||||
* 08/07/2003 george Reunify printf implementations
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include "unicode/ustdio.h"
|
||||
#include "unicode/ustring.h"
|
||||
#include "unicode/unum.h"
|
||||
#include "unicode/udat.h"
|
||||
#include "unicode/putil.h"
|
||||
|
||||
#include "cmemory.h"
|
||||
#include "locbund.h"
|
||||
#include "mutex.h"
|
||||
#include "uassert.h"
|
||||
#include "uprintf.h"
|
||||
#include "ufile.h"
|
||||
#include "ucln_io.h"
|
||||
|
||||
U_NAMESPACE_USE
|
||||
|
||||
static UFILE *gStdOut = NULL;
|
||||
static UInitOnce gStdOutInitOnce = U_INITONCE_INITIALIZER;
|
||||
|
||||
static UBool U_CALLCONV uprintf_cleanup(void)
|
||||
{
|
||||
if (gStdOut != NULL) {
|
||||
u_fclose(gStdOut);
|
||||
gStdOut = NULL;
|
||||
}
|
||||
gStdOutInitOnce.reset();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void U_CALLCONV u_stdout_init() {
|
||||
U_ASSERT(gStdOut == NULL);
|
||||
gStdOut = u_finit(stdout, NULL, NULL);
|
||||
ucln_io_registerCleanup(UCLN_IO_PRINTF, &uprintf_cleanup);
|
||||
}
|
||||
|
||||
U_CAPI UFILE * U_EXPORT2
|
||||
u_get_stdout()
|
||||
{
|
||||
umtx_initOnce(gStdOutInitOnce, &u_stdout_init);
|
||||
return gStdOut;
|
||||
}
|
||||
|
||||
static int32_t U_EXPORT2
|
||||
u_printf_write(void *context,
|
||||
const UChar *str,
|
||||
int32_t count)
|
||||
{
|
||||
return u_file_write(str, count, (UFILE *)context);
|
||||
}
|
||||
|
||||
static int32_t
|
||||
u_printf_pad_and_justify(void *context,
|
||||
const u_printf_spec_info *info,
|
||||
const UChar *result,
|
||||
int32_t resultLen)
|
||||
{
|
||||
UFILE *output = (UFILE *)context;
|
||||
int32_t written, i;
|
||||
|
||||
/* pad and justify, if needed */
|
||||
if(info->fWidth != -1 && resultLen < info->fWidth) {
|
||||
/* left justify */
|
||||
if(info->fLeft) {
|
||||
written = u_file_write(result, resultLen, output);
|
||||
for(i = 0; i < info->fWidth - resultLen; ++i) {
|
||||
written += u_file_write(&info->fPadChar, 1, output);
|
||||
}
|
||||
}
|
||||
/* right justify */
|
||||
else {
|
||||
written = 0;
|
||||
for(i = 0; i < info->fWidth - resultLen; ++i) {
|
||||
written += u_file_write(&info->fPadChar, 1, output);
|
||||
}
|
||||
written += u_file_write(result, resultLen, output);
|
||||
}
|
||||
}
|
||||
/* just write the formatted output */
|
||||
else {
|
||||
written = u_file_write(result, resultLen, output);
|
||||
}
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_fprintf( UFILE *f,
|
||||
const char *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t count;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
count = u_vfprintf(f, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_printf(const char *patternSpecification,
|
||||
...)
|
||||
{
|
||||
va_list ap;
|
||||
int32_t count;
|
||||
va_start(ap, patternSpecification);
|
||||
count = u_vfprintf(u_get_stdout(), patternSpecification, ap);
|
||||
va_end(ap);
|
||||
return count;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_fprintf_u( UFILE *f,
|
||||
const UChar *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t count;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
count = u_vfprintf_u(f, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_printf_u(const UChar *patternSpecification,
|
||||
...)
|
||||
{
|
||||
va_list ap;
|
||||
int32_t count;
|
||||
va_start(ap, patternSpecification);
|
||||
count = u_vfprintf_u(u_get_stdout(), patternSpecification, ap);
|
||||
va_end(ap);
|
||||
return count;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_vfprintf( UFILE *f,
|
||||
const char *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t count;
|
||||
UChar *pattern;
|
||||
UChar buffer[UFMT_DEFAULT_BUFFER_SIZE];
|
||||
size_t size = strlen(patternSpecification) + 1;
|
||||
|
||||
/* convert from the default codepage to Unicode */
|
||||
if (size >= MAX_UCHAR_BUFFER_SIZE(buffer)) {
|
||||
pattern = (UChar *)uprv_malloc(size * sizeof(UChar));
|
||||
if(pattern == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pattern = buffer;
|
||||
}
|
||||
u_charsToUChars(patternSpecification, pattern, size);
|
||||
|
||||
/* do the work */
|
||||
count = u_vfprintf_u(f, pattern, ap);
|
||||
|
||||
/* clean up */
|
||||
if (pattern != buffer) {
|
||||
uprv_free(pattern);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const u_printf_stream_handler g_stream_handler = {
|
||||
u_printf_write,
|
||||
u_printf_pad_and_justify
|
||||
};
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_vfprintf_u( UFILE *f,
|
||||
const UChar *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t written = 0; /* haven't written anything yet */
|
||||
|
||||
/* parse and print the whole format string */
|
||||
u_printf_parse(&g_stream_handler, patternSpecification, f, NULL, &f->str.fBundle, &written, ap);
|
||||
|
||||
/* return # of UChars written */
|
||||
return written;
|
||||
}
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
103
deps/icu-small/source/io/uprintf.h
vendored
103
deps/icu-small/source/io/uprintf.h
vendored
@ -1,103 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2006, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File uprintf.h
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 11/19/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef UPRINTF_H
|
||||
#define UPRINTF_H
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING
|
||||
|
||||
#include "unicode/ustdio.h"
|
||||
#include "ufmt_cmn.h"
|
||||
#include "locbund.h"
|
||||
|
||||
/**
|
||||
* Struct encapsulating a single uprintf format specification.
|
||||
*/
|
||||
typedef struct u_printf_spec_info {
|
||||
int32_t fPrecision; /* Precision */
|
||||
int32_t fWidth; /* Width */
|
||||
|
||||
UChar fOrigSpec; /* Conversion specification */
|
||||
UChar fSpec; /* Conversion specification */
|
||||
UChar fPadChar; /* Padding character */
|
||||
|
||||
UBool fAlt; /* # flag */
|
||||
UBool fSpace; /* Space flag */
|
||||
UBool fLeft; /* - flag */
|
||||
UBool fShowSign; /* + flag */
|
||||
UBool fZero; /* 0 flag */
|
||||
|
||||
UBool fIsLongDouble; /* L flag */
|
||||
UBool fIsShort; /* h flag */
|
||||
UBool fIsLong; /* l flag */
|
||||
UBool fIsLongLong; /* ll flag */
|
||||
} u_printf_spec_info;
|
||||
|
||||
typedef int32_t U_EXPORT2
|
||||
u_printf_write_stream(void *context,
|
||||
const UChar *str,
|
||||
int32_t count);
|
||||
|
||||
typedef int32_t U_EXPORT2
|
||||
u_printf_pad_and_justify_stream(void *context,
|
||||
const u_printf_spec_info *info,
|
||||
const UChar *result,
|
||||
int32_t resultLen);
|
||||
|
||||
typedef struct u_printf_stream_handler {
|
||||
u_printf_write_stream *write;
|
||||
u_printf_pad_and_justify_stream *pad_and_justify;
|
||||
} u_printf_stream_handler;
|
||||
|
||||
/* Used by sprintf */
|
||||
typedef struct u_localized_print_string {
|
||||
UChar *str; /* Place to write the string */
|
||||
int32_t available;/* Number of codeunits available to write to */
|
||||
int32_t len; /* Maximum number of code units that can be written to output */
|
||||
|
||||
ULocaleBundle fBundle; /* formatters */
|
||||
} u_localized_print_string;
|
||||
|
||||
#define UP_PERCENT 0x0025
|
||||
|
||||
/**
|
||||
* Parse a single u_printf format string.
|
||||
* @param fmt A pointer to a '%' character in a u_printf format specification.
|
||||
* @param spec A pointer to a <TT>u_printf_spec</TT> to receive the parsed
|
||||
* format specifier.
|
||||
* @param locStringContext If present, will make sure that it will only write
|
||||
* to the buffer when space is available. It's done this way because
|
||||
* va_list sometimes can't be passed by pointer.
|
||||
* @return The number of characters contained in this specifier.
|
||||
*/
|
||||
U_CFUNC int32_t
|
||||
u_printf_parse(const u_printf_stream_handler *streamHandler,
|
||||
const UChar *fmt,
|
||||
void *context,
|
||||
u_localized_print_string *locStringContext,
|
||||
ULocaleBundle *formatBundle,
|
||||
int32_t *written,
|
||||
va_list ap);
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
||||
|
||||
#endif
|
1606
deps/icu-small/source/io/uprntf_p.cpp
vendored
1606
deps/icu-small/source/io/uprntf_p.cpp
vendored
File diff suppressed because it is too large
Load Diff
107
deps/icu-small/source/io/uscanf.cpp
vendored
107
deps/icu-small/source/io/uscanf.cpp
vendored
@ -1,107 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File uscanf.c
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 12/02/98 stephen Creation.
|
||||
* 03/13/99 stephen Modified for new C API.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#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_fscanf(UFILE *f,
|
||||
const char *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t converted;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
converted = u_vfscanf(f, patternSpecification, ap);
|
||||
va_end(ap);
|
||||
|
||||
return converted;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_fscanf_u(UFILE *f,
|
||||
const UChar *patternSpecification,
|
||||
... )
|
||||
{
|
||||
va_list ap;
|
||||
int32_t converted;
|
||||
|
||||
va_start(ap, patternSpecification);
|
||||
converted = u_vfscanf_u(f, 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_vfscanf(UFILE *f,
|
||||
const char *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
int32_t converted;
|
||||
UChar *pattern;
|
||||
UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE];
|
||||
int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1;
|
||||
|
||||
/* convert from the default codepage to Unicode */
|
||||
if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) {
|
||||
pattern = (UChar *)uprv_malloc(size * sizeof(UChar));
|
||||
if(pattern == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pattern = patBuffer;
|
||||
}
|
||||
u_charsToUChars(patternSpecification, pattern, size);
|
||||
|
||||
/* do the work */
|
||||
converted = u_vfscanf_u(f, 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_vfscanf_u(UFILE *f,
|
||||
const UChar *patternSpecification,
|
||||
va_list ap)
|
||||
{
|
||||
return u_scanf_parse(f, patternSpecification, ap);
|
||||
}
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
37
deps/icu-small/source/io/uscanf.h
vendored
37
deps/icu-small/source/io/uscanf.h
vendored
@ -1,37 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2014, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File uscanf.h
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 12/02/98 stephen Creation.
|
||||
* 03/13/99 stephen Modified for new C API.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef USCANF_H
|
||||
#define USCANF_H
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include "unicode/ustdio.h"
|
||||
|
||||
U_CFUNC int32_t
|
||||
u_scanf_parse(UFILE *f,
|
||||
const UChar *patternSpecification,
|
||||
va_list ap);
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
||||
|
||||
#endif
|
1450
deps/icu-small/source/io/uscanf_p.cpp
vendored
1450
deps/icu-small/source/io/uscanf_p.cpp
vendored
File diff suppressed because it is too large
Load Diff
732
deps/icu-small/source/io/ustdio.cpp
vendored
732
deps/icu-small/source/io/ustdio.cpp
vendored
@ -1,732 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (C) 1998-2016, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* File ustdio.c
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 11/18/98 stephen Creation.
|
||||
* 03/12/99 stephen Modified for new C API.
|
||||
* 07/19/99 stephen Fixed read() and gets()
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "unicode/ustdio.h"
|
||||
|
||||
#if !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include "unicode/putil.h"
|
||||
#include "cmemory.h"
|
||||
#include "cstring.h"
|
||||
#include "ufile.h"
|
||||
#include "ufmt_cmn.h"
|
||||
#include "unicode/ucnv.h"
|
||||
#include "unicode/ustring.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define DELIM_LF 0x000A
|
||||
#define DELIM_VT 0x000B
|
||||
#define DELIM_FF 0x000C
|
||||
#define DELIM_CR 0x000D
|
||||
#define DELIM_NEL 0x0085
|
||||
#define DELIM_LS 0x2028
|
||||
#define DELIM_PS 0x2029
|
||||
|
||||
/* TODO: is this correct for all codepages? Should we just use \n and let the converter handle it? */
|
||||
#if U_PLATFORM_USES_ONLY_WIN32_API
|
||||
static const UChar DELIMITERS [] = { DELIM_CR, DELIM_LF, 0x0000 };
|
||||
static const uint32_t DELIMITERS_LEN = 2;
|
||||
/* TODO: Default newline writing should be detected based upon the converter being used. */
|
||||
#else
|
||||
static const UChar DELIMITERS [] = { DELIM_LF, 0x0000 };
|
||||
static const uint32_t DELIMITERS_LEN = 1;
|
||||
#endif
|
||||
|
||||
#define IS_FIRST_STRING_DELIMITER(c1) \
|
||||
(UBool)((DELIM_LF <= (c1) && (c1) <= DELIM_CR) \
|
||||
|| (c1) == DELIM_NEL \
|
||||
|| (c1) == DELIM_LS \
|
||||
|| (c1) == DELIM_PS)
|
||||
#define CAN_HAVE_COMBINED_STRING_DELIMITER(c1) (UBool)((c1) == DELIM_CR)
|
||||
#define IS_COMBINED_STRING_DELIMITER(c1, c2) \
|
||||
(UBool)((c1) == DELIM_CR && (c2) == DELIM_LF)
|
||||
|
||||
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
|
||||
U_CAPI UTransliterator* U_EXPORT2
|
||||
u_fsettransliterator(UFILE *file, UFileDirection direction,
|
||||
UTransliterator *adopt, UErrorCode *status)
|
||||
{
|
||||
UTransliterator *old = NULL;
|
||||
|
||||
if(U_FAILURE(*status))
|
||||
{
|
||||
return adopt;
|
||||
}
|
||||
|
||||
if(!file)
|
||||
{
|
||||
*status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return adopt;
|
||||
}
|
||||
|
||||
if(direction & U_READ)
|
||||
{
|
||||
/** TODO: implement */
|
||||
*status = U_UNSUPPORTED_ERROR;
|
||||
return adopt;
|
||||
}
|
||||
|
||||
if(adopt == NULL) /* they are clearing it */
|
||||
{
|
||||
if(file->fTranslit != NULL)
|
||||
{
|
||||
/* TODO: Check side */
|
||||
old = file->fTranslit->translit;
|
||||
uprv_free(file->fTranslit->buffer);
|
||||
file->fTranslit->buffer=NULL;
|
||||
uprv_free(file->fTranslit);
|
||||
file->fTranslit=NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(file->fTranslit == NULL)
|
||||
{
|
||||
file->fTranslit = (UFILETranslitBuffer*) uprv_malloc(sizeof(UFILETranslitBuffer));
|
||||
if(!file->fTranslit)
|
||||
{
|
||||
*status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return adopt;
|
||||
}
|
||||
file->fTranslit->capacity = 0;
|
||||
file->fTranslit->length = 0;
|
||||
file->fTranslit->pos = 0;
|
||||
file->fTranslit->buffer = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
old = file->fTranslit->translit;
|
||||
ufile_flush_translit(file);
|
||||
}
|
||||
|
||||
file->fTranslit->translit = adopt;
|
||||
}
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
static const UChar * u_file_translit(UFILE *f, const UChar *src, int32_t *count, UBool flush)
|
||||
{
|
||||
int32_t newlen;
|
||||
int32_t junkCount = 0;
|
||||
int32_t textLength;
|
||||
int32_t textLimit;
|
||||
UTransPosition pos;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
|
||||
if(count == NULL)
|
||||
{
|
||||
count = &junkCount;
|
||||
}
|
||||
|
||||
if ((!f)||(!f->fTranslit)||(!f->fTranslit->translit))
|
||||
{
|
||||
/* fast path */
|
||||
return src;
|
||||
}
|
||||
|
||||
/* First: slide over everything */
|
||||
if(f->fTranslit->length > f->fTranslit->pos)
|
||||
{
|
||||
memmove(f->fTranslit->buffer, f->fTranslit->buffer + f->fTranslit->pos,
|
||||
(f->fTranslit->length - f->fTranslit->pos)*sizeof(UChar));
|
||||
}
|
||||
f->fTranslit->length -= f->fTranslit->pos; /* always */
|
||||
f->fTranslit->pos = 0;
|
||||
|
||||
/* Calculate new buffer size needed */
|
||||
newlen = (*count + f->fTranslit->length) * 4;
|
||||
|
||||
if(newlen > f->fTranslit->capacity)
|
||||
{
|
||||
if(f->fTranslit->buffer == NULL)
|
||||
{
|
||||
f->fTranslit->buffer = (UChar*)uprv_malloc(newlen * sizeof(UChar));
|
||||
}
|
||||
else
|
||||
{
|
||||
f->fTranslit->buffer = (UChar*)uprv_realloc(f->fTranslit->buffer, newlen * sizeof(UChar));
|
||||
}
|
||||
/* Check for malloc/realloc failure. */
|
||||
if (f->fTranslit->buffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
f->fTranslit->capacity = newlen;
|
||||
}
|
||||
|
||||
/* Now, copy any data over */
|
||||
u_strncpy(f->fTranslit->buffer + f->fTranslit->length,
|
||||
src,
|
||||
*count);
|
||||
f->fTranslit->length += *count;
|
||||
|
||||
/* Now, translit in place as much as we can */
|
||||
if(flush == FALSE)
|
||||
{
|
||||
textLength = f->fTranslit->length;
|
||||
pos.contextStart = 0;
|
||||
pos.contextLimit = textLength;
|
||||
pos.start = 0;
|
||||
pos.limit = textLength;
|
||||
|
||||
utrans_transIncrementalUChars(f->fTranslit->translit,
|
||||
f->fTranslit->buffer, /* because we shifted */
|
||||
&textLength,
|
||||
f->fTranslit->capacity,
|
||||
&pos,
|
||||
&status);
|
||||
|
||||
/* now: start/limit point to the transliterated text */
|
||||
/* Transliterated is [buffer..pos.start) */
|
||||
*count = pos.start;
|
||||
f->fTranslit->pos = pos.start;
|
||||
f->fTranslit->length = pos.limit;
|
||||
|
||||
return f->fTranslit->buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
textLength = f->fTranslit->length;
|
||||
textLimit = f->fTranslit->length;
|
||||
|
||||
utrans_transUChars(f->fTranslit->translit,
|
||||
f->fTranslit->buffer,
|
||||
&textLength,
|
||||
f->fTranslit->capacity,
|
||||
0,
|
||||
&textLimit,
|
||||
&status);
|
||||
|
||||
/* out: converted len */
|
||||
*count = textLimit;
|
||||
|
||||
/* Set pointers to 0 */
|
||||
f->fTranslit->pos = 0;
|
||||
f->fTranslit->length = 0;
|
||||
|
||||
return f->fTranslit->buffer;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
ufile_flush_translit(UFILE *f)
|
||||
{
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
if((!f)||(!f->fTranslit))
|
||||
return;
|
||||
#endif
|
||||
|
||||
u_file_write_flush(NULL, 0, f, FALSE, TRUE);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ufile_flush_io(UFILE *f)
|
||||
{
|
||||
if((!f) || (!f->fFile)) {
|
||||
return; /* skip if no file */
|
||||
}
|
||||
|
||||
u_file_write_flush(NULL, 0, f, TRUE, FALSE);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ufile_close_translit(UFILE *f)
|
||||
{
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
if((!f)||(!f->fTranslit))
|
||||
return;
|
||||
#endif
|
||||
|
||||
ufile_flush_translit(f);
|
||||
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
if(f->fTranslit->translit)
|
||||
utrans_close(f->fTranslit->translit);
|
||||
|
||||
if(f->fTranslit->buffer)
|
||||
{
|
||||
uprv_free(f->fTranslit->buffer);
|
||||
}
|
||||
|
||||
uprv_free(f->fTranslit);
|
||||
f->fTranslit = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Input/output */
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fputs(const UChar *s,
|
||||
UFILE *f)
|
||||
{
|
||||
int32_t count = u_file_write(s, u_strlen(s), f);
|
||||
count += u_file_write(DELIMITERS, DELIMITERS_LEN, f);
|
||||
return count;
|
||||
}
|
||||
|
||||
U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fputc(UChar32 uc,
|
||||
UFILE *f)
|
||||
{
|
||||
UChar buf[2];
|
||||
int32_t idx = 0;
|
||||
UBool isError = FALSE;
|
||||
|
||||
U16_APPEND(buf, idx, UPRV_LENGTHOF(buf), uc, isError);
|
||||
if (isError) {
|
||||
return U_EOF;
|
||||
}
|
||||
return u_file_write(buf, idx, f) == idx ? uc : U_EOF;
|
||||
}
|
||||
|
||||
|
||||
U_CFUNC int32_t U_EXPORT2
|
||||
u_file_write_flush(const UChar *chars,
|
||||
int32_t count,
|
||||
UFILE *f,
|
||||
UBool flushIO,
|
||||
UBool flushTranslit)
|
||||
{
|
||||
/* Set up conversion parameters */
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
const UChar *mySource = chars;
|
||||
const UChar *mySourceBegin;
|
||||
const UChar *mySourceEnd;
|
||||
char charBuffer[UFILE_CHARBUFFER_SIZE];
|
||||
char *myTarget = charBuffer;
|
||||
int32_t written = 0;
|
||||
int32_t numConverted = 0;
|
||||
|
||||
if (count < 0) {
|
||||
count = u_strlen(chars);
|
||||
}
|
||||
|
||||
#if !UCONFIG_NO_TRANSLITERATION
|
||||
if((f->fTranslit) && (f->fTranslit->translit))
|
||||
{
|
||||
/* Do the transliteration */
|
||||
mySource = u_file_translit(f, chars, &count, flushTranslit);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Write to a string. */
|
||||
if (!f->fFile) {
|
||||
int32_t charsLeft = (int32_t)(f->str.fLimit - f->str.fPos);
|
||||
if (flushIO && charsLeft > count) {
|
||||
count++;
|
||||
}
|
||||
written = ufmt_min(count, charsLeft);
|
||||
u_strncpy(f->str.fPos, mySource, written);
|
||||
f->str.fPos += written;
|
||||
return written;
|
||||
}
|
||||
|
||||
mySourceEnd = mySource + count;
|
||||
|
||||
/* Perform the conversion in a loop */
|
||||
do {
|
||||
mySourceBegin = mySource; /* beginning location for this loop */
|
||||
status = U_ZERO_ERROR;
|
||||
if(f->fConverter != NULL) { /* We have a valid converter */
|
||||
ucnv_fromUnicode(f->fConverter,
|
||||
&myTarget,
|
||||
charBuffer + UFILE_CHARBUFFER_SIZE,
|
||||
&mySource,
|
||||
mySourceEnd,
|
||||
NULL,
|
||||
flushIO,
|
||||
&status);
|
||||
} else { /*weiv: do the invariant conversion */
|
||||
int32_t convertChars = (int32_t) (mySourceEnd - mySource);
|
||||
if (convertChars > UFILE_CHARBUFFER_SIZE) {
|
||||
convertChars = UFILE_CHARBUFFER_SIZE;
|
||||
status = U_BUFFER_OVERFLOW_ERROR;
|
||||
}
|
||||
u_UCharsToChars(mySource, myTarget, convertChars);
|
||||
mySource += convertChars;
|
||||
myTarget += convertChars;
|
||||
}
|
||||
numConverted = (int32_t)(myTarget - charBuffer);
|
||||
|
||||
if (numConverted > 0) {
|
||||
/* write the converted bytes */
|
||||
fwrite(charBuffer,
|
||||
sizeof(char),
|
||||
numConverted,
|
||||
f->fFile);
|
||||
|
||||
written += (int32_t) (mySource - mySourceBegin);
|
||||
}
|
||||
myTarget = charBuffer;
|
||||
}
|
||||
while(status == U_BUFFER_OVERFLOW_ERROR);
|
||||
|
||||
/* return # of chars written */
|
||||
return written;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_file_write( const UChar *chars,
|
||||
int32_t count,
|
||||
UFILE *f)
|
||||
{
|
||||
return u_file_write_flush(chars,count,f,FALSE,FALSE);
|
||||
}
|
||||
|
||||
|
||||
/* private function used for buffering input */
|
||||
void
|
||||
ufile_fill_uchar_buffer(UFILE *f)
|
||||
{
|
||||
UErrorCode status;
|
||||
const char *mySource;
|
||||
const char *mySourceEnd;
|
||||
UChar *myTarget;
|
||||
int32_t bufferSize;
|
||||
int32_t maxCPBytes;
|
||||
int32_t bytesRead;
|
||||
int32_t availLength;
|
||||
int32_t dataSize;
|
||||
char charBuffer[UFILE_CHARBUFFER_SIZE];
|
||||
u_localized_string *str;
|
||||
|
||||
if (f->fFile == NULL) {
|
||||
/* There is nothing to do. It's a string. */
|
||||
return;
|
||||
}
|
||||
|
||||
str = &f->str;
|
||||
dataSize = (int32_t)(str->fLimit - str->fPos);
|
||||
if (f->fFileno == 0 && dataSize > 0) {
|
||||
/* Don't read from stdin too many times. There is still some data. */
|
||||
return;
|
||||
}
|
||||
|
||||
/* shift the buffer if it isn't empty */
|
||||
if(dataSize != 0) {
|
||||
u_memmove(f->fUCBuffer, str->fPos, dataSize); /* not accessing beyond memory */
|
||||
}
|
||||
|
||||
|
||||
/* record how much buffer space is available */
|
||||
availLength = UFILE_UCHARBUFFER_SIZE - dataSize;
|
||||
|
||||
/* Determine the # of codepage bytes needed to fill our UChar buffer */
|
||||
/* weiv: if converter is NULL, we use invariant converter with charwidth = 1)*/
|
||||
maxCPBytes = availLength / (f->fConverter!=NULL?(2*ucnv_getMinCharSize(f->fConverter)):1);
|
||||
|
||||
/* Read in the data to convert */
|
||||
if (f->fFileno == 0) {
|
||||
/* Special case. Read from stdin one line at a time. */
|
||||
char *retStr = fgets(charBuffer, ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE), f->fFile);
|
||||
bytesRead = (int32_t)(retStr ? uprv_strlen(charBuffer) : 0);
|
||||
}
|
||||
else {
|
||||
/* A normal file */
|
||||
bytesRead = (int32_t)fread(charBuffer,
|
||||
sizeof(char),
|
||||
ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE),
|
||||
f->fFile);
|
||||
}
|
||||
|
||||
/* Set up conversion parameters */
|
||||
status = U_ZERO_ERROR;
|
||||
mySource = charBuffer;
|
||||
mySourceEnd = charBuffer + bytesRead;
|
||||
myTarget = f->fUCBuffer + dataSize;
|
||||
bufferSize = UFILE_UCHARBUFFER_SIZE;
|
||||
|
||||
if(f->fConverter != NULL) { /* We have a valid converter */
|
||||
/* Perform the conversion */
|
||||
ucnv_toUnicode(f->fConverter,
|
||||
&myTarget,
|
||||
f->fUCBuffer + bufferSize,
|
||||
&mySource,
|
||||
mySourceEnd,
|
||||
NULL,
|
||||
(UBool)(feof(f->fFile) != 0),
|
||||
&status);
|
||||
|
||||
} else { /*weiv: do the invariant conversion */
|
||||
u_charsToUChars(mySource, myTarget, bytesRead);
|
||||
myTarget += bytesRead;
|
||||
}
|
||||
|
||||
/* update the pointers into our array */
|
||||
str->fPos = str->fBuffer;
|
||||
str->fLimit = myTarget;
|
||||
}
|
||||
|
||||
U_CAPI UChar* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgets(UChar *s,
|
||||
int32_t n,
|
||||
UFILE *f)
|
||||
{
|
||||
int32_t dataSize;
|
||||
int32_t count;
|
||||
UChar *alias;
|
||||
const UChar *limit;
|
||||
UChar *sItr;
|
||||
UChar currDelim = 0;
|
||||
u_localized_string *str;
|
||||
|
||||
if (n <= 0) {
|
||||
/* Caller screwed up. We need to write the null terminatior. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* fill the buffer if needed */
|
||||
str = &f->str;
|
||||
if (str->fPos >= str->fLimit) {
|
||||
ufile_fill_uchar_buffer(f);
|
||||
}
|
||||
|
||||
/* subtract 1 from n to compensate for the terminator */
|
||||
--n;
|
||||
|
||||
/* determine the amount of data in the buffer */
|
||||
dataSize = (int32_t)(str->fLimit - str->fPos);
|
||||
|
||||
/* if 0 characters were left, return 0 */
|
||||
if (dataSize == 0)
|
||||
return NULL;
|
||||
|
||||
/* otherwise, iteratively fill the buffer and copy */
|
||||
count = 0;
|
||||
sItr = s;
|
||||
currDelim = 0;
|
||||
while (dataSize > 0 && count < n) {
|
||||
alias = str->fPos;
|
||||
|
||||
/* Find how much to copy */
|
||||
if (dataSize < (n - count)) {
|
||||
limit = str->fLimit;
|
||||
}
|
||||
else {
|
||||
limit = alias + (n - count);
|
||||
}
|
||||
|
||||
if (!currDelim) {
|
||||
/* Copy UChars until we find the first occurrence of a delimiter character */
|
||||
while (alias < limit && !IS_FIRST_STRING_DELIMITER(*alias)) {
|
||||
count++;
|
||||
*(sItr++) = *(alias++);
|
||||
}
|
||||
/* Preserve the newline */
|
||||
if (alias < limit && IS_FIRST_STRING_DELIMITER(*alias)) {
|
||||
if (CAN_HAVE_COMBINED_STRING_DELIMITER(*alias)) {
|
||||
currDelim = *alias;
|
||||
}
|
||||
else {
|
||||
currDelim = 1; /* This isn't a newline, but it's used to say
|
||||
that we should break later. We've checked all
|
||||
possible newline combinations even across buffer
|
||||
boundaries. */
|
||||
}
|
||||
count++;
|
||||
*(sItr++) = *(alias++);
|
||||
}
|
||||
}
|
||||
/* If we have a CRLF combination, preserve that too. */
|
||||
if (alias < limit) {
|
||||
if (currDelim && IS_COMBINED_STRING_DELIMITER(currDelim, *alias)) {
|
||||
count++;
|
||||
*(sItr++) = *(alias++);
|
||||
}
|
||||
currDelim = 1; /* This isn't a newline, but it's used to say
|
||||
that we should break later. We've checked all
|
||||
possible newline combinations even across buffer
|
||||
boundaries. */
|
||||
}
|
||||
|
||||
/* update the current buffer position */
|
||||
str->fPos = alias;
|
||||
|
||||
/* if we found a delimiter */
|
||||
if (currDelim == 1) {
|
||||
/* break out */
|
||||
break;
|
||||
}
|
||||
|
||||
/* refill the buffer */
|
||||
ufile_fill_uchar_buffer(f);
|
||||
|
||||
/* determine the amount of data in the buffer */
|
||||
dataSize = (int32_t)(str->fLimit - str->fPos);
|
||||
}
|
||||
|
||||
/* add the terminator and return s */
|
||||
*sItr = 0x0000;
|
||||
return s;
|
||||
}
|
||||
|
||||
U_CFUNC UBool U_EXPORT2
|
||||
ufile_getch(UFILE *f, UChar *ch)
|
||||
{
|
||||
UBool isValidChar = FALSE;
|
||||
|
||||
*ch = U_EOF;
|
||||
/* if we have an available character in the buffer, return it */
|
||||
if(f->str.fPos < f->str.fLimit){
|
||||
*ch = *(f->str.fPos)++;
|
||||
isValidChar = TRUE;
|
||||
}
|
||||
else {
|
||||
/* otherwise, fill the buffer and return the next character */
|
||||
if(f->str.fPos >= f->str.fLimit) {
|
||||
ufile_fill_uchar_buffer(f);
|
||||
}
|
||||
if(f->str.fPos < f->str.fLimit) {
|
||||
*ch = *(f->str.fPos)++;
|
||||
isValidChar = TRUE;
|
||||
}
|
||||
}
|
||||
return isValidChar;
|
||||
}
|
||||
|
||||
U_CAPI UChar U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgetc(UFILE *f)
|
||||
{
|
||||
UChar ch;
|
||||
ufile_getch(f, &ch);
|
||||
return ch;
|
||||
}
|
||||
|
||||
U_CFUNC UBool U_EXPORT2
|
||||
ufile_getch32(UFILE *f, UChar32 *c32)
|
||||
{
|
||||
UBool isValidChar = FALSE;
|
||||
u_localized_string *str;
|
||||
|
||||
*c32 = U_EOF;
|
||||
|
||||
/* Fill the buffer if it is empty */
|
||||
str = &f->str;
|
||||
if (f && str->fPos + 1 >= str->fLimit) {
|
||||
ufile_fill_uchar_buffer(f);
|
||||
}
|
||||
|
||||
/* Get the next character in the buffer */
|
||||
if (str->fPos < str->fLimit) {
|
||||
*c32 = *(str->fPos)++;
|
||||
if (U_IS_LEAD(*c32)) {
|
||||
if (str->fPos < str->fLimit) {
|
||||
UChar c16 = *(str->fPos)++;
|
||||
*c32 = U16_GET_SUPPLEMENTARY(*c32, c16);
|
||||
isValidChar = TRUE;
|
||||
}
|
||||
else {
|
||||
*c32 = U_EOF;
|
||||
}
|
||||
}
|
||||
else {
|
||||
isValidChar = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return isValidChar;
|
||||
}
|
||||
|
||||
U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fgetcx(UFILE *f)
|
||||
{
|
||||
UChar32 ch;
|
||||
ufile_getch32(f, &ch);
|
||||
return ch;
|
||||
}
|
||||
|
||||
U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_fungetc(UChar32 ch,
|
||||
UFILE *f)
|
||||
{
|
||||
u_localized_string *str;
|
||||
|
||||
str = &f->str;
|
||||
|
||||
/* if we're at the beginning of the buffer, sorry! */
|
||||
if (str->fPos == str->fBuffer
|
||||
|| (U_IS_LEAD(ch) && (str->fPos - 1) == str->fBuffer))
|
||||
{
|
||||
ch = U_EOF;
|
||||
}
|
||||
else {
|
||||
/* otherwise, put the character back */
|
||||
/* Remember, read them back on in the reverse order. */
|
||||
if (U_IS_LEAD(ch)) {
|
||||
if (*--(str->fPos) != U16_TRAIL(ch)
|
||||
|| *--(str->fPos) != U16_LEAD(ch))
|
||||
{
|
||||
ch = U_EOF;
|
||||
}
|
||||
}
|
||||
else if (*--(str->fPos) != ch) {
|
||||
ch = U_EOF;
|
||||
}
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
|
||||
u_file_read( UChar *chars,
|
||||
int32_t count,
|
||||
UFILE *f)
|
||||
{
|
||||
int32_t dataSize;
|
||||
int32_t read = 0;
|
||||
u_localized_string *str = &f->str;
|
||||
|
||||
do {
|
||||
|
||||
/* determine the amount of data in the buffer */
|
||||
dataSize = (int32_t)(str->fLimit - str->fPos);
|
||||
if (dataSize <= 0) {
|
||||
/* fill the buffer */
|
||||
ufile_fill_uchar_buffer(f);
|
||||
dataSize = (int32_t)(str->fLimit - str->fPos);
|
||||
}
|
||||
|
||||
/* Make sure that we don't read too much */
|
||||
if (dataSize > (count - read)) {
|
||||
dataSize = count - read;
|
||||
}
|
||||
|
||||
/* copy the current data in the buffer */
|
||||
memcpy(chars + read, str->fPos, dataSize * sizeof(UChar));
|
||||
|
||||
/* update number of items read */
|
||||
read += dataSize;
|
||||
|
||||
/* update the current buffer position */
|
||||
str->fPos += dataSize;
|
||||
}
|
||||
while (dataSize != 0 && read < count);
|
||||
|
||||
return read;
|
||||
}
|
||||
#endif
|
173
deps/icu-small/source/io/ustream.cpp
vendored
173
deps/icu-small/source/io/ustream.cpp
vendored
@ -1,173 +0,0 @@
|
||||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
/*
|
||||
**********************************************************************
|
||||
* Copyright (C) 2001-2016, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
**********************************************************************
|
||||
* FILE NAME : ustream.cpp
|
||||
*
|
||||
* Modification History:
|
||||
*
|
||||
* Date Name Description
|
||||
* 06/25/2001 grhoten Move iostream from unistr.h to here
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if !UCONFIG_NO_CONVERSION
|
||||
|
||||
#include "unicode/uobject.h"
|
||||
#include "unicode/ustream.h"
|
||||
#include "unicode/ucnv.h"
|
||||
#include "unicode/uchar.h"
|
||||
#include "unicode/utf16.h"
|
||||
#include "ustr_cnv.h"
|
||||
#include "cmemory.h"
|
||||
#include <string.h>
|
||||
|
||||
// console IO
|
||||
|
||||
#if U_IOSTREAM_SOURCE >= 199711
|
||||
|
||||
#define STD_NAMESPACE std::
|
||||
|
||||
#define STD_OSTREAM STD_NAMESPACE ostream
|
||||
#define STD_ISTREAM STD_NAMESPACE istream
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
U_IO_API STD_OSTREAM & U_EXPORT2
|
||||
operator<<(STD_OSTREAM& stream, const UnicodeString& str)
|
||||
{
|
||||
if(str.length() > 0) {
|
||||
char buffer[200];
|
||||
UConverter *converter;
|
||||
UErrorCode errorCode = U_ZERO_ERROR;
|
||||
|
||||
// use the default converter to convert chunks of text
|
||||
converter = u_getDefaultConverter(&errorCode);
|
||||
if(U_SUCCESS(errorCode)) {
|
||||
const UChar *us = str.getBuffer();
|
||||
const UChar *uLimit = us + str.length();
|
||||
char *s, *sLimit = buffer + (sizeof(buffer) - 1);
|
||||
do {
|
||||
errorCode = U_ZERO_ERROR;
|
||||
s = buffer;
|
||||
ucnv_fromUnicode(converter, &s, sLimit, &us, uLimit, 0, FALSE, &errorCode);
|
||||
*s = 0;
|
||||
|
||||
// write this chunk
|
||||
if(s > buffer) {
|
||||
stream << buffer;
|
||||
}
|
||||
} while(errorCode == U_BUFFER_OVERFLOW_ERROR);
|
||||
u_releaseDefaultConverter(converter);
|
||||
}
|
||||
}
|
||||
|
||||
/* stream.flush();*/
|
||||
return stream;
|
||||
}
|
||||
|
||||
U_IO_API STD_ISTREAM & U_EXPORT2
|
||||
operator>>(STD_ISTREAM& stream, UnicodeString& str)
|
||||
{
|
||||
// This is like ICU status checking.
|
||||
if (stream.fail()) {
|
||||
return stream;
|
||||
}
|
||||
|
||||
/* ipfx should eat whitespace when ios::skipws is set */
|
||||
UChar uBuffer[16];
|
||||
char buffer[16];
|
||||
int32_t idx = 0;
|
||||
UConverter *converter;
|
||||
UErrorCode errorCode = U_ZERO_ERROR;
|
||||
|
||||
// use the default converter to convert chunks of text
|
||||
converter = u_getDefaultConverter(&errorCode);
|
||||
if(U_SUCCESS(errorCode)) {
|
||||
UChar *us = uBuffer;
|
||||
const UChar *uLimit = uBuffer + UPRV_LENGTHOF(uBuffer);
|
||||
const char *s, *sLimit;
|
||||
char ch;
|
||||
UChar ch32;
|
||||
UBool initialWhitespace = TRUE;
|
||||
UBool continueReading = TRUE;
|
||||
|
||||
/* We need to consume one byte at a time to see what is considered whitespace. */
|
||||
while (continueReading) {
|
||||
ch = stream.get();
|
||||
if (stream.eof()) {
|
||||
// The EOF is only set after the get() of an unavailable byte.
|
||||
if (!initialWhitespace) {
|
||||
stream.clear(stream.eofbit);
|
||||
}
|
||||
continueReading = FALSE;
|
||||
}
|
||||
sLimit = &ch + (int)continueReading;
|
||||
us = uBuffer;
|
||||
s = &ch;
|
||||
errorCode = U_ZERO_ERROR;
|
||||
/*
|
||||
Since we aren't guaranteed to see the state before this call,
|
||||
this code won't work on stateful encodings like ISO-2022 or an EBCDIC stateful encoding.
|
||||
We flush on the last byte to ensure that we output truncated multibyte characters.
|
||||
*/
|
||||
ucnv_toUnicode(converter, &us, uLimit, &s, sLimit, 0, !continueReading, &errorCode);
|
||||
if(U_FAILURE(errorCode)) {
|
||||
/* Something really bad happened. setstate() isn't always an available API */
|
||||
stream.clear(stream.failbit);
|
||||
goto STOP_READING;
|
||||
}
|
||||
/* Was the character consumed? */
|
||||
if (us != uBuffer) {
|
||||
/* Reminder: ibm-1390 & JISX0213 can output 2 Unicode code points */
|
||||
int32_t uBuffSize = us-uBuffer;
|
||||
int32_t uBuffIdx = 0;
|
||||
while (uBuffIdx < uBuffSize) {
|
||||
U16_NEXT(uBuffer, uBuffIdx, uBuffSize, ch32);
|
||||
if (u_isWhitespace(ch32)) {
|
||||
if (!initialWhitespace) {
|
||||
buffer[idx++] = ch;
|
||||
while (idx > 0) {
|
||||
stream.putback(buffer[--idx]);
|
||||
}
|
||||
goto STOP_READING;
|
||||
}
|
||||
/* else skip intialWhitespace */
|
||||
}
|
||||
else {
|
||||
if (initialWhitespace) {
|
||||
/*
|
||||
When initialWhitespace is TRUE, we haven't appended any
|
||||
character yet. This is where we truncate the string,
|
||||
to avoid modifying the string before we know if we can
|
||||
actually read from the stream.
|
||||
*/
|
||||
str.truncate(0);
|
||||
initialWhitespace = FALSE;
|
||||
}
|
||||
str.append(ch32);
|
||||
}
|
||||
}
|
||||
idx = 0;
|
||||
}
|
||||
else {
|
||||
buffer[idx++] = ch;
|
||||
}
|
||||
}
|
||||
STOP_READING:
|
||||
u_releaseDefaultConverter(converter);
|
||||
}
|
||||
|
||||
/* stream.flush();*/
|
||||
return stream;
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
#endif
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user