enhanced string cache for awk
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: awk.h 287 2009-09-15 10:01:02Z hyunghwan.chung $ | ||||
|  * $Id: awk.h 290 2009-09-19 04:28:49Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -42,6 +42,11 @@ typedef struct qse_awk_tree_t qse_awk_tree_t; | ||||
| #include "err.h" | ||||
| #include "misc.h" | ||||
|  | ||||
| #define ENABLE_FEATURE_SCACHE | ||||
| #define FEATURE_SCACHE_NUM_BLOCKS 16 | ||||
| #define FEATURE_SCACHE_BLOCK_UNIT 16 | ||||
| #define FEATURE_SCACHE_BLOCK_SIZE 128 | ||||
|  | ||||
| #define QSE_AWK_MAX_GBLS 9999 | ||||
| #define QSE_AWK_MAX_LCLS  9999 | ||||
| #define QSE_AWK_MAX_PARAMS  9999 | ||||
| @ -256,11 +261,13 @@ struct qse_awk_rtx_t | ||||
| 	int exit_level; | ||||
|  | ||||
| 	qse_awk_val_ref_t* fcache[128]; | ||||
| 	/*qse_awk_val_str_t* scache32[128]; | ||||
| 	qse_awk_val_str_t* scache64[128];*/ | ||||
| 	qse_size_t fcache_count; | ||||
| 	/*qse_size_t scache32_count; | ||||
| 	qse_size_t scache64_count;*/ | ||||
|  | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| 	qse_awk_val_str_t* scache | ||||
| 		[FEATURE_SCACHE_NUM_BLOCKS][FEATURE_SCACHE_BLOCK_SIZE]; | ||||
| 	qse_size_t scache_count[FEATURE_SCACHE_NUM_BLOCKS]; | ||||
| #endif | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: fnc.c 289 2009-09-16 06:35:29Z hyunghwan.chung $ | ||||
|  * $Id: fnc.c 290 2009-09-19 04:28:49Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -491,13 +491,13 @@ static int fnc_index (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| /* TODO: ignorecase... */ | ||||
| 	if (start == 0) start = 1; | ||||
| 	else if (start < 0) start = len0 + start + 1; | ||||
|  | ||||
| 	ptr = (start > len0 || start <= 0)?  | ||||
| 		QSE_NULL: | ||||
| 		qse_strxnstr (&str0[start-1], len0-start+1, str1, len1); | ||||
| 	ptr = (start > len0 || start <= 0)? QSE_NULL: | ||||
| 	      (rtx->gbl.ignorecase)? | ||||
| 	          qse_strxncasestr (&str0[start-1], len0-start+1, str1, len1): | ||||
| 	          qse_strxnstr (&str0[start-1], len0-start+1, str1, len1); | ||||
|  | ||||
| 	idx = (ptr == QSE_NULL)? 0: ((qse_long_t)(ptr-str0) + 1); | ||||
|  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: run.c 288 2009-09-15 14:03:15Z hyunghwan.chung $ | ||||
|  * $Id: run.c 290 2009-09-19 04:28:49Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -801,9 +801,6 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) | ||||
|  | ||||
| 	rtx->exit_level = EXIT_NONE; | ||||
|  | ||||
| 	rtx->fcache_count = 0; | ||||
| 	/*rtx->scache32_count = 0; | ||||
| 	rtx->scache64_count = 0;*/ | ||||
| 	rtx->vmgr.ichunk = QSE_NULL; | ||||
| 	rtx->vmgr.ifree = QSE_NULL; | ||||
| 	rtx->vmgr.rchunk = QSE_NULL; | ||||
| @ -910,6 +907,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) | ||||
|  | ||||
| static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals) | ||||
| { | ||||
|  | ||||
| 	if (rtx->pattern_range_state != QSE_NULL) | ||||
| 		QSE_AWK_FREE (rtx->awk, rtx->pattern_range_state); | ||||
|  | ||||
| @ -1012,17 +1010,21 @@ static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals) | ||||
| 		qse_awk_rtx_freeval (rtx, (qse_awk_val_t*)tmp, QSE_FALSE); | ||||
| 	} | ||||
|  | ||||
| 	/*while (rtx->scache32_count > 0) | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| 	{ | ||||
| 		qse_awk_val_str_t* tmp = rtx->scache32[--rtx->scache32_count]; | ||||
| 		qse_awk_rtx_freeval (rtx, (qse_awk_val_t*)tmp, QSE_FALSE); | ||||
| 		int i; | ||||
| 		for (i = 0; i < QSE_COUNTOF(rtx->scache_count); i++) | ||||
| 		{ | ||||
| 			while (rtx->scache_count[i] > 0) | ||||
| 			{ | ||||
| 				qse_awk_val_str_t* t =  | ||||
| 					rtx->scache[i][--rtx->scache_count[i]]; | ||||
| 				qse_awk_rtx_freeval ( | ||||
| 					rtx, (qse_awk_val_t*)t, QSE_FALSE); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	while (rtx->scache64_count > 0) | ||||
| 	{ | ||||
| 		qse_awk_val_str_t* tmp = rtx->scache64[--rtx->scache64_count]; | ||||
| 		qse_awk_rtx_freeval (rtx, (qse_awk_val_t*)tmp, QSE_FALSE); | ||||
| 	}*/ | ||||
| #endif | ||||
|  | ||||
| 	qse_awk_rtx_freevalchunk (rtx, rtx->vmgr.ichunk); | ||||
| 	qse_awk_rtx_freevalchunk (rtx, rtx->vmgr.rchunk); | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: val.c 287 2009-09-15 10:01:02Z hyunghwan.chung $ | ||||
|  * $Id: val.c 290 2009-09-19 04:28:49Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -72,23 +72,6 @@ qse_awk_val_t* qse_awk_rtx_makeintval (qse_awk_rtx_t* rtx, qse_long_t v) | ||||
| 		return (qse_awk_val_t*)&awk_int[v-awk_int[0].val]; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	if (run->icache_count > 0) | ||||
| 	{ | ||||
| 		val = run->icache[--run->icache_count]; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		val = (qse_awk_val_int_t*) QSE_AWK_ALLOC ( | ||||
| 			run->awk, QSE_SIZEOF(qse_awk_val_int_t)); | ||||
| 		if (val == QSE_NULL)  | ||||
| 		{ | ||||
| 			qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| 	} | ||||
| 	*/ | ||||
|  | ||||
| 	if (rtx->vmgr.ifree == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_awk_val_ichunk_t* c; | ||||
| @ -148,23 +131,6 @@ qse_awk_val_t* qse_awk_rtx_makerealval (qse_awk_rtx_t* rtx, qse_real_t v) | ||||
| { | ||||
| 	qse_awk_val_real_t* val; | ||||
|  | ||||
| 	/* | ||||
| 	if (run->rcache_count > 0) | ||||
| 	{ | ||||
| 		val = run->rcache[--run->rcache_count]; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		val = (qse_awk_val_real_t*) QSE_AWK_ALLOC ( | ||||
| 			run->awk, QSE_SIZEOF(qse_awk_val_real_t)); | ||||
| 		if (val == QSE_NULL) | ||||
| 		{ | ||||
| 			qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| 	} | ||||
| 	*/ | ||||
|  | ||||
| 	if (rtx->vmgr.rfree == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_awk_val_rchunk_t* c; | ||||
| @ -225,28 +191,24 @@ qse_awk_val_t* qse_awk_rtx_makestrval0 ( | ||||
| qse_awk_val_t* qse_awk_rtx_makestrval ( | ||||
| 	qse_awk_rtx_t* rtx, const qse_char_t* str, qse_size_t len) | ||||
| { | ||||
| 	qse_awk_val_str_t* val; | ||||
| 	qse_awk_val_str_t* val = QSE_NULL; | ||||
| 	qse_size_t rlen = len; | ||||
|  | ||||
| 	/*if (rlen <= 32) | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| 	qse_size_t i; | ||||
|  | ||||
| 	i = rlen / FEATURE_SCACHE_BLOCK_UNIT; | ||||
| 	if (i < QSE_COUNTOF(rtx->scache_count)) | ||||
| 	{ | ||||
| 		if (run->scache32_count > 0) | ||||
| 		rlen = (i + 1) * FEATURE_SCACHE_BLOCK_UNIT - 1; | ||||
| 		if (rtx->scache_count[i] > 0) | ||||
| 		{ | ||||
| 			val = run->scache32[--run->scache32_count]; | ||||
| 			val = rtx->scache[i][--rtx->scache_count[i]]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 32; | ||||
| 	} | ||||
| 	else if (rlen <= 64) | ||||
| 	{ | ||||
| 		if (run->scache64_count > 0) | ||||
| 		{ | ||||
| 			val = run->scache64[--run->scache64_count]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 64; | ||||
| 	}*/ | ||||
| 	 | ||||
| #endif | ||||
|  | ||||
| 	val = (qse_awk_val_str_t*) QSE_AWK_ALLOC ( | ||||
| 		rtx->awk, | ||||
| 		QSE_SIZEOF(qse_awk_val_str_t) +  | ||||
| @ -256,15 +218,15 @@ qse_awk_val_t* qse_awk_rtx_makestrval ( | ||||
| 		qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
| /* | ||||
|  | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| init: | ||||
| */ | ||||
| #endif | ||||
| 	val->type = QSE_AWK_VAL_STR; | ||||
| 	val->ref = 0; | ||||
| 	val->nstr = 0; | ||||
| 	val->len = len; | ||||
| 	val->ptr = (qse_char_t*)(val + 1); | ||||
| 	/*qse_strxncpy (val->ptr, len+1, str, len);*/ | ||||
| 	qse_strncpy (val->ptr, str, len); | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| @ -302,24 +264,20 @@ qse_awk_val_t* qse_awk_rtx_makestrval2 ( | ||||
| 	qse_awk_val_str_t* val; | ||||
| 	qse_size_t rlen = len1 + len2; | ||||
|  | ||||
| 	/*if (rlen <= 32) | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| 	int i; | ||||
|  | ||||
| 	i = rlen / FEATURE_SCACHE_BLOCK_UNIT; | ||||
| 	if (i < QSE_COUNTOF(rtx->scache_count)) | ||||
| 	{ | ||||
| 		if (run->scache32_count > 0) | ||||
| 		rlen = (i + 1) * FEATURE_SCACHE_BLOCK_UNIT - 1; | ||||
| 		if (rtx->scache_count[i] > 0) | ||||
| 		{ | ||||
| 			val = run->scache32[--run->scache32_count]; | ||||
| 			val = rtx->scache[i][--rtx->scache_count[i]]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 32; | ||||
| 	} | ||||
| 	else if (rlen <= 64) | ||||
| 	{ | ||||
| 		if (run->scache64_count > 0) | ||||
| 		{ | ||||
| 			val = run->scache64[--run->scache64_count]; | ||||
| 			goto init; | ||||
| 		} | ||||
| 		rlen = 64; | ||||
| 	}*/ | ||||
| #endif | ||||
|  | ||||
| 	val = (qse_awk_val_str_t*) QSE_AWK_ALLOC ( | ||||
| 		rtx->awk, | ||||
| @ -331,16 +289,14 @@ qse_awk_val_t* qse_awk_rtx_makestrval2 ( | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
|  | ||||
| /* | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| init: | ||||
| */ | ||||
| #endif | ||||
| 	val->type = QSE_AWK_VAL_STR; | ||||
| 	val->ref = 0; | ||||
| 	val->nstr = 0; | ||||
| 	val->len = len1 + len2; | ||||
| 	val->ptr = (qse_char_t*)(val + 1); | ||||
| 	/*qse_strxncpy (val->ptr, len1+1, str1, len1); | ||||
| 	qse_strxncpy (val->ptr[len1], len2+1, str2, len2);*/ | ||||
| 	qse_strncpy (val->ptr, str1, len1); | ||||
| 	qse_strncpy (&val->ptr[len1], str2, len2); | ||||
|  | ||||
| @ -413,15 +369,15 @@ qse_awk_val_t* qse_awk_rtx_makerexval ( | ||||
|  | ||||
| static void free_mapval (qse_map_t* map, void* dptr, qse_size_t dlen) | ||||
| { | ||||
| 	qse_awk_rtx_t* run = *(qse_awk_rtx_t**)QSE_XTN(map); | ||||
| 	qse_awk_rtx_t* rtx = *(qse_awk_rtx_t**)QSE_XTN(map); | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("refdown in map free...")); | ||||
| 	qse_awk_dprintval (run, dptr); | ||||
| 	qse_awk_dprintval (rtx, dptr); | ||||
| 	qse_dprintf (QSE_T("\n")); | ||||
| #endif | ||||
|  | ||||
| 	qse_awk_rtx_refdownval (run, dptr); | ||||
| 	qse_awk_rtx_refdownval (rtx, dptr); | ||||
| } | ||||
|  | ||||
| static void same_mapval (qse_map_t* map, void* dptr, qse_size_t dlen) | ||||
| @ -545,7 +501,8 @@ qse_bool_t qse_awk_rtx_isstaticval (qse_awk_rtx_t* rtx, qse_awk_val_t* val) | ||||
| 	return IS_STATICVAL(val); | ||||
| } | ||||
|  | ||||
| void qse_awk_rtx_freeval (qse_awk_rtx_t* rtx, qse_awk_val_t* val, qse_bool_t cache) | ||||
| void qse_awk_rtx_freeval (	 | ||||
| 	qse_awk_rtx_t* rtx, qse_awk_val_t* val, qse_bool_t cache) | ||||
| { | ||||
| 	if (IS_STATICVAL(val)) return; | ||||
|  | ||||
| @ -561,52 +518,36 @@ void qse_awk_rtx_freeval (qse_awk_rtx_t* rtx, qse_awk_val_t* val, qse_bool_t cac | ||||
| 	} | ||||
| 	else if (val->type == QSE_AWK_VAL_INT) | ||||
| 	{ | ||||
| 		/* | ||||
| 		if (cache && rtx->icache_count < QSE_COUNTOF(rtx->icache)) | ||||
| 		{ | ||||
| 			rtx->icache[rtx->icache_count++] =  | ||||
| 				(qse_awk_val_int_t*)val;	 | ||||
| 		} | ||||
| 		else QSE_AWK_FREE (rtx->awk, val); | ||||
| 		*/ | ||||
| 			 | ||||
| 		((qse_awk_val_int_t*)val)->nde = (qse_awk_nde_int_t*)rtx->vmgr.ifree; | ||||
| 		((qse_awk_val_int_t*)val)->nde =  | ||||
| 			(qse_awk_nde_int_t*)rtx->vmgr.ifree; | ||||
| 		rtx->vmgr.ifree = (qse_awk_val_int_t*)val; | ||||
| 	} | ||||
| 	else if (val->type == QSE_AWK_VAL_REAL) | ||||
| 	{ | ||||
| 		/* | ||||
| 		if (cache && rtx->rcache_count < QSE_COUNTOF(rtx->rcache)) | ||||
| 		{ | ||||
| 			rtx->rcache[rtx->rcache_count++] =  | ||||
| 				(qse_awk_val_real_t*)val;	 | ||||
| 		} | ||||
| 		else QSE_AWK_FREE (rtx->awk, val); | ||||
| 		*/ | ||||
| 		((qse_awk_val_real_t*)val)->nde = (qse_awk_nde_real_t*)rtx->vmgr.rfree; | ||||
| 		((qse_awk_val_real_t*)val)->nde = | ||||
| 			(qse_awk_nde_real_t*)rtx->vmgr.rfree; | ||||
| 		rtx->vmgr.rfree = (qse_awk_val_real_t*)val; | ||||
| 	} | ||||
| 	else if (val->type == QSE_AWK_VAL_STR) | ||||
| 	{ | ||||
| 		/* | ||||
| #ifdef ENABLE_FEATURE_SCACHE | ||||
| 		if (cache) | ||||
| 		{ | ||||
| 			qse_awk_val_str_t* v = (qse_awk_val_str_t*)val; | ||||
| 			if (v->len <= 32 &&  | ||||
| 			    rtx->scache32_count<QSE_COUNTOF(rtx->scache32)) | ||||
| 			int i; | ||||
|  | ||||
| 			i = v->len / FEATURE_SCACHE_BLOCK_UNIT; | ||||
| 			if (i < QSE_COUNTOF(rtx->scache_count) && | ||||
| 			    rtx->scache_count[i] < QSE_COUNTOF(rtx->scache[i])) | ||||
| 			{ | ||||
| 				rtx->scache32[rtx->scache32_count++] = v; | ||||
| 				v->nstr = 0; | ||||
| 			} | ||||
| 			else if (v->len <= 64 &&  | ||||
| 			         rtx->scache64_count<QSE_COUNTOF(rtx->scache64)) | ||||
| 			{ | ||||
| 				rtx->scache64[rtx->scache64_count++] = v; | ||||
| 				rtx->scache[i][rtx->scache_count[i]++] = v; | ||||
| 				v->nstr = 0; | ||||
| 			} | ||||
| 			else QSE_AWK_FREE (rtx->awk, val); | ||||
| 		} | ||||
| 		else*/ QSE_AWK_FREE (rtx->awk, val); | ||||
| 		else  | ||||
| #endif | ||||
| 			QSE_AWK_FREE (rtx->awk, val); | ||||
| 	} | ||||
| 	else if (val->type == QSE_AWK_VAL_REX) | ||||
| 	{ | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: str_bas.c 289 2009-09-16 06:35:29Z hyunghwan.chung $ | ||||
|  * $Id: str_bas.c 290 2009-09-19 04:28:49Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -543,6 +543,72 @@ qse_char_t* qse_strxnstr ( | ||||
| 	return QSE_NULL; | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_strcasestr (const qse_char_t* str, const qse_char_t* sub) | ||||
| { | ||||
| 	const qse_char_t* x, * y; | ||||
|  | ||||
| 	y = sub; | ||||
| 	if (*y == QSE_T('\0')) return (qse_char_t*)str; | ||||
|  | ||||
| 	while (*str != QSE_T('\0'))  | ||||
| 	{ | ||||
| 		if (QSE_TOUPPER(*str) != QSE_TOUPPER(*y))  | ||||
| 		{ | ||||
| 			str++; | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		x = str; | ||||
| 		while (1) | ||||
| 		{ | ||||
| 			if (*y == QSE_T('\0')) return (qse_char_t*)str; | ||||
| 			if (QSE_TOUPPER(*x) != QSE_TOUPPER(*y)) break; | ||||
| 			x++; y++; | ||||
| 		} | ||||
|  | ||||
| 		y = sub; | ||||
| 		str++; | ||||
| 	} | ||||
|  | ||||
| 	return QSE_NULL; | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_strxcasestr ( | ||||
| 	const qse_char_t* str, qse_size_t size, const qse_char_t* sub) | ||||
| { | ||||
| 	return qse_strxncasestr (str, size, sub, qse_strlen(sub)); | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_strxncasestr ( | ||||
| 	const qse_char_t* str, qse_size_t strsz,  | ||||
| 	const qse_char_t* sub, qse_size_t subsz) | ||||
| { | ||||
| 	const qse_char_t* end, * subp; | ||||
|  | ||||
| 	if (subsz == 0) return (qse_char_t*)str; | ||||
| 	if (strsz < subsz) return QSE_NULL; | ||||
| 	 | ||||
| 	end = str + strsz - subsz; | ||||
| 	subp = sub + subsz; | ||||
|  | ||||
| 	while (str <= end)  | ||||
| 	{ | ||||
| 		const qse_char_t* x = str; | ||||
| 		const qse_char_t* y = sub; | ||||
|  | ||||
| 		while (1) | ||||
| 		{ | ||||
| 			if (y >= subp) return (qse_char_t*)str; | ||||
| 			if (QSE_TOUPPER(*x) != QSE_TOUPPER(*y)) break; | ||||
| 			x++; y++; | ||||
| 		}	 | ||||
|  | ||||
| 		str++; | ||||
| 	} | ||||
| 		 | ||||
| 	return QSE_NULL; | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_strrstr (const qse_char_t* str, const qse_char_t* sub) | ||||
| { | ||||
| 	return qse_strxnrstr (str, qse_strlen(str), sub, qse_strlen(sub)); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user