|
@@ -1853,7 +1853,7 @@ void compile_list(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, lis
|
|
|
|
|
|
NEWGID();
|
|
|
|
|
|
- buffer_fmt(tbuf, "qi_list_t *__list%d(qi_state_t *state) {\n", gid);
|
|
|
+ buffer_fmt(tbuf, "inline static qi_list_t *__list%d(qi_state_t *state) {\n", gid);
|
|
|
buffer_fmt(tbuf, "qi_list_t *list = qi_list_make_n(%d);\n", seq->length);
|
|
|
|
|
|
for (size_t i = 0; i < seq->length; i++) {
|
|
@@ -1883,7 +1883,7 @@ void compile_table(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, li
|
|
|
|
|
|
NEWGID();
|
|
|
|
|
|
- buffer_fmt(tbuf, "qi_table_t *__table%d(qi_state_t *state) {\n", gid);
|
|
|
+ buffer_fmt(tbuf, "inline static qi_table_t *__table%d(qi_state_t *state) {\n", gid);
|
|
|
buffer_fmt(tbuf, "qi_table_t *table = qi_table_make();\n");
|
|
|
|
|
|
table_iterate(table, {
|
|
@@ -2068,10 +2068,7 @@ const char *STD[][2] = {
|
|
|
"func file_read(filename) {\n"
|
|
|
" let file = fopen(filename, \"r\")\n"
|
|
|
" defer fclose(file)\n"
|
|
|
- " fseek(file, 0, SEEK_END)\n"
|
|
|
- " let size = ftell(file)\n"
|
|
|
- " frewind(file)\n"
|
|
|
- " return str(fread(file, size))\n"
|
|
|
+ " return str(fread(file, -1))\n"
|
|
|
"}\n"
|
|
|
"func file_write(filename, data) {\n"
|
|
|
" let file = fopen(filename, \"w\")\n"
|
|
@@ -2097,6 +2094,57 @@ const char *STD[][2] = {
|
|
|
" }\n"
|
|
|
"}\n"
|
|
|
"set_pseudomethod(\"list.remove\", list_remove)\n"
|
|
|
+ "func list_join(l) {\n"
|
|
|
+ " if type(l) != \"list\"\n"
|
|
|
+ " throw \"expected first argument to be: list, but got: \" + type(l)\n"
|
|
|
+ " var r = \"\"\n"
|
|
|
+ " var s\n"
|
|
|
+ " if len(arguments) == 1\n"
|
|
|
+ " s = \"\"\n"
|
|
|
+ " else\n"
|
|
|
+ " s = arguments[1]\n"
|
|
|
+ " if type(s) != \"string\"\n"
|
|
|
+ " throw \"expected second argument to be: string, but got: \" + type(s)\n"
|
|
|
+ " var first = true\n"
|
|
|
+ " for var x of l {\n"
|
|
|
+ " if type(x) != \"string\"\n"
|
|
|
+ " throw \"expected sequence item to be: string, but got: \" + type(x)\n"
|
|
|
+ " if s != \"\" && !first\n"
|
|
|
+ " r += s\n"
|
|
|
+ " r += x\n"
|
|
|
+ " first = false\n"
|
|
|
+ " }\n"
|
|
|
+ " return r\n"
|
|
|
+ "}\n"
|
|
|
+ "set_pseudomethod(\"list.join\", list_join)\n"
|
|
|
+ "func slice(l) {\n"
|
|
|
+ " if type(l) !in (\"list\", \"string\", \"bytes\")\n"
|
|
|
+ " throw \"expected first argument to be: list, string or bytes, but got: \" + type(l)\n"
|
|
|
+ " var r = []\n"
|
|
|
+ " if len(arguments) == 2 {\n"
|
|
|
+ " var f = arguments[1]\n"
|
|
|
+ " if type(f) != \"number\"\n"
|
|
|
+ " throw \"expected second argument to be: number, but got: \" + type(f)\n"
|
|
|
+ " for var i = f; i < len(l); i++\n"
|
|
|
+ " list_push(r, l[i])\n"
|
|
|
+ " } elif len(arguments) == 3 {\n"
|
|
|
+ " var f = arguments[1], t = arguments[2]\n"
|
|
|
+ " if type(f) != \"number\"\n"
|
|
|
+ " throw \"expected second argument to be: number, but got: \" + type(f)\n"
|
|
|
+ " if type(t) != \"number\"\n"
|
|
|
+ " throw \"expected third argument to be: number, but got: \" + type(t)\n"
|
|
|
+ " for var i = f; i < len(l) && i <= t; i++\n"
|
|
|
+ " list_push(r, l[i])\n"
|
|
|
+ " }\n"
|
|
|
+ " if type(l) == \"string\"\n"
|
|
|
+ " return list_join(r)\n"
|
|
|
+ " elif type(l) == \"bytes\"\n"
|
|
|
+ " return bytes(r)\n"
|
|
|
+ " return r\n"
|
|
|
+ "}\n"
|
|
|
+ "set_pseudomethod(\"list.slice\", slice)\n"
|
|
|
+ "set_pseudomethod(\"string.slice\", slice)\n"
|
|
|
+ "set_pseudomethod(\"bytes.slice\", slice)\n"
|
|
|
},
|
|
|
|
|
|
{"str",
|