#include #include #include #include "messages.h" // Mensagens de uso e ajuda const char *MSG_USAGE = "Here Document (hdoc) 0.1\n\n" "Uso: %s [OPÇÕES] ARQUIVO\n\n" "Sem OPÇÕES, cria um novo ARQUIVO para receber linhas\n" "digitadas no terminal.\n\n" "OPÇÕES:\n" " -o Força abertura de ARQUIVO para sobrescrevê-lo.\n" " -a Força abertura de ARQUIVO para append.\n" " -h Exibe esta ajuda.\n\n"; const char *MSG_EOF_HINT = "Tecle Ctrl+D para terminar..."; const char *MSG_PROMPT = "> "; // Mensagens de erro const char *MSG_ARGC_ERROR = "Número incorreto de argumentos!\n\n"; const char *MSG_FILE_EXISTS = "Arquivo já existe!\n\n"; const char *MSG_INVALID_ARG = "Argumento inválido!\n\n"; const char *MSG_INVALID_FMT = "Argumento inválido (%s)!\n\n"; const char *MSG_INCORRECT_ALL = "Argumentos incorretos!\n\n"; const char *MSG_FOPEN_ERROR = "Erro na abertura do arquivo!\n\n"; // Estilo ANSI: negrito + amarelo #define STYLE_ERROR "\033[1;33m" #define STYLE_RESET "\033[0m" // Retorna sucesso se stderr estiver ligada ao terminal. int is_tty_stderr() { return isatty(fileno(stderr)); } // Imprime mensagens de erro sem argumentos. void print_error(const char *msg) { if (is_tty_stderr()) fprintf(stderr, STYLE_ERROR "%s" STYLE_RESET, msg); else fprintf(stderr, "%s", msg); } // Imprime mensagens de erro com argumentos. void print_error_fmt(const char *fmt, const char *arg) { if (is_tty_stderr()) { fprintf(stderr, "%s", STYLE_ERROR); fprintf(stderr, fmt, arg); fprintf(stderr, "%s", STYLE_RESET); } else { fprintf(stderr, fmt, arg); } } // Imprime versão e ajuda e retorna status. int print_usage(int status, char *prog_name) { FILE *stream = stderr; if (status == EXIT_SUCCESS) stream = stdout; fprintf(stream, MSG_USAGE, prog_name); return status; }