From 2d3b3960491716876f75470fd65caa5e10ef3d0e Mon Sep 17 00:00:00 2001 From: coryan Date: Fri, 1 Sep 2000 05:06:42 +0000 Subject: ChangeLogTag:Thu Aug 31 16:31:04 2000 Carlos O'Ryan --- TAO/tao/Object_KeyC.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'TAO/tao/Object_KeyC.cpp') diff --git a/TAO/tao/Object_KeyC.cpp b/TAO/tao/Object_KeyC.cpp index 7b6d0db4b97..22ec4287bc6 100644 --- a/TAO/tao/Object_KeyC.cpp +++ b/TAO/tao/Object_KeyC.cpp @@ -48,4 +48,83 @@ CORBA::TypeCode _tc_TAO_tc_TAO_ObjectKey (CORBA::tk_alias, sizeof CORBA::TypeCode_ptr TAO_tc_ObjectKey = &_tc_TAO_tc_TAO_ObjectKey; +void +TAO_ObjectKey::encode_sequence_to_string (char * &str, + const TAO_Unbounded_Sequence &seq) +{ + // We must allocate a buffer which is (gag) 3 times the length + // of the sequence, which is the length required in the worst-case + // scenario of all non-printable characters. + // + // There are two strategies here...we could allocate all that space here, + // fill it up, then copy-allocate new space of just the right length. + // OR, we could just return this space. The classic time-space tradeoff, + // and for now we'll let time win out, which means that we only do the + // allocation once. + u_int len = 3 * seq.length (); /* space for zero termination not needed */; + str = CORBA::string_alloc (len); + + char *cp = str; + + for (u_int i = 0; + cp < (cp + len) && i < seq.length(); + ++i) + { + u_char byte = seq[i]; + if (isprint (byte) && byte != '\\') + { + *cp++ = (char) byte; + continue; + } + + *cp++ = '\\'; + *cp++ = ACE::nibble2hex ((byte >> 4) & 0x0f); + *cp++ = ACE::nibble2hex (byte & 0x0f); + } + // Zero terminate + *cp = '\0'; +} + +void +TAO_ObjectKey::decode_string_to_sequence (TAO_Unbounded_Sequence &seq, + const char *str) +{ + if (str == 0) + { + seq.length (0); + return; + } + + u_int length = ACE_OS::strlen (str); + const char *eos = str + length; + const char *cp = str; + + // Set the length of the sequence to be as long as + // we'll possibly need...we'll reset it to the actual + // length later. + seq.length (length); + + u_int i = 0; + for (; + cp < eos && i < seq.length (); + i++) + { + if (*cp == '\\') + { + // This is an escaped non-printable, + // so we decode the hex values into + // the sequence's octet + seq[i] = (u_char) (ACE::hex2byte (cp[1]) << 4); + seq[i] |= (u_char) ACE::hex2byte (cp[2]); + cp += 3; + } + else + // Copy it in + seq[i] = *cp++; + } + + // Set the length appropriately + seq.length (i); +} + // **************************************************************** -- cgit v1.2.1