Simple CLI
Basic file processor demonstrating core Argus features.
Complete Example​
simple_cli.c
#include <argus.h>
#include <stdio.h>
ARGUS_OPTIONS(
options,
HELP_OPTION(),
VERSION_OPTION(),
OPTION_FLAG('v', "verbose", HELP("Enable verbose output")),
OPTION_STRING('o', "output", HELP("Output file"), DEFAULT("result.txt")),
OPTION_INT('c', "count", HELP("Processing iterations"),
VALIDATOR(V_RANGE(1, 100)), DEFAULT(1)),
OPTION_STRING('f', "format", HELP("Output format"),
VALIDATOR(V_CHOICE_STR("text", "json", "xml")), DEFAULT("text")),
POSITIONAL_STRING("input", HELP("Input file to process")),
)
int main(int argc, char **argv)
{
argus_t argus = argus_init(options, "simple_cli", "1.0.0");
argus.description = "A simple file processing example";
if (argus_parse(&argus, argc, argv) != ARGUS_SUCCESS)
return 1;
// Access parsed values
const char *input = argus_get(&argus, "input").as_string;
const char *output = argus_get(&argus, "output").as_string;
const char *format = argus_get(&argus, "format").as_string;
int count = argus_get(&argus, "count").as_int;
bool verbose = argus_get(&argus, "verbose").as_bool;
if (verbose) {
printf("Processing %s -> %s (%s format, %d iterations)\n",
input, output, format, count);
}
// Simulate processing
FILE *in = fopen(input, "r");
if (!in) {
fprintf(stderr, "Error: Cannot open '%s'\n", input);
return 1;
}
FILE *out = fopen(output, "w");
if (!out) {
fprintf(stderr, "Error: Cannot create '%s'\n", output);
fclose(in);
return 1;
}
// Process based on format
for (int i = 0; i < count; i++) {
rewind(in);
if (strcmp(format, "json") == 0) {
fprintf(out, "{\"iteration\":%d,\"content\":\"", i + 1);
int c;
while ((c = fgetc(in)) != EOF) {
if (c == '"') fprintf(out, "\\\"");
else if (c == '\n') fprintf(out, "\\n");
else fputc(c, out);
}
fprintf(out, "\"}\n");
} else if (strcmp(format, "xml") == 0) {
fprintf(out, "<iteration num=\"%d\">", i + 1);
int c;
while ((c = fgetc(in)) != EOF) {
if (c == '<') fprintf(out, "<");
else if (c == '>') fprintf(out, ">");
else fputc(c, out);
}
fprintf(out, "</iteration>\n");
} else {
fprintf(out, "=== Iteration %d ===\n", i + 1);
int c;
while ((c = fgetc(in)) != EOF) {
fputc(c, out);
}
fprintf(out, "\n");
}
}
fclose(in);
fclose(out);
printf("Processing complete: %s\n", output);
argus_free(&argus);
return 0;
}
Usage​
# Build
gcc simple_cli.c -o simple_cli -largus
# Basic usage
echo "Hello World" > input.txt
./simple_cli input.txt
# With options
./simple_cli --verbose --format json --count 3 input.txt
# Help
./simple_cli --help
Generated Help​
simple_cli v1.0.0
A simple file processing example
Usage: simple_cli [OPTIONS] <input>
Arguments:
<input> - Input file to process
Options:
-h, --help - Display this help message (exit)
-V, --version - Display version information (exit)
-v, --verbose - Enable verbose output
-o, --output <STR> - Output file (default: "result.txt")
-c, --count <1-100> - Processing iterations (default: 1)
-f, --format <text|json|xml>
- Output format (default: "text")
Key Features​
- Flag:
--verbose
(boolean toggle) - String with default:
--output
- Integer with validation:
--count
(range 1-100) - Choice validation:
--format
(text/json/xml only) - Required positional: input file
- Auto-generated help: from option definitions
Error Examples​
$ ./simple_cli --count 150 input.txt
simple_cli: Value 150 is out of range [1, 100]
$ ./simple_cli --format pdf input.txt
simple_cli: The 'format' option cannot be set to 'pdf'. Choose from ["text", "json", "xml"]
$ ./simple_cli
simple_cli: Required positional argument missing: 'input'