Home | History | Annotate | Download | only in src
      1 /*---------------------------------------------------------------------------*
      2  *  PFileWrap.c  *
      3  *                                                                           *
      4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
      5  *                                                                           *
      6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
      7  *  you may not use this file except in compliance with the License.         *
      8  *                                                                           *
      9  *  You may obtain a copy of the License at                                  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
     11  *                                                                           *
     12  *  Unless required by applicable law or agreed to in writing, software      *
     13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
     15  *  See the License for the specific language governing permissions and      *
     16  *  limitations under the License.                                           *
     17  *                                                                           *
     18  *---------------------------------------------------------------------------*/
     19 
     20 #include <stdio.h>
     21 #include <stdarg.h>
     22 #include "LCHAR.h"
     23 #include "pendian.h"
     24 #include "PFile.h"
     25 #include "plog.h"
     26 #include "pstdio.h"
     27 #include "ptypes.h"
     28 
     29 
     30 
     31 
     32 ESR_ReturnCode PFileClose( PFile *self )
     33     {
     34 
     35     fclose ( (FILE *)self );
     36     return ( ESR_SUCCESS );
     37     }
     38 
     39 
     40 
     41 ESR_ReturnCode PFileRead ( PFile *self, void *buffer, size_t size, size_t *count )
     42     {
     43     ESR_ReturnCode  read_status;
     44     size_t          items_read;
     45     int             ferror_status;
     46 
     47     items_read = fread ( buffer, size, *count, (FILE *)self );
     48 
     49     if ( items_read > 0 )
     50         {
     51         read_status = ESR_SUCCESS;
     52         *count = items_read;
     53         }
     54     else
     55         {
     56         ferror_status = ferror ( (FILE *)self );
     57 
     58         if ( ferror_status == 0 )
     59             {
     60             read_status = ESR_SUCCESS;
     61             *count = items_read;
     62             }
     63         else
     64             {
     65             read_status = ESR_READ_ERROR;
     66             }
     67         }
     68     return ( read_status );
     69     }
     70 
     71 
     72 
     73 ESR_ReturnCode PFileWrite ( PFile *self, const void *buffer, size_t size, size_t *count )
     74     {
     75     ESR_ReturnCode  write_status;
     76     size_t          items_written;
     77 
     78     items_written = fwrite ( buffer, size, *count, (FILE *)self );
     79 
     80     if ( items_written == ( *count ) )
     81         {
     82         write_status = ESR_SUCCESS;
     83         *count = items_written;
     84         }
     85     else
     86         {
     87         write_status = ESR_READ_ERROR;
     88         }
     89     return ( write_status );
     90     }
     91 
     92 
     93 
     94 ESR_ReturnCode PFileFlush ( PFile *self )
     95     {
     96     ESR_ReturnCode  flush_status;
     97     size_t          flush_ok;
     98 
     99     flush_ok = fflush ( (FILE *)self );
    100 
    101     if ( flush_ok == 0 )
    102         {
    103         flush_status = ESR_SUCCESS;
    104         }
    105     else
    106         {
    107         flush_status = ESR_FLUSH_ERROR;
    108         }
    109     return ( flush_status );
    110     }
    111 
    112 
    113 
    114 ESR_ReturnCode PFileSeek ( PFile *self, long offset, int origin )
    115     {
    116     ESR_ReturnCode  seek_status;
    117     size_t          seek_ok;
    118 
    119     seek_ok = fseek ( (FILE *)self, offset, origin );
    120 
    121     if ( seek_ok == 0 )
    122         {
    123         seek_status = ESR_SUCCESS;
    124         }
    125     else
    126         {
    127         seek_status = ESR_SEEK_ERROR;
    128         }
    129     return ( seek_status );
    130     }
    131 
    132 
    133 
    134 ESR_ReturnCode PFileGetPosition ( PFile *self, size_t *position )
    135     {
    136     ESR_ReturnCode  get_status;
    137     long            ftell_result;
    138 
    139     ftell_result = ftell ( (FILE *)self );
    140 
    141     if ( ftell_result >= 0 )
    142         {
    143 	*position = (size_t)ftell_result;
    144         get_status = ESR_SUCCESS;
    145         }
    146     else
    147         {
    148         get_status = ESR_INVALID_STATE;
    149         }
    150     return ( get_status );
    151     }
    152 
    153 
    154 
    155 ESR_ReturnCode PFileIsEOF ( PFile *self, ESR_BOOL *isEof )
    156     {
    157 #ifdef NO_FEOF
    158     long            posCur;    /* remember current file position */
    159     long            posEnd;    /* end of file position */
    160 
    161     posCur = ftell ( self );
    162     fseek ( self, 0, SEEK_END );
    163     posEnd = ftell ( self );
    164 
    165     if ( posCur == posEnd )
    166         *isEof = ESR_TRUE;
    167     else
    168         *isEof = ESR_FALSE;
    169     fseek ( self, posCur, SEEK_SET );  /* restore position in file */
    170 #else
    171     int             is_eof;
    172 
    173     is_eof = feof ( (FILE *)self );
    174 
    175     if ( is_eof != 0 )
    176         *isEof = ESR_TRUE;
    177     else
    178         *isEof = ESR_FALSE;
    179 #endif
    180     return ( ESR_SUCCESS );
    181     }
    182 
    183 
    184 
    185 ESR_ReturnCode PFileIsErrorSet ( PFile *self, ESR_BOOL *isError )
    186     {
    187     int is_error;
    188 
    189     is_error = ferror ( (FILE *)self );
    190 
    191     if ( is_error != 0 )
    192         *isError = ESR_TRUE;
    193     else
    194         *isError = ESR_FALSE;
    195     return ( ESR_SUCCESS );
    196     }
    197 
    198 
    199 
    200 ESR_ReturnCode PFileClearError ( PFile *self )
    201     {
    202 
    203     clearerr ( (FILE *)self );
    204     return ( ESR_SUCCESS );
    205     }
    206 
    207 
    208 
    209 ESR_ReturnCode PFileVfprintf ( PFile *self, int *result, const LCHAR *format, va_list args )
    210     {
    211     int bytes_printed;
    212 
    213     bytes_printed = vfprintf ( (FILE *)self, format, args );
    214 
    215     if ( result != NULL )
    216         *result = bytes_printed;
    217     return ( ESR_SUCCESS );
    218     }
    219 
    220 
    221 
    222 ESR_ReturnCode PFileFgetc ( PFile *self, LINT *result )
    223     {
    224     ESR_ReturnCode  fgetc_status;
    225     int             error_status;
    226 
    227     *result = fgetc ( (FILE *)self );
    228 
    229     if ( ( *result ) != EOF )
    230         {
    231         fgetc_status = ESR_SUCCESS;
    232         }
    233     else
    234         {
    235         error_status = ferror ( (FILE *)self );
    236 
    237         if ( error_status == 0 )
    238             fgetc_status = ESR_SUCCESS;
    239         else
    240             fgetc_status = ESR_INVALID_STATE;
    241         }
    242     return ( fgetc_status );
    243     }
    244 
    245 
    246 
    247 ESR_ReturnCode PFileFgets ( PFile *self, LCHAR *string, int n, LCHAR **result )
    248     {
    249     ESR_ReturnCode  fgets_status;
    250     int             error_status;
    251     LCHAR           *temp;
    252 
    253     temp = fgets ( string, n, (FILE *)self );
    254 
    255     if ( temp != NULL )
    256         {
    257         fgets_status = ESR_SUCCESS;
    258 
    259         if ( result != NULL )
    260             *result = temp;
    261         }
    262     else
    263         {
    264         error_status = ferror ( (FILE *)self );
    265 
    266         if ( error_status == 0 )
    267             {
    268             fgets_status = ESR_SUCCESS;
    269 
    270             if ( result != NULL )
    271                 *result = NULL;
    272             }
    273         else
    274             fgets_status = ESR_INVALID_STATE;
    275         }
    276     return ( fgets_status );
    277     }
    278 
    279 
    280 
    281 PFile *pfopen ( const LCHAR *filename, const LCHAR *mode )
    282     {
    283     PFile           *result;
    284 
    285     result = (PFile *)fopen ( filename, mode );
    286     return ( result );
    287     }
    288 
    289 
    290 
    291 size_t pfread ( void *buffer, size_t size, size_t count, PFile *stream )
    292     {
    293     ESR_ReturnCode rc;
    294 
    295     rc = PFileRead ( stream, buffer, size, &count );
    296 
    297     if ( rc != ESR_SUCCESS )
    298         return ( 0 );
    299     return ( count );
    300     }
    301 
    302 
    303 
    304 size_t pfwrite ( const void *buffer, size_t size, size_t count, PFile *stream )
    305     {
    306     ESR_ReturnCode rc;
    307 
    308     rc = PFileWrite ( stream, buffer, size, &count );
    309     if ( rc != ESR_SUCCESS )
    310         return ( 0 );
    311     return ( count );
    312     }
    313 
    314 
    315 
    316 int pfclose ( PFile *stream )
    317     {
    318 
    319     fclose ( (FILE *)stream );
    320 
    321     return ( 0 );
    322     }
    323 
    324 
    325 
    326 void prewind (PFile *stream)
    327     {
    328 
    329     PFileSeek ( stream, 0, SEEK_SET );
    330     }
    331 
    332 
    333 
    334 int pfseek ( PFile *stream, long offset, int origin )
    335     {
    336     ESR_ReturnCode rc;
    337 
    338     rc = PFileSeek ( stream, offset, origin );
    339 
    340     if ( rc != ESR_SUCCESS )
    341         return ( 1 );
    342     return ( 0 );
    343     }
    344 
    345 
    346 
    347 long pftell ( PFile *stream )
    348     {
    349     ESR_ReturnCode  rc;
    350     size_t          result;
    351 
    352     rc = PFileGetPosition ( stream, &result );
    353 
    354     if ( rc != ESR_SUCCESS )
    355         return ( -1 );
    356     return ( result );
    357     }
    358 
    359 
    360 
    361 int pfeof ( PFile *stream )
    362     {
    363     ESR_BOOL eof;
    364 
    365     PFileIsEOF ( stream, &eof );
    366 
    367     if ( ! eof )
    368         return ( 0 );
    369         return ( 1 );
    370     }
    371 
    372 
    373 
    374 int pferror ( PFile *stream )
    375     {
    376     ESR_BOOL error;
    377 
    378     PFileIsErrorSet ( stream, &error );
    379 
    380     if ( ! error )
    381         return ( 0 );
    382     return ( 1 );
    383     }
    384 
    385 
    386 
    387 void pclearerr ( PFile *stream )
    388     {
    389 
    390     PFileClearError ( stream );
    391     }
    392 
    393 
    394 
    395 int pfflush ( PFile *stream )
    396     {
    397     ESR_ReturnCode rc;
    398 
    399     rc = PFileFlush ( stream );
    400 
    401     if ( rc != ESR_SUCCESS )
    402         return ( PEOF );
    403     return ( 0 );
    404     }
    405 
    406 
    407 
    408 LCHAR* pfgets ( LCHAR *string, int n, PFile *self )
    409     {
    410     LCHAR           *result;
    411     ESR_ReturnCode  rc;
    412 
    413     rc = PFileFgets ( self, string, n, &result );
    414 
    415     if ( rc != ESR_SUCCESS )
    416         return ( NULL );
    417     return ( result );
    418     }
    419 
    420 
    421 
    422 LINT pfgetc ( PFile *self )
    423     {
    424     ESR_ReturnCode  rc;
    425     LINT            result;
    426 
    427     rc = PFileFgetc ( self, &result );
    428 
    429     if ( rc != ESR_SUCCESS )
    430         return ( PEOF );
    431     return ( result );
    432     }
    433 
    434 
    435 
    436 int pfprintf ( PFile *stream, const LCHAR *format, ... )
    437     {
    438     ESR_ReturnCode  rc;
    439     int             result;
    440     va_list         args;
    441 
    442     va_start ( args, format );
    443     rc = PFileVfprintf ( stream, &result, format, args );
    444     va_end ( args );
    445 
    446     if ( rc != ESR_SUCCESS )
    447         return ( -1 );
    448     return ( result );
    449     }
    450 
    451 
    452 
    453 int pvfprintf ( PFile *stream, const LCHAR *format, va_list argptr )
    454     {
    455     ESR_ReturnCode  rc;
    456     int             result;
    457 
    458     rc = PFileVfprintf ( stream, &result, format, argptr );
    459 
    460     if ( rc != ESR_SUCCESS )
    461         return ( -1 );
    462     return ( result );
    463     }
    464 
    465 
    466 ESR_ReturnCode pf_convert_backslashes_to_forwardslashes ( LCHAR *string_to_convert )
    467     {
    468     ESR_ReturnCode  rc;
    469     int             string_status;
    470 
    471     if ( string_to_convert != NULL )
    472         {
    473 	string_status = lstrreplace ( string_to_convert, L('\\'), L('/') );
    474 
    475 	if ( string_status == 0 )
    476 	    rc = ESR_SUCCESS;
    477 	else
    478 	    rc = ESR_INVALID_ARGUMENT;
    479 	}
    480     else
    481 	{
    482 	rc = ESR_INVALID_ARGUMENT;
    483 	}
    484     return ( rc );
    485     }
    486 
    487 
    488 
    489 ESR_ReturnCode pf_is_path_absolute ( const LCHAR* input_path, ESR_BOOL* isAbsolute )
    490     {
    491     ESR_ReturnCode rc;
    492     LCHAR path [P_PATH_MAX];
    493 
    494     if ( isAbsolute != NULL )
    495         {
    496 	LSTRCPY ( path, input_path );
    497 	rc = pf_convert_backslashes_to_forwardslashes ( path );
    498 
    499 	if ( rc == ESR_SUCCESS )
    500 	    {
    501 	    if ( ( path [0] == '/' ) || ( ( LISALPHA ( path [0] ) ) && ( path [1] == ':' ) && ( path [2] == '/' ) ) )
    502 		*isAbsolute = ESR_TRUE;
    503 	    else
    504 		*isAbsolute = ESR_FALSE;
    505 	    }
    506 	}
    507     else
    508 	{
    509 	rc = ESR_INVALID_ARGUMENT;
    510 	}
    511     return ( rc );
    512     }
    513 
    514