script: add length
This commit is contained in:
parent
ba3f4e620c
commit
2735756dbd
|
@ -910,6 +910,35 @@ defn (fn_to_float)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - Miscellaneous - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
defn (fn_length)
|
||||||
|
{
|
||||||
|
check_stack (1);
|
||||||
|
struct item *item = pop (ctx);
|
||||||
|
bool success = true;
|
||||||
|
switch (item->type)
|
||||||
|
{
|
||||||
|
case ITEM_STRING:
|
||||||
|
push (ctx, new_integer (((struct item_string *) item)->len));
|
||||||
|
break;
|
||||||
|
case ITEM_LIST:
|
||||||
|
{
|
||||||
|
long long length = 0;
|
||||||
|
struct item *iter;
|
||||||
|
for (iter = get_list (item); iter; iter = iter->next)
|
||||||
|
length++;
|
||||||
|
push (ctx, new_integer (length));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
ctx->error = strdup ("invalid type");
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
item_free (item);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
// - - Stack operations - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - Stack operations - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
defn (fn_dup)
|
defn (fn_dup)
|
||||||
|
@ -1654,7 +1683,6 @@ item_list_to_str (const struct item *script, struct buffer *buf)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
// TODO: implement more functions; try to avoid writing it in C
|
// TODO: implement more functions; try to avoid writing it in C
|
||||||
// length -- length of a list/string
|
|
||||||
// -, /, %, ** -- arithmetic
|
// -, /, %, ** -- arithmetic
|
||||||
// at { value index -- sub-value } -- get n-th subvalue of a string/list
|
// at { value index -- sub-value } -- get n-th subvalue of a string/list
|
||||||
|
|
||||||
|
@ -1687,7 +1715,7 @@ init_runtime_library_scripts (void)
|
||||||
struct item *script = parse (scripts[i].definition, &error);
|
struct item *script = parse (scripts[i].definition, &error);
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "error parsing internal script `%s': %s=n",
|
fprintf (stderr, "error parsing internal script `%s': %s\n",
|
||||||
scripts[i].definition, error);
|
scripts[i].definition, error);
|
||||||
free (error);
|
free (error);
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
|
@ -1713,6 +1741,9 @@ init_runtime_library (void)
|
||||||
register_handler (">integer", fn_to_integer);
|
register_handler (">integer", fn_to_integer);
|
||||||
register_handler (">float", fn_to_float);
|
register_handler (">float", fn_to_float);
|
||||||
|
|
||||||
|
// Miscellaneous
|
||||||
|
register_handler ("length", fn_length);
|
||||||
|
|
||||||
// Basic stack manipulation
|
// Basic stack manipulation
|
||||||
register_handler ("dup", fn_dup);
|
register_handler ("dup", fn_dup);
|
||||||
register_handler ("drop", fn_drop);
|
register_handler ("drop", fn_drop);
|
||||||
|
|
Loading…
Reference in New Issue