ICU-2256 Stop exporting some functions by making them static

X-SVN-Rev: 12623
This commit is contained in:
George Rhoten 2003-07-12 07:21:51 +00:00
parent 70cf40862e
commit d26b1f2aa6
4 changed files with 1638 additions and 2135 deletions

File diff suppressed because it is too large Load diff

View file

@ -21,161 +21,22 @@
#include "unicode/uchar.h"
#include "sscanf.h"
#include "sscanf_p.h"
#include "uscanset.h"
#include "unicode/ustdio.h"
#include "unicode/ustring.h"
#include "locbund.h"
#include "loccache.h"
#include "unicode/unum.h"
#include "unicode/udat.h"
#include "unicode/uloc.h"
#include "sscanf.h"
#include "sscanf_p.h"
#include "uscanset.h"
#include "locbund.h"
#include "loccache.h"
#include "cmemory.h"
#include "ustr_imp.h"
/* --- Prototypes ---------------------------- */
#define UP_PERCENT 0x0025
int32_t
u_sscanf_simple_percent_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_ustring_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_count_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_integer_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_uinteger_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_double_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_scientific_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_scidbl_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_currency_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_percent_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_date_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_time_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_char_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_uchar_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_spellout_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_hex_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_octal_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_pointer_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_string_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_sscanf_scanset_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
/* ANSI style formatting */
/* Use US-ASCII characters only for formatting */
@ -228,124 +89,16 @@ u_sscanf_scanset_handler(u_localized_string *input,
#define UFMT_EMPTY {ufmt_empty, NULL}
struct u_sscanf_info {
typedef struct u_sscanf_info {
enum ufmt_type_info info;
u_sscanf_handler handler;
};
typedef struct u_sscanf_info u_sscanf_info;
/* Use US-ASCII characters only for formatting. Most codepages have
characters 20-7F from Unicode. Using any other codepage specific
characters will make it very difficult to format the string on
non-Unicode machines */
static const u_sscanf_info g_u_sscanf_infos[108] = {
/* 0x20 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x30 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x40 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR,
UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x50 */
UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x60 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR,
UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL,
/* 0x70 */
UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING,
UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
};
} u_sscanf_info;
#define USCANF_NUM_FMT_HANDLERS sizeof(g_u_sscanf_infos)
/* We do not use handlers for 0-0x1f */
#define USCANF_BASE_FMT_HANDLERS 0x20
int32_t
u_sscanf(const UChar *buffer,
const char *locale,
const char *patternSpecification,
... )
{
va_list ap;
int32_t converted;
va_start(ap, patternSpecification);
converted = u_vsscanf(buffer, locale, patternSpecification, ap);
va_end(ap);
return converted;
}
int32_t
u_sscanf_u(const UChar *buffer,
const char *locale,
const UChar *patternSpecification,
... )
{
va_list ap;
int32_t converted;
va_start(ap, patternSpecification);
converted = u_vsscanf_u(buffer, locale, 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 *locale,
const char *patternSpecification,
va_list ap)
{
int32_t converted;
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 >= 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, locale, pattern, ap);
/* clean up */
if (pattern != patBuffer) {
uprv_free(pattern);
}
return converted;
}
static int32_t
u_sscanf_skip_leading_ws(u_localized_string *input,
@ -367,7 +120,7 @@ u_sscanf_skip_leading_ws(u_localized_string *input,
return skipped;
}
int32_t
static int32_t
u_sscanf_simple_percent_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -382,7 +135,7 @@ u_sscanf_simple_percent_handler(u_localized_string *input,
return 0;
}
int32_t
static int32_t
u_sscanf_string_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -448,7 +201,7 @@ u_sscanf_string_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_ustring_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -489,7 +242,7 @@ u_sscanf_ustring_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_count_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -506,74 +259,7 @@ u_sscanf_count_handler(u_localized_string *input,
return 0;
}
int32_t
u_sscanf_integer_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
int32_t len;
long *num = (long*) (args[0].ptrValue);
UNumberFormat *format;
int32_t parsePos = 0;
UErrorCode status = U_ZERO_ERROR;
/* skip all ws in the stream */
u_sscanf_skip_leading_ws(input, info->fPadChar);
/* determine the size of the stream's buffer */
len = input->len - input->pos;
/* truncate to the width, if specified */
if(info->fWidth != -1)
len = ufmt_min(len, info->fWidth);
/* get the formatter */
format = u_locbund_getNumberFormat(input->fBundle);
/* handle error */
if(format == 0)
return 0;
/* parse the number */
*num = unum_parse(format, &(input->str[input->pos]), len, &parsePos, &status);
/* mask off any necessary bits */
if(info->fIsShort)
*num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
*num &= UINT32_MAX;
/* update the stream's position to reflect consumed data */
input->pos += parsePos;
/* we converted 1 arg */
return 1;
}
int32_t
u_sscanf_uinteger_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
ufmt_args uint_args;
int32_t converted_args;
uint32_t *num = (uint32_t*) (args[0].ptrValue);
double currDouble;
uint_args.ptrValue = &currDouble;
converted_args = u_sscanf_double_handler(input, info, &uint_args, fmt, consumed);
*num = (uint32_t)currDouble;
return converted_args;
}
int32_t
static int32_t
u_sscanf_double_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -618,7 +304,7 @@ u_sscanf_double_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_scientific_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -663,7 +349,7 @@ u_sscanf_scientific_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_scidbl_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -734,7 +420,74 @@ u_sscanf_scidbl_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_integer_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
int32_t len;
long *num = (long*) (args[0].ptrValue);
UNumberFormat *format;
int32_t parsePos = 0;
UErrorCode status = U_ZERO_ERROR;
/* skip all ws in the stream */
u_sscanf_skip_leading_ws(input, info->fPadChar);
/* determine the size of the stream's buffer */
len = input->len - input->pos;
/* truncate to the width, if specified */
if(info->fWidth != -1)
len = ufmt_min(len, info->fWidth);
/* get the formatter */
format = u_locbund_getNumberFormat(input->fBundle);
/* handle error */
if(format == 0)
return 0;
/* parse the number */
*num = unum_parse(format, &(input->str[input->pos]), len, &parsePos, &status);
/* mask off any necessary bits */
if(info->fIsShort)
*num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
*num &= UINT32_MAX;
/* update the stream's position to reflect consumed data */
input->pos += parsePos;
/* we converted 1 arg */
return 1;
}
static int32_t
u_sscanf_uinteger_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
ufmt_args uint_args;
int32_t converted_args;
uint32_t *num = (uint32_t*) (args[0].ptrValue);
double currDouble;
uint_args.ptrValue = &currDouble;
converted_args = u_sscanf_double_handler(input, info, &uint_args, fmt, consumed);
*num = (uint32_t)currDouble;
return converted_args;
}
static int32_t
u_sscanf_currency_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -779,7 +532,7 @@ u_sscanf_currency_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_percent_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -824,7 +577,7 @@ u_sscanf_percent_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_date_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -865,7 +618,7 @@ u_sscanf_date_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_time_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -906,7 +659,7 @@ u_sscanf_time_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_char_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -939,7 +692,7 @@ u_sscanf_char_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_uchar_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -963,7 +716,7 @@ u_sscanf_uchar_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_spellout_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -1008,7 +761,7 @@ u_sscanf_spellout_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_hex_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -1054,7 +807,7 @@ u_sscanf_hex_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_octal_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -1091,7 +844,7 @@ u_sscanf_octal_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_pointer_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -1122,7 +875,7 @@ u_sscanf_pointer_handler(u_localized_string *input,
return 1;
}
int32_t
static int32_t
u_sscanf_scanset_handler(u_localized_string *input,
const u_sscanf_spec_info *info,
ufmt_args *args,
@ -1186,7 +939,113 @@ u_sscanf_scanset_handler(u_localized_string *input,
}
#define UP_PERCENT 0x0025
U_CAPI int32_t U_EXPORT2
u_sscanf(const UChar *buffer,
const char *locale,
const char *patternSpecification,
... )
{
va_list ap;
int32_t converted;
va_start(ap, patternSpecification);
converted = u_vsscanf(buffer, locale, patternSpecification, ap);
va_end(ap);
return converted;
}
U_CAPI int32_t U_EXPORT2
u_sscanf_u(const UChar *buffer,
const char *locale,
const UChar *patternSpecification,
... )
{
va_list ap;
int32_t converted;
va_start(ap, patternSpecification);
converted = u_vsscanf_u(buffer, locale, 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 *locale,
const char *patternSpecification,
va_list ap)
{
int32_t converted;
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 >= 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, locale, pattern, ap);
/* clean up */
if (pattern != patBuffer) {
uprv_free(pattern);
}
return converted;
}
/* Use US-ASCII characters only for formatting. Most codepages have
characters 20-7F from Unicode. Using any other codepage specific
characters will make it very difficult to format the string on
non-Unicode machines */
static const u_sscanf_info g_u_sscanf_infos[108] = {
/* 0x20 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x30 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x40 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR,
UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x50 */
UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x60 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR,
UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL,
/* 0x70 */
UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING,
UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
};
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
u_vsscanf_u(const UChar *buffer,

View file

@ -21,114 +21,19 @@
#if !UCONFIG_NO_FORMATTING
#include "uprintf.h"
#include "uprntf_p.h"
#include "unicode/ustdio.h"
#include "ufile.h"
#include "unicode/ustring.h"
#include "locbund.h"
#include "unicode/unum.h"
#include "unicode/udat.h"
#include "uprintf.h"
#include "uprntf_p.h"
#include "ufile.h"
#include "locbund.h"
#include "cmemory.h"
/* --- Prototypes ---------------------------- */
int32_t
u_printf_simple_percent_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_string_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_date_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_scientific_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_scidbl_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_uchar_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_currency_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_ustring_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_percent_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_time_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_spellout_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_hex_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_char_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_integer_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_uinteger_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_double_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_count_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_octal_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
int32_t
u_printf_pointer_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args);
#define UP_PERCENT 0x0025
/* ANSI style formatting */
/* Use US-ASCII characters only for formatting */
@ -179,53 +84,10 @@ u_printf_pointer_handler(UFILE *stream,
#define UFMT_EMPTY {ufmt_empty, NULL}
struct u_printf_info {
typedef struct u_printf_info {
ufmt_type_info info;
u_printf_handler handler;
};
typedef struct u_printf_info u_printf_info;
/* Use US-ASCII characters only for formatting. Most codepages have
characters 20-7F from Unicode. Using any other codepage specific
characters will make it very difficult to format the string on
non-Unicode machines */
static const u_printf_info g_u_printf_infos[108] = {
/* 0x20 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x30 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x40 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR,
UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x50 */
UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x60 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR,
UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL,
/* 0x70 */
UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING,
UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
};
} u_printf_info;
#define UPRINTF_NUM_FMT_HANDLERS sizeof(g_u_printf_infos)
@ -239,69 +101,6 @@ static const u_printf_info g_u_printf_infos[108] = {
static const UChar gNullStr[] = {0x28, 0x6E, 0x75, 0x6C, 0x6C, 0x29, 0}; /* "(null)" */
static const UChar gSpaceStr[] = {0x20, 0}; /* " " */
int32_t
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;
}
int32_t
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_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];
int32_t size = (int32_t)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 int32_t
u_printf_pad_and_justify(UFILE *stream,
const u_printf_spec_info *info,
@ -367,8 +166,7 @@ u_printf_set_sign(UNumberFormat *format,
}
/* handle a '%' */
int32_t
static int32_t
u_printf_simple_percent_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -381,7 +179,7 @@ u_printf_simple_percent_handler(UFILE *stream,
/* handle 's' */
int32_t
static int32_t
u_printf_string_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -434,156 +232,40 @@ u_printf_string_handler(UFILE *stream,
return written;
}
/* HSYS */
int32_t
u_printf_integer_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
static int32_t
u_printf_char_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
long num = (long) (args[0].intValue);
UNumberFormat *format;
UChar result [UFPRINTF_BUFFER_SIZE];
int32_t minDigits = -1;
UErrorCode status = U_ZERO_ERROR;
UChar s[UTF_MAX_CHAR_LENGTH+1];
int32_t len = 1, written;
unsigned char arg = (unsigned char)(args[0].intValue);
/* mask off any necessary bits */
if(info->fIsShort)
num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
num &= UINT32_MAX;
/* convert from default codepage to Unicode */
ufmt_defaultCPToUnicode((const char *)&arg, 2, s, sizeof(s)/sizeof(UChar));
/* get the formatter */
format = u_locbund_getNumberFormat(stream->fBundle);
/* handle error */
if(format == 0)
return 0;
/* set the appropriate flags on the formatter */
/* set the minimum integer digits */
if(info->fPrecision != -1) {
/* clone the stream's bundle if it isn't owned */
if(! stream->fOwnBundle) {
stream->fBundle = u_locbund_clone(stream->fBundle);
stream->fOwnBundle = TRUE;
format = u_locbund_getNumberFormat(stream->fBundle);
}
/* set the minimum # of digits */
minDigits = unum_getAttribute(format, UNUM_MIN_INTEGER_DIGITS);
unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, info->fPrecision);
/* Remember that this may be a surrogate pair */
if (arg != 0) {
len = u_strlen(s);
}
/* set whether to show the sign */
if(info->fShowSign) {
/* clone the stream's bundle if it isn't owned */
if(! stream->fOwnBundle) {
stream->fBundle = u_locbund_clone(stream->fBundle);
stream->fOwnBundle = TRUE;
format = u_locbund_getNumberFormat(stream->fBundle);
}
/* width = minimum # of characters to write */
/* precision = maximum # of characters to write */
u_printf_set_sign(format, info, &status);
/* precision takes precedence over width */
/* determine if the string should be truncated */
if(info->fPrecision != -1 && len > info->fPrecision) {
written = u_file_write(s, info->fPrecision, stream);
}
else {
/* determine if the string should be padded */
written = u_printf_pad_and_justify(stream, info, s, len);
}
/* format the number */
unum_format(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status);
/* restore the number format */
if(minDigits != -1)
unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, minDigits);
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
return written;
}
int32_t
u_printf_hex_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
long num = (long) (args[0].intValue);
UChar result[UFPRINTF_BUFFER_SIZE];
int32_t len = UFPRINTF_BUFFER_SIZE;
/* mask off any necessary bits */
if(info->fIsShort)
num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
num &= UINT32_MAX;
/* format the number, preserving the minimum # of digits */
ufmt_ltou(result, &len, num, 16,
(UBool)(info->fSpec == 0x0078),
(info->fPrecision == -1 && info->fZero) ? info->fWidth : info->fPrecision);
/* convert to alt form, if desired */
if(num != 0 && info->fAlt && len < UFPRINTF_BUFFER_SIZE - 2) {
/* shift the formatted string right by 2 chars */
memmove(result + 2, result, len * sizeof(UChar));
result[0] = 0x0030;
result[1] = info->fSpec;
len += 2;
}
return u_printf_pad_and_justify(stream, info, result, len);
}
int32_t
u_printf_octal_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
long num = (long) (args[0].intValue);
UChar result[UFPRINTF_BUFFER_SIZE];
int32_t len = UFPRINTF_BUFFER_SIZE;
/* mask off any necessary bits */
if(info->fIsShort)
num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
num &= UINT32_MAX;
/* format the number, preserving the minimum # of digits */
ufmt_ltou(result, &len, num, 8,
FALSE, /* doesn't matter for octal */
info->fPrecision == -1 && info->fZero ? info->fWidth : info->fPrecision);
/* convert to alt form, if desired */
if(info->fAlt && result[0] != 0x0030 && len < UFPRINTF_BUFFER_SIZE - 1) {
/* shift the formatted string right by 1 char */
memmove(result + 1, result, len * sizeof(UChar));
result[0] = 0x0030;
len += 1;
}
return u_printf_pad_and_justify(stream, info, result, len);
}
int32_t
u_printf_uinteger_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
u_printf_spec_info uint_info;
ufmt_args uint_args;
memcpy(&uint_info, info, sizeof(u_printf_spec_info));
memcpy(&uint_args, args, sizeof(ufmt_args));
uint_info.fPrecision = 0;
uint_info.fAlt = FALSE;
/* Get around int32_t limitations */
uint_args.doubleValue = ((double) ((uint32_t) (uint_args.intValue)));
return u_printf_double_handler(stream, &uint_info, &uint_args);
}
int32_t
static int32_t
u_printf_double_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -652,42 +334,155 @@ u_printf_double_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
int32_t
u_printf_char_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
/* HSYS */
static int32_t
u_printf_integer_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
UChar s[UTF_MAX_CHAR_LENGTH+1];
int32_t len = 1, written;
unsigned char arg = (unsigned char)(args[0].intValue);
long num = (long) (args[0].intValue);
UNumberFormat *format;
UChar result [UFPRINTF_BUFFER_SIZE];
int32_t minDigits = -1;
UErrorCode status = U_ZERO_ERROR;
/* convert from default codepage to Unicode */
ufmt_defaultCPToUnicode((const char *)&arg, 2, s, sizeof(s)/sizeof(UChar));
/* mask off any necessary bits */
if(info->fIsShort)
num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
num &= UINT32_MAX;
/* Remember that this may be a surrogate pair */
if (arg != 0) {
len = u_strlen(s);
/* get the formatter */
format = u_locbund_getNumberFormat(stream->fBundle);
/* handle error */
if(format == 0)
return 0;
/* set the appropriate flags on the formatter */
/* set the minimum integer digits */
if(info->fPrecision != -1) {
/* clone the stream's bundle if it isn't owned */
if(! stream->fOwnBundle) {
stream->fBundle = u_locbund_clone(stream->fBundle);
stream->fOwnBundle = TRUE;
format = u_locbund_getNumberFormat(stream->fBundle);
}
/* set the minimum # of digits */
minDigits = unum_getAttribute(format, UNUM_MIN_INTEGER_DIGITS);
unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, info->fPrecision);
}
/* width = minimum # of characters to write */
/* precision = maximum # of characters to write */
/* set whether to show the sign */
if(info->fShowSign) {
/* clone the stream's bundle if it isn't owned */
if(! stream->fOwnBundle) {
stream->fBundle = u_locbund_clone(stream->fBundle);
stream->fOwnBundle = TRUE;
format = u_locbund_getNumberFormat(stream->fBundle);
}
/* precision takes precedence over width */
/* determine if the string should be truncated */
if(info->fPrecision != -1 && len > info->fPrecision) {
written = u_file_write(s, info->fPrecision, stream);
}
else {
/* determine if the string should be padded */
written = u_printf_pad_and_justify(stream, info, s, len);
u_printf_set_sign(format, info, &status);
}
return written;
/* format the number */
unum_format(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status);
/* restore the number format */
if(minDigits != -1)
unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, minDigits);
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
static int32_t
u_printf_hex_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
long num = (long) (args[0].intValue);
UChar result[UFPRINTF_BUFFER_SIZE];
int32_t len = UFPRINTF_BUFFER_SIZE;
int32_t
/* mask off any necessary bits */
if(info->fIsShort)
num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
num &= UINT32_MAX;
/* format the number, preserving the minimum # of digits */
ufmt_ltou(result, &len, num, 16,
(UBool)(info->fSpec == 0x0078),
(info->fPrecision == -1 && info->fZero) ? info->fWidth : info->fPrecision);
/* convert to alt form, if desired */
if(num != 0 && info->fAlt && len < UFPRINTF_BUFFER_SIZE - 2) {
/* shift the formatted string right by 2 chars */
memmove(result + 2, result, len * sizeof(UChar));
result[0] = 0x0030;
result[1] = info->fSpec;
len += 2;
}
return u_printf_pad_and_justify(stream, info, result, len);
}
static int32_t
u_printf_octal_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
long num = (long) (args[0].intValue);
UChar result[UFPRINTF_BUFFER_SIZE];
int32_t len = UFPRINTF_BUFFER_SIZE;
/* mask off any necessary bits */
if(info->fIsShort)
num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
num &= UINT32_MAX;
/* format the number, preserving the minimum # of digits */
ufmt_ltou(result, &len, num, 8,
FALSE, /* doesn't matter for octal */
info->fPrecision == -1 && info->fZero ? info->fWidth : info->fPrecision);
/* convert to alt form, if desired */
if(info->fAlt && result[0] != 0x0030 && len < UFPRINTF_BUFFER_SIZE - 1) {
/* shift the formatted string right by 1 char */
memmove(result + 1, result, len * sizeof(UChar));
result[0] = 0x0030;
len += 1;
}
return u_printf_pad_and_justify(stream, info, result, len);
}
static int32_t
u_printf_uinteger_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
{
u_printf_spec_info uint_info;
ufmt_args uint_args;
memcpy(&uint_info, info, sizeof(u_printf_spec_info));
memcpy(&uint_args, args, sizeof(ufmt_args));
uint_info.fPrecision = 0;
uint_info.fAlt = FALSE;
/* Get around int32_t limitations */
uint_args.doubleValue = ((double) ((uint32_t) (uint_args.intValue)));
return u_printf_double_handler(stream, &uint_info, &uint_args);
}
static int32_t
u_printf_pointer_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -703,8 +498,7 @@ u_printf_pointer_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, len);
}
int32_t
static int32_t
u_printf_scientific_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -811,7 +605,7 @@ u_printf_scientific_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
int32_t
static int32_t
u_printf_date_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -835,7 +629,7 @@ u_printf_date_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
int32_t
static int32_t
u_printf_time_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -859,8 +653,7 @@ u_printf_time_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
int32_t
static int32_t
u_printf_percent_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -930,8 +723,7 @@ u_printf_percent_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
int32_t
static int32_t
u_printf_currency_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -1001,7 +793,7 @@ u_printf_currency_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
int32_t
static int32_t
u_printf_ustring_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -1031,9 +823,7 @@ u_printf_ustring_handler(UFILE *stream,
return written;
}
int32_t
static int32_t
u_printf_uchar_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -1059,7 +849,7 @@ u_printf_uchar_handler(UFILE *stream,
return written;
}
int32_t
static int32_t
u_printf_scidbl_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -1094,8 +884,7 @@ u_printf_scidbl_handler(UFILE *stream,
}
}
int32_t
static int32_t
u_printf_count_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -1109,8 +898,7 @@ u_printf_count_handler(UFILE *stream,
return 0;
}
int32_t
static int32_t
u_printf_spellout_handler(UFILE *stream,
const u_printf_spec_info *info,
const ufmt_args *args)
@ -1180,7 +968,110 @@ u_printf_spellout_handler(UFILE *stream,
return u_printf_pad_and_justify(stream, info, result, u_strlen(result));
}
#define UP_PERCENT 0x0025
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_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_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];
int32_t size = (int32_t)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;
}
/* Use US-ASCII characters only for formatting. Most codepages have
characters 20-7F from Unicode. Using any other codepage specific
characters will make it very difficult to format the string on
non-Unicode machines */
static const u_printf_info g_u_printf_infos[108] = {
/* 0x20 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x30 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x40 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR,
UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x50 */
UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x60 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR,
UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL,
/* 0x70 */
UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING,
UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
};
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
u_vfprintf_u( UFILE *f,

View file

@ -22,160 +22,21 @@
#include "unicode/uchar.h"
#include "unicode/ustdio.h"
#include "unicode/ustring.h"
#include "unicode/unum.h"
#include "unicode/udat.h"
#include "uscanf.h"
#include "uscanf_p.h"
#include "uscanset.h"
#include "unicode/ustdio.h"
#include "ufile.h"
#include "unicode/ustring.h"
#include "locbund.h"
#include "unicode/unum.h"
#include "unicode/udat.h"
#include "cmemory.h"
#include "ustr_imp.h"
/* --- Prototypes ---------------------------- */
#define UP_PERCENT 0x0025
int32_t
u_scanf_simple_percent_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_ustring_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_count_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_integer_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_uinteger_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_double_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_scientific_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_scidbl_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_currency_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_percent_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_date_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_time_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_char_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_uchar_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_spellout_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_hex_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_octal_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_pointer_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_string_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
int32_t
u_scanf_scanset_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed);
/* ANSI style formatting */
/* Use US-ASCII characters only for formatting */
@ -228,121 +89,16 @@ u_scanf_scanset_handler(UFILE *stream,
#define UFMT_EMPTY {ufmt_empty, NULL}
struct u_scanf_info {
typedef struct u_scanf_info {
ufmt_type_info info;
u_scanf_handler handler;
};
typedef struct u_scanf_info u_scanf_info;
/* Use US-ASCII characters only for formatting. Most codepages have
characters 20-7F from Unicode. Using any other codepage specific
characters will make it very difficult to format the string on
non-Unicode machines */
static const u_scanf_info g_u_scanf_infos[108] = {
/* 0x20 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x30 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x40 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR,
UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x50 */
UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x60 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR,
UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL,
/* 0x70 */
UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING,
UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
};
} u_scanf_info;
#define USCANF_NUM_FMT_HANDLERS sizeof(g_u_scanf_infos)
/* We do not use handlers for 0-0x1f */
#define USCANF_BASE_FMT_HANDLERS 0x20
int32_t
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;
}
int32_t
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 buffer[UFMT_DEFAULT_BUFFER_SIZE];
int32_t size = (int32_t)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 */
converted = u_vfscanf_u(f, pattern, ap);
/* clean up */
if (pattern != buffer) {
uprv_free(pattern);
}
return converted;
}
static int32_t
u_scanf_skip_leading_ws(UFILE *stream,
@ -362,7 +118,7 @@ u_scanf_skip_leading_ws(UFILE *stream,
return count;
}
int32_t
static int32_t
u_scanf_simple_percent_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -376,7 +132,7 @@ u_scanf_simple_percent_handler(UFILE *stream,
return 0;
}
int32_t
static int32_t
u_scanf_string_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -442,7 +198,7 @@ u_scanf_string_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_ustring_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -482,7 +238,7 @@ u_scanf_ustring_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_count_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -499,77 +255,7 @@ u_scanf_count_handler(UFILE *stream,
return 0;
}
int32_t
u_scanf_integer_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
int32_t len;
long *num = (long*) (args[0].ptrValue);
UNumberFormat *format;
int32_t parsePos = 0;
UErrorCode status = U_ZERO_ERROR;
/* skip all ws in the stream */
u_scanf_skip_leading_ws(stream, info->fPadChar);
/* fill the stream's internal buffer */
ufile_fill_uchar_buffer(stream);
/* determine the size of the stream's buffer */
len = stream->fUCLimit - stream->fUCPos;
/* truncate to the width, if specified */
if(info->fWidth != -1)
len = ufmt_min(len, info->fWidth);
/* get the formatter */
format = u_locbund_getNumberFormat(stream->fBundle);
/* handle error */
if(format == 0)
return 0;
/* parse the number */
*num = unum_parse(format, stream->fUCPos, len, &parsePos, &status);
/* mask off any necessary bits */
if(info->fIsShort)
*num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
*num &= UINT32_MAX;
/* update the stream's position to reflect consumed data */
stream->fUCPos += parsePos;
/* we converted 1 arg */
return 1;
}
int32_t
u_scanf_uinteger_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
ufmt_args uint_args;
int32_t converted_args;
uint32_t *num = (uint32_t*) (args[0].ptrValue);
double currDouble;
uint_args.ptrValue = &currDouble;
converted_args = u_scanf_double_handler(stream, info, &uint_args, fmt, consumed);
*num = (uint32_t)currDouble;
return converted_args;
}
int32_t
static int32_t
u_scanf_double_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -617,7 +303,7 @@ u_scanf_double_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_scientific_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -665,7 +351,7 @@ u_scanf_scientific_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_scidbl_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -735,7 +421,77 @@ u_scanf_scidbl_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_integer_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
int32_t len;
long *num = (long*) (args[0].ptrValue);
UNumberFormat *format;
int32_t parsePos = 0;
UErrorCode status = U_ZERO_ERROR;
/* skip all ws in the stream */
u_scanf_skip_leading_ws(stream, info->fPadChar);
/* fill the stream's internal buffer */
ufile_fill_uchar_buffer(stream);
/* determine the size of the stream's buffer */
len = stream->fUCLimit - stream->fUCPos;
/* truncate to the width, if specified */
if(info->fWidth != -1)
len = ufmt_min(len, info->fWidth);
/* get the formatter */
format = u_locbund_getNumberFormat(stream->fBundle);
/* handle error */
if(format == 0)
return 0;
/* parse the number */
*num = unum_parse(format, stream->fUCPos, len, &parsePos, &status);
/* mask off any necessary bits */
if(info->fIsShort)
*num &= UINT16_MAX;
else if(! info->fIsLong || ! info->fIsLongLong)
*num &= UINT32_MAX;
/* update the stream's position to reflect consumed data */
stream->fUCPos += parsePos;
/* we converted 1 arg */
return 1;
}
static int32_t
u_scanf_uinteger_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
const UChar *fmt,
int32_t *consumed)
{
ufmt_args uint_args;
int32_t converted_args;
uint32_t *num = (uint32_t*) (args[0].ptrValue);
double currDouble;
uint_args.ptrValue = &currDouble;
converted_args = u_scanf_double_handler(stream, info, &uint_args, fmt, consumed);
*num = (uint32_t)currDouble;
return converted_args;
}
static int32_t
u_scanf_currency_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -783,7 +539,7 @@ u_scanf_currency_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_percent_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -831,7 +587,7 @@ u_scanf_percent_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_date_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -875,7 +631,7 @@ u_scanf_date_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_time_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -919,7 +675,7 @@ u_scanf_time_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_char_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -952,7 +708,7 @@ u_scanf_char_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_uchar_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -976,7 +732,7 @@ u_scanf_uchar_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_spellout_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -1024,7 +780,7 @@ u_scanf_spellout_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_hex_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -1073,7 +829,7 @@ u_scanf_hex_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_octal_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -1113,7 +869,7 @@ u_scanf_octal_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_pointer_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -1147,7 +903,7 @@ u_scanf_pointer_handler(UFILE *stream,
return 1;
}
int32_t
static int32_t
u_scanf_scanset_handler(UFILE *stream,
const u_scanf_spec_info *info,
ufmt_args *args,
@ -1213,8 +969,110 @@ u_scanf_scanset_handler(UFILE *stream,
return 1;
}
int32_t
u_fscanf(UFILE *f,
const char *patternSpecification,
... )
{
va_list ap;
int32_t converted;
#define UP_PERCENT 0x0025
va_start(ap, patternSpecification);
converted = u_vfscanf(f, patternSpecification, ap);
va_end(ap);
return converted;
}
int32_t
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 buffer[UFMT_DEFAULT_BUFFER_SIZE];
int32_t size = (int32_t)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 */
converted = u_vfscanf_u(f, pattern, ap);
/* clean up */
if (pattern != buffer) {
uprv_free(pattern);
}
return converted;
}
/* Use US-ASCII characters only for formatting. Most codepages have
characters 20-7F from Unicode. Using any other codepage specific
characters will make it very difficult to format the string on
non-Unicode machines */
static const u_scanf_info g_u_scanf_infos[108] = {
/* 0x20 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x30 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x40 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR,
UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x50 */
UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
/* 0x60 */
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR,
UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL,
UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL,
/* 0x70 */
UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING,
UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY,
UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY,
};
U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
u_vfscanf_u(UFILE *f,