|
|
Here is the final program, with some extra functions for modularity:
#include <Args.h>
#include <string.h>
#include <osfcn.h>
int compile_only = 0;
int optimize = 0;
int allow_anachronisms = 1;
int profiling = 0;
const char* output_filename = "a.out";
int dryrun = 0;
extern void add_define(const char*, const char*);
extern void add_includedir(const char*);
extern void align(const char*);
extern void compile(const char*);
static void
getdefines(const Opt* opt) {
Suboptsiter si(*opt);
const Subopt* subopt;
while (si.next(subopt))
add_define(subopt->name(), subopt->value());
}
static void
process_letter_option(const Opt* opt) {
switch (opt->chr()) {
case 'I':
add_includedir(opt->value());
break;
case 'D':
getdefines(opt);
break;
case 'c':
compile_only = 1;
break;
case 'O':
optimize = 1;
break;
case 'o':
output_filename = opt->value();
break;
case 'p':
if (opt->flag() == '+')
allow_anachronisms = 0;
else
profiling = 1;
break;
}
}
static void
process_option(const Opt* opt) {
const char* key = opt->keyword();
if (key != 0) {
if (strcmp(key, "align") == 0)
align(opt->value());
else
dryrun = 1;
}
else
process_letter_option(opt);
}
static void
process_nonoption_args(const Args& args) {
Argsiter ai(args);
const char* filename;
while (ai.next(filename))
compile(filename);
}
const char* keywords[] = {
"dryrun",
"align:",
0
};
main(int argc, const char*const* argv) {
Args args(argc, argv, "co:OI:D;p",
Args::intermix | Args::plusoptions,
keywords);
if (args.error())
exit(1);
Optsiter oi(args);
const Opt* opt;
while (oi.next(opt))
process_option(opt);
process_nonoption_args(args);
}