Changeset 13041 for OpenSceneGraph/trunk/src/osgPlugins/shp/XBaseParser.cpp
- Timestamp:
- 03/21/12 18:36:20 (14 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/src/osgPlugins/shp/XBaseParser.cpp
r12577 r13041 11 11 #else 12 12 #include <unistd.h> 13 #endif 13 #endif 14 14 15 15 #include <fcntl.h> … … 26 26 << "NumRecord = " << _numRecord << std::endl 27 27 << "HeaderLength = " << _headerLength << std::endl 28 << "RecordLength = " << _recordLength << std::endl; 28 << "RecordLength = " << _recordLength << std::endl; 29 29 } 30 30 … … 46 46 if ((nbytes = ::read( fd, &_languageDriver, sizeof(_languageDriver))) <= 0) return false; 47 47 if ((nbytes = ::read( fd, &_reserved2, sizeof(_reserved2))) <= 0) return false; 48 48 49 49 return true; 50 50 } 51 51 52 52 void XBaseFieldDescriptor::print() 53 53 { … … 64 64 { 65 65 int nbytes = 0; 66 66 67 67 if ((nbytes = ::read( fd, &_name, sizeof(_name))) <= 0) return false; 68 68 if ((nbytes = ::read( fd, &_fieldType, sizeof(_fieldType))) <= 0) return false; … … 76 76 if ((nbytes = ::read( fd, &_reserved, sizeof(_reserved))) <= 0) return false; 77 77 if ((nbytes = ::read( fd, &_indexFieldFlag, sizeof(_indexFieldFlag))) <= 0) return false; 78 78 79 79 return true; 80 80 } … … 98 98 } 99 99 } 100 100 101 101 _valid = parse(fd); 102 102 } 103 103 104 104 bool XBaseParser::parse(int fd) 105 { 105 { 106 106 int nbytes; 107 107 XBaseHeader _xBaseHeader; … … 109 109 XBaseFieldDescriptor _xBaseFieldDescriptorTmp; 110 110 111 111 112 112 // ** read the header 113 113 if (_xBaseHeader.read(fd) == false) return false; 114 114 // _xBaseHeader.print(); 115 116 115 116 117 117 // ** read field descriptor 118 118 bool fieldDescriptorDone = false; 119 119 Byte nullTerminator; 120 120 121 121 while (fieldDescriptorDone == false) 122 122 { … … 125 125 _xBaseFieldDescriptorList.push_back(_xBaseFieldDescriptorTmp); 126 126 // _xBaseFieldDescriptorTmp.print(); 127 128 // ** check the terminator 129 if ((nbytes = ::read( fd, &nullTerminator, sizeof(nullTerminator))) <= 0) return false; 130 if (nullTerminator == 0x0D) 127 128 // ** check the terminator 129 if ((nbytes = ::read( fd, &nullTerminator, sizeof(nullTerminator))) <= 0) return false; 130 if (nullTerminator == 0x0D) 131 131 fieldDescriptorDone = true; 132 132 else … … 134 134 } 135 135 136 136 137 137 // ** move to the end of the Header 138 138 ::lseek( fd, _xBaseHeader._headerLength + 1, SEEK_SET); 139 140 139 140 141 141 // ** reserve AttributeListList 142 142 _shapeAttributeListList.reserve(_xBaseHeader._numRecord); 143 144 143 144 145 145 // ** read each record and store them in the ShapeAttributeListList 146 146 char* record = new char[_xBaseHeader._recordLength]; 147 147 148 148 std::vector<XBaseFieldDescriptor>::iterator it, end = _xBaseFieldDescriptorList.end(); 149 149 for (Integer i = 0; i < _xBaseHeader._numRecord; ++i) 150 150 { 151 if ((nbytes = ::read( fd, record, _xBaseHeader._recordLength)) <= 0) return false; 152 151 if ((nbytes = ::read( fd, record, _xBaseHeader._recordLength)) <= 0) return false; 152 153 153 char * recordPtr = record; 154 154 osgSim::ShapeAttributeList * shapeAttributeList = new osgSim::ShapeAttributeList; 155 155 shapeAttributeList->reserve(_xBaseFieldDescriptorList.size()); 156 156 157 157 for (it = _xBaseFieldDescriptorList.begin(); it != end; ++it) 158 158 { … … 164 164 memcpy(str, recordPtr, it->_fieldLength); 165 165 str[it->_fieldLength] = 0; 166 shapeAttributeList->push_back(osgSim::ShapeAttribute((const char *) it->_name, (char*) str)); 166 shapeAttributeList->push_back(osgSim::ShapeAttribute((const char *) it->_name, (char*) str)); 167 167 delete [] str; 168 168 break; … … 198 198 break; 199 199 } 200 201 202 } 203 200 201 202 } 203 204 204 recordPtr += it->_fieldLength; 205 205 } 206 206 207 207 _shapeAttributeListList.push_back(shapeAttributeList); 208 208 } 209 209 210 210 delete [] record; 211 211 212 212 close (fd); 213 213 214 214 return true; 215 215 }
