69 lines
2 KiB
C
69 lines
2 KiB
C
/*
|
|
* Compilar com: gcc -Wall hdoc.c messages.c args-parser.c -o hdoc
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#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;
|
|
}
|