/*---------------------------------------------------------------------------*
* 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;
}