diff options
| author | kx <kx@radix-linux.su> | 2026-10-01 12:02:28 +0300 |
|---|---|---|
| committer | kx <kx@radix-linux.su> | 2026-10-01 12:02:28 +0300 |
| commit | ba1b04d64bdfaf377915b22f77520216ebe47674 (patch) | |
| tree | 044343035c28b2b04ca9725f26e9b7c39342d19c /src/mcpp-language.c | |
| parent | 124b140798456778e2a96851cc7268aa9a726698 (diff) | |
| download | mcpu-cpp-1.0.2.tar.xz | |
Version 1.0.21.0.2
Diffstat (limited to 'src/mcpp-language.c')
| -rw-r--r-- | src/mcpp-language.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/mcpp-language.c b/src/mcpp-language.c new file mode 100644 index 0000000..d224bc8 --- /dev/null +++ b/src/mcpp-language.c @@ -0,0 +1,108 @@ +#include <defs.h> + +static int +text_equal_ascii_nocase( const __mpu_char16_t *text, size_t length, + const char *ascii ) +{ + size_t i; + size_t ascii_length; + + if( text == NULL || ascii == NULL ) + return( 0 ); + + ascii_length = strlen( ascii ); + if( length != ascii_length ) + return( 0 ); + + for( i = 0; i < length; ++i ) + { + __mpu_char16_t c = text[i]; + unsigned char a = (unsigned char)ascii[i]; + + if( c >= 'A' && c <= 'Z' ) + c = (__mpu_char16_t)(c - 'A' + 'a'); + if( a >= 'A' && a <= 'Z' ) + a = (unsigned char)(a - 'A' + 'a'); + + if( c != (__mpu_char16_t)a ) + return( 0 ); + } + + return( 1 ); +} + +const char * +mcpu_language_name( enum mcpu_language language ) +{ + switch( language ) + { + case MCPU_LANG_0: return( "0" ); + case MCPU_LANG_DIFF: return( "diff" ); + case MCPU_LANG_DIFT: return( "dift" ); + case MCPU_LANG_ALG: return( "alg" ); + case MCPU_LANG_AS: return( "as" ); + case MCPU_LANG_AVM: return( "avm" ); + case MCPU_LANG_ACS: return( "ACS" ); + default: return( "unknown" ); + } +} + +int +mcpu_language_from_text( const __mpu_char16_t *text, size_t length, + enum mcpu_language *language ) +{ + enum mcpu_language candidate; + + if( text == NULL || language == NULL ) + return( -1 ); + + /* + * MCPU_LANG_0 is the initial base language state. It is deliberately + * not a valid #lang argument. Every accepted name comes directly from + * the internal switched-language table and is matched case-insensitively. + */ + for( candidate = MCPU_LANG_DIFF; + candidate < MCPU_LANG__COUNT; + candidate = (enum mcpu_language)(candidate + 1) ) + { + if( text_equal_ascii_nocase(text, length, + mcpu_language_name(candidate)) ) + { + *language = candidate; + return( 0 ); + } + } + + return( -1 ); +} + +const char * +mcpu_language_config_variable( enum mcpu_language language ) +{ + switch( language ) + { + case MCPU_LANG_DIFF: return( "MCPU_CPP_DIFF_INCLUDE_PATH" ); + case MCPU_LANG_DIFT: return( "MCPU_CPP_DIFT_INCLUDE_PATH" ); + case MCPU_LANG_ALG: return( "MCPU_CPP_ALG_INCLUDE_PATH" ); + case MCPU_LANG_AS: return( "MCPU_CPP_AS_INCLUDE_PATH" ); + case MCPU_LANG_AVM: return( "MCPU_CPP_AVM_INCLUDE_PATH" ); + case MCPU_LANG_ACS: return( "MCPU_CPP_ACS_INCLUDE_PATH" ); + default: return( NULL ); + } +} + + +const char * +mcpu_language_directory_name( enum mcpu_language language ) +{ + switch( language ) + { + case MCPU_LANG_DIFF: return( "diff" ); + case MCPU_LANG_DIFT: return( "dift" ); + case MCPU_LANG_ALG: return( "alg" ); + case MCPU_LANG_AS: return( "as" ); + case MCPU_LANG_AVM: return( "avm" ); + case MCPU_LANG_ACS: return( "acs" ); + default: return( NULL ); + } +} |
