diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 560705c8..a085914a 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 516 2011-07-23 09:03:48Z hyunghwan.chung $ + * $Id: awk.h 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -578,7 +578,8 @@ typedef qse_ssize_t (*qse_awk_rio_fun_t) ( ); /** - * The qse_awk_prm_t type defines primitive functions + * The qse_awk_prm_t type defines primitive functions required to perform + * a set of primitive operations. */ struct qse_awk_prm_t { @@ -586,8 +587,8 @@ struct qse_awk_prm_t struct { - qse_awk_math2_t pow; - qse_awk_math2_t mod; + qse_awk_math2_t pow; /**< floating-point power function */ + qse_awk_math2_t mod; /**< floating-point remainder function */ qse_awk_math1_t sin; qse_awk_math1_t cos; qse_awk_math1_t tan; @@ -2214,6 +2215,18 @@ int qse_awk_rtx_valtonum ( qse_real_t* r ); +int qse_awk_rtx_valtolong ( + qse_awk_rtx_t* rtx, + const qse_awk_val_t* val, + qse_long_t* l +); + +int qse_awk_rtx_valtoreal ( + qse_awk_rtx_t* rtx, + const qse_awk_val_t* val, + qse_real_t* r +); + /** * The qse_awk_rtx_strtonum() function converts a string to a number. * A numeric string in the valid decimal, hexadecimal(0x), binary(0b), diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index e327e474..ec460a99 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp 516 2011-07-23 09:03:48Z hyunghwan.chung $ + * $Id: Awk.cpp 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -381,14 +381,12 @@ int Awk::Value::getInt (long_t* v) const val->type != QSE_AWK_VAL_NIL && val->type != QSE_AWK_VAL_MAP) { - real_t rv; - int n = qse_awk_rtx_valtonum (run->rtx, val, &lv, &rv); + int n = qse_awk_rtx_valtolong (run->rtx, val, &lv); if (n <= -1) { run->awk->retrieveError (run); return -1; } - if (n >= 1) lv = (long_t)rv; } *v = lv; @@ -405,14 +403,12 @@ int Awk::Value::getReal (real_t* v) const val->type != QSE_AWK_VAL_NIL && val->type != QSE_AWK_VAL_MAP) { - long_t lv; - int n = qse_awk_rtx_valtonum (run->rtx, val, &lv, &rv); + int n = qse_awk_rtx_valtoreal (run->rtx, val, &rv); if (n <= -1) { run->awk->retrieveError (run); return -1; } - if (n == 0) rv = (real_t)lv; } *v = rv; diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index e3cbf226..2b0cd911 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -1,5 +1,5 @@ /* - * $Id: fnc.c 474 2011-05-23 16:52:37Z hyunghwan.chung $ + * $Id: fnc.c 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -434,13 +434,11 @@ static int fnc_index (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) if (nargs >= 3) { qse_awk_val_t* a2; - qse_real_t rv; int n; a2 = qse_awk_rtx_getarg (rtx, 2); - n = qse_awk_rtx_valtonum (rtx, a2, &start, &rv); + n = qse_awk_rtx_valtolong (rtx, a2, &start); if (n <= -1) return -1; - if (n >= 1) start = (qse_long_t)rv; } if (a0->type == QSE_AWK_VAL_STR) @@ -534,7 +532,6 @@ static int fnc_substr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) qse_char_t* str; qse_size_t len; qse_long_t lindex, lcount; - qse_real_t rindex, rcount; int n; nargs = qse_awk_rtx_getnargs (rtx); @@ -555,25 +552,23 @@ static int fnc_substr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) if (str == QSE_NULL) return -1; } - n = qse_awk_rtx_valtonum (rtx, a1, &lindex, &rindex); + n = qse_awk_rtx_valtolong (rtx, a1, &lindex); if (n <= -1) { if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str); return -1; } - if (n == 1) lindex = (qse_long_t)rindex; if (a2 == QSE_NULL) lcount = (qse_long_t)len; else { - n = qse_awk_rtx_valtonum (rtx, a2, &lcount, &rcount); + n = qse_awk_rtx_valtolong (rtx, a2, &lcount); if (n <= -1) { if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str); return -1; } - if (n == 1) lcount = (qse_long_t)rcount; } lindex = lindex - 1; @@ -1217,12 +1212,10 @@ static int fnc_match (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) else #endif { - qse_real_t rv; /* if the 3rd parameter is not an array, * it is treated as a match start index */ - n = qse_awk_rtx_valtonum (rtx, a2, &start, &rv); + n = qse_awk_rtx_valtolong (rtx, a2, &start); if (n <= -1) return -1; - if (n >= 1) start = (qse_long_t)rv; } } @@ -1401,7 +1394,6 @@ static int fnc_math_1 ( { qse_size_t nargs; qse_awk_val_t* a0; - qse_long_t lv; qse_real_t rv; qse_awk_val_t* r; int n; @@ -1411,9 +1403,8 @@ static int fnc_math_1 ( a0 = qse_awk_rtx_getarg (rtx, 0); - n = qse_awk_rtx_valtonum (rtx, a0, &lv, &rv); + n = qse_awk_rtx_valtoreal (rtx, a0, &rv); if (n <= -1) return -1; - if (n == 0) rv = (qse_real_t)lv; r = qse_awk_rtx_makerealval (rtx, f (rtx->awk, rv)); if (r == QSE_NULL) return -1; @@ -1427,7 +1418,6 @@ static int fnc_math_2 ( { qse_size_t nargs; qse_awk_val_t* a0, * a1; - qse_long_t lv0, lv1; qse_real_t rv0, rv1; qse_awk_val_t* r; int n; @@ -1438,13 +1428,11 @@ static int fnc_math_2 ( a0 = qse_awk_rtx_getarg (rtx, 0); a1 = qse_awk_rtx_getarg (rtx, 1); - n = qse_awk_rtx_valtonum (rtx, a0, &lv0, &rv0); + n = qse_awk_rtx_valtoreal (rtx, a0, &rv0); if (n <= -1) return -1; - if (n == 0) rv0 = (qse_real_t)lv0; - n = qse_awk_rtx_valtonum (rtx, a1, &lv1, &rv1); + n = qse_awk_rtx_valtoreal (rtx, a1, &rv1); if (n <= -1) return -1; - if (n == 0) rv1 = (qse_real_t)lv1; r = qse_awk_rtx_makerealval (rtx, f (rtx->awk, rv0, rv1)); if (r == QSE_NULL) return -1; @@ -1491,7 +1479,6 @@ static int fnc_int (qse_awk_rtx_t* run, const qse_cstr_t* fnm) qse_size_t nargs; qse_awk_val_t* a0; qse_long_t lv; - qse_real_t rv; qse_awk_val_t* r; int n; @@ -1500,9 +1487,8 @@ static int fnc_int (qse_awk_rtx_t* run, const qse_cstr_t* fnm) a0 = qse_awk_rtx_getarg (run, 0); - n = qse_awk_rtx_valtonum (run, a0, &lv, &rv); + n = qse_awk_rtx_valtolong (run, a0, &lv); if (n <= -1) return -1; - if (n == 1) lv = (qse_long_t)rv; r = qse_awk_rtx_makeintval (run, lv); if (r == QSE_NULL) return -1; diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 7d24397c..ddf57545 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c 517 2011-07-23 16:17:15Z hyunghwan.chung $ + * $Id: parse.c 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -4057,11 +4057,10 @@ static qse_awk_nde_t* parse_unary ( folded.r = !((qse_awk_nde_real_t*)left)->val; break; - /* case QSE_AWK_UNROP_BNOT: - folded.r = ~((qse_awk_nde_real_t*)left)->val; + folded.l = ~((qse_long_t)((qse_awk_nde_real_t*)left)->val); + fold = QSE_AWK_NDE_INT; break; - */ default: fold = -1; @@ -4072,26 +4071,72 @@ static qse_awk_nde_t* parse_unary ( switch (fold) { case QSE_AWK_NDE_INT: - QSE_ASSERT (left->type == fold); - ((qse_awk_nde_int_t*)left)->val = folded.l; - if (((qse_awk_nde_int_t*)left)->str) + if (left->type == fold) { - QSE_AWK_FREE (awk, ((qse_awk_nde_int_t*)left)->str); - ((qse_awk_nde_int_t*)left)->str = QSE_NULL; - ((qse_awk_nde_int_t*)left)->len = 0; + ((qse_awk_nde_int_t*)left)->val = folded.l; + if (((qse_awk_nde_int_t*)left)->str) + { + QSE_AWK_FREE (awk, ((qse_awk_nde_int_t*)left)->str); + ((qse_awk_nde_int_t*)left)->str = QSE_NULL; + ((qse_awk_nde_int_t*)left)->len = 0; + } + return left; + } + else + { + qse_awk_nde_int_t* tmp; + + QSE_ASSERT (left->type == QSE_AWK_NDE_REAL); + qse_awk_clrpt (awk, left); + + tmp = (qse_awk_nde_int_t*) QSE_AWK_ALLOC ( + awk, QSE_SIZEOF(qse_awk_nde_int_t)); + if (tmp == QSE_NULL) + { + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); + return QSE_NULL; + } + QSE_MEMSET (tmp, 0, QSE_SIZEOF(qse_awk_nde_int_t)); + tmp->type = QSE_AWK_NDE_INT; + tmp->loc = *xloc; + tmp->val = folded.l; + + return (qse_awk_nde_t*)tmp; } - return left; case QSE_AWK_NDE_REAL: - QSE_ASSERT (left->type == fold); - ((qse_awk_nde_real_t*)left)->val = folded.r; - if (((qse_awk_nde_real_t*)left)->str) + if (left->type == fold) { - QSE_AWK_FREE (awk, ((qse_awk_nde_real_t*)left)->str); - ((qse_awk_nde_real_t*)left)->str = QSE_NULL; - ((qse_awk_nde_real_t*)left)->len = 0; + ((qse_awk_nde_real_t*)left)->val = folded.r; + if (((qse_awk_nde_real_t*)left)->str) + { + QSE_AWK_FREE (awk, ((qse_awk_nde_real_t*)left)->str); + ((qse_awk_nde_real_t*)left)->str = QSE_NULL; + ((qse_awk_nde_real_t*)left)->len = 0; + } + return left; + } + else + { + qse_awk_nde_real_t* tmp; + + QSE_ASSERT (left->type == QSE_AWK_NDE_INT); + qse_awk_clrpt (awk, left); + + tmp = (qse_awk_nde_real_t*) QSE_AWK_ALLOC ( + awk, QSE_SIZEOF(qse_awk_nde_real_t)); + if (tmp == QSE_NULL) + { + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); + return QSE_NULL; + } + QSE_MEMSET (tmp, 0, QSE_SIZEOF(qse_awk_nde_real_t)); + tmp->type = QSE_AWK_NDE_REAL; + tmp->loc = *xloc; + tmp->val = folded.r; + + return (qse_awk_nde_t*)tmp; } - return left; default: { diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 337cf34d..bd4b6735 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 517 2011-07-23 16:17:15Z hyunghwan.chung $ + * $Id: run.c 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -368,11 +368,9 @@ static int set_global ( { int n; qse_long_t lv; - qse_real_t rv; - n = qse_awk_rtx_valtonum (rtx, val, &lv, &rv); - if (n == -1) return -1; - if (n == 1) lv = (qse_long_t)rv; + n = qse_awk_rtx_valtolong (rtx, val, &lv); + if (n <= -1) return -1; rtx->gbl.fnr = lv; break; @@ -444,11 +442,9 @@ static int set_global ( { int n; qse_long_t lv; - qse_real_t rv; - n = qse_awk_rtx_valtonum (rtx, val, &lv, &rv); + n = qse_awk_rtx_valtolong (rtx, val, &lv); if (n <= -1) return -1; - if (n == 1) lv = (qse_long_t)rv; if (lv < (qse_long_t)rtx->inrec.nflds) { @@ -469,11 +465,9 @@ static int set_global ( { int n; qse_long_t lv; - qse_real_t rv; - n = qse_awk_rtx_valtonum (rtx, val, &lv, &rv); + n = qse_awk_rtx_valtolong (rtx, val, &lv); if (n <= -1) return -1; - if (n == 1) lv = (qse_long_t)rv; rtx->gbl.nr = lv; break; @@ -3607,7 +3601,6 @@ static qse_awk_val_t* do_assignment_pos ( { qse_awk_val_t* v; qse_long_t lv; - qse_real_t rv; qse_xstr_t str; int n; @@ -3615,15 +3608,15 @@ static qse_awk_val_t* do_assignment_pos ( if (v == QSE_NULL) return QSE_NULL; qse_awk_rtx_refupval (run, v); - n = qse_awk_rtx_valtonum (run, v, &lv, &rv); + n = qse_awk_rtx_valtolong (run, v, &lv); qse_awk_rtx_refdownval (run, v); - if (n == -1) + if (n <= -1) { SETERR_LOC (run, QSE_AWK_EPOSIDX, &pos->loc); return QSE_NULL; } - if (n == 1) lv = (qse_long_t)rv; + if (!IS_VALID_POSIDX(lv)) { SETERR_LOC (run, QSE_AWK_EPOSIDX, &pos->loc); @@ -3925,80 +3918,46 @@ static qse_awk_val_t* eval_binop_in ( static qse_awk_val_t* eval_binop_bor ( qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right) { - int n1, n2, n3; qse_long_t l1, l2; - qse_real_t r1, r2; - n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); - n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - - if (n1 == -1 || n2 == -1) + if (qse_awk_rtx_valtolong (rtx, left, &l1) <= -1 || + qse_awk_rtx_valtolong (rtx, right, &l2) <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; } - n3 = n1 + (n2 << 1); - QSE_ASSERT (n3 >= 0 && n3 <= 3); - - return qse_awk_rtx_makeintval (rtx, - (n3 == 0)? ((qse_long_t)l1 | (qse_long_t)l2): - (n3 == 1)? ((qse_long_t)r1 | (qse_long_t)l2): - (n3 == 2)? ((qse_long_t)l1 | (qse_long_t)r2): - ((qse_long_t)r1 | (qse_long_t)r2)); - + return qse_awk_rtx_makeintval (rtx, l1 | l2); } static qse_awk_val_t* eval_binop_bxor ( qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right) { - int n1, n2, n3; qse_long_t l1, l2; - qse_real_t r1, r2; - n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); - n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - - if (n1 == -1 || n2 == -1) + if (qse_awk_rtx_valtolong (rtx, left, &l1) <= -1 || + qse_awk_rtx_valtolong (rtx, right, &l2) <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; } - n3 = n1 + (n2 << 1); - QSE_ASSERT (n3 >= 0 && n3 <= 3); - - return qse_awk_rtx_makeintval (rtx, - (n3 == 0)? ((qse_long_t)l1 ^ (qse_long_t)l2): - (n3 == 1)? ((qse_long_t)r1 ^ (qse_long_t)l2): - (n3 == 2)? ((qse_long_t)l1 ^ (qse_long_t)r2): - ((qse_long_t)r1 ^ (qse_long_t)r2)); + return qse_awk_rtx_makeintval (rtx, l1 ^ l2); } static qse_awk_val_t* eval_binop_band ( qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right) { - int n1, n2, n3; qse_long_t l1, l2; - qse_real_t r1, r2; - n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); - n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - - if (n1 == -1 || n2 == -1) + if (qse_awk_rtx_valtolong (rtx, left, &l1) <= -1 || + qse_awk_rtx_valtolong (rtx, right, &l2) <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; } - n3 = n1 + (n2 << 1); - QSE_ASSERT (n3 >= 0 && n3 <= 3); - - return qse_awk_rtx_makeintval (rtx, - (n3 == 0)? ((qse_long_t)l1 & (qse_long_t)l2): - (n3 == 1)? ((qse_long_t)r1 & (qse_long_t)l2): - (n3 == 2)? ((qse_long_t)l1 & (qse_long_t)r2): - ((qse_long_t)r1 & (qse_long_t)r2)); + return qse_awk_rtx_makeintval (rtx, l1 & l2); } static int __cmp_nil_nil ( @@ -4376,58 +4335,31 @@ static qse_awk_val_t* eval_binop_le ( static qse_awk_val_t* eval_binop_lshift ( qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right) { - int n1, n2, n3; qse_long_t l1, l2; - qse_real_t r1, r2; - n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); - n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - - if (n1 == -1 || n2 == -1) + if (qse_awk_rtx_valtolong (rtx, left, &l1) <= -1 || + qse_awk_rtx_valtolong (rtx, right, &l2) <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; } - n3 = n1 + (n2 << 1); - if (n3 == 0) - { - return qse_awk_rtx_makeintval (rtx, (qse_long_t)l1<<(qse_long_t)l2); - } - else - { - SETERR_COD (rtx, QSE_AWK_EOPERAND); - return QSE_NULL; - } + return qse_awk_rtx_makeintval (rtx, l1 << l2); } static qse_awk_val_t* eval_binop_rshift ( qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right) { - int n1, n2, n3; qse_long_t l1, l2; - qse_real_t r1, r2; - n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); - n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - - if (n1 == -1 || n2 == -1) + if (qse_awk_rtx_valtolong (rtx, left, &l1) <= -1 || + qse_awk_rtx_valtolong (rtx, right, &l2) <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; } - n3 = n1 + (n2 << 1); - if (n3 == 0) - { - return qse_awk_rtx_makeintval ( - rtx, (qse_long_t)l1>>(qse_long_t)l2); - } - else - { - SETERR_COD (rtx, QSE_AWK_EOPERAND); - return QSE_NULL; - } + return qse_awk_rtx_makeintval (rtx, l1 >> l2); } static qse_awk_val_t* eval_binop_plus ( @@ -4440,7 +4372,7 @@ static qse_awk_val_t* eval_binop_plus ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -4471,7 +4403,7 @@ static qse_awk_val_t* eval_binop_minus ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -4495,7 +4427,7 @@ static qse_awk_val_t* eval_binop_mul ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -4520,7 +4452,7 @@ static qse_awk_val_t* eval_binop_div ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -4578,7 +4510,7 @@ static qse_awk_val_t* eval_binop_idiv ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -4631,7 +4563,7 @@ static qse_awk_val_t* eval_binop_mod ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -4690,7 +4622,7 @@ static qse_awk_val_t* eval_binop_exp ( n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); - if (n1 == -1 || n2 == -1) + if (n1 <= -1 || n2 <= -1) { SETERR_COD (rtx, QSE_AWK_EOPERAND); return QSE_NULL; @@ -5001,7 +4933,7 @@ static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { case QSE_AWK_UNROP_MINUS: n = qse_awk_rtx_valtonum (run, left, &l, &r); - if (n == -1) goto exit_func; + if (n <= -1) goto exit_func; res = (n == 0)? qse_awk_rtx_makeintval (run, -l): qse_awk_rtx_makerealval (run, -r); @@ -5016,7 +4948,7 @@ static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) else { n = qse_awk_rtx_valtonum (run, left, &l, &r); - if (n == -1) goto exit_func; + if (n <= -1) goto exit_func; res = (n == 0)? qse_awk_rtx_makeintval (run, !l): qse_awk_rtx_makerealval (run, !r); @@ -5024,16 +4956,15 @@ static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) break; case QSE_AWK_UNROP_BNOT: - n = qse_awk_rtx_valtonum (run, left, &l, &r); - if (n == -1) goto exit_func; + n = qse_awk_rtx_valtolong (run, left, &l); + if (n <= -1) goto exit_func; - if (n == 1) l = (qse_long_t)r; res = qse_awk_rtx_makeintval (run, ~l); break; case QSE_AWK_UNROP_PLUS: n = qse_awk_rtx_valtonum (run, left, &l, &r); - if (n == -1) goto exit_func; + if (n <= -1) goto exit_func; res = (n == 0)? qse_awk_rtx_makeintval (run, l): qse_awk_rtx_makerealval (run, r); @@ -5102,7 +5033,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) int n; n = qse_awk_rtx_valtonum (run, left, &v1, &v2); - if (n == -1) + if (n <= -1) { qse_awk_rtx_refdownval (run, left); ADJERR_LOC (run, &nde->loc); @@ -5275,7 +5206,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) int n; n = qse_awk_rtx_valtonum (run, left, &v1, &v2); - if (n == -1) + if (n <= -1) { qse_awk_rtx_refdownval (run, left); ADJERR_LOC (run, &nde->loc); @@ -6012,7 +5943,6 @@ static int get_reference ( { int n; qse_long_t lv; - qse_real_t rv; qse_awk_val_t* v; /* the position number is returned for the positional @@ -6021,15 +5951,15 @@ static int get_reference ( if (v == QSE_NULL) return -1; qse_awk_rtx_refupval (run, v); - n = qse_awk_rtx_valtonum (run, v, &lv, &rv); + n = qse_awk_rtx_valtolong (run, v, &lv); qse_awk_rtx_refdownval (run, v); - if (n == -1) + if (n <= -1) { SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); return -1; } - if (n == 1) lv = (qse_long_t)rv; + if (!IS_VALID_POSIDX(lv)) { SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); @@ -6281,21 +6211,19 @@ static qse_awk_val_t* eval_pos (qse_awk_rtx_t* run, qse_awk_nde_t* nde) qse_awk_nde_pos_t* pos = (qse_awk_nde_pos_t*)nde; qse_awk_val_t* v; qse_long_t lv; - qse_real_t rv; int n; v = eval_expression (run, pos->val); if (v == QSE_NULL) return QSE_NULL; qse_awk_rtx_refupval (run, v); - n = qse_awk_rtx_valtonum (run, v, &lv, &rv); + n = qse_awk_rtx_valtolong (run, v, &lv); qse_awk_rtx_refdownval (run, v); - if (n == -1) + if (n <= -1) { SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); return QSE_NULL; } - if (n == 1) lv = (qse_long_t)rv; if (lv < 0) { @@ -6734,36 +6662,37 @@ qse_char_t* qse_awk_rtx_format ( qse_size_t stack_arg_idx = 1; qse_awk_val_t* val; -#define OUT_CHAR(c) \ - do { \ - if (qse_str_ccat (out, (c)) == -1) \ - { \ - SETERR_COD (rtx, QSE_AWK_ENOMEM); \ - return QSE_NULL; \ - } \ - } while (0) +#define OUT_CHAR(c) QSE_BLOCK( \ + if (qse_str_ccat (out, (c)) == -1) \ + { \ + SETERR_COD (rtx, QSE_AWK_ENOMEM); \ + return QSE_NULL; \ + } \ +) -#define FMT_CHAR(c) \ - do { \ - if (qse_str_ccat (fbu, (c)) == -1) \ - { \ - SETERR_COD (rtx, QSE_AWK_ENOMEM); \ - return QSE_NULL; \ - } \ - } while (0) +#define FMT_CHAR(c) QSE_BLOCK( \ + if (qse_str_ccat (fbu, (c)) == -1) \ + { \ + SETERR_COD (rtx, QSE_AWK_ENOMEM); \ + return QSE_NULL; \ + } \ +) -#define GROW(buf) \ - do { \ - if ((buf)->ptr != QSE_NULL) \ - { \ - QSE_AWK_FREE (rtx->awk, (buf)->ptr); \ - (buf)->ptr = QSE_NULL; \ - } \ - (buf)->len += (buf)->inc; \ - (buf)->ptr = (qse_char_t*)QSE_AWK_ALLOC ( \ - rtx->awk, (buf)->len * QSE_SIZEOF(qse_char_t)); \ - if ((buf)->ptr == QSE_NULL) (buf)->len = 0; \ - } while (0) +#define GROW(buf) QSE_BLOCK( \ + if ((buf)->ptr != QSE_NULL) \ + { \ + QSE_AWK_FREE (rtx->awk, (buf)->ptr); \ + (buf)->ptr = QSE_NULL; \ + } \ + (buf)->len += (buf)->inc; \ + (buf)->ptr = (qse_char_t*)QSE_AWK_ALLOC ( \ + rtx->awk, (buf)->len * QSE_SIZEOF(qse_char_t)); \ + if ((buf)->ptr == QSE_NULL) \ + { \ + SETERR_COD (rtx, QSE_AWK_ENOMEM); \ + (buf)->len = 0; \ + } \ +) QSE_ASSERTX (rtx->format.tmp.ptr != QSE_NULL, "run->format.tmp.ptr should have been assigned a pointer to a block of memory before this function has been called"); @@ -6808,7 +6737,6 @@ qse_char_t* qse_awk_rtx_format ( if (i < fmt_len && fmt[i] == QSE_T('*')) { qse_awk_val_t* v; - qse_real_t r; qse_char_t* p; int n; @@ -6840,11 +6768,9 @@ qse_char_t* qse_awk_rtx_format ( } qse_awk_rtx_refupval (rtx, v); - n = qse_awk_rtx_valtonum (rtx, v, &width, &r); + n = qse_awk_rtx_valtolong (rtx, v, &width); qse_awk_rtx_refdownval (rtx, v); - - if (n == -1) return QSE_NULL; - if (n == 1) width = (qse_long_t)r; + if (n <= -1) return QSE_NULL; do { @@ -6904,7 +6830,6 @@ qse_char_t* qse_awk_rtx_format ( if (i < fmt_len && fmt[i] == QSE_T('*')) { qse_awk_val_t* v; - qse_real_t r; qse_char_t* p; int n; @@ -6936,28 +6861,18 @@ qse_char_t* qse_awk_rtx_format ( } qse_awk_rtx_refupval (rtx, v); - n = qse_awk_rtx_valtonum (rtx, v, &prec, &r); + n = qse_awk_rtx_valtolong (rtx, v, &prec); qse_awk_rtx_refdownval (rtx, v); - - if (n == -1) return QSE_NULL; - if (n == 1) prec = (qse_long_t)r; + if (n <= -1) return QSE_NULL; do { - n = rtx->awk->prm.sprintf ( - rtx->awk, + n = qse_awk_sprintlong ( + rtx->awk, rtx->format.tmp.ptr, rtx->format.tmp.len, - #if QSE_SIZEOF_LONG_LONG > 0 - QSE_T("%lld"), (long long)prec - #elif QSE_SIZEOF___INT64 > 0 - QSE_T("%I64d"), (__int64)prec - #elif QSE_SIZEOF_LONG > 0 - QSE_T("%ld"), (long)prec - #elif QSE_SIZEOF_INT > 0 - QSE_T("%d"), (int)prec - #endif - ); + prec + ); if (n == -1) { GROW (&rtx->format.tmp); @@ -6966,7 +6881,6 @@ qse_char_t* qse_awk_rtx_format ( SETERR_COD (rtx, QSE_AWK_ENOMEM); return QSE_NULL; } - continue; } @@ -7007,7 +6921,6 @@ qse_char_t* qse_awk_rtx_format ( { qse_awk_val_t* v; qse_long_t l; - qse_real_t r; qse_char_t* p; int n; @@ -7057,11 +6970,9 @@ qse_char_t* qse_awk_rtx_format ( } qse_awk_rtx_refupval (rtx, v); - n = qse_awk_rtx_valtonum (rtx, v, &l, &r); + n = qse_awk_rtx_valtolong (rtx, v, &l); qse_awk_rtx_refdownval (rtx, v); - - if (n == -1) return QSE_NULL; - if (n == 1) l = (qse_long_t)r; + if (n <= -1) return QSE_NULL; do { @@ -7079,7 +6990,7 @@ qse_char_t* qse_awk_rtx_format ( #elif QSE_SIZEOF_INT > 0 (int)l #endif - ); + ); if (n == -1) { @@ -7109,7 +7020,6 @@ qse_char_t* qse_awk_rtx_format ( fmt[i] == QSE_T('f')) { qse_awk_val_t* v; - qse_long_t l; qse_real_t r; qse_char_t* p; int n; @@ -7145,11 +7055,9 @@ qse_char_t* qse_awk_rtx_format ( } qse_awk_rtx_refupval (rtx, v); - n = qse_awk_rtx_valtonum (rtx, v, &l, &r); + n = qse_awk_rtx_valtoreal (rtx, v, &r); qse_awk_rtx_refdownval (rtx, v); - - if (n == -1) return QSE_NULL; - if (n == 0) r = (qse_real_t)l; + if (n <= -1) return QSE_NULL; do { diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 81fe7fec..11065f17 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -1,5 +1,5 @@ /* - * $Id: std.c 516 2011-07-23 09:03:48Z hyunghwan.chung $ + * $Id: std.c 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -1394,7 +1394,6 @@ static int fnc_srand (qse_awk_rtx_t* run, const qse_cstr_t* fnm) qse_size_t nargs; qse_awk_val_t* a0; qse_long_t lv; - qse_real_t rv; qse_awk_val_t* r; int n; unsigned int prev; @@ -1409,22 +1408,19 @@ static int fnc_srand (qse_awk_rtx_t* run, const qse_cstr_t* fnm) if (nargs == 1) { a0 = qse_awk_rtx_getarg (run, 0); - - n = qse_awk_rtx_valtonum (run, a0, &lv, &rv); + n = qse_awk_rtx_valtolong (run, a0, &lv); if (n <= -1) return -1; - if (n >= 1) lv = (qse_long_t)rv; rxtn->seed = lv; } else { qse_ntime_t now; - if (qse_gettime(&now) <= -1) rxtn->seed >>= 1; else rxtn->seed = (unsigned int)now; } - srand (rxtn->seed); + srand (rxtn->seed); r = qse_awk_rtx_makeintval (run, prev); if (r == QSE_NULL) return -1; diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c index e4f60bf5..469c02b4 100644 --- a/qse/lib/awk/val.c +++ b/qse/lib/awk/val.c @@ -1,5 +1,5 @@ /* - * $Id: val.c 484 2011-05-25 15:32:10Z hyunghwan.chung $ + * $Id: val.c 518 2011-07-24 14:24:13Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -1173,6 +1173,35 @@ int qse_awk_rtx_valtonum ( return -1; /* error */ } +int qse_awk_rtx_valtolong ( + qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_long_t* l) +{ + int n; + qse_real_t r; + + n = qse_awk_rtx_valtonum (rtx, v, l, &r); + if (n == 1) + { + *l = (qse_long_t)r; + n = 0; + } + + return n; +} + +int qse_awk_rtx_valtoreal ( + qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_real_t* r) +{ + int n; + qse_long_t l; + + n = qse_awk_rtx_valtonum (rtx, v, &l, r); + if (n == 0) *r = (qse_real_t)l; + else if (n == 1) n = 0; + + return n; +} + int qse_awk_rtx_strtonum ( qse_awk_rtx_t* rtx, int strict, const qse_char_t* ptr, qse_size_t len, diff --git a/qse/lib/net/htrd.c b/qse/lib/net/htrd.c index b6520596..d8083c1e 100644 --- a/qse/lib/net/htrd.c +++ b/qse/lib/net/htrd.c @@ -1,5 +1,5 @@ /* - * $Id: htrd.c 341 2008-08-20 10:58:19Z baconevi $ + * $Id$ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. diff --git a/qse/lib/net/htre.c b/qse/lib/net/htre.c index d5bebfbb..6203f3eb 100644 --- a/qse/lib/net/htre.c +++ b/qse/lib/net/htre.c @@ -1,5 +1,21 @@ /* * $Id$ + * + Copyright 2006-2011 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . */ #include diff --git a/qse/lib/net/http.c b/qse/lib/net/http.c index cd842336..70409343 100644 --- a/qse/lib/net/http.c +++ b/qse/lib/net/http.c @@ -1,5 +1,5 @@ /* - * $Id: http.c 341 2008-08-20 10:58:19Z baconevi $ + * $Id$ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. diff --git a/qse/lib/net/httpd_task.c b/qse/lib/net/httpd_task.c index a39792e2..61a2bf22 100644 --- a/qse/lib/net/httpd_task.c +++ b/qse/lib/net/httpd_task.c @@ -1,3 +1,23 @@ +/* + * $Id$ + * + Copyright 2006-2011 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + #include "httpd.h" #include "../cmn/mem.h" #include