enhanced val_int_to_str().
changed the return type of qse_awk_valtostr()
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Awk.cpp 477 2011-05-24 04:22:40Z hyunghwan.chung $ | ||||
|  * $Id: Awk.cpp 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  *  | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -441,8 +441,7 @@ int Awk::Value::getStr (const char_t** str, size_t* len) const | ||||
| 			{ | ||||
| 				qse_awk_rtx_valtostr_out_t out; | ||||
| 				out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 				if (qse_awk_rtx_valtostr ( | ||||
| 					run->rtx, val, &out) == QSE_NULL) | ||||
| 				if (qse_awk_rtx_valtostr (run->rtx, val, &out) <= -1) | ||||
| 				{ | ||||
| 					run->awk->retrieveError (run); | ||||
| 					return -1; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: StdAwk.cpp 461 2011-05-18 02:32:39Z hyunghwan.chung $ | ||||
|  * $Id: StdAwk.cpp 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -376,7 +376,7 @@ int StdAwk::open_console_in (Console& io) | ||||
| 		QSE_ASSERT (v != QSE_NULL); | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, v, &out) == QSE_NULL) return -1; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, v, &out) <= -1) return -1; | ||||
|  | ||||
| 		if (out.u.cpldup.len == 0) | ||||
| 		{ | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: rec.c 462 2011-05-18 14:36:40Z hyunghwan.chung $ | ||||
|  * $Id: rec.c 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -129,7 +129,7 @@ static int split_record (qse_awk_rtx_t* rtx) | ||||
| 		qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, fs, &out) == QSE_NULL) return -1; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, fs, &out) <= -1) return -1; | ||||
| 		 | ||||
| 		fs_ptr = out.u.cpldup.ptr; | ||||
| 		fs_len = out.u.cpldup.len; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: rio.c 464 2011-05-19 03:33:28Z hyunghwan.chung $ | ||||
|  * $Id: rio.c 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -652,7 +652,7 @@ int qse_awk_rtx_writeio_val ( | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP | | ||||
| 		           QSE_AWK_RTX_VALTOSTR_PRINT; | ||||
| 		if (qse_awk_rtx_valtostr (run, v, &out) == QSE_NULL) return -1; | ||||
| 		if (qse_awk_rtx_valtostr (run, v, &out) <= -1) return -1; | ||||
|  | ||||
| 		str = out.u.cpldup.ptr; | ||||
| 		len = out.u.cpldup.len; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: run.c 479 2011-05-24 15:14:58Z hyunghwan.chung $ | ||||
|  * $Id: run.c 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -343,7 +343,7 @@ static int set_global ( | ||||
| 			qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL)  | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) | ||||
| 				return -1; | ||||
|  | ||||
| 			for (i = 0; i < out.u.cpldup.len; i++) | ||||
| @ -397,7 +397,7 @@ static int set_global ( | ||||
| 				QSE_ASSERT (val->type != QSE_AWK_VAL_REX); | ||||
|  | ||||
| 				out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 				if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL) return -1; | ||||
| 				if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) return -1; | ||||
| 				fs_ptr = out.u.cpldup.ptr; | ||||
| 				fs_len = out.u.cpldup.len; | ||||
| 			} | ||||
| @ -485,8 +485,7 @@ static int set_global ( | ||||
| 			qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL)  | ||||
| 				return -1; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) return -1; | ||||
|  | ||||
| 			for (i = 0; i < out.u.cpldup.len; i++) | ||||
| 			{ | ||||
| @ -511,8 +510,7 @@ static int set_global ( | ||||
| 			qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL)  | ||||
| 				return -1; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) return -1; | ||||
|  | ||||
| 			if (rtx->gbl.ofs.ptr != QSE_NULL) | ||||
| 				QSE_AWK_FREE (rtx->awk, rtx->gbl.ofs.ptr); | ||||
| @ -527,8 +525,7 @@ static int set_global ( | ||||
| 			qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL)  | ||||
| 				return -1; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) return -1; | ||||
|  | ||||
| 			if (rtx->gbl.ors.ptr != QSE_NULL) | ||||
| 				QSE_AWK_FREE (rtx->awk, rtx->gbl.ors.ptr); | ||||
| @ -556,8 +553,7 @@ static int set_global ( | ||||
| 				QSE_ASSERT (val->type != QSE_AWK_VAL_REX); | ||||
|  | ||||
| 				out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 				if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL)  | ||||
| 					return -1; | ||||
| 				if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) return -1; | ||||
|  | ||||
| 				rss = out.u.cpldup; | ||||
| 			} | ||||
| @ -595,8 +591,7 @@ static int set_global ( | ||||
| 			qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) == QSE_NULL) | ||||
| 				return -1; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, val, &out) <= -1) return -1; | ||||
|  | ||||
| 			if (rtx->gbl.subsep.ptr != QSE_NULL) | ||||
| 				QSE_AWK_FREE (rtx->awk, rtx->gbl.subsep.ptr); | ||||
| @ -2529,39 +2524,38 @@ static int delete_indexed ( | ||||
| 	else | ||||
| 	{ | ||||
| 		/* delete x[20] */ | ||||
|  | ||||
| 		qse_char_t* key; | ||||
| 		qse_size_t keylen; | ||||
| 		qse_char_t buf[IDXBUFSIZE]; | ||||
| 		qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 		/* try with a fixed-size buffer */ | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLCP; | ||||
| 		out.u.cplcp.ptr = buf; | ||||
| 		out.u.cplcp.len = QSE_COUNTOF(buf); | ||||
| 		key = qse_awk_rtx_valtostr (rtx, idx, &out); | ||||
| 		if (key == QSE_NULL) | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLCPY; | ||||
| 		out.u.cplcpy.ptr = buf; | ||||
| 		out.u.cplcpy.len = QSE_COUNTOF(buf); | ||||
| 		if (qse_awk_rtx_valtostr (rtx, idx, &out) <= -1) | ||||
| 		{ | ||||
| 			int n; | ||||
|  | ||||
| 			/* retry it in dynamic mode */ | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			key = qse_awk_rtx_valtostr (rtx, idx, &out); | ||||
| 			n = qse_awk_rtx_valtostr (rtx, idx, &out); | ||||
| 			qse_awk_rtx_refdownval (rtx, idx); | ||||
| 			if (n <= -1) | ||||
| 			{ | ||||
| 				/* change the error line */ | ||||
| 				ADJERR_LOC (rtx, &var->loc); | ||||
| 				return -1; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				qse_htb_delete (map, out.u.cpldup.ptr, out.u.cpldup.len); | ||||
| 				QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		qse_awk_rtx_refdownval (rtx, idx); | ||||
|  | ||||
| 		if (key == QSE_NULL)  | ||||
| 		else  | ||||
| 		{ | ||||
| 			/* change the error line */ | ||||
| 			ADJERR_LOC (rtx, &var->loc); | ||||
| 			return -1; | ||||
| 			qse_awk_rtx_refdownval (rtx, idx); | ||||
| 			qse_htb_delete (map, out.u.cplcpy.ptr, out.u.cplcpy.len); | ||||
| 		} | ||||
|  | ||||
| 		keylen = (out.type == QSE_AWK_RTX_VALTOSTR_CPLCP)? | ||||
| 			out.u.cplcp.len: out.u.cpldup.len; | ||||
|  | ||||
| 		qse_htb_delete (map, key, keylen); | ||||
|  | ||||
| 		if (key != buf) QSE_AWK_FREE (rtx->awk, key); | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| @ -2825,7 +2819,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) | ||||
| 		qse_awk_rtx_refupval (rtx, v); | ||||
|  | ||||
| 		vsout.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, v, &vsout) == QSE_NULL) | ||||
| 		if (qse_awk_rtx_valtostr (rtx, v, &vsout) <= -1) | ||||
| 		{ | ||||
| 			qse_awk_rtx_refdownval (rtx, v); | ||||
| 			ADJERR_LOC (rtx, &nde->loc); | ||||
| @ -2986,7 +2980,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) | ||||
| 		qse_awk_rtx_refupval (rtx, v); | ||||
|  | ||||
| 		vsout.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, v, &vsout) == QSE_NULL) | ||||
| 		if (qse_awk_rtx_valtostr (rtx, v, &vsout) <= -1) | ||||
| 		{ | ||||
| 			qse_awk_rtx_refdownval (rtx, v); | ||||
| 			ADJERR_LOC (rtx, &nde->loc); | ||||
| @ -3620,7 +3614,7 @@ static qse_awk_val_t* do_assignment_pos ( | ||||
| 		qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (run, val, &out) == QSE_NULL) | ||||
| 		if (qse_awk_rtx_valtostr (run, val, &out) <= -1) | ||||
| 		{ | ||||
| 			ADJERR_LOC (run, &pos->loc); | ||||
| 			return QSE_NULL; | ||||
| @ -4071,8 +4065,7 @@ static int __cmp_int_str ( | ||||
| 	} | ||||
|  | ||||
| 	out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 	if (qse_awk_rtx_valtostr (rtx, left, &out) == QSE_NULL)  | ||||
| 		return CMP_ERROR; | ||||
| 	if (qse_awk_rtx_valtostr (rtx, left, &out) <= -1) return CMP_ERROR; | ||||
|  | ||||
| 	if (rtx->gbl.ignorecase) | ||||
| 	{ | ||||
| @ -4152,8 +4145,7 @@ static int __cmp_real_str ( | ||||
| 	} | ||||
|  | ||||
| 	out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 	if (qse_awk_rtx_valtostr (rtx, left, &out) == QSE_NULL)  | ||||
| 		return CMP_ERROR; | ||||
| 	if (qse_awk_rtx_valtostr (rtx, left, &out) <= -1) return CMP_ERROR; | ||||
|  | ||||
| 	if (rtx->gbl.ignorecase) | ||||
| 	{ | ||||
| @ -4733,13 +4725,10 @@ static qse_awk_val_t* eval_binop_concat ( | ||||
| 	qse_awk_rtx_valtostr_out_t lout, rout; | ||||
|  | ||||
| 	lout.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 	if (qse_awk_rtx_valtostr (run, left, &lout) == QSE_NULL)  | ||||
| 	{ | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
| 	if (qse_awk_rtx_valtostr (run, left, &lout) <= -1) return QSE_NULL; | ||||
|  | ||||
| 	rout.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 	if (qse_awk_rtx_valtostr (run, right, &rout) == QSE_NULL)  | ||||
| 	if (qse_awk_rtx_valtostr (run, right, &rout) <= -1) | ||||
| 	{ | ||||
| 		QSE_AWK_FREE (run->awk, lout.u.cpldup.ptr); | ||||
| 		return QSE_NULL; | ||||
| @ -4787,8 +4776,7 @@ static qse_awk_val_t* eval_binop_match0 ( | ||||
| 		qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, right, &out) == QSE_NULL) | ||||
| 			return QSE_NULL; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, right, &out) <= -1) return QSE_NULL; | ||||
|  | ||||
| 		rex_code = QSE_AWK_BUILDREX ( | ||||
| 			rtx->awk, out.u.cpldup.ptr, out.u.cpldup.len, &errnum); | ||||
| @ -4834,7 +4822,7 @@ static qse_awk_val_t* eval_binop_match0 ( | ||||
| 		qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (rtx, left, &out) == QSE_NULL) | ||||
| 		if (qse_awk_rtx_valtostr (rtx, left, &out) <= -1) | ||||
| 		{ | ||||
| 			if (right->type != QSE_AWK_VAL_REX)  | ||||
| 				QSE_AWK_FREEREX (rtx->awk, rex_code); | ||||
| @ -6305,7 +6293,7 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde) | ||||
| 		qse_awk_rtx_refupval (run, v); | ||||
|  | ||||
| 		out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 		if (qse_awk_rtx_valtostr (run, v, &out) == QSE_NULL) | ||||
| 		if (qse_awk_rtx_valtostr (run, v, &out) <= -1) | ||||
| 		{ | ||||
| 			qse_awk_rtx_refdownval (run, v); | ||||
| 			return QSE_NULL; | ||||
| @ -6505,10 +6493,7 @@ static int shorten_record (qse_awk_rtx_t* run, qse_size_t nflds) | ||||
| 			qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (run, v, &out) == QSE_NULL) | ||||
| 			{ | ||||
| 				return -1; | ||||
| 			} | ||||
| 			if (qse_awk_rtx_valtostr (run, v, &out) <= -1) return -1; | ||||
|  | ||||
| 			ofs_ptr = out.u.cpldup.ptr; | ||||
| 			ofs_len = out.u.cpldup.len; | ||||
| @ -6601,14 +6586,14 @@ static qse_char_t* idxnde_to_str ( | ||||
| 		if (buf != QSE_NULL) | ||||
| 		{ | ||||
| 			/* try with a fixed-size buffer if given */ | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLCP; | ||||
| 			out.u.cplcp.ptr = buf; | ||||
| 			out.u.cplcp.len = *len; | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLCPY; | ||||
| 			out.u.cplcpy.ptr = buf; | ||||
| 			out.u.cplcpy.len = *len; | ||||
|  | ||||
| 			if (qse_awk_rtx_valtostr (run, idx, &out) != QSE_NULL) | ||||
| 			if (qse_awk_rtx_valtostr (run, idx, &out) >= 0) | ||||
| 			{ | ||||
| 				str = out.u.cplcp.ptr; | ||||
| 				*len = out.u.cplcp.len; | ||||
| 				str = out.u.cplcpy.ptr; | ||||
| 				*len = out.u.cplcpy.len; | ||||
| 				QSE_ASSERT (str == buf); | ||||
| 			} | ||||
| 		} | ||||
| @ -6618,7 +6603,7 @@ static qse_char_t* idxnde_to_str ( | ||||
| 			/* if no fixed-size buffer was given or the fixed-size  | ||||
| 			 * conversion failed, switch to the dynamic mode */ | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (run, idx, &out) == QSE_NULL) | ||||
| 			if (qse_awk_rtx_valtostr (run, idx, &out) <= -1) | ||||
| 			{ | ||||
| 				qse_awk_rtx_refdownval (run, idx); | ||||
| 				ADJERR_LOC (run, &nde->loc); | ||||
| @ -6669,7 +6654,7 @@ static qse_char_t* idxnde_to_str ( | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
|  | ||||
| 			if (qse_awk_rtx_valtostr (run, idx, &out) == QSE_NULL) | ||||
| 			if (qse_awk_rtx_valtostr (run, idx, &out) <= -1) | ||||
| 			{ | ||||
| 				qse_awk_rtx_refdownval (run, idx); | ||||
| 				qse_str_fini (&idxstr); | ||||
| @ -7333,7 +7318,7 @@ qse_char_t* qse_awk_rtx_format ( | ||||
| 				} | ||||
| 	 | ||||
| 				out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 				if (qse_awk_rtx_valtostr (rtx, v, &out) == QSE_NULL) | ||||
| 				if (qse_awk_rtx_valtostr (rtx, v, &out) <= -1) | ||||
| 				{ | ||||
| 					qse_awk_rtx_refdownval (rtx, v); | ||||
| 					return QSE_NULL; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: std.c 462 2011-05-18 14:36:40Z hyunghwan.chung $ | ||||
|  * $Id: std.c 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -991,7 +991,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod) | ||||
| 			QSE_ASSERT (v != QSE_NULL); | ||||
|  | ||||
| 			out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, v, &out) == QSE_NULL) return -1; | ||||
| 			if (qse_awk_rtx_valtostr (rtx, v, &out) <= -1) return -1; | ||||
|  | ||||
| 			if (out.u.cpldup.len == 0) | ||||
| 			{ | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: val.c 479 2011-05-24 15:14:58Z hyunghwan.chung $ | ||||
|  * $Id: val.c 480 2011-05-25 14:00:19Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -753,7 +753,7 @@ qse_bool_t qse_awk_rtx_valtobool (qse_awk_rtx_t* run, const qse_awk_val_t* val) | ||||
| 	return QSE_FALSE; | ||||
| } | ||||
|  | ||||
| static qse_char_t* str_to_str ( | ||||
| static int str_to_str ( | ||||
| 	qse_awk_rtx_t* rtx, const qse_char_t* str, qse_size_t str_len, | ||||
| 	qse_awk_rtx_valtostr_out_t* out) | ||||
| { | ||||
| @ -765,21 +765,21 @@ static qse_char_t* str_to_str ( | ||||
| 		{ | ||||
| 			out->u.cpl.len = str_len; | ||||
| 			out->u.cpl.ptr = str; | ||||
| 			return out->u.cpl.ptr; | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLCP: | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLCPY: | ||||
| 		{ | ||||
| 			if (str_len >= out->u.cplcp.len) | ||||
| 			if (str_len >= out->u.cplcpy.len) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 				out->u.cplcp.len = str_len + 1; | ||||
| 				return QSE_NULL; | ||||
| 				out->u.cplcpy.len = str_len + 1; | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			out->u.cplcp.len =  | ||||
| 				qse_strncpy (out->u.cplcp.ptr, str, str_len); | ||||
| 			return out->u.cplcp.ptr; | ||||
| 			out->u.cplcpy.len =  | ||||
| 				qse_strncpy (out->u.cplcpy.ptr, str, str_len); | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLDUP: | ||||
| @ -790,12 +790,12 @@ static qse_char_t* str_to_str ( | ||||
| 			if (tmp == QSE_NULL)  | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			out->u.cpldup.ptr = tmp; | ||||
| 			out->u.cpldup.len = str_len; | ||||
| 			return tmp; | ||||
| 			return 0; | ||||
| 		} | ||||
| 			 | ||||
| 		case QSE_AWK_RTX_VALTOSTR_STRP: | ||||
| @ -807,10 +807,10 @@ static qse_char_t* str_to_str ( | ||||
| 			if (n == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			return QSE_STR_PTR(out->u.strp); | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_STRPCAT: | ||||
| @ -821,18 +821,18 @@ static qse_char_t* str_to_str ( | ||||
| 			if (n == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			return QSE_STR_PTR(out->u.strpcat); | ||||
| 			return 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 	return QSE_NULL; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| static qse_char_t* val_int_to_str ( | ||||
| static int val_int_to_str ( | ||||
| 	qse_awk_rtx_t* rtx, const qse_awk_val_int_t* v, | ||||
| 	qse_awk_rtx_valtostr_out_t* out) | ||||
| { | ||||
| @ -842,96 +842,36 @@ static qse_char_t* val_int_to_str ( | ||||
| 	int type = out->type & ~QSE_AWK_RTX_VALTOSTR_PRINT; | ||||
|  | ||||
| 	t = v->val;  | ||||
| 	if (t == 0) | ||||
| 	if (t == 0) rlen++; | ||||
| 	else | ||||
| 	{ | ||||
| 		/* handle zero */ | ||||
| 		switch (type) | ||||
| 		{ | ||||
| 			case QSE_AWK_RTX_VALTOSTR_CPL: | ||||
| 				/* CPL and CPLCP behave the same for int_t. | ||||
| 				 * i just fall through assuming that cplcp  | ||||
| 				 * and cpl are the same type. the following | ||||
| 				 * assertion at least ensure that they have | ||||
| 				 * the same size. */  | ||||
| 				QSE_ASSERT (QSE_SIZEOF(out->u.cpl) == QSE_SIZEOF(out->u.cplcp)); | ||||
| 			case QSE_AWK_RTX_VALTOSTR_CPLCP: | ||||
| 				if (out->u.cplcp.len <= 1) | ||||
| 				{ | ||||
| 					qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 					/* store the buffer size needed */ | ||||
| 					out->u.cplcp.len = 2;  | ||||
| 					return QSE_NULL; | ||||
| 				} | ||||
|  | ||||
| 				out->u.cplcp.len = 1; /* actual length */ | ||||
| 				out->u.cplcp.ptr[0] = QSE_T('0'); | ||||
| 				out->u.cplcp.ptr[1] = QSE_T('\0'); | ||||
| 				return out->u.cplcp.ptr; | ||||
|  | ||||
| 			case QSE_AWK_RTX_VALTOSTR_CPLDUP: | ||||
| 				tmp = QSE_AWK_ALLOC ( | ||||
| 					rtx->awk, 2 * QSE_SIZEOF(qse_char_t)); | ||||
| 				if (tmp == QSE_NULL) | ||||
| 				{ | ||||
| 					qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 					return QSE_NULL; | ||||
| 				} | ||||
|  | ||||
| 				tmp[0] = QSE_T('0'); | ||||
| 				tmp[1] = QSE_T('\0'); | ||||
| 				 | ||||
| 				out->u.cpldup.ptr = tmp; | ||||
| 				out->u.cpldup.len = 1; /* actual length */ | ||||
| 				return out->u.cpldup.ptr; | ||||
|  | ||||
| 			case QSE_AWK_RTX_VALTOSTR_STRP: | ||||
| 				qse_str_clear (out->u.strp); | ||||
| 				if (qse_str_ccat (out->u.strp, QSE_T('0')) == (qse_size_t)-1) | ||||
| 				{ | ||||
| 					qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 					return QSE_NULL; | ||||
| 				} | ||||
| 				return QSE_STR_PTR(out->u.strp); | ||||
|  | ||||
| 			case QSE_AWK_RTX_VALTOSTR_STRPCAT: | ||||
| 				if (qse_str_ccat (out->u.strpcat, QSE_T('0')) == (qse_size_t)-1) | ||||
| 				{ | ||||
| 					qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 					return QSE_NULL; | ||||
| 				} | ||||
| 				return QSE_STR_PTR(out->u.strpcat); | ||||
| 		} | ||||
|  | ||||
| 		qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 		return QSE_NULL; | ||||
| 		/* non-zero values */ | ||||
| 		if (t < 0) { t = -t; rlen++; } | ||||
| 		while (t > 0) { rlen++; t /= 10; } | ||||
| 	} | ||||
|  | ||||
| 	/* non-zero values */ | ||||
| 	if (t < 0) { t = -t; rlen++; } | ||||
| 	while (t > 0) { rlen++; t /= 10; } | ||||
|  | ||||
| 	switch (type) | ||||
| 	{ | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPL: | ||||
| 			/* CPL and CPLCP behave the same for int_t. | ||||
| 			 * i just fall through assuming that cplcp  | ||||
| 			 * i just fall through assuming that cplcpy  | ||||
| 			 * and cpl are the same type. the following | ||||
| 			 * assertion at least ensure that they have | ||||
| 			 * the same size. */  | ||||
| 			QSE_ASSERT (QSE_SIZEOF(out->u.cpl) == QSE_SIZEOF(out->u.cplcp)); | ||||
| 			QSE_ASSERT (QSE_SIZEOF(out->u.cpl) == QSE_SIZEOF(out->u.cplcpy)); | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLCP: | ||||
| 			if (rlen >= out->u.cplcp.len) | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLCPY: | ||||
| 			if (rlen >= out->u.cplcpy.len) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 				/* store the buffer size needed */ | ||||
| 				out->u.cplcp.len = rlen + 1;  | ||||
| 				return QSE_NULL; | ||||
| 				out->u.cplcpy.len = rlen + 1;  | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			tmp = out->u.cplcp.ptr; | ||||
| 			tmp = out->u.cplcpy.ptr; | ||||
| 			tmp[rlen] = QSE_T('\0'); | ||||
| 			out->u.cplcp.len = rlen; | ||||
| 			out->u.cplcpy.len = rlen; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLDUP: | ||||
| @ -940,7 +880,7 @@ static qse_char_t* val_int_to_str ( | ||||
| 			if (tmp == QSE_NULL) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			tmp[rlen] = QSE_T('\0'); | ||||
| @ -963,7 +903,7 @@ static qse_char_t* val_int_to_str ( | ||||
| 			if (n == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				return -1; | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| @ -980,42 +920,40 @@ static qse_char_t* val_int_to_str ( | ||||
| 			if (n == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				return -1; | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	t = v->val;  | ||||
| 	if (t < 0) t = -t; | ||||
|  | ||||
| 	/* fill in the buffer with digits */ | ||||
| 	while (t > 0)  | ||||
| 	if (t == 0) tmp[0] = QSE_T('0');  | ||||
| 	else | ||||
| 	{ | ||||
| 		tmp[--rlen] = (qse_char_t)(t % 10) + QSE_T('0'); | ||||
| 		t /= 10; | ||||
| 		if (t < 0) t = -t; | ||||
|  | ||||
| 		/* fill in the buffer with digits */ | ||||
| 		while (t > 0)  | ||||
| 		{ | ||||
| 			tmp[--rlen] = (qse_char_t)(t % 10) + QSE_T('0'); | ||||
| 			t /= 10; | ||||
| 		} | ||||
|  | ||||
| 		/* insert the negative sign if necessary */ | ||||
| 		if (v->val < 0) tmp[--rlen] = QSE_T('-'); | ||||
| 	} | ||||
|  | ||||
| 	/* insert the negative sign if necessary */ | ||||
| 	if (v->val < 0) tmp[--rlen] = QSE_T('-'); | ||||
|  | ||||
| 	if (type == QSE_AWK_RTX_VALTOSTR_STRPCAT) | ||||
| 	{ | ||||
| 		/* for concatenation type, change tmp to | ||||
| 		 * point to the buffer */ | ||||
| 		tmp = QSE_STR_PTR(out->u.strpcat); | ||||
| 	} | ||||
|  | ||||
| 	return tmp; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static qse_char_t* val_real_to_str ( | ||||
| static int val_real_to_str ( | ||||
| 	qse_awk_rtx_t* rtx, const qse_awk_val_real_t* v, | ||||
| 	qse_awk_rtx_valtostr_out_t* out) | ||||
| { | ||||
| 	qse_char_t* tmp; | ||||
| 	qse_size_t tmp_len; | ||||
| 	qse_str_t buf, fbu; | ||||
| 	int buf_inited = 0, fbu_inited = 0; | ||||
| 	int type = out->type & ~QSE_AWK_RTX_VALTOSTR_PRINT; | ||||
|  | ||||
| 	if (out->type & QSE_AWK_RTX_VALTOSTR_PRINT) | ||||
| @ -1032,63 +970,52 @@ static qse_char_t* val_real_to_str ( | ||||
| 	if (qse_str_init (&buf, rtx->awk->mmgr, 256) == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	buf_inited = 1; | ||||
|  | ||||
| 	if (qse_str_init (&fbu, rtx->awk->mmgr, 256) == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_str_fini (&buf); | ||||
| 		qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	fbu_inited = 1; | ||||
|  | ||||
| 	tmp = qse_awk_rtx_format (rtx, &buf, &fbu, tmp, tmp_len,  | ||||
| 		(qse_size_t)-1, (qse_awk_nde_t*)v, &tmp_len); | ||||
| 	if (tmp == QSE_NULL)  | ||||
| 	{ | ||||
| 		qse_str_fini (&fbu); | ||||
| 		qse_str_fini (&buf); | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
| 	if (tmp == QSE_NULL) goto oops; | ||||
|  | ||||
| 	switch (type) | ||||
| 	{ | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPL: | ||||
| 			/* CPL and CPLCP behave the same for real_t. | ||||
| 			 * i just fall through assuming that cplcp  | ||||
| 			 * i just fall through assuming that cplcpy  | ||||
| 			 * and cpl are the same type. the following | ||||
| 			 * assertion at least ensure that they have | ||||
| 			 * the same size. */  | ||||
| 			QSE_ASSERT (QSE_SIZEOF(out->u.cpl) == QSE_SIZEOF(out->u.cplcp)); | ||||
| 			QSE_ASSERT (QSE_SIZEOF(out->u.cpl) == QSE_SIZEOF(out->u.cplcpy)); | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLCP: | ||||
| 			if (out->u.cplcp.len <= tmp_len) | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLCPY: | ||||
| 			if (out->u.cplcpy.len <= tmp_len) | ||||
| 			{ | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 				/* store the buffer size required */ | ||||
| 				out->u.cplcp.len = tmp_len + 1;  | ||||
| 				qse_str_close (&fbu); | ||||
| 				qse_str_close (&buf); | ||||
| 				return QSE_NULL; | ||||
| 				out->u.cplcpy.len = tmp_len + 1;  | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| 			qse_strncpy (out->u.cplcp.ptr, tmp, tmp_len); | ||||
| 			out->u.cplcp.len = tmp_len; | ||||
| 			tmp = out->u.cplcp.ptr; | ||||
|  | ||||
| 			qse_str_fini (&fbu); | ||||
| 			qse_str_fini (&buf); | ||||
| 			return tmp; | ||||
| 			qse_strncpy (out->u.cplcpy.ptr, tmp, tmp_len); | ||||
| 			out->u.cplcpy.len = tmp_len; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_CPLDUP: | ||||
| 			qse_str_fini (&fbu); | ||||
|  | ||||
| 		{ | ||||
| 			qse_str_yield (&buf, QSE_NULL, 0); | ||||
| 			qse_str_fini (&buf); | ||||
|  | ||||
| 			out->u.cpldup.ptr = tmp; | ||||
| 			out->u.cpldup.len = tmp_len; | ||||
| 			return tmp; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_STRP: | ||||
| 		{ | ||||
| @ -1099,17 +1026,10 @@ static qse_char_t* val_real_to_str ( | ||||
| 			n = qse_str_ncat (out->u.strp, tmp, tmp_len); | ||||
| 			if (n == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_str_fini (&fbu); | ||||
| 				qse_str_fini (&buf); | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| 			tmp = QSE_STR_PTR(out->u.strp); | ||||
|  | ||||
| 			qse_str_fini (&fbu); | ||||
| 			qse_str_fini (&buf); | ||||
| 			return tmp; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_RTX_VALTOSTR_STRPCAT: | ||||
| @ -1119,27 +1039,30 @@ static qse_char_t* val_real_to_str ( | ||||
| 			n = qse_str_ncat (out->u.strpcat, tmp, tmp_len); | ||||
| 			if (n == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_str_fini (&fbu); | ||||
| 				qse_str_fini (&buf); | ||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 				goto oops; | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 			tmp = QSE_STR_PTR(out->u.strpcat); | ||||
|  | ||||
| 			qse_str_fini (&fbu); | ||||
| 			qse_str_fini (&buf); | ||||
| 			return tmp; | ||||
| 		default: | ||||
| 		{ | ||||
| 			qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 			goto oops; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	qse_str_fini (&fbu); | ||||
| 	qse_str_fini (&buf); | ||||
| 	qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 	return QSE_NULL; | ||||
| 	return 0; | ||||
|  | ||||
| oops: | ||||
| 	if (fbu_inited) qse_str_fini (&fbu); | ||||
| 	if (buf_inited) qse_str_fini (&buf); | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_awk_rtx_valtostr ( | ||||
| int qse_awk_rtx_valtostr ( | ||||
| 	qse_awk_rtx_t* rtx, const qse_awk_val_t* v, | ||||
| 	qse_awk_rtx_valtostr_out_t* out) | ||||
| { | ||||
| @ -1176,7 +1099,7 @@ qse_char_t* qse_awk_rtx_valtostr ( | ||||
| #endif | ||||
|  | ||||
| 	qse_awk_rtx_seterrnum (rtx, QSE_AWK_EVALTYPE, QSE_NULL); | ||||
| 	return QSE_NULL; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_awk_rtx_valtocpldup ( | ||||
| @ -1185,7 +1108,7 @@ qse_char_t* qse_awk_rtx_valtocpldup ( | ||||
| 	qse_awk_rtx_valtostr_out_t out; | ||||
|  | ||||
| 	out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; | ||||
| 	if (qse_awk_rtx_valtostr (rtx, v, &out) == QSE_NULL) return QSE_NULL; | ||||
| 	if (qse_awk_rtx_valtostr (rtx, v, &out) <= -1) return QSE_NULL; | ||||
|  | ||||
| 	*len = out.u.cpldup.len; | ||||
| 	return out.u.cpldup.ptr; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user