[epr-api] 02/04: Imported Upstream version 2.3~dev20140814

Antonio Valentino a_valentino-guest at moszumanska.debian.org
Thu Aug 14 18:55:00 UTC 2014


This is an automated email from the git hooks/post-receive script.

a_valentino-guest pushed a commit to branch master
in repository epr-api.

commit d0083a904accb6276c84fdf472a943b523550ab4
Author: Antonio Valentino <antonio.valentino at tiscali.it>
Date:   Thu Aug 14 20:50:23 2014 +0200

    Imported Upstream version 2.3~dev20140814
---
 CMakeLists.txt     | 141 +++++++++++++++++++++++++++--------------------------
 src/CMakeLists.txt |  10 ++--
 src/epr_api.h      |   2 +-
 src/epr_band.c     |  61 ++++++++++++++---------
 src/epr_bitmask.c  |  13 +++--
 src/epr_core.c     |   2 +-
 src/epr_dsd.c      |  48 +++++++++---------
 src/epr_msph.c     |  12 ++---
 src/epr_param.c    |  12 ++---
 src/epr_product.c  |  14 +++---
 10 files changed, 169 insertions(+), 146 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a6266e9..ba7d824 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,68 +1,73 @@
-# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
-
-
-cmake_minimum_required(VERSION 2.8)
-project(epr-api)
-
-
-# set version number
-set(EPR_API_VERSION_MAJOR 2)
-set(EPR_API_VERSION_MINOR 3)
-set(EPR_API_VERSION_PATCH 0)
-set(EPR_API_VERSION_STRING
-    "${EPR_API_VERSION_MAJOR}.${EPR_API_VERSION_MINOR}.${EPR_API_VERSION_PATCH}")
-
-
-# options
-option(BUILD_STATIC_LIB "build the static version of the library" ON)
-option(BUILD_TESTS "build test programs" OFF)
-option(BUILD_DOCS "build Doxygen documentation" OFF)
-option(DISABLE_SYMBOL_CONTROL
-    "Do not try to control symbols that are exported by the dynamic library.
-This option can be used to fix some build issue with non standard linkers."
-    OFF)
-
-
-# testing
-enable_testing()
-
-
-# sub-directories
-add_subdirectory(src)
-
-if(BUILD_TESTS)
-    add_subdirectory(bccunit)
-endif(BUILD_TESTS)
-
-if(BUILD_DOCS)
-    add_subdirectory(docs)
-endif(BUILD_DOCS)
-
-
-# uninstall target
-configure_file(
-    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
-    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
-    IMMEDIATE @ONLY)
-
-add_custom_target(uninstall
-    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
-
-
-# packaging
-include(InstallRequiredSystemLibraries)
-
-set(CPACK_GENERATOR TGZ ZIP STGZ)
-set(CPACK_SOURCE_GENERATOR TGZ ZIP)
-set(CPACK_PACKAGE_VERSION_MAJOR ${EPR_API_VERSION_MAJOR})
-set(CPACK_PACKAGE_VERSION_MINOR ${EPR_API_VERSION_MINOR})
-set(CPACK_PACKAGE_VERSION_PATCH ${EPR_API_VERSION_PATCH})
-set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.txt")
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
-    "Delft object-oriented radar interferometric software")
-set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
-set(CPACK_SOURCE_IGNORE_FILES "/build.*;.*~;\\\\.git.*;\\\\.user$;\\\\.DS_Store")
-set(CPACK_STRIP_FILES TRUE)
-set(CPACK_SOURCE_STRIP_FILES TRUE)
-
-include(CPack)
+# Copyright (c) 2013-2014 Antonio Valentino <antonio.valentino at tiscali.it>
+
+
+cmake_minimum_required(VERSION 2.8)
+project(epr-api)
+
+
+# set version number
+set(EPR_API_VERSION_MAJOR 2)
+set(EPR_API_VERSION_MINOR 3)
+set(EPR_API_VERSION_PATCH 0)
+set(EPR_API_VERSION_STRING
+    "${EPR_API_VERSION_MAJOR}.${EPR_API_VERSION_MINOR}.${EPR_API_VERSION_PATCH}")
+
+
+# NOTE: only change this when an ABI change happens
+set(EPR_API_SOVERSION 2)
+
+
+# options
+option(BUILD_STATIC_LIB "build the static version of the library" ON)
+option(BUILD_TESTS "build test programs" OFF)
+option(BUILD_DOCS "build Doxygen documentation" OFF)
+option(DISABLE_SYMBOL_CONTROL
+    "Do not try to control symbols that are exported by the dynamic library.
+This option can be used to fix some build issue with non standard linkers."
+    OFF)
+
+
+# testing
+enable_testing()
+
+
+# sub-directories
+add_subdirectory(src)
+
+if(BUILD_TESTS)
+    add_subdirectory(bccunit)
+endif(BUILD_TESTS)
+
+if(BUILD_DOCS)
+    add_subdirectory(docs)
+endif(BUILD_DOCS)
+
+
+# uninstall target
+configure_file(
+    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+    IMMEDIATE @ONLY)
+
+add_custom_target(uninstall
+    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+
+
+# packaging
+include(InstallRequiredSystemLibraries)
+
+set(CPACK_GENERATOR TGZ ZIP STGZ)
+set(CPACK_SOURCE_GENERATOR TGZ ZIP)
+set(CPACK_PACKAGE_VERSION_MAJOR ${EPR_API_VERSION_MAJOR})
+set(CPACK_PACKAGE_VERSION_MINOR ${EPR_API_VERSION_MINOR})
+set(CPACK_PACKAGE_VERSION_PATCH ${EPR_API_VERSION_PATCH})
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.txt")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
+    "Delft object-oriented radar interferometric software")
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
+set(CPACK_SOURCE_IGNORE_FILES "/build.*;.*~;\\\\.git.*;\\\\.user$;\\\\.DS_Store")
+set(CPACK_STRIP_FILES TRUE)
+set(CPACK_SOURCE_STRIP_FILES TRUE)
+
+include(CPack)
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index dae0ae3..52a0a07 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+# Copyright (c) 2013-2014 Antonio Valentino <antonio.valentino at tiscali.it>
 
 
 # sources
@@ -53,8 +53,10 @@ endif(CMAKE_C_COMPILER_ID STREQUAL GNU OR CMAKE_C_COMPILER_ID STREQUAL Clang)
 add_library(epr_api SHARED ${SOURCES})
 set_target_properties(epr_api PROPERTIES
     VERSION ${EPR_API_VERSION_STRING}
-    SOVERSION ${EPR_API_VERSION_MAJOR})
-target_link_libraries(epr_api m)
+    SOVERSION ${EPR_API_SOVERSION})
+if(NOT MSVC)
+    target_link_libraries(epr_api m)
+endif()
 
 
 if(BUILD_STATIC_LIB)
@@ -72,7 +74,7 @@ endif(BUILD_TESTS)
 
 # install
 install(FILES epr_api.h epr_ptrarray.h DESTINATION include COMPONENT lib)
-install(TARGETS epr_api LIBRARY DESTINATION lib COMPONENT dev)
+install(TARGETS epr_api DESTINATION lib COMPONENT dev)
 if(BUILD_STATIC_LIB)
     install(TARGETS epr_api_static ARCHIVE DESTINATION lib COMPONENT dev)
 endif(BUILD_STATIC_LIB)
diff --git a/src/epr_api.h b/src/epr_api.h
index 6dc625b..28cab3d 100644
--- a/src/epr_api.h
+++ b/src/epr_api.h
@@ -31,7 +31,7 @@ extern "C"
 #include "epr_ptrarray.h"
 
 #define EPR_PRODUCT_API_NAME_STR         "ENVISAT Product Reader API"
-#define EPR_PRODUCT_API_VERSION_STR      "2.3"
+#define EPR_PRODUCT_API_VERSION_STR      "2.3dev_pyepr082"
 
 /* needed by Doxygen */
 /** \mainpage
diff --git a/src/epr_band.c b/src/epr_band.c
index a7eb46b..133b325 100644
--- a/src/epr_band.c
+++ b/src/epr_band.c
@@ -105,9 +105,9 @@ EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id) {
         /* 2: dataset_name */
         band_id->dataset_ref = epr_get_ref_struct(product_id, b_tables[bt_index].descriptors[i].rec_name);
         if (band_id->dataset_ref.dataset_id == NULL) {
+            epr_free_band_id(band_id);
             epr_set_err(e_err_invalid_dataset_name,
                         "epr_create_band_ids: invalid dataset name in DDDB");
-            epr_free_band_id(band_id);
             return NULL;
         }
         /* 3: sample_offset */
@@ -134,9 +134,9 @@ EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id) {
                 } else {
                     scaling_offset = epr_get_scaling_params(product_id, test_block);
                     if (scaling_offset == -909.909) { /* @todo what an ugly return value. Eeeek!*/
+                        epr_free_band_id(band_id);
                         epr_set_err(e_err_invalid_dataset_name,
                                     "epr_create_band_ids: invalid dataset name in dddb");
-                        epr_free_band_id(band_id);
                         return NULL;
                     }
                     band_id->scaling_offset = scaling_offset;
@@ -153,9 +153,9 @@ EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id) {
                 } else {
                     scaling_factor = epr_get_scaling_params(product_id, test_block);
                     if (scaling_factor == -909.909) { /* @todo what an ugly return value. Eeeek!*/
+                        epr_free_band_id(band_id);
                         epr_set_err(e_err_invalid_dataset_name,
                                     "epr_create_band_ids: invalid dataset name in dddb");
-                        epr_free_band_id(band_id);
                         return NULL;
                     }
                     band_id->scaling_factor = scaling_factor;
@@ -168,9 +168,9 @@ EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id) {
         if (b_tables[bt_index].descriptors[i].flag_coding_name != NULL) {
             band_id->flag_coding = epr_create_flag_coding(product_id, b_tables[bt_index].descriptors[i].flag_coding_name);
             if (band_id->flag_coding == NULL) {
+                epr_free_band_id(band_id);
                 epr_set_err(e_err_out_of_memory,
                             "epr_create_band_ids: out of memory");
-                epr_free_band_id(band_id);
                 return NULL;
             }
         } else {
@@ -644,8 +644,10 @@ int epr_read_band_raster(EPR_SBandId* band_id,
                                            offset_x,
                                            offset_y,
                                            raster) != 0) {
+            /* Do not shadow the original error message that appears to be more informative
             epr_set_err(e_err_file_read_error,
                         "epr_read_band_raster: unsuccessfully reading band measurement data");
+            */
             return epr_get_last_err_code();
         }
         if (band_id->bm_expr != NULL) {
@@ -658,7 +660,6 @@ int epr_read_band_raster(EPR_SBandId* band_id,
                                           raster->source_step_x,
                                           raster->source_step_y);
 
-
             /* rd_bm = */ epr_read_bitmask_raster(product_id,
                                             band_id->bm_expr,
                                             offset_x,
@@ -747,16 +748,16 @@ int epr_read_band_measurement_data(EPR_SBandId* band_id,
     datatype_id = field_info->data_type_id;
 
     /* if the user raster (or part of) is outside bbox in source coordinates*/
-    if (offset_x + raster->raster_width > (int)scan_line_length) {
+    if (offset_x + raster->source_width > (int)scan_line_length) {
+        epr_free_record(record);
         epr_set_err(e_err_illegal_arg,
                     "epr_read_band_measurement_data: raster x co-ordinates out of bounds");
-        epr_free_record(record);
         return epr_get_last_err_code();
     }
-    if (offset_y + raster->raster_height > (int)(rec_numb)) {
+    if (offset_y + raster->source_height > (int)(rec_numb)) {
+        epr_free_record(record);
         epr_set_err(e_err_illegal_arg,
                     "epr_read_band_measurement_data: raster y co-ordinates out of bounds");
-        epr_free_record(record);
         return epr_get_last_err_code();
     }
     raster_pos = 0;
@@ -765,15 +766,21 @@ int epr_read_band_measurement_data(EPR_SBandId* band_id,
     /*select the correspondent function to scaling and transform data type*/
     decode_func = select_line_decode_function(band_datatype, band_smod, datatype_id);
     if (decode_func == NULL) {
+        epr_free_record(record);
         epr_set_err(e_err_illegal_data_type,
                     "epr_read_band_measurement_data: internal error: unknown data type");
-        epr_free_record(record);
         return epr_get_last_err_code();
     }
 
     scene_width = band_id->product_id->scene_width;
     if (band_id->lines_mirrored) {
         offset_x_mirrored = (scene_width - 1) - (offset_x + raster->source_width - 1);
+        /* the extra offset is used to accomodate the the effect of sampling step
+         * greather than one in case of mirrored lines */
+        {
+            int extra_offset = raster->source_width - ((raster->raster_width - 1) * raster->source_step_x + 1);
+            offset_x_mirrored += extra_offset;
+        }
     } else {
         offset_x_mirrored = offset_x;
     }
@@ -803,9 +810,9 @@ int epr_read_band_measurement_data(EPR_SBandId* band_id,
         } else if (band_datatype == e_tid_uint || band_datatype == e_tid_int) {
             mirror_uint_array((uint*)raster->buffer, raster->raster_width, raster->raster_height);
         } else {
+            epr_free_record(record);
             epr_set_err(e_err_illegal_data_type,
                         "epr_read_band_measurement_data: internal error: unknown data type");
-            epr_free_record(record);
             return epr_get_last_err_code();
         }
     }
@@ -848,13 +855,14 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
     int iY, raster_pos, delta_raster_pos;
     EPR_FArrayTransformer transform_array_func = NULL;
     int y_beg, y_end, y_beg_old, y_end_old;
-    /* int offset_x_mirrored = 0; */
+    int offset_x_mirrored = 0;
     uint num_elems = 0;
     float y_mod = 0;
     float scan_offset_x = 0;
     float scan_offset_y = 0;
     void* line_beg_buffer = NULL;
     void* line_end_buffer = NULL;
+    uint scene_width = 0;
 
     product_id = band_id->product_id;
 
@@ -897,8 +905,8 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
             scan_offset_x = 6.0F;
             samples_per_tie_pt = 50;
         } else {
-            epr_set_err(e_err_invalid_value, "epr_read_band_annotation_data: internal error: illegal value for samples_per_tie_pt");
             epr_free_record(record);
+            epr_set_err(e_err_invalid_value, "epr_read_band_annotation_data: internal error: illegal value for samples_per_tie_pt");
             return epr_get_last_err_code();
         }
     } else if ((strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0) ||
@@ -914,42 +922,42 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
         lines_per_tie_pt = epr_get_scene_height(product_id) / (num_rec - 1);
         num_elems = field_info->num_elems;
     } else {
+        epr_free_record(record);
         epr_set_err(e_err_illegal_arg,
                     "epr_read_band_annotation_data: unhandled ENVISAT product type");
-        epr_free_record(record);
         return epr_get_last_err_code();
     }
 
     /*memory allocate for the increasingly begin tie point line*/
     line_beg_buffer = calloc(sizeof(float), num_elems);
     if (line_beg_buffer == NULL) {
-        epr_set_err(e_err_out_of_memory, "epr_read_band_annotation_data: out of memory");
         epr_free_record(record);
+        epr_set_err(e_err_out_of_memory, "epr_read_band_annotation_data: out of memory");
         return epr_get_last_err_code();
     }
     /*memory allocate for the increasingly end tie point line*/
     line_end_buffer = calloc(sizeof(float), num_elems);
     if (line_end_buffer == NULL)  {
-        epr_set_err(e_err_out_of_memory, "epr_read_band_annotation_data: out of memory");
         epr_free_record(record);
         free(line_beg_buffer);
+        epr_set_err(e_err_out_of_memory, "epr_read_band_annotation_data: out of memory");
         return epr_get_last_err_code();
     }
     /* if the user raster (or its part) is outside of orbit in source coordinates*/
     if (offset_x + raster->raster_width > (int)scan_line_length) {
-        epr_set_err(e_err_illegal_arg,
-                    "epr_read_band_data: raster x co-ordinates out of bounds");
         epr_free_record(record);
         free(line_beg_buffer);
         free(line_end_buffer);
+        epr_set_err(e_err_illegal_arg,
+                    "epr_read_band_data: raster x co-ordinates out of bounds");
         return epr_get_last_err_code();
     }
     if (offset_y + raster->raster_height > (int)(rec_numb * lines_per_tie_pt)) {
-        epr_set_err(e_err_illegal_arg,
-                    "epr_read_band_data: raster y co-ordinates out of bounds");
         epr_free_record(record);
         free(line_beg_buffer);
         free(line_end_buffer);
+        epr_set_err(e_err_illegal_arg,
+                    "epr_read_band_data: raster y co-ordinates out of bounds");
         return epr_get_last_err_code();
     }
     raster_pos = 0;
@@ -969,13 +977,18 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
     y_beg_old = 9999;
     y_end_old = 9999;
 
-    /* TODO: check
+    scene_width = band_id->product_id->scene_width;
     if (band_id->lines_mirrored) {
-        offset_x_mirrored = num_elems - (offset_x + raster->source_width - 1) - 1;
+        offset_x_mirrored = (scene_width - 1) - (offset_x + raster->source_width - 1);
+        /* the extra offset is used to accomodate the the effect of sampling step
+         * greather than one in case of mirrored lines */
+        {
+            int extra_offset = raster->source_width - ((raster->raster_width - 1) * raster->source_step_x + 1);
+            offset_x_mirrored += extra_offset;
+        }
     } else {
         offset_x_mirrored = offset_x;
     }
-    */
 
     for (iY = offset_y; (uint)iY < offset_y + raster->source_height; iY += raster->source_step_y ) {
 
@@ -1013,7 +1026,7 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
 
         /*get the "line" of interpolated physical values from tie point data*/
         decode_tiepoint_band(line_beg_buffer, line_end_buffer,
-                             samples_per_tie_pt, num_elems, band_id, offset_x, scan_offset_x, y_mod,
+                             samples_per_tie_pt, num_elems, band_id, offset_x_mirrored, scan_offset_x, y_mod,
                              raster->source_width, raster->source_step_x, raster->buffer, raster_pos);
         /*locate "data point" for the next "line"*/
         raster_pos += delta_raster_pos;
diff --git a/src/epr_bitmask.c b/src/epr_bitmask.c
index c87038a..ddefa17 100644
--- a/src/epr_bitmask.c
+++ b/src/epr_bitmask.c
@@ -258,10 +258,13 @@ void epr_resolve_bm_ref(EPR_SBmEvalContext* context, EPR_SBmTerm* term) {
                                             context->bitmask_raster->source_height,
                                             context->bitmask_raster->source_step_x,
                                             context->bitmask_raster->source_step_y);
-            epr_read_band_raster(flag_band_id,
-                                 context->offset_x,
-                                 context->offset_y,
-                                 flag_raster);
+            if (epr_read_band_raster(flag_band_id,
+                                     context->offset_x,
+                                     context->offset_y,
+                                     flag_raster) != 0) {
+                return;
+            }
+
             /* register flag_band_id and flag_raster for later use */
             epr_add_ptr_array_elem(context->flag_band_ids, flag_band_id);
             epr_add_ptr_array_elem(context->flag_rasters, flag_raster);
@@ -373,8 +376,8 @@ EPR_SPtrArray* epr_create_flag_coding(EPR_SProductId* product_id, const char* fl
         /* 1: flag_name */
         epr_assign_string(&flag_def->name, fc_tables[fct_index].descriptors[i].id);
         if (flag_def->name == NULL) {
-            epr_set_err(e_err_out_of_memory, "epr_get_flag_coding: out of memory");
             epr_free_flag_def(flag_def);
+            epr_set_err(e_err_out_of_memory, "epr_get_flag_coding: out of memory");
             return NULL;
         }
         /* 2: dataset_name */
diff --git a/src/epr_core.c b/src/epr_core.c
index 247fa96..cc87ed0 100644
--- a/src/epr_core.c
+++ b/src/epr_core.c
@@ -235,7 +235,7 @@ void epr_set_err(EPR_EErrCode err_code, const char* err_message)
 }
 
 /*
-   Function:    epr_set_error
+   Function:    epr_clear_err
    Access:      public API implementation helper
    Changelog:   2002/01/05  mp initial version
  */
diff --git a/src/epr_dsd.c b/src/epr_dsd.c
index b1913ef..6a986a9 100644
--- a/src/epr_dsd.c
+++ b/src/epr_dsd.c
@@ -290,17 +290,17 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             /* DS_NAME to be searched for */
             if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_NAME_FIELD)) || ((uint)(strrchr(code_block, ch) - code_block) != (uint)(strlen(code_block) - 2)))
             {
+                epr_free_dsd(dsd);
                 epr_set_err(e_err_invalid_data_format,
                     "epr_read_each_dsd: invalid dataset name format");
-                epr_free_dsd(dsd);
                 return NULL;
             }
             dsd->ds_name = epr_sub_string(code_block, EPR_LENGTH_DS_NAME_IDENTIFIER, strlen(code_block) - EPR_LENGTH_DS_NAME_IDENTIFIER - 2);
             if (dsd->ds_name == NULL)
             {
+                epr_free_dsd(dsd);
                 epr_set_err(e_err_invalid_value,
                     "epr_read_each_dsd: invalid DS_NAME value");
-                epr_free_dsd(dsd);
                 return NULL;
             }
 
@@ -311,9 +311,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
                 dsd->ds_type = epr_sub_string(code_block, EPR_LENGTH_DS_TYPE_IDENTIFIER, strlen(code_block) - EPR_LENGTH_DS_TYPE_IDENTIFIER - 1);
                 if (dsd->ds_type == NULL)
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_value,
                         "epr_read_each_dsd: invalid DS_TYPE value");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
             }
@@ -324,17 +324,17 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             {
                 if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_FILENAME_FIELD)) || ((uint)(strrchr(code_block, ch) - code_block) != (uint)(strlen(code_block) - 2)))
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid dataset filename format");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
                 dsd->filename = epr_sub_string(code_block, EPR_LENGTH_FILENAME_IDENTIFIER, strlen(code_block) - EPR_LENGTH_FILENAME_IDENTIFIER - 1);
                 if (dsd->ds_name == NULL)
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid file name");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
             }
@@ -345,9 +345,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             {
                 if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_OFFSEN_FIELD)) || (strncmp(code_block + strlen(code_block) - strlen("<bytes>") - 1, "<bytes>", strlen("<bytes>")) != 0))
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid dataset filename format");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
 
@@ -356,9 +356,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
                 epr_free_string(tmp);
                 if (dsd->ds_offset == -1)
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid OFFSET value");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
             }
@@ -369,9 +369,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             {
                 if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_SIZE_FIELD)) || (strncmp(code_block + strlen(code_block) - strlen("<bytes>") - 1, "<bytes>", strlen("<bytes>")) != 0))
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid dataset filename format");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
                 tmp = epr_sub_string(code_block, EPR_LENGTH_DS_SIZE_IDENTIFIER, strlen(code_block) - strlen("<bytes>") - EPR_LENGTH_DS_SIZE_IDENTIFIER - 1);
@@ -379,9 +379,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
                 epr_free_string(tmp);
                 if (dsd->ds_size == -1)
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid OFFSET value");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
             }
@@ -392,9 +392,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             {
                 if ((uint)strlen(code_block) != (uint)(EPR_LENGTH_NUM_DSR_FIELD))
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid dataset record number format");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
                 tmp = epr_sub_string(code_block, EPR_LENGTH_NUM_DSR_IDENTIFIER, strlen(code_block) - EPR_LENGTH_NUM_DSR_IDENTIFIER - 1);
@@ -402,9 +402,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
                 epr_free_string(tmp);
                 if (dsd->num_dsr == -1)
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid dsr number value");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
             }
@@ -415,9 +415,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             {
                 if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DSR_SIZE_FIELD)) || (strncmp(code_block + strlen(code_block) - strlen("<bytes>") - 1, "<bytes>", strlen("<bytes>")) != 0))
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid dataset record size format");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
                 tmp = epr_sub_string(code_block, EPR_LENGTH_DSR_SIZE_IDENTIFIER, strlen(code_block) - strlen("<bytes>") - EPR_LENGTH_DSR_SIZE_IDENTIFIER - 1);
@@ -425,9 +425,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
                 epr_free_string(tmp);
                 if (dsd->dsr_size == -1)
                 {
+                    epr_free_dsd(dsd);
                     epr_set_err(e_err_invalid_data_format,
                         "epr_read_each_dsd: invalid record size value");
-                    epr_free_dsd(dsd);
                     return NULL;
                 }
             }
@@ -436,9 +436,9 @@ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos)
             fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file);
             if ((strlen(code_block) > 0) && (code_block[0] != ' '))
             {
+                epr_free_dsd(dsd);
                 epr_set_err(e_err_invalid_data_format,
                     "epr_read_each_dsd: invalid code_block, must be empty");
-                epr_free_dsd(dsd);
                 return NULL;
             }
             *pos = *pos + 1;
@@ -521,38 +521,36 @@ EPR_SPtrArray* epr_read_all_dsds(EPR_SProductId* product_id)
     /*dsd_begin = epr_api.epr_head_size - dsd_number * EPR_DSD_SIZE;*/
 
     if (fseek(product_id->istream, EPR_MPH_SIZE, SEEK_SET) != 0) {
-        epr_set_err(e_err_file_access_denied,
-            "epr_read_all_dsds: file seek failed");
         if (dsds_array != NULL) {
             epr_free_ptr_array(dsds_array);
         }
+        epr_set_err(e_err_file_access_denied,
+            "epr_read_all_dsds: file seek failed");
         return NULL;
     }
     field = epr_get_field(product_id->mph_record, "SPH_SIZE");
     sph_length = ((uint*) field->elems)[0];
     dsd_begin = EPR_MPH_SIZE + (uint)epr_find_first_dsd(product_id->istream, sph_length);
     if (dsd_begin == EPR_MPH_SIZE) {
-        epr_set_err(e_err_file_access_denied,
-            "epr_read_all_dsds: no DS_NAME in SPH");
         if (dsds_array != NULL) {
             epr_free_ptr_array(dsds_array);
         }
+        epr_set_err(e_err_file_access_denied,
+            "epr_read_all_dsds: no DS_NAME in SPH");
         return NULL;
     }
     for(dsd_index = 0; dsd_index < dsd_number; dsd_index ++) {
         if (fseek(product_id->istream, dsd_begin + dsd_index * EPR_DSD_SIZE, SEEK_SET) != 0) {
-            epr_set_err(e_err_file_access_denied,
-                "epr_read_all_dsds: file seek failed");
             if (dsds_array != NULL) {
                 epr_free_ptr_array(dsds_array);
             }
+            epr_set_err(e_err_file_access_denied,
+                "epr_read_all_dsds: file seek failed");
             return NULL;
         }
         code_block = epr_create_string(EPR_DSD_SIZE);
         numread = fread(code_block, 1, EPR_DSD_SIZE, product_id->istream);
         if ((uint)numread != EPR_DSD_SIZE) {
-            epr_set_err(e_err_file_read_error,
-                "epr_read_all_dsds: error in reading SPH from product data file");
             if (code_block != NULL) {
                 epr_free_string(code_block);
                 code_block = NULL;
@@ -560,6 +558,8 @@ EPR_SPtrArray* epr_read_all_dsds(EPR_SProductId* product_id)
             if (dsds_array != NULL) {
                 epr_free_ptr_array(dsds_array);
             }
+            epr_set_err(e_err_file_read_error,
+                "epr_read_all_dsds: error in reading SPH from product data file");
             return NULL;
         }
 
@@ -573,8 +573,6 @@ EPR_SPtrArray* epr_read_all_dsds(EPR_SProductId* product_id)
             dsd = epr_create_dsd(dsd_index);
 
             if (dsd == NULL) {
-                epr_set_err(e_err_out_of_memory,
-                    "epr_read_all_dsds: out of memory");
                 if (code_block != NULL) {
                     epr_free_string(code_block);
                     code_block = NULL;
@@ -588,6 +586,8 @@ EPR_SPtrArray* epr_read_all_dsds(EPR_SProductId* product_id)
                 if (dsds_array != NULL) {
                     epr_free_ptr_array(dsds_array);
                 }
+                epr_set_err(e_err_out_of_memory,
+                    "epr_read_all_dsds: out of memory");
                 return NULL;
             }
 
diff --git a/src/epr_msph.c b/src/epr_msph.c
index c0d64d1..b3df4aa 100644
--- a/src/epr_msph.c
+++ b/src/epr_msph.c
@@ -69,6 +69,7 @@ EPR_SRecord* epr_read_mph(EPR_SProductId* product_id)
         return NULL;
     }
     record = epr_parse_header("mph", code_block);
+    epr_free_string(code_block);
     if (record == NULL)
     {
         epr_set_err(e_err_invalid_record,
@@ -77,7 +78,6 @@ EPR_SRecord* epr_read_mph(EPR_SProductId* product_id)
         epr_add_ptr_array_elem(product_id->record_info_cache, record->info);
     }
 
-    epr_free_string(code_block);
     return record;
 }
 
@@ -143,6 +143,7 @@ EPR_SRecord* epr_read_sph(EPR_SProductId* product_id)
     }
 
     sph_record = epr_parse_header("sph", code_block);
+    epr_free_string(code_block);
     if (sph_record == NULL) {
         epr_set_err(e_err_invalid_record,
             "epr_read_sph: can not recognize the correct SPH from product data file");
@@ -150,7 +151,6 @@ EPR_SRecord* epr_read_sph(EPR_SProductId* product_id)
         epr_add_ptr_array_elem(product_id->record_info_cache, sph_record->info);
     }
 
-    epr_free_string(code_block);
     return sph_record;
 }
 
@@ -213,23 +213,23 @@ EPR_SRecord* epr_parse_header(const char* header_name, const char* ascii_source)
         pos = 0;
         token_name = epr_str_tok(code_block, seps, &pos);
         if (pos == 1) {
-            epr_set_err(e_err_invalid_keyword_name,
-                        "epr_parse_header: invalid ascii header: keyword is empty");
             epr_free_string(token_name);
             if (code_block != NULL) {
                 epr_free_string(code_block);
                 code_block = NULL;
             }
+            epr_set_err(e_err_invalid_keyword_name,
+                        "epr_parse_header: invalid ascii header: keyword is empty");
             continue;
         }
         if (pos == (int)strlen(code_block) + 1) {
-            epr_set_err(e_err_invalid_keyword_name,
-                        "epr_parse_header: invalid ascii header: keyword not found");
             epr_free_string(token_name);
             if (code_block != NULL) {
                 epr_free_string(code_block);
                 code_block = NULL;
             }
+            epr_set_err(e_err_invalid_keyword_name,
+                        "epr_parse_header: invalid ascii header: keyword not found");
             continue;
         }
         /*if STRING value*/
diff --git a/src/epr_param.c b/src/epr_param.c
index 4e59a56..5720890 100644
--- a/src/epr_param.c
+++ b/src/epr_param.c
@@ -141,25 +141,25 @@ int epr_set_dyn_dddb_params(EPR_SProductId* product_id)
         if (product_id->sph_record == NULL) {
             product_id->sph_record = epr_read_sph(product_id);
             if (product_id->sph_record == NULL) {
-                epr_set_err(e_err_file_read_error, "epr_set_param: wrong SPH");
                 epr_free_string(tmp);
+                epr_set_err(e_err_file_read_error, "epr_set_param: wrong SPH");
                 return 0;
             }
         }
 
         field = epr_get_field(product_id->sph_record, "LINE_LENGTH");
         if (field == NULL) {
+            epr_free_string(tmp);
             epr_set_err(e_err_invalid_value,
                 "epr_set_param: wrong SPH: unable to read LINE_LENGTH");
-            epr_free_string(tmp);
             return 0;
         }
 
         line_length = ((uint*) field->elems)[0];
         if (line_length == 0) {
+            epr_free_string(tmp);
             epr_set_err(e_err_invalid_value,
                 "epr_set_param: wrong SPH: LINE_LENGTH must be > 0");
-            epr_free_string(tmp);
             return 0;
         }
 
@@ -173,9 +173,9 @@ int epr_set_dyn_dddb_params(EPR_SProductId* product_id)
 
         num_tie_points_across = ((uint*) field->elems)[0];
         if (num_tie_points_across == 0) {
+            epr_free_string(tmp);
             epr_set_err(e_err_invalid_value,
                 "epr_set_param: wrong SPH: LINES_PER_TIE_PT must be > 0");
-            epr_free_string(tmp);
             return 0;
         }
 
@@ -197,17 +197,17 @@ int epr_set_dyn_dddb_params(EPR_SProductId* product_id)
 
         field = epr_get_field(product_id->sph_record, "LINE_LENGTH");
         if (field == NULL) {
+            epr_free_string(tmp);
             epr_set_err(e_err_invalid_value,
                 "epr_set_param: wrong SPH: unable to read LINE_LENGTH");
-            epr_free_string(tmp);
             return 0;
         }
 
         line_length = ((uint*) field->elems)[0];
         if (line_length == 0) {
+            epr_free_string(tmp);
             epr_set_err(e_err_invalid_value,
                 "epr_set_param: wrong SPH: LINE_LENGTH must be > 0");
-            epr_free_string(tmp);
             return 0;
         }
 
diff --git a/src/epr_product.c b/src/epr_product.c
index 9dac6c3..38ee205 100644
--- a/src/epr_product.c
+++ b/src/epr_product.c
@@ -104,9 +104,9 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
 
     /* Set file pointer to start of product identifier */
     if (fseek(product_id->istream, EPR_PRODUCT_ID_OFFSET, SEEK_SET) != 0) {
+        epr_close_product(product_id);
         epr_set_err(e_err_file_access_denied,
                     "epr_open_product: file seek failed");
-        epr_close_product(product_id);
         return NULL;
     }
 
@@ -114,9 +114,9 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
               1,
               EPR_PRODUCT_ID_STRLEN,
               product_id->istream) != (uint) EPR_PRODUCT_ID_STRLEN) {
+        epr_close_product(product_id);
         epr_set_err(e_err_file_access_denied,
                     "epr_open_product: file read failed");
-        epr_close_product(product_id);
         return NULL;
     }
 
@@ -125,9 +125,9 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
             (strncmp(EPR_ENVISAT_PRODUCT_ASAR,  product_id->id_string, 3) != 0) &&
             (strncmp(EPR_ENVISAT_PRODUCT_SAR,  product_id->id_string, 3) != 0) &&
             (strncmp(EPR_ENVISAT_PRODUCT_AATSR, product_id->id_string, 3) != 0)) {
+        epr_close_product(product_id);
         epr_set_err(e_err_invalid_product_id,
                     "epr_open_product: invalid product identifier");
-        epr_close_product(product_id);
         return NULL;
     }
 
@@ -144,18 +144,18 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
 
     /* Set file to end of file in order to determine file size */
     if (fseek(product_id->istream, 0, SEEK_END) != 0) {
+        epr_close_product(product_id);
         epr_set_err(e_err_file_access_denied,
                     "epr_open_product: file seek failed");
-        epr_close_product(product_id);
         return NULL;
     }
 
     /* Get file size */
     product_id->tot_size = (uint) ftell(product_id->istream);
     if (product_id->tot_size == (uint) -1) {
+        epr_close_product(product_id);
         epr_set_err(e_err_file_access_denied,
                     "epr_open_product: failed to determine file size");
-        epr_close_product(product_id);
         return NULL;
     }
     sprintf(message_buffer, "product size: %u", product_id->tot_size);
@@ -163,9 +163,9 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
 
     /* Set file pointer back to start */
     if (fseek(product_id->istream, 0, SEEK_SET) != 0) {
+        epr_close_product(product_id);
         epr_set_err(e_err_file_access_denied,
                     "epr_open_product: file seek failed");
-        epr_close_product(product_id);
         return NULL;
     }
 
@@ -187,9 +187,9 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
     product_id->dsd_array = epr_read_all_dsds(product_id);
     compare_ok = epr_compare_param(product_id);
     if (compare_ok == 0) {
+        epr_close_product(product_id);
         epr_set_err(e_err_invalid_value,
                     "epr_open_product: MPH_SIZE+SPH_SIZE must be equal to DSD[0].DS_OFFSET");
-        epr_close_product(product_id);
         return NULL;
     }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/epr-api.git



More information about the Pkg-grass-devel mailing list