hdoc/src/hdoc.c

98 lines
2.5 KiB
C
Raw Normal View History

2025-06-19 12:29:07 -03:00
/*
* Compilar com: gcc -Wall hdoc.c messages.c -o hdoc
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "messages.h"
typedef enum {
OPT_ERROR = -1,
OPT_NAME,
OPT_OVERWRITE,
OPT_APPEND,
OPT_HELP
} Option;
2025-06-20 09:04:24 -03:00
int parse_arg(char *arg);
2025-06-19 12:29:07 -03:00
int main(int argc, char **argv) {
char *file = NULL;
char *mode = NULL;
2025-06-20 09:16:56 -03:00
if (argc == 2) {
2025-06-19 12:29:07 -03:00
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) {
2025-06-20 09:04:24 -03:00
return print_error_usage(MSG_FILE_EXISTS, argv[0]);
2025-06-19 12:29:07 -03:00
}
file = argv[1];
mode = "w";
break;
default:
2025-06-20 09:04:24 -03:00
return print_error_usage(MSG_INVALID_ARG, argv[0]);
2025-06-19 12:29:07 -03:00
}
2025-06-20 09:16:56 -03:00
} else if (argc == 3) {
2025-06-19 12:29:07 -03:00
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) {
2025-06-20 09:04:24 -03:00
return print_error_usage(MSG_INCORRECT_ALL, argv[0]);
2025-06-19 12:29:07 -03:00
}
2025-06-20 09:16:56 -03:00
} else {
return print_error_usage(MSG_ARGC_ERROR, argv[0]);
2025-06-19 12:29:07 -03:00
}
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;
}