#ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #include #include #include #include const int EXIT_ERROR = 1; const int EXIT_USAGE = 2; int usage(FILE *stream) { const char *const msg = "Usage: remembering -p PROFILE -c COMMAND\n"; if (fprintf(stream, msg) < 0) { perror("usage()"); return -1; } return 0; } static int help(FILE *stream) { const char *const msg = "Options:\n" " -p, PROFILE profile to be used for gathering and storing data\n" " -c, COMMAND commant to be run, reading from STDIN, writing to STDOUT\n" " -h, --help show this help\n" " -V, --version print the version number\n" "\nSee \"man remembering\" for more information\n"; if (fprintf(stream, msg) < 0) { perror("help()"); return -1; } return 0; } static int version(FILE *stream) { const char *const msg = "remembering-" VERSION " " DATE "\n"; if (fprintf(stream, msg) < 0) { perror("version()"); return -1; } return 0; } static int missing(FILE *stream, const char *const argument) { const char *const msg = "Missing option: %s\n"; if (fprintf(stream, msg, argument) < 0) { perror("missing()"); return -1; } return 0; } int main(int argc, char *argv[]) { #ifdef TEST return EXIT_SUCCESS; #endif for (int i = 0; i < argc; i++) { if (strcmp("--", argv[i]) == 0) { break; } else if (strcmp("--help", argv[i]) == 0) { if (usage(stdout)) return EXIT_ERROR; if (help(stdout)) return EXIT_ERROR; return EXIT_SUCCESS; } else if (strcmp("--version", argv[i]) == 0) { if (version(stdout)) return EXIT_ERROR; return EXIT_SUCCESS; } } int option; const char *profile = NULL; const char *command = NULL; while ((option = getopt(argc, argv, "p:c:hV")) != -1) { switch (option) { case 'p': profile = optarg; break; case 'c': command = optarg; break; case 'h': if (usage(stdout)) return EXIT_ERROR; if (help(stdout)) return EXIT_ERROR; return EXIT_SUCCESS; case 'V': if (version(stdout)) return EXIT_ERROR; return EXIT_SUCCESS; default: if (usage(stderr)) return EXIT_ERROR; return EXIT_USAGE; } } if (!profile) { if (missing(stderr, "-p PROFILE")) return EXIT_ERROR; if (usage(stderr)) return EXIT_ERROR; return EXIT_USAGE; } if (!command) { if (missing(stderr, "-c COMMAND")) return EXIT_ERROR; if (usage(stderr)) return EXIT_ERROR; return EXIT_USAGE; } return 0; }