summaryrefslogtreecommitdiff
path: root/src/mcpp-language.c
blob: d224bc82e3e081b8bdb30cf1311654356686016e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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 );
  }
}