Beispiel #1
0
static int is_class (qse_awk_rtx_t* rtx, qse_ctype_t ctype)
{
	qse_awk_val_t* a0;
	qse_char_t* str0;
	qse_size_t len0;
	int tmp;

	a0 = qse_awk_rtx_getarg (rtx, 0);

	str0 = qse_awk_rtx_getvalstr (rtx, a0, &len0);
	if (str0 == QSE_NULL) return -1;

	if (len0 <= 0) tmp = 0;
	else
	{
		tmp = 1;
		do
		{
			len0--;
			if (!qse_isctype(str0[len0], ctype)) 
			{
				tmp = 0;
				break;
			}
		}
		while (len0 > 0);
		qse_awk_rtx_freevalstr (rtx, a0, str0);
	}

	a0 = qse_awk_rtx_makeintval (rtx, tmp);
	if (a0 == QSE_NULL) return -1;

	qse_awk_rtx_setretval (rtx, a0);
	return 0;
}
Beispiel #2
0
static int fnc_value (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
	/* return the numeric value for the first character.
	 * you can use sprintf("%c", num_val) for reverse conversion. */

	qse_cstr_t path;
	qse_awk_val_t* retv;
	qse_awk_val_t* a0;

	a0 = qse_awk_rtx_getarg(rtx, 0);

	path.ptr = qse_awk_rtx_getvalstr (rtx, a0, &path.len);
	if (path.ptr && path.len >= 1)
	{
	#if defined(QSE_CHAR_IS_MCHAR)
		/* typecasting in case qse_mchar_t is signed */
		retv = qse_awk_rtx_makeintval (rtx, (unsigned char)path.ptr[0]);
	#else
		retv = qse_awk_rtx_makeintval (rtx, path.ptr[0]);
	#endif
		qse_awk_rtx_freevalstr (rtx, a0, path.ptr);
		if (retv) qse_awk_rtx_setretval (rtx, retv);
	}

	return 0;
}
Beispiel #3
0
static int fnc_file_to_file (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
	qse_sed_t* sed = QSE_NULL;
	qse_awk_val_t* retv;
	qse_awk_val_t* a[3];
	qse_cstr_t xstr[3];
	int i = 0, ret = 0;

	/* result = sed::file_to_file ("s/ABC/123/g", input_file, output_file [, option_string]) */

	sed = qse_sed_openstdwithmmgr (qse_awk_rtx_getmmgr(rtx), 0);
	if (sed == QSE_NULL) 
	{
		ret = -2;
		goto oops;
	}

/* TODO qse_set_opt (TRAIT) using the optional parameter */

	for (i = 0; i < 3; i++)
	{
		a[i] = qse_awk_rtx_getarg (rtx, i);
		xstr[i].ptr = qse_awk_rtx_getvalstr (rtx, a[i], &xstr[i].len);
		if (xstr[i].ptr == QSE_NULL) 
		{
			ret = -2;
			goto oops;
		}
	}

	if (qse_sed_compstdxstr (sed, &xstr[0]) <= -1) 
	{
		ret = -3; /* compile error */
		goto oops;
	}

	if (qse_sed_execstdfile (sed, xstr[1].ptr, xstr[2].ptr, QSE_NULL) <= -1) 
	{
		ret = -4;
		goto oops;
	}

oops:
	retv = qse_awk_rtx_makeintval (rtx, ret);
	if (retv == QSE_NULL) retv = qse_awk_rtx_makeintval (rtx, -1);

	while (i > 0)
	{
		--i;
		qse_awk_rtx_freevalstr (rtx, a[i], xstr[i].ptr);
	}

	if (sed) qse_sed_close (sed);
	qse_awk_rtx_setretval (rtx, retv);
	return 0;
}
Beispiel #4
0
static int trim (qse_awk_rtx_t* rtx, int flags)
{
	qse_cstr_t path;
	qse_char_t* npath;
	qse_awk_val_t* retv;
	qse_awk_val_t* a0;

	a0 = qse_awk_rtx_getarg(rtx, 0);

	path.ptr = qse_awk_rtx_getvalstr (rtx, a0, &path.len);
	if (path.ptr)
	{
		npath = qse_strxtrmx (path.ptr, &path.len, flags);
		retv = qse_awk_rtx_makestrval (rtx, npath, path.len);
		qse_awk_rtx_freevalstr (rtx, a0, path.ptr);
		if (retv) qse_awk_rtx_setretval (rtx, retv);
	}

	return 0;
}
Beispiel #5
0
static int fnc_normspace (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
	/* normalize spaces 
	 * - trim leading and trailing spaces
	 * - replace a series of spaces to a single space
	 */
	qse_cstr_t path;
	qse_awk_val_t* retv;
	qse_awk_val_t* a0;

	a0 = qse_awk_rtx_getarg(rtx, 0);

	path.ptr = qse_awk_rtx_getvalstr (rtx, a0, &path.len);
	if (path.ptr)
	{
		path.len = qse_strxpac (path.ptr, path.len);
		retv = qse_awk_rtx_makestrval (rtx, path.ptr, path.len);
		qse_awk_rtx_freevalstr (rtx, a0, path.ptr);
		if (retv) qse_awk_rtx_setretval (rtx, retv);
	}

	return 0;
}
Beispiel #6
0
int qse_awk_rtx_matchrex (
	qse_awk_rtx_t* rtx, qse_awk_val_t* val,
	const qse_cstr_t* str, const qse_cstr_t* substr, qse_cstr_t* match, qse_cstr_t submat[9])
{
	void* code;
	int icase, x;
	qse_awk_errnum_t awkerr;
#if defined(USE_REX)
	qse_rex_errnum_t rexerr;
#endif

	icase = rtx->gbl.ignorecase;

	if (QSE_AWK_RTX_GETVALTYPE (rtx, val) == QSE_AWK_VAL_REX)
	{
		code = ((qse_awk_val_rex_t*)val)->code[icase];
	}
	else 
	{
		/* convert to a string and build a regular expression */
		qse_cstr_t tmp;

		tmp.ptr = qse_awk_rtx_getvalstr (rtx, val, &tmp.len);
		if (tmp.ptr == QSE_NULL) return -1;

		x = icase? qse_awk_buildrex (rtx->awk, tmp.ptr, tmp.len, &awkerr, QSE_NULL, &code):
		           qse_awk_buildrex (rtx->awk, tmp.ptr, tmp.len, &awkerr, &code, QSE_NULL);
		qse_awk_rtx_freevalstr (rtx, val, tmp.ptr);
		if (x <= -1)
		{
			qse_awk_rtx_seterrnum (rtx, awkerr, QSE_NULL);
			return -1;
		}
	}
	
#if defined(USE_REX)
	/* submatch not supported */
	x = qse_matchrex (
		rtx->awk->mmgr, rtx->awk->opt.depth.s.rex_match,
		code, (icase? QSE_REX_IGNORECASE: 0),
		str, substr, match, &rexerr);
	if (x <= -1) qse_awk_rtx_seterrnum (rtx, rexerr_to_errnum(rexerr), QSE_NULL);
#else
	x = matchtre (
		rtx->awk, code,
		((str->ptr == substr->ptr)? QSE_TRE_BACKTRACKING: (QSE_TRE_BACKTRACKING | QSE_TRE_NOTBOL)),
		substr, match, submat, &awkerr
	);
	if (x <= -1) qse_awk_rtx_seterrnum (rtx, awkerr, QSE_NULL);
#endif

	if (QSE_AWK_RTX_GETVALTYPE(rtx, val) == QSE_AWK_VAL_REX) 
	{
		/* nothing to free */
	}
	else
	{
		if (icase) 
			qse_awk_freerex (rtx->awk, QSE_NULL, code);
		else
			qse_awk_freerex (rtx->awk, code, QSE_NULL);
	}

	return x;
}
Beispiel #7
0
static int fnc_str_to_str (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
	qse_sed_t* sed = QSE_NULL;
	qse_awk_val_t* retv;
	qse_awk_val_t* a[2], * tmp;
	qse_cstr_t xstr[2];
	qse_cstr_t outstr;
	int i = 0, ret = 0, n;

	sed = qse_sed_openstdwithmmgr (qse_awk_rtx_getmmgr(rtx), 0);
	if (sed == QSE_NULL) 
	{
		ret = -2;
		goto oops;
	}

/* TODO qse_set_opt (TRAIT) using the optional parameter */

	for (i = 0; i < 2; i++)
	{
		a[i] = qse_awk_rtx_getarg (rtx, i);
		xstr[i].ptr = qse_awk_rtx_getvalstr (rtx, a[i], &xstr[i].len);
		if (xstr[i].ptr == QSE_NULL) 
		{
			ret = -2;
			goto oops;
		}
	}

	if (qse_sed_compstdxstr (sed, &xstr[0]) <= -1) 
	{
		ret = -3; /* compile error */
		goto oops;
	}

	if (qse_sed_execstdxstr (sed, &xstr[1], &outstr, QSE_NULL) <= -1) 
	{
		ret = -4;
		goto oops;
	}

	tmp = qse_awk_rtx_makestrvalwithxstr (rtx, &outstr);
	qse_sed_freemem (sed, outstr.ptr);

	if (!tmp)
	{
		ret = -1;
		goto oops;
	}

	qse_awk_rtx_refupval (rtx, tmp);
	n = qse_awk_rtx_setrefval (rtx, (qse_awk_val_ref_t*)qse_awk_rtx_getarg (rtx, 2), tmp);
	qse_awk_rtx_refdownval (rtx, tmp);
	if (n <= -1)
	{
		ret = -5;
		goto oops;
	}

oops:
	retv = qse_awk_rtx_makeintval (rtx, ret);
	if (retv == QSE_NULL) retv = qse_awk_rtx_makeintval (rtx, -1);

	while (i > 0)
	{
		--i;
		qse_awk_rtx_freevalstr (rtx, a[i], xstr[i].ptr);
	}

	if (sed) qse_sed_close (sed);
	qse_awk_rtx_setretval (rtx, retv);
	return 0;
}