mirror of
https://github.com/tailix/libkernaux.git
synced 2025-04-07 17:32:45 -04:00
Change kernaux_cmdline
This commit is contained in:
parent
12fd0be859
commit
7ac36e8fc4
4 changed files with 39 additions and 55 deletions
|
@ -3,8 +3,8 @@
|
|||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
static const size_t ARGV_COUNT_MAX = 100;
|
||||
static const size_t ARG_SIZE_MAX = 4096;
|
||||
#define ARGV_COUNT_MAX 100
|
||||
#define BUFFER_SIZE 4096
|
||||
|
||||
static const char *const cmdline = "foo bar\\ baz \"car cdr\"";
|
||||
|
||||
|
@ -13,7 +13,7 @@ int main()
|
|||
char error_msg[KERNAUX_CMDLINE_ERROR_MSG_SIZE_MAX];
|
||||
size_t argc;
|
||||
char *argv[ARGV_COUNT_MAX];
|
||||
char buffer[ARGV_COUNT_MAX * ARG_SIZE_MAX];
|
||||
char buffer[BUFFER_SIZE];
|
||||
|
||||
assert(kernaux_cmdline(
|
||||
cmdline,
|
||||
|
@ -22,7 +22,7 @@ int main()
|
|||
argv,
|
||||
buffer,
|
||||
ARGV_COUNT_MAX,
|
||||
ARG_SIZE_MAX
|
||||
BUFFER_SIZE
|
||||
));
|
||||
|
||||
assert(strcmp(error_msg, "") == 0);
|
||||
|
|
|
@ -19,7 +19,7 @@ bool kernaux_cmdline(
|
|||
char **argv,
|
||||
char *buffer,
|
||||
size_t argv_count_max,
|
||||
size_t arg_size_max
|
||||
size_t buffer_size
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -22,7 +22,7 @@ bool kernaux_cmdline(
|
|||
char **argv,
|
||||
char *buffer,
|
||||
const size_t argv_count_max,
|
||||
const size_t arg_size_max
|
||||
const size_t buffer_size
|
||||
) {
|
||||
if (
|
||||
cmdline == NULL ||
|
||||
|
@ -30,27 +30,21 @@ bool kernaux_cmdline(
|
|||
argc == NULL ||
|
||||
argv == NULL ||
|
||||
argv_count_max == 0 ||
|
||||
arg_size_max == 0
|
||||
buffer_size == 0
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(error_msg, '\0', KERNAUX_CMDLINE_ERROR_MSG_SIZE_MAX);
|
||||
*argc = 0;
|
||||
memset(argv, 0, sizeof(char*) * argv_count_max);
|
||||
memset(buffer, '\0', buffer_size);
|
||||
|
||||
for (size_t index = 0; index < argv_count_max; ++index) {
|
||||
argv[index] = NULL;
|
||||
}
|
||||
|
||||
memset(buffer, '\0', argv_count_max * arg_size_max);
|
||||
|
||||
if (cmdline[0] == '\0') {
|
||||
return true;
|
||||
}
|
||||
if (cmdline[0] == '\0') return true;
|
||||
|
||||
enum State state = INITIAL;
|
||||
|
||||
size_t buffer_size = 0;
|
||||
size_t buffer_pos = 0;
|
||||
|
||||
for (size_t index = 0; ; ++index) {
|
||||
const char cur = cmdline[index];
|
||||
|
@ -90,7 +84,7 @@ bool kernaux_cmdline(
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
@ -98,7 +92,7 @@ bool kernaux_cmdline(
|
|||
state = TOKEN;
|
||||
argv[(*argc)++] = buffer;
|
||||
*(buffer++) = cur;
|
||||
++buffer_size;
|
||||
++buffer_pos;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -132,7 +126,7 @@ bool kernaux_cmdline(
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
@ -140,30 +134,30 @@ bool kernaux_cmdline(
|
|||
state = TOKEN;
|
||||
argv[(*argc)++] = buffer;
|
||||
*(buffer++) = cur;
|
||||
++buffer_size;
|
||||
++buffer_pos;
|
||||
}
|
||||
break;
|
||||
|
||||
case TOKEN:
|
||||
if (cur == '\0') {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
state = FINAL;
|
||||
*(buffer++) = '\0';
|
||||
buffer_size = 0;
|
||||
buffer_pos = 0;
|
||||
}
|
||||
else if (cur == ' ') {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
state = WHITESPACE;
|
||||
*(buffer++) = '\0';
|
||||
buffer_size = 0;
|
||||
buffer_pos = 0;
|
||||
}
|
||||
else if (cur == '\\') {
|
||||
state = BACKSLASH;
|
||||
|
@ -173,13 +167,13 @@ bool kernaux_cmdline(
|
|||
goto fail;
|
||||
}
|
||||
else {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
*(buffer++) = cur;
|
||||
++buffer_size;
|
||||
++buffer_pos;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -189,14 +183,14 @@ bool kernaux_cmdline(
|
|||
goto fail;
|
||||
}
|
||||
else {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
state = TOKEN;
|
||||
*(buffer++) = cur;
|
||||
++buffer_size;
|
||||
++buffer_pos;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -209,23 +203,23 @@ bool kernaux_cmdline(
|
|||
state = QUOTE_BACKSLASH;
|
||||
}
|
||||
else if (cur == '"') {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
state = WHITESPACE;
|
||||
*(buffer++) = '\0';
|
||||
buffer_size = 0;
|
||||
buffer_pos = 0;
|
||||
}
|
||||
else {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
*(buffer++) = cur;
|
||||
++buffer_size;
|
||||
++buffer_pos;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -235,14 +229,14 @@ bool kernaux_cmdline(
|
|||
goto fail;
|
||||
}
|
||||
else {
|
||||
if (buffer_size >= arg_size_max) {
|
||||
if (buffer_pos >= buffer_size) {
|
||||
strcpy(error_msg, "arg too long");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
state = QUOTE;
|
||||
*(buffer++) = cur;
|
||||
++buffer_size;
|
||||
++buffer_pos;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -256,12 +250,7 @@ bool kernaux_cmdline(
|
|||
|
||||
fail:
|
||||
*argc = 0;
|
||||
|
||||
for (size_t index = 0; index < argv_count_max; ++index) {
|
||||
argv[index] = NULL;
|
||||
}
|
||||
|
||||
memset(buffer, '\0', argv_count_max * arg_size_max);
|
||||
|
||||
memset(argv, 0, sizeof(char*) * argv_count_max);
|
||||
memset(buffer, '\0', buffer_size);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
static const size_t ARGV_COUNT_MAX = 100;
|
||||
static const size_t ARG_SIZE_MAX = 4096;
|
||||
#define ARGV_COUNT_MAX 100
|
||||
#define BUFFER_SIZE 4096
|
||||
|
||||
static void test(
|
||||
const char *cmdline,
|
||||
size_t argv_count_max,
|
||||
size_t arg_size_max,
|
||||
size_t buffer_size,
|
||||
|
||||
bool expected_result,
|
||||
const char *expected_error_msg,
|
||||
|
@ -237,25 +237,20 @@ int main()
|
|||
void test(
|
||||
const char *const cmdline,
|
||||
size_t argv_count_max,
|
||||
size_t arg_size_max,
|
||||
size_t buffer_size,
|
||||
|
||||
const bool expected_result,
|
||||
const char *const expected_error_msg,
|
||||
size_t expected_argc,
|
||||
const char *const *const expected_argv
|
||||
) {
|
||||
if (argv_count_max == 0) {
|
||||
argv_count_max = ARGV_COUNT_MAX;
|
||||
}
|
||||
|
||||
if (arg_size_max == 0) {
|
||||
arg_size_max = ARG_SIZE_MAX;
|
||||
}
|
||||
if (argv_count_max == 0) argv_count_max = ARGV_COUNT_MAX;
|
||||
if (buffer_size == 0) buffer_size = BUFFER_SIZE;
|
||||
|
||||
char error_msg[KERNAUX_CMDLINE_ERROR_MSG_SIZE_MAX];
|
||||
size_t argc = 1234;
|
||||
char *argv[argv_count_max];
|
||||
char buffer[argv_count_max * arg_size_max];
|
||||
char buffer[buffer_size];
|
||||
|
||||
assert(
|
||||
kernaux_cmdline(
|
||||
|
@ -265,7 +260,7 @@ void test(
|
|||
argv,
|
||||
buffer,
|
||||
argv_count_max,
|
||||
arg_size_max
|
||||
buffer_size
|
||||
) == !!expected_result
|
||||
);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue