lorid

convert chordpro to pdf
git clone git://git.relim.de/lorid.git
Log | Files | Refs | README | LICENSE

commit 4c0fb05f7b569b0dbbfe31a6fb2553c39e76b888
parent 3ce365133219e9025c90596656edf33f37289563
Author: nibo <nibo@relim.de>
Date:   Tue, 25 Mar 2025 17:03:40 +0100

Improve log message

Diffstat:
Msrc/out_pdf.c | 11++++++-----
Dsrc/util.c | 642-------------------------------------------------------------------------------
Dsrc/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);