aboutsummaryrefslogtreecommitdiffstats
path: root/src/opt.c
diff options
context:
space:
mode:
authorkatherine <ageha@airen-no-jikken.icu>2019-06-04 17:52:21 -0700
committerkatherine <ageha@airen-no-jikken.icu>2019-06-04 17:52:21 -0700
commit01209d714d3720cd4aa18edac10a549177c81b1e (patch)
tree756e2609e85c0fcea9a5bb9af71cf735965ea905 /src/opt.c
parent233bac703ee5849cb18d02330ccb97038ffc6439 (diff)
downloadconfconf-01209d714d3720cd4aa18edac10a549177c81b1e.tar.gz
add name-suffix and uthash-header options
Diffstat (limited to 'src/opt.c')
-rw-r--r--src/opt.c72
1 files changed, 71 insertions, 1 deletions
diff --git a/src/opt.c b/src/opt.c
index a856c74..a50f4ca 100644
--- a/src/opt.c
+++ b/src/opt.c
@@ -1,11 +1,14 @@
#include "version.h"
#include "opt.h"
+#include "tok.h"
#include "../reqs/simple-opt/simple-opt.h"
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
static struct simple_opt options[] = {
{ SIMPLE_OPT_FLAG, 'h', "help", false,
@@ -16,12 +19,18 @@ static struct simple_opt options[] = {
"specify file to read from (default is stdin)", "<file>" },
{ SIMPLE_OPT_STRING, 'o', "output", true,
"specify file to write to (default is stdout)", "<file>" },
+ { SIMPLE_OPT_STRING, 'u', "uthash-header", true,
+ "specify location header for uthash in the output (default is <uthash.h>)", "<file>" },
+ { SIMPLE_OPT_STRING, 'n', "name-suffix", true,
+ "specify unique suffix to append to generated functions and types", "<file>" },
{ SIMPLE_OPT_END }
};
void opt_parse(int argc, char **argv)
{
struct simple_opt_result result;
+ size_t i;
+ char c, cend;
result = simple_opt_parse(argc, argv, options);
@@ -33,7 +42,7 @@ void opt_parse(int argc, char **argv)
/* help */
if (options[0].was_seen) {
- simple_opt_print_usage(stdout, 70, argv[0],
+ simple_opt_print_usage(stdout, 80, argv[0],
"[-i input.confconf] [-o output.h]",
"confconf is a config file parser generator for C",
options);
@@ -45,6 +54,53 @@ void opt_parse(int argc, char **argv)
puts(VERSION);
exit(EXIT_SUCCESS);
}
+
+ /* check header */
+ if (options[4].was_seen) {
+ cend = options[4].val.v_string[0];
+
+ if (cend != '"' && cend != '<') {
+ fprintf(stderr, "%s: err: badly-formatted uthash header `%s`\n",
+ argv[0], options[4].val.v_string);
+ exit(EXIT_FAILURE);
+ }
+
+ if (cend == '<')
+ cend = '>';
+
+ for (i = 1, c = options[4].val.v_string[1];
+ c && c != cend && c != '\n';
+ c = options[4].val.v_string[++i]
+ );
+
+ if (c != cend
+ || options[4].val.v_string[i+1] != '\0'
+ || strlen(options[4].val.v_string) > TOK_MAX_LEN
+ || options[4].val.v_string[2] == '\0'
+ ) {
+ fprintf(stderr, "%s: err: badly-formatted uthash header `%s`\n",
+ argv[0], options[4].val.v_string);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ /* check suffix */
+ if (options[5].was_seen) {
+ if (options[5].val.v_string[i] == '\0') {
+ fprintf(stderr, "%s: err: badly-formatted name suffix ``\n",
+ argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ for (i = 0; options[5].val.v_string[i] != '\0'; i++) {
+ if (!isalnum(options[5].val.v_string[i]) ) {
+ fprintf(stderr, "%s: err: badly-formatted name suffix `%s`\n",
+ argv[0], options[5].val.v_string);
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+
}
const char* opt_infile_str(void)
@@ -60,3 +116,17 @@ const char* opt_outfile_str(void)
? options[3].val.v_string
: NULL);
}
+
+const char* opt_header_str(void)
+{
+ return (options[4].was_seen
+ ? options[4].val.v_string
+ : NULL);
+}
+
+const char* opt_suffix_str(void)
+{
+ return (options[5].was_seen
+ ? options[5].val.v_string
+ : NULL);
+}