diff options
Diffstat (limited to 'rasodmg/test/defconv.cc')
-rw-r--r-- | rasodmg/test/defconv.cc | 598 |
1 files changed, 598 insertions, 0 deletions
diff --git a/rasodmg/test/defconv.cc b/rasodmg/test/defconv.cc new file mode 100644 index 0000000..feee2dc --- /dev/null +++ b/rasodmg/test/defconv.cc @@ -0,0 +1,598 @@ +/* +* 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>. +/ +/** + * defconv.cc + * + * Covert the DEF source file to another DEF destination file. + * Returns 0 for succes, otherwise 1. + * + * Parameters: + * + * --inputfilename <src-file> + * the filename of the src file, mandatory + * --outputfilename <dest-file> + * the filename of the dest file, mandatory + * + * --inputformat name + * name of DEF fromat(see data_foramat from mddtypes.hh) + * --inputformatparams params + * params used by convertFrom methods(see the heder file for you DEF from conversion) + * --outputformat name + * name of DEF fromat(see data_foramat from mddtypes.hh) + * --outputformatparams params + * params used by convertFrom methods(see the heder file for you DEF from conversion) + * + * --help + * print usage and exit + */ + +#ifdef EARLY_TEMPLATE +#define __EXECUTABLE__ +#ifdef __GNUG__ +#include "raslib/template_inst.hh" +#endif +#endif + +#include "defutil.hh" +#include "raslib/miter.hh" + +//program data +const char* paramPrgHelp="--help"; +bool defPrgHelp=false; +char* prgHelp=NULL; + +const char* paramSrcFileName="--srcfilename"; +bool defSrcFileName=false; +char* srcFileName=NULL; + +const char* paramSrcFormat="--srcformat"; +bool defSrcFormat=false; +char* srcFormatc=NULL; +r_Data_Format srcFormat=r_Array; +char *srcIvc=NULL, *srcTypec=NULL; +r_Minterval srcIv; +r_Type* srcType=NULL; + +const char* paramSrcFormatParams="--srcformatparams"; +bool defSrcFormatParams=false; +char *srcFormatParams=NULL; + +const char* paramDestFileName="--destfilename"; +bool defDestFileName=false; +char *destFileName=NULL; + +const char* paramDestFormat="--destformat"; +bool defDestFormat=false; +char* destFormatc=NULL; +r_Data_Format destFormat=r_Array; +char *destIvc=NULL, *destTypec=NULL; +r_Minterval destIv; +r_Type* destType=NULL; + +const char* paramDestFormatParams="--destformatparams"; +bool defDestFormatParams=false; +char *destFormatParams=NULL; + +//data used to parase formatparams for format Array +const char* fpDomain="domain"; +const char* fpType="type"; + +//structures used for parseParam +const int paramsNo=7; + +const char *paramsName[paramsNo]={ paramPrgHelp, paramSrcFileName, paramSrcFormat, paramSrcFormatParams, + paramDestFileName, paramDestFormat, paramDestFormatParams}; + +bool *paramsPresent[paramsNo]={ &defPrgHelp, &defSrcFileName, &defSrcFormat, &defSrcFormatParams, + &defDestFileName, &defDestFormat, &defDestFormatParams}; + +char **paramsValue[paramsNo]={ &prgHelp, &srcFileName, &srcFormatc, &srcFormatParams, + &destFileName, &destFormatc, &destFormatParams}; + +void printStatus() +{ + cout << "defdiff parameters list:" << endl; + for (int i=0; i<paramsNo; i++) + cout << "--Name='" << paramsName[i] + << "' Present=" << ((*paramsPresent[i])? "true": "false") + << " Value='" << *paramsValue[i] << "'" << endl; +} + +void printUsage() +{ + char* fileNameSrc="test.bmp"; + char* fileNameDest="test.tiff"; + + cout << "defconv v 0.1 - RasDaMan Data Exchange Format Convertor Utility" << endl; + cout << "Description: Returns " << EXIT_SUCCESS << " for succes, otherwise " << EXIT_FAILURE << endl; + cout << "For " << paramSrcFormat << "/" << paramDestFormat << " Array you have to specify the " + << paramSrcFormatParams << "/" << paramDestFormatParams << " as following:" << endl; + cout << "\"" << fpDomain << "=<domain_str>," << fpType << "=<type_str>\" (e.g. \"" + << fpDomain << "=\"[0:477,0:464]\"," << fpType << "=char\")" << endl; + cout << "Usage options:" << endl; + cout << " " << paramSrcFileName << " <src-file> ... the filename used as src mandatory" << endl; + cout << " " << paramSrcFormat << " name ... name of DEF fromat(see data_foramat from mddtypes.hh)," << endl; + cout << " default Array" << endl; + cout << " " << paramSrcFormatParams << " params ... params used by convertFrom methods(see the header file" << endl; + cout << " for you DEF from conversion), default NULL" << endl; + cout << " " << paramDestFileName << " <dest-file> ... the filename used as dest mandatory" << endl; + cout << " " << paramDestFormat << " name ... name of DEF fromat(see data_foramat from mddtypes.hh)," << endl; + cout << " default Array" << endl; + cout << " " << paramDestFormatParams << " params ... params used by convertFrom methods(see the header file" << endl; + cout << " for you DEF from conversion), default NULL" << endl; + cout << " " << paramPrgHelp << " ... this help" << endl; + cout << "For example:" << endl; + cout << "defconv " << paramSrcFileName << " " << fileNameSrc << " " << paramSrcFormat << " " << format_name_bmp <<" " + << paramDestFileName << " " << fileNameDest << " " << paramDestFormat <<" " << format_name_tiff << endl; + cout << "Report bugs to liviu.coman@activeknowledge.com" << endl; + +} + +int checkParam(int& paramIndex, char** param) +{ + int i=0; + while(i<paramsNo) + { + if(!strcmp(param[paramIndex], paramsName[i])) + break; + i++; + } + + if(i==paramsNo) + { + cout << "checkParam(...) error processing parameters: parameter " + << param[paramIndex] << " is unknown!" << endl; + return EXIT_FAILURE; + } + if(*paramsPresent[i]) + { + cout << "checkParam(...) error processing parameters: parameter " + << param[paramIndex] << " is present more than once!" << endl; + return EXIT_FAILURE; + } + + if(paramsName[i]!=paramPrgHelp) + { + *paramsPresent[i]=true; + paramIndex++; + *paramsValue[i]=param[paramIndex]; + } + else + *paramsPresent[i]=true; + + return EXIT_SUCCESS; +} + +int parseParams(int argc, char** argv) +{ + int argIndex=0; + if (argc==1) + { + cout << "parseParams(...) parameters " << paramSrcFileName << " <src-file> and " + << paramDestFileName << " <dest-file> are mandatatory!" << endl; + return EXIT_FAILURE; + } + else + { + argIndex=1; + while(argIndex<argc) + { + if(checkParam(argIndex, argv)!=EXIT_SUCCESS) + break; + argIndex++; + } + if(argIndex<argc) + { + //error while parsing parameters + return EXIT_FAILURE; + } + + //check rule + if((defSrcFileName && defDestFileName) || (defPrgHelp)) + return EXIT_SUCCESS; + else + { + cout << "parseParams(...) parameters " << paramSrcFileName << " <src-file> and " + << paramDestFileName << " <dest-file> are mandatatory!" << endl; + return EXIT_FAILURE; + } + } +} + +int validateParams() +{ + + //check srcformat + if(defSrcFormat) + { + srcFormat = get_data_format_from_name(srcFormatc); + if((srcFormat!=r_Array) && + (!r_Convertor_Factory::is_supported(srcFormat))) + { + cout << "convertDEFs(...) conversion " << srcFormatc << " not supported" << endl; + return EXIT_FAILURE; + } + } + + //check destformat + if(defDestFormat) + { + destFormat = get_data_format_from_name(destFormatc); + if((destFormat!=r_Array) && + (!r_Convertor_Factory::is_supported(destFormat))) + { + cout << "convertDEFs(...) conversion " << destFormatc << " not supported" << endl; + return EXIT_FAILURE; + } + } + + //check srcFormatParams if srcFormat=r_Array + if(srcFormat == r_Array) + { + if(!defSrcFormatParams) + { + cout << "convertDEFs(...) for srcformat r_Array is necessary to provide the srcformatparams as described in help" << endl; + return EXIT_FAILURE; + } + + if(parseArrayParams((const char*)srcFormatParams, fpDomain, fpType, srcIvc, srcTypec) != EXIT_SUCCESS) + return EXIT_FAILURE; + + if(decodeMinterval(srcIvc, srcIv) != EXIT_SUCCESS) + return EXIT_FAILURE; + + if(decodeType(srcTypec, srcType) != EXIT_SUCCESS) + return EXIT_FAILURE; + } + + //check destFormatParams if destFormat=r_Array + if(destFormat == r_Array) + { + if(!defDestFormatParams) + { + cout << "convertDEFs(...) for destformat r_Array is necessary to provide the srcformatparams as described in help" << endl; + return EXIT_FAILURE; + } + + if(parseArrayParams((const char*)destFormatParams, fpDomain, fpType, destIvc, destTypec) != EXIT_SUCCESS) + return EXIT_FAILURE; + + if(decodeMinterval(destIvc, destIv) != EXIT_SUCCESS) + return EXIT_FAILURE; + + if(decodeType(destTypec, destType) != EXIT_SUCCESS) + return EXIT_FAILURE; + } +} + +int setCell(const char* srcCell, + const r_Type* srcType, + const r_Type* destType, + char* destCell, + bool rescale=false) +{ + r_Double srcTypeMin=0., srcTypeMax=0.; + r_Double destTypeMin=0., destTypeMax=0.; + r_Double srcVal=0., destVal=0.; + + if(!srcCell) + { + cout << "setCell(...) srcCell is null" << endl; + return EXIT_FAILURE; + } + if(!srcType) + { + cout << "setCell(...) srcType is null" << endl; + return EXIT_FAILURE; + } + if(!destType) + { + cout << "setCell(...) destType is null" << endl; + return EXIT_FAILURE; + } + if(!destCell) + { + cout << "setCell(...) destCell is null" << endl; + return EXIT_FAILURE; + } + + try + { + srcVal=((r_Primitive_Type*)srcType)->get_value(srcCell); + if(rescale) + { + ((r_Primitive_Type*)srcType)->get_limits(srcTypeMin, srcTypeMax); + ((r_Primitive_Type*)destType)->get_limits(destTypeMin, destTypeMax); + destVal=srcVal*destTypeMax/srcTypeMax; + } + else + destVal=srcVal; + ((r_Primitive_Type*)destType)->set_value(destCell,destVal); + } + catch(r_Error& err) + { + cout << "setCell(...) error while setting value to dest from src" << endl; + cout << "Error " << err.get_errorno() << " : " << err.what() << endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} +int convertData(const r_convDesc& descSrc, r_convDesc& descDest) +{ + r_Minterval srcIv, destIv, commonIv; + + r_Bytes srcTypeSize=0, destTypeSize=0; + char *srcBuffer=NULL, *destBuffer=NULL; + + if(!descSrc.dest) + { + cout << "convertData(...) descSrc.dest is null" << endl; + return EXIT_FAILURE; + } + + if(!descSrc.destType) + { + cout << "convertData(...) descSrc.destType is null" << endl; + return EXIT_FAILURE; + } + + if(descDest.dest) + { + cout << "convertData(...) descDest.dest is not null" << endl; + return EXIT_FAILURE; + } + + if(!descDest.destType) + { + cout << "convertData(...) descDest.destType is null" << endl; + return EXIT_FAILURE; + } + + //translate every interval to zero + try + { + srcIv=descSrc.destInterv.create_reverse_translation(descSrc.destInterv.get_origin()); + destIv=descDest.destInterv.create_reverse_translation(descDest.destInterv.get_origin()); + } + catch(r_Error& err) + { + cout << "convertData(...) error while translating to zero the following intervals:" << endl; + cout << "descSrc.destInterv=" << descSrc.destInterv << endl; + cout << "descDest.destInterv=" << descDest.destInterv << endl; + cout << "Error " << err.get_errorno() << ":" << err.what() << endl; + return EXIT_FAILURE; + } + + //check intersection + try + { + commonIv.intersection_of(srcIv, destIv); + } + catch(r_Error& err) + { + cout << "convertData(...) error while doing the intersection of the following intervals:" << endl; + cout << "descSrc.destInterv=" << descSrc.destInterv << endl; + cout << "descDest.destInterv=" << descDest.destInterv << endl; + cout << "Error " << err.get_errorno() << ":" << err.what() << endl; + return EXIT_FAILURE; + } + + //get type size + srcTypeSize=((r_Base_Type*)descSrc.destType)->size(); + destTypeSize=((r_Base_Type*)descDest.destType)->size(); + + //allocate data + srcBuffer=new char[srcTypeSize]; + if(!srcBuffer) + { + cout << "convertData(...) unable to claim memory for srcBuffer" << endl; + return EXIT_FAILURE; + } + destBuffer=new char[destTypeSize]; + if(!destBuffer) + { + cout << "convertData(...) unable to claim memory for destBuffer" << endl; + delete[] srcBuffer; + srcBuffer=NULL; + return EXIT_FAILURE; + } + descDest.dest=new char[descDest.destInterv.cell_count()*destTypeSize]; + if(!descDest.dest) + { + cout << "convertData(...) unable to claim memory for descDest.dest" << endl; + delete[] srcBuffer; + srcBuffer=NULL; + delete[] destBuffer; + destBuffer=NULL; + return EXIT_FAILURE; + } + memset(descDest.dest,0, descDest.destInterv.cell_count()*destTypeSize); + + r_Miter srcIter( &commonIv, &srcIv, srcTypeSize, descSrc.dest ); + r_Miter destIter( &commonIv, &destIv, destTypeSize, descDest.dest ); + while(!srcIter.isDone() || !destIter.isDone()) + { + memcpy(srcBuffer, srcIter.nextCell(), srcTypeSize); + if(setCell(srcBuffer, descSrc.destType, descDest.destType, destBuffer)!=EXIT_SUCCESS) + { + //abort algorithm + break; + } + memcpy(destIter.nextCell(), destBuffer, destTypeSize); + } + + //clean up + delete[] srcBuffer; + srcBuffer=NULL; + delete[] destBuffer; + destBuffer=NULL; + + //check algorithm + if(!srcIter.isDone() || !destIter.isDone()) + { + cout << "convertData(...) error in algorithm" << endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + + + +int convertDEFs() +{ + char *dataSrc=NULL, *dataDest=NULL; + r_ULong dataSrcSize=0, dataDestSize=0; + r_convDesc descSrc, descDest; + + initConvDesc(descSrc); + initConvDesc(descDest); + + //read the source file + if(readFile(srcFileName, &dataSrc, dataSrcSize)!=EXIT_SUCCESS) + return EXIT_FAILURE; + + if(!dataSrcSize) + { + cout << "convertDEFs() size of file " << srcFileName << " is zero" << endl; + //clean up + delete [] dataSrc; + dataSrc=NULL; + return EXIT_FAILURE; + } + + //what is the input format? + if(srcFormat !=r_Array) + { + //it is safe to use srcType, srcIv because the srcFormat is not r_Array + srcType=r_Convertor::get_external_type(r_Convertor::ctype_char); + srcIv = r_Minterval(1); + srcIv << r_Sinterval((r_Long)0, (r_Long)(dataSrcSize - 1)); + + //did conversion work? + if(convertFrom(srcFormat, srcFormatParams, dataSrc, + srcIv, srcType, descSrc) != EXIT_SUCCESS) + { + //clean up + delete [] dataSrc; + dataSrc=NULL; + return EXIT_FAILURE; + } + } + else + { + descSrc.dest=dataSrc; + descSrc.destInterv=srcIv; + descSrc.destType=srcType; + } + + //what is the output format? + if(destFormat !=r_Array) + { + if(convertTo(destFormat, destFormatParams, descSrc.dest, descSrc.destInterv, descSrc.destType, descDest) != EXIT_SUCCESS) + { + //clean up + cleanConvDesc(descSrc); + return EXIT_FAILURE; + } + //prepare the data for writing + dataDest=descDest.dest; + dataDestSize=descDest.destInterv.cell_count() * ((r_Base_Type*)descDest.destType)->size(); + } + else + { + //prepare for conversion + descDest.destType=destType; + descDest.destInterv=destIv; + descDest.dest=NULL; + + if(descSrc.destType->isPrimitiveType()) + { + if(convertData(descSrc, descDest) != EXIT_SUCCESS) + { + //clean up + cleanConvDesc(descSrc); + cleanConvDesc(descDest); + return EXIT_FAILURE; + } + + //prepare the data for writing + dataDest=descDest.dest; + dataDestSize=descDest.destInterv.cell_count() * ((r_Base_Type*)descDest.destType)->size(); + } + else + { + //we store the data as it is + dataDest=descSrc.dest; + dataDestSize=descSrc.destInterv.cell_count() * ((r_Base_Type*)descSrc.destType)->size(); + } + + } + + + + //write data into destFileName + if(writeFile(destFileName, (const char**)&dataDest, dataDestSize)!=EXIT_SUCCESS) + { + //clean up + cleanConvDesc(descSrc); + cleanConvDesc(descDest); + return EXIT_FAILURE; + } + + //clean up + cleanConvDesc(descSrc); + cleanConvDesc(descDest); + + return EXIT_SUCCESS; +} + +int processRequest() +{ + if(validateParams() != EXIT_SUCCESS) + return EXIT_FAILURE; + return convertDEFs(); +} + +int main(int argc, char **argv) +{ + if(parseParams(argc, argv) != EXIT_SUCCESS) + { + printUsage(); + return EXIT_FAILURE; + } + else + { + if(!defPrgHelp) + { + printStatus(); + return processRequest(); + } + else + { + printUsage(); + return EXIT_SUCCESS; + } + } +} |