#include "name-support.h"
CosNaming_Name*
ORBit_string_to_CosNaming_Name (const CORBA_char *string,
CORBA_Environment * ev)
{
CosNaming_Name *retval = CosNaming_Name__alloc ();
GPtrArray *ids = g_ptr_array_new ();
GPtrArray *kinds = g_ptr_array_new ();
gint pos = 0, i, len;
gboolean used = FALSE;
GPtrArray *append_to;
g_ptr_array_add (ids, g_string_new (""));
g_ptr_array_add (kinds, g_string_new (""));
append_to = ids;
while (*string)
{
gchar append;
switch (*string)
{
case '.':
used = TRUE;
g_return_val_if_fail (append_to != kinds, NULL);
append_to = kinds;
append = '\0';
break;
case '/':
if (used)
{
pos++;
g_ptr_array_add (ids, g_string_new (""));
g_ptr_array_add (kinds, g_string_new (""));
g_assert (ids->len == pos + 1 && kinds->len == pos + 1);
}
used = FALSE;
append_to = ids;
append = '\0';
break;
case '\\':
string++;
g_return_val_if_fail (*string == '.' ||
*string == '/' || *string == '\\', NULL);
append = *string;
break;
default:
append = *string;
used = TRUE;
break;
}
if (append)
g_string_append_c (g_ptr_array_index (append_to, pos), append);
string++;
}
len = used ? pos + 1 : pos;
retval->_buffer = CORBA_sequence_CosNaming_NameComponent_allocbuf (len);
retval->_length = len;
retval->_maximum = len;
for (i = 0; i < len; i++)
{
GString *id = g_ptr_array_index (ids, i);
GString *kind = g_ptr_array_index (kinds, i);
retval->_buffer[i].id = CORBA_string_dup (id->str);
retval->_buffer[i].kind = CORBA_string_dup (kind->str);
}
for (i = 0; i <= pos; i++)
{
g_string_free (g_ptr_array_index (ids, i), TRUE);
g_string_free (g_ptr_array_index (kinds, i), TRUE);
}
g_ptr_array_free (ids, TRUE);
g_ptr_array_free (kinds, TRUE);
return retval;
}
CORBA_char *
ORBit_CosNaming_NameComponent_to_string (const CosNaming_NameComponent *comp)
{
CORBA_char *retval;
GString *str = g_string_new ("");
CORBA_char *pos;
gboolean id_ready = FALSE;
if (!*comp->id && !*comp->kind)
g_string_append_c (str, '.');
else
{
pos = comp->id;
while (!id_ready || *pos)
{
if (!*pos)
{
/* id_ready must be FALSE */
id_ready = TRUE;
pos = comp->kind;
if (pos && *pos)
g_string_append_c (str, '.');
continue;
}
if (*pos == '\\' || *pos == '.' || *pos == '/')
g_string_append_c (str, '\\');
g_string_append_c (str, *pos);
pos++;
}
}
retval = CORBA_string_dup (str->str);
g_string_free (str, TRUE);
return retval;
}
CORBA_char *
ORBit_CosNaming_Name_to_string (const CosNaming_Name *name)
{
GString *str = g_string_new ("");
CORBA_char *retval;
gint i;
for (i = 0; i < name->_length; i++)
{
CORBA_char *comp =
ORBit_CosNaming_NameComponent_to_string (&name->_buffer[i]);
g_string_append_c (str, '/');
g_string_append (str, comp);
}
retval = CORBA_string_dup (str->str);
g_string_free (str, TRUE);
return retval;
}
syntax highlighted by Code2HTML, v. 0.9.1