/*Create a new String *invoked by:OPC_LDC */ O createJstring(char *s) { if (java_lang_String == NULL) java_lang_String = loadClass("java/lang/String"); ClassBlock_t *cb = CLASS_CB(java_lang_String); if (!inited) initString(); O char_obj, string_obj; FieldBlock_t *fb; int length, offset; length = strlen(s); char_obj = char2Char(s); short *data = (short *) char_obj->data; unsigned char *ss = (unsigned char *) s; convertUtf8(ss, data); string_obj = allocObject(java_lang_String); string_obj->type = OBJECT_STRING; OBJECT_DATA(string_obj, value_offset - 1, O) = char_obj; OBJECT_DATA(string_obj, count_offset - 1, int) = length; //*(((Object**)string_obj->data)+offset-1) = char_obj; string_obj->cb = cb; string_obj->el_size = sizeof(int); return string_obj; }
Object *createString(const char* utf8) { int len = utf8Len(utf8); unsigned short *data; Object *array; Object *ob; if((array = allocTypeArray(T_CHAR, len)) == NULL || (ob = allocObject(string_class)) == NULL) return NULL; data = (unsigned short *)ARRAY_DATA(array); convertUtf8(utf8, data); INST_DATA(ob)[count_offset] = len; INST_DATA(ob)[value_offset] = (uintptr_t)array; return ob; }
char *mangleString(char *utf8) { int len = utf8Len(utf8); unsigned short *unicode = (unsigned short*) sysMalloc(len * 2); char *mangled, *mngldPtr; int i, mangledLen = 0; convertUtf8(utf8, unicode); /* Work out the length of the mangled string */ for(i = 0; i < len; i++) { unsigned short c = unicode[i]; switch(c) { case '_': case ';': case '[': mangledLen += 2; break; default: mangledLen += isalnum(c) ? 1 : 6; break; } } mangled = mngldPtr = (char*) sysMalloc(mangledLen + 1); /* Construct the mangled string */ for(i = 0; i < len; i++) { unsigned short c = unicode[i]; switch(c) { case '_': *mngldPtr++ = '_'; *mngldPtr++ = '1'; break; case ';': *mngldPtr++ = '_'; *mngldPtr++ = '2'; break; case '[': *mngldPtr++ = '_'; *mngldPtr++ = '3'; break; case '/': *mngldPtr++ = '_'; break; default: if(isalnum(c)) *mngldPtr++ = c; else mngldPtr += sprintf(mngldPtr, "_0%04x", c); break; } } *mngldPtr = '\0'; sysFree(unicode); return mangled; }