ref: 7c1c2780f7bacfeda1c5f5180aa6f832c00a4669
parent: 7e45faa81deadc4a3b4419a9e76a17782e8034f4
author: Sebastian Rasmussen <[email protected]>
date: Sun Sep 15 11:45:47 EDT 2019
jbig2dec: Separate command line tool error callback state from parameters.
--- a/jbig2dec.c
+++ b/jbig2dec.c
@@ -65,11 +65,15 @@
SHA1_CTX *hash_ctx;
char *output_filename;
jbig2dec_format output_format;
+} jbig2dec_params_t;
+
+typedef struct {
+ int verbose;
char *last_message;
Jbig2Severity severity;
char *type;
long repeats;
-} jbig2dec_params_t;
+} jbig2dec_error_callback_state_t;
static int print_version(void);
static int print_usage(void);
@@ -251,7 +255,7 @@
static void
error_callback(void *error_callback_data, const char *buf, Jbig2Severity severity, int32_t seg_idx)
{
- jbig2dec_params_t *params = (jbig2dec_params_t *) error_callback_data;
+ jbig2dec_error_callback_state_t *state = (jbig2dec_error_callback_state_t *) error_callback_data;
char *type;
char segment[22];
int len;
@@ -259,17 +263,17 @@
switch (severity) {
case JBIG2_SEVERITY_DEBUG:
- if (params->verbose < 3)
+ if (state->verbose < 3)
return;
type = "DEBUG";
break;
case JBIG2_SEVERITY_INFO:
- if (params->verbose < 2)
+ if (state->verbose < 2)
return;
type = "info";
break;
case JBIG2_SEVERITY_WARNING:
- if (params->verbose < 1)
+ if (state->verbose < 1)
return;
type = "WARNING";
break;
@@ -302,34 +306,34 @@
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);
+ if (state->last_message != NULL && strcmp(message, state->last_message)) {
+ if (state->repeats > 1)
+ fprintf(stderr, "jbig2dec %s last message repeated %ld times\n", state->type, state->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(state->last_message);
+ state->last_message = message;
+ state->severity = severity;
+ state->type = type;
+ state->repeats = 0;
+ } else if (state->last_message != NULL) {
+ state->repeats++;
+ if (state->repeats % 1000000 == 0)
+ fprintf(stderr, "jbig2dec %s last message repeated %ld times so far\n", state->type, state->repeats);
free(message);
- } else if (params->last_message == NULL) {
+ } else if (state->last_message == NULL) {
fprintf(stderr, "%s\n", message);
- params->last_message = message;
- params->severity = severity;
- params->type = type;
- params->repeats = 0;
+ state->last_message = message;
+ state->severity = severity;
+ state->type = type;
+ state->repeats = 0;
}
}
static void
-flush_errors(jbig2dec_params_t *params)
+flush_errors(jbig2dec_error_callback_state_t *state)
{
- if (params->repeats > 1) {
- fprintf(stderr, "jbig2dec last message repeated %ld times\n", params->repeats);
+ if (state->repeats > 1) {
+ fprintf(stderr, "jbig2dec last message repeated %ld times\n", state->repeats);
}
}
@@ -426,6 +430,7 @@
Jbig2Ctx *ctx = NULL;
uint8_t buf[4096];
jbig2dec_params_t params;
+ jbig2dec_error_callback_state_t error_callback_state;
int filearg;
int result = 1;
int code;
@@ -437,8 +442,6 @@
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, ¶ms);
@@ -487,7 +490,11 @@
goto cleanup;
}
- ctx = jbig2_ctx_new(NULL, (Jbig2Options)(f_page != NULL || params.embedded ? JBIG2_OPTIONS_EMBEDDED : 0), NULL, error_callback, ¶ms);
+ error_callback_state.verbose = params.verbose;
+ error_callback_state.last_message = NULL;
+ error_callback_state.repeats = 0;
+
+ ctx = jbig2_ctx_new(NULL, (Jbig2Options)(f_page != NULL || params.embedded ? JBIG2_OPTIONS_EMBEDDED : 0), NULL, error_callback, &error_callback_state);
if (ctx == NULL) {
fclose(f);
if (f_page)
@@ -510,7 +517,7 @@
if (f_page != NULL) {
Jbig2GlobalCtx *global_ctx = jbig2_make_global_ctx(ctx);
- ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, global_ctx, error_callback, ¶ms);
+ ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, global_ctx, error_callback, &error_callback_state);
if (ctx != NULL) {
for (;;) {
int n_bytes = fread(buf, 1, sizeof(buf), f_page);
@@ -586,7 +593,6 @@
write_document_hash(¶ms);
}
-
} /* end params.mode switch */
/* fin */
@@ -593,10 +599,10 @@
result = 0;
cleanup:
- flush_errors(¶ms);
+ flush_errors(&error_callback_state);
jbig2_ctx_free(ctx);
- if (params.last_message)
- free(params.last_message);
+ if (error_callback_state.last_message)
+ free(error_callback_state.last_message);
if (params.output_filename)
free(params.output_filename);
if (params.hash)