bufferBuffer (10200B)
1 /* vim: set ft=cpp: -*- C++ -*- */ 2 #ifndef __QUEX_INCLUDE_GUARD__BUFFER__BUFFER 3 #define __QUEX_INCLUDE_GUARD__BUFFER__BUFFER 4 5 #include"definitions" 6 #include"MemoryManager" 7 8 QUEX_NAMESPACE_MAIN_OPEN 9 10 typedef struct QUEX_SETTING_USER_CLASS_DECLARATION_EPILOG { 11 E_Ownership ownership; 12 13 /* (*) Buffer Memory Setup: 14 * memory[0] = lower buffer limit code lexatom 15 * memory[1] = first char of content 16 * ... 17 * memory[BUFFER_SIZE-2] = last char of content 18 * memory[BUFFER_SIZE-1] = upper buffer limit code lexatom */ 19 QUEX_TYPE_LEXATOM* _front; /* first lexatom in buffer (BLC) */ 20 QUEX_TYPE_LEXATOM* _back; /* last lexatom in buffer (BLC) */ 21 22 } QUEX_NAME(BufferMemory); 23 24 QUEX_INLINE size_t QUEX_NAME(BufferMemory_size)(QUEX_NAME(BufferMemory)*); 25 QUEX_INLINE void QUEX_NAME(BufferMemory_construct)(QUEX_NAME(BufferMemory)* me, 26 QUEX_TYPE_LEXATOM* Memory, 27 const size_t Size, 28 E_Ownership Ownership); 29 QUEX_INLINE void QUEX_NAME(BufferMemory_destruct)(QUEX_NAME(BufferMemory)* me); 30 31 typedef struct QUEX_SETTING_USER_CLASS_DECLARATION_EPILOG QUEX_NAME(Buffer_tag) { 32 /* Buffer of lexatoms on which the analyzer runs. 33 * 34 * Character Stream: 35 * (by LexatomLoader) 36 * 37 * lexatom_index_end_of_stream ------------------------. 38 * lexatom_index_begin -----------------. | 39 * | | 40 * lexatom index: 0 1 2 3 4 6 6 7 8 9 10 11 12 13 14 ... 41 * 42 * stream: [aa.bb.cc.dd.ee.ff:gg.hh.ii.jj.kk.ll:mm.nn.oo.pp.qq ... 43 * .---------' | 44 * Buffer: | .---------' 45 * [00|gg.hh.ii.jj.kk.ll|00.??.??.??.??|00] 46 * | | | 47 * _front ----------' | | 48 * input.end_p --------------------------' | 49 * _back -----------------------------------------------' 50 * 51 * 'lexatom_index_end_of_stream == -1' => end of stream has not yet been 52 * detected. */ 53 54 QUEX_NAME(BufferMemory) _memory; 55 56 /* (*) Iterator positions for lexical analysis */ 57 QUEX_TYPE_LEXATOM* _read_p; 58 QUEX_TYPE_LEXATOM* _lexeme_start_p; 59 60 struct { 61 QUEX_TYPE_LEXATOM* end_p; 62 QUEX_TYPE_STREAM_POSITION lexatom_index_begin; 63 /* Character index + 1 of the last lexatom in the stream. */ 64 QUEX_TYPE_STREAM_POSITION lexatom_index_end_of_stream; 65 } input; 66 67 /* (*) Information about previous content: 68 * 69 * _lexatom_at_lexeme_start: lexatom that has been covered by a 70 * terminating zero. Reset upon restart of 71 * analysis. 72 * _lexatom_at_lexeme_start: Used to check whether the lexeme's 73 * preceeding lexatom was newline. 74 * (i.e. for begin-of-line pre-context). */ 75 QUEX_TYPE_LEXATOM _lexatom_at_lexeme_start; 76 # ifdef __QUEX_OPTION_SUPPORT_BEGIN_OF_LINE_PRE_CONDITION 77 QUEX_TYPE_LEXATOM _lexatom_before_lexeme_start; 78 # endif 79 80 struct QUEX_NAME(LexatomLoader_tag)* filler; 81 82 void* (*fill)(struct QUEX_NAME(Buffer_tag)* me, 83 const void* ContentBegin, 84 const void* ContentEnd); 85 void (*fill_prepare)(struct QUEX_NAME(Buffer_tag)* me, 86 void** begin_p, 87 const void** end_p); 88 void (*fill_finish)(struct QUEX_NAME(Buffer_tag)* me, 89 const void* FilledEndP); 90 91 /* Event handlers: 92 * on_content_change: If the user maintained pointers into the buffer, 93 * this callback indicates that everything from 'BeginP' 94 * to 'EndP' needs to be copied somewhere else. 95 * on_overflow: Distance between current '_read_p' and the lexeme start 96 * plus the fallback region are too big for the current 97 * buffer's size. */ 98 void (*on_content_change)(const QUEX_TYPE_LEXATOM* BeginP, 99 const QUEX_TYPE_LEXATOM* EndP); 100 void (*on_overflow)(struct QUEX_NAME(Buffer_tag)*, bool ForwardF); 101 102 } QUEX_NAME(Buffer); 103 104 QUEX_INLINE void QUEX_NAME(Buffer_construct)(QUEX_NAME(Buffer)* me, 105 struct QUEX_NAME(LexatomLoader_tag)* filler, 106 QUEX_TYPE_LEXATOM* memory, 107 const size_t MemorySize, 108 QUEX_TYPE_LEXATOM* EndOfFileP, 109 E_Ownership Ownership); 110 111 /* Constructor, destructor, reset. */ 112 QUEX_INLINE void QUEX_NAME(Buffer_reset)(QUEX_NAME(Buffer)* me, 113 struct QUEX_NAME(LexatomLoader_tag)* filler); 114 115 QUEX_INLINE void QUEX_NAME(Buffer_destruct)(QUEX_NAME(Buffer)* me); 116 117 /* Moving buffer content. */ 118 QUEX_INLINE ptrdiff_t QUEX_NAME(Buffer_move_away_passed_content)(QUEX_NAME(Buffer)* me, 119 QUEX_TYPE_LEXATOM** position_register, 120 const size_t PositionRegisterN); 121 QUEX_INLINE ptrdiff_t QUEX_NAME(Buffer_move_away_upfront_content)(QUEX_NAME(Buffer)* me); 122 123 /* Automatic loading of buffer content (during analysis). */ 124 QUEX_INLINE E_LoadResult 125 QUEX_NAME(Buffer_load_forward)(QUEX_NAME(Buffer)* me, 126 QUEX_TYPE_LEXATOM** position_register, 127 const size_t PositionRegisterN); 128 QUEX_INLINE E_LoadResult 129 QUEX_NAME(Buffer_load_backward)(QUEX_NAME(Buffer)* me); 130 QUEX_INLINE bool QUEX_NAME(Buffer_move_and_load_backward)(QUEX_NAME(Buffer)* me, 131 QUEX_TYPE_STREAM_POSITION NewCharacterIndexBegin); 132 QUEX_INLINE bool QUEX_NAME(Buffer_move_and_load_forward)(QUEX_NAME(Buffer)* me, 133 QUEX_TYPE_STREAM_POSITION NewCharacterIndexBegin, 134 QUEX_TYPE_STREAM_POSITION MinCharacterIndexInBuffer); 135 /* User's manual buffer filling. */ 136 QUEX_INLINE void* QUEX_NAME(Buffer_fill)(QUEX_NAME(Buffer)* me, 137 const void* ContentBegin, 138 const void* ContentEnd); 139 QUEX_INLINE void QUEX_NAME(Buffer_fill_prepare)(QUEX_NAME(Buffer)* me, 140 void** begin_p, 141 const void** end_p); 142 QUEX_INLINE void QUEX_NAME(Buffer_fill_finish)(QUEX_NAME(Buffer)* me, 143 const void* FilledEndP); 144 145 QUEX_INLINE void QUEX_NAME(Buffer_print_this)(QUEX_NAME(Buffer)*); 146 QUEX_INLINE void QUEX_NAME(Buffer_print_content)(QUEX_NAME(Buffer)*); 147 148 /* Member attributes. */ 149 QUEX_INLINE bool QUEX_NAME(Buffer_is_empty)(QUEX_NAME(Buffer)* me); 150 QUEX_INLINE bool QUEX_NAME(Buffer_is_end_of_file)(QUEX_NAME(Buffer)*); 151 QUEX_INLINE bool QUEX_NAME(Buffer_is_begin_of_file)(QUEX_NAME(Buffer)*); 152 153 QUEX_INLINE void QUEX_NAME(Buffer_register_content)(QUEX_NAME(Buffer)* me, 154 QUEX_TYPE_LEXATOM* EndOfInputP, 155 QUEX_TYPE_STREAM_POSITION CharacterIndexBegin); 156 QUEX_INLINE void QUEX_NAME(Buffer_register_eos)(QUEX_NAME(Buffer)* me, 157 QUEX_TYPE_STREAM_POSITION CharacterIndexEndOfStream); 158 QUEX_INLINE QUEX_TYPE_STREAM_POSITION 159 QUEX_NAME(Buffer_input_lexatom_index_end)(QUEX_NAME(Buffer)* me); 160 QUEX_INLINE QUEX_TYPE_STREAM_POSITION 161 QUEX_NAME(Buffer_input_lexatom_index_begin)(QUEX_NAME(Buffer)* me); 162 QUEX_INLINE size_t QUEX_NAME(Buffer_content_size)(QUEX_NAME(Buffer)*); 163 164 /* Tell & seek '_read_p' to/from lexatom index. */ 165 QUEX_INLINE QUEX_TYPE_STREAM_POSITION 166 QUEX_NAME(Buffer_tell)(QUEX_NAME(Buffer)*); 167 QUEX_INLINE void QUEX_NAME(Buffer_seek)(QUEX_NAME(Buffer)*, 168 const QUEX_TYPE_STREAM_POSITION CharacterIndex); 169 QUEX_INLINE bool QUEX_NAME(Buffer_seek_forward)(QUEX_NAME(Buffer)*, const ptrdiff_t CharacterN); 170 QUEX_INLINE bool QUEX_NAME(Buffer_seek_backward)(QUEX_NAME(Buffer)*, const ptrdiff_t CharacterN); 171 172 QUEX_NAMESPACE_MAIN_CLOSE 173 #include "LexatomLoader" 174 175 #endif /* __QUEX_INCLUDE_GUARD__BUFFER__BUFFER */