/*
* 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 .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* SOURCE: csv.cc
*
* MODULE: conversion
*
* CLASSES: r_Conv_CSV
*
* COMMENTS:
*
* Provides functions to convert data to CSV SD and back.
*
*/
/* Added by Sorin Stancu-Mara. Definition clashed for type int8, define in both
* /usr/include/csv.h and in /usr/include/tiff.h
* This will supress the tiff.h definition.
* Both definitions are similar
*/
#define HAVE_INT8
#include "conversion/csv.hh"
#include "raslib/error.hh"
#include "raslib/rminit.hh"
#include "raslib/parseparams.hh"
#include "raslib/primitivetype.hh"
#include
#include
#include
#include "csv.hh"
#include
#include
r_Conv_CSV::r_Conv_CSV(const char *src, const r_Minterval &interv, const r_Type *tp) throw(r_Error)
: r_Convertor(src, interv, tp, true)
{
if (tp->isStructType())
{
RMInit::logOut << "r_Conv_CSV::r_Conv_CSV(): structured types not supported." << endl;
throw r_Error(r_Error::r_Error_General);
}
}
r_Conv_CSV::r_Conv_CSV(const char *src, const r_Minterval &interv, int tp) throw(r_Error)
: r_Convertor(src, interv, tp)
{
}
/*
int r_Conv_HDF::getTypeSize(int intType, char *format)
{
switch (intType)
{
case ctype_int8: strcpy(format, "%c"); return 1; break;
case ctype_uint8:
case ctype_char:
case ctype_bool: return 1; break;
case ctype_int16: return 2; break;
case ctype_uint16: return 2; break;
case ctype_int32: return 4; break;
case ctype_uint32: return 4; break;
case ctype_int64: return 8; break;
case ctype_uint64: return 8; break;
case ctype_float32: return 4; break;
case ctype_float64: return 8; break;
default: return 1; break;
}
return 1;
}
*/
r_Conv_CSV::~r_Conv_CSV(void)
{
}
template
void r_Conv_CSV::print(std::ofstream &f, baseType* val, int *dims, int dim) {
if (dim==1) {
for (int i=0; i(f, val, dims+1, dim-1);
f << "},";
}
f << "{";
print(f, val, dims+1, dim-1);
f << "}";
}
}
r_convDesc &r_Conv_CSV::convertTo( const char *options ) throw(r_Error)
{
char name[256];
strncpy(name, tmpnam(NULL), 256);
std::ofstream ftemp(name);
//int size = getTypeSize(desc.baseType);
int rank, i;
int *dimsizes;
rank = desc.srcInterv.dimension();
const char *src = desc.src;
char *t;
dimsizes = new int[rank];
for (i=0; i(ftemp, (const r_Octet* &)src, dimsizes, rank); break;
case ctype_uint8:
case ctype_char:
case ctype_bool: print(ftemp, (r_Char* &)src, dimsizes, rank); break;
case ctype_int16: print(ftemp, (r_Short* &)src, dimsizes, rank); break;
case ctype_uint16: print(ftemp, (r_UShort* &) src, dimsizes, rank); break;
case ctype_int32: print(ftemp, (r_Long* &) src, dimsizes, rank); break;
case ctype_uint32: print(ftemp, (r_ULong* &) src, dimsizes, rank); break;
case ctype_int64: print(ftemp, (long long* &) src, dimsizes, rank); break;
case ctype_uint64: print(ftemp, (unsigned long long* &) src, dimsizes, rank); break;
case ctype_float32: print(ftemp, (r_Float* &) src, dimsizes, rank); break;
case ctype_float64: print(ftemp, (r_Double* &) src, dimsizes, rank); break;
default: print(ftemp, (r_Char* &)src, dimsizes, rank);
}
delete [] dimsizes; dimsizes=NULL;
ftemp.close();
FILE *fp;
int filesize;
if ((fp = fopen(name, "rb")) == NULL)
{
RMInit::logOut << "r_Conv_CSV::convertTo(): unable to read back file." << endl;
throw r_Error(r_Error::r_Error_General);
}
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
desc.destInterv = r_Minterval(1);
desc.destInterv << r_Sinterval((r_Range)0, (r_Range)filesize - 1);
if ((desc.dest = (char*)mystore.storage_alloc(filesize)) == NULL)
{
RMInit::logOut << "r_Conv_CSV::convertTo(): out of memory error" << endl;
fclose(fp);
throw r_Error(MEMMORYALLOCATIONERROR);
}
fseek(fp, 0, SEEK_SET);
fread(desc.dest, 1, filesize, fp);
fclose(fp);
remove(name);
// Result is just a bytestream
desc.destType = r_Type::get_any_type("char");
return desc;
}
r_convDesc &r_Conv_CSV::convertFrom(const char *options) throw(r_Error)
{
RMInit::logOut << "importing CSV data not yet implemented" << endl;
throw new r_Error(CONVERSIONFORMATNOTSUPPORTED);
return desc;
}
const char *r_Conv_CSV::get_name( void ) const
{
return "csv";
}
r_Data_Format r_Conv_CSV::get_data_format( void ) const
{
return r_CSV;
}
r_Convertor *r_Conv_CSV::clone( void ) const
{
return new r_Conv_CSV(desc.src, desc.srcInterv, desc.baseType);
}