summaryrefslogtreecommitdiffstats
path: root/conversion/test
diff options
context:
space:
mode:
Diffstat (limited to 'conversion/test')
-rw-r--r--conversion/test/Makefile142
-rw-r--r--conversion/test/test_bmp.cc83
-rw-r--r--conversion/test/test_convertor.cc276
-rw-r--r--conversion/test/test_hdf.cc309
-rw-r--r--conversion/test/test_jpeg.cc295
-rw-r--r--conversion/test/test_png.cc237
-rw-r--r--conversion/test/test_vff.cc169
7 files changed, 1511 insertions, 0 deletions
diff --git a/conversion/test/Makefile b/conversion/test/Makefile
new file mode 100644
index 0000000..410e1c4
--- /dev/null
+++ b/conversion/test/Makefile
@@ -0,0 +1,142 @@
+# -*-Makefile-*-
+#
+# This file is part of rasdaman community.
+#
+# Rasdaman community is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Rasdaman community is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with rasdaman community. If not, see <http://www.gnu.org/licenses/>.
+#
+# Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
+# rasdaman GmbH.
+#
+# For more information please see <http://www.rasdaman.org>
+# or contact Peter Baumann via <baumann@rasdaman.com>. # Top Level makefile. This points to the various modules that have to be build
+# and/or deployed
+#
+# MAKEFILE FOR:
+# test programs of module conversion
+#
+# COMMENTS:
+#
+##################################################################
+#
+# This is just an example Makefile for a test program.
+# The dependency of the test program on the lib of the
+# corresponding module is in the Makefile of the module.
+#
+
+######################### Definitions ############################
+
+# standard include with general options
+include $(RMANBASE)/Makefile.inc
+
+# all test programs
+ifeq ($(OSTYPE),linux-gnu)
+ALLTESTS = test_convertor test_png test_jpeg test_bmp test_vff
+else
+ALLTESTS = test_convertor test_hdf test_png test_jpeg test_bmp test_vff
+endif
+
+# For the time being: HDF includes / libs
+HDFBASE = $(SUPPORT_BASE)
+HDFINC = -I$(HDFBASE)/include
+HDFLIB = -L$(HDFBASE)/lib -ldf -ljpeg -lz -lmfhdf -lnsl
+
+ifeq ($(OSTYPE),linux-gnu)
+ LINKLIBS=$(CONVERSION) $(CLIENTCOMM) $(COMPRESSION) $(RASLIB) $(RASODMG)
+ CLIENTLDFLAGS += -lz
+else
+ ifdef RMANGCC
+ LINKLIBS=$(CONVERSION) $(CLIENTCOMM) $(COMPRESSION) $(RASLIB) $(RASODMG)
+ CLIENTLDFLAGS += -lsocket -lnsl -lz
+ else
+ LINKLIBS=$(CONVERSION) $(RASLIB)
+ endif
+endif
+
+########################### Targets ##############################
+
+# test target for convertors like r_TIFF
+.PHONY : convertor
+convertor: test_module $(ALLTESTS)
+
+.PHONY : test_module
+test_module:
+ cd $(RMANBASE)/conversion; $(MAKE)
+
+.PHONY : tiff
+tiff: test_module test_convertor
+
+.PHONY : hdf
+hdf: test_module test_hdf
+
+.PHONY : png
+png: test_module test_png
+
+.PHONY : jpeg
+jpeg: test_module test_jpeg
+
+.PHONY : bmp
+bmp: test_module test_bmp
+
+.PHONY : vff
+vff: test_module test_vff
+
+
+test_convertor: test_convertor.o $(LINKLIBS)
+ $(PURIFY) $(CXX) $(CLIENTLDFLAGS) -o $@ $^ -L$(SUPPORT_BASE)/lib -ltiff -ljpeg -lz -lcrypto
+
+test_hdf: test_hdf.o $(LINKLIBS)
+ $(PURIFY) $(CXX) $(CLIENTLDFLAGS) -o $@ $^ -L$(SUPPORT_BASE)/lib -lcrypto -lz $(HDFLIB)
+
+test_png: test_png.o $(LINKLIBS)
+ $(PURIFY) $(CXX) $(CLIENTLDFLAGS) -o $@ $^ -L$(SUPPORT_BASE)/lib -lpng -lz -lcrypto
+
+test_jpeg: test_jpeg.o $(LINKLIBS)
+ $(PURIFY) $(CXX) $(CLIENTLDFLAGS) -o $@ $^ -L$(SUPPORT_BASE)/lib -ljpeg -lz -lcrypto
+
+test_bmp: test_bmp.o $(LINKLIBS)
+ $(PURIFY) $(CXX) $(CLIENTLDFLAGS) -o $@ $^ -L$(SUPPORT_BASE)/lib -lcrypto -lz
+
+test_vff: test_vff.o $(LINKLIBS)
+ $(PURIFY) $(CXX) $(CLIENTLDFLAGS) -o $@ $^ -L$(SUPPORT_BASE)/lib -lcrypto -lz
+
+
+.PHONY : clean
+clean:
+ -rm $(ALLTESTS)
+ -rm *.o
+
+# deletes all non modified, but checked out files
+.PHONY : rcsclean
+rcsclean:
+ -rcsclean
+
+######################## Dependencies ############################
+
+test_convertor.o: test_convertor.cc
+ $(CXX) test_convertor.cc -c -o $@ $(CLIENTCXXFLAGS)
+
+test_hdf.o: test_hdf.cc
+ $(CXX) test_hdf.cc -c -o $@ $(HDFINC) $(CLIENTCXXFLAGS)
+
+test_png.o: test_png.cc
+ $(CXX) test_png.cc -c -o $@ $(CLIENTCXXFLAGS)
+
+test_jpeg.o: test_jpeg.cc
+ $(CXX) test_jpeg.cc -c -o $@ $(CLIENTCXXFLAGS)
+
+test_bmp.o: test_bmp.cc
+ $(CXX) test_bmp.cc -c -o $@ $(CLIENTCXXFLAGS)
+
+test_vff.o: test_vff.cc
+ $(CXX) test_vff.cc -c -o $@ $(CLIENTCXXFLAGS)
diff --git a/conversion/test/test_bmp.cc b/conversion/test/test_bmp.cc
new file mode 100644
index 0000000..c98712e
--- /dev/null
+++ b/conversion/test/test_bmp.cc
@@ -0,0 +1,83 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <iostream>
+#include <string.h>
+
+
+#include "conversion/convertor.hh"
+#include "conversion/bmp.hh"
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#include "raslib/template_inst.hh"
+#endif
+
+int main(int argc, char *argv[])
+{
+ char filename[256] = "Somewhere.bmp";
+ long fsize=0;
+ FILE *fp=NULL;
+ char *data=NULL;
+ r_Minterval interv(1);
+ r_Minterval imgInterv;
+ r_Conv_BMP *bmp=NULL;
+ r_convDesc desc;
+ r_Type *baseType=NULL;
+ char *imgData=NULL;
+
+ if (argc > 1)
+ strcpy(filename, argv[1]);
+
+ fp = fopen(filename, "rb");
+ if (fp == NULL)
+ {
+ cerr << "Unable to open file " << filename << endl;
+ exit(-1);
+ }
+
+ fseek(fp, 0, SEEK_END);
+ fsize = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ data = new char[fsize];
+ fread(data, 1, fsize, fp);
+ fclose(fp);
+
+ interv << r_Sinterval((r_Range)0, (r_Range)fsize-1);
+
+ cout << "Convert from BMP..." << endl;
+ bmp = new r_Conv_BMP(data, interv, r_Convertor::ctype_char);
+ desc = bmp->convertFrom();
+ baseType = desc.destType;
+ imgData = desc.dest;
+ imgInterv = desc.destInterv;
+ delete [] data;
+ data=NULL;
+ delete bmp;
+ bmp=NULL;
+
+ cout << "Convert to BMP..." << endl;
+ bmp = new r_Conv_BMP(imgData, imgInterv, baseType);
+ desc = bmp->convertTo("compress=1");
+ fsize = desc.destInterv[0].high() - desc.destInterv[0].low() + 1;
+
+ fp = fopen("result.bmp", "wb");
+ fwrite(desc.dest, 1, fsize, fp);
+ fclose(fp);
+
+ free(desc.dest);
+ desc.dest=NULL;
+ delete desc.destType;
+ desc.destType=NULL;
+ delete bmp;
+ bmp=NULL;
+
+ cout << "Clean up..." << endl;
+
+ delete baseType;
+ baseType=NULL;
+ free(imgData);
+ imgData=NULL;
+
+ return 0;
+}
diff --git a/conversion/test/test_convertor.cc b/conversion/test/test_convertor.cc
new file mode 100644
index 0000000..9305278
--- /dev/null
+++ b/conversion/test/test_convertor.cc
@@ -0,0 +1,276 @@
+#include <iostream>
+#include <stdio.h>
+#include <string.h>
+#include "conversion/convertor.hh"
+#include "conversion/tiff.hh"
+#include "raslib/rminit.hh"
+#include "rasodmg/gmarray.hh"
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#include "raslib/template_inst.hh"
+#endif
+
+// define if you want to use r_Type variables to set the
+// array type.
+//#define TEST_CONV_USE_RTYPES
+
+
+void ConvertToTIFFCore(r_Conv_TIFF *tiff, const char *save, const char *params)
+{
+ r_convDesc desc;
+ FILE *tfile;
+ long size;
+
+ try
+ {
+ // desc will become invalid when the TIFF object is deleted.
+ // The same applies to all data allocated by the TIFF object,
+ // e.g. the buffer holding the resulting TIFF.
+ desc = tiff->convertTo(params);
+
+ size = (long)(desc.destInterv[0].high() - desc.destInterv[0].low() + 1);
+ if ((tfile = fopen(save, "wb")) == NULL)
+ {
+ cerr << "Error opening file " << save << endl;
+ }
+ else
+ {
+ fwrite((void*)(desc.dest), (size_t)1, (size_t)size, tfile);
+ fclose(tfile);
+ }
+ cout << "test_convertor: r_Conv_TIFF::convertTo successful. "
+ << "size = " << size << ", type = ";
+ desc.destType->print_status(cout); cout << endl;
+ // This is the job of the client!
+ free(desc.dest);
+ delete desc.destType;
+ }
+ catch (r_Error &err)
+ {
+ cout << "An error occurred: " << err.what() << endl;
+ }
+}
+
+
+void ConvertToTIFF(char *data, r_Minterval &iv, r_Type *type, const char *save, const char *params)
+{
+ r_Conv_TIFF *tiff;
+
+ cout << "test_convertor (r_Type): ";
+ if (type)
+ {
+ cout << "Base Type is "; type->print_status(cout); cout << endl;
+ }
+ else
+ {
+ cout << "Base type not defined!" << endl;
+ }
+
+ tiff = new r_Conv_TIFF(data, iv, type);
+ ConvertToTIFFCore(tiff, save, params);
+ delete tiff;
+}
+
+
+void ConvertToTIFF(char *data, r_Minterval &iv, int type, const char *save, const char *params)
+{
+ r_Conv_TIFF *tiff;
+
+ cout << "test_convertor (int):" << endl;
+
+ tiff = new r_Conv_TIFF(data, iv, type);
+ ConvertToTIFFCore(tiff, save, params);
+ delete tiff;
+}
+
+
+void ConvertFromTIFF(char *name, const char *params, const char *save_as = NULL)
+{
+ FILE *fp;
+ long size;
+ r_convDesc desc;
+ r_Conv_TIFF *tiff;
+ char *data;
+ r_Minterval iv;
+
+ fp = fopen(name, "r");
+ fseek(fp, 0, SEEK_END);
+ size = ftell(fp);
+ data = new char[size];
+ fseek(fp, 0, SEEK_SET);
+ fread((void*)data, (size_t)1, (size_t)size, fp);
+ fclose(fp);
+
+ // Set interval
+ iv = r_Minterval(1); iv << r_Sinterval(r_Range(0), r_Range(size - 1));
+
+ // Base type is coded in TIFF
+ tiff = new r_Conv_TIFF(data, iv, (int)0);
+
+ desc = tiff->convertFrom();
+
+ cout << "test_convertor: r_Conv_TIFF::convertFrom successful."
+ << " domain = " << desc.destInterv << ", type = ";
+ desc.destType->print_status(cout); cout << endl;
+
+ delete [] data;
+
+ // save file again as TIFF to check convertFrom validity?
+ if (save_as != NULL)
+ {
+ cout << "test_convertor: Saving data again as <" << save_as << ">..." << endl;
+ ConvertToTIFF(desc.dest, desc.destInterv, desc.baseType, save_as, params);
+ }
+
+ // The order in which objects are deleted is important!
+ free(desc.dest);
+ delete desc.destType;
+
+ // Delete this last. From then on desc is invalid.
+ delete tiff;
+}
+
+
+
+// Flag bits for main()
+#define CONVERTOR_WRITE_BACK 1
+
+
+// Calling convention: test_convertor [-x # -y # -c <compression> -v -h]
+// Where -x: width, -y: height, -c: compression, -v: write again as TIFF after reading
+// -h: Help on usage
+// width, height default to 200, 100
+int main (int argc, char *argv[])
+{
+ r_GMarray dummyArray; // need this for linking on Linux, don't know why
+ char *data, *lineBase, *line;
+ int width = 200, height = 100;
+ unsigned int flags = 0;
+ int i, j;
+ char params[256];
+ const char *paramptr = NULL;
+#ifdef TEST_CONV_USE_RTYPES
+ r_Type *type;
+#endif
+ struct nametable {char *write, *verify;} tiffnames[] = {
+ {"grey.tif", "grey2.tif"},
+ {"bool.tif", "bool2.tif"},
+ {"rgb.tif", "rgb2.tif"}
+ };
+
+ i = 1;
+ while (i < argc)
+ {
+ if (argv[i][0] == '-')
+ {
+ switch (argv[i][1])
+ {
+ case 'x': width = atoi(argv[++i]); break;
+ case 'y': height = atoi(argv[++i]); break;
+ case 'c':
+ sprintf(params, "comptype=%s", argv[++i]);
+ paramptr = params;
+ break;
+ case 'v': flags |= CONVERTOR_WRITE_BACK; break;
+ case 'h':
+ cout << "Usage: " << argv[0] << "[-w # -h # -c <string> -v -h]" << endl;
+ cout << "\t-x #: width" << endl;
+ cout << "\t-y #: height" << endl;
+ cout << "\t-c <string>: compression (see r_Conv_TIFF::compNames)" << endl;
+ cout << "\t-v: write the TIFF files just read back as TIFF files for verifying" << endl;
+ cout << "\t-h: this help" << endl;
+ exit(0);
+ default: cout << "Bad switch -" << argv[i][1] << endl; break;
+ }
+ }
+ i++;
+ }
+
+ cout << "test_convertor: use images of size " << width << " * " << height
+ << ", compression: ";
+
+ // Allocate enough room for _all_ types of data.
+ if ((data = new char[3*width*height]) == NULL)
+ {
+ cout << "Out of memory error!" << endl; exit(0);
+ }
+
+ r_Minterval iv(2);
+ iv << r_Sinterval(r_Range(0), r_Range(width - 1))
+ << r_Sinterval(r_Range(0), r_Range(height - 1));
+
+ // Take into account that MDD arrays are transposed compared to
+ // images!
+ cout << "Greyscale:" << endl;
+ lineBase = data;
+ for (j=0; j<height; j++, lineBase++)
+ {
+ line = lineBase;
+ for (i=0; i<width; i++, line += height)
+ {
+ *line = (char)((i+j) & 0xff);
+ }
+ }
+
+#ifdef TEST_CONV_USE_RTYPES
+ type = r_Type::get_base_type("char");
+ ConvertToTIFF(data, iv, type, tiffnames[0].write, paramptr);
+ delete type;
+#else
+ ConvertToTIFF(data, iv, (int)(r_Convertor::ctype_char), tiffnames[0].write, paramptr);
+#endif
+
+ cout << "Bitmap:" << endl;
+ lineBase = data;
+ for (j=0; j<height; j++, lineBase++)
+ {
+ line = lineBase;
+ for (i=0; i<width; i++, line += height)
+ {
+ *line = (char)((i + j) & 1);
+ }
+ }
+
+#ifdef TEST_CONV_USE_RTYPES
+ type = r_Type::get_base_type("boolean");
+ ConvertToTIFF(data, iv, type, tiffnames[1].write, paramptr);
+ delete type;
+#else
+ ConvertToTIFF(data, iv, (int)(r_Convertor::ctype_bool), tiffnames[1].write, paramptr);
+#endif
+
+ cout << "RGB:" << endl;
+ lineBase = data;
+ for (j=0; j<height; j++, lineBase += 3)
+ {
+ line = lineBase;
+ for (i=0; i<width; i++, line += 3*height)
+ {
+ line[0] = ((i+j) & 0xff); line [1] = ((0xff - (i+j)) & 0xff);
+ line[2] = (((i+j) >> 1) & 0xff);
+ }
+ }
+
+#ifdef TEST_CONV_USE_RTYPES
+ type = r_Type::get_base_type("struct{ char red, char green, char blue }");
+ ConvertToTIFF(data, iv, type, tiffnames[2].write, paramptr);
+ delete type;
+#else
+ ConvertToTIFF(data, iv, (int)(r_Convertor::ctype_rgb), tiffnames[2].write, paramptr);
+#endif
+
+ delete [] data;
+
+ // Try the other way around: convert from TIFF
+ ConvertFromTIFF("rgb.tif", paramptr,
+ ((flags & CONVERTOR_WRITE_BACK) != 0) ? tiffnames[2].verify : NULL);
+
+ ConvertFromTIFF("bool.tif", paramptr,
+ ((flags & CONVERTOR_WRITE_BACK) != 0) ? tiffnames[1].verify : NULL);
+
+ ConvertFromTIFF("grey.tif", paramptr,
+ ((flags & CONVERTOR_WRITE_BACK) != 0) ? tiffnames[0].verify : NULL);
+
+ return 0;
+}
diff --git a/conversion/test/test_hdf.cc b/conversion/test/test_hdf.cc
new file mode 100644
index 0000000..a11b98a
--- /dev/null
+++ b/conversion/test/test_hdf.cc
@@ -0,0 +1,309 @@
+#include "conversion/convertor.hh"
+#include "conversion/hdf.hh"
+#include "raslib/minterval.hh"
+#include "raslib/primitivetype.hh"
+
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#include "raslib/template_inst.hh"
+#endif
+
+char *TypeIDToName(int tpid)
+{
+ switch (tpid)
+ {
+ case r_Primitive_Type::BOOL: return "bool"; break;
+ case r_Primitive_Type::CHAR: return "char"; break;
+ case r_Primitive_Type::OCTET: return "octet"; break;
+ case r_Primitive_Type::SHORT: return "short"; break;
+ case r_Primitive_Type::USHORT: return "ushort"; break;
+ case r_Primitive_Type::LONG: return "long"; break;
+ case r_Primitive_Type::ULONG: return "ulong"; break;
+ case r_Primitive_Type::FLOAT: return "float"; break;
+ case r_Primitive_Type::DOUBLE: return "double"; break;
+ default: return"?"; break;
+ }
+}
+
+
+int TestHDF(r_Minterval &domain, r_Type *tp, const char *params=NULL)
+{
+ r_Primitive_Type *prim;
+ char *src, *dest;
+ r_Minterval destInterv;
+ r_Conv_HDF *hdf;
+ r_Type *destType;
+ r_convDesc desc;
+ int i, j, k;
+ int rank, array_size, datasize;
+ int *dimsizes, *dimsteps, *dimidx;
+ char **srcPtrs;
+ int ptid, retid;
+
+ if (tp->isStructType())
+ {
+ cerr << "No structured types allowed!" << endl;
+ return -1;
+ }
+ prim = (r_Primitive_Type*)tp;
+ ptid = prim->type_id();
+ cout << "Source domain = " << domain << ", type = " << TypeIDToName(ptid) << endl;
+
+ switch (ptid)
+ {
+ case r_Primitive_Type::BOOL:
+ case r_Primitive_Type::CHAR:
+ case r_Primitive_Type::OCTET:
+ datasize = 1; break;
+ case r_Primitive_Type::SHORT:
+ case r_Primitive_Type::USHORT:
+ datasize = 2; break;
+ case r_Primitive_Type::LONG:
+ case r_Primitive_Type::ULONG:
+ case r_Primitive_Type::FLOAT:
+ datasize = 4; break;
+ case r_Primitive_Type::DOUBLE:
+ datasize = 8; break;
+ default:
+ cerr << "Unrecognized base type" << endl;
+ return -1;
+ }
+
+ rank = domain.dimension();
+ dimsizes = new int[rank]; dimsteps = new int[rank]; dimidx = new int[rank];
+ srcPtrs = new char*[rank];
+ for (i=0; i<rank; i++)
+ {
+ dimsizes[i] = domain[i].high() - domain[i].low() + 1;
+ dimidx[i] = 0;
+ }
+ array_size = datasize;
+ for (i=rank-1; i>=0; i--)
+ {
+ dimsteps[i] = array_size; array_size *= dimsizes[i];
+ }
+ src = new char[array_size];
+
+ for (i=0; i<rank; i++) srcPtrs[i] = src;
+
+ k = 0;
+ do
+ {
+ //cout << (int)(srcPtrs[0] - src) << endl;
+
+ // A bit inefficient, but customized code for the entire loop for each type
+ // would result in way too much code for testing purposes only.
+ switch (ptid)
+ {
+ case r_Primitive_Type::BOOL:
+ case r_Primitive_Type::CHAR:
+ case r_Primitive_Type::OCTET:
+ *((char*)srcPtrs[0]) = (char)k;
+ break;
+ case r_Primitive_Type::SHORT:
+ case r_Primitive_Type::USHORT:
+ *((short*)srcPtrs[0]) = (short)k;
+ break;
+ case r_Primitive_Type::LONG:
+ case r_Primitive_Type::ULONG:
+ *((long*)srcPtrs[0]) = (long)k;
+ break;
+ case r_Primitive_Type::FLOAT:
+ *((float*)srcPtrs[0]) = (float)k;
+ break;
+ case r_Primitive_Type::DOUBLE:
+ *((double*)srcPtrs[0]) = (double)k;
+ break;
+ default: break;
+ }
+ k++; i = 0;
+ do
+ {
+ dimidx[i]++;
+ if (dimidx[i] < dimsizes[i]) break;
+ dimidx[i] = 0; i++;
+ }
+ while (i < rank);
+ if (i < rank)
+ {
+ srcPtrs[i] += dimsteps[i];
+ if (i > 0)
+ {
+ // Init the array with the value x_0 + x_1 + ... + x_(n-1)
+ k = dimidx[0];
+ for (j=1; j<rank; j++) k += dimidx[j];
+ for (j=i; j>0; j--) {srcPtrs[j-1] = srcPtrs[j];;}
+ }
+ }
+ }
+ while (i < rank);
+
+ hdf = new r_Conv_HDF(src, domain, tp);
+
+ dest = NULL;
+
+ try
+ {
+ desc = hdf->convertTo(params);
+ dest = desc.dest;
+ destInterv = desc.destInterv;
+ destType = desc.destType;
+ }
+ catch(r_Error &err)
+ {
+ cerr << "Exception! " << err.what() << endl;
+ }
+
+ cout << "Encoded interval " << desc.destInterv << endl;
+
+ delete hdf;
+
+ if (dest != NULL)
+ {
+ try
+ {
+ hdf = new r_Conv_HDF(dest, destInterv, destType);
+
+ desc = hdf->convertFrom();
+
+ cout << "retrieved type = "; desc.destType->print_status();
+ retid = ((r_Primitive_Type*)(desc.destType))->type_id();
+ cout << ", (" << ((retid == ptid) ? "OK" : "Differs") << ')' << endl;
+ cout << "retrieved domain " << desc.destInterv << ' ';
+ i = 0;
+ if (desc.destInterv.dimension() == rank)
+ {
+ for (i=0; i<rank; i++)
+ {
+ if (desc.destInterv[i].high() - desc.destInterv[i].low() != domain[i].high() - domain[i].low())
+ break;
+ }
+ }
+ if (i < rank)
+ {
+ cout << "Incompatible!" << endl;
+ return -1;
+ }
+ cout << "(OK)" << endl;
+
+ for (i=0; i<array_size; i++)
+ {
+ if (src[i] != desc.dest[i]) break;
+ }
+ if (i == array_size)
+ {
+ cout << "Data identical" << endl;
+ }
+ else
+ {
+ cout << "Data differs at " << i << endl;
+ }
+
+ cout << endl;
+
+ delete destType;
+ delete desc.destType;
+
+ free(desc.dest); // HDF^-1 ( HDF (X) )
+ }
+ catch(r_Error &err)
+ {
+ cerr << "Exception! " << err.what() << endl;
+ }
+ }
+
+ delete hdf;
+
+ if (dest != NULL)
+ free(dest); // HDF (X)
+
+ delete [] src; // X
+
+ delete [] dimsizes; delete [] dimsteps; delete [] dimidx; delete [] srcPtrs;
+
+ // Delete the base type passed from the caller too
+ delete tp;
+
+ return 0;
+}
+
+
+
+
+
+int main(int argc, char *argv[])
+{
+ r_Minterval interv;
+ r_Type *tp;
+
+ // 3D data set over char
+ interv = r_Minterval(3);
+ interv << r_Sinterval(r_Range(0), r_Range(19))
+ << r_Sinterval(r_Range(0), r_Range(29))
+ << r_Sinterval(r_Range(0), r_Range(39));
+ tp = r_Type::get_any_type("char");
+ TestHDF(interv, tp);
+
+ // 2D data set over short
+ interv = r_Minterval(2);
+ interv << r_Sinterval(r_Range(0), r_Range(100))
+ << r_Sinterval(r_Range(0), r_Range(200));
+ tp = r_Type::get_any_type("short");
+ TestHDF(interv, tp);
+
+ // 1D data set over long
+ interv = r_Minterval(1);
+ interv << r_Sinterval(r_Range(0), r_Range(400));
+ tp = r_Type::get_any_type("long");
+ TestHDF(interv, tp);
+
+ // 2D data set over float
+ interv = r_Minterval(2);
+ interv << r_Sinterval(r_Range(0), r_Range(200))
+ << r_Sinterval(r_Range(0), r_Range(300));
+ tp = r_Type::get_any_type("float");
+ TestHDF(interv, tp);
+
+ // 2D data set over double
+ interv = r_Minterval(2);
+ interv << r_Sinterval(r_Range(100), r_Range(300))
+ << r_Sinterval(r_Range(100), r_Range(400));
+ tp = r_Type::get_any_type("double");
+ TestHDF(interv, tp);
+
+ // 1D data set over octet
+ interv = r_Minterval(1);
+ interv << r_Sinterval(r_Range(0), r_Range(200));
+ tp = r_Type::get_any_type("octet");
+ TestHDF(interv, tp);
+
+ // 1D data set over bool
+ interv = r_Minterval(1);
+ interv << r_Sinterval(r_Range(0), r_Range(200));
+ tp = r_Type::get_any_type("boolean");
+ TestHDF(interv, tp);
+
+ // 1D data set over unsigned short
+ interv = r_Minterval(1);
+ interv << r_Sinterval(r_Range(0), r_Range(200));
+ tp = r_Type::get_any_type("ushort");
+ TestHDF(interv, tp);
+
+ // 1D data set over unsigned long
+ interv = r_Minterval(1);
+ interv << r_Sinterval(r_Range(0), r_Range(200));
+ tp = r_Type::get_any_type("ulong");
+ TestHDF(interv, tp);
+
+ // 4D data set over char
+ interv = r_Minterval(4);
+ interv << r_Sinterval(r_Range(100), r_Range(149))
+ << r_Sinterval(r_Range(110), r_Range(184))
+ << r_Sinterval(r_Range(120), r_Range(219))
+ << r_Sinterval(r_Range(130), r_Range(204));
+ tp = r_Type::get_any_type("char");
+ TestHDF(interv, tp);
+
+ return 0;
+}
diff --git a/conversion/test/test_jpeg.cc b/conversion/test/test_jpeg.cc
new file mode 100644
index 0000000..e56a3d4
--- /dev/null
+++ b/conversion/test/test_jpeg.cc
@@ -0,0 +1,295 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <iostream>
+#include <string.h>
+#include <math.h>
+
+
+#include "conversion/convertor.hh"
+#include "conversion/jpeg.hh"
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#include "raslib/template_inst.hh"
+#endif
+
+static int init_identity(int offset)
+{
+ return offset;
+}
+
+static int init_square(int offset)
+{
+ return offset * offset;
+}
+
+static int SinTabOK = 0;
+static int SinusTable[512];
+
+static int init_sine(int offset)
+{
+ if (SinTabOK == 0)
+ {
+ int i;
+
+ for (i=0; i<512; i++)
+ {
+ SinusTable[i] = (int)(255*sin(M_PI * offset / 512.0));
+ }
+ SinTabOK = 1;
+ }
+ return SinusTable[offset & 511];
+}
+
+static int JpegErrorFileNumber;
+
+int test_picture(int width, int height, int bpp, const char *params, int (*init)(int))
+{
+ char *data;
+ r_Minterval interv(2);
+ int datasize;
+ int baseType;
+ int bytespp;
+ int i;
+
+ switch (bpp)
+ {
+ case 1: baseType = r_Convertor::ctype_bool; bytespp = 1; break;
+ case 8: baseType = r_Convertor::ctype_char; bytespp = 1; break;
+ case 24: baseType = r_Convertor::ctype_rgb; bytespp = 3; break;
+ default:
+ cerr << "Unknown bpp value " << bpp << endl;
+ return -1;
+ }
+
+ interv << r_Sinterval((r_Range)0, (r_Range)width-1)
+ << r_Sinterval((r_Range)0, (r_Range)height-1);
+
+ datasize = (width * bytespp * height);
+ data = new char[datasize];
+
+ cout << "Test: bpp = " << bpp << ", domain = " << interv << ", params = " << ((params == NULL) ? "" : params) << ", size = " << datasize << endl;
+
+ if (bpp > 1)
+ {
+ for (i=0; i<datasize; i++) data[i] = (char)init(i);
+ }
+ else
+ {
+ int j, count;
+
+ for (i=0; i<datasize; i+=8)
+ {
+ count = datasize - i; if (count > 8) count = 8;
+ for (j=0; j<count; j++) data[i+j] = ((init(i>>3) & (1<<j)) == 0) ? 0 : 1;
+ }
+ }
+
+ r_Conv_JPEG *jpeg = NULL;
+ char *dest = NULL;
+
+ try
+ {
+ r_convDesc desc;
+ int destsize;
+ int status = 0;
+
+ jpeg = new r_Conv_JPEG(data, interv, baseType);
+ desc = jpeg->convertTo(params);
+ destsize = desc.destInterv[0].high() - desc.destInterv[0].low() + 1;
+ cout << "\tConverted to JPEG, domain " << desc.destInterv << endl;
+ dest = desc.dest;
+ r_Minterval destInterv(desc.destInterv);
+ delete desc.destType;
+ delete jpeg;
+ jpeg = new r_Conv_JPEG(dest, destInterv, r_Convertor::ctype_char);
+ desc = jpeg->convertFrom();
+ cout << "\tConverted from JPEG, domain " << desc.destInterv << endl;
+
+ if (interv == desc.destInterv)
+ {
+ unsigned char *b, *d;
+ double totalError;
+ unsigned char maxError;
+ int i;
+
+ // Bitmaps get expanded to greyscale...
+ if (baseType == r_Convertor::ctype_bool)
+ {
+ for (i=0; i<datasize; i++)
+ {
+ if (data[i] != 0) data[i] = 0xff;
+ }
+ }
+
+ b = (unsigned char*)data; d = (unsigned char*)desc.dest;
+ totalError = 0.0; maxError = abs(*b - *d);
+ for (i=0; i<datasize; i++)
+ {
+ b[i] = abs(b[i] - d[i]);
+ if (b[i] > maxError) maxError = b[i];
+ totalError += (double)(b[i]);
+ }
+
+ r_Conv_JPEG *errpeg;
+ r_convDesc cdsc;
+ char errfile[256];
+ FILE *fp;
+ int errType;
+
+ errType = (baseType == r_Convertor::ctype_bool) ? r_Convertor::ctype_char : baseType;
+ sprintf(errfile, "jerror%d.jpg", JpegErrorFileNumber++);
+ cout << "\tCreating error file <" << errfile << "> ..." << endl;
+ cout << "\t(max error = " << (int)maxError << ", avg error = "
+ << totalError / (double)datasize << ")" << endl;
+
+ errpeg = new r_Conv_JPEG(data, interv, errType);
+ cdsc = errpeg->convertTo("quality=90");
+ i = (int)(cdsc.destInterv[0].high() - cdsc.destInterv[0].low() + 1);
+ if ((fp = fopen(errfile, "wb")) == NULL)
+ {
+ cerr << "\tUnable to open output file!" << endl;
+ }
+ else
+ {
+ fwrite(cdsc.dest, 1, i, fp);
+ fclose(fp);
+ }
+ delete cdsc.destType;
+ free(cdsc.dest);
+ delete errpeg;
+ }
+ else
+ {
+ cout << "\t Domain differs!!!" << endl;
+ status = -1;
+ }
+
+ delete jpeg;
+ delete [] data;
+ free(dest);
+ free(desc.dest);
+ delete desc.destType;
+
+ return status;
+ }
+ catch (r_Error &err)
+ {
+ cerr << "Error: " << err.what() << endl;
+
+ delete [] data;
+ if (dest != NULL) delete [] dest;
+ if (jpeg != NULL) delete jpeg;
+
+ return -1;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ int i;
+ char jpegfile[256] = "";
+ char params[256];
+ const char *paramptr = NULL;
+
+ i = 1;
+ while (i < argc)
+ {
+ if (strcmp(argv[i], "-file") == 0)
+ {
+ strcpy(jpegfile, argv[++i]);
+ }
+ else if (strcmp(argv[i], "-quality") == 0)
+ {
+ sprintf(params, "quality=%s", argv[++i]);
+ paramptr = params;
+ }
+ i++;
+ }
+
+ if (jpegfile[0] == '\0')
+ {
+ JpegErrorFileNumber = 0;
+ test_picture(400, 300, 1, paramptr, init_identity);
+ test_picture(400, 300, 8, paramptr, init_identity);
+ test_picture(400, 300, 24, paramptr, init_identity);
+ test_picture(701, 333, 1, paramptr, init_square);
+ test_picture(701, 333, 8, paramptr, init_square);
+ test_picture(701, 333, 24, paramptr, init_square);
+ test_picture(3007, 3999, 1, paramptr, init_sine);
+ test_picture(3007, 3999, 8, paramptr, init_sine);
+ test_picture(3007, 3999, 24, paramptr, init_sine);
+ }
+ else
+ {
+ FILE *fp;
+ long fileSize;
+ char *data = NULL;
+ char *cdata = NULL;
+ r_convDesc desc;
+ r_Type *baseType;
+ r_Conv_JPEG *jpeg;
+
+ if ((fp = fopen(jpegfile, "rb")) == NULL)
+ {
+ cerr << "Unable to open input file" << endl;
+ return -1;
+ }
+ fseek(fp, 0, SEEK_END); fileSize = ftell(fp); fseek(fp, 0, SEEK_SET);
+ data = new char[fileSize];
+ fread(data, 1, fileSize, fp);
+ fclose(fp);
+
+ jpeg = NULL; baseType = NULL;
+ try
+ {
+ r_Minterval interv(1);
+ interv << r_Sinterval((r_Range)0, (r_Range)fileSize-1);
+
+ jpeg = new r_Conv_JPEG(data, interv, 0);
+ cout << "Converting file <" << jpegfile << "> to MDD..." << endl;
+ desc = jpeg->convertFrom();
+
+ r_Minterval imgInterv(desc.destInterv);
+ delete [] data; data = NULL;
+ cdata = desc.dest;
+ baseType = desc.destType;
+ delete jpeg;
+
+ cout << "Resulting domain " << imgInterv << ", ";
+ baseType->print_status();
+ cout << endl;
+
+ jpeg = new r_Conv_JPEG(cdata, imgInterv, baseType);
+ cout << "Converting MDD back to JPEG..." << endl;
+ desc = jpeg->convertTo(paramptr);
+ free(cdata);
+ cdata = desc.dest;
+
+ cout << "Resulting domain " << desc.destInterv << ", ";
+ desc.destType->print_status();
+ cout << endl;
+
+ fp = fopen("result.jpg", "wb");
+ fileSize = desc.destInterv[0].high() - desc.destInterv[0].low() + 1;
+ fwrite(cdata, 1, fileSize, fp);
+ fclose(fp);
+
+ delete baseType;
+ free(cdata);
+
+ delete desc.destType;
+ delete jpeg;
+ }
+ catch (r_Error &err)
+ {
+ cerr << "Conversion failed: " << err.what() << endl;
+ if (baseType != NULL) delete baseType;
+ if (cdata != NULL) delete [] cdata;
+ if (jpeg != NULL) delete jpeg;
+ }
+ if (data != NULL)
+ delete [] data;
+ }
+ return 0;
+}
diff --git a/conversion/test/test_png.cc b/conversion/test/test_png.cc
new file mode 100644
index 0000000..bc481fc
--- /dev/null
+++ b/conversion/test/test_png.cc
@@ -0,0 +1,237 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <iostream>
+#include <string.h>
+#include <math.h>
+
+
+#include "conversion/convertor.hh"
+#include "conversion/png.hh"
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#include "raslib/template_inst.hh"
+#endif
+
+static int init_identity(int offset)
+{
+ return offset;
+}
+
+static int init_square(int offset)
+{
+ return offset * offset;
+}
+
+static int SinTabOK = 0;
+static int SinusTable[512];
+
+static int init_sine(int offset)
+{
+ if (SinTabOK == 0)
+ {
+ int i;
+
+ for (i=0; i<512; i++)
+ {
+ SinusTable[i] = (int)(255*sin(M_PI * offset / 512.0));
+ }
+ SinTabOK = 1;
+ }
+ return SinusTable[offset & 511];
+}
+
+int test_picture(int width, int height, int bpp, int (*init)(int))
+{
+ char *data;
+ r_Minterval interv(2);
+ int datasize;
+ int baseType;
+ int bytespp;
+ int i;
+
+ switch (bpp)
+ {
+ case 1: baseType = r_Convertor::ctype_bool; bytespp = 1; break;
+ case 8: baseType = r_Convertor::ctype_char; bytespp = 1; break;
+ case 24: baseType = r_Convertor::ctype_rgb; bytespp = 3; break;
+ default:
+ cerr << "Unknown bpp value " << bpp << endl;
+ return -1;
+ }
+
+ interv << r_Sinterval((r_Range)0, (r_Range)width-1)
+ << r_Sinterval((r_Range)0, (r_Range)height-1);
+
+ datasize = (width * bytespp * height);
+ data = new char[datasize];
+
+ cout << "Test: bpp = " << bpp << ", domain = " << interv << ", size = " << datasize << endl;
+
+ if (bpp > 1)
+ {
+ for (i=0; i<datasize; i++) data[i] = (char)init(i);
+ }
+ else
+ {
+ int j, count;
+
+ for (i=0; i<datasize; i+=8)
+ {
+ count = datasize - i; if (count > 8) count = 8;
+ for (j=0; j<count; j++) data[i+j] = ((init(i>>3) & (1<<j)) == 0) ? 0 : 1;
+ //for (j=0; j<count; j++) cout << (char)(data[i+j] + '0'); cout << endl;
+ }
+ }
+
+ r_Conv_PNG *png = NULL;
+ char *dest = NULL;
+
+ try
+ {
+ r_convDesc desc;
+ int destsize;
+ int status = -1;
+
+ png = new r_Conv_PNG(data, interv, baseType);
+ desc = png->convertTo();
+ destsize = desc.destInterv[0].high() - desc.destInterv[0].low() + 1;
+ cout << "\tConverted to PNG, domain " << desc.destInterv << endl;
+ dest = desc.dest;
+ r_Minterval destInterv(desc.destInterv);
+ delete desc.destType;
+ delete png;
+ png = new r_Conv_PNG(dest, destInterv, r_Convertor::ctype_char);
+ desc = png->convertFrom();
+ cout << "\tConverted from PNG, domain " << desc.destInterv << endl;
+
+ if (interv == desc.destInterv)
+ status = memcmp(data, desc.dest, datasize);
+
+ delete png;
+ delete [] data;
+ free(dest);
+ free(desc.dest);
+ delete desc.destType;
+
+ if (status != 0)
+ {
+ cout << "\t!!! Data not identical !!!" << endl;
+ }
+
+ return 0;
+ }
+ catch (r_Error &err)
+ {
+ cerr << "Error: " << err.what() << endl;
+
+ delete [] data;
+ if (dest != NULL) free(dest);
+ if (png != NULL) delete png;
+
+ return -1;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ int i;
+ char pngfile[256] = "";
+
+ i = 1;
+ while (i < argc)
+ {
+ if (strcmp(argv[i], "-file") == 0)
+ {
+ strcpy(pngfile, argv[++i]);
+ }
+ i++;
+ }
+
+ if (pngfile[0] == '\0')
+ {
+ // No PNG-file given, standard test-suite
+ test_picture(400, 300, 1, init_identity);
+ test_picture(400, 300, 8, init_identity);
+ test_picture(400, 300, 24, init_identity);
+ test_picture(701, 333, 1, init_square);
+ test_picture(701, 333, 8, init_square);
+ test_picture(701, 333, 24, init_square);
+ test_picture(3007, 3999, 1, init_sine);
+ test_picture(3007, 3999, 8, init_sine);
+ test_picture(3007, 3999, 24, init_sine);
+ }
+ else
+ {
+ // Work on this file
+ FILE *fp;
+ size_t fsize;
+ char *data;
+ r_convDesc desc;
+ r_Conv_PNG *png;
+ r_Type *baseType;
+
+ if ((fp = fopen(pngfile, "rb")) == NULL)
+ {
+ cerr << "Unable to open input file" << endl;
+ return -1;
+ }
+ fseek(fp, 0, SEEK_END); fsize = ftell(fp); fseek(fp, 0, SEEK_SET);
+
+ data = new char[fsize];
+ fread(data, 1, fsize, fp);
+ fclose(fp);
+
+ png = NULL; baseType = NULL;
+ try
+ {
+ r_Minterval interv(1);
+ interv << r_Sinterval((r_Range)0, (r_Range)fsize-1);
+
+ png = new r_Conv_PNG(data, interv, r_Convertor::ctype_char);
+ cout << "Converting file <" << pngfile << "> to MDD..." << endl;
+ desc = png->convertFrom();
+
+ cout << "Resulting domain " << desc.destInterv << ", ";
+ desc.destType->print_status();
+ cout << endl;
+
+ interv = r_Minterval(desc.destInterv);
+
+ delete [] data;
+ data = desc.dest;
+ baseType = desc.destType;
+ delete png;
+
+ fsize = (interv[0].high() - interv[0].low() + 1) * (interv[1].high() - interv[1].low() + 1);
+
+ png = new r_Conv_PNG(data, interv, baseType);
+ cout << "Converting MDD back to PNG..." << endl;
+ desc = png->convertTo();
+
+ cout << "Resulting domain " << desc.destInterv << ", ";
+ desc.destType->print_status();
+ cout << endl;
+
+ fp = fopen("result.png", "wb");
+ fwrite(desc.dest, 1, (desc.destInterv[0].high() - desc.destInterv[0].low() + 1), fp);
+ fclose(fp);
+
+ delete baseType;
+
+ free(data);
+ free(desc.dest);
+ delete desc.destType;
+ delete png;
+ }
+ catch (r_Error &err)
+ {
+ cerr << "Conversion failed: " << err.what() << endl;
+ if (baseType != NULL) delete baseType;
+ if (data != NULL) delete [] data;
+ if (png != NULL) delete png;
+ }
+ }
+
+ return 0;
+}
diff --git a/conversion/test/test_vff.cc b/conversion/test/test_vff.cc
new file mode 100644
index 0000000..e3d6016
--- /dev/null
+++ b/conversion/test/test_vff.cc
@@ -0,0 +1,169 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <iostream>
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#endif
+
+#include "conversion/vff.hh"
+#include "raslib/rminit.hh"
+#include "raslib/basetype.hh"
+
+#ifdef __GNUG__
+#include "rasodmg/transaction.hh"
+#include "raslib/template_inst.hh"
+#else
+RMINITGLOBALS('C')
+#endif
+
+
+
+static void PrintUsage(const char *name)
+{
+ cout << "Usage: " << name << " [-o <vffoutfile> -p <params> -h] <vffinfile>" << endl;
+}
+
+
+int main(int argc, char *argv[])
+{
+ const char *infile=NULL;
+ const char *outfile=NULL;
+ const char *params=NULL;
+ int i;
+
+ i=1;
+ while (i<argc)
+ {
+ if (argv[i][0] == '-')
+ {
+ switch (argv[i][1])
+ {
+ case 'o':
+ outfile = argv[++i]; break;
+ case 'p':
+ params = argv[++i]; break;
+ case 'h':
+ PrintUsage(argv[0]); exit(0);
+ default:
+ cerr << "Unknown switch " << argv[i] << endl;
+ break;
+ }
+ }
+ else
+ {
+ if (infile != NULL)
+ cerr << "More than one input file, ignored" << endl;
+ else
+ infile = argv[i];
+ }
+ i++;
+ }
+
+ if (infile == NULL)
+ {
+ PrintUsage(argv[0]);
+ exit(-1);
+ }
+
+ FILE *fp;
+ if ((fp = fopen(infile, "rb")) == NULL)
+ {
+ cerr << "Unable to open input file " << infile << endl;
+ return -1;
+ }
+
+ size_t fsize;
+ char *data;
+
+ fseek(fp, 0, SEEK_END);
+ fsize = ftell(fp);
+
+ if ((data = new char[fsize]) == NULL)
+ {
+ cerr << "Unable to claim memory for file" << endl;
+ fclose(fp);
+ return -1;
+ }
+ fseek(fp, 0, SEEK_SET);
+ fread(data, 1, fsize, fp);
+ fclose(fp);
+
+ r_Minterval interv(1);
+ interv << r_Sinterval((r_Range)0, (r_Range)fsize-1);
+ r_Conv_VFF conv(data, interv, r_Convertor::ctype_char);
+ r_convDesc desc;
+
+ cout << "Convert from VFF... " << flush;
+ try
+ {
+ desc = conv.convertFrom(params);
+ cout << "OK" << endl;
+
+ r_Conv_VFF convb(desc.dest, desc.destInterv, desc.destType);
+ r_convDesc descb;
+
+ cout << "Convert back to VFF... " << flush;
+ try
+ {
+ descb = convb.convertTo(params);
+ cout << "OK" << endl;
+
+ if (outfile != NULL)
+ {
+ if ((fp = fopen(outfile, "wb")) == NULL)
+ {
+ cerr << "Unable to write to file " << outfile << endl;
+ }
+ else
+ {
+ fsize = (size_t)(descb.destInterv[0].high() - descb.destInterv[0].low() + 1);
+ fwrite(descb.dest, 1, fsize, fp);
+ fclose(fp);
+ }
+ }
+
+ // endianness-safe comparison of binary data:
+ // convert the just created VFF data back to an MDD and compare the
+ // result with the first MDD thus converted.
+ r_Conv_VFF convc(descb.dest, descb.destInterv, descb.destType);
+ r_convDesc descc;
+
+ cout << "Compare binary data... " << flush;
+ try
+ {
+ descc = convc.convertFrom(params);
+ if (memcmp(descc.dest, desc.dest, desc.destInterv.cell_count() * ((r_Base_Type*)desc.destType)->size()) == 0)
+ cout << "identical" << endl;
+ else
+ cout << "differs!!!" << endl;
+
+ delete descc.destType;
+ free(descc.dest);
+ }
+ catch (r_Error &err)
+ {
+ cerr << "failed: " << err.what() << endl;
+ }
+
+ delete descb.destType;
+ free(descb.dest);
+ }
+ catch (r_Error &err)
+ {
+ cerr << "failed: " << err.what() << endl;
+ }
+ delete desc.destType;
+ free(desc.dest);
+ }
+ catch (r_Error &err)
+ {
+ cerr << "failed: " << err.what() << endl;
+ }
+
+ delete [] data;
+
+ return 0;
+}