sheepy

build system (sheepy) and package manager (spm) for C
git clone https://spartatek.se/git/sheepy.git
Log | Files | Refs | README | LICENSE

ByteLoader_FILE.i (5119B)


      1 /* vim: set ft=c:
      2  * (C) Frank-Rene Schaefer */
      3 #ifndef  __QUEX_INCLUDE_GUARD__BUFFER__BYTES__BYTE_LOADER_FILE_I
      4 #define  __QUEX_INCLUDE_GUARD__BUFFER__BYTES__BYTE_LOADER_FILE_I
      5 
      6 #include "MemoryManager"
      7 
      8 QUEX_NAMESPACE_MAIN_OPEN
      9 
     10 QUEX_INLINE void                       QUEX_NAME(ByteLoader_FILE_construct)(QUEX_NAME(ByteLoader_FILE)* me, __QUEX_STD_FILE* fh);
     11 QUEX_INLINE QUEX_TYPE_STREAM_POSITION  QUEX_NAME(ByteLoader_FILE_tell)(QUEX_NAME(ByteLoader)* me);
     12 QUEX_INLINE void                       QUEX_NAME(ByteLoader_FILE_seek)(QUEX_NAME(ByteLoader)* me, QUEX_TYPE_STREAM_POSITION Pos);
     13 QUEX_INLINE size_t                     QUEX_NAME(ByteLoader_FILE_load)(QUEX_NAME(ByteLoader)* me, void* buffer, const size_t ByteN, bool*);
     14 QUEX_INLINE void                       QUEX_NAME(ByteLoader_FILE_delete_self)(QUEX_NAME(ByteLoader)* me);
     15 QUEX_INLINE bool                       QUEX_NAME(ByteLoader_FILE_compare_handle)(const QUEX_NAME(ByteLoader)* alter_ego_A, 
     16                                                                                  const QUEX_NAME(ByteLoader)* alter_ego_B);
     17 
     18 QUEX_INLINE QUEX_NAME(ByteLoader)*    
     19 QUEX_NAME(ByteLoader_FILE_new)(FILE* fh, bool BinaryModeF)
     20 {
     21     QUEX_NAME(ByteLoader_FILE)* me;
     22    
     23     if( ! fh ) return (QUEX_NAME(ByteLoader)*)0;
     24 
     25     me = (QUEX_NAME(ByteLoader_FILE)*)QUEXED(MemoryManager_allocate)(sizeof(QUEX_NAME(ByteLoader_FILE)),
     26                                                                      E_MemoryObjectType_BYTE_LOADER);
     27     if( ! me ) return (QUEX_NAME(ByteLoader)*)0;
     28 
     29     QUEX_NAME(ByteLoader_FILE_construct)(me, fh);
     30     me->base.binary_mode_f = BinaryModeF;
     31 
     32     return &me->base;
     33 }
     34 
     35 QUEX_INLINE QUEX_NAME(ByteLoader)*    
     36 QUEX_NAME(ByteLoader_FILE_new_from_file_name)(const char* FileName)
     37 {
     38     __QUEX_STD_FILE*        fh = fopen(FileName, "rb");
     39     QUEX_NAME(ByteLoader)*  alter_ego;
     40 
     41     if( ! fh ) {
     42         return (QUEX_NAME(ByteLoader)*)0;
     43     }
     44     alter_ego = QUEX_NAME(ByteLoader_FILE_new)(fh, true);
     45     if( ! alter_ego ) {
     46         return (QUEX_NAME(ByteLoader)*)0;
     47     }
     48     alter_ego->handle_ownership = E_Ownership_LEXICAL_ANALYZER;
     49     return alter_ego;
     50 }
     51 
     52 QUEX_INLINE void
     53 QUEX_NAME(ByteLoader_FILE_construct)(QUEX_NAME(ByteLoader_FILE)* me, __QUEX_STD_FILE* fh)
     54 {
     55     /* IMPORTANT: input_handle must be set BEFORE call to constructor!
     56      *            Constructor does call 'tell()'                             */
     57     me->input_handle = fh;
     58 
     59     QUEX_NAME(ByteLoader_construct)(&me->base,
     60                          QUEX_NAME(ByteLoader_FILE_tell),
     61                          QUEX_NAME(ByteLoader_FILE_seek),
     62                          QUEX_NAME(ByteLoader_FILE_load),
     63                          QUEX_NAME(ByteLoader_FILE_delete_self),
     64                          QUEX_NAME(ByteLoader_FILE_compare_handle));
     65 }
     66 
     67 QUEX_INLINE void    
     68 QUEX_NAME(ByteLoader_FILE_delete_self)(QUEX_NAME(ByteLoader)* alter_ego)
     69 {
     70     QUEX_NAME(ByteLoader_FILE)* me = (QUEX_NAME(ByteLoader_FILE)*)(alter_ego);
     71 
     72     if( me->input_handle && me->base.handle_ownership == E_Ownership_LEXICAL_ANALYZER ) {
     73         fclose(me->input_handle);
     74     }
     75     QUEXED(MemoryManager_free)(me, E_MemoryObjectType_BYTE_LOADER);
     76 }
     77 
     78 QUEX_INLINE QUEX_TYPE_STREAM_POSITION    
     79 QUEX_NAME(ByteLoader_FILE_tell)(QUEX_NAME(ByteLoader)* alter_ego)            
     80 { 
     81     QUEX_NAME(ByteLoader_FILE)* me = (QUEX_NAME(ByteLoader_FILE)*)(alter_ego);
     82 
     83     return (QUEX_TYPE_STREAM_POSITION)ftell(me->input_handle); 
     84 }
     85 
     86 QUEX_INLINE void    
     87 QUEX_NAME(ByteLoader_FILE_seek)(QUEX_NAME(ByteLoader)* alter_ego, QUEX_TYPE_STREAM_POSITION Pos) 
     88 { 
     89     QUEX_NAME(ByteLoader_FILE)* me = (QUEX_NAME(ByteLoader_FILE)*)(alter_ego);
     90     fseek(me->input_handle, (long)Pos, SEEK_SET); 
     91 }
     92 
     93 QUEX_INLINE size_t  
     94 QUEX_NAME(ByteLoader_FILE_load)(QUEX_NAME(ByteLoader)* alter_ego, 
     95                                 void*                  buffer, 
     96                                 const size_t           ByteN, 
     97                                 bool*                  end_of_stream_f) 
     98 { 
     99     QUEX_NAME(ByteLoader_FILE)* me = (QUEX_NAME(ByteLoader_FILE)*)(alter_ego);
    100     size_t                      loaded_byte_n = fread(buffer, 1, ByteN, me->input_handle); 
    101 #   if 0
    102     int    i;
    103     printf("#load @%i:         [", (int)ftell(((QUEX_NAME(ByteLoader_FILE)*)me)->input_handle));
    104     for(i=0; i<loaded_byte_n; ++i) printf("%02X.", ((uint8_t*)buffer)[i]);
    105     printf("]\n");
    106 #   endif
    107     *end_of_stream_f = feof(me->input_handle) ? true : false;
    108     return loaded_byte_n;
    109 }
    110 
    111 QUEX_INLINE bool  
    112 QUEX_NAME(ByteLoader_FILE_compare_handle)(const QUEX_NAME(ByteLoader)* alter_ego_A, 
    113                                           const QUEX_NAME(ByteLoader)* alter_ego_B) 
    114 /* RETURNS: true  -- if A and B point to the same FILE object.
    115  *          false -- else.                                                   */
    116 { 
    117     const QUEX_NAME(ByteLoader_FILE)* A = (QUEX_NAME(ByteLoader_FILE)*)(alter_ego_A);
    118     const QUEX_NAME(ByteLoader_FILE)* B = (QUEX_NAME(ByteLoader_FILE)*)(alter_ego_B);
    119 
    120     return A->input_handle == B->input_handle;
    121 }
    122 
    123 QUEX_NAMESPACE_MAIN_CLOSE
    124 
    125 #endif /*  __QUEX_INCLUDE_GUARD__BUFFER__BYTES__BYTE_LOADER_FILE_I */