# HG changeset patch # User magedrifaat # Date 1659050162 -7200 # Node ID 97e7ee3b27b76f332770ad96098fc3d8c7344557 # Parent af4519cbfcae4c7586d7f870186e7be0ceeaf53a Tiff setTag: modify the behavior with structs to be compatible with matlab * __tiff__.cc(F_tiff_set_tag__): change the way structs are handled so that elements are processed in the same order they were assigned for matlab compatibility. diff -r af4519cbfcae -r 97e7ee3b27b7 libinterp/dldfcn/__tiff__.cc --- a/libinterp/dldfcn/__tiff__.cc Fri Jul 29 00:46:44 2022 +0200 +++ b/libinterp/dldfcn/__tiff__.cc Fri Jul 29 01:16:02 2022 +0200 @@ -931,7 +931,7 @@ else error ("Planar configuration not supported"); - // TODO(maged): give a warning for a larger inpput strip + // TODO(maged): give a warning for a larger input strip strip_data.resize (strip_dimensions); //TODO(maged): add suppot for 1-bit images @@ -974,11 +974,10 @@ if (nargin == 2) mode = args (1).string_value (); - // TODO(maged): look into const begin and end - std::vector supported_modes {"r", "w", "w8", "a"}; + const std::vector supported_modes {"r", "w", "w8", "a"}; - if (std::find(supported_modes.begin(), supported_modes.end(), mode) - == supported_modes.end()) + if (std::find (supported_modes.cbegin (), supported_modes.cend (), mode) + == supported_modes.cend ()) { if (mode == "r+") error ("Openning files in r+ mode is not yet supported"); @@ -1010,7 +1009,6 @@ if (nargin == 0) error ("No handle provided\n"); - // TODO: mark object as closed to prevent segfault/ check matlab behavior TIFF *tif = (TIFF *)(args (0).uint64_value ()); TIFFClose (tif); @@ -1074,23 +1072,21 @@ TIFF *tif = (TIFF *)(args (0).uint64_value ()); - // TODO(maged): should all tags be verified first? if (args (1).isstruct ()) { octave_scalar_map tags = args (1).scalar_map_value (); - // Verify existance of all tags first - for (auto tag_it = tags.cbegin (); tag_it != tags.cend (); tag_it++) + string_vector keys = tags.fieldnames (); + // Using iterators instead of this loop method seems to process + // the elements of the struct in a different order than they were + // assigned which makes the behavior here incompatible with matlab + // in case of errors. + for (octave_idx_type i = 0; i < keys.numel (); i++) { - std::string key = tags.key (tag_it); - if (! TIFFFieldWithName (tif, key.c_str ())) + std::string key = keys[i]; + const TIFFField *fip = TIFFFieldWithName (tif, key.c_str ()); + if (! fip) error ("Tag %s not found", key.c_str ()); - } - - for (auto tag_it = tags.cbegin (); tag_it != tags.cend (); tag_it++) - { - std::string key = tags.key (tag_it); - const TIFFField *fip = TIFFFieldWithName (tif, key.c_str ()); - set_field_data (tif, fip, tags.contents (tag_it)); + set_field_data (tif, fip, tags.contents (key)); } } else @@ -1099,6 +1095,7 @@ error ("Too few arguments provided"); const TIFFField *fip; + // TODO(maged): matlab actually checks for its own strings not LibTIFF's if (args (1).is_string ()) { std::string tagName = args (1).string_value ();