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