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; }
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 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 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; }
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); #ifdef U_WINDOWS if (0 <= result->fFileno && result->fFileno <= 2) { /* stdin, stdout and stderr need to be special cased for Windows 98 */ #if _MSC_VER >= 1400 result->fFile = &__iob_func()[_fileno(f)]; #else result->fFile = &_iob[_fileno(f)]; #endif } else #endif { 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; }
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); #if U_PLATFORM_USES_ONLY_WIN32_API && _MSC_VER < 1900 /* * Below is a very old workaround (ICU ticket:231). * * Previously, 'FILE*' from inside and outside ICU's DLL * were different, because they pointed into local copies * of the io block. At least by VS 2015 the implementation * is something like: * stdio = _acrt_iob_func(0) * .. which is a function call, so should return the same pointer * regardless of call site. * As of _MSC_VER 1900 this patch is retired, at 16 years old. */ if (0 <= result->fFileno && result->fFileno <= 2) { /* stdin, stdout and stderr need to be special cased for Windows 98 */ #if _MSC_VER >= 1400 result->fFile = &__iob_func()[_fileno(f)]; #else result->fFile = &_iob[_fileno(f)]; #endif } else #endif { 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; }