Ticket #2196: netcdf.patch
| File netcdf.patch, 5.8 kB (added by mariocruz, 6 months ago) |
|---|
-
gdal-1.5.0/frmts/netcdf/netcdfdataset.cpp
old new 1070 1070 /************************************************************************/ 1071 1071 /* ReadAttributes() */ 1072 1072 /************************************************************************/ 1073 CPLErr netCDFDataset::SafeStrcat(char** ppszDest, char* pszSrc, size_t* nDestSize) 1074 { 1075 /* Reallocate the data string until the content fits */ 1076 while(*nDestSize < (strlen(*ppszDest) + strlen(pszSrc))) { 1077 (*nDestSize) *= 2; 1078 *ppszDest = (char*) CPLRealloc((void*) *ppszDest, *nDestSize); 1079 } 1080 strcat(*ppszDest, pszSrc); 1081 1082 return CE_None; 1083 } 1073 1084 1074 1085 CPLErr netCDFDataset::ReadAttributes( int cdfid, int var) 1075 1086 1076 1087 { 1077 1088 char szAttrName[ NC_MAX_NAME ]; 1078 1089 char szVarName [ NC_MAX_NAME ]; 1079 char szMetaName[ NC_MAX_NAME ]; 1080 char szMetaTemp[ MAX_STR_LEN ]; 1090 char szMetaName[ NC_MAX_NAME * 2 ]; 1091 char *pszMetaTemp = NULL; 1092 size_t nMetaTempSize; 1081 1093 nc_type nAttrType; 1082 size_t nAttrLen, m;1094 size_t nAttrLen, m; 1083 1095 int nbAttr; 1084 char szTemp[ NC_MAX_NAME];1096 char szTemp[ MAX_STR_LEN ]; 1085 1097 1086 1098 nc_inq_varnatts( cdfid, var, &nbAttr ); 1087 1099 if( var == NC_GLOBAL ) { … … 1091 1103 nc_inq_varname( cdfid, var, szVarName ); 1092 1104 } 1093 1105 1094 for( int l=0; l < nbAttr; l++) {1106 for( int l=0; l < nbAttr; l++) { 1095 1107 1096 1108 nc_inq_attname( cdfid, var, l, szAttrName); 1097 1109 sprintf( szMetaName, "%s#%s", szVarName, szAttrName ); 1098 *szMetaTemp='\0';1099 1110 nc_inq_att( cdfid, var, szAttrName, &nAttrType, &nAttrLen ); 1100 1111 1112 /* Allocate guaranteed minimum size */ 1113 nMetaTempSize = nAttrLen + 1; 1114 pszMetaTemp = (char *) CPLCalloc( nMetaTempSize, sizeof( char )); 1115 *pszMetaTemp = '\0'; 1101 1116 1102 1117 switch (nAttrType) { 1103 1118 case NC_CHAR: 1104 char *pszTemp; 1105 pszTemp = (char *) CPLCalloc( nAttrLen+1, sizeof( char ) ); 1106 nc_get_att_text( cdfid, var, szAttrName,pszTemp ); 1107 pszTemp[nAttrLen]='\0'; 1108 strcpy(szMetaTemp,pszTemp); 1109 CPLFree(pszTemp); 1119 nc_get_att_text( cdfid, var, szAttrName, pszMetaTemp ); 1120 pszMetaTemp[nAttrLen]='\0'; 1110 1121 break; 1111 1122 case NC_SHORT: 1112 1123 short *psTemp; 1113 1114 1124 psTemp = (short *) CPLCalloc( nAttrLen, sizeof( short ) ); 1115 1125 nc_get_att_short( cdfid, var, szAttrName, psTemp ); 1116 1126 for(m=0; m < nAttrLen-1; m++) { 1117 sprintf( szTemp, "%d, ",psTemp[m] );1118 strcat(szMetaTemp,szTemp);1127 sprintf( szTemp, "%hd, ", psTemp[m] ); 1128 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1119 1129 } 1120 sprintf( szTemp, "%d",psTemp[m] ); 1130 sprintf( szTemp, "%hd", psTemp[m] ); 1131 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1121 1132 CPLFree(psTemp); 1122 strcat(szMetaTemp,szTemp);1123 1124 1133 break; 1125 1134 case NC_INT: 1126 1135 int *pnTemp; 1127 1128 1136 pnTemp = (int *) CPLCalloc( nAttrLen, sizeof( int ) ); 1129 1137 nc_get_att_int( cdfid, var, szAttrName, pnTemp ); 1130 1138 for(m=0; m < nAttrLen-1; m++) { 1131 sprintf( szTemp, "%d",pnTemp[m] );1132 strcat(szMetaTemp,szTemp);1139 sprintf( szTemp, "%d, ", pnTemp[m] ); 1140 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1133 1141 } 1134 sprintf( szTemp, "%d",pnTemp[m] ); 1142 sprintf( szTemp, "%d", pnTemp[m] ); 1143 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1135 1144 CPLFree(pnTemp); 1136 strcat(szMetaTemp,szTemp);1137 1145 break; 1138 1146 case NC_FLOAT: 1139 1147 float *pfTemp; 1140 1148 pfTemp = (float *) CPLCalloc( nAttrLen, sizeof( float ) ); 1141 1149 nc_get_att_float( cdfid, var, szAttrName, pfTemp ); 1142 1150 for(m=0; m < nAttrLen-1; m++) { 1143 sprintf( szTemp, "%e",pfTemp[m] );1144 strcat(szMetaTemp,szTemp);1151 sprintf( szTemp, "%e, ", pfTemp[m] ); 1152 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1145 1153 } 1146 sprintf( szTemp, "%e",pfTemp[m] ); 1154 sprintf( szTemp, "%e", pfTemp[m] ); 1155 SafeStrcat(&pszMetaTemp,szTemp, &nMetaTempSize); 1147 1156 CPLFree(pfTemp); 1148 strcat(szMetaTemp,szTemp);1149 1150 1157 break; 1151 1158 case NC_DOUBLE: 1152 1159 double *pdfTemp; 1153 1160 pdfTemp = (double *) CPLCalloc(nAttrLen, sizeof(double)); 1154 1161 nc_get_att_double( cdfid, var, szAttrName, pdfTemp ); 1155 1162 for(m=0; m < nAttrLen-1; m++) { 1156 sprintf( szTemp, "%g",pdfTemp[m] );1157 strcat(szMetaTemp,szTemp);1163 sprintf( szTemp, "%g, ", pdfTemp[m] ); 1164 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1158 1165 } 1159 sprintf( szTemp, "%g",pdfTemp[m] ); 1166 sprintf( szTemp, "%g", pdfTemp[m] ); 1167 SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize); 1160 1168 CPLFree(pdfTemp); 1161 strcat(szMetaTemp,szTemp);1162 1163 1169 break; 1164 1170 default: 1165 1171 break; … … 1167 1173 1168 1174 papszMetadata = CSLSetNameValue(papszMetadata, 1169 1175 szMetaName, 1170 szMetaTemp);1171 1176 pszMetaTemp); 1177 CPLFree(pszMetaTemp); 1172 1178 } 1173 1179 1174 1180 … … 1176 1182 1177 1183 } 1178 1184 1185 1179 1186 /************************************************************************/ 1180 1187 /* netCDFDataset::CreateSubDatasetList() */ 1181 1188 /************************************************************************/ -
gdal-1.5.0/frmts/netcdf/netcdfdataset.h
old new 159 159 160 160 static GDALDataset *Open( GDALOpenInfo * ); 161 161 162 CPLErr SafeStrcat(char**, char*, size_t*); 162 163 CPLErr ReadAttributes( int, int ); 163 164 164 165 CPLErr GetGeoTransform( double * );
