亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? string.c

?? kaffe Java 解釋器語言,源碼,Java的子集系統(tǒng),開放源代碼
?? C
字號:
/* * string.c * Manage strings. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. */#include "config.h"#include "config-std.h"#include "config-mem.h"#include "classMethod.h"#include "kaffe/jtypes.h"#include "gtypes.h"#include "constants.h"#include "object.h"#include "itypes.h"#include "locks.h"#include "baseClasses.h"#include "hashtab.h"#include "stringSupport.h"#include "exception.h"/* Internal variables */static hashtab_t	hashTable;	/* intern hash table */static iStaticLock	stringLock;	/* mutex on all intern operations */static int *            stringLockRoot;	/* the string lock is not a monitor *//* Internal functions */static int		stringHashValue(const void *ptr);static int		stringCompare(const void *s1, const void *s2);/* * Convert a Java string into a KMALLOC()'d C string buffer. */char*stringJava2C(const Hjava_lang_String* js){	char* str;	str = gc_malloc(STRING_SIZE(js) + 1, GC_ALLOC_FIXED);	if (str != 0) {		stringJava2CBuf(js, str, STRING_SIZE(js) + 1);	}	return(str);}/* * Convert an Java string to a C string in the buffer. * We simply truncate the Java characters to 8 bits. */char*stringJava2CBuf(const Hjava_lang_String* js, char* cs, int len){	jchar* chrs;	if (len <= 0) {		return(NULL);	}	if (js == NULL) {		cs[0] = 0;		return(cs);	}	chrs = STRING_DATA(js);	len--;	if (len > STRING_SIZE(js)) {		len = STRING_SIZE(js);	}	cs[len] = 0;	while (--len >= 0) {		*cs++ = (char)*chrs++;	}	return (cs);}/* * Convert a C string into a Java String. */Hjava_lang_String*stringC2Java(const char* cs){	const int len = strlen(cs);	Hjava_lang_String *string;	jchar *ary, buf[200];	int k;	/* Get buffer */	if (len * sizeof(*ary) > sizeof(buf)) {		ary = gc_malloc(len * sizeof(*ary), GC_ALLOC_FIXED);		if (!ary) return 0;	} else {		ary = buf;	}	/* Convert C chars to Java chars */	for (k = 0; k < len; k++) {		ary[k] = (unsigned char) cs[k];	}	/* Return a string containing those chars */	string = stringCharArray2Java(ary, len);	if (ary != buf) {		KFREE(ary);	}	return(string);}/* * Convert a C string into a Java char array. */HArrayOfChar*stringC2CharArray(const char* cs){	const int len = strlen(cs);	HArrayOfChar* ary;	int k;	errorInfo info;	/* Get new array object */	ary = (HArrayOfChar*)newArrayChecked(TYPE_CLASS(TYPE_Char),					     len, &info);	if (!ary) {		discardErrorInfo(&info);		return 0;	}		/* Convert C chars to Java chars */	for (k = 0; k < len; k++) {		unhand_array(ary)->body[k] = (unsigned char) cs[k];	}	return(ary);}/* * Create a String object from a UTF-8 string. * * This function is here instead of in utf8const.c to * avoid kaffeh linkage problems. */Hjava_lang_String*utf8Const2Java(const Utf8Const *utf8){	Hjava_lang_String* string;	string = utf8Const2JavaReplace(utf8, 0, 0);	unhand(string)->hash = utf8->hash;	/* why not, they're equal */	return(string);}/* * Create a String object from a UTF-8 string, replacing every * occurrence of "from_ch" with "to_ch". If "from_ch" is zero, * then no substitution is done. * * This function is here instead of in utf8const.c to * avoid kaffeh linkage problems. */Hjava_lang_String*utf8Const2JavaReplace(const Utf8Const *utf8, jchar from_ch, jchar to_ch){	const int uniLen = utf8ConstUniLength(utf8);	Hjava_lang_String* string;	jchar *jc, buf[200];	int k;	/* Get buffer */	if (uniLen * sizeof(jchar) > sizeof(buf)) {		jc = gc_malloc(uniLen * sizeof(*jc), GC_ALLOC_FIXED);		if (!jc) return 0;	} else {		jc = buf;	}	/* Convert UTF-8 to Unicode */	utf8ConstDecode(utf8, jc);	/* Substitute chars */	if (from_ch != 0) {		for (k = 0; k < uniLen; k++) {			if (jc[k] == from_ch) {				jc[k] = to_ch;			}		}	}	/* Convert to a String object */	string = stringCharArray2Java(jc, uniLen);	if (jc != buf) {		KFREE(jc);	}	return(string);}/* Create a Utf8Const object from a String object after replacing all * occurrences of the first character with the second. * * NB.: unlike a conversion via stringJava2C -> utf8ConstNew, this will    * preserve unicode characters properly, including the '\u0000' character. */Utf8Const* stringJava2Utf8ConstReplace(Hjava_lang_String *str, jchar from, jchar to) {	int slength = STRING_SIZE(str);	jchar * chars = STRING_DATA(str);	char *utf8buf;	Utf8Const* utf8;	/* convert characters only if necessary */	if (slength != 0 && from != to) {		int i;		chars = gc_malloc(sizeof(jchar) * slength, GC_ALLOC_FIXED);		for (i = 0; i < slength; i++) {			jchar ci = ((jchar *)STRING_DATA(str))[i];			if (from == ci) {				ci = to;			} 			chars[i] = ci;		}	}	utf8buf = utf8ConstEncode(chars, slength);	if (chars != STRING_DATA(str)) {		KFREE(chars);	}	if (utf8buf == 0) {		errorInfo info;		postOutOfMemory(&info);		throwError(&info);	}	utf8 = utf8ConstNew(utf8buf, -1);	KFREE(utf8buf);	return (utf8);}/* * Return true iff the Utf8Const string is equal to the Java String. */intutf8ConstEqualJavaString(const Utf8Const *utf8, const Hjava_lang_String *string){	const char *uptr = utf8->data;	const char *const uend = uptr + strlen(utf8->data);	const jchar *sptr = STRING_DATA(string);	int ch, slen = STRING_SIZE(string);#if 0	/* Question: would this optimization be worthwhile? */	if (unhand(string)->hash != 0 && unhand(string)->hash != utf8->hash) {		return(0);	}#endif	for (;;) {		if ((ch = UTF8_GET(uptr, uend)) == -1) {			return(slen == 0);		}		if (--slen < 0) {			return(0);		}		if (ch != *sptr++) {			return(0);		}	}}/* * Define functions used by the string hashtable to resize itself. * The problem is that we may block in KCALLOC/KFREE and the gc may kick * in.  The collector, however, must be able to call stringUninternString * while destroying strings.  If we held the lock while this is happening, * we would deadlock. */static void*stringAlloc(size_t sz){	void* p;	int *myRoot = stringLockRoot;	/* XXX assumes stringLock isn't acquired recursively (which it isn't) */	locks_internal_unlockMutex(&stringLock.lock, myRoot, &stringLock.heavyLock);	p = gc_malloc(sz, GC_ALLOC_FIXED);	locks_internal_lockMutex(&stringLock.lock, myRoot, &stringLock.heavyLock);	stringLockRoot = myRoot;	return (p);}static voidstringFree(const void *ptr){	int *myRoot = stringLockRoot;	/* XXX assumes stringLock isn't acquired recursively (which it isn't) */	locks_internal_unlockMutex(&stringLock.lock, myRoot, &stringLock.heavyLock);	KFREE(ptr);	locks_internal_lockMutex(&stringLock.lock, myRoot, &stringLock.heavyLock);	stringLockRoot = myRoot;}/* * Return the interned version of a String object. * May or may not be the same String. */Hjava_lang_String *stringInternString(Hjava_lang_String *string){	int iLockRoot;	Hjava_lang_String *temp;	/* Lock intern table */	lockStaticMutex(&stringLock);	stringLockRoot = &iLockRoot;	/* See if string is already in the table */	if (hashTable != NULL) {		Hjava_lang_String *string2;		if ((string2 = hashFind(hashTable, string)) != NULL) {			unlockStaticMutex(&stringLock);			return(string2);		}	} else {		hashTable = hashInit(stringHashValue, stringCompare, stringAlloc, stringFree);		assert(hashTable != NULL);	}	/* Not in table, so add it */	temp = hashAdd(hashTable, string);	if (!temp) {		unlockStaticMutex(&stringLock);		return temp;	}	assert(temp == string);	unhand(string)->interned = true;	/* Unlock table and return new string */	unlockStaticMutex(&stringLock);	return(string);}/* * Called by String destructor to remove an interned string * from the hash table. */voidstringUninternString(Hjava_lang_String* string){	int iLockRoot;	lockStaticMutex(&stringLock);	stringLockRoot = &iLockRoot;	hashRemove(hashTable, string);	unhand(string)->interned = false;	unlockStaticMutex(&stringLock);}/* * This does exactly what java.lang.String.hashCode() does, only faster. * Note: there is a race condition, but this is OK because the same value * is getting written no matter who writes it (strings are immutable). */static intstringHashValue(const void *ptr){	Hjava_lang_String *const string = (Hjava_lang_String*) ptr;	jint hash;	int k;	if (unhand(string)->hash != 0) {		return(unhand(string)->hash);	}	for (k = hash = 0; k < STRING_SIZE(string); k++) {	       hash = (31 * hash) + STRING_DATA(string)[k];	}	unhand(string)->hash = hash;	return(hash);}/* * Comparison function for the hash table. */static intstringCompare(const void *v1, const void *v2){	const Hjava_lang_String *const s1 = v1;	const Hjava_lang_String *const s2 = v2;	const int len = STRING_SIZE(s1);	int k;	if (STRING_SIZE(s1) != STRING_SIZE(s2)) {		return(1);	}	if (unhand(s1)->hash != 0	    && unhand(s2)->hash != 0	    && unhand(s1)->hash != unhand(s2)->hash) {		return(1);	}	for (k = 0; k < len; k++) {		if (STRING_DATA(s1)[k] != STRING_DATA(s2)[k]) {			return(1);		}	}	return(0);}/* * This returns a String object containing the supplied characters. * If there is already such a String in the intern table, return it. * Otherwise, create a new String object, intern it, and return it. * * The idea with "fake" is that you avoid creating an extra String object * only to find out there's already an interned version, and then forget it, * which causes extra GC work. */Hjava_lang_String*stringCharArray2Java(const jchar *data, int len){	Hjava_lang_String *string;	HArrayOfChar *ary;	errorInfo info;	int iLockRoot;	/* Lock intern table 	 * NB: we must not hold stringLock when we call KMALLOC/KFREE!	 */	/* Look for it already in the intern hash table */	if (hashTable != NULL) {		Hjava_lang_String *string, fakeString;		HArrayOfChar *fakeAry;		unsigned char buf[200];		/* Construct a temporary and fake String object */		if (sizeof(*fakeAry) + (len * sizeof(*data)) > sizeof(buf)) {			fakeAry = gc_malloc(sizeof(*fakeAry) + len * sizeof(*data),					    GC_ALLOC_FIXED);		} else {			fakeAry = (HArrayOfChar*)buf;		}		if (!fakeAry) return 0;				memset(fakeAry, 0, sizeof(*fakeAry));		memcpy(unhand_array(fakeAry)->body, data, len * sizeof(*data));		obj_length(fakeAry) = len;		/* Attach fake array to fake string */		memset(&fakeString, 0, sizeof(fakeString));		unhand(&fakeString)->value = fakeAry;		unhand(&fakeString)->count = len;		/* Return existing copy of this string, if any */		lockStaticMutex(&stringLock);		stringLockRoot = &iLockRoot;		string = hashFind(hashTable, &fakeString);		unlockStaticMutex(&stringLock);		if (fakeAry != (HArrayOfChar*)buf) {			KFREE(fakeAry);		}		if (string != NULL) {			return(string);		}	}	/* Create a new String object */	ary = (HArrayOfChar*)newArrayChecked(charClass, len,					     &info);	if (!ary) {		discardErrorInfo(&info);		return 0;	}		memcpy(ARRAY_DATA(ary), data, len * sizeof(jchar));	string = (Hjava_lang_String*)newObjectChecked(StringClass, &info);	if (!string) {		discardErrorInfo(&info);		return 0;	}	unhand(string)->value = ary;	unhand(string)->count = len;	/* Intern and return string */	/* NB: the string returned might not be the string we created,	 * but we don't care if we lose the race.  The string created by the	 * loser will be picked up by the gc.	 */	string = stringInternString(string);	return (string);}/*                       * Walk a java.lang.String object */     voidstringWalk(Collector* collector, void* str, uint32 size){        /* That's all we have to do here */        GC_markObject(collector, unhand((Hjava_lang_String*)str)->value);}/*        * Destroy a string object. */      void/* ARGSUSED */stringDestroy(Collector* collector, void* obj){        Hjava_lang_String* str = (Hjava_lang_String*)obj;        /* unintern this string if necessary */        if (unhand(str)->interned == true) {                stringUninternString(str);        }       }/* * Initialize string support system */voidstringInit(void){}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品二十页| 成人黄动漫网站免费app| 2023国产一二三区日本精品2022| av电影在线不卡| 蜜臀av一区二区在线免费观看| 亚洲国产成人自拍| 日韩亚洲欧美中文三级| 色综合视频在线观看| 国产在线观看一区二区| 三级成人在线视频| 亚洲视频1区2区| 久久综合网色—综合色88| 欧美日韩激情一区二区三区| 欧美肥胖老妇做爰| av网站免费线看精品| 激情久久久久久久久久久久久久久久 | 天堂成人国产精品一区| 国产精品久线在线观看| 精品少妇一区二区三区在线视频| 国产情人综合久久777777| 欧美电影在哪看比较好| 日韩欧美国产综合一区| 欧美日本不卡视频| 成人免费高清视频在线观看| 免费一级片91| 亚洲超碰精品一区二区| 自拍偷拍国产精品| 日本一区二区三区dvd视频在线| 正在播放亚洲一区| 91成人在线观看喷潮| 99久精品国产| bt欧美亚洲午夜电影天堂| 国模一区二区三区白浆| 捆绑调教美女网站视频一区| 午夜精品爽啪视频| 亚洲国产成人av网| 亚洲一区在线免费观看| 亚洲综合激情网| 亚洲制服丝袜av| 一区二区三区在线高清| 亚洲精品少妇30p| 亚洲精品你懂的| 一区二区欧美国产| 亚洲一级片在线观看| 亚洲国产视频一区二区| 性久久久久久久久久久久| 视频一区免费在线观看| 美女视频一区二区| 久久99国产精品尤物| 国产一二精品视频| 久久综合资源网| 久久久亚洲精品一区二区三区| 精品欧美一区二区久久| 久久综合狠狠综合久久综合88 | k8久久久一区二区三区| 成人黄色网址在线观看| 99久久精品国产麻豆演员表| 99久久婷婷国产综合精品电影| 91麻豆swag| 欧美日韩精品欧美日韩精品一| 欧美久久久久免费| 欧美大胆一级视频| 亚洲国产精品ⅴa在线观看| 亚洲欧洲三级电影| 亚洲国产视频网站| 久久99日本精品| 国产成人免费在线| 91国偷自产一区二区三区成为亚洲经典 | 国产精品久久久久永久免费观看| 91免费看片在线观看| 色爱区综合激月婷婷| 欧美四级电影在线观看| 91精品国产综合久久福利| 精品国产免费视频| 国产精品乱人伦中文| 亚洲精品国产第一综合99久久| 亚洲国产综合人成综合网站| 免费看黄色91| 成人性生交大合| 欧美丝袜第三区| 精品国产乱码91久久久久久网站| 国产精品无人区| 亚洲制服丝袜av| 国精产品一区一区三区mba视频| av在线不卡免费看| 欧美理论在线播放| 国产日韩欧美一区二区三区乱码 | zzijzzij亚洲日本少妇熟睡| 在线观看www91| 久久综合九色综合欧美98| 国产精品久久久久影院老司| 免费在线观看精品| 国产精品久久久久久户外露出 | 欧美视频自拍偷拍| 久久久午夜电影| 亚洲电影一级片| 国产91对白在线观看九色| 欧美美女网站色| 国产精品美女久久久久久久久久久 | 一区二区三区欧美视频| 韩国v欧美v日本v亚洲v| 欧美在线制服丝袜| 欧美国产欧美综合| 蜜臀久久久久久久| 日本福利一区二区| 国产日产精品一区| 日精品一区二区三区| 99久久精品国产观看| 亚洲精品一区二区三区蜜桃下载 | 91香蕉视频在线| 欧美乱妇20p| 国产在线播放一区二区三区| 欧美综合视频在线观看| 国产精品久久看| 国产在线乱码一区二区三区| 欧美人牲a欧美精品| 亚洲色图色小说| 成人一级视频在线观看| 日韩三级在线免费观看| 亚洲福利国产精品| 色欧美日韩亚洲| 中文字幕一区不卡| 不卡av免费在线观看| 国产亚洲女人久久久久毛片| 狠狠色综合播放一区二区| 欧美一区二区三区电影| 日韩1区2区日韩1区2区| 欧美日韩不卡在线| 亚洲自拍偷拍欧美| 欧美做爰猛烈大尺度电影无法无天| 国产精品久久久久久一区二区三区 | 亚洲国产美国国产综合一区二区| 一本到三区不卡视频| 综合电影一区二区三区| 91一区二区在线观看| 久久久久久综合| 国产综合色视频| 欧美精品一区二| 韩日欧美一区二区三区| 久久婷婷色综合| 国产精品99久久不卡二区| 久久男人中文字幕资源站| 国产一区二区久久| 久久久久久久国产精品影院| 国产精品自拍三区| 亚洲国产精品高清| av电影天堂一区二区在线| 中文字幕在线观看一区| 久久亚洲精品国产精品紫薇| 国产麻豆视频精品| 国产午夜精品久久久久久免费视| 国产iv一区二区三区| 自拍av一区二区三区| 欧美在线免费视屏| 青青草国产精品亚洲专区无| 亚洲精品一区二区三区影院| 精品午夜一区二区三区在线观看| 精品久久久久久久久久久久久久久| 国产一区二区三区在线观看免费| 国产三级一区二区| 色婷婷综合久久久中文一区二区| 亚洲国产一区二区三区青草影视| 欧美在线短视频| 九九国产精品视频| 中文无字幕一区二区三区| 欧美无砖专区一中文字| 亚洲国产精品视频| 欧美电影在线免费观看| 国产剧情一区二区| 中文字幕av一区 二区| 91成人在线观看喷潮| 久久机这里只有精品| 中文字幕av资源一区| 欧美影院精品一区| 久久99精品久久久| 亚洲图片欧美激情| 欧美一区二区久久久| 成人在线视频首页| 五月婷婷激情综合网| 国产欧美精品国产国产专区| 欧美在线视频不卡| 国产高清不卡一区| 一区二区激情视频| 26uuu另类欧美亚洲曰本| 一本色道久久综合精品竹菊| 免费高清不卡av| 亚洲美女在线国产| 精品国产a毛片| 成人欧美一区二区三区视频网页| 欧美视频精品在线观看| 国产乱子伦视频一区二区三区| 亚洲精品一二三| 国产片一区二区| 5566中文字幕一区二区电影| av激情综合网| 久久精品久久99精品久久| 樱桃视频在线观看一区| 麻豆精品在线视频| 国产日韩欧美精品电影三级在线| 欧美美女一区二区在线观看|