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