diff options
author | rsiddharth <s@ricketyspace.net> | 2019-11-28 17:52:27 -0500 |
---|---|---|
committer | rsiddharth <s@ricketyspace.net> | 2020-04-17 20:56:35 -0400 |
commit | cc7676f9c622a973aba1d56836df52d18b6d4b9a (patch) | |
tree | 2a7bee788866dfe89e03787d4b2c216f23de5f57 /nserver/src/ncmd.c | |
parent | 67ec8a3e31c6f100208231145ebfc32f4180558d (diff) |
nserver: ncmd.h : Add cmd_parts.
* nserver/src/ncmd.c (cmd_parts): New function definition.
* nserver/src/ncmd.h (cmd_parts): New function declaration.
* nserver/tests/ncmd_tests.c (test_cmd_parts): Test cmd_parts.
(all_tests): Add test_cmd_parts
Diffstat (limited to 'nserver/src/ncmd.c')
-rw-r--r-- | nserver/src/ncmd.c | 53 |
1 files changed, 53 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; +} + |