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; }
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; }
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; }
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; }
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; }
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; }
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; }