mirror of
https://github.com/Tilo-K/sea-flags.git
synced 2026-01-08 07:11:02 +00:00
feat: add basic parsing and readme
This commit is contained in:
59
README.md
Normal file
59
README.md
Normal file
@@ -0,0 +1,59 @@
|
||||
<pre style="font-size: 8pt;">
|
||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.
|
||||
::.::::::.::::.::.::::.::.:::::.:::::.::::::::.:::.::.::::::.::::
|
||||
:::::.::::::.:::::::.:::::::.::::::::::::.::.:::::::::::.::::::.:
|
||||
:::::::::::::::::::::::::::::::::::.:::.:::::::::::::::::::::::::
|
||||
:.::::::.::::::.:::::::.::::::::::::::::::::::::.::::.::::.::.::.
|
||||
::::.::::::.::::::.:::::::.::::::::::.::::::.::::::.::::.::::::::
|
||||
::::::::::::::.::::::::::::::.::.::.:::::.:::::::::::::::::::::::
|
||||
:.::::.:::::::::::::.::.:::::::::::::::::::::::.::::::.::::.:.::.
|
||||
::::.::::.:::::::.:::::::::.::::::::::.:::::::::::.::::::::::::::
|
||||
::::::::::::.::.::::::::::::::.::::::::::::::.:::::::::::.:::::.:
|
||||
::.::::::::::::::::::::::::::::::.::::::::::::::.:::.::.:::::::::
|
||||
:::::.::::::::::::::.::-@:::::::::::.::.::.:::::::::::::::::.::::
|
||||
.:::::::.::.::::::.::::-@+**********=:::::::::::+::::::::::::::.:
|
||||
:::.::::::::::.::::::::-@************************::::.:::.:::::::
|
||||
::::::.::::::::::::::::-@************************:::::::::::.:::.
|
||||
:::::::::.:::::::::::::-@***********************=::::::.:::::::::
|
||||
::.::::::::::::::::::.:-@***********************::::.::::::::::::
|
||||
:::::.:::::.::.::.:::::-@***********************=:::::::::.::.::.
|
||||
:::::::::.:::::::::::::-@************************::::::.:::::::::
|
||||
::.::::::::::::::::::::-@****====****************::::::::::::::::
|
||||
:::::.::::::::.::::::::-@:::::::::::::=*******+-:::::.:::::.::.::
|
||||
.:::::::.::::::::::.:::-@::::::::::::::::::::::::::::::::.:::::::
|
||||
:::::::::::.:::::::::::-@:::::::::::::::::::::::::::::::::::::::.
|
||||
:::.::::::::::.::::::::-@::::::.:::::::::::::::.::.::::::::::::::
|
||||
:::::::::::::::::.:::::-@:::::::::::::::::::::::::::::::.:::::::.
|
||||
:::::::::::::::::::::::-@:::::::::::::::.::::::::::::.::::::.::::
|
||||
:::.::.::.:::::::::::::-@::::::::.:::::::::::.::.::.:::::::::::::
|
||||
::::::::::::::.::::::::-@:::::::::::::::::::::::::::::::::.::::.:
|
||||
:.:::::::::::::::::::::-@::::::::::::.:::::::::::::::::::::::::::
|
||||
:::::::::::::::::::::::-@::::::::::::::::::::::::.:::::::::::.:::
|
||||
:::::::::::::.::.::::::-@::::::::.:::::::::::::.:::::::::.::::::.
|
||||
:::.:::::.::::::::::.::-@::::::::::::::::::::::::::::::::::::::::
|
||||
:::::::::::::::::::::::-@:::::::::::::::::::.::::::::.::::::::.::
|
||||
:::::::::::::::::::::::-@::::::::::::::::::::::::::::::::::::::::
|
||||
::+***********=::::::::-@-=***********+:::::::::::+***********=::
|
||||
***********************#@****************************************
|
||||
***********************#@****************************************
|
||||
************************@****************************************
|
||||
*************#%%%##%%%##@#%%%%#%%%##*****************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
</pre>
|
||||
# SeaFlags
|
||||
### SeaFlags is a simple library for parsing command line arguments.
|
||||
|
||||
|
||||
29
includes/seaflags.h
Normal file
29
includes/seaflags.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
struct SeaFlag {
|
||||
char* name;
|
||||
char* short_name;
|
||||
bool is_required;
|
||||
|
||||
char** value;
|
||||
struct SeaFlag* next;
|
||||
};
|
||||
|
||||
struct SeaFlagSet {
|
||||
struct SeaFlag* firstFlag;
|
||||
|
||||
char* programName;
|
||||
char* programVersion;
|
||||
char* programAuthor;
|
||||
char* programDescription;
|
||||
};
|
||||
|
||||
#define SEAFLAGS_UNKNOWN_FLAG 0b00000001
|
||||
#define SEAFLAGS_UNKNOWN_POSITIONAL_ARG 0b00000010
|
||||
#define SEAFLAGS_MISSING_REQUIRED_FLAG 0b00000100
|
||||
|
||||
|
||||
void seaflags_init(struct SeaFlagSet* flags, char* programName, char* programVersion, char* programAuthor, char* programDescription);
|
||||
void seaflags_add_flag(struct SeaFlagSet* flags, char* name, char* short_name, bool is_required, char** value);
|
||||
int seaflags_parse(struct SeaFlagSet* flags, int argc, char** argv);
|
||||
void seaflags_free(struct SeaFlagSet* flags);
|
||||
109
src/seaflags.c
109
src/seaflags.c
@@ -0,0 +1,109 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "../includes/seaflags.h"
|
||||
|
||||
#define SEAFLAGS_DEBUG
|
||||
|
||||
void seaflags_init(struct SeaFlagSet *flags, char *programName, char *programVersion, char *programAuthor, char *programDescription) {
|
||||
flags->firstFlag = NULL;
|
||||
|
||||
flags->programName = programName;
|
||||
flags->programVersion = programVersion;
|
||||
flags->programAuthor = programAuthor;
|
||||
flags->programDescription = programDescription;
|
||||
}
|
||||
|
||||
void seaflags_add_flag(struct SeaFlagSet *flags, char *name, char *short_name, bool is_required, char** value) {
|
||||
struct SeaFlag* flag = malloc(sizeof(struct SeaFlag));
|
||||
flag->name = name;
|
||||
flag->short_name = short_name;
|
||||
flag->is_required = is_required;
|
||||
flag->value = value;
|
||||
flag->next = NULL;
|
||||
|
||||
if (flags->firstFlag == NULL) {
|
||||
flags->firstFlag = flag;
|
||||
return;
|
||||
}
|
||||
|
||||
struct SeaFlag* current = flags->firstFlag;
|
||||
if(current == NULL) {
|
||||
flags->firstFlag = flag;
|
||||
return;
|
||||
}
|
||||
while (current->next != NULL) {
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
current->next = flag;
|
||||
}
|
||||
|
||||
void seaflags_free(struct SeaFlagSet *flags){
|
||||
struct SeaFlag* current = flags->firstFlag;
|
||||
while (current != NULL) {
|
||||
struct SeaFlag* next = current->next;
|
||||
free(current->name);
|
||||
free(current->short_name);
|
||||
free(current->value);
|
||||
free(current);
|
||||
current = next;
|
||||
}
|
||||
free(flags);
|
||||
}
|
||||
|
||||
struct SeaFlag* _seaflags_find_flag(struct SeaFlagSet *flags, char *name) {
|
||||
struct SeaFlag* current = flags->firstFlag;
|
||||
while (current != NULL) {
|
||||
if (strcmp(current->name, name) == 0 || strcmp(current->short_name, name) == 0) {
|
||||
return current;
|
||||
}
|
||||
current = current->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int seaflags_parse(struct SeaFlagSet *flags, int argc, char **argv) {
|
||||
int i = 1;
|
||||
int result = 0;
|
||||
|
||||
#ifdef SEAFLAGS_DEBUG
|
||||
printf("Parsing %d arguments\n", argc);
|
||||
#endif
|
||||
|
||||
while (i < argc) {
|
||||
char* current = argv[i];
|
||||
struct SeaFlag* flag = _seaflags_find_flag(flags, current);
|
||||
|
||||
if (flag == NULL) {
|
||||
fprintf(stderr, "Unknown flag: %s\n", current);
|
||||
result |= SEAFLAGS_UNKNOWN_FLAG;
|
||||
}
|
||||
|
||||
if(flag != NULL && i+1 < argc) {
|
||||
#ifdef SEAFLAGS_DEBUG
|
||||
printf("Setting value for %s to %s\n", current, argv[i+1]);
|
||||
#endif
|
||||
|
||||
*(flag->value) = argv[i+1];
|
||||
i++;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
struct SeaFlag* current = flags->firstFlag;
|
||||
while (current != NULL) {
|
||||
if (*(current->value) == NULL) {
|
||||
if (current->is_required == true) {
|
||||
fprintf(stderr, "Missing required flag: %s\n", current->name);
|
||||
result |= SEAFLAGS_MISSING_REQUIRED_FLAG;
|
||||
}
|
||||
}
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,108 @@
|
||||
int main(void) {
|
||||
return 0;
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define SEAFLAGS_DEBUG
|
||||
#include "../includes/seaflags.h"
|
||||
|
||||
int test_basic_create() {
|
||||
printf("Running test_basic_create\n");
|
||||
struct SeaFlagSet flags;
|
||||
seaflags_init(&flags, "Sea Flag Test", "0.0.0", "Tilo-K" , "A test for the seaflags library");
|
||||
char* name = NULL;
|
||||
seaflags_add_flag(&flags, "name", "n", true, &name);
|
||||
|
||||
if (flags.firstFlag == NULL) {
|
||||
printf("Flags not created\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (flags.firstFlag->name == NULL) {
|
||||
printf("Flag name not set\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (flags.firstFlag->short_name == NULL) {
|
||||
printf("Flag short name not set\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (flags.firstFlag->is_required != true) {
|
||||
printf("Flag is_required not set\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (flags.firstFlag->value == NULL) {
|
||||
printf("Flag value not set\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test_get_flag_value() {
|
||||
printf("Running test_get_flag_value\n");
|
||||
struct SeaFlagSet flags;
|
||||
seaflags_init(&flags, "Sea Flag Test", "0.0.0", "Tilo-K" , "A test for the seaflags library");
|
||||
char* name = NULL;
|
||||
|
||||
printf("Adding flag\n");
|
||||
seaflags_add_flag(&flags, "--name", "-n", true, &name);
|
||||
printf("Parsing\n");
|
||||
seaflags_parse(&flags, 3, (char*[]){"./test", "--name", "test"});
|
||||
printf("Parsed\n");
|
||||
|
||||
|
||||
if (name == NULL || strcmp(name, "test") != 0) {
|
||||
printf("Flag value name not set, found %s\n", name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test_missing_required_flag() {
|
||||
printf("Running test_missing_required_flag\n");
|
||||
struct SeaFlagSet flags;
|
||||
seaflags_init(&flags, "Sea Flag Test", "0.0.0", "Tilo-K" , "A test for the seaflags library");
|
||||
char* name = NULL;
|
||||
|
||||
printf("Adding flag\n");
|
||||
seaflags_add_flag(&flags, "--name", "-n", true, &name);
|
||||
printf("Parsing\n");
|
||||
int result = seaflags_parse(&flags, 1, (char*[]){"./test"});
|
||||
printf("Parsed\n");
|
||||
|
||||
if ((result & SEAFLAGS_MISSING_REQUIRED_FLAG) > 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("Missing required flag not detected %d\n", result);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
printf("Running main\n");
|
||||
|
||||
int result = test_basic_create();
|
||||
if (result != 0) {
|
||||
printf("Basic Test failed with result %d\n", result);
|
||||
return 1;
|
||||
}
|
||||
|
||||
result = test_get_flag_value();
|
||||
if (result != 0) {
|
||||
printf("Get Flag Value Test failed with result %d\n", result);
|
||||
return 1;
|
||||
}
|
||||
|
||||
result = test_missing_required_flag();
|
||||
if (result != 0) {
|
||||
printf("Missing Required Flag Test failed with result %d\n", result);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user