summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nserver/src/ncmd.c53
-rw-r--r--nserver/src/ncmd.h3
-rw-r--r--nserver/tests/ncmd_tests.c32
3 files changed, 88 insertions, 0 deletions
diff --git a/nserver/src/ncmd.c b/nserver/src/ncmd.c
index 51459ad..8c90831 100644
--- a/nserver/src/ncmd.c
+++ b/nserver/src/ncmd.c
@@ -45,3 +45,56 @@ char *check_cmd(char *cmd)
err = "internal error\n";
return err;
}
+
+
+struct bstrList *cmd_parts(char *cmd)
+{
+ bstring bcmd = NULL;
+ struct bstrList *parts_tmp = NULL;
+
+ bcmd = bfromcstr(cmd);
+ check(bcmd != NULL, "bstring creation failed");
+
+ parts_tmp = bsplit(bcmd, ' ');
+ check(parts_tmp != NULL, "cmp split failed");
+ check(parts_tmp->qty > 0, "qty check failed");
+
+ struct bstrList *parts = bstrListCreate();
+ check(parts != NULL, "parts create failed");
+
+ int rc = bstrListAlloc(parts, parts_tmp->qty);
+ check(rc == BSTR_OK, "parts alloc failed");
+ check(parts->qty == 0, "qty check failed");
+
+ bstring part = NULL;
+ int index = 0;
+ for (int i = 0; i < parts_tmp->qty; i++) {
+ check(parts->qty <= parts->mlen, "parts capacity check failed");
+
+ part = parts_tmp->entry[i];
+
+ if (blength(part) == 0) {
+ continue;
+ }
+
+ parts->entry[index++] = bstrcpy(part);
+ parts->qty++;
+ }
+
+ // Clean up.
+ bdestroy(bcmd);
+ bstrListDestroy(parts_tmp);
+
+ return parts;
+ error:
+ // Clean up.
+ if (bcmd) {
+ bdestroy(bcmd);
+ }
+ if (parts_tmp) {
+ bstrListDestroy(parts_tmp);
+ }
+
+ return NULL;
+}
+
diff --git a/nserver/src/ncmd.h b/nserver/src/ncmd.h
index 75ac357..c1cf9a0 100644
--- a/nserver/src/ncmd.h
+++ b/nserver/src/ncmd.h
@@ -3,6 +3,7 @@
#include <string.h>
+#include <bstrlib.h>
#include <dbg.h>
#define CMD_MIN_SIZE 5
@@ -11,4 +12,6 @@
int sanitize(char *cmd);
char *check_cmd(char *cmd);
+struct bstrList *cmd_parts(char *cmd);
+
#endif
diff --git a/nserver/tests/ncmd_tests.c b/nserver/tests/ncmd_tests.c
index 2ea64df..b2daeb4 100644
--- a/nserver/tests/ncmd_tests.c
+++ b/nserver/tests/ncmd_tests.c
@@ -105,12 +105,44 @@ char *test_check_cmd()
return NULL;
}
+char *test_cmd_parts()
+{
+ struct bstrList *parts = NULL;
+
+ bstring create = bfromcstr("/create");
+
+ char *bacon = "/create bacon";
+ parts = cmd_parts(bacon);
+ mu_assert(parts != NULL, "cmd parts failed");
+ mu_assert(parts->qty == 2, "qty check failed");
+ mu_assert(bstricmp(parts->entry[0], create) == 0,
+ "equality check failed");
+
+ // Cleanup
+ bstrListDestroy(parts);
+
+ char *ham = "/create ham";
+ parts = cmd_parts(ham);
+ mu_assert(parts != NULL, "cmd parts failed");
+ mu_assert(parts->qty == 2, "qty check failed");
+ mu_assert(bstricmp(parts->entry[0], create) == 0,
+ "equality check failed");
+
+
+ // Cleanup
+ bdestroy(create);
+ bstrListDestroy(parts);
+
+ return NULL;
+}
+
char *all_tests()
{
mu_suite_start();
mu_run_test(test_sanitize);
mu_run_test(test_check_cmd);
+ mu_run_test(test_cmd_parts);
return NULL;
}