Skip to content

Commit

Permalink
Match cpp header checks (AcademySoftwareFoundation#1244)
Browse files Browse the repository at this point in the history
* Add flags for header parsing options, function to restore after silent header parse

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Use new context flags for strict header and silent parsing

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Expose strict and silent header parsing flags

- adds a flags member to the context initializer
- adds a backwards compatibility struct definition
- refactors common init code to helper routine to handle arg versions

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Add strict / silent logic to c-only metadata example header parser / printer

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
Signed-off-by: Cary Phillips <cary@ilm.com>
  • Loading branch information
kdt3rd authored and cary-ilm committed Apr 1, 2022
1 parent ab5ffeb commit b8110ee
Show file tree
Hide file tree
Showing 8 changed files with 272 additions and 69 deletions.
49 changes: 36 additions & 13 deletions src/bin/exrinfo/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ usage (const char* argv0)
{
fprintf (
stderr,
"Usage: %s [-v|--verbose] <filename> [<filename> ...]\n\n",
"Usage: %s [-v|--verbose] [-a|--all-metadata] [-s|--strict] <filename> [<filename> ...]\n\n",
argv0);
}

Expand Down Expand Up @@ -74,47 +74,62 @@ stdin_reader (
}

static int
process_stdin (int verbose)
process_stdin (int verbose, int allmeta, int strict)
{
int rv;
int failcount = 0;
exr_result_t rv;
exr_context_t e = NULL;
exr_context_initializer_t cinit = EXR_DEFAULT_CONTEXT_INITIALIZER;
cinit.error_handler_fn = &error_handler_cb;
cinit.read_fn = &stdin_reader;

if (!verbose) cinit.flags |= EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE;

if (strict) cinit.flags |= EXR_CONTEXT_FLAG_STRICT_HEADER;

#ifdef _WIN32
_setmode (_fileno (stdin), _O_BINARY);
#endif
rv = exr_start_read (&e, "<stdin>", &cinit);
if (rv == EXR_ERR_SUCCESS)
{
exr_print_context_info (e, verbose);
exr_print_context_info (e, verbose || allmeta);
exr_finish (&e);
}
return rv;
else
++failcount;
return failcount;
}

static int
process_file (const char* filename, int verbose)
process_file (const char* filename, int verbose, int allmeta, int strict)
{
int rv;
int failcount;
exr_result_t rv;
exr_context_t e = NULL;
exr_context_initializer_t cinit = EXR_DEFAULT_CONTEXT_INITIALIZER;
cinit.error_handler_fn = &error_handler_cb;

if (!verbose) cinit.flags |= EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE;

if (strict) cinit.flags |= EXR_CONTEXT_FLAG_STRICT_HEADER;

rv = exr_start_read (&e, filename, &cinit);
if (rv == 0)

if (rv == EXR_ERR_SUCCESS)
{
exr_print_context_info (e, verbose);
exr_print_context_info (e, verbose || allmeta);
exr_finish (&e);
}
return rv;
else
++failcount;
return failcount;
}

int
main (int argc, const char* argv[])
{
int rv = 0, nfiles = 0, verbose = 0;
int rv = 0, nfiles = 0, verbose = 0, allmeta = 0, strict = 0;

for (int a = 1; a < argc; ++a)
{
Expand All @@ -128,10 +143,18 @@ main (int argc, const char* argv[])
{
verbose = 1;
}
else if (!strcmp (argv[a], "-a") || !strcmp (argv[a], "--all-metadata"))
{
allmeta = 1;
}
else if (!strcmp (argv[a], "-s") || !strcmp (argv[a], "--strict"))
{
strict = 1;
}
else if (!strcmp (argv[a], "-"))
{
++nfiles;
rv += process_stdin (verbose);
rv += process_stdin (verbose, allmeta, strict);
}
else if (argv[a][0] == '-')
{
Expand All @@ -141,7 +164,7 @@ main (int argc, const char* argv[])
else
{
++nfiles;
rv += process_file (argv[a], verbose);
rv += process_file (argv[a], verbose, allmeta, strict);
}
}

Expand Down
19 changes: 19 additions & 0 deletions src/lib/OpenEXRCore/backward_compatibility.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,23 @@ struct _exr_context_initializer_v1
int max_tile_height;
};

struct _exr_context_initializer_v2
{
size_t size;
exr_error_handler_cb_t error_handler_fn;
exr_memory_allocation_func_t alloc_fn;
exr_memory_free_func_t free_fn;
void* user_data;
exr_read_func_ptr_t read_fn;
exr_query_size_func_ptr_t size_fn;
exr_write_func_ptr_t write_fn;
exr_destroy_stream_func_ptr_t destroy_fn;
int max_image_width;
int max_image_height;
int max_tile_width;
int max_tile_height;
int zip_level;
float dwa_quality;
};

#endif /* OPENEXR_BACKWARD_COMPATIBILITY_H */
120 changes: 95 additions & 25 deletions src/lib/OpenEXRCore/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "internal_constants.h"
#include "internal_file.h"
#include "backward_compatibility.h"

#include <IlmThreadConfig.h>

Expand Down Expand Up @@ -62,6 +63,7 @@ dispatch_read (
rv = EXR_ERR_SUCCESS;
else
rv = EXR_ERR_READ_IO;

return rv;
}

Expand Down Expand Up @@ -120,17 +122,48 @@ process_query_size (

/**************************************/

static inline exr_context_initializer_t
fill_context_data (const exr_context_initializer_t* ctxtdata)
{
exr_context_initializer_t inits = EXR_DEFAULT_CONTEXT_INITIALIZER;
if (ctxtdata)
{
inits.error_handler_fn = ctxtdata->error_handler_fn;
inits.alloc_fn = ctxtdata->alloc_fn;
inits.free_fn = ctxtdata->free_fn;
inits.user_data = ctxtdata->user_data;
inits.read_fn = ctxtdata->read_fn;
inits.size_fn = ctxtdata->size_fn;
inits.write_fn = ctxtdata->write_fn;
inits.destroy_fn = ctxtdata->destroy_fn;
inits.max_image_width = ctxtdata->max_image_width;
inits.max_image_height = ctxtdata->max_image_height;
inits.max_tile_width = ctxtdata->max_tile_width;
inits.max_tile_height = ctxtdata->max_tile_height;
if (ctxtdata->size >= sizeof (struct _exr_context_initializer_v2))
{
inits.zip_level = ctxtdata->zip_level;
inits.dwa_quality = ctxtdata->dwa_quality;
}
if (ctxtdata->size >= sizeof (struct _exr_context_initializer_v3))
{
inits.flags = ctxtdata->flags;
}
}

internal_exr_update_default_handlers (&inits);
return inits;
}

/**************************************/

exr_result_t
exr_test_file_header (
const char* filename, const exr_context_initializer_t* ctxtdata)
{
exr_result_t rv = EXR_ERR_SUCCESS;
struct _internal_exr_context* ret = NULL;
exr_context_initializer_t inits = EXR_DEFAULT_CONTEXT_INITIALIZER;

if (ctxtdata) inits = *ctxtdata;

internal_exr_update_default_handlers (&inits);
exr_context_initializer_t inits = fill_context_data (ctxtdata);

if (filename && filename[0] != '\0')
{
Expand Down Expand Up @@ -210,22 +243,19 @@ exr_result_t
exr_start_read (
exr_context_t* ctxt,
const char* filename,
const exr_context_initializer_t* initdata)
const exr_context_initializer_t* ctxtdata)
{
exr_result_t rv = EXR_ERR_UNKNOWN;
struct _internal_exr_context* ret = NULL;
exr_context_initializer_t inits = EXR_DEFAULT_CONTEXT_INITIALIZER;

if (initdata) inits = *initdata;

internal_exr_update_default_handlers (&inits);
exr_context_initializer_t inits = fill_context_data (ctxtdata);

if (!ctxt)
{
inits.error_handler_fn (
NULL,
EXR_ERR_INVALID_ARGUMENT,
"Invalid context handle passed to start_read function");
if (!(inits.flags & EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE))
inits.error_handler_fn (
NULL,
EXR_ERR_INVALID_ARGUMENT,
"Invalid context handle passed to start_read function");
return EXR_ERR_INVALID_ARGUMENT;
}

Expand Down Expand Up @@ -262,10 +292,11 @@ exr_start_read (
}
else
{
inits.error_handler_fn (
NULL,
EXR_ERR_INVALID_ARGUMENT,
"Invalid filename passed to start_read function");
if (!(inits.flags & EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE))
inits.error_handler_fn (
NULL,
EXR_ERR_INVALID_ARGUMENT,
"Invalid filename passed to start_read function");
rv = EXR_ERR_INVALID_ARGUMENT;
}

Expand All @@ -280,15 +311,11 @@ exr_start_write (
exr_context_t* ctxt,
const char* filename,
exr_default_write_mode_t default_mode,
const exr_context_initializer_t* initdata)
const exr_context_initializer_t* ctxtdata)
{
int rv = EXR_ERR_UNKNOWN;
struct _internal_exr_context* ret = NULL;
exr_context_initializer_t inits = EXR_DEFAULT_CONTEXT_INITIALIZER;

if (initdata) inits = *initdata;

internal_exr_update_default_handlers (&inits);
exr_context_initializer_t inits = fill_context_data (ctxtdata);

if (!ctxt)
{
Expand Down Expand Up @@ -359,6 +386,49 @@ exr_start_inplace_header_update (

/**************************************/

exr_result_t
exr_start_memory_write (
exr_context_t* ctxt, const exr_context_initializer_t* ctxtdata)
{
int rv = EXR_ERR_UNKNOWN;
struct _internal_exr_context* ret = NULL;
exr_context_initializer_t inits = fill_context_data (ctxtdata);

if (!ctxt)
{
inits.error_handler_fn (
NULL,
EXR_ERR_INVALID_ARGUMENT,
"Invalid context handle passed to start_read function");
return EXR_ERR_INVALID_ARGUMENT;
}

rv = internal_exr_alloc_context (
&ret,
&inits,
EXR_CONTEXT_WRITE,
sizeof (struct _internal_exr_filehandle));
if (rv == EXR_ERR_SUCCESS)
{
ret->do_write = &dispatch_write;

rv = exr_attr_string_create (
(exr_context_t) ret, &(ret->filename), "<memory>");

if (rv == EXR_ERR_SUCCESS)
{
if (!inits.write_fn) rv = default_init_write_file (ret);

if (rv != EXR_ERR_SUCCESS) exr_finish ((exr_context_t*) &ret);
}
}

*ctxt = (exr_context_t) ret;
return rv;
}

/**************************************/

exr_result_t
exr_get_file_name (exr_const_context_t ctxt, const char** name)
{
Expand Down
27 changes: 20 additions & 7 deletions src/lib/OpenEXRCore/internal_structs.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,17 @@ internal_exr_revert_add_part (
ctxt->num_parts = ncount;
}

/**************************************/

exr_result_t internal_exr_context_restore_handlers(struct _internal_exr_context* ctxt, exr_result_t rv)
{
ctxt->standard_error = &dispatch_standard_error;
ctxt->report_error = &dispatch_error;
ctxt->print_error = &dispatch_print_error;
return rv;
}


/**************************************/

exr_result_t
Expand Down Expand Up @@ -394,13 +405,15 @@ internal_exr_alloc_context (

exr_get_default_zip_compression_level (&ret->default_zip_level);
exr_get_default_dwa_compression_quality (&ret->default_dwa_quality);
if (initializers->size >= sizeof(struct _exr_context_initializer_v2))
{
if (initializers->zip_level >= 0)
ret->default_zip_level = initializers->zip_level;
if (initializers->dwa_quality >= 0.f)
ret->default_dwa_quality = initializers->dwa_quality;
}
if (initializers->zip_level >= 0)
ret->default_zip_level = initializers->zip_level;
if (initializers->dwa_quality >= 0.f)
ret->default_dwa_quality = initializers->dwa_quality;

if (initializers->flags & EXR_CONTEXT_FLAG_STRICT_HEADER)
ret->strict_header = 1;
if (initializers->flags & EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE)
ret->silent_header = 1;

ret->file_size = -1;
ret->max_name_length = EXR_SHORTNAME_MAXLEN;
Expand Down
5 changes: 4 additions & 1 deletion src/lib/OpenEXRCore/internal_structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ struct _internal_exr_context
uint8_t has_nonimage_data;
uint8_t is_multipart;

uint8_t pad[2];
uint8_t strict_header;
uint8_t silent_header;

exr_attr_string_t filename;
exr_attr_string_t tmp_filename;
Expand Down Expand Up @@ -344,6 +345,8 @@ exr_result_t internal_exr_add_part (
void internal_exr_revert_add_part (
struct _internal_exr_context*, struct _internal_exr_part**, int* new_index);

exr_result_t internal_exr_context_restore_handlers (
struct _internal_exr_context* ctxt, exr_result_t rv);
exr_result_t internal_exr_alloc_context (
struct _internal_exr_context** out,
const exr_context_initializer_t* initializers,
Expand Down
Loading

0 comments on commit b8110ee

Please sign in to comment.