Skip to content

Commit f8b65f4

Browse files
committed
Add flag_add_alias macro
Similar to `flag_name` (and might also break if `*_var` style functions are introduced)
1 parent ddf7e7f commit f8b65f4

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

example.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ void usage(FILE *stream)
1313

1414
int main(int argc, char **argv)
1515
{
16-
bool *help = flag_bool_aliases("-help", false, "Print this help to stdout and exit with 0", "h");
17-
char **line = flag_str_aliases("-line", "Hi!", "Line to output to the file", "l");
18-
size_t *count = flag_size_aliases("-count", 64, "Amount of lines to generate", "c");
16+
bool *help = flag_bool("-help", false, "Print this help to stdout and exit with 0");
17+
char **line = flag_str("-line", "Hi!", "Line to output to the file");
18+
size_t *count = flag_size("-count", 64, "Amount of lines to generate");
19+
20+
flag_add_alias(help, "h");
21+
flag_add_alias(line, "l");
22+
flag_add_alias(count, "c");
1923

2024
if (!flag_parse(argc, argv)) {
2125
usage(stderr);

flag.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
// WARNING! *_var functions may break the flag_name() functionality
2626

2727
char *flag_name(void *val);
28+
void flag_add_alias(void *val, const char *alias);
2829
bool *flag_bool_null(const char *name, bool def, const char *desc, ...);
2930
#define flag_bool(name, def, desc) flag_bool_null(name, def, desc, NULL)
3031
#define flag_bool_aliases(name, def, desc, ...) \
@@ -86,7 +87,7 @@ typedef enum {
8687
typedef struct {
8788
Flag_Type type;
8889
char *name;
89-
char *aliases[ALIAS_CAP];
90+
const char *aliases[ALIAS_CAP];
9091
size_t alias_count;
9192
char *desc;
9293
Flag_Value val;
@@ -121,10 +122,11 @@ Flag *flag_new(Flag_Type type, const char *name, const char *desc, va_list alias
121122
// NOTE: I won't touch them I promise Kappa
122123
flag->name = (char*) name;
123124
flag->desc = (char*) desc;
124-
char *alias = va_arg(aliases, char *);
125+
const char *alias = va_arg(aliases, const char *);
125126
while (alias != NULL) {
127+
assert(flag->alias_count <= ALIAS_CAP);
126128
flag->aliases[flag->alias_count++] = alias;
127-
alias = va_arg(aliases, char *);
129+
alias = va_arg(aliases, const char *);
128130
}
129131
return flag;
130132
}
@@ -135,6 +137,13 @@ char *flag_name(void *val)
135137
return flag->name;
136138
}
137139

140+
void flag_add_alias(void *val, const char *alias)
141+
{
142+
Flag *flag = (Flag*) ((char*) val - offsetof(Flag, val));
143+
assert(flag->alias_count + 1 <= ALIAS_CAP);
144+
flag->aliases[flag->alias_count++] = alias;
145+
}
146+
138147
bool *flag_bool_null(const char *name, bool def, const char *desc, ...)
139148
{
140149
va_list aliases;

0 commit comments

Comments
 (0)