sheepy

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

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