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; }
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; }
#include "squirrel.h" #include <stdio.h> #include <stdarg.h> #include <sqstdio.h> #include <sqstdmath.h> #include <sqstdstring.h> #include <sqstdaux.h> #include <sqstdblob.h> #include "SquirrelVM.h" #include "SquirrelObject.h" #ifndef _MT extern "C" { FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]}; } #endif // HSQUIRRELVM _VM = NULL; // int SquirrelVM::_CallState = -1; // SquirrelObject SquirrelVM::_root; SquirrelError::SquirrelError(HSQUIRRELVM v) { const SQChar *s; sq_getlasterror(v); sq_getstring(v,-1,&s); if(s) { desc = s; } else { desc = _SC("unknown error"); }