diff --git a/pdf.c b/pdf.c index bb5d4fcbdd4939a64791cca89c3ba03e1e92ba47..07275db625490e1c1a1bd3c061bcde7e2fcc099b 100644 --- a/pdf.c +++ b/pdf.c @@ -32,6 +32,73 @@ #endif +/* Works differently from strictness: messages with severity equal to or greater than this number will be printed */ +uint8_t log_level = 0; +uint64_t log_messages = 0; // XXX: maybe make it static to log_messages +uint64_t log_capacity = 0; // XXX: this too +uint8_t logs_failed = 0; + +/* +typedef struct log_message_S { + const char *message, + uint8_t severity; +} log_message; + +log_message *logs = NULL; + +*/ + +void log_message(const char *message, uint8_t severity) +{ + log_message *msg; + + if(logs_failed) + { + return; + } + else if(logs == NULL) + { + logs = calloc(4096, sizeof(log_message)); + } + else if(log_capacity == log_messages) + { + logs = reallocarray(logs, log_capacity + 4096, sizeof(log_message)); + log_capacity += 4096 + } + + /* check logs again in case calloc or realloc failed */ + if(logs == NULL) + { + fprintf(stderr, "Failed to allocate log buffer.\n"); + logs_failed = 1; + return; + } + + msg = malloc(sizeof(log_message); + msg->message = message; + msg->severity = severity; + + log_messages += 1; +} + +void print_log_messages() +{ + log_message *entry; + + for(int i = 0; i < log_messages; i++) + { + entry = log_messages[i]; + if(log_level <= entry->severity) + { + fprintf(stderr, "%s\n", entry->message); + } + } +} + +void free_log_messages() +{ + //XXX: TODO +} extern int errno; // used in text extraction