From 687a3c91f551e260b0aa0d48205c9027e5b1bd82 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Fri, 8 Mar 2019 10:17:57 -0500 Subject: [PATCH] Add array/remove and update CHANGELOG. --- CHANGELOG.md | 3 +++ src/core/array.c | 34 +++++++++++++++++++++++++++++++++- src/include/janet.h | 2 +- test/suite5.janet | 7 +++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43224dd4..31b0251b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog All notable changes to this project will be documented in this file. +## 0.4.1 latest - ?? +- Add array/remove function + ## 0.4.0 - 2019-03-08 - Fix a number of smaller bugs - Added :export option to import and require diff --git a/src/core/array.c b/src/core/array.c index 8cccbd44..ebf01c0d 100644 --- a/src/core/array.c +++ b/src/core/array.c @@ -212,7 +212,32 @@ static Janet cfun_array_insert(int32_t argc, Janet *argv) { restsize); memcpy(array->data + at, argv + 2, chunksize); array->count += (argc - 2); - return janet_wrap_array(array); + return argv[0]; +} + +static Janet cfun_array_remove(int32_t argc, Janet *argv) { + janet_arity(argc, 2, 3); + JanetArray *array = janet_getarray(argv, 0); + int32_t at = janet_getinteger(argv, 1); + int32_t n = 1; + if (at < 0) { + at = array->count + at + 1; + } + if (at < 0 || at > array->count) + janet_panicf("removal index %d out of range [0,%d]", at, array->count); + if (argc == 3) { + n = janet_getinteger(argv, 2); + if (n < 0) + janet_panicf("expected non-negative integer for argument n, got %v", argv[2]); + } + if (at + n > array->count) { + n = array->count - at; + } + memmove(array->data + at, + array->data + at + n, + (array->count - at - n) * sizeof(Janet)); + array->count -= n; + return argv[0]; } static const JanetReg array_cfuns[] = { @@ -270,6 +295,13 @@ static const JanetReg array_cfuns[] = { "the end of the array, such that inserting at -1 appends to the array. " "Returns the array.") }, + { + "array/remove", cfun_array_remove, + JDOC("(array/remove arr at [, n=1])\n\n" + "Remove up to n elements starting at index at in array arr. at can index from " + "the end of the array with a negative index, and n must be a non-negative integer. " + "Returns the array.") + }, {NULL, NULL, NULL} }; diff --git a/src/include/janet.h b/src/include/janet.h index eb4d19ef..bb020c4f 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -29,7 +29,7 @@ extern "C" { /***** START SECTION CONFIG *****/ -#define JANET_VERSION "0.4.0" +#define JANET_VERSION "0.4.1" #ifndef JANET_BUILD #define JANET_BUILD "local" diff --git a/test/suite5.janet b/test/suite5.janet index bf6b1533..8264d134 100644 --- a/test/suite5.janet +++ b/test/suite5.janet @@ -56,6 +56,13 @@ (assert (= ((tarray/slice b 1) 2) (b 3) (a 6) 6) "tarray slice") (assert (= ((unmarshal (marshal b)) 3) (b 3)) "marshal") + +# Array remove + +(assert (deep= (array/remove @[1 2 3 4 5] 2) @[1 2 4 5]) "array/remove 1") +(assert (deep= (array/remove @[1 2 3 4 5] 2 2) @[1 2 5]) "array/remove 2") +(assert (deep= (array/remove @[1 2 3 4 5] 2 200) @[1 2]) "array/remove 3") +(assert (deep= (array/remove @[1 2 3 4 5] -3 200) @[1 2 3]) "array/remove 4") (end-suite)