int OGROSMLayer::AddToArray(OGRFeature* poFeature, int bCheckFeatureThreshold) { if( bCheckFeatureThreshold && nFeatureArraySize > MAX_THRESHOLD) { if( !bHasWarnedTooManyFeatures ) { CPLError(CE_Failure, CPLE_AppDefined, "Too many features have accumulated in %s layer. " "Use OGR_INTERLEAVED_READING=YES mode", GetName()); } bHasWarnedTooManyFeatures = true; return FALSE; } if (nFeatureArraySize == nFeatureArrayMaxSize) { nFeatureArrayMaxSize = nFeatureArrayMaxSize + nFeatureArrayMaxSize / 2 + 128; CPLDebug("OSM", "For layer %s, new max size is %d", GetName(), nFeatureArrayMaxSize); OGRFeature** papoNewFeatures = (OGRFeature**)VSI_REALLOC_VERBOSE(papoFeatures, nFeatureArrayMaxSize * sizeof(OGRFeature*)); if (papoNewFeatures == NULL) { CPLError(CE_Failure, CPLE_AppDefined, "For layer %s, cannot resize feature array to %d features", GetName(), nFeatureArrayMaxSize); return FALSE; } papoFeatures = papoNewFeatures; } papoFeatures[nFeatureArraySize ++] = poFeature; return TRUE; }
OGRErr OGRGeometryCollection::addGeometryDirectly( OGRGeometry * poNewGeom ) { if( !isCompatibleSubType(poNewGeom->getGeometryType()) ) return OGRERR_UNSUPPORTED_GEOMETRY_TYPE; if( poNewGeom->Is3D() && !Is3D() ) set3D(TRUE); if( poNewGeom->IsMeasured() && !IsMeasured() ) setMeasured(TRUE); if( !poNewGeom->Is3D() && Is3D() ) poNewGeom->set3D(TRUE); if( !poNewGeom->IsMeasured() && IsMeasured() ) poNewGeom->setMeasured(TRUE); OGRGeometry** papoNewGeoms = (OGRGeometry **) VSI_REALLOC_VERBOSE( papoGeoms, sizeof(void*) * (nGeomCount+1) ); if( papoNewGeoms == NULL ) return OGRERR_FAILURE; papoGeoms = papoNewGeoms; papoGeoms[nGeomCount] = poNewGeom; nGeomCount++; return OGRERR_NONE; }
void OGRJMLLayer::AddStringToElementValue(const char *data, int nLen) { if( nLen > INT_MAX - nElementValueLen - 1 - 1000 ) { CPLError(CE_Failure, CPLE_OutOfMemory, "Too much data in a single element"); XML_StopParser(oParser, XML_FALSE); bStopParsing = true; return; } if( nElementValueLen + nLen + 1 > nElementValueAlloc ) { char* pszNewElementValue = static_cast<char*>( VSI_REALLOC_VERBOSE( pszElementValue, nElementValueLen + nLen + 1 + 1000) ); if (pszNewElementValue == nullptr) { XML_StopParser(oParser, XML_FALSE); bStopParsing = true; return; } nElementValueAlloc = nElementValueLen + nLen + 1 + 1000; pszElementValue = pszNewElementValue; } memcpy(pszElementValue + nElementValueLen, data, nLen); nElementValueLen += nLen; pszElementValue[nElementValueLen] = '\0'; }
OGRErr OGRGeometryCollection::addGeometryDirectly( OGRGeometry * poNewGeom ) { if( !isCompatibleSubType(poNewGeom->getGeometryType()) ) return OGRERR_UNSUPPORTED_GEOMETRY_TYPE; HomogenizeDimensionalityWith(poNewGeom); OGRGeometry** papoNewGeoms = static_cast<OGRGeometry **>( VSI_REALLOC_VERBOSE(papoGeoms, sizeof(void*) * (nGeomCount + 1))); if( papoNewGeoms == nullptr ) return OGRERR_FAILURE; papoGeoms = papoNewGeoms; papoGeoms[nGeomCount] = poNewGeom; nGeomCount++; return OGRERR_NONE; }
void OGRSVGLayer::dataHandlerCbk(const char *data, int nLen) { if (bStopParsing) return; nDataHandlerCounter ++; if (nDataHandlerCounter >= BUFSIZ) { CPLError(CE_Failure, CPLE_AppDefined, "File probably corrupted (million laugh pattern)"); XML_StopParser(oParser, XML_FALSE); bStopParsing = TRUE; return; } nWithoutEventCounter = 0; if (iCurrentField >= 0) { char* pszNewSubElementValue = (char*) VSI_REALLOC_VERBOSE(pszSubElementValue, nSubElementValueLen + nLen + 1); if (pszNewSubElementValue == NULL) { XML_StopParser(oParser, XML_FALSE); bStopParsing = TRUE; return; } pszSubElementValue = pszNewSubElementValue; memcpy(pszSubElementValue + nSubElementValueLen, data, nLen); nSubElementValueLen += nLen; if (nSubElementValueLen > 100000) { CPLError(CE_Failure, CPLE_AppDefined, "Too much data inside one element. File probably corrupted"); XML_StopParser(oParser, XML_FALSE); bStopParsing = TRUE; } } }
int EpsilonDataset::ScanBlocks(int* pnBands) { int bRet = FALSE; int nExpectedX = 0; int nExpectedY = 0; int nTileW = -1; int nTileH = -1; *pnBands = 0; bRegularTiling = TRUE; eps_block_header hdr; while( true ) { Seek(nStartBlockFileOff + nBlockDataSize); if (!GetNextBlockData()) { break; } /* Ignore rasterlite wavelet header */ int nRasterliteWaveletHeaderLen = strlen(RASTERLITE_WAVELET_HEADER); if (nBlockDataSize >= nRasterliteWaveletHeaderLen && memcmp(pabyBlockData, RASTERLITE_WAVELET_HEADER, nRasterliteWaveletHeaderLen) == 0) { continue; } /* Stop at rasterlite wavelet footer */ int nRasterlineWaveletFooterLen = strlen(RASTERLITE_WAVELET_FOOTER); if (nBlockDataSize >= nRasterlineWaveletFooterLen && memcmp(pabyBlockData, RASTERLITE_WAVELET_FOOTER, nRasterlineWaveletFooterLen) == 0) { break; } if (eps_read_block_header (pabyBlockData, nBlockDataSize, &hdr) != EPS_OK) { CPLError(CE_Warning, CPLE_AppDefined, "cannot read block header"); continue; } if (hdr.chk_flag == EPS_BAD_CRC || hdr.crc_flag == EPS_BAD_CRC) { CPLError(CE_Warning, CPLE_AppDefined, "bad CRC"); continue; } int W = GET_FIELD(hdr, W); int H = GET_FIELD(hdr, H); int x = GET_FIELD(hdr, x); int y = GET_FIELD(hdr, y); int w = GET_FIELD(hdr, w); int h = GET_FIELD(hdr, h); //CPLDebug("EPSILON", "W=%d,H=%d,x=%d,y=%d,w=%d,h=%d,offset=" CPL_FRMT_GUIB, // W, H, x, y, w, h, nStartBlockFileOff); int nNewBands = (hdr.block_type == EPS_GRAYSCALE_BLOCK) ? 1 : 3; if (nRasterXSize == 0) { if (W <= 0 || H <= 0) { break; } bRet = TRUE; nRasterXSize = W; nRasterYSize = H; *pnBands = nNewBands; } if (nRasterXSize != W || nRasterYSize != H || *pnBands != nNewBands || x < 0 || y < 0 || x + w > W || y + h > H) { CPLError(CE_Failure, CPLE_AppDefined, "Bad block characteristics"); bRet = FALSE; break; } BlockDesc* pasNewBlocks = (BlockDesc*)VSI_REALLOC_VERBOSE(pasBlocks, sizeof(BlockDesc) * (nBlocks+1)); if( pasNewBlocks == NULL ) { bRet = FALSE; break; } pasBlocks = pasNewBlocks; nBlocks++; pasBlocks[nBlocks-1].x = x; pasBlocks[nBlocks-1].y = y; pasBlocks[nBlocks-1].w = w; pasBlocks[nBlocks-1].h = h; pasBlocks[nBlocks-1].offset = nStartBlockFileOff; if (bRegularTiling) { if (nTileW < 0) { nTileW = w; nTileH = h; } if (w > nTileW || h > nTileH) bRegularTiling = FALSE; if (x != nExpectedX) bRegularTiling = FALSE; if (y != nExpectedY || nTileH != h) { if (y + h != H) bRegularTiling = FALSE; } if (nTileW != w) { if (x + w != W) bRegularTiling = FALSE; else { nExpectedX = 0; nExpectedY += nTileW; } } else nExpectedX += nTileW; //if (!bRegularTiling) // CPLDebug("EPSILON", "not regular tiling!"); } } return bRet; }
NTFRecord::NTFRecord( FILE * fp ) : nType(99), nLength(0), pszData(NULL) { if( fp == NULL ) return; /* ==================================================================== */ /* Read lines until we get to one without a continuation mark. */ /* ==================================================================== */ char szLine[MAX_RECORD_LEN+3] = {}; int nNewLength = 0; do { nNewLength = ReadPhysicalLine( fp, szLine ); if( nNewLength == -1 || nNewLength == -2 ) break; while( nNewLength > 0 && szLine[nNewLength-1] == ' ' ) szLine[--nNewLength] = '\0'; if( nNewLength < 2 || szLine[nNewLength-1] != '%' ) { CPLError( CE_Failure, CPLE_AppDefined, "Corrupt NTF record, missing end '%%'." ); CPLFree( pszData ); pszData = NULL; break; } if( pszData == NULL ) { nLength = nNewLength - 2; pszData = (char *) VSI_MALLOC_VERBOSE(nLength+1); if (pszData == NULL) { return; } memcpy( pszData, szLine, nLength ); pszData[nLength] = '\0'; } else { if( !STARTS_WITH_CI(szLine, "00") || nNewLength < 4 ) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid line"); VSIFree(pszData); pszData = NULL; return; } char* pszNewData = (char *) VSI_REALLOC_VERBOSE(pszData,nLength+(nNewLength-4)+1); if (pszNewData == NULL) { VSIFree(pszData); pszData = NULL; return; } pszData = pszNewData; memcpy( pszData+nLength, szLine+2, nNewLength-4 ); nLength += nNewLength-4; pszData[nLength] = '\0'; } } while( szLine[nNewLength-2] == '1' ); /* -------------------------------------------------------------------- */ /* Figure out the record type. */ /* -------------------------------------------------------------------- */ if( pszData != NULL ) { char szType[3]; strncpy( szType, pszData, 2 ); szType[2] = '\0'; nType = atoi(szType); } }