commit 5e2b01dc5299a3609e7b8a748611df73dad2cc60 Author: gauvain-thomas Date: Sun Feb 18 14:53:10 2024 +0100 First try diff --git a/pkmn.c b/pkmn.c new file mode 100644 index 0000000..372421f --- /dev/null +++ b/pkmn.c @@ -0,0 +1,132 @@ +#include +#include + +const char *argp_program_version = + "pkmn 1.0"; +const char *argp_program_bug_address = + ""; + +/* Program documentation. */ +static char doc[] = + "Argp example #3 -- a program with options and arguments using argp"; + +/* A description of the arguments we accept. */ +static char args_doc[] = "pokemon_name"; + +/* The options we understand. */ +static struct argp_option options[] = { + {"random", 'r', 0, 0, "Use a random pokemon"}, + {"shiney", 'S', 0, 0, "Use a shiney pokemon"}, + {"verbose", 'v', 0, 0, "Produce verbose output" }, + {"quiet", 'q', 0, 0, "Don't produce any output" }, + {"silent", 's', 0, OPTION_ALIAS }, + { 0 } +}; + +/* Used by main to communicate with parse_opt. */ +struct arguments +{ + char *args[1]; /* arg*/ + int silent, verbose; + int random, shiney; /* random and shiney flags */ +}; + +/* Parse a single option. */ +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + /* Get the input argument from argp_parse, which we + know is a pointer to our arguments structure. */ + struct arguments *arguments = state->input; + + switch (key) + { + case 'q': case 's': + arguments->silent = 1; + break; + case 'v': + arguments->verbose = 1; + break; + case 'r': + printf("Random pokemon\n"); + arguments->random = 1; + break; + case 'S': + printf("Shiney pokemon\n"); + arguments->shiney = 1; + break; + + case ARGP_KEY_ARG: + if (state->arg_num >= 1) + /* Too many arguments. */ + argp_usage (state); + + arguments->args[state->arg_num] = arg; + + break; + + case ARGP_KEY_END: + if (state->arg_num < 0) + /* Not enough arguments. */ + argp_usage (state); + break; + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +/* Our argp parser. */ +static struct argp argp = { options, parse_opt, args_doc, doc }; + +int main (int argc, char **argv) { + struct arguments arguments; + char pkmn_path[] = "~/pokemons/"; + + /* Default values. */ + arguments.silent = 0; + arguments.verbose = 0; + arguments.random = 0; + arguments.shiney = 0; + + /* Parse our arguments; every option seen by parse_opt will + be reflected in arguments. */ + argp_parse (&argp, argc, argv, 0, 0, &arguments); + + if (arguments.verbose) { + printf("ARG1 = %s\n", arguments.args[0]); + printf("VERBOSE = %s\n", arguments.verbose ? "yes" : "no"); + printf("SILENT = %s\n", arguments.silent ? "yes" : "no"); + printf("RANDOM = %s\n", arguments.random ? "yes" : "no"); + printf("SHINEY = %s\n", arguments.shiney ? "yes" : "no"); + } + + // If random flag is set, roll a random pokemon + // Pokemons are located in ~/pokemons/ + char pokemon[512]; + if (arguments.random) { + system("ls ~/pokemons/yes | shuf -n 1 > /tmp/pkmn"); + FILE *f = fopen("/tmp/pkmn", "r"); + fscanf(f, "%s", pokemon); + fclose(f); + printf("Random pokemon: %s\n", pokemon); + } + + // Then we can use the pokemon name to display it + // echo "$pokemon_name!" | cowsay -f "$cow_file" -W 70 + char command[512]; + if (arguments.random) { + sprintf(command, "echo \"%s!\" | cowsay -f ~/pokemons/yes/%s -W 70", pokemon, pokemon); + } else { + sprintf(command, "echo \"%s!\" | cowsay -f %s -W 70", arguments.args[0], "pikachu"); + } + + printf("Command: %s\n", command); + + if (!arguments.silent) { + system(command); + } + + exit(0); +} \ No newline at end of file