summaryrefslogtreecommitdiff
path: root/src/mcpp-language.c
diff options
context:
space:
mode:
authorkx <kx@radix-linux.su>2026-10-01 12:02:28 +0300
committerkx <kx@radix-linux.su>2026-10-01 12:02:28 +0300
commitba1b04d64bdfaf377915b22f77520216ebe47674 (patch)
tree044343035c28b2b04ca9725f26e9b7c39342d19c /src/mcpp-language.c
parent124b140798456778e2a96851cc7268aa9a726698 (diff)
downloadmcpu-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.c108
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 );
+ }
+}