Cthulhu  0.2.10
Cthulhu compiler collection
main.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-3.0-only
2 
3 #include "config/config.h"
4 
5 #include "setup/memory.h"
6 #include "setup/setup.h"
7 
8 static const version_info_t kToolVersion = {
9  .license = "GPLv3",
10  .desc = "Display format testing tool",
11  .author = "Elliot Haisley",
12  .version = CT_NEW_VERSION(0, 0, 1),
13 };
14 
15 typedef struct tool_t
16 {
18 
21 
23 } tool_t;
24 
25 static const cfg_info_t kToolInfo = {
26  .name = "display",
27  .brief = "Display format testing tool"
28 };
29 
31 {
35 };
36 
37 static const cfg_choice_t kArgChoices[] = {
38  {"one", eOptionOne},
39  {"two", eOptionTwo},
40  {"three", eOptionThree},
41 };
42 
43 static const cfg_arg_t kEnumInfoArgs[] = {CT_ARG_SHORT("e"), CT_ARG_LONG("enum")};
44 
45 static const cfg_info_t kEnumInfo = {
46  .name = "enum",
47  .brief = "An enum argument",
48  .args = CT_ARGS(kEnumInfoArgs)
49 };
50 
52 {
53  eFlagOne = (1 << 0),
54  eFlagTwo = (1 << 1),
55  eFlagThree = (1 << 2),
56 };
57 
58 static const cfg_choice_t kFlagChoices[] = {
59  {"one", eFlagOne},
60  {"two", eFlagTwo},
61  {"three", eFlagThree},
62 };
63 
64 static const cfg_arg_t kFlagInfoArgs[] = {CT_ARG_SHORT("f"), CT_ARG_LONG("flag")};
65 
66 static const cfg_info_t kFlagInfo = {
67  .name = "flag",
68  .brief = "A flag argument",
69  .args = CT_ARGS(kFlagInfoArgs)
70 };
71 
72 static tool_t make_config(arena_t *arena)
73 {
74  cfg_group_t *config = config_root(&kToolInfo, arena);
75 
76  setup_options_t options = setup_options(kToolVersion, config);
77 
78  cfg_enum_t enum_init = {
79  .options = kArgChoices,
80  .count = (sizeof(kArgChoices) / sizeof(cfg_choice_t)),
81  .initial = eOptionOne
82  };
83  cfg_field_t *enum_argument = config_enum(config, &kEnumInfo, enum_init);
84 
85  cfg_enum_t flag_init = {
86  .options = kFlagChoices,
87  .count = (sizeof(kFlagChoices) / sizeof(cfg_choice_t)),
88  .initial = eFlagOne
89  };
90  cfg_field_t *flag_argument = config_flags(config, &kFlagInfo, flag_init);
91 
92  tool_t tool = {
93  .m_config = config,
94  .enum_argument = enum_argument,
95  .flag_argument = flag_argument,
96 
97  .options = options,
98  };
99 
100  return tool;
101 }
102 
103 int main(int argc, const char **argv)
104 {
105  setup_default(NULL);
106  arena_t *arena = ctu_default_alloc();
107 
108  tool_t tool = make_config(arena);
109 
110  setup_init_t init = setup_parse(argc, argv, tool.options);
111  if (setup_should_exit(&init))
112  return setup_exit_code(&init);
113 }
int main(int argc, const char **argv)
Definition: main.c:168
CT_CONFIG_API cfg_field_t * config_enum(cfg_group_t *group, const cfg_info_t *info, cfg_enum_t cfg)
add a new choice field to a configuration group
Definition: config.c:162
CT_CONFIG_API cfg_field_t * config_flags(cfg_group_t *group, const cfg_info_t *info, cfg_enum_t cfg)
add a new flags field to a configuration group
Definition: config.c:175
#define CT_ARGS(it)
Definition: config.h:57
#define CT_ARG_LONG(name)
Definition: config.h:55
CT_CONFIG_API cfg_group_t * config_root(const cfg_info_t *info, arena_t *arena)
create a new configuration group
Definition: config.c:97
#define CT_ARG_SHORT(name)
Definition: config.h:54
#define CT_NEW_VERSION(major, minor, patch)
creates a new ctu_version_t from major, minor and patch
Definition: version_def.h:20
CT_SETUP_API setup_init_t setup_parse(int argc, const char **argv, setup_options_t setup)
parse the command line
Definition: setup.c:366
CT_PUREFN CT_SETUP_API bool setup_should_exit(const setup_init_t *init)
accessor functions
Definition: setup.c:434
CT_SETUP_API void setup_default(arena_t *arena)
initialise the runtime with default options
Definition: setup.c:188
CT_BEGIN_API CT_SETUP_API arena_t * ctu_default_alloc(void)
get the default allocator
Definition: memory.c:43
CT_SETUP_API setup_options_t setup_options(version_info_t info, cfg_group_t *root)
setup default options
Definition: setup.c:215
CT_PUREFN CT_SETUP_API int setup_exit_code(const setup_init_t *init)
get the exit code
Definition: setup.c:442
an allocator object
Definition: arena.h:86
a choice in a set of options
Definition: config.h:97
a choice from a set of options
Definition: config.h:107
information about a configuration field
Definition: config.h:69
STA_FIELD_STRING const char * name
the name of this field
Definition: config.h:71
the result of parsing the command line
Definition: setup.h:69
default options shared by all tools
Definition: setup.h:31
Definition: cmd.h:14
cfg_field_t * flag_argument
Definition: main.c:20
setup_options_t options
Definition: cmd.h:31
cfg_group_t * m_config
Definition: main.c:17
cfg_field_t * enum_argument
Definition: main.c:19
version information for a driver/interface/plugin
Definition: version_def.h:48
const char * license
the license of this component
Definition: version_def.h:49
arg_option_t
Definition: main.c:31
@ eOptionOne
Definition: main.c:32
@ eOptionThree
Definition: main.c:34
@ eOptionTwo
Definition: main.c:33
flag_option_t
Definition: main.c:52
@ eFlagOne
Definition: main.c:53
@ eFlagThree
Definition: main.c:55
@ eFlagTwo
Definition: main.c:54