diff --git a/src/args.c b/src/args.c new file mode 100644 index 0000000..bdf8ea7 --- /dev/null +++ b/src/args.c @@ -0,0 +1,72 @@ +#include "args.h" + +#include +#include + +void kwil_parse_args(struct kwil_args_t* self, int argc, char** argv) { + self->argc = argc; + self->argv = argv; + self->parsed = 0; + + // allocate filename array with capacity of 1 + self->filenames = malloc(sizeof(char**)); + self->filenames_cap = 1; + self->filenames_len = 0; + + for(self->parsed = 0; self->parsed < argc; ++self->parsed) { + kwil_args_parse_arg(self, self->parsed); + } +} + +void kwil_free_args(struct kwil_args_t* self) { + for(int i = 0; i < self->filenames_len; ++i) { + free(self->filenames[i]); + } + + free(self->filenames); + self->filenames_cap = 0; + self->filenames_len = 0; +} + +int kwil_args_add_filename(struct kwil_args_t* self, const char* filename) { + // resize the array if needed + if(self->filenames_len >= self->filenames_cap) { + size_t new_cap = self->filenames_cap * 2; + char** new_array = realloc(self->filenames, new_cap * sizeof(char**)); + if(new_array == NULL) { + return 1; + } + self->filenames_cap = new_cap; + self->filenames = new_array; + } + + // allocate enough memory for the string and null terminator + size_t len = strlen(filename); + self->filenames[self->filenames_len] = malloc(len + 1); + // copy string (includes null terminator) + strcpy(self->filenames[self->filenames_len], filename); + + ++self->filenames_len; + + return 0; +} + +void kwil_args_parse_arg(struct kwil_args_t* self, int at) { + if(at == 0) { + // is program argument, ignore + } else if(self->argv[at][0] == '-') { + // is a flag, parse flag + // no flags to parse + } else { + // asume a filename + kwil_args_parse_filename(self, at); + } +} + +void kwil_args_parse_filename(struct kwil_args_t* self, int filename) { + const char* filename_str = self->argv[filename]; + int len = strlen(filename_str); + if(strcmp(filename_str + len - 7, ".kwil.h") != 0) { + kwil_args_add_filename(self, filename_str); + } +} diff --git a/src/args.h b/src/args.h new file mode 100644 index 0000000..9c043b6 --- /dev/null +++ b/src/args.h @@ -0,0 +1,30 @@ +#ifndef _ARGS_H +#define _ARGS_H + +#include + +struct kwil_args_t { + int argc; // copy of the argv length passed to main + char** argv; // pointer to the argv array passed to main + int parsed; // the number of arguments parsed so far + + char** filenames; // filenames to process + size_t filenames_len; // number of filenames to process + size_t filenames_cap; // allocated capacity of filenames array +}; + +// Instantiate a kwil_args_t and parse the arguments array for flags and files +extern void kwil_parse_args(struct kwil_args_t* self, int argc, char** argv); +// Free an arguments object's owned memory. +// Does not free the self*. +extern void kwil_free_args(struct kwil_args_t* self); + +// Add a filename to the filename array and increase capacity if needed. +extern int kwil_args_add_filename(struct kwil_args_t* self, const char* filename); + +// Parse an argument +extern void kwil_args_parse_arg(struct kwil_args_t* self, int at); +// Parse a filename argument +extern void kwil_args_parse_filename(struct kwil_args_t* self, int at); + +#endif // !_ARGS_H