jvm.h: New class _Jv_TempUTFString (helper class for getting a temporary C string from...
* include/jvm.h: New class _Jv_TempUTFString (helper class for getting a temporary C string from a jstring) New macro JV_TEMP_UTF_STRING, which leverages _Jv_TempUTFString but uses a stack buffer if the string length is less than 256 bytes. From-SVN: r70564
This commit is contained in:
parent
1b391ba942
commit
dca5e0e850
2 changed files with 81 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2003-08-19 Mohan Embar <gnustuff@thisiscool.com>
|
||||||
|
|
||||||
|
* include/jvm.h: New class _Jv_TempUTFString (helper class for
|
||||||
|
getting a temporary C string from a jstring)
|
||||||
|
New macro JV_TEMP_UTF_STRING, which leverages _Jv_TempUTFString
|
||||||
|
but uses a stack buffer if the string length is less than 256
|
||||||
|
bytes.
|
||||||
|
|
||||||
2003-08-18 Tom Tromey <tromey@redhat.com>
|
2003-08-18 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
PR libgcj/11951:
|
PR libgcj/11951:
|
||||||
|
|
|
@ -149,6 +149,79 @@ extern jboolean _Jv_equalUtf8Consts (_Jv_Utf8Const *, _Jv_Utf8Const *);
|
||||||
extern jboolean _Jv_equal (_Jv_Utf8Const *, jstring, jint);
|
extern jboolean _Jv_equal (_Jv_Utf8Const *, jstring, jint);
|
||||||
extern jboolean _Jv_equaln (_Jv_Utf8Const *, jstring, jint);
|
extern jboolean _Jv_equaln (_Jv_Utf8Const *, jstring, jint);
|
||||||
|
|
||||||
|
/* Helper class which converts a jstring to a temporary char*.
|
||||||
|
Uses the supplied buffer, if non-null. Otherwise, allocates
|
||||||
|
the buffer on the heap. Use the JV_TEMP_UTF_STRING macro,
|
||||||
|
which follows, to automatically allocate a stack buffer if
|
||||||
|
the string is small enough. */
|
||||||
|
class _Jv_TempUTFString
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_Jv_TempUTFString(jstring jstr, char* buf=0);
|
||||||
|
~_Jv_TempUTFString();
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
operator const char*() const
|
||||||
|
{
|
||||||
|
return buf_;
|
||||||
|
}
|
||||||
|
const char* buf() const
|
||||||
|
{
|
||||||
|
return buf_;
|
||||||
|
}
|
||||||
|
char* buf()
|
||||||
|
{
|
||||||
|
return buf_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
char* buf_;
|
||||||
|
bool heapAllocated_;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline _Jv_TempUTFString::_Jv_TempUTFString (jstring jstr, char* buf)
|
||||||
|
: buf_(0), heapAllocated_(false)
|
||||||
|
{
|
||||||
|
if (!jstr) return;
|
||||||
|
jsize len = JvGetStringUTFLength (jstr);
|
||||||
|
if (buf)
|
||||||
|
buf_ = buf;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buf_ = (char*) _Jv_Malloc (len+1);
|
||||||
|
heapAllocated_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
JvGetStringUTFRegion (jstr, 0, jstr->length(), buf_);
|
||||||
|
buf_[len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _Jv_TempUTFString::~_Jv_TempUTFString ()
|
||||||
|
{
|
||||||
|
if (heapAllocated_)
|
||||||
|
_Jv_Free (buf_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Macro which uses _Jv_TempUTFString. Allocates a stack-based
|
||||||
|
buffer if the string and its null terminator are <= 256
|
||||||
|
characters in length. Otherwise, a heap-based buffer is
|
||||||
|
used. The parameters to this macro are the variable name
|
||||||
|
which is an instance of _Jv_TempUTFString (above) and a
|
||||||
|
jstring.
|
||||||
|
|
||||||
|
Sample Usage:
|
||||||
|
|
||||||
|
jstring jstr = getAJString();
|
||||||
|
JV_TEMP_UTF_STRING(utfstr, jstr);
|
||||||
|
printf("The string is: %s\n", utfstr.buf());
|
||||||
|
|
||||||
|
*/
|
||||||
|
#define JV_TEMP_UTF_STRING(utfstr, jstr) \
|
||||||
|
jstring utfstr##thejstr = (jstr); \
|
||||||
|
jsize utfstr##_len = utfstr##thejstr ? JvGetStringUTFLength (utfstr##thejstr) + 1 : 0; \
|
||||||
|
char utfstr##_buf[utfstr##_len <= 256 ? utfstr##_len : 0]; \
|
||||||
|
_Jv_TempUTFString utfstr(utfstr##thejstr, sizeof(utfstr##_buf)==0 ? 0 : utfstr##_buf)
|
||||||
|
|
||||||
// FIXME: remove this define.
|
// FIXME: remove this define.
|
||||||
#define StringClass java::lang::String::class$
|
#define StringClass java::lang::String::class$
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue