Ticket #2196: netcdf.1.4.4.patch
| File netcdf.1.4.4.patch, 5.8 kB (added by mariocruz, 5 months ago) |
|---|
-
gdal-1.4.4/frmts/netcdf/netcdfdataset.cpp
old new 1236 1236 /************************************************************************/ 1237 1237 /* ReadAttributes() */ 1238 1238 /************************************************************************/ 1239 CPLErr netCDFDataset::SafeStrcat(char** ppszDest, char* pszSrc, size_t* nDestSize) 1240 { 1241 /* Reallocate the data string until the content fits */ 1242 while(*nDestSize < (strlen(*ppszDest) + strlen(pszSrc) + 1)) { 1243 (*nDestSize) *= 2; 1244 *ppszDest = (char*) CPLRealloc((void*) *ppszDest, *nDestSize); 1245 } 1246 strcat(*ppszDest, pszSrc); 1247 1248 return CE_None; 1249 } 1239 1250 1240 1251 CPLErr netCDFDataset::ReadAttributes( int cdfid, int var) 1241 1252 1242 1253 { 1243 1254 char szAttrName[ NC_MAX_NAME ]; 1244 1255 char szVarName [ NC_MAX_NAME ]; 1245 char szMetaName[ NC_MAX_NAME ]; 1246 char szMetaTemp[ MAX_STR_LEN ]; 1256 char szMetaName[ NC_MAX_NAME * 2 ]; 1257 char *pszMetaTemp = NULL; 1258 size_t nMetaTempSize; 1247 1259 nc_type nAttrType; 1248 size_t nAttrLen, m;1260 size_t nAttrLen, m; 1249 1261 int nbAttr; 1250 char szTemp[ NC_MAX_NAME];1262 char szTemp[ MAX_STR_LEN ]; 1251 1263 1252 1264 nc_inq_varnatts( cdfid, var, &nbAttr ); 1253 1265 if( var == NC_GLOBAL ) { … … 1257 1269 nc_inq_varname( cdfid, var, szVarName ); 1258 1270 } 1259 1271 1260 for( int l=0; l < nbAttr; l++) {1272 for( int l=0; l < nbAttr; l++) { 1261 1273 1262 1274 nc_inq_attname( cdfid, var, l, szAttrName); 1263 1275 sprintf( szMetaName, "%s#%s", szVarName, szAttrName ); 1264 *szMetaTemp='\0';1265 1276 nc_inq_att( cdfid, var, szAttrName, &nAttrType, &nAttrLen ); 1266 1277 1278 /* Allocate guaranteed minimum size */ 1279 nMetaTempSize = nAttrLen + 1; 1280 pszMetaTemp = (char *) CPLCalloc( nMetaTempSize, sizeof( char )); 1281 *pszMetaTemp = '\0'; 1267 1282 1268 1283 switch (nAttrType) { 1269 1284 case NC_CHAR: 1270 char *pszTemp; 1271 pszTemp = (char *) CPLCalloc( nAttrLen+1, sizeof( char ) ); 1272 nc_get_att_text( cdfid, var, szAttrName,pszTemp ); 1273 pszTemp[nAttrLen]='\0'; 1274 strcpy(szMetaTemp,pszTemp); 1275 CPLFree(pszTemp); 1285 nc_get_att_text( cdfid, var, szAttrName, pszMetaTemp ); 1286 pszMetaTemp[nAttrLen]='\0'; 1276 1287 break; 1277 1288 case NC_SHORT: 1278 1289 short *psTemp; 1279 1280 1290 psTemp = (short *) CPLCalloc( nAttrLen, sizeof( short ) ); 1281 1291 nc_get_att_short( cdfid, var, szAttrName, psTemp ); 1282 1292 for(m=0; m < nAttrLen-1; m++) { 1283 sprintf( szTemp, "%d, ",psTemp[m] );1284 strcat(szMetaTemp,szTemp);1293 sprintf( szTemp, "%hd, ", psTemp[m] ); 1294 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1285 1295 } 1286 sprintf( szTemp, "%d",psTemp[m] ); 1296 sprintf( szTemp, "%hd", psTemp[m] ); 1297 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1287 1298 CPLFree(psTemp); 1288 strcat(szMetaTemp,szTemp);1289 1290 1299 break; 1291 1300 case NC_INT: 1292 1301 int *pnTemp; 1293 1294 1302 pnTemp = (int *) CPLCalloc( nAttrLen, sizeof( int ) ); 1295 1303 nc_get_att_int( cdfid, var, szAttrName, pnTemp ); 1296 1304 for(m=0; m < nAttrLen-1; m++) { 1297 sprintf( szTemp, "%d",pnTemp[m] );1298 strcat(szMetaTemp,szTemp);1305 sprintf( szTemp, "%d, ", pnTemp[m] ); 1306 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1299 1307 } 1300 sprintf( szTemp, "%d",pnTemp[m] ); 1308 sprintf( szTemp, "%d", pnTemp[m] ); 1309 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1301 1310 CPLFree(pnTemp); 1302 strcat(szMetaTemp,szTemp);1303 1311 break; 1304 1312 case NC_FLOAT: 1305 1313 float *pfTemp; 1306 1314 pfTemp = (float *) CPLCalloc( nAttrLen, sizeof( float ) ); 1307 1315 nc_get_att_float( cdfid, var, szAttrName, pfTemp ); 1308 1316 for(m=0; m < nAttrLen-1; m++) { 1309 sprintf( szTemp, "%e",pfTemp[m] );1310 strcat(szMetaTemp,szTemp);1317 sprintf( szTemp, "%e, ", pfTemp[m] ); 1318 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1311 1319 } 1312 sprintf( szTemp, "%e",pfTemp[m] ); 1320 sprintf( szTemp, "%e", pfTemp[m] ); 1321 SafeStrcat(&pszMetaTemp,szTemp, &nMetaTempSize); 1313 1322 CPLFree(pfTemp); 1314 strcat(szMetaTemp,szTemp);1315 1316 1323 break; 1317 1324 case NC_DOUBLE: 1318 1325 double *pdfTemp; 1319 1326 pdfTemp = (double *) CPLCalloc(nAttrLen, sizeof(double)); 1320 1327 nc_get_att_double( cdfid, var, szAttrName, pdfTemp ); 1321 1328 for(m=0; m < nAttrLen-1; m++) { 1322 sprintf( szTemp, "%g",pdfTemp[m] );1323 strcat(szMetaTemp,szTemp);1329 sprintf( szTemp, "%g, ", pdfTemp[m] ); 1330 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1324 1331 } 1325 sprintf( szTemp, "%g",pdfTemp[m] ); 1332 sprintf( szTemp, "%g", pdfTemp[m] ); 1333 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1326 1334 CPLFree(pdfTemp); 1327 strcat(szMetaTemp,szTemp);1328 1329 1335 break; 1330 1336 default: 1331 1337 break; … … 1333 1339 1334 1340 papszMetadata = CSLSetNameValue(papszMetadata, 1335 1341 szMetaName, 1336 szMetaTemp);1337 1342 pszMetaTemp); 1343 CPLFree(pszMetaTemp); 1338 1344 } 1339 1345 1340 1341 1346 return CE_None; 1342 1347 1343 1348 } 1344 1349 1350 1345 1351 /************************************************************************/ 1346 1352 /* netCDFDataset::CreateSubDatasetList() */ 1347 1353 /************************************************************************/ -
gdal-1.4.4/frmts/netcdf/netcdfdataset.h
old new 155 155 156 156 static GDALDataset *Open( GDALOpenInfo * ); 157 157 158 CPLErr SafeStrcat(char**, char*, size_t*); 158 159 CPLErr ReadAttributes( int, int ); 159 160 160 161 CPLErr GetGeoTransform( double * );
