-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathargs.h
87 lines (74 loc) · 2.57 KB
/
args.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* Written by Richard David Cook
at Lawrence Livermore National Laboratory
Contact: [email protected]
See license.txt for information about usage.
Spoiler alert: it's GNU opensource.
*/
/* utilities for args parsing */
#ifndef args_h
#define args_h
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _NEVER
} // to make emacs happy
#endif
#include <stdlib.h>
/*
example how to use (typical usage):
long useX=0, verbosity=0;
double cruftLevel=0.5;
char inputfile[1024] = "defaultvalue";
double location[3] = {0};
char **unparsed_args = NULL;
argt args[5] = {
{BOOL_TYPE, "-useX", 1, &useX},
{LONG_TYPE, "-verbosity", 1, &verbosity},
{DOUBLE_TYPE, "-cruftiness", 1, &cruftLevel},
{FLOAT_TYPE, "-loc", 3, location}, <------- note no ampersand (reference)
{STRING_TYPE, "-in", 1024, inputfile} <------- note no ampersand (reference)
}
arg_expect_args(args, 5);
arg_ignore_bad_args(1); <---- you probably want this on
arg_parse_args(-1, argv, 1, &unparsed_args); <-----typical usage: parse all args starting from argv[1]
--- OR: ----
arg_parse_args(-1, argv, 1, NULL); <-----if you don't care about unparsed args
*/
typedef long args_bool_t;
typedef int args_int_t;
typedef long args_long_t;
typedef double args_double_t;
typedef char *args_string_t;
typedef enum {
BOOL_TYPE, /* must be type long**/
INT_TYPE, /*must be type int* */
LONG_TYPE, /* must be type long* */
LONG_ARRAY_TYPE, /* DEPRECATED -- same as LONG_TYPE must be type long* */
FLOAT_TYPE, /* must be type float* */
FLOAT_ARRAY_TYPE, /* DEPRECATED -- same as FLOAT_TYPE must be type float* */
DOUBLE_TYPE, /* must be type double* */
DOUBLE_ARRAY_TYPE, /* DEPRECATED -- same as DOUBLE_TYPE must be type double* */
STRING_TYPE /* must be type (char *) */
} argtype;
typedef struct argt {
argtype _type;
char _flag[64];
int _numvals; /* for arrays of values */
void *_values; /* see enum for actual type */
} argt;
void debug_args(int iYesNo ); /* debugging unexpected behaviors parse_args */
void print_args(int argc, char *argv[] );
void arg_expect_args(argt args[], int numargs);
void arg_ignore_bad_args(int iYesNo);
/*!
arg_parse_args
return 0 on error, 1 if everything's OK.
parse argv, looking for flags set using arg_expect_args, starting at argv[1].
Continue until no more valid args are found.
Removes all parsed args and options from argv and decrements numargs approprately. Bad args are ignored, unless gIgnoreBadArgs is false;
*/
int arg_parse_args(int *argc, char *argv[]);
#ifdef __cplusplus
}
#endif
#endif