commit 4c0fb05f7b569b0dbbfe31a6fb2553c39e76b888
parent 3ce365133219e9025c90596656edf33f37289563
Author: nibo <nibo@relim.de>
Date: Tue, 25 Mar 2025 17:03:40 +0100
Improve log message
Diffstat:
| M | src/out_pdf.c | | | 11 | ++++++----- |
| D | src/util.c | | | 642 | ------------------------------------------------------------------------------- |
| D | src/util.h | | | 64 | ---------------------------------------------------------------- |
3 files changed, 6 insertions(+), 711 deletions(-)
diff --git a/src/out_pdf.c b/src/out_pdf.c
@@ -503,8 +503,7 @@ static char *
pdf_filepath_create(struct ChoSong **songs, const char *cho_filepath, const char *out)
{
char *pdf_filepath = NULL;
- char *pdf_filename;
- char *tmp;
+ char *pdf_filename, *tmp;
enum FileType type;
if (cho_filepath) {
pdf_filepath = file_extension_replace_or_add(cho_filepath, "pdf");
@@ -521,14 +520,16 @@ pdf_filepath_create(struct ChoSong **songs, const char *cho_filepath, const char
switch (type) {
case F_ERROR:
tmp = filepath_dirname(out);
- if (file_type(tmp) == F_FOLDER) {
+ type = file_type(tmp);
+ switch (type) {
+ case F_FOLDER:
free(pdf_filepath);
free(pdf_filename);
free(tmp);
return strdup(out);
- } else {
+ default:
free(tmp);
- util_log(NULL, 0, LOG_ERR, "Invalid argument --output/-o value.");
+ util_log(NULL, 0, LOG_ERR, "The -o/--output value '%s' is not an existing folder.", out);
return NULL;
}
break;
diff --git a/src/util.c b/src/util.c
@@ -1,642 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <assert.h>
-#include <limits.h>
-#include "core.h"
-#include "util.h"
-
-static bool g_show_info_logs = false;
-
-void
-util_log_enable_info_logs(void)
-{
- g_show_info_logs = true;
-}
-
-void *
-emalloc(size_t size)
-{
- void *ptr = malloc(size);
- if (!ptr) {
- perror("malloc failed");
- exit(1);
- }
- return ptr;
-}
-
-void *
-erealloc(void *ptr, size_t size)
-{
- void *tmp = realloc(ptr, size);
- if (!tmp) {
- perror("realloc failed");
- exit(1);
- }
- return tmp;
-}
-
-static void
-log_without_color(
- const char *file,
- size_t line_no,
- enum LogLevel level,
- const char *msg,
- va_list va
-)
-{
- if (file) {
- fprintf(stderr, "%s", file);
- }
- if (line_no > 0) {
- fprintf(stderr, ":%ld", line_no);
- }
- const char *log_level = "";
- switch (level) {
- case LOG_INFO:
- log_level = "INFO";
- break;
- case LOG_WARN:
- log_level = "WARN";
- break;
- case LOG_ERR:
- log_level = " ERR";
- break;
- case LOG_TODO:
- log_level = "TODO";
- break;
- }
- fprintf(stderr, "%s: ", log_level);
- // va_list va;
- // va_start(va, msg);
- vfprintf(stderr, msg, va);
- fprintf(stderr, "\n");
-}
-
-#if COLOR == 1
-static void
-log_with_color(
- const char *file,
- size_t line_no,
- enum LogLevel level,
- const char *msg,
- va_list va
-)
-{
- if (file) {
- fprintf(stderr, "\033[1m%s\033[0m", file);
- if (line_no > 0) {
- fprintf(stderr, "\033[1;:%ld\033[0m", line_no);
- }
- }
- const char *log_level = "";
- const char *color = "";
- switch (level) {
- case LOG_INFO:
- log_level = "INFO";
- color = "37";
- break;
- case LOG_WARN:
- log_level = "WARN";
- color = "33";
- break;
- case LOG_ERR:
- log_level = " ERR";
- color = "31";
- break;
- case LOG_TODO:
- log_level = "TODO";
- color = "34";
- break;
- }
- fprintf(stderr, " \033[1;%sm%s\033[0m: ", color, log_level);
- vfprintf(stderr, msg, va);
- fprintf(stderr, "\n");
-}
-#endif
-
-void
-util_vlog(
- const char *file,
- size_t line_no,
- enum LogLevel level,
- const char *msg,
- va_list va
-)
-{
- if (level == LOG_INFO && !g_show_info_logs) {
- return;
- }
-#if COLOR == 1
- if (isatty(2)) {
- log_with_color(file, line_no, level, msg, va);
- } else {
- log_without_color(file, line_no, level, msg, va);
- }
-#else
- log_without_color(file, line_no, level, msg, va);
-#endif
-}
-
-void
-util_log(
- const char *file,
- size_t line_no,
- enum LogLevel level,
- const char *msg,
- ...
-)
-{
- va_list va;
- va_start(va, msg);
- util_vlog(file, line_no, level, msg, va);
-}
-
-bool
-str_starts_with(const char *str, const char *part)
-{
- unsigned int i;
- size_t part_len = strlen(part);
- if (part_len > strlen(str))
- return false;
- for (i=0; i<part_len; i++) {
- if (str[i] != part[i])
- return false;
- }
- return true;
-}
-
-char *
-str_normalize(const char *str)
-{
- char *normalized = NULL;
- char c;
- int n = 0;
- int i;
- for (i = 0; str[i]; i++) {
- if (str[i] == ' ' || str[i] == '/' || str[i] == '.') {
- normalized = erealloc(normalized, (n+1) * sizeof(char));
- normalized[n] = '-';
- n++;
- continue;
- }
- if (str[i] == '\'' || str[i] == ',')
- continue;
- c = (char)tolower(str[i]);
- normalized = erealloc(normalized, (n+1) * sizeof(char));
- normalized[n] = c;
- n++;
- }
- normalized = erealloc(normalized, (n+1) * sizeof(char));
- normalized[n] = 0;
- return normalized;
-}
-
-char *
-str_trim(const char *str)
-{
- char *trimmed = NULL;
- int begin = 0;
- int end = 0;
- int len = (int)strlen(str);
- for (int i=0; i<len; i++) {
- if (
- str[i] == ' ' ||
- str[i] == '\n' ||
- str[i] == '\t' ||
- str[i] == '\r'
- )
- begin++;
- else
- break;
- }
- for (int i=len-1; i>=0; i--) {
- if (
- str[i] == ' '||
- str[i] == '\n' ||
- str[i] == '\t' ||
- str[i] == '\r'
- )
- end++;
- else
- break;
- }
- int k = 0;
- for (int i=0; i<len; i++) {
- if (i >= begin && i < len - end) {
- trimmed = erealloc(trimmed, (k+1) * sizeof(char));
- trimmed[k] = str[i];
- k++;
- }
- }
- trimmed = erealloc(trimmed, (k+1) * sizeof(char));
- trimmed[k] = 0;
- return trimmed;
-}
-
-char *
-str_remove_leading_whitespace(const char *str)
-{
- int i = 0;
- while (str[i] == ' ' || str[i] == '\t') {
- i++;
- }
- return strdup(&str[i]);
-}
-
-int
-str_compare(const char *a, const char *b)
-{
- if (a && b) {
- return strcmp(a, b);
- } else
- if (!a && !b) {
- return 0;
- } else
- if (a && !b) {
- return 1;
- } else
- if (!a && b) {
- return -1;
- }
- assert(false);
-}
-
-bool
-strs_has(char **strs, const char *str)
-{
- if (!strs) {
- return false;
- }
- char **s;
- for (s = strs; *s; s++) {
- if (!strcmp(*s, str)) {
- return true;
- }
- }
- return false;
-}
-
-void
-strs_add(char ***strs, const char *str)
-{
- int i = 0;
- if (*strs) {
- char **s;
- for (s = *strs; *s; s++, i++);
- }
- *strs = erealloc(*strs, (i+2) * sizeof(char *));
- (*strs)[i] = strdup(str);
- (*strs)[i+1] = NULL;
-}
-
-int
-strs_get_index_if_in(char **strs, const char *str)
-{
- if (!strs) {
- return -1;
- }
- int i;
- for (i = 0; strs[i]; i++) {
- if (!strcmp(strs[i], str)) {
- return i;
- }
- }
- return -1;
-}
-
-void
-strs_free(char **strs)
-{
- if (!strs) {
- return;
- }
- char **s;
- for (s = strs; *s; s++) {
- free(*s);
- }
- free(strs);
-}
-
-long
-str_to_number(const char *str)
-{
- long n;
- char *endptr;
- n = strtol(str, &endptr, 10);
- if (str == endptr) {
- return -1;
- }
- if ((n == LONG_MIN || n == LONG_MAX) && errno == ERANGE) {
- return -1;
- }
- return n;
-}
-
-enum FileType
-file_type(const char *path)
-{
- struct stat s;
- if (stat(path, &s) != 0) {
- return F_ERROR;
- }
- if (S_ISDIR(s.st_mode)) {
- return F_FOLDER;
- }
- if (S_ISREG(s.st_mode)) {
- return F_REG_FILE;
- }
- return F_OTHER;
-}
-
-char *
-file_read(FILE *fp)
-{
- char *str = NULL;
- char buf;
- size_t read;
- int i = 0;
- while (1) {
- read = fread(&buf, 1, 1, fp);
- if (read == 1) {
- str = erealloc(str, (i+1) * sizeof(char));
- str[i] = buf;
- i++;
- } else {
- str = erealloc(str, (i+1) * sizeof(char));
- str[i] = 0;
- break;
- }
- }
- return str;
-}
-
-/* char *
-file_read(const char *filepath)
-{
- char *str = NULL;
- char buf;
- size_t read;
- int i = 0;
- FILE *fp = fopen(filepath, "r");
- if (!fp) {
- LOG_DEBUG("fopen failed.");
- return NULL;
- }
- while (1) {
- read = fread(&buf, 1, 1, fp);
- if (read == 1) {
- str = erealloc(str, (i+1) * sizeof(char));
- str[i] = buf;
- i++;
- } else {
- str = erealloc(str, (i+1) * sizeof(char));
- str[i] = 0;
- break;
- }
- }
- fclose(fp);
- return str;
-} */
-
-char *
-file_extension_replace_or_add(const char *filepath, const char *extension)
-{
- size_t extension_len = strlen(extension);
- char *new = NULL;
- int mark = -1;
- int i, k;
- int path_len;
- for (i = 0; filepath[i]; i++) {
- if (filepath[i] == '.') {
- mark = i;
- }
- }
- if (mark == -1) {
- path_len = (int)strlen(filepath);
- new = emalloc((path_len+2+extension_len) * sizeof(char));
- for (i = 0; i < path_len; i++) {
- new[i] = filepath[i];
- }
- new[i] = '.';
- i++;
- for (k = 0; extension[k]; k++, i++) {
- new[i] = extension[k];
- }
- new[i] = 0;
- } else {
- new = emalloc((mark+2+extension_len) * sizeof(char));
- for (i = 0; i <= mark; i++) {
- new[i] = filepath[i];
- }
- for (k = 0; extension[k]; k++, i++) {
- new[i] = extension[k];
- }
- new[i] = 0;
- }
- return new;
-}
-
-bool
-file_extension_equals(const char *filepath, const char *extension)
-{
- int mark = -1;
- int i;
- for (i = strlen(filepath)-1; i >= 0; i--) {
- if (filepath[i] == '.') {
- mark = i;
- break;
- }
- }
- if (!strcmp(&filepath[mark+1], extension)) {
- return true;
- }
- return false;
-}
-
-char *
-filepath_add_ending_slash_if_missing(const char *path)
-{
- size_t len = strlen(path);
- if (path[len-1] == '/') {
- return strdup(path);
- } else {
- char *path_with_slash = emalloc((len+2) * sizeof(char));
- strcpy(path_with_slash, path);
- path_with_slash[len] = '/';
- path_with_slash[len+1] = 0;
- return path_with_slash;
- }
-}
-
-char *
-filepath_basename(const char *path)
-{
- int begin = 0;
- int i;
- for (i = 0; path[i]; i++) {
- if (path[i] == '/') {
- begin = i+1;
- }
- }
- return strdup(&path[begin]);
-}
-
-char *
-filepath_dirname(const char *path)
-{
- char *dirname;
- int i, end = 0;
- for (i = 0; path[i]; i++) {
- if (path[i] == '/') {
- end = i;
- }
- }
- if (end == 0) {
- dirname = emalloc(2 * sizeof(char));
- dirname[0] = '.';
- dirname[1] = 0;
- return dirname;
- }
- dirname = emalloc((end+1)* sizeof(char));
- for (i = 0; i < end; i++) {
- dirname[i] = path[i];
- }
- dirname[i] = 0;
- return dirname;
-}
-
-char *
-filepath_resolve_tilde(const char *path)
-{
- char *home;
- char *str = NULL;
- if (*path == '~') {
- home = getenv("HOME");
- if (!home) {
- LOG_DEBUG("getenv failed.");
- return NULL;
- }
- str = erealloc(str, (strlen(home)+strlen(path)) * sizeof(char));
- strcpy(str, home);
- strcat(str, &path[1]);
- return str;
- } else {
- return strdup(path);
- }
-}
-
-static const char *
-size_type_to_string(enum SizeType type)
-{
- switch (type) {
- case ST_PERCENT:
- return "%";
- case ST_EM:
- return "em";
- case ST_EX:
- return "ex";
- default:
- return "";
- }
-}
-
-struct Size *
-size_create(const char *str)
-{
- size_t len = strlen(str);
- struct Size *size = emalloc(sizeof(struct Size));
- char *endptr;
- double d;
- d = strtod(str, &endptr);
- if (str == endptr || errno == ERANGE) {
- LOG_DEBUG("strtod failed.");
- return NULL;
- }
- size->d = d;
- size->type = ST_POINT;
- if (len > 1 && str[len-1] == '%') {
- if (size->d < 1.0 || size->d > 100.0) {
- util_log(NULL, 0, LOG_ERR, "invalid percentage.");
- return NULL;
- }
- size->d = d / 100.0;
- size->type = ST_PERCENT;
- } else
- if (len > 2 && str[len-2] == 'e' && str[len-1] == 'm') {
- size->type = ST_EM;
- } else
- if (len > 2 && str[len-2] == 'e' && str[len-1] == 'x') {
- size->type = ST_EX;
- }
- return size;
-}
-
-struct Size *
-size_copy(struct Size *size)
-{
- struct Size *copy = emalloc(sizeof(struct Size));
- copy->type = size->type;
- copy->d = size->d;
- return copy;
-}
-
-const char *
-size_to_string(struct Size *size)
-{
- static char str[10+1];
- if (size->d > 999999) {
- sprintf((char *)&str, ">999.999");
- } else {
- sprintf((char *)&str, "%.1f%s", size->d, size_type_to_string(size->type));
- }
- return str;
-}
-
-const char *
-is_base_font(struct Font *font)
-{
- if (!strcmp(font->name, "Courier")) {
- if (font->style == FS_ITALIC && font->weight == FW_BOLD) {
- return "Courier-BoldItalic";
- } else
- if (font->style == FS_ITALIC) {
- return "Courier-Italic";
- } else
- if (font->weight == FW_BOLD) {
- return "Courier-Bold";
- }
- return "Courier";
- } else
- if (!strcmp(font->name, "Helvetica")) {
- if (font->style == FS_OBLIQUE && font->weight == FW_BOLD) {
- return "Helvetica-BoldOblique";
- } else
- if (font->style == FS_OBLIQUE) {
- return "Helvetica-Oblique";
- } else
- if (font->weight == FW_BOLD) {
- return "Helvetica-Bold";
- }
- return "Helvetica";
- } else
- if (!strcmp(font->name, "Times")) {
- if (font->style == FS_ITALIC && font->weight == FW_BOLD) {
- return "Times-BoldItalic";
- } else
- if (font->style == FS_ITALIC) {
- return "Times-Italic";
- } else
- if (font->weight == FW_BOLD) {
- return "Times-Bold";
- }
- return "Times-Roman";
- }
- return NULL;
-}
diff --git a/src/util.h b/src/util.h
@@ -1,64 +0,0 @@
-#include <stdarg.h>
-#include "types.h"
-
-#ifdef DEBUG
-#define LOG_DEBUG(msg) fprintf(stderr, msg"\n")
-#else
-#define LOG_DEBUG(msg)
-#endif
-
-#define LENGTH(x) (sizeof x / sizeof x[0])
-
-#define COLOR_BOLD_RED "\033[1;31m"
-#define COLOR_BOLD_ORANGE "\033[1;33m"
-#define COLOR_BOLD_WHITE "\033[1;37m"
-#define COLOR_BOLD_BLUE "\033[1;34m"
-#define COLOR_RESET "\033[0m"
-
-enum LogLevel {
- LOG_INFO,
- LOG_WARN,
- LOG_ERR,
- LOG_TODO
-};
-
-enum FileType {
- F_ERROR,
- F_FOLDER,
- F_REG_FILE,
- F_OTHER
-};
-
-void util_log_enable_info_logs(void);
-
-void *emalloc(size_t size);
-void *erealloc(void *ptr, size_t size);
-void util_vlog(const char *file, size_t line_no, enum LogLevel level, const char *msg, va_list va);
-void util_log(const char *file, size_t line_no, enum LogLevel level, const char *msg, ...);
-
-bool str_starts_with(const char *str, const char *part);
-char *str_normalize(const char *str);
-char *str_trim(const char *str);
-char *str_remove_leading_whitespace(const char *str);
-bool strs_has(char **strs, const char *str);
-void strs_add(char ***strs, const char *str);
-int strs_get_index_if_in(char **strs, const char *str);
-void strs_free(char **strs);
-int str_compare(const char *a, const char *b);
-long str_to_number(const char *str);
-
-enum FileType file_type(const char *path);
-char *file_read(FILE *fp);
-char *file_extension_replace_or_add(const char *filepath, const char *extension);
-bool file_extension_equals(const char *filepath, const char *extension);
-
-char *filepath_add_ending_slash_if_missing(const char *path);
-char *filepath_basename(const char *path);
-char *filepath_dirname(const char *path);
-char *filepath_resolve_tilde(const char *path);
-
-struct Size *size_create(const char *str);
-struct Size *size_copy(struct Size *size);
-const char *size_to_string(struct Size *size);
-
-const char *is_base_font(struct Font *font);