/* * Compilar com: gcc -Wall hdoc.c messages.c -o hdoc */ #include #include #include #include #include "messages.h" typedef enum { OPT_ERROR = -1, OPT_NAME, OPT_OVERWRITE, OPT_APPEND, OPT_HELP } Option; int parse_arg(char *arg); int main(int argc, char **argv) { char *file = NULL; char *mode = NULL; if (argc == 2) { switch (parse_arg(argv[1])) { case OPT_HELP: return print_usage(EXIT_SUCCESS, argv[0]); case OPT_NAME: if (access(argv[1], F_OK) == 0) { return print_error_usage(MSG_FILE_EXISTS, argv[0]); } file = argv[1]; mode = "w"; break; default: return print_error_usage(MSG_INVALID_ARG, argv[0]); } } else if (argc == 3) { for (int i = 1; argv[i] != NULL; i++) { switch (parse_arg(argv[i])) { case OPT_NAME: if (file == NULL) file = argv[i]; break; case OPT_OVERWRITE: if (mode == NULL) mode = "w"; break; case OPT_APPEND: if (mode == NULL) mode = "a"; break; case OPT_HELP: return print_usage(EXIT_SUCCESS, argv[0]); case OPT_ERROR: print_error_fmt(MSG_INVALID_FMT, argv[i]); return print_usage(EXIT_FAILURE, argv[0]); } } if (file == NULL || mode == NULL) { return print_error_usage(MSG_INCORRECT_ALL, argv[0]); } } else { return print_error_usage(MSG_ARGC_ERROR, argv[0]); } FILE *fstr = fopen(file, mode); if (!fstr) { perror(MSG_FOPEN_ERROR); return EXIT_FAILURE; } char line[BUFSIZ]; puts(MSG_EOF_HINT); while (1) { if (fgets(line, BUFSIZ, stdin) == NULL) break; fprintf(fstr, "%s", line); } fclose(fstr); return EXIT_SUCCESS; } int parse_arg(char *arg) { // Argumento iniciado com '-'... if (arg[0] == '-') { if (strcmp(arg, "-a") == 0) { return OPT_APPEND; } else if (strcmp(arg, "-o") == 0) { return OPT_OVERWRITE; } else if (strcmp(arg, "-h") == 0) { return OPT_HELP; } else { // Argumento inválido! return OPT_ERROR; } } // Sem traço é nome de arquivo... return OPT_NAME; }