fixed some bugs in hawk_rtx_format() and hawk_rtx_formatmbs()
This commit is contained in:
parent
9a8c97e3ab
commit
097a6c92f2
131
hawk/lib/run.c
131
hawk/lib/run.c
@ -2007,7 +2007,7 @@ static int run_pblock (hawk_rtx_t* rtx, hawk_chain_t* cha, hawk_oow_t bno)
|
|||||||
hawk_val_t* v1;
|
hawk_val_t* v1;
|
||||||
|
|
||||||
v1 = eval_expression(rtx, ptn);
|
v1 = eval_expression(rtx, ptn);
|
||||||
if (!v1) return -1;
|
if (HAWK_UNLIKELY(!v1)) return -1;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v1);
|
hawk_rtx_refupval (rtx, v1);
|
||||||
|
|
||||||
@ -2045,7 +2045,7 @@ static int run_pblock (hawk_rtx_t* rtx, hawk_chain_t* cha, hawk_oow_t bno)
|
|||||||
hawk_val_t* v2;
|
hawk_val_t* v2;
|
||||||
|
|
||||||
v2 = eval_expression(rtx, ptn->next);
|
v2 = eval_expression(rtx, ptn->next);
|
||||||
if (!v2) return -1;
|
if (HAWK_UNLIKELY(!v2)) return -1;
|
||||||
hawk_rtx_refupval (rtx, v2);
|
hawk_rtx_refupval (rtx, v2);
|
||||||
rtx->pattern_range_state[bno] = !hawk_rtx_valtobool(rtx, v2);
|
rtx->pattern_range_state[bno] = !hawk_rtx_valtobool(rtx, v2);
|
||||||
hawk_rtx_refdownval (rtx, v2);
|
hawk_rtx_refdownval (rtx, v2);
|
||||||
@ -2363,7 +2363,7 @@ static int run_while (hawk_rtx_t* rtx, hawk_nde_while_t* nde)
|
|||||||
ON_STATEMENT (rtx, nde->test);
|
ON_STATEMENT (rtx, nde->test);
|
||||||
|
|
||||||
test = eval_expression(rtx, nde->test);
|
test = eval_expression(rtx, nde->test);
|
||||||
if (!test) return -1;
|
if (HAWK_UNLIKELY(!test)) return -1;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, test);
|
hawk_rtx_refupval (rtx, test);
|
||||||
|
|
||||||
@ -2408,7 +2408,7 @@ static int run_for (hawk_rtx_t* rtx, hawk_nde_for_t* nde)
|
|||||||
HAWK_ASSERT (nde->test->next == HAWK_NULL);
|
HAWK_ASSERT (nde->test->next == HAWK_NULL);
|
||||||
|
|
||||||
ON_STATEMENT (rtx, nde->test);
|
ON_STATEMENT (rtx, nde->test);
|
||||||
test = eval_expression (rtx, nde->test);
|
test = eval_expression(rtx, nde->test);
|
||||||
if (HAWK_UNLIKELY(!test)) return -1;
|
if (HAWK_UNLIKELY(!test)) return -1;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, test);
|
hawk_rtx_refupval (rtx, test);
|
||||||
@ -4143,11 +4143,11 @@ static hawk_val_t* do_assignment_positional (hawk_rtx_t* rtx, hawk_nde_pos_t* po
|
|||||||
hawk_oocs_t str;
|
hawk_oocs_t str;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
v = eval_expression (rtx, pos->val);
|
v = eval_expression(rtx, pos->val);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_valtoint (rtx, v, &lv);
|
n = hawk_rtx_valtoint(rtx, v, &lv);
|
||||||
hawk_rtx_refdownval (rtx, v);
|
hawk_rtx_refdownval (rtx, v);
|
||||||
|
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
@ -4317,8 +4317,8 @@ static hawk_val_t* eval_binop_lor (hawk_rtx_t* rtx, hawk_nde_t* left, hawk_nde_t
|
|||||||
hawk_val_t* lv, * rv, * res;
|
hawk_val_t* lv, * rv, * res;
|
||||||
|
|
||||||
HAWK_ASSERT (left->next == HAWK_NULL);
|
HAWK_ASSERT (left->next == HAWK_NULL);
|
||||||
lv = eval_expression (rtx, left);
|
lv = eval_expression(rtx, left);
|
||||||
if (lv == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!lv)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, lv);
|
hawk_rtx_refupval (rtx, lv);
|
||||||
if (hawk_rtx_valtobool(rtx, lv))
|
if (hawk_rtx_valtobool(rtx, lv))
|
||||||
@ -4328,8 +4328,8 @@ static hawk_val_t* eval_binop_lor (hawk_rtx_t* rtx, hawk_nde_t* left, hawk_nde_t
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
HAWK_ASSERT (right->next == HAWK_NULL);
|
HAWK_ASSERT (right->next == HAWK_NULL);
|
||||||
rv = eval_expression (rtx, right);
|
rv = eval_expression(rtx, right);
|
||||||
if (rv == HAWK_NULL)
|
if (HAWK_UNLIKELY(!rv))
|
||||||
{
|
{
|
||||||
hawk_rtx_refdownval (rtx, lv);
|
hawk_rtx_refdownval (rtx, lv);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
@ -6113,8 +6113,8 @@ static hawk_val_t* eval_cnd (hawk_rtx_t* run, hawk_nde_t* nde)
|
|||||||
|
|
||||||
HAWK_ASSERT (cnd->test->next == HAWK_NULL);
|
HAWK_ASSERT (cnd->test->next == HAWK_NULL);
|
||||||
|
|
||||||
tv = eval_expression (run, cnd->test);
|
tv = eval_expression(run, cnd->test);
|
||||||
if (tv == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!tv)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (run, tv);
|
hawk_rtx_refupval (run, tv);
|
||||||
|
|
||||||
@ -7141,7 +7141,7 @@ static hawk_val_t* eval_pos (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
hawk_int_t lv;
|
hawk_int_t lv;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
v = eval_expression (rtx, pos->val);
|
v = eval_expression(rtx, pos->val);
|
||||||
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
@ -7756,7 +7756,7 @@ hawk_ooch_t* hawk_rtx_format (
|
|||||||
}
|
}
|
||||||
|
|
||||||
wp_mod_init:
|
wp_mod_init:
|
||||||
wp[WP_WIDTH] = -1; /* width */
|
wp[WP_WIDTH] = 0; /* width */
|
||||||
wp[WP_PRECISION] = -1; /* precision */
|
wp[WP_PRECISION] = -1; /* precision */
|
||||||
wp_idx = WP_WIDTH; /* width first */
|
wp_idx = WP_WIDTH; /* width first */
|
||||||
|
|
||||||
@ -7792,14 +7792,14 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_valtoint(rtx, v, &wp[wp_idx]);
|
n = hawk_rtx_valtoint(rtx, v, &wp[wp_idx]);
|
||||||
hawk_rtx_refdownval (rtx, v);
|
hawk_rtx_refdownval (rtx, v);
|
||||||
if (n <= -1) return HAWK_NULL;
|
if (HAWK_UNLIKELY(n <= -1)) return HAWK_NULL;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@ -7847,15 +7847,20 @@ wp_mod_main:
|
|||||||
|
|
||||||
if (wp_idx == WP_WIDTH && i < fmt_len && fmt[i] == HAWK_T('.'))
|
if (wp_idx == WP_WIDTH && i < fmt_len && fmt[i] == HAWK_T('.'))
|
||||||
{
|
{
|
||||||
wp[WP_PRECISION] = 0;
|
|
||||||
FMT_CHAR (fmt[i]); i++;
|
FMT_CHAR (fmt[i]); i++;
|
||||||
|
wp[WP_PRECISION] = 0;
|
||||||
wp_idx = WP_PRECISION; /* change index to precision */
|
wp_idx = WP_PRECISION; /* change index to precision */
|
||||||
goto wp_mod_main;
|
goto wp_mod_main;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= fmt_len) break;
|
if (i >= fmt_len) break;
|
||||||
|
|
||||||
|
if (wp[WP_WIDTH] < 0)
|
||||||
|
{
|
||||||
|
wp[WP_WIDTH] = -wp[WP_WIDTH];
|
||||||
|
flags |= FLAG_MINUS;
|
||||||
|
}
|
||||||
|
|
||||||
if (fmt[i] == 'd' || fmt[i] == 'i' ||
|
if (fmt[i] == 'd' || fmt[i] == 'i' ||
|
||||||
fmt[i] == 'x' || fmt[i] == 'X' ||
|
fmt[i] == 'x' || fmt[i] == 'X' ||
|
||||||
fmt[i] == 'b' || fmt[i] == 'B' ||
|
fmt[i] == 'b' || fmt[i] == 'B' ||
|
||||||
@ -7878,7 +7883,7 @@ wp_mod_main:
|
|||||||
hawk_rtx_seterrnum (rtx, HAWK_NULL, HAWK_EFMTARG);
|
hawk_rtx_seterrnum (rtx, HAWK_NULL, HAWK_EFMTARG);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
v = hawk_rtx_getarg (rtx, stack_arg_idx);
|
v = hawk_rtx_getarg(rtx, stack_arg_idx);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -7893,31 +7898,28 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression (rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_valtoint (rtx, v, &l);
|
n = hawk_rtx_valtoint(rtx, v, &l);
|
||||||
hawk_rtx_refdownval (rtx, v);
|
hawk_rtx_refdownval (rtx, v);
|
||||||
if (n <= -1) return HAWK_NULL;
|
if (HAWK_UNLIKELY(n <= -1)) return HAWK_NULL;
|
||||||
|
|
||||||
fmt_flags = HAWK_FMT_INTMAX_NOTRUNC | HAWK_FMT_INTMAX_NONULL;
|
fmt_flags = HAWK_FMT_INTMAX_NOTRUNC | HAWK_FMT_INTMAX_NONULL;
|
||||||
|
|
||||||
if (l == 0 && wp[WP_PRECISION] == 0)
|
if (l == 0 && wp_idx == WP_PRECISION && wp[WP_PRECISION] == 0)
|
||||||
{
|
{
|
||||||
/* A zero value with a precision of zero produces
|
/* printf ("%.d", 0); printf ("%.0d", 0); printf ("%.*d", 0, 0); */
|
||||||
* no character. */
|
/* A zero value with a precision of zero produces no character. */
|
||||||
fmt_flags |= HAWK_FMT_INTMAX_NOZERO;
|
fmt_flags |= HAWK_FMT_INTMAX_NOZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp[WP_WIDTH] != -1)
|
if (wp[WP_WIDTH] > 0)
|
||||||
{
|
{
|
||||||
/* Width must be greater than 0 if specified */
|
/* justification for width greater than 0 */
|
||||||
HAWK_ASSERT (wp[WP_WIDTH] > 0);
|
|
||||||
|
|
||||||
/* justification when width is specified. */
|
|
||||||
if (flags & FLAG_ZERO)
|
if (flags & FLAG_ZERO)
|
||||||
{
|
{
|
||||||
if (flags & FLAG_MINUS)
|
if (flags & FLAG_MINUS)
|
||||||
@ -7933,7 +7935,7 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (wp[WP_PRECISION] == -1)
|
if (wp_idx != WP_PRECISION) /* if precision is not specified, wp_idx is at WP_WIDTH */
|
||||||
{
|
{
|
||||||
/* precision not specified.
|
/* precision not specified.
|
||||||
* FLAG_ZERO can take effect */
|
* FLAG_ZERO can take effect */
|
||||||
@ -8108,7 +8110,7 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8149,7 +8151,7 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (!HAWK_UNLIKELY(v)) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8189,7 +8191,7 @@ wp_mod_main:
|
|||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp[WP_PRECISION] == -1 || wp[WP_PRECISION] == 0 || wp[WP_PRECISION] > (hawk_int_t)ch_len)
|
if (wp[WP_PRECISION] <= 0 || wp[WP_PRECISION] > (hawk_int_t)ch_len)
|
||||||
{
|
{
|
||||||
wp[WP_PRECISION] = (hawk_int_t)ch_len;
|
wp[WP_PRECISION] = (hawk_int_t)ch_len;
|
||||||
}
|
}
|
||||||
@ -8267,7 +8269,7 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8321,7 +8323,11 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp[WP_PRECISION] == -1 || wp[WP_PRECISION] > (hawk_int_t)str_len) wp[WP_PRECISION] = (hawk_int_t)str_len;
|
if (wp_idx != WP_PRECISION || wp[WP_PRECISION] <= -1 || wp[WP_PRECISION] > (hawk_int_t)str_len)
|
||||||
|
{
|
||||||
|
/* precision not specified, or specified to a negative value or greater than the actual length */
|
||||||
|
wp[WP_PRECISION] = (hawk_int_t)str_len;
|
||||||
|
}
|
||||||
if (wp[WP_PRECISION] > wp[WP_WIDTH]) wp[WP_WIDTH] = wp[WP_PRECISION];
|
if (wp[WP_PRECISION] > wp[WP_WIDTH]) wp[WP_WIDTH] = wp[WP_PRECISION];
|
||||||
|
|
||||||
if (!(flags & FLAG_MINUS))
|
if (!(flags & FLAG_MINUS))
|
||||||
@ -8562,7 +8568,7 @@ hawk_bch_t* hawk_rtx_formatmbs (
|
|||||||
}
|
}
|
||||||
|
|
||||||
wp_mod_init:
|
wp_mod_init:
|
||||||
wp[WP_WIDTH] = -1; /* width */
|
wp[WP_WIDTH] = 0; /* width */
|
||||||
wp[WP_PRECISION] = -1; /* precision */
|
wp[WP_PRECISION] = -1; /* precision */
|
||||||
wp_idx = WP_WIDTH; /* width first */
|
wp_idx = WP_WIDTH; /* width first */
|
||||||
|
|
||||||
@ -8598,14 +8604,14 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_valtoint(rtx, v, &wp[wp_idx]);
|
n = hawk_rtx_valtoint(rtx, v, &wp[wp_idx]);
|
||||||
hawk_rtx_refdownval (rtx, v);
|
hawk_rtx_refdownval (rtx, v);
|
||||||
if (n <= -1) return HAWK_NULL;
|
if (HAWK_UNLIKELY(n <= -1)) return HAWK_NULL;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@ -8653,15 +8659,21 @@ wp_mod_main:
|
|||||||
|
|
||||||
if (wp_idx == WP_WIDTH && i < fmt_len && fmt[i] == HAWK_BT('.'))
|
if (wp_idx == WP_WIDTH && i < fmt_len && fmt[i] == HAWK_BT('.'))
|
||||||
{
|
{
|
||||||
wp[WP_PRECISION] = 0;
|
|
||||||
FMT_MCHAR (fmt[i]); i++;
|
FMT_MCHAR (fmt[i]); i++;
|
||||||
|
|
||||||
|
wp[WP_PRECISION] = 0;
|
||||||
wp_idx = WP_PRECISION; /* change index to precision */
|
wp_idx = WP_PRECISION; /* change index to precision */
|
||||||
goto wp_mod_main;
|
goto wp_mod_main;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= fmt_len) break;
|
if (i >= fmt_len) break;
|
||||||
|
|
||||||
|
if (wp[WP_WIDTH] < 0)
|
||||||
|
{
|
||||||
|
wp[WP_WIDTH] = -wp[WP_WIDTH];
|
||||||
|
flags |= FLAG_MINUS;
|
||||||
|
}
|
||||||
|
|
||||||
if (fmt[i] == HAWK_BT('d') || fmt[i] == HAWK_BT('i') ||
|
if (fmt[i] == HAWK_BT('d') || fmt[i] == HAWK_BT('i') ||
|
||||||
fmt[i] == HAWK_BT('x') || fmt[i] == HAWK_BT('X') ||
|
fmt[i] == HAWK_BT('x') || fmt[i] == HAWK_BT('X') ||
|
||||||
fmt[i] == HAWK_BT('b') || fmt[i] == HAWK_BT('B') ||
|
fmt[i] == HAWK_BT('b') || fmt[i] == HAWK_BT('B') ||
|
||||||
@ -8700,30 +8712,27 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_valtoint (rtx, v, &l);
|
n = hawk_rtx_valtoint(rtx, v, &l);
|
||||||
hawk_rtx_refdownval (rtx, v);
|
hawk_rtx_refdownval (rtx, v);
|
||||||
if (n <= -1) return HAWK_NULL;
|
if (HAWK_UNLIKELY(n <= -1)) return HAWK_NULL;
|
||||||
|
|
||||||
fmt_flags = HAWK_FMT_INTMAX_NOTRUNC | HAWK_FMT_INTMAX_NONULL;
|
fmt_flags = HAWK_FMT_INTMAX_NOTRUNC | HAWK_FMT_INTMAX_NONULL;
|
||||||
|
|
||||||
if (l == 0 && wp[WP_PRECISION] == 0)
|
if (l == 0 && wp_idx == WP_PRECISION && wp[WP_PRECISION] == 0)
|
||||||
{
|
{
|
||||||
/* A zero value with a precision of zero produces
|
/* printf ("%.d", 0); printf ("%.0d", 0); printf ("%.*d", 0, 0); */
|
||||||
* no character. */
|
/* A zero value with a precision of zero produces no character. */
|
||||||
fmt_flags |= HAWK_FMT_INTMAX_NOZERO;
|
fmt_flags |= HAWK_FMT_INTMAX_NOZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp[WP_WIDTH] != -1)
|
if (wp[WP_WIDTH] > 0)
|
||||||
{
|
{
|
||||||
/* Width must be greater than 0 if specified */
|
/* justification for width greater than 0 */
|
||||||
HAWK_ASSERT (wp[WP_WIDTH] > 0);
|
|
||||||
|
|
||||||
/* justification when width is specified. */
|
|
||||||
if (flags & FLAG_ZERO)
|
if (flags & FLAG_ZERO)
|
||||||
{
|
{
|
||||||
if (flags & FLAG_MINUS)
|
if (flags & FLAG_MINUS)
|
||||||
@ -8739,7 +8748,7 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (wp[WP_PRECISION] == -1)
|
if (wp_idx != WP_PRECISION) /* if precision is not set, wp_idx is at WP_WIDTH */
|
||||||
{
|
{
|
||||||
/* precision not specified.
|
/* precision not specified.
|
||||||
* FLAG_ZERO can take effect */
|
* FLAG_ZERO can take effect */
|
||||||
@ -8912,7 +8921,7 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8953,7 +8962,7 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9003,7 +9012,7 @@ wp_mod_main:
|
|||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp[WP_PRECISION] == -1 || wp[WP_PRECISION] == 0 || wp[WP_PRECISION] > (hawk_int_t)ch_len)
|
if (wp[WP_PRECISION] <= 0 || wp[WP_PRECISION] > (hawk_int_t)ch_len)
|
||||||
{
|
{
|
||||||
wp[WP_PRECISION] = (hawk_int_t)ch_len;
|
wp[WP_PRECISION] = (hawk_int_t)ch_len;
|
||||||
}
|
}
|
||||||
@ -9081,7 +9090,7 @@ wp_mod_main:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = eval_expression(rtx, args);
|
v = eval_expression(rtx, args);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9137,7 +9146,11 @@ wp_mod_main:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp[WP_PRECISION] == -1 || wp[WP_PRECISION] > (hawk_int_t)str_len) wp[WP_PRECISION] = (hawk_int_t)str_len;
|
if (wp_idx != WP_PRECISION || wp[WP_PRECISION] <= -1 || wp[WP_PRECISION] > (hawk_int_t)str_len)
|
||||||
|
{
|
||||||
|
/* precision not specified, or specified to a negative value or greater than the actual length */
|
||||||
|
wp[WP_PRECISION] = (hawk_int_t)str_len;
|
||||||
|
}
|
||||||
if (wp[WP_PRECISION] > wp[WP_WIDTH]) wp[WP_WIDTH] = wp[WP_PRECISION];
|
if (wp[WP_PRECISION] > wp[WP_WIDTH]) wp[WP_WIDTH] = wp[WP_PRECISION];
|
||||||
|
|
||||||
if (!(flags & FLAG_MINUS))
|
if (!(flags & FLAG_MINUS))
|
||||||
|
@ -140,7 +140,7 @@ function main()
|
|||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
@local pi, e;
|
@local pi, e, tmp;
|
||||||
|
|
||||||
pi = 3.1415927;
|
pi = 3.1415927;
|
||||||
|
|
||||||
@ -155,7 +155,90 @@ function main()
|
|||||||
ensure (sprintf("sqrt(pi ^ 2) = %f", sqrt(pi ^ 2)), "sqrt(pi ^ 2) = 3.141593", @SCRIPTNAME, @SCRIPTLINE);
|
ensure (sprintf("sqrt(pi ^ 2) = %f", sqrt(pi ^ 2)), "sqrt(pi ^ 2) = 3.141593", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
ensure (sprintf("atan2(1, 1) = %f", atan2(1, 1)), "atan2(1, 1) = 0.785398", @SCRIPTNAME, @SCRIPTLINE);
|
ensure (sprintf("atan2(1, 1) = %f", atan2(1, 1)), "atan2(1, 1) = 0.785398", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
ensure (sprintf("%*sworld", -20, "hello"), "hello world", @SCRIPTNAME, @SCRIPTLINE);
|
tmp = sprintf("%s", "hello");
|
||||||
|
ensure ((tmp === @b"hello"), 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp === "hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == @b"hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == "hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
tmp = sprintf("%s", @b"hello");
|
||||||
|
ensure ((tmp === @b"hello"), 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp === "hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == @b"hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == "hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
tmp = sprintf(@b"%s", "hello");
|
||||||
|
ensure ((tmp === @b"hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp === "hello"), 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == @b"hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == "hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
tmp = sprintf(@b"%s", @b"hello");
|
||||||
|
ensure ((tmp === @b"hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp === "hello"), 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == @b"hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure ((tmp == "hello"), 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf("%0d", 0), "0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%0.d", 0), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%.d", 0), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%.*d", 0, 0), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%.*d", 1, 0), "0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*d", 0, 0), "0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*.*d", 0, 0, 0), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-*.*d", 0, 0, 0), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*.*d", 1, 0, 0), " ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*.*d", 0, 3, 0), "000", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-*d", 0, 0), "0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf(@b"%0d", 0), @b"0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%0.d", 0), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%.d", 0), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%.*d", 0, 0), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%.*d", 1, 0), @b"0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*d", 0, 0), @b"0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*.*d", 0, 0, 0), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%-*.*d", 0, 0, 0), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*.*d", 1, 0, 0), @b" ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*.*d", 0, 3, 0), @b"000", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%-*d", 0, 0), @b"0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf("%5d", 5), " 5", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-5d", 5), "5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*d", 5, 5), " 5", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*d", -5, 5), "5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-*d", 5, 5), "5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-*d", -5, 5), "5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf(@b"%5d", 5), @b" 5", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%-5d", 5), @b"5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*d", 5, 5), @b" 5", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*d", -5, 5), @b"5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%-*d", 5, 5), @b"5 ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf("%*sworld", 20, "hello"), " helloworld", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*sworld", -20, "hello"), "hello world", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-*sworld", 20, "hello"), "hello world", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%-*sworld", -20, "hello"), "hello world", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf(@b"%*sworld", 20, "hello"), @b" helloworld", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*sworld", -20, "hello"), @b"hello world", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%-*sworld", 20, "hello"), @b"hello world", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%-*sworld", -20, "hello"), @b"hello world", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf("%0s", "hello"), "hello", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%.0s", "hello"), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%0.0s", "hello"), "", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%1.0s", "hello"), " ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*.*s", 20, 0, "hello"), " ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf("%*.*s", 20, 2, "hello"), " he", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
|
ensure (sprintf(@b"%0s", "hello"), @b"hello", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%.0s", "hello"), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%0.0s", "hello"), @b"", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%1.0s", "hello"), @b" ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*.*s", 20, 0, "hello"), @b" ", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
ensure (sprintf(@b"%*.*s", 20, 2, "hello"), @b" he", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user