| Index: icu46/source/io/ufile.c
|
| ===================================================================
|
| --- icu46/source/io/ufile.c (revision 0)
|
| +++ icu46/source/io/ufile.c (revision 0)
|
| @@ -0,0 +1,311 @@
|
| +/*
|
| +******************************************************************************
|
| +*
|
| +* Copyright (C) 1998-2010, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*
|
| +******************************************************************************
|
| +*
|
| +* File ufile.c
|
| +*
|
| +* 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.
|
| +******************************************************************************
|
| +*/
|
| +
|
| +/* define for fileno. */
|
| +#ifndef _XOPEN_SOURCE
|
| +#if __STDC_VERSION__ >= 199901L
|
| +/* It is invalid to compile an XPG3, XPG4, XPG4v2 or XPG5 application using c99 */
|
| +#define _XOPEN_SOURCE 600
|
| +#else
|
| +#define _XOPEN_SOURCE 4
|
| +#endif
|
| +#endif
|
| +
|
| +#include "locmap.h"
|
| +#include "unicode/ustdio.h"
|
| +#include "ufile.h"
|
| +#include "unicode/uloc.h"
|
| +#include "unicode/ures.h"
|
| +#include "unicode/ucnv.h"
|
| +#include "cstring.h"
|
| +#include "cmemory.h"
|
| +
|
| +#if defined(U_WINDOWS) && !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);
|
| +
|
| +#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;
|
| +}
|
| +
|
| +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;
|
| +}
|
| +
|
| +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;
|
| +}
|
| +
|
|
|
| Property changes on: icu46/source/io/ufile.c
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|