aboutsummaryrefslogtreecommitdiffstats
path: root/src/argparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/argparser.c')
-rw-r--r--src/argparser.c96
1 files changed, 93 insertions, 3 deletions
diff --git a/src/argparser.c b/src/argparser.c
index 348e1f6..e1d8825 100644
--- a/src/argparser.c
+++ b/src/argparser.c
@@ -33,6 +33,46 @@ static void sort(char** list, long count);
static long cmp(char* a, char* b);
+
+/**
+ * Option structure
+ */
+typedef struct
+{
+ /**
+ * The type of the option, either of: `ARGUMENTLESS`, `ARGUMENTED`, `VARIADIC`
+ */
+ long type;
+
+ /**
+ * Alterative option names
+ */
+ char** alternatives;
+
+ /**
+ * Number of elements in `alternatives`
+ */
+ long alternatives_count;
+
+ /**
+ * Standard option name
+ */
+ char* standard;
+
+ /**
+ * Argument name, not for argumentless options
+ */
+ char* argument;
+
+ /**
+ * Help text, multi-line
+ */
+ char* help;
+
+} args_Option;
+
+
+
/**
* Whether the Linux VT is being used
*/
@@ -103,13 +143,25 @@ long args_files_count;
*/
void** args_freequeue;
-// Options, in order
-// ArrayList<Option> options = new ArrayList<Option>();
+/**
+ * Options, in order
+ */
+args_Option* args_options;
+
+/**
+ * Number of elements in `args_options`
+ */
+long args_options_count;
+
+/**
+ * Number of elements for which `args_options` is allocated
+ */
+long args_options_size;
// Option map
// HashMap<String, Option> optmap = new HashMap<String, Option>();
-// Parsed arguments, a map from option to arguments, null` if not used, add one `null` element per argumentless use.
+// Parsed arguments, a map from option to arguments, `null` if not used, add one `null` element per argumentless use.
// HashMap<String, String[]> opts = new HashMap<String, String[]>();
@@ -152,6 +204,9 @@ extern void args_init(char* description, char* usage, char* longdscription, char
args_message = null;
args_freequeue = null;
args_freeptr = 0;
+ args_options_count = 0;
+ args_options_size = 64;
+ args_options = (args_Option*)malloc(args_options_size * sizeof(args_Option));
}
@@ -166,10 +221,13 @@ extern void args_dispose()
free(args_message);
if (args_program_dispose)
free(args_program);
+ if (args_options != null)
+ free(args_options);
args_files = null;
args_message = null;
args_program_dispose = false;
+ args_options = null;
if (args_freequeue != null)
{
@@ -182,6 +240,38 @@ extern void args_dispose()
/**
+ * Adds an option
+ *
+ * @param option The option
+ * @param help Help text, multi-line, `null` if hidden
+ */
+extern void args_add_option(args_Option* option, char* help)
+{
+ if (args_options_count == args_options_size)
+ {
+ long i = args_options_size << 1;
+ args_Option* new = (args_Option*)malloc(i * sizeof(args_Option));
+ for (i = 0; i < args_options_size; i++)
+ {
+ *(new + i) = *(args_options + i)
+ }
+ args_options_size <<= 1;
+ free(args_options);
+ args_options = new;
+ }
+
+ {
+ long i = 0, n = option->alternatives_count;
+ for (i; i < n; i++)
+ args_optmap_put(*(option->alternatives + i), args_options_count);
+ args_opts_put(option->standard, null);
+ *(args_options + args_options_count) = *option;
+ (*(args_options + args_options_count++)).help = help;
+ }
+}
+
+
+/**
* Gets the name of the parent process
*
* @param levels The number of parents to walk, 0 for self, and 1 for direct parent