| /*---------------------------------------------------------------------------* |
| * PFile.h * |
| * * |
| * 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. * |
| * * |
| *---------------------------------------------------------------------------*/ |
| |
| #ifndef __PFILE_H |
| #define __PFILE_H |
| |
| |
| |
| #include <stdarg.h> |
| #include <stddef.h> |
| |
| #include "ESR_ReturnCode.h" |
| #include "PortPrefix.h" |
| #include "ptypes.h" |
| #include "pstdio.h" |
| |
| |
| /** |
| * @addtogroup PFileModule PFile API functions |
| * Portable file API. |
| * |
| * Must call pmemInit() before using this module. |
| * If threads are to be used, ptrdInit() must be called before using this module as well. |
| * |
| * NOTE: It is technically impossible to provide a cross-platform version of scanf() and its |
| * variants (since vscanf() does not exist). As a result, this module does not provide this |
| * functionality. End-users are encourages to do their own parsing. |
| * |
| * @{ |
| */ |
| |
| #define USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS 1 |
| |
| |
| #ifdef USE_NARROW_CHAR |
| |
| /** |
| * Portable EOF constant |
| */ |
| #define PEOF EOF |
| |
| #else |
| |
| /** |
| * Portable EOF constant |
| */ |
| #define PEOF WEOF |
| |
| #endif /* USE_NARROW_CHAR */ |
| |
| /** |
| * Portable file. |
| */ |
| |
| #ifdef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS |
| |
| typedef FILE PFile; |
| |
| #else |
| typedef struct PFile_t |
| { |
| /** |
| * Closes the PFile and destroys it. |
| * |
| * @param self PFile handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*destroy)(struct PFile_t* self); |
| |
| |
| ESR_ReturnCode(*open)(struct PFile_t* self, const LCHAR* mode); |
| |
| /** |
| * Closes a PFile. |
| * |
| * @param self PFile handle |
| * @return ESR_CLOSE_ERROR if file cannot be closed |
| */ |
| ESR_ReturnCode(*close)(struct PFile_t* self); |
| |
| /** |
| * Reads from a PFile. |
| * |
| * @param self PFile handle |
| * @param buffer Storage location for data |
| * @param size Item size in bytes |
| * @param count [in/out] Maximum number of items to be read. On output, contains the |
| * number of full items actually read, which may be less than count if |
| * an error occurs or if the end of the file is encountered before reaching |
| * count. |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_READ_ERROR if a reading error occurs |
| */ |
| ESR_ReturnCode(*read)(struct PFile_t* self, void* buffer, size_t size, size_t* count); |
| |
| /** |
| * Writes data to a PFile. |
| * |
| * @param self PFile handle |
| * @param buffer Pointer to data to be written |
| * @param size Item size in bytes |
| * @param count [in/out] Maximum number of items to be read. On output, contains the |
| * number of full items actually written, which may be less than count if |
| * an error occurs. |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_WRITE_ERROR if a writing error occurs |
| */ |
| ESR_ReturnCode(*write)(struct PFile_t* self, const void* buffer, size_t size, size_t* count); |
| |
| /** |
| * Flushes a PFile. |
| * |
| * @param self PFile handle |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_FLUSH_ERROR if a flushing error occurs |
| */ |
| ESR_ReturnCode(*flush)(struct PFile_t* self); |
| |
| /** |
| * Flushes a PFile. |
| * |
| * @param self PFile handle |
| * @param offset Number of bytes from <code>origin</code> |
| * @param origin Initial position |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_SEEK_ERROR if a seeking error occurs |
| */ |
| ESR_ReturnCode(*seek)(struct PFile_t* self, long offset, int origin); |
| |
| /** |
| * Gets the current position of a PFile. |
| * |
| * @param self PFile handle |
| * @param position [out] The position |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error occurs |
| */ |
| ESR_ReturnCode(*getPosition)(struct PFile_t* self, size_t* position); |
| |
| /** |
| * Indicates if the PFile is open. |
| * |
| * @param self PFile handle |
| * @param isOpen [out] True if file is open |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*isOpen)(struct PFile_t* self, ESR_BOOL* isOpen); |
| |
| /** |
| * Indicates if the PFile is at the end of file. |
| * |
| * @param self PFile handle |
| * @param isEof [out] True if end of file has been reached |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*isEOF)(struct PFile_t* self, ESR_BOOL* isEof); |
| |
| /** |
| * Returns filename associated with PFile. |
| * |
| * @param self PFile handle |
| * @param filename [out] The filename |
| * @param len [in/out] Length of filename argument. If the return code is ESR_BUFFER_OVERFLOW, |
| * the required length is returned in this variable. |
| * @return ESR_INVALID_ARGUMENT if self or filename are null; ESR_BUFFER_OVERFLOW if buffer is too small |
| * to contain results |
| */ |
| ESR_ReturnCode(*getFilename)(struct PFile_t* self, LCHAR* filename, size_t* len); |
| |
| /** |
| * Indicates if the error-flag is set in the PFile. This functionality is provided solely |
| * for backwards-compatibility reasons with ANSI-C ferror(). |
| * |
| * @param self PFile handle |
| * @param isError [out] True if the error-flag is set |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*isErrorSet)(struct PFile_t* self, ESR_BOOL* isError); |
| |
| /** |
| * Clears the error-flag in the PFile. This functionality is provided solely |
| * for backwards-compatibility reasons with ANSI-C ferror(). |
| * |
| * @param self PFile handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*clearError)(struct PFile_t* self); |
| |
| /** |
| * vfprintf() implementation for PFile. |
| * |
| * @param self PFile handle |
| * @param result Function result |
| * @param format see vfprintf() |
| * @param args see vfprintf() |
| * @return see vfprintf() |
| */ |
| ESR_ReturnCode(*vfprintf)(struct PFile_t* self, int* result, const LCHAR* format, va_list args); |
| /** |
| * fgetc() implementation for PFile. |
| * In case the underlying function returns an error, it will be propegated by the wrapper. |
| * |
| * @param self PFile handle |
| * @param result Function result |
| * @return see fgetc() |
| */ |
| ESR_ReturnCode(*fgetc)(struct PFile_t* self, LINT* result); |
| /** |
| * fgets() implementation for PFile. |
| * In case the underlying function returns an error, it will be propegated by the wrapper. |
| * |
| * @param self PFile handle |
| * @param string See fgets() |
| * @param n See fgets() |
| * @param result Function result |
| * @return see fgets() |
| */ |
| ESR_ReturnCode(*fgets)(struct PFile_t* self, LCHAR* string, int n, LCHAR** result); |
| /** |
| * Hide the memory footprint of this object from the PMemory module. |
| * |
| * NOTE: Because this function may be called by PMemory on shutdown, |
| * no PLog (which is shutdown before PMemory) functions should |
| * be used. |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*hideMemoryAllocation)(struct PFile_t* self); |
| } |
| PFile; |
| |
| #endif |
| |
| |
| |
| /* |
| * Expose functions only if use wrappers is not defined, otherwize only expose wrapper functions. |
| */ |
| |
| #ifndef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS |
| |
| /** |
| * Closes the PFile and destroys it. |
| * |
| * @param self PFile handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| PORTABLE_API ESR_ReturnCode PFileDestroy(PFile* self); |
| |
| |
| PORTABLE_API ESR_ReturnCode PFileOpen(PFile* self, const LCHAR* mode); |
| |
| /** |
| * Closes a PFile. |
| * |
| * @param self PFile handle |
| * @return ESR_CLOSE_ERROR if file cannot be closed |
| */ |
| PORTABLE_API ESR_ReturnCode PFileClose(PFile* self); |
| |
| /** |
| * Reads from a PFile. |
| * |
| * @param self PFile handle |
| * @param buffer Storage location for data |
| * @param size Item size in bytes |
| * @param count [in/out] Maximum number of items to be read. On output, contains the |
| * number of full items actually read, which may be less than count if |
| * an error occurs or if the end of the file is encountered before reaching |
| * count. |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_READ_ERROR if a reading error occurs |
| */ |
| PORTABLE_API ESR_ReturnCode PFileRead(PFile* self, void* buffer, size_t size, size_t* count); |
| |
| /** |
| * Writes data to a PFile. |
| * |
| * @param self PFile handle |
| * @param buffer Pointer to data to be written |
| * @param size Item size in bytes |
| * @param count [in/out] Maximum number of items to be read. On output, contains the |
| * number of full items actually written, which may be less than count if |
| * an error occurs. |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_WRITE_ERROR if a writing error occurs |
| */ |
| PORTABLE_API ESR_ReturnCode PFileWrite(PFile* self, void* buffer, size_t size, size_t* count); |
| |
| /** |
| * Flushes a PFile. |
| * |
| * @param self PFile handle |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_FLUSH_ERROR if a flushing error occurs |
| */ |
| PORTABLE_API ESR_ReturnCode PFileFlush(PFile* self); |
| |
| /** |
| * Flushes a PFile. |
| * |
| * @param self PFile handle |
| * @param offset Number of bytes from <code>origin</code> |
| * @param origin Initial position |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_SEEK_ERROR if a seeking error occurs |
| */ |
| PORTABLE_API ESR_ReturnCode PFileSeek(PFile* self, long offset, int origin); |
| |
| /** |
| * Gets the current position of a PFile. |
| * |
| * @param self PFile handle |
| * @param position [out] The position |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_INVALID_STATE if an internal error occurs |
| */ |
| PORTABLE_API ESR_ReturnCode PFileGetPosition(PFile* self, size_t* position); |
| |
| /** |
| * Indicates if the PFile is open. |
| * |
| * @param self PFile handle |
| * @param isOpen [out] True if file is open |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| PORTABLE_API ESR_ReturnCode PFileIsOpen(PFile* self, ESR_BOOL* isOpen); |
| |
| |
| /** |
| * Indicates if the PFile is at the end of file. |
| * |
| * @param self PFile handle |
| * @param isEof [out] True if end of file has been reached |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| PORTABLE_API ESR_ReturnCode PFileIsEOF(PFile* self, ESR_BOOL* isEof); |
| |
| /** |
| * Indicates if the error-flag is set in the PFile. This functionality is provided solely |
| * for backwards-compatibility reasons with ANSI-C ferror(). |
| * |
| * @param self PFile handle |
| * @param isError [out] True if the error-flag is set |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| PORTABLE_API ESR_ReturnCode PFileIsErrorSet(PFile* self, ESR_BOOL* isError); |
| |
| /** |
| * Clears the error-flag in the PFile. This functionality is provided solely |
| * for backwards-compatibility reasons with ANSI-C ferror(). |
| * |
| * @param self PFile handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| PORTABLE_API ESR_ReturnCode PFileClearError(PFile* self); |
| |
| /** |
| * fprintf() implementation for PFile. |
| * |
| * @param self PFile handle |
| * @param result Function result |
| * @param format see fprintf() |
| * @param args see fprintf() |
| * @return see fprintf() |
| */ |
| PORTABLE_API ESR_ReturnCode PFileFprintf(PFile* self, int* result, const LCHAR* format, va_list args); |
| |
| /** |
| * vfprintf() implementation for PFile. |
| * |
| * @param self PFile handle |
| * @param result Function result |
| * @param format see vfprintf() |
| * @param args see vfprintf() |
| * @return see vfprintf() |
| */ |
| PORTABLE_API ESR_ReturnCode PFileVfprintf(PFile* self, int* result, const LCHAR* format, va_list args); |
| /** |
| * fgetc() implementation for PFile. |
| * |
| * @param self PFile handle |
| * @param result Function result |
| * @return see fgetc() |
| */ |
| PORTABLE_API ESR_ReturnCode PFileFgetc(PFile* self, LINT* result); |
| /** |
| * fgets() implementation for PFile. |
| * |
| * @param self PFile handle |
| * @param string See fgets() |
| * @param n See fgets() |
| * @param result Function result |
| * @return see fgets() |
| */ |
| PORTABLE_API ESR_ReturnCode PFileFgets(PFile* self, LCHAR* string, int n, LCHAR** result); |
| |
| /** |
| * Reads an integer from the PFile. |
| * |
| * @param self PFile handle |
| * @param value [out] Integer that was read |
| * @return ESR_READ_ERROR if a reading error occurs; ESR_SEEK_ERROR if a seeking error occurs; |
| * ESR_INVALID_STATE if no EOF is reached before an integer |
| */ |
| PORTABLE_API ESR_ReturnCode PFileReadInt(PFile* self, int* value); |
| |
| /** |
| * Reads a string token from the PFile. |
| * |
| * @param self PFile handle |
| * @param value [out] String that was read |
| * @param len Size of value argument. |
| * @return ESR_BUFFER_OVERFLOW if the value argument is too small; ESR_READ_ERROR if a reading error occurs; |
| * ESR_SEEK_ERROR if a seeking error occurs; ESR_INVALID_STATE if no EOF is reached before an LCHAR* |
| */ |
| PORTABLE_API ESR_ReturnCode PFileReadLCHAR(PFile* self, LCHAR* value, size_t len); |
| |
| /** |
| * Returns filename associated with PFile. |
| * |
| * @param self PFile handle |
| * @param filename [out] The filename |
| * @param len [in/out] Length of filename argument. If the return code is ESR_BUFFER_OVERFLOW, |
| * the required length is returned in this variable. |
| * @return ESR_INVALID_ARGUMENT if self or filename are null; ESR_BUFFER_OVERFLOW if buffer is too small |
| * to contain results |
| */ |
| PORTABLE_API ESR_ReturnCode PFileGetFilename(PFile* self, LCHAR* filename, size_t* len); |
| |
| #endif /* USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS */ |
| |
| /** |
| * Backwards compatible fopen(). |
| * |
| * @param filename See fopen() |
| * @param mode See fopen() |
| * @return see fopen() |
| */ |
| PORTABLE_API PFile* pfopen(const LCHAR* filename, const LCHAR* mode); |
| |
| /** |
| * Backwards compatible fread(). |
| * |
| * @param buffer See fread() |
| * @param size See fread() |
| * @param count See fread() |
| * @param stream See fread() |
| * @return see fread() |
| */ |
| PORTABLE_API size_t pfread(void* buffer, size_t size, size_t count, PFile* stream); |
| |
| /** |
| * Backwards compatible fwrite(). |
| * |
| * @param buffer See fwrite() |
| * @param size See fwrite() |
| * @param count See fwrite() |
| * @param stream See fwrite() |
| * @return see fwrite() |
| */ |
| PORTABLE_API size_t pfwrite(const void* buffer, size_t size, size_t count, PFile* stream); |
| |
| /** |
| * Backwards compatible fclose(). |
| * |
| * @param stream See fclose() |
| * @return see fclose() |
| */ |
| PORTABLE_API int pfclose(PFile* stream); |
| |
| /** |
| * Backwards compatible rewind() |
| * |
| * @param stream See rewind() |
| * @return see rewind() |
| */ |
| PORTABLE_API void prewind(PFile* stream); |
| |
| /** |
| * Backwards compatible fseek(). |
| * |
| * @param stream See fseek() |
| * @param offset See fseek() |
| * @param origin See fseek() |
| * @return see fseek() |
| */ |
| PORTABLE_API int pfseek(PFile* stream, long offset, int origin); |
| |
| /** |
| * Backwards compatible ftell(). |
| * |
| * @param stream See ftell() |
| * @return see ftell() |
| */ |
| PORTABLE_API long pftell(PFile* stream); |
| |
| /** |
| * Backwards compatible fgets(). |
| * |
| * @param string See fgets() |
| * @param n See fgets() |
| * @param stream See fgets() |
| * @return see fgets() |
| */ |
| PORTABLE_API LCHAR* pfgets(LCHAR* string, int n, PFile* stream); |
| |
| /** |
| * Backwards compatible feof(). |
| * |
| * @param stream See feof() |
| * @return see feof() |
| */ |
| PORTABLE_API int pfeof(PFile* stream); |
| |
| /** |
| * Backwards compatible ferror(). |
| * |
| * @param stream See ferror() |
| * @return see ferror() |
| */ |
| PORTABLE_API int pferror(PFile* stream); |
| |
| /** |
| * Backwards compatible clearerr(). |
| * |
| * @param stream See clearerr() |
| */ |
| PORTABLE_API void pclearerr(PFile* stream); |
| |
| /** |
| * Backwards compatible fgetc(). |
| * |
| * @param stream See clearerr() |
| * @return see clearerr() |
| */ |
| PORTABLE_API LINT pfgetc(PFile* stream); |
| |
| /** |
| * Backwards compatible fflush(). |
| * |
| * @param stream See fflush() |
| * @return see fflush() |
| */ |
| PORTABLE_API int pfflush(PFile* stream); |
| |
| /** |
| * Backwards compatible vfprintf(). |
| * |
| * @param stream See vfprintf() |
| * @param format See vfprintf() |
| * @param args See vfprintf() |
| * @return see vfprintf() |
| */ |
| PORTABLE_API int pvfprintf(PFile* stream, const LCHAR* format, va_list args); |
| |
| /** |
| * Backwards compatible fprintf(). |
| * |
| * @param stream See fprintf() |
| * @param format See fprintf() |
| * @return see fprintf() |
| */ |
| PORTABLE_API int pfprintf(PFile* stream, const LCHAR* format, ...); |
| |
| /** |
| * Backwards compatible printf(). |
| * |
| * @param format See printf() |
| * @return see printf() |
| */ |
| |
| #ifndef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS |
| PORTABLE_API int pprintf(const LCHAR* format, ...); |
| #endif |
| |
| /* |
| * The following are only defined when using pfile wrappers. |
| */ |
| |
| #ifdef USE_LIGHT_WEIGHT_PANSI_FILE_WRAPPERS |
| PORTABLE_API ESR_ReturnCode pf_convert_backslashes_to_forwardslashes ( LCHAR *string_to_convert ); |
| PORTABLE_API ESR_ReturnCode pf_is_path_absolute ( const LCHAR* input_path, ESR_BOOL* isAbsolute ); |
| PORTABLE_API ESR_ReturnCode pf_make_dir ( const LCHAR* path ); |
| PORTABLE_API ESR_ReturnCode pf_get_cwd ( LCHAR* path, size_t *len ); |
| PORTABLE_API ESR_ReturnCode pf_change_dir ( const LCHAR* path ); |
| #endif |
| |
| /** |
| * @} |
| */ |
| #endif /* __PFILE_H */ |