14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * PANSIFileImpl.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "errno.h" 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pendian.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PFileImpl.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PANSIFileImpl.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PFileSystem.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_ReturnCode.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptypes.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileCreateImpl(const LCHAR* filename, ESR_BOOL isLittleEndian, PFile** self) 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = NULL; 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl = NEW(PANSIFileImpl, MTAG); 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl == NULL) 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_OUT_OF_MEMORY; 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PFileCreateImpl(&impl->Interface.Interface, filename, isLittleEndian); 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.close = &PANSIFileCloseImpl; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.clearError = &PANSIFileClearErrorImpl; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.destroy = &PANSIFileDestroyImpl; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.fgetc = &PANSIFileFgetcImpl; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.fgets = &PANSIFileFgetsImpl; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.getPosition = &PANSIFileGetPositionImpl; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.hideMemoryAllocation = &PANSIFileHideMemoryAllocation; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.isEOF = &PANSIFileIsEOFImpl; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.isErrorSet = &PANSIFileIsErrorSetImpl; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.isOpen = &PANSIFileIsOpenImpl; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.open = &PANSIFileOpenImpl; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.read = &PANSIFileReadImpl; 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.seek = &PANSIFileSeekImpl; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.flush = &PANSIFileFlushImpl; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.write = &PANSIFileWriteImpl; 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.filename[0] = 0; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->value = NULL; 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCAT(impl->Interface.filename, filename); 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *self = &impl->Interface.Interface; 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl != NULL) 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.Interface.destroy(&impl->Interface.Interface); 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileDestroyImpl(PFile* self) 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHK(rc, PFileDestroyImpl(self)); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(self); 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOCK_MUTEX(rc, impl) \ 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->Interface.lock != NULL) \ 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PtrdMonitorLock(impl->Interface.lock)); 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOCK_MUTEX(rc, impl) 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CLEANUP_AND_RETURN(rc, impl) \ 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->Interface.lock!=NULL) \ 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PtrdMonitorUnlock(impl->Interface.lock)); \ 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; \ 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP: \ 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->Interface.lock!=NULL) \ 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PtrdMonitorUnlock(impl->Interface.lock); \ 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CLEANUP_AND_RETURN(rc, impl) \ 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; \ 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP: \ 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileOpenImpl(PFile* self, const LCHAR* mode) 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->value != NULL) 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_ALREADY_OPEN; 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->value = fopen(impl->Interface.filename, mode); 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->value == NULL) 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR path[P_PATH_MAX]; 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len; 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project len = P_PATH_MAX; 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PFileSystemGetcwd(path, &len)); 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_OPEN_ERROR; 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* PLOG_DBG_TRACE((L("%s: filename=%s, cwd=%s"), ESR_rc2str(rc), impl->Interface.filename, path)); */ 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("%s: filename=%s, cwd=%s"), ESR_rc2str(rc), impl->Interface.filename, path); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileCloseImpl(PFile* self) 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fclose(impl->value) != 0) 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_CLOSE_ERROR; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(L("%s: file %s, handle"), ESR_rc2str(rc), impl->Interface.filename, impl->value); 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->value = NULL; 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileReadImpl(PFile* self, void* buffer, size_t size, size_t* count) 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (count == NULL) 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_ARGUMENT; 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size != 0 && *count != 0) 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL needToSwap; 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *count = fread(buffer, size, *count, impl->value); 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*count == 0 && ferror(impl->value)) 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_READ_ERROR; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(ESR_rc2str(rc)); 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef __LITTLE_ENDIAN 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project needToSwap = !impl->Interface.littleEndian; 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project needToSwap = impl->Interface.littleEndian; 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (needToSwap) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swap_byte_order(buffer, *count, size); 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *count = 0; 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileWriteImpl(PFile* self, void* buffer, size_t size, size_t* count) 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t requested = *count; 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (count == NULL) 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_ARGUMENT; 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (size != 0 && *count != 0) 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL needToSwap; 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void* temp; 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef __LITTLE_ENDIAN 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project needToSwap = !impl->Interface.littleEndian; 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project needToSwap = impl->Interface.littleEndian; 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (needToSwap) 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp = MALLOC(*count * size, MTAG); 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (temp == NULL) 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_OUT_OF_MEMORY; 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memcpy(temp, buffer, *count * size); 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swap_byte_order(temp, *count, size); 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp = buffer; 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *count = fwrite(temp, size, *count, impl->value); 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (needToSwap) 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(temp); 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp = NULL; 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*count < requested) 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_WRITE_ERROR; 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(ESR_rc2str(rc)); 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *count = 0; 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileFlushImpl(PFile* self) 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fflush(impl->value) != 0) 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_FLUSH_ERROR; 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(ESR_rc2str(rc)); 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileSeekImpl(PFile* self, long offset, int origin) 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fseek(impl->value, offset, origin) != 0) 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SEEK_ERROR; 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(ESR_rc2str(rc)); 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileGetPositionImpl(PFile* self, size_t* position) 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project long pos; 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pos = ftell(impl->value); 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (pos == -1) 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (errno) 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case EBADF: 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("%s: Got EBADF"), rc); 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case EINVAL: 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("%s: Got EINVAL"), rc); 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *position = pos; 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileIsOpenImpl(PFile* self, ESR_BOOL* isOpen) 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isOpen == NULL) 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_ARGUMENT; 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *isOpen = impl->value != NULL; 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileIsEOFImpl(PFile* self, ESR_BOOL* isEof) 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isEof == NULL) 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_ARGUMENT; 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef NO_FEOF 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project long posCur; /* remember current file position */ 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project long posEnd; /* end of file position */ 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project posCur = ftell(impl->value); 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fseek(impl->value, 0, SEEK_END); 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project posEnd = ftell(impl->value); 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *isEof = (posCur == posEnd); 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fseek(impl->value, posCur, SEEK_SET); /* restore position in file */ 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *isEof = feof(impl->value) != 0; 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileIsErrorSetImpl(PFile* self, ESR_BOOL* isError) 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isError == NULL) 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_ARGUMENT; 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *isError = ferror(impl->value) != 0; 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileClearErrorImpl(PFile* self) 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project clearerr(impl->value); 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileFgetsImpl(PFile* self, LCHAR* string, int n, LCHAR** result) 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* temp; 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp = fgets(string, n, impl->value); 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (result != NULL) 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *result = temp; 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (temp == NULL && ferror(impl->value)) 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(ESR_rc2str(rc)); 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileFgetcImpl(PFile* self, LINT* result) 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *result = fgetc(impl->value); 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*result == PEOF && ferror(impl->value)) 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(ESR_rc2str(rc)); 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PANSIFileHideMemoryAllocation(PFile* self) 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PANSIFileImpl* impl = (PANSIFileImpl*) self; 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOCK_MUTEX(rc, impl); 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PMemLogFree(self); 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__); 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PMemLogFree(impl->Interface.filename); 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__); 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PMemLogFree(impl->Interface.lock); 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("%s: PMemDumpLogFile() at %s:%d"), ESR_rc2str(rc), __FILE__, __LINE__); 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP_AND_RETURN(rc, impl); 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 450