|
@@ -2841,6 +2841,21 @@ qi_value_t *qi_mul(qi_state_t *state, qi_value_t *a, qi_value_t *b) {
|
|
|
|
|
|
|
|
if (a->type == QI_NUMBER && b->type == QI_NUMBER)
|
|
if (a->type == QI_NUMBER && b->type == QI_NUMBER)
|
|
|
return qi_make_number(state, a->value.number * b->value.number);
|
|
return qi_make_number(state, a->value.number * b->value.number);
|
|
|
|
|
+ else if (a->type == QI_STRING && b->type == QI_NUMBER) {
|
|
|
|
|
+ qi_size_t n = (qi_size_t)fabs(b->value.number);
|
|
|
|
|
+
|
|
|
|
|
+ if (n < 1)
|
|
|
|
|
+ return state->empty_string;
|
|
|
|
|
+ else if (n == 1)
|
|
|
|
|
+ return a;
|
|
|
|
|
+
|
|
|
|
|
+ qi_buffer_t *buffer = qi_buffer_make();
|
|
|
|
|
+
|
|
|
|
|
+ for (qi_size_t i = 0; i < n; i++)
|
|
|
|
|
+ qi_buffer_append_str(buffer, a->value.string);
|
|
|
|
|
+
|
|
|
|
|
+ return qi_make_string(state, qi_buffer_read(buffer));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
leave:
|
|
leave:
|
|
|
qi_throw_format(state, "unsupported operand types for *: %s and %s",
|
|
qi_throw_format(state, "unsupported operand types for *: %s and %s",
|