Пример #1
0
static int fnc_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
	qse_awk_val_t* retv;
	qse_awk_int_t errnum;

/*
	list = rtx_to_list (rtx, fi);

	if (qse_awk_rtx_getnargs (rtx) <= 0 ||
	    qse_awk_rtx_valtoint (rtx, qse_awk_rtx_getarg (rtx, 0), &errnum) <= -1)
	{
		errnum = list->errnum;
	}
*/

	ret = qse_awk_rtx_valtoint (rtx, qse_awk_rtx_getarg (rtx, 0), &id);
	if (ret <= -1) errnum = -1;


	if (errnum < 0 || errnum >= QSE_COUNTOF(errmsg)) errnum = QSE_COUNTOF(errmsg) - 1;

	retv = qse_awk_rtx_makestrvalwithstr (rtx, errmsg[errnum]);
	if (retv == QSE_NULL) return -1;

	qse_awk_rtx_setretval (rtx, retv);
	return 0;
}
Пример #2
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;
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
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;
}
Пример #6
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;
}
Пример #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;
}