enhanced and fixed a few functions.

- qse_awk_rtx_call()
- qse_awk_parsesimple() 
- qse_awk_parsesimple_in_t
- qse_awk_parsesimple_out_t
This commit is contained in:
2009-02-23 08:10:34 +00:00
parent 2e24e29e8c
commit d0ce35eacf
55 changed files with 615 additions and 363 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp 496 2008-12-15 09:56:48Z baconevi $
* $Id: Awk.cpp 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: StdAwk.cpp 501 2008-12-17 08:39:15Z baconevi $
* $Id: StdAwk.cpp 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c 501 2008-12-17 08:39:15Z baconevi $
* $Id: awk.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: awk_i.h 332 2008-08-18 11:21:48Z baconevi $
* $Id: awk.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: err.c 337 2008-08-20 09:17:25Z baconevi $
* $Id: err.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: func.c 499 2008-12-16 09:42:48Z baconevi $
* $Id: fnc.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -250,7 +250,7 @@ static int fnc_close (
else
{
name = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (name == QSE_NULL) return -1;
}
@ -364,7 +364,7 @@ static int fnc_fflush (
else
{
str0 = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len0);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len0);
if (str0 == QSE_NULL) return -1;
}
@ -437,7 +437,7 @@ static int fnc_index (
else
{
str0 = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len0);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len0);
if (str0 == QSE_NULL) return -1;
}
@ -449,7 +449,7 @@ static int fnc_index (
else
{
str1 = qse_awk_rtx_valtostr (
run, a1, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len1);
run, a1, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len1);
if (str1 == QSE_NULL)
{
if (a0->type != QSE_AWK_VAL_STR)
@ -494,7 +494,7 @@ static int fnc_length (
else
{
str = qse_awk_rtx_valtostr (
run, v, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, v, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return -1;
QSE_AWK_FREE (run->awk, str);
}
@ -536,7 +536,7 @@ static int fnc_substr (
else
{
str = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return -1;
}
@ -642,7 +642,7 @@ static int fnc_split (
else
{
str = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &str_len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &str_len);
if (str == QSE_NULL) return -1;
str_free = str;
}
@ -666,7 +666,7 @@ static int fnc_split (
else
{
fs_ptr = qse_awk_rtx_valtostr (
run, t1, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
run, t1, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
if (fs_ptr == QSE_NULL)
{
if (str_free != QSE_NULL)
@ -693,7 +693,7 @@ static int fnc_split (
else
{
fs_ptr = qse_awk_rtx_valtostr (
run, a2, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
run, a2, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
if (fs_ptr == QSE_NULL)
{
if (str_free != QSE_NULL)
@ -861,7 +861,7 @@ static int fnc_tolower (
else
{
str = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return -1;
}
@ -901,7 +901,7 @@ static int fnc_toupper (
else
{
str = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return -1;
}
@ -968,7 +968,7 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
else
{
a0_ptr = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &a0_len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &a0_len);
if (a0_ptr == QSE_NULL)
{
FREE_A_PTRS (run->awk);
@ -985,7 +985,7 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
else
{
a1_ptr = qse_awk_rtx_valtostr (
run, a1, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &a1_len);
run, a1, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &a1_len);
if (a1_ptr == QSE_NULL)
{
FREE_A_PTRS (run->awk);
@ -1041,7 +1041,7 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
else
{
a2_ptr = qse_awk_rtx_valtostr (
run, *a2_ref, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &a2_len);
run, *a2_ref, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &a2_len);
if (a2_ptr == QSE_NULL)
{
FREE_A_PTRS (run->awk);
@ -1250,7 +1250,7 @@ static int fnc_match (
else
{
str0 = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len0);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len0);
if (str0 == QSE_NULL) return -1;
}
@ -1268,7 +1268,7 @@ static int fnc_match (
else
{
str1 = qse_awk_rtx_valtostr (
run, a1, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len1);
run, a1, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len1);
if (str1 == QSE_NULL)
{
if (a0->type != QSE_AWK_VAL_STR)
@ -1374,7 +1374,7 @@ static int fnc_sprintf (
else
{
cs0.ptr = qse_awk_rtx_valtostr (
run, a0, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &cs0.len);
run, a0, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &cs0.len);
if (cs0.ptr == QSE_NULL)
{
qse_str_fini (&fbu);

View File

@ -1,5 +1,5 @@
/*
* $Id: func.h 363 2008-09-04 10:58:08Z baconevi $
* $Id: fnc.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: misc.c 337 2008-08-20 09:17:25Z baconevi $
* $Id: misc.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: misc.h 363 2008-09-04 10:58:08Z baconevi $
* $Id: misc.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.c 496 2008-12-15 09:56:48Z baconevi $
* $Id: parse.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.h 363 2008-09-04 10:58:08Z baconevi $
* $Id: parse.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: rec.c 372 2008-09-23 09:51:24Z baconevi $
* $Id: rec.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -123,7 +123,7 @@ static int split_record (qse_awk_rtx_t* run)
else
{
fs_ptr = qse_awk_rtx_valtostr (
run, fs, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
run, fs, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
if (fs_ptr == QSE_NULL) return -1;
fs_free = fs_ptr;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: eio.c 466 2008-12-09 09:50:40Z baconevi $
* $Id: rio.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -218,7 +218,7 @@ int qse_awk_rtx_readio (
else
{
rs_ptr = qse_awk_rtx_valtostr (
run, rs, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &rs_len);
run, rs, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &rs_len);
if (rs_ptr == QSE_NULL)
{
qse_awk_rtx_refdownval (run, rs);
@ -426,7 +426,7 @@ int qse_awk_rtx_writeio_val (
{
str = qse_awk_rtx_valtostr (
run, v,
QSE_AWK_VALTOSTR_CLEAR | QSE_AWK_VALTOSTR_PRINT,
QSE_AWK_RTX_VALTOSTR_CLEAR | QSE_AWK_RTX_VALTOSTR_PRINT,
QSE_NULL, &len);
if (str == QSE_NULL) return -1;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: eio.h 363 2008-09-04 10:58:08Z baconevi $
* $Id: rio.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: run.c 496 2008-12-15 09:56:48Z baconevi $
* $Id: run.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -315,7 +315,7 @@ static int set_global (
qse_size_t convfmt_len, i;
convfmt_ptr = qse_awk_rtx_valtostr (run,
val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &convfmt_len);
val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &convfmt_len);
if (convfmt_ptr == QSE_NULL) return -1;
for (i = 0; i < convfmt_len; i++)
@ -362,7 +362,7 @@ static int set_global (
QSE_ASSERT (val->type != QSE_AWK_VAL_REX);
fs_ptr = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &fs_len);
if (fs_ptr == QSE_NULL) return -1;
}
@ -443,7 +443,7 @@ static int set_global (
qse_size_t ofmt_len, i;
ofmt_ptr = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &ofmt_len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &ofmt_len);
if (ofmt_ptr == QSE_NULL) return -1;
for (i = 0; i < ofmt_len; i++)
@ -467,7 +467,7 @@ static int set_global (
qse_size_t ofs_len;
ofs_ptr = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &ofs_len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &ofs_len);
if (ofs_ptr == QSE_NULL) return -1;
if (run->gbl.ofs.ptr != QSE_NULL)
@ -481,7 +481,7 @@ static int set_global (
qse_size_t ors_len;
ors_ptr = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &ors_len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &ors_len);
if (ors_ptr == QSE_NULL) return -1;
if (run->gbl.ors.ptr != QSE_NULL)
@ -506,7 +506,7 @@ static int set_global (
QSE_ASSERT (val->type != QSE_AWK_VAL_REX);
rs_ptr = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &rs_len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &rs_len);
if (rs_ptr == QSE_NULL) return -1;
}
@ -540,7 +540,7 @@ static int set_global (
qse_size_t subsep_len;
subsep_ptr = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &subsep_len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &subsep_len);
if (subsep_ptr == QSE_NULL) return -1;
if (run->gbl.subsep.ptr != QSE_NULL)
@ -1271,7 +1271,6 @@ static void capture_retval_on_exit (void* arg)
qse_awk_rtx_refupval (data->rtx, data->val);
}
static int enter_stack_frame (qse_awk_rtx_t* run)
{
qse_size_t saved_stack_top;
@ -1462,11 +1461,13 @@ int qse_awk_rtx_loop (qse_awk_rtx_t* rtx)
}
/* call an AWK function */
int qse_awk_rtx_call (
qse_awk_val_t* qse_awk_rtx_call (
qse_awk_rtx_t* rtx, const qse_char_t* name,
qse_awk_val_t** args, qse_size_t nargs)
{
#if 0
int ret = 0;
#endif
qse_map_pair_t* pair;
qse_awk_fun_t* fun;
struct capture_retval_data_t crdata;
@ -1479,7 +1480,7 @@ int qse_awk_rtx_call (
/* cannot call the function again when exit() is called
* in an AWK program or qse_awk_rtx_stop() is invoked */
qse_awk_rtx_seterror (rtx, QSE_AWK_ENOPER, 0, QSE_NULL);
return -1;
return QSE_NULL;
}
/*rtx->exit_level = EXIT_NONE;*/
@ -1503,7 +1504,7 @@ int qse_awk_rtx_call (
errarg.len = call.what.fun.name.len;
qse_awk_rtx_seterror (rtx, QSE_AWK_EFUNNONE, 0, &errarg);
return -1;
return QSE_NULL;
}
fun = (qse_awk_fun_t*)QSE_MAP_VPTR(pair);
@ -1515,7 +1516,7 @@ int qse_awk_rtx_call (
/* TODO: is this correct? what if i want to
* allow arbitarary numbers of arguments? */
qse_awk_rtx_seterror (rtx, QSE_AWK_EARGTM, 0, QSE_NULL);
return -1;
return QSE_NULL;
}
/* now that the function is found and ok, let's execute it */
@ -1530,10 +1531,46 @@ int qse_awk_rtx_call (
&crdata
);
if (v == QSE_NULL)
{
/* an error occurred. let's check if it is caused by exit().
* if so, the return value should have been captured into
* crdata.val. */
if (crdata.val != QSE_NULL) v = crdata.val; /* yet it is */
}
else
{
/* thr return value captured in termination by exit()
* is reference-counted up in capture_retval_on_exit().
* let's do the same thing for the return value normally
* returned. */
qse_awk_rtx_refupval (rtx, v);
}
if (rtx->rcb.on_exit != QSE_NULL)
{
rtx->rcb.on_exit (
rtx,
((v == QSE_NULL)? qse_awk_val_nil: v),
rtx->rcb.data
);
}
/* return the return value with its reference count at least 1.
* the caller of this function should reference-count it down. */
return v;
#if 0
if (v == QSE_NULL)
{
/* an error occurred. but this might have been
* caused by exit(). so let's check it */
if (crdata.val == QSE_NULL)
{
/* no return value has been caputured. this must
* be an error */
QSE_ASSERT (rtx->errnum != QSE_AWK_ENOERR);
v = qse_awk_val_nil; /* defaults to nil */
ret = -1;
@ -1556,17 +1593,19 @@ int qse_awk_rtx_call (
}
else
{
/* the reference count of crdata.val is updated in
* capture_retval_on_exit(). update reference count of
* v here to balance it */
/* the return value captured in termination by exit()
* is reference-counted up in capture_retval_on_exit().
* let's do the same thing for the return value normally
* returned. */
qse_awk_rtx_refupval (rtx, v);
}
if (rtx->rcb.on_exit != QSE_NULL)
rtx->rcb.on_exit (rtx, v, rtx->rcb.data);
qse_awk_rtx_refdownval (rtx, v);
qse_awk_rtx_refdownval (rtx, v);
return ret;
#endif
}
static int run_pattern_blocks (qse_awk_rtx_t* run)
@ -2534,13 +2573,13 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde)
/* try with a fixed-size buffer */
keylen = QSE_COUNTOF(buf);
key = qse_awk_rtx_valtostr (
run, idx, QSE_AWK_VALTOSTR_FIXED,
run, idx, QSE_AWK_RTX_VALTOSTR_FIXED,
(qse_str_t*)buf, &keylen);
if (key == QSE_NULL)
{
/* if it doesn't work, switch to dynamic mode */
key = qse_awk_rtx_valtostr (
run, idx, QSE_AWK_VALTOSTR_CLEAR,
run, idx, QSE_AWK_RTX_VALTOSTR_CLEAR,
QSE_NULL, &keylen);
}
@ -2659,13 +2698,13 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde)
/* try with a fixed-size buffer */
keylen = QSE_COUNTOF(buf);
key = qse_awk_rtx_valtostr (
run, idx, QSE_AWK_VALTOSTR_FIXED,
run, idx, QSE_AWK_RTX_VALTOSTR_FIXED,
(qse_str_t*)buf, &keylen);
if (key == QSE_NULL)
{
/* if it doesn't work, switch to dynamic mode */
key = qse_awk_rtx_valtostr (
run, idx, QSE_AWK_VALTOSTR_CLEAR,
run, idx, QSE_AWK_RTX_VALTOSTR_CLEAR,
QSE_NULL, &keylen);
}
@ -2779,7 +2818,7 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde)
qse_awk_rtx_refupval (run, v);
out = qse_awk_rtx_valtostr (
run, v, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, v, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (out == QSE_NULL)
{
qse_awk_rtx_refdownval (run, v);
@ -2937,7 +2976,7 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde)
qse_awk_rtx_refupval (run, v);
out = qse_awk_rtx_valtostr (
run, v, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, v, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (out == QSE_NULL)
{
qse_awk_rtx_refdownval (run, v);
@ -3585,7 +3624,7 @@ static qse_awk_val_t* do_assignment_pos (
else
{
str = qse_awk_rtx_valtostr (
run, val, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, val, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL)
{
/* change error line */
@ -4038,7 +4077,7 @@ static int __cmp_int_str (
}
str = qse_awk_rtx_valtostr (
run, left, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, left, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return CMP_ERROR;
if (run->gbl.ignorecase)
@ -4110,7 +4149,7 @@ static int __cmp_real_str (
}
str = qse_awk_rtx_valtostr (
run, left, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, left, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return CMP_ERROR;
if (run->gbl.ignorecase)
@ -4630,11 +4669,11 @@ static qse_awk_val_t* eval_binop_concat (
qse_awk_val_t* res;
strl = qse_awk_rtx_valtostr (
run, left, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &strl_len);
run, left, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &strl_len);
if (strl == QSE_NULL) return QSE_NULL;
strr = qse_awk_rtx_valtostr (
run, right, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &strr_len);
run, right, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &strr_len);
if (strr == QSE_NULL)
{
QSE_AWK_FREE (run->awk, strl);
@ -4739,7 +4778,7 @@ static qse_awk_val_t* eval_binop_match0 (
else
{
str = qse_awk_rtx_valtostr (
run, right, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, right, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return QSE_NULL;
rex_code = QSE_AWK_BUILDREX (run->awk, str, len, &errnum);
@ -4785,7 +4824,7 @@ static qse_awk_val_t* eval_binop_match0 (
else
{
str = qse_awk_rtx_valtostr (
run, left, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, left, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL)
{
if (right->type != QSE_AWK_VAL_REX)
@ -5387,7 +5426,8 @@ static qse_awk_val_t* eval_fnc (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
}
static qse_awk_val_t* eval_fun_ex (
qse_awk_rtx_t* run, qse_awk_nde_t* nde, void(*errhandler)(void*), void* eharg)
qse_awk_rtx_t* run, qse_awk_nde_t* nde,
void(*errhandler)(void*), void* eharg)
{
qse_awk_nde_call_t* call = (qse_awk_nde_call_t*)nde;
qse_awk_fun_t* fun;
@ -5435,8 +5475,7 @@ static qse_awk_val_t* eval_fun (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
while ((nargs) > 0) \
{ \
--(nargs); \
qse_awk_rtx_refdownval ((rtx), \
(rtx)->stack[(rtx)->stack_top-1]); \
qse_awk_rtx_refdownval ((rtx), (rtx)->stack[(rtx)->stack_top-1]); \
__raw_pop (rtx); \
} \
} while (0)
@ -5707,11 +5746,11 @@ static qse_size_t push_arg_from_vals (qse_awk_rtx_t* rtx, qse_awk_nde_call_t* ca
{
if (__raw_push (rtx, pafv->args[nargs]) == -1)
{
/* ugly - v needs to be freed if it doesn't have
/* ugly - arg needs to be freed if it doesn't have
* any reference. but its reference has not been
* updated yet as it is carried out after the
* successful stack push. so it adds up a reference
* and dereferences it */
* updated yet as it is carried out after successful
* stack push. so it adds up a reference and
* dereferences it */
qse_awk_rtx_refupval (rtx, pafv->args[nargs]);
qse_awk_rtx_refdownval (rtx, pafv->args[nargs]);
@ -5720,6 +5759,8 @@ static qse_size_t push_arg_from_vals (qse_awk_rtx_t* rtx, qse_awk_nde_call_t* ca
rtx, QSE_AWK_ENOMEM, call->line, QSE_NULL);
return (qse_size_t)-1;
}
qse_awk_rtx_refupval (rtx, pafv->args[nargs]);
}
return nargs;
@ -6255,7 +6296,7 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde)
* should not be called immediately below */
qse_awk_rtx_refupval (run, v);
in = qse_awk_rtx_valtostr (
run, v, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, v, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (in == QSE_NULL)
{
qse_awk_rtx_refdownval (run, v);
@ -6450,7 +6491,7 @@ static int shorten_record (qse_awk_rtx_t* run, qse_size_t nflds)
else
{
ofs = qse_awk_rtx_valtostr (
run, v, QSE_AWK_VALTOSTR_CLEAR,
run, v, QSE_AWK_RTX_VALTOSTR_CLEAR,
QSE_NULL, &ofs_len);
if (ofs == QSE_NULL) return -1;
@ -6534,14 +6575,14 @@ static qse_char_t* idxnde_to_str (
{
/* try with a fixed-size buffer */
str = qse_awk_rtx_valtostr (
run, idx, QSE_AWK_VALTOSTR_FIXED, (qse_str_t*)buf, len);
run, idx, QSE_AWK_RTX_VALTOSTR_FIXED, (qse_str_t*)buf, len);
}
if (str == QSE_NULL)
{
/* if it doen't work, switch to the dynamic mode */
str = qse_awk_rtx_valtostr (
run, idx, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, len);
run, idx, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, len);
if (str == QSE_NULL)
{
@ -7250,8 +7291,11 @@ qse_char_t* qse_awk_rtx_format (
return QSE_NULL;
}
str = qse_awk_rtx_valtostr (run, v,
QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &str_len);
str = qse_awk_rtx_valtostr (
run, v,
QSE_AWK_RTX_VALTOSTR_CLEAR,
QSE_NULL, &str_len
);
if (str == QSE_NULL)
{
qse_awk_rtx_refdownval (run, v);

View File

@ -1,5 +1,5 @@
/*
* $Id: run.h 363 2008-09-04 10:58:08Z baconevi $
* $Id: run.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id$
* $Id: std.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -17,6 +17,7 @@
*/
#include "awk.h"
#include <qse/awk/std.h>
#include <qse/cmn/sio.h>
#include <qse/cmn/pio.h>
#include <qse/cmn/str.h>
@ -33,33 +34,33 @@ typedef struct xtn_t
{
struct
{
qse_awk_parsesimple_type_t type;
qse_awk_parsestd_type_t type;
union
{
const qse_char_t* file;
const qse_char_t* str;
const qse_char_t* cp;
struct
{
const qse_char_t* ptr;
const qse_char_t* end;
} strl;
} cpl;
} u;
qse_sio_t* handle; /* the handle to an open file */
} in;
struct
{
qse_awk_parsesimple_type_t type;
qse_awk_parsestd_type_t type;
union
{
const qse_char_t* file;
qse_char_t* str;
qse_char_t* cp;
struct
{
qse_xstr_t* osp;
qse_char_t* ptr;
qse_char_t* end;
} strl;
} cpl;
} u;
qse_sio_t* handle;
} out;
@ -88,7 +89,7 @@ typedef struct rxtn_t
} rxtn_t;
const qse_char_t* qse_awk_rtx_opensimple_stdio[] =
const qse_char_t* qse_awk_rtx_openstd_stdio[] =
{
QSE_T(""),
QSE_NULL
@ -137,7 +138,7 @@ static qse_cint_t custom_awk_toccls (
static int add_functions (qse_awk_t* awk);
qse_awk_t* qse_awk_opensimple (void)
qse_awk_t* qse_awk_openstd (void)
{
qse_awk_t* awk;
qse_awk_prm_t prm;
@ -156,9 +157,6 @@ qse_awk_t* qse_awk_opensimple (void)
xtn = (xtn_t*) QSE_XTN (awk);
QSE_MEMSET (xtn, 0, QSE_SIZEOF(xtn_t));
/* set default options */
qse_awk_setoption (awk, QSE_AWK_CLASSIC);
/* add intrinsic functions */
if (add_functions (awk) == -1)
{
@ -169,7 +167,7 @@ qse_awk_t* qse_awk_opensimple (void)
return awk;
}
/*** PARSESIMPLE ***/
/*** PARSESTD ***/
static qse_ssize_t sf_in (
qse_awk_t* awk, qse_awk_sio_cmd_t cmd,
@ -181,7 +179,7 @@ static qse_ssize_t sf_in (
{
switch (xtn->s.in.type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESTD_FILE:
if (xtn->s.in.u.file == QSE_NULL) return -1;
xtn->s.in.handle = qse_sio_open (
@ -193,12 +191,12 @@ static qse_ssize_t sf_in (
if (xtn->s.in.handle == QSE_NULL) return -1;
return 1;
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_STDIO:
xtn->s.in.handle = qse_sio_in;
return 1;
case QSE_AWK_PARSESIMPLE_STR:
case QSE_AWK_PARSESIMPLE_STRL:
case QSE_AWK_PARSESTD_CP:
case QSE_AWK_PARSESTD_CPL:
xtn->s.in.handle = QSE_NULL;
return 1;
}
@ -219,27 +217,27 @@ static qse_ssize_t sf_in (
{
switch (xtn->s.in.type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_FILE:
case QSE_AWK_PARSESTD_STDIO:
QSE_ASSERT (xtn->s.in.handle != QSE_NULL);
return qse_sio_getsn (xtn->s.in.handle, data, size);
case QSE_AWK_PARSESIMPLE_STR:
case QSE_AWK_PARSESTD_CP:
{
qse_size_t n = 0;
while (n < size && *xtn->s.in.u.str != QSE_T('\0'))
while (n < size && *xtn->s.in.u.cp != QSE_T('\0'))
{
data[n++] = *xtn->s.in.u.str++;
data[n++] = *xtn->s.in.u.cp++;
}
return n;
}
case QSE_AWK_PARSESIMPLE_STRL:
case QSE_AWK_PARSESTD_CPL:
{
qse_size_t n = 0;
while (n < size && xtn->s.in.u.strl.ptr < xtn->s.in.u.strl.end)
while (n < size && xtn->s.in.u.cpl.ptr < xtn->s.in.u.cpl.end)
{
data[n++] = *xtn->s.in.u.strl.ptr++;
data[n++] = *xtn->s.in.u.cpl.ptr++;
}
return n;
}
@ -260,7 +258,7 @@ static qse_ssize_t sf_out (
{
switch (xtn->s.out.type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESTD_FILE:
if (xtn->s.out.u.file == QSE_NULL) return -1;
xtn->s.out.handle = qse_sio_open (
@ -274,12 +272,12 @@ static qse_ssize_t sf_out (
if (xtn->s.out.handle == QSE_NULL) return -1;
return 1;
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_STDIO:
xtn->s.out.handle = qse_sio_out;
return 1;
case QSE_AWK_PARSESIMPLE_STR:
case QSE_AWK_PARSESIMPLE_STRL:
case QSE_AWK_PARSESTD_CP:
case QSE_AWK_PARSESTD_CPL:
xtn->s.out.handle = QSE_NULL;
return 1;
}
@ -288,8 +286,8 @@ static qse_ssize_t sf_out (
{
switch (xtn->s.out.type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_FILE:
case QSE_AWK_PARSESTD_STDIO:
qse_sio_flush (xtn->s.out.handle);
if (xtn->s.out.handle != qse_sio_in &&
@ -300,14 +298,14 @@ static qse_ssize_t sf_out (
}
return 0;
case QSE_AWK_PARSESIMPLE_STR:
*xtn->s.out.u.str = QSE_T('\0');
case QSE_AWK_PARSESTD_CP:
*xtn->s.out.u.cp = QSE_T('\0');
return 0;
case QSE_AWK_PARSESIMPLE_STRL:
xtn->s.out.u.strl.osp->len =
xtn->s.out.u.strl.ptr -
xtn->s.out.u.strl.osp->ptr;
case QSE_AWK_PARSESTD_CPL:
xtn->s.out.u.cpl.osp->len =
xtn->s.out.u.cpl.ptr -
xtn->s.out.u.cpl.osp->ptr;
return 0;
}
}
@ -315,27 +313,27 @@ static qse_ssize_t sf_out (
{
switch (xtn->s.out.type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_FILE:
case QSE_AWK_PARSESTD_STDIO:
QSE_ASSERT (xtn->s.out.handle != QSE_NULL);
return qse_sio_putsn (xtn->s.out.handle, data, size);
case QSE_AWK_PARSESIMPLE_STR:
case QSE_AWK_PARSESTD_CP:
{
qse_size_t n = 0;
while (n < size && *xtn->s.out.u.str != QSE_T('\0'))
while (n < size && *xtn->s.out.u.cp != QSE_T('\0'))
{
*xtn->s.out.u.str++ = data[n++];
*xtn->s.out.u.cp++ = data[n++];
}
return n;
}
case QSE_AWK_PARSESIMPLE_STRL:
case QSE_AWK_PARSESTD_CPL:
{
qse_size_t n = 0;
while (n < size && xtn->s.out.u.strl.ptr < xtn->s.out.u.strl.end)
while (n < size && xtn->s.out.u.cpl.ptr < xtn->s.out.u.cpl.end)
{
*xtn->s.out.u.strl.ptr++ = data[n++];
*xtn->s.out.u.cpl.ptr++ = data[n++];
}
return n;
}
@ -345,10 +343,10 @@ static qse_ssize_t sf_out (
return -1;
}
int qse_awk_parsesimple (
int qse_awk_parsestd (
qse_awk_t* awk,
const qse_awk_parsesimple_in_t* in,
qse_awk_parsesimple_out_t* out)
const qse_awk_parsestd_in_t* in,
qse_awk_parsestd_out_t* out)
{
qse_awk_sio_t sio;
xtn_t* xtn = (xtn_t*) QSE_XTN (awk);
@ -362,20 +360,20 @@ int qse_awk_parsesimple (
switch (in->type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESTD_FILE:
xtn->s.in.u.file = in->u.file;
break;
case QSE_AWK_PARSESIMPLE_STR:
xtn->s.in.u.str = in->u.str;
case QSE_AWK_PARSESTD_CP:
xtn->s.in.u.cp = in->u.cp;
break;
case QSE_AWK_PARSESIMPLE_STRL:
xtn->s.in.u.strl.ptr = in->u.strl.ptr;
xtn->s.in.u.strl.end = in->u.strl.ptr + in->u.strl.len;
case QSE_AWK_PARSESTD_CPL:
xtn->s.in.u.cpl.ptr = in->u.cpl.ptr;
xtn->s.in.u.cpl.end = in->u.cpl.ptr + in->u.cpl.len;
break;
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_STDIO:
/* nothing to do */
break;
@ -392,21 +390,21 @@ int qse_awk_parsesimple (
{
switch (out->type)
{
case QSE_AWK_PARSESIMPLE_FILE:
case QSE_AWK_PARSESTD_FILE:
xtn->s.out.u.file = out->u.file;
break;
case QSE_AWK_PARSESIMPLE_STR:
xtn->s.out.u.str = out->u.str;
case QSE_AWK_PARSESTD_CP:
xtn->s.out.u.cp = out->u.cp;
break;
case QSE_AWK_PARSESIMPLE_STRL:
xtn->s.out.u.strl.osp = &out->u.strl;
xtn->s.out.u.strl.ptr = out->u.strl.ptr;
xtn->s.out.u.strl.end = out->u.strl.ptr + out->u.strl.len;
case QSE_AWK_PARSESTD_CPL:
xtn->s.out.u.cpl.osp = &out->u.cpl;
xtn->s.out.u.cpl.ptr = out->u.cpl.ptr;
xtn->s.out.u.cpl.end = out->u.cpl.ptr + out->u.cpl.len;
break;
case QSE_AWK_PARSESIMPLE_STDIO:
case QSE_AWK_PARSESTD_STDIO:
/* nothing to do */
break;
@ -422,8 +420,7 @@ int qse_awk_parsesimple (
return qse_awk_parse (awk, &sio);
}
/*** RUNSIMPLE ***/
/*** RTX_OPENSTD ***/
static qse_ssize_t awk_rio_pipe (
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_riod_t* riod,
qse_char_t* data, qse_size_t size)
@ -876,7 +873,7 @@ static qse_ssize_t awk_rio_console (
return -1;
}
qse_awk_rtx_t* qse_awk_rtx_opensimple (
qse_awk_rtx_t* qse_awk_rtx_openstd (
qse_awk_t* awk,
const qse_char_t*const* icf,
const qse_char_t*const* ocf)
@ -1260,7 +1257,7 @@ static int fnc_system (qse_awk_rtx_t* run, const qse_char_t* fnm, qse_size_t fnl
else
{
str = qse_awk_rtx_valtostr (
run, v, QSE_AWK_VALTOSTR_CLEAR, QSE_NULL, &len);
run, v, QSE_AWK_RTX_VALTOSTR_CLEAR, QSE_NULL, &len);
if (str == QSE_NULL) return -1;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: tree.c 466 2008-12-09 09:50:40Z baconevi $
* $Id: tree.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: tree.h 381 2008-09-24 11:07:24Z baconevi $
* $Id: tree.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.

View File

@ -1,5 +1,5 @@
/*
* $Id: val.c 496 2008-12-15 09:56:48Z baconevi $
* $Id: val.c 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -617,10 +617,7 @@ 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_MAP)
{
/* CHECK */
/* qse_map_close (((qse_awk_val_map_t*)val)->map);*/
qse_map_fini (((qse_awk_val_map_t*)val)->map);
/* END CHECK */
QSE_AWK_FREE (rtx->awk, val);
}
else if (val->type == QSE_AWK_VAL_REF)
@ -798,7 +795,7 @@ static qse_char_t* str_to_str (
if (len != QSE_NULL) *len = str_len;
return tmp;
}
else if (opt & QSE_AWK_VALTOSTR_FIXED)
else if (opt & QSE_AWK_RTX_VALTOSTR_FIXED)
{
QSE_ASSERT (buf != QSE_NULL && len != QSE_NULL);
@ -816,7 +813,7 @@ static qse_char_t* str_to_str (
{
qse_size_t n;
if (opt & QSE_AWK_VALTOSTR_CLEAR) qse_str_clear (buf);
if (opt & QSE_AWK_RTX_VALTOSTR_CLEAR) qse_str_clear (buf);
n = qse_str_ncat (buf, str, str_len);
if (n == (qse_size_t)-1)
{
@ -857,7 +854,7 @@ static qse_char_t* val_int_to_str (
if (len != QSE_NULL) *len = 1;
return tmp;
}
else if (opt & QSE_AWK_VALTOSTR_FIXED)
else if (opt & QSE_AWK_RTX_VALTOSTR_FIXED)
{
QSE_ASSERT (buf != QSE_NULL && len != QSE_NULL);
@ -877,7 +874,7 @@ static qse_char_t* val_int_to_str (
}
else
{
if (opt & QSE_AWK_VALTOSTR_CLEAR) qse_str_clear (buf);
if (opt & QSE_AWK_RTX_VALTOSTR_CLEAR) qse_str_clear (buf);
if (qse_str_cat (buf, QSE_T("0")) == (qse_size_t)-1)
{
qse_awk_rtx_seterror (
@ -907,7 +904,7 @@ static qse_char_t* val_int_to_str (
tmp[rlen] = QSE_T('\0');
if (len != QSE_NULL) *len = rlen;
}
else if (opt & QSE_AWK_VALTOSTR_FIXED)
else if (opt & QSE_AWK_RTX_VALTOSTR_FIXED)
{
QSE_ASSERT (buf != QSE_NULL && len != QSE_NULL);
@ -925,7 +922,7 @@ static qse_char_t* val_int_to_str (
else
{
/* clear the buffer */
if (opt & QSE_AWK_VALTOSTR_CLEAR) qse_str_clear (buf);
if (opt & QSE_AWK_RTX_VALTOSTR_CLEAR) qse_str_clear (buf);
tmp = QSE_STR_PTR(buf) + QSE_STR_LEN(buf);
@ -950,7 +947,7 @@ static qse_char_t* val_int_to_str (
if (v->val < 0) tmp[--rlen] = QSE_T('-');
if (buf != QSE_NULL && !(opt & QSE_AWK_VALTOSTR_FIXED))
if (buf != QSE_NULL && !(opt & QSE_AWK_RTX_VALTOSTR_FIXED))
{
tmp = QSE_STR_PTR(buf);
if (len != QSE_NULL) *len = QSE_STR_LEN(buf);
@ -967,7 +964,7 @@ static qse_char_t* val_real_to_str (
qse_size_t tmp_len;
qse_str_t out, fbu;
if (opt & QSE_AWK_VALTOSTR_PRINT)
if (opt & QSE_AWK_RTX_VALTOSTR_PRINT)
{
tmp = run->gbl.ofmt.ptr;
tmp_len = run->gbl.ofmt.len;
@ -1009,7 +1006,7 @@ static qse_char_t* val_real_to_str (
if (len != QSE_NULL) *len = tmp_len;
}
else if (opt & QSE_AWK_VALTOSTR_FIXED)
else if (opt & QSE_AWK_RTX_VALTOSTR_FIXED)
{
QSE_ASSERT (buf != QSE_NULL && len != QSE_NULL);
@ -1032,7 +1029,7 @@ static qse_char_t* val_real_to_str (
}
else
{
if (opt & QSE_AWK_VALTOSTR_CLEAR) qse_str_clear (buf);
if (opt & QSE_AWK_RTX_VALTOSTR_CLEAR) qse_str_clear (buf);
if (qse_str_ncat (buf, tmp, tmp_len) == (qse_size_t)-1)
{

View File

@ -1,5 +1,5 @@
/*
* $Id: eio.h 363 2008-09-04 10:58:08Z baconevi $
* $Id: val.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -23,6 +23,12 @@
extern "C" {
#endif
void qse_awk_rtx_freeval (
qse_awk_rtx_t* rtx,
qse_awk_val_t* val,
qse_bool_t cache
);
void qse_awk_rtx_freevalchunk (
qse_awk_rtx_t* rtx,
qse_awk_val_chunk_t* chunk