⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jni-string.c

📁 java virtual machince kaffe
💻 C
字号:
/* * jni-string.c * Java Native Interface - String Handling JNI functions. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * Copyright (c) 2004, 2005 *      The Kaffe.org's developers. See ChangeLog for details. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#include "config.h"#ifdef HAVE_STRING_H#include <string.h>#endif#include "jni.h"#include "jni_i.h"#include "kaffe/jmalloc.h"#include "itypes.h"#include "object.h"#include "errors.h"#include "exception.h"#include "stringSupport.h"#include "gc.h"#include "jni_funcs.h"#include "baseClasses.h"voidKaffeJNI_ReleaseStringChars(JNIEnv* env UNUSED, jstring data UNUSED, const jchar* chars UNUSED){  /* Does nothing */}jstringKaffeJNI_NewString(JNIEnv* env UNUSED, const jchar* data, jsize len){  Hjava_lang_String* str;  BEGIN_EXCEPTION_HANDLING(NULL);  str = (Hjava_lang_String*)newObject(StringClass);  unhand(str)->offset = 0;  unhand(str)->count = len;  unhand(str)->value = (HArrayOfChar*)newArray(TYPE_CLASS(TYPE_Char), len);                     memcpy(STRING_DATA(str), data, len * sizeof(jchar));  END_EXCEPTION_HANDLING();  return (str);}jsizeKaffeJNI_GetStringLength(JNIEnv* env UNUSED, jstring data){  jsize len;  jstring data_local;  BEGIN_EXCEPTION_HANDLING(0);  data_local = unveil(data);  len = STRING_SIZE((Hjava_lang_String*)data_local);  END_EXCEPTION_HANDLING();  return (len);}const jchar*KaffeJNI_GetStringChars(JNIEnv* env UNUSED, jstring data, jboolean* copy){  jchar* c;  jstring data_local;  BEGIN_EXCEPTION_HANDLING(NULL);  data_local = unveil(data);  if (copy != NULL) {    *copy = JNI_FALSE;  }  c = STRING_DATA(((Hjava_lang_String*)data_local));  END_EXCEPTION_HANDLING();  return (c);}jstringKaffeJNI_NewStringUTF(JNIEnv* env UNUSED, const char* data){  Hjava_lang_String* str;  Utf8Const* utf8;  size_t len;  /* We cannot construct the string if data is NULL. So as JNI says   * we return NULL.   */  BEGIN_EXCEPTION_HANDLING(NULL);  if (data != NULL) {    len = strlen(data);    if (!utf8ConstIsValidUtf8(data, len)) {      str = NULL;    } else {      utf8 = checkPtr(utf8ConstNew(data, len));      str = utf8Const2Java(utf8);      utf8ConstRelease(utf8);      if (!str) {        errorInfo info;        postOutOfMemory(&info);        throwError(&info);      }    }  } else   str = NULL;  END_EXCEPTION_HANDLING();  return (str);}jsizeKaffeJNI_GetStringUTFLength(JNIEnv* env UNUSED, jstring data){  jstring data_local;  jchar* ptr;  jsize len, count, i;  Hjava_lang_String* str;  BEGIN_EXCEPTION_HANDLING(0);  data_local = unveil(data);  str = (Hjava_lang_String*)data_local;  ptr = STRING_DATA(str);  len = STRING_SIZE(str);  count = 0;  for (i = 0; i < len; i++) {    if (ptr[i] >= 0x0001 && ptr[i] <= 0x007F) {      count += 1;    }    else if (ptr[i] >= 0x0080 && ptr[i] <= 0x07FF) {      count += 2;    }    else {      count += 3;    }  }  END_EXCEPTION_HANDLING();  return (count);}const char*KaffeJNI_GetStringUTFChars(JNIEnv* env, jstring data, jboolean* copy){  jchar* ptr;  char* buf;  jsize len, i, j;  jstring data_local;  Hjava_lang_String* str;  BEGIN_EXCEPTION_HANDLING(NULL);  data_local = unveil(data);  str = (Hjava_lang_String*)data_local;  /* We always copy data */  if (copy != NULL) {    *copy = JNI_TRUE;  }  buf = checkPtr(KMALLOC((size_t)KaffeJNI_GetStringUTFLength(env, data_local)			 + 1));  ptr = STRING_DATA(str);  len = STRING_SIZE(str);  for (j = 0, i = 0; i < len; i++) {    if (ptr[i] >= 0x0001 && ptr[i] <= 0x007F) {      buf[j++] = ptr[i] & 0x7F;    }    else if (ptr[i] >= 0x0080 && ptr[i] <= 0x07FF) {      buf[j++] = 0xC0 | ((ptr[i] >> 6) & 0x1F);      buf[j++] = 0x80 | (ptr[i] & 0x3F);    }    else {      buf[j++] = 0xE0 | ((ptr[i] >> 12) & 0x0F);      buf[j++] = 0x80 | ((ptr[i] >> 6) & 0x3F);      buf[j++] = 0x80 | (ptr[i] & 0x3F);    }  }  END_EXCEPTION_HANDLING();  return (buf);}voidKaffeJNI_ReleaseStringUTFChars(JNIEnv* env UNUSED, jstring data UNUSED, const char* chars){  void * utf_chars = (void *) chars;  BEGIN_EXCEPTION_HANDLING_VOID();  KFREE(utf_chars);	  END_EXCEPTION_HANDLING();}voidKaffeJNI_GetStringRegion(JNIEnv UNUSED *env, jstring data, jsize start, jsize len, jchar *buf){  jchar *str_ptr;  jsize str_len;  jstring data_local;  Hjava_lang_String* str;  BEGIN_EXCEPTION_HANDLING_VOID();  data_local = unveil(data);  str = (Hjava_lang_String*)data_local;  str_ptr = STRING_DATA(str);  str_len = STRING_SIZE(str);  if (start >= len || start+len >= str_len) {    errorInfo einfo;	          postException(&einfo, "java.lang.StringIndexOutOfBoundsException");    throwError(&einfo);  }	  memcpy(buf, &str_ptr[start], len*sizeof(jchar));  END_EXCEPTION_HANDLING();}voidKaffeJNI_GetStringUTFRegion(JNIEnv UNUSED *env, jstring data, jsize start, jsize len, char *buf){  jchar *str_ptr;  jsize str_len;  jstring data_local;  Hjava_lang_String* str;  BEGIN_EXCEPTION_HANDLING_VOID();  data_local = unveil(data);  str = (Hjava_lang_String*)data_local;  str_ptr = STRING_DATA(str);  str_len = STRING_SIZE(str);   if (start >= len || start+len >= str_len) {    errorInfo einfo;	          postException(&einfo, "java.lang.StringIndexOutOfBoundsException");    throwError(&einfo);  }  utf8ConstEncodeTo(&str_ptr[start], len, buf);  END_EXCEPTION_HANDLING();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -