diff --git a/plugins/input/shape/dbffile.cpp b/plugins/input/shape/dbffile.cpp index cb6f40760..ff37347e2 100644 --- a/plugins/input/shape/dbffile.cpp +++ b/plugins/input/shape/dbffile.cpp @@ -26,200 +26,206 @@ #include "dbffile.hpp" // boost #include -#include +#include // stl #include dbf_file::dbf_file() - : num_records_(0), - num_fields_(0), - record_length_(0), - record_(0) {} + : num_records_(0), + num_fields_(0), + record_length_(0), + record_(0) {} dbf_file::dbf_file(std::string const& file_name) - :num_records_(0), - num_fields_(0), - record_length_(0), + :num_records_(0), + num_fields_(0), + record_length_(0), #ifdef SHAPE_MEMORY_MAPPED_FILE - file_(file_name), + file_(file_name), #else - file_(file_name,std::ios::in | std::ios::binary), + file_(file_name,std::ios::in | std::ios::binary), #endif - record_(0) + record_(0) { - if (file_.is_open()) - { - read_header(); - } + if (file_.is_open()) + { + read_header(); + } } dbf_file::~dbf_file() { - ::operator delete(record_); + ::operator delete(record_); } bool dbf_file::is_open() { - return file_.is_open(); + return file_.is_open(); } void dbf_file::close() { - if (file_ && file_.is_open()) - file_.close(); + if (file_ && file_.is_open()) + file_.close(); } int dbf_file::num_records() const { - return num_records_; + return num_records_; } int dbf_file::num_fields() const { - return num_fields_; + return num_fields_; } void dbf_file::move_to(int index) { - if (index>0 && index<=num_records_) - { - long pos=(num_fields_<<5)+34+(index-1)*(record_length_+1); - file_.seekg(pos,std::ios::beg); - file_.read(record_,record_length_); - } + if (index>0 && index<=num_records_) + { + long pos=(num_fields_<<5)+34+(index-1)*(record_length_+1); + file_.seekg(pos,std::ios::beg); + file_.read(record_,record_length_); + } } std::string dbf_file::string_value(int col) const { - if (col>=0 && col=0 && col=0 && col=0 && col=0 && col=0 && col0 ) { - double d = 0.0; - std::istringstream(str) >> d; - boost::put(f,name,d); + double val = 0.0; + qi::phrase_parse(record_+fields_[col].offset_,record_+fields_[col].offset_ + fields_[col].length_, + double_,ascii::space,val); + boost::put(f,name,val); } else { - int i = 0; - std::istringstream(str) >> i; - boost::put(f,name,i); + int val = 0; + qi::phrase_parse(record_+fields_[col].offset_,record_+fields_[col].offset_ + fields_[col].length_, + int_,ascii::space,val); + boost::put(f,name,val); } break; - } - } - } + } + } + } } void dbf_file::read_header() { - char c=file_.get(); - if (c=='\3' || c=='\131') - { - skip(3); - num_records_=read_int(); - assert(num_records_>=0); - num_fields_=read_short(); - assert(num_fields_>0); - num_fields_=(num_fields_-33)/32; - skip(22); - int offset=0; - char name[11]; - memset(&name,0,11); - fields_.reserve(num_fields_); - for (int i=0;i0) - { - record_=static_cast(::operator new (sizeof(char)*record_length_)); - } - } + char c=file_.get(); + if (c=='\3' || c=='\131') + { + skip(3); + num_records_=read_int(); + assert(num_records_>=0); + num_fields_=read_short(); + assert(num_fields_>0); + num_fields_=(num_fields_-33)/32; + skip(22); + int offset=0; + char name[11]; + memset(&name,0,11); + fields_.reserve(num_fields_); + for (int i=0;i0) + { + record_=static_cast(::operator new (sizeof(char)*record_length_)); + } + } } int dbf_file::read_short() { - char b[2]; - file_.read(b,2); - boost::int16_t val; - mapnik::read_int16_ndr(b,val); - return val; + char b[2]; + file_.read(b,2); + boost::int16_t val; + mapnik::read_int16_ndr(b,val); + return val; } int dbf_file::read_int() { - char b[4]; - file_.read(b,4); - boost::int32_t val; - mapnik::read_int32_ndr(b,val); - return val; + char b[4]; + file_.read(b,4); + boost::int32_t val; + mapnik::read_int32_ndr(b,val); + return val; } void dbf_file::skip(int bytes) { - file_.seekg(bytes,std::ios::cur); + file_.seekg(bytes,std::ios::cur); }