sheepy

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

on_indentation.i (2198B)


      1 /* (C) 2010 Frank-Rene Schaefer 
      2  * ABSOLUTELY NO WARRANTY         */
      3 #ifndef __QUEX_INCLUDE_GUARD__ANALYZER__MEMBER__ON_INDENTATION_I
      4 #define __QUEX_INCLUDE_GUARD__ANALYZER__MEMBER__ON_INDENTATION_I
      5 
      6 QUEX_NAMESPACE_MAIN_OPEN
      7 
      8 #include "token-sending"
      9 #include "analyzerCounter"
     10 
     11 QUEX_INLINE __QUEX_TYPE_ANALYZER_RETURN_VALUE  
     12 QUEX_NAME(on_indentation)(QUEX_TYPE_ANALYZER*    me, 
     13                           QUEX_TYPE_INDENTATION  Indentation, 
     14                           QUEX_TYPE_LEXATOM*   Begin)
     15 {
     16 #   define self  (*me)
     17     QUEX_NAME(IndentationStack)*  stack = &me->counter._indentation_stack;
     18 #   if defined(QUEX_OPTION_TOKEN_POLICY_SINGLE)
     19     register QUEX_TYPE_TOKEN_ID __self_result_token_id 
     20            = (QUEX_TYPE_TOKEN_ID)__QUEX_SETTING_TOKEN_ID_UNINITIALIZED;
     21 #   endif
     22     __QUEX_IF_TOKEN_REPETITION_SUPPORT(QUEX_TYPE_INDENTATION* start = 0);
     23     (void)Begin;
     24 
     25     if( Indentation > *(stack->back) ) {
     26         self_send(__QUEX_SETTING_TOKEN_ID_INDENT);
     27         ++(stack->back);
     28         if( stack->back == stack->memory_end ) QUEX_ERROR_EXIT("Indentation stack overflow.");
     29         *(stack->back) = Indentation;
     30         __QUEX_RETURN;
     31     }
     32     else if( Indentation == *(stack->back) ) {
     33         self_send(__QUEX_SETTING_TOKEN_ID_NODENT);
     34     }
     35     else {
     36         __QUEX_IF_TOKEN_REPETITION_SUPPORT(start = stack->back);
     37         /* From Above: (NOT Indentation > *back) and (NOT Indentation == *back),
     38          * Thus:       Indentation < *back.                                      */
     39         do {
     40             __QUEX_IF_TOKEN_REPETITION_SUPPORT_DISABLED(self_send(__QUEX_SETTING_TOKEN_ID_DEDENT));
     41             --(stack->back);
     42         } while( Indentation < *(stack->back) ); 
     43 
     44         if( Indentation == *(stack->back) ) { /* 'Landing' must happen on indentation border. */
     45             __QUEX_IF_TOKEN_REPETITION_SUPPORT(self_send_n((size_t)(start - stack->back), 
     46                                                            __QUEX_SETTING_TOKEN_ID_DEDENT));     
     47         } else {
     48             QUEX_ERROR_EXIT("Indentation Error");
     49         }
     50     }
     51     __QUEX_RETURN;
     52 #   undef self 
     53 }
     54 QUEX_NAMESPACE_MAIN_CLOSE
     55 
     56 #endif /* __QUEX_INCLUDE_GUARD__ANALYZER__MEMBER__ON_INDENTATION_I */
     57