]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* include/jvm.h: New class _Jv_TempUTFString (helper class for
authormembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Aug 2003 11:48:59 +0000 (11:48 +0000)
committermembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Aug 2003 11:48:59 +0000 (11:48 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70564 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/include/jvm.h

index 5da7125345f26fb5baee87ebabd68654f4547451..95ccb648c9be47c372d9b6b02744fddfd6c4984c 100644 (file)
@@ -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>
 
        PR libgcj/11951:
index 941b24e0e9064720a8594fc1130328627ad1a7ee..9af9dc7c6e59540062b1d5138ec188791d7585ee 100644 (file)
@@ -149,6 +149,79 @@ extern jboolean _Jv_equalUtf8Consts (_Jv_Utf8Const *, _Jv_Utf8Const *);
 extern jboolean _Jv_equal (_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.
 #define StringClass java::lang::String::class$