/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* UTF-8 and Unicode string manipulation functions, plus convenience
* functions for working with java/lang/String.
*/
#ifndef DALVIK_STRING_H_
#define DALVIK_STRING_H_
#include <string>
#include <vector>
/*
* (This is private to UtfString.c, but we cheat a bit and also use it
* for InlineNative.c. Not really worth creating a separate header.)
*
* We can avoid poking around in gDvm by hard-coding the expected values of
* the String field offsets. This will be annoying if String is in flux
* or the VM field layout is changing, so we use defines here to make it
* easy to switch back to the gDvm version.
*
* The values are checked for correctness during startup.
*/
//#define USE_GLOBAL_STRING_DEFS
#ifdef USE_GLOBAL_STRING_DEFS
# define STRING_FIELDOFF_VALUE gDvm.offJavaLangString_value
# define STRING_FIELDOFF_OFFSET gDvm.offJavaLangString_offset
# define STRING_FIELDOFF_COUNT gDvm.offJavaLangString_count
# define STRING_FIELDOFF_HASHCODE gDvm.offJavaLangString_hashCode
#else
# define STRING_FIELDOFF_VALUE 8
# define STRING_FIELDOFF_HASHCODE 12
# define STRING_FIELDOFF_OFFSET 16
# define STRING_FIELDOFF_COUNT 20
#endif
/*
* Hash function for modified UTF-8 strings.
*/
u4 dvmComputeUtf8Hash(const char* str);
/*
* Hash function for string objects. Ensures the hash code field is
* populated and returns its value.
*/
u4 dvmComputeStringHash(StringObject* strObj);
/*
* Create a java.lang.String[] from a vector of C++ strings.
*
* The caller must call dvmReleaseTrackedAlloc() on the returned array,
* but not on the individual elements.
*
* Returns NULL and throws an exception on failure.
*/
ArrayObject* dvmCreateStringArray(const std::vector<std::string>& strings);
/*
* Create a java/lang/String from a C string.
*
* The caller must call dvmReleaseTrackedAlloc() on the return value.
*
* Returns NULL and throws an exception on failure.
*/
StringObject* dvmCreateStringFromCstr(const char* utf8Str);
/*
* Create a java/lang/String from a C++ string.
*
* The caller must call dvmReleaseTrackedAlloc() on the return value.
*
* Returns NULL and throws an exception on failure.
*/
StringObject* dvmCreateStringFromCstr(const std::string& utf8Str);
/*
* Create a java/lang/String from a C string, given its UTF-16 length
* (number of UTF-16 code points).
*
* The caller must call dvmReleaseTrackedAlloc() on the return value.
*
* Returns NULL and throws an exception on failure.
*/
StringObject* dvmCreateStringFromCstrAndLength(const char* utf8Str,
u4 utf16Length);
/*
* Compute the number of characters in a "modified UTF-8" string. This will
* match the result from strlen() so long as there are no multi-byte chars.
*/
size_t dvmUtf8Len(const char* utf8Str);
/*
* Convert a UTF-8 string to UTF-16. "utf16Str" must have enough room
* to hold the output.
*/
void dvmConvertUtf8ToUtf16(u2* utf16Str, const char* utf8Str);
/*
* Create a java/lang/String from a Unicode string.
*
* The caller must call dvmReleaseTrackedAlloc() on the return value.
*/
StringObject* dvmCreateStringFromUnicode(const u2* unichars, int len);
/*
* Create a UTF-8 C string from a java/lang/String. Caller must free
* the result.
*
* Returns NULL if "jstr" is NULL.
*/
char* dvmCreateCstrFromString(const StringObject* jstr);
/*
* Create a UTF-8 C string from a region of a java/lang/String. (Used by
* the JNI GetStringUTFRegion call.)
*/
void dvmGetStringUtfRegion(const StringObject* jstr,
int start, int len, char* buf);
/*
* Compare two string objects. (This is a dvmHashTableLookup() callback.)
*/
int dvmHashcmpStrings(const void* vstrObj1, const void* vstrObj2);
#endif // DALVIK_STRING_H_