From 9186415fa7b30f87749a8cc9a097869dff85bb23 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 27 Jul 2012 07:06:07 +0000 Subject: [PATCH] made minor changes related to setioattr() and getioattr() --- qse/include/qse/awk/std.h | 3 +- qse/lib/awk/std.c | 85 +++++++++++++++++++++------------------ qse/lib/cmn/htb.c | 3 ++ 3 files changed, 51 insertions(+), 40 deletions(-) diff --git a/qse/include/qse/awk/std.h b/qse/include/qse/awk/std.h index 958619d3..56302f38 100644 --- a/qse/include/qse/awk/std.h +++ b/qse/include/qse/awk/std.h @@ -181,7 +181,8 @@ void* qse_awk_rtx_getxtnstd ( /** * The qse_awk_rtx_getcmgrstd() function gets the current character * manager associated with a particular I/O target indicated by the name - * @a ioname. + * @a ioname if #QSE_CHAR_IS_WCHAR is defined. It always returns #QSE_NULL + * if #QSE_CHAR_IS_MCHAR. */ qse_cmgr_t* qse_awk_rtx_getcmgrstd ( qse_awk_rtx_t* rtx, diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 2ead0e41..3a53e87b 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -1718,6 +1718,7 @@ static int fnc_time (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) qse_cmgr_t* qse_awk_rtx_getcmgrstd ( qse_awk_rtx_t* rtx, const qse_char_t* ioname) { +#if defined(QSE_CHAR_IS_WCHAR) rxtn_t* rxtn; qse_htb_pair_t* pair; ioattr_t* ioattr; @@ -1731,7 +1732,7 @@ qse_cmgr_t* qse_awk_rtx_getcmgrstd ( ioattr = (ioattr_t*)QSE_HTB_VPTR(pair); return ioattr->cmgr; } - +#endif return QSE_NULL; } @@ -1747,7 +1748,11 @@ static QSE_INLINE void init_ioattr (ioattr_t* ioattr) { int i; QSE_MEMSET (ioattr, 0, QSE_SIZEOF(*ioattr)); - for (i = 0; i < QSE_COUNTOF(ioattr->timeout); i++) ioattr->timeout[i] = -1; + for (i = 0; i < QSE_COUNTOF(ioattr->timeout); i++) + { + /* a negative number for no timeout */ + ioattr->timeout[i] = -999; + } } static qse_htb_pair_t* find_or_make_ioattr ( @@ -1814,7 +1819,32 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) } } - if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0) + if ((tmout = timeout_code (ptr[1])) >= 0) + { + qse_htb_pair_t* pair; + ioattr_t* ioattr; + + qse_long_t l; + qse_flt_t r; + int x; + + /* no error is returned by qse_awk_rtx_strnum() if the second + * parameter is 0. so i don't check for an error */ + x = qse_awk_rtx_strtonum (rtx, 0, ptr[2], len[2], &l, &r); + if (x >= 1) l = (qse_long_t)r; + + pair = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]); + if (pair == QSE_NULL) + { + ret = -1; + goto done; + } + + ioattr = QSE_HTB_VPTR(pair); + ioattr->timeout[tmout] = l; + } +#if defined(QSE_CHAR_IS_WCHAR) + else if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0) { qse_htb_pair_t* pair; ioattr_t* ioattr; @@ -1844,30 +1874,7 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) ioattr->cmgr = cmgr; qse_strxcpy (ioattr->cmgr_name, QSE_COUNTOF(ioattr->cmgr_name), ptr[2]); } - else if ((tmout = timeout_code (ptr[1])) >= 0) - { - qse_htb_pair_t* pair; - ioattr_t* ioattr; - - qse_long_t l; - qse_flt_t r; - int x; - - /* no error is returned by qse_awk_rtx_strnum() if the second - * parameter is 0. so i don't check for an error */ - x = qse_awk_rtx_strtonum (rtx, 0, ptr[2], len[2], &l, &r); - if (x >= 1) l = (qse_long_t)r; - - pair = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]); - if (pair == QSE_NULL) - { - ret = -1; - goto done; - } - - ioattr = QSE_HTB_VPTR(pair); - ioattr->timeout[tmout] = l; - } +#endif else { /* unknown attribute name */ @@ -1946,16 +1953,7 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) ioattr = QSE_HTB_VPTR(pair); } - if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0) - { - rv = qse_awk_rtx_makestrval0 (rtx, ioattr->cmgr_name); - if (rv == QSE_NULL) - { - ret = -1; - goto done; - } - } - else if ((tmout = timeout_code (ptr[1])) >= 0) + if ((tmout = timeout_code (ptr[1])) >= 0) { rv = qse_awk_rtx_makeintval (rtx, ioattr->timeout[tmout]); if (rv == QSE_NULL) @@ -1964,6 +1962,17 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm) goto done; } } +#if defined(QSE_CHAR_IS_WCHAR) + else if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0) + { + rv = qse_awk_rtx_makestrval0 (rtx, ioattr->cmgr_name); + if (rv == QSE_NULL) + { + ret = -1; + goto done; + } + } +#endif else { /* unknown attribute name */ @@ -2001,9 +2010,7 @@ static int add_functions (qse_awk_t* awk) ADDFNC (awk, QSE_T("srand"), 0, 1, fnc_srand, 0); ADDFNC (awk, QSE_T("system"), 1, 1, fnc_system, 0); ADDFNC (awk, QSE_T("time"), 0, 0, fnc_time, 0); -#if defined(QSE_CHAR_IS_WCHAR) ADDFNC (awk, QSE_T("setioattr"), 3, 3, fnc_setioattr, QSE_AWK_RIO); ADDFNC (awk, QSE_T("getioattr"), 2, 2, fnc_getioattr, QSE_AWK_RIO); -#endif return 0; } diff --git a/qse/lib/cmn/htb.c b/qse/lib/cmn/htb.c index 548fae1a..811031e4 100644 --- a/qse/lib/cmn/htb.c +++ b/qse/lib/cmn/htb.c @@ -292,6 +292,9 @@ int qse_htb_init ( QSE_ASSERTX (factor >= 0 && factor <= 100, "The load factor should be between 0 and 100 inclusive. In the release mode, a value out of the range is adjusted to 100"); + QSE_ASSERT (kscale >= 0 && kscale <= QSE_TYPE_MAX(qse_byte_t)); + QSE_ASSERT (vscale >= 0 && vscale <= QSE_TYPE_MAX(qse_byte_t)); + /* some initial adjustment */ if (capa <= 0) capa = 1; if (factor > 100) factor = 100;