/*---------------------------------------------------------------------------* * PFileSystemImpl.c * * * * Copyright 2007, 2008 Nuance Communciations, Inc. * * * * Licensed under the Apache License, Version 2.0 (the 'License'); * * you may not use this file except in compliance with the License. * * * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an 'AS IS' BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *---------------------------------------------------------------------------*/ #include "LCHAR.h" #include "PFileSystemImpl.h" #include "plog.h" #include "pmemory.h" #define MTAG NULL ESR_BOOL PFileSystemCreated = ESR_FALSE; /** * [file path, PFileSystem*] mapping. */ PHashTable* PFileSystemPathMap = NULL; /** * Portable standard input. */ PFile* PSTDIN = NULL; /** * Portable standard output. */ PFile* PSTDOUT = NULL; /** * Portable standard error. */ PFile* PSTDERR = NULL; /** * Current working directory. */ LCHAR PFileSystemCurrentDirectory[P_PATH_MAX] = L("/"); #ifdef USE_THREAD /* Prototype of private function */ PORTABLE_API ESR_ReturnCode PtrdFlush(); #endif ESR_ReturnCode PFileSystemCreate(void) { ESR_ReturnCode rc; if (PFileSystemCreated) return ESR_SUCCESS; #ifdef USE_STACKTRACE CHKLOG(rc, PStackTraceCreate()); #endif CHKLOG(rc, PHashTableCreate(NULL, MTAG, &PFileSystemPathMap)); CHKLOG(rc, PFileSystemInitializeStreamsImpl()); PFileSystemCreated = ESR_TRUE; return ESR_SUCCESS; CLEANUP: return rc; } ESR_ReturnCode PFileSystemDestroy(void) { ESR_ReturnCode rc; LCHAR* key; PHashTableEntry* entry; PHashTableEntry* oldEntry; if (!PFileSystemCreated) return ESR_SUCCESS; PFileSystemCreated = ESR_FALSE; if (PFileSystemPathMap != NULL) { CHKLOG(rc, PHashTableEntryGetFirst(PFileSystemPathMap, &entry)); while (entry != NULL) { CHKLOG(rc, PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)NULL)); oldEntry = entry; CHKLOG(rc, PHashTableEntryAdvance(&entry)); CHKLOG(rc, PHashTableEntryRemove(oldEntry)); FREE(key); } CHKLOG(rc, PHashTableDestroy(PFileSystemPathMap)); PFileSystemPathMap = NULL; } CHKLOG(rc, PFileSystemShutdownStreamsImpl()); #ifdef USE_STACKTRACE CHKLOG(rc, PStackTraceDestroy()); #endif return ESR_SUCCESS; CLEANUP: return rc; }