summaryrefslogtreecommitdiff
path: root/jbig2dec/jbig2dec.c
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2018-11-13 04:18:21 +0100
committerSebastian Rasmussen <sebras@gmail.com>2018-11-14 16:32:46 +0100
commitf1756124f0f3c542bd6c2a9b325dea6bf860fc61 (patch)
tree71130030023406776c3a2c509ced90f84ce069f0 /jbig2dec/jbig2dec.c
parentbcb605e49dbe306ba881818466f8be591510a9ab (diff)
downloadghostpdl-f1756124f0f3c542bd6c2a9b325dea6bf860fc61.tar.gz
jbig2dec: Only print repeated error/warning messages once.
Diffstat (limited to 'jbig2dec/jbig2dec.c')
-rw-r--r--jbig2dec/jbig2dec.c58
1 files changed, 56 insertions, 2 deletions
diff --git a/jbig2dec/jbig2dec.c b/jbig2dec/jbig2dec.c
index cc6358d49..1a455c01f 100644
--- a/jbig2dec/jbig2dec.c
+++ b/jbig2dec/jbig2dec.c
@@ -66,6 +66,10 @@ typedef struct {
SHA1_CTX *hash_ctx;
char *output_filename;
jbig2dec_format output_format;
+ char *last_message;
+ Jbig2Severity severity;
+ char *type;
+ long repeats;
} jbig2dec_params_t;
static int print_version(void);
@@ -248,9 +252,11 @@ print_usage(void)
static void
error_callback(void *error_callback_data, const char *buf, Jbig2Severity severity, int32_t seg_idx)
{
- const jbig2dec_params_t *params = (jbig2dec_params_t *) error_callback_data;
+ jbig2dec_params_t *params = (jbig2dec_params_t *) error_callback_data;
char *type;
char segment[22];
+ int len;
+ char *message;
switch (severity) {
case JBIG2_SEVERITY_DEBUG:
@@ -280,7 +286,52 @@ error_callback(void *error_callback_data, const char *buf, Jbig2Severity severit
else
snprintf(segment, sizeof(segment), "(segment 0x%02x)", seg_idx);
- fprintf(stderr, "jbig2dec %s %s %s\n", type, buf, segment);
+ len = snprintf(NULL, 0, "jbig2dec %s %s %s", type, buf, segment);
+ if (len < 0) {
+ return;
+ }
+
+ message = malloc(len + 1);
+ if (message == NULL) {
+ return;
+ }
+
+ len = snprintf(message, len + 1, "jbig2dec %s %s %s", type, buf, segment);
+ if (len < 0)
+ {
+ free(message);
+ return;
+ }
+
+ if (params->last_message != NULL && strcmp(message, params->last_message)) {
+ if (params->repeats > 1)
+ fprintf(stderr, "jbig2dec %s last message repeated %ld times\n", params->type, params->repeats);
+ fprintf(stderr, "%s\n", message);
+ free(params->last_message);
+ params->last_message = message;
+ params->severity = severity;
+ params->type = type;
+ params->repeats = 0;
+ } else if (params->last_message != NULL) {
+ params->repeats++;
+ if (params->repeats % 1000000 == 0)
+ fprintf(stderr, "jbig2dec %s last message repeated %ld times so far\n", params->type, params->repeats);
+ free(message);
+ } else if (params->last_message == NULL) {
+ fprintf(stderr, "%s\n", message);
+ params->last_message = message;
+ params->severity = severity;
+ params->type = type;
+ params->repeats = 0;
+ }
+}
+
+static void
+flush_errors(jbig2dec_params_t *params)
+{
+ if (params->repeats > 1) {
+ fprintf(stderr, "jbig2dec last message repeated %ld times\n", params->repeats);
+ }
}
static char *
@@ -387,6 +438,8 @@ main(int argc, char **argv)
params.output_filename = NULL;
params.output_format = jbig2dec_format_none;
params.embedded = 0;
+ params.last_message = NULL;
+ params.repeats = 0;
filearg = parse_options(argc, argv, &params);
@@ -541,6 +594,7 @@ main(int argc, char **argv)
result = 0;
cleanup:
+ flush_errors(&params);
jbig2_ctx_free(ctx);
if (params.output_filename)
free(params.output_filename);