#include "config.h"
#include "system.h"
#include "jcf.h"
#include "tree.h"
#include "java-tree.h"
#include "obstack.h"
#include "toplev.h"
#include "obstack.h"
static void append_unicode_mangled_name PARAMS ((const char *, int));
#ifndef HAVE_AS_UTF8
static int unicode_mangling_length PARAMS ((const char *, int));
#endif
extern struct obstack *mangle_obstack;
#ifndef HAVE_AS_UTF8
void
append_gpp_mangled_name (name, len)
const char *name;
int len;
{
int encoded_len = unicode_mangling_length (name, len);
int needs_escapes = encoded_len > 0;
char buf[6];
sprintf (buf, "%d", (needs_escapes ? encoded_len : len));
obstack_grow (mangle_obstack, buf, strlen (buf));
if (needs_escapes)
append_unicode_mangled_name (name, len);
else
obstack_grow (mangle_obstack, name, len);
}
static void
append_unicode_mangled_name (name, len)
const char *name;
int len;
{
const unsigned char *ptr;
const unsigned char *limit = (const unsigned char *)name + len;
int uuU = 0;
for (ptr = (const unsigned char *) name; ptr < limit; )
{
int ch = UTF8_GET(ptr, limit);
if ((ISALNUM (ch) && ch != 'U') || ch == '$')
obstack_1grow (mangle_obstack, ch);
else
{
char buf [9];
if (ch == '_' || ch == 'U')
{
if (ch == '_' && (uuU < 3))
{
uuU++;
obstack_1grow (mangle_obstack, ch);
}
else if (ch == 'U' && (uuU == 2))
{
uuU = 0;
obstack_grow (mangle_obstack, "U_", 2);
}
else
{
uuU = 0;
obstack_1grow (mangle_obstack, ch);
}
continue;
}
sprintf (buf, "__U%x_", ch);
obstack_grow (mangle_obstack, buf, strlen (buf));
uuU = 0;
}
}
}
static int
unicode_mangling_length (name, len)
const char *name;
int len;
{
const unsigned char *ptr;
const unsigned char *limit = (const unsigned char *)name + len;
int need_escapes = 0;
int num_chars = 0;
int uuU = 0;
for (ptr = (const unsigned char *) name; ptr < limit; )
{
int ch = UTF8_GET(ptr, limit);
if (ch < 0)
error ("internal error - invalid Utf8 name");
if ((ISALNUM (ch) && ch != 'U') || ch == '$')
num_chars++;
else
{
int encoding_length = 2;
if (ch == '_' || ch == 'U')
{
num_chars++;
if (ch == '_' && (uuU < 3))
uuU++;
else if (ch == 'U' && (uuU == 2))
{
num_chars++;
need_escapes = 1;
uuU = 0;
}
else
uuU = 0;
continue;
}
if (ch > 0xff)
encoding_length++;
if (ch > 0xfff)
encoding_length++;
num_chars += (4 + encoding_length);
need_escapes = 1;
uuU = 0;
}
}
if (need_escapes)
return num_chars;
else
return 0;
}
#else
void
append_gpp_mangled_name (name, len)
const char *name;
int len;
{
const unsigned char *ptr;
const unsigned char *limit = (const unsigned char *)name + len;
int encoded_len;
char buf [6];
for (encoded_len = 0, ptr = (const unsigned char *) name;
ptr < limit; encoded_len++)
{
int ch = UTF8_GET(ptr, limit);
if (ch < 0)
error ("internal error - invalid Utf8 name");
}
sprintf (buf, "%d", encoded_len);
obstack_grow (mangle_obstack, buf, strlen (buf));
obstack_grow (mangle_obstack, name, len);
}
#endif