/*---------------------------------------------------------------------------* * PFileWrap.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 <stdio.h> #include <stdarg.h> #include "LCHAR.h" #include "pendian.h" #include "PFile.h" #include "plog.h" #include "pstdio.h" #include "ptypes.h" ESR_ReturnCode PFileClose( PFile *self ) { fclose ( (FILE *)self ); return ( ESR_SUCCESS ); } ESR_ReturnCode PFileRead ( PFile *self, void *buffer, size_t size, size_t *count ) { ESR_ReturnCode read_status; size_t items_read; int ferror_status; items_read = fread ( buffer, size, *count, (FILE *)self ); if ( items_read > 0 ) { read_status = ESR_SUCCESS; *count = items_read; } else { ferror_status = ferror ( (FILE *)self ); if ( ferror_status == 0 ) { read_status = ESR_SUCCESS; *count = items_read; } else { read_status = ESR_READ_ERROR; } } return ( read_status ); } ESR_ReturnCode PFileWrite ( PFile *self, const void *buffer, size_t size, size_t *count ) { ESR_ReturnCode write_status; size_t items_written; items_written = fwrite ( buffer, size, *count, (FILE *)self ); if ( items_written == ( *count ) ) { write_status = ESR_SUCCESS; *count = items_written; } else { write_status = ESR_READ_ERROR; } return ( write_status ); } ESR_ReturnCode PFileFlush ( PFile *self ) { ESR_ReturnCode flush_status; size_t flush_ok; flush_ok = fflush ( (FILE *)self ); if ( flush_ok == 0 ) { flush_status = ESR_SUCCESS; } else { flush_status = ESR_FLUSH_ERROR; } return ( flush_status ); } ESR_ReturnCode PFileSeek ( PFile *self, long offset, int origin ) { ESR_ReturnCode seek_status; size_t seek_ok; seek_ok = fseek ( (FILE *)self, offset, origin ); if ( seek_ok == 0 ) { seek_status = ESR_SUCCESS; } else { seek_status = ESR_SEEK_ERROR; } return ( seek_status ); } ESR_ReturnCode PFileGetPosition ( PFile *self, size_t *position ) { ESR_ReturnCode get_status; long ftell_result; ftell_result = ftell ( (FILE *)self ); if ( ftell_result >= 0 ) { *position = (size_t)ftell_result; get_status = ESR_SUCCESS; } else { get_status = ESR_INVALID_STATE; } return ( get_status ); } ESR_ReturnCode PFileIsEOF ( PFile *self, ESR_BOOL *isEof ) { #ifdef NO_FEOF long posCur; /* remember current file position */ long posEnd; /* end of file position */ posCur = ftell ( self ); fseek ( self, 0, SEEK_END ); posEnd = ftell ( self ); if ( posCur == posEnd ) *isEof = ESR_TRUE; else *isEof = ESR_FALSE; fseek ( self, posCur, SEEK_SET ); /* restore position in file */ #else int is_eof; is_eof = feof ( (FILE *)self ); if ( is_eof != 0 ) *isEof = ESR_TRUE; else *isEof = ESR_FALSE; #endif return ( ESR_SUCCESS ); } ESR_ReturnCode PFileIsErrorSet ( PFile *self, ESR_BOOL *isError ) { int is_error; is_error = ferror ( (FILE *)self ); if ( is_error != 0 ) *isError = ESR_TRUE; else *isError = ESR_FALSE; return ( ESR_SUCCESS ); } ESR_ReturnCode PFileClearError ( PFile *self ) { clearerr ( (FILE *)self ); return ( ESR_SUCCESS ); } ESR_ReturnCode PFileVfprintf ( PFile *self, int *result, const LCHAR *format, va_list args ) { int bytes_printed; bytes_printed = vfprintf ( (FILE *)self, format, args ); if ( result != NULL ) *result = bytes_printed; return ( ESR_SUCCESS ); } ESR_ReturnCode PFileFgetc ( PFile *self, LINT *result ) { ESR_ReturnCode fgetc_status; int error_status; *result = fgetc ( (FILE *)self ); if ( ( *result ) != EOF ) { fgetc_status = ESR_SUCCESS; } else { error_status = ferror ( (FILE *)self ); if ( error_status == 0 ) fgetc_status = ESR_SUCCESS; else fgetc_status = ESR_INVALID_STATE; } return ( fgetc_status ); } ESR_ReturnCode PFileFgets ( PFile *self, LCHAR *string, int n, LCHAR **result ) { ESR_ReturnCode fgets_status; int error_status; LCHAR *temp; temp = fgets ( string, n, (FILE *)self ); if ( temp != NULL ) { fgets_status = ESR_SUCCESS; if ( result != NULL ) *result = temp; } else { error_status = ferror ( (FILE *)self ); if ( error_status == 0 ) { fgets_status = ESR_SUCCESS; if ( result != NULL ) *result = NULL; } else fgets_status = ESR_INVALID_STATE; } return ( fgets_status ); } PFile *pfopen ( const LCHAR *filename, const LCHAR *mode ) { PFile *result; result = (PFile *)fopen ( filename, mode ); return ( result ); } size_t pfread ( void *buffer, size_t size, size_t count, PFile *stream ) { ESR_ReturnCode rc; rc = PFileRead ( stream, buffer, size, &count ); if ( rc != ESR_SUCCESS ) return ( 0 ); return ( count ); } size_t pfwrite ( const void *buffer, size_t size, size_t count, PFile *stream ) { ESR_ReturnCode rc; rc = PFileWrite ( stream, buffer, size, &count ); if ( rc != ESR_SUCCESS ) return ( 0 ); return ( count ); } int pfclose ( PFile *stream ) { fclose ( (FILE *)stream ); return ( 0 ); } void prewind (PFile *stream) { PFileSeek ( stream, 0, SEEK_SET ); } int pfseek ( PFile *stream, long offset, int origin ) { ESR_ReturnCode rc; rc = PFileSeek ( stream, offset, origin ); if ( rc != ESR_SUCCESS ) return ( 1 ); return ( 0 ); } long pftell ( PFile *stream ) { ESR_ReturnCode rc; size_t result; rc = PFileGetPosition ( stream, &result ); if ( rc != ESR_SUCCESS ) return ( -1 ); return ( result ); } int pfeof ( PFile *stream ) { ESR_BOOL eof; PFileIsEOF ( stream, &eof ); if ( ! eof ) return ( 0 ); return ( 1 ); } int pferror ( PFile *stream ) { ESR_BOOL error; PFileIsErrorSet ( stream, &error ); if ( ! error ) return ( 0 ); return ( 1 ); } void pclearerr ( PFile *stream ) { PFileClearError ( stream ); } int pfflush ( PFile *stream ) { ESR_ReturnCode rc; rc = PFileFlush ( stream ); if ( rc != ESR_SUCCESS ) return ( PEOF ); return ( 0 ); } LCHAR* pfgets ( LCHAR *string, int n, PFile *self ) { LCHAR *result; ESR_ReturnCode rc; rc = PFileFgets ( self, string, n, &result ); if ( rc != ESR_SUCCESS ) return ( NULL ); return ( result ); } LINT pfgetc ( PFile *self ) { ESR_ReturnCode rc; LINT result; rc = PFileFgetc ( self, &result ); if ( rc != ESR_SUCCESS ) return ( PEOF ); return ( result ); } int pfprintf ( PFile *stream, const LCHAR *format, ... ) { ESR_ReturnCode rc; int result; va_list args; va_start ( args, format ); rc = PFileVfprintf ( stream, &result, format, args ); va_end ( args ); if ( rc != ESR_SUCCESS ) return ( -1 ); return ( result ); } int pvfprintf ( PFile *stream, const LCHAR *format, va_list argptr ) { ESR_ReturnCode rc; int result; rc = PFileVfprintf ( stream, &result, format, argptr ); if ( rc != ESR_SUCCESS ) return ( -1 ); return ( result ); } ESR_ReturnCode pf_convert_backslashes_to_forwardslashes ( LCHAR *string_to_convert ) { ESR_ReturnCode rc; int string_status; if ( string_to_convert != NULL ) { string_status = lstrreplace ( string_to_convert, L('\\'), L('/') ); if ( string_status == 0 ) rc = ESR_SUCCESS; else rc = ESR_INVALID_ARGUMENT; } else { rc = ESR_INVALID_ARGUMENT; } return ( rc ); } ESR_ReturnCode pf_is_path_absolute ( const LCHAR* input_path, ESR_BOOL* isAbsolute ) { ESR_ReturnCode rc; LCHAR path [P_PATH_MAX]; if ( isAbsolute != NULL ) { LSTRCPY ( path, input_path ); rc = pf_convert_backslashes_to_forwardslashes ( path ); if ( rc == ESR_SUCCESS ) { if ( ( path [0] == '/' ) || ( ( LISALPHA ( path [0] ) ) && ( path [1] == ':' ) && ( path [2] == '/' ) ) ) *isAbsolute = ESR_TRUE; else *isAbsolute = ESR_FALSE; } } else { rc = ESR_INVALID_ARGUMENT; } return ( rc ); }