/* * Compilar com: gcc -Wall hdoc.c messages.c args-parser.c -o hdoc */ #include #include #include #include "messages.h" #include "args-parser.h" 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; }