summaryrefslogtreecommitdiff
path: root/modules/CIAO/tools/IDL3_to_IDL2/identifier_helper.cpp
blob: 9b8a255b9c531bb663e57d1f1f8343f1b0b74ed5 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* -*- c++ -*- */
// $Id$

#include "identifier_helper.h"
#include "utl_identifier.h"
#include "utl_string.h"
#include "fe_private.h"
#include "global_extern.h"

Identifier *
IdentifierHelper::original_local_name (Identifier * local_name)
{
  Identifier * id = 0;
  const char *lname = local_name->get_string ();
   
  // Remove _cxx_ if:
  // 1. it occurs and
  // 2. it occurs at the beginning of the string and
  // 3. the rest of the string is a C++ keyword
  if (ACE_OS::strstr (lname, "_cxx_") == lname)
    {
      TAO_IDL_CPP_Keyword_Table cpp_key_tbl;
      
      unsigned int len =
        static_cast<unsigned int> (ACE_OS::strlen (lname + 5));
        
      const TAO_IDL_CPP_Keyword_Entry *entry =
        cpp_key_tbl.lookup (lname + 5, len);

      if (entry != 0)
        {
          // Remove _cxx_ and assign to the Identifier variable.
          ACE_NEW_RETURN (id,
                          Identifier (lname + 5),
                          0);
        }
    }
    
  if (id == 0)
    {
      id = local_name->copy ();
    }
   
  return id;
}

ACE_CString
IdentifierHelper::orig_sn (UTL_IdList * sn, bool appended_to)
{
  ACE_CString retval;
  bool first = true;
  bool second = false;
  Identifier *id = 0;

  for (UTL_IdListActiveIterator i (sn); !i.is_done ();)
    {
      if (!first)
        {
          retval += "::";
        }
      else if (second)
        {
          first = second = false;
        }

      id = IdentifierHelper::original_local_name (i.item ());
      i.next ();
      
      // Append the identifier.
      retval +=
        appended_to && i.is_done ()
          ? id->get_string ()
          : IdentifierHelper::try_escape (id).c_str ();

       if (first)
        {
          if (ACE_OS::strcmp (id->get_string (), "") != 0)
            {
              // Does not start with a "".
              first = false;
            }
          else
            {
              second = true;
            }
        }
        
      id->destroy ();
      delete id;
      id = 0;
    }
  
  return retval;
}

bool
IdentifierHelper::is_idl_keyword (Identifier * local_name)
{
  UTL_String utl_tmp (local_name->get_string ());
  ACE_CString ext_id (utl_tmp.get_canonical_rep (),
                      0,
                      false);

  int status = idl_global->idl_keywords ().find (ext_id);
  utl_tmp.destroy ();

  return status == 0;
}

ACE_CString 
IdentifierHelper::try_escape (Identifier * local_name)
{
  ACE_CString s_local_name (local_name->get_string ());

  if (IdentifierHelper::is_idl_keyword (local_name))
    {
      return "_" + s_local_name;
    }
  else
    {
      return s_local_name;
    }
}