Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Match cpp header checks #1244

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
28 changes: 20 additions & 8 deletions src/lib/OpenEXRCore/internal_structs.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
*/

#include "internal_structs.h"
#include "backward_compatibility.h"
#include "internal_attr.h"
#include "internal_constants.h"
#include "internal_memory.h"
Expand Down Expand Up @@ -312,6 +311,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 @@ -393,13 +403,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