1236{
1237 int i, j, nRetResult =
TRUE;
1238 unsigned char *pabyRec;
1239 char szSField[400], szFormat[20];
1240
1241
1242
1243
1244 if (hEntity < 0 || hEntity > psDBF->nRecords)
1246
1247 if (psDBF->bNoHeader)
1249
1250
1251
1252
1253 if (hEntity == psDBF->nRecords)
1254 {
1257
1258 psDBF->nRecords++;
1259 for (i = 0; i < psDBF->nRecordLength; i++)
1260 psDBF->pszCurrentRecord[i] = ' ';
1261
1262 psDBF->nCurrentRecord = hEntity;
1263 }
1264
1265
1266
1267
1268
1271
1272 pabyRec = (unsigned char *)psDBF->pszCurrentRecord;
1273
1274 psDBF->bCurrentRecordModified =
TRUE;
1275 psDBF->bUpdated =
TRUE;
1276
1277
1278
1279
1280
1281
1282 if (pValue == NULL)
1283 {
1284 memset((char *)(pabyRec + psDBF->panFieldOffset[iField]),
1286 psDBF->panFieldSize[iField]);
1288 }
1289
1290
1291
1292
1293 switch (psDBF->pachFieldType[iField])
1294 {
1295 case 'D':
1296 case 'N':
1297 case 'F':
1298 if (psDBF->panFieldDecimals[iField] == 0)
1299 {
1300 int nWidth = psDBF->panFieldSize[iField];
1301
1302 if ((int)sizeof(szSField) - 2 < nWidth)
1303 nWidth = sizeof(szSField) - 2;
1304
1305 sprintf(szFormat, "%%%dd", nWidth);
1306 sprintf(szSField, szFormat, (int)*((double *)pValue));
1307 if ((int)strlen(szSField) > psDBF->panFieldSize[iField])
1308 {
1309 szSField[psDBF->panFieldSize[iField]] = '\0';
1311 }
1312 memcpy(
1313 (char *)(pabyRec + psDBF->panFieldOffset[iField]), szSField, psDBF->panFieldSize[iField]);
1314 }
1315 else
1316 {
1317 int nWidth = psDBF->panFieldSize[iField];
1318
1319 if ((int)sizeof(szSField) - 2 < nWidth)
1320 nWidth = sizeof(szSField) - 2;
1321
1322 sprintf(szFormat, "%%%d.%df", nWidth, psDBF->panFieldDecimals[iField]);
1323 sprintf(szSField, szFormat, *((double *)pValue));
1324 if ((int)strlen(szSField) > psDBF->panFieldSize[iField])
1325 {
1326 szSField[psDBF->panFieldSize[iField]] = '\0';
1328 }
1329 memcpy(
1330 (char *)(pabyRec + psDBF->panFieldOffset[iField]), szSField, psDBF->panFieldSize[iField]);
1331 }
1332 break;
1333
1334 case 'L':
1335 if (psDBF->panFieldSize[iField] >= 1 && (*(char *)pValue == 'F' || *(char *)pValue == 'T'))
1336 *(pabyRec + psDBF->panFieldOffset[iField]) = *(char *)pValue;
1337 break;
1338
1339 default:
1340 if ((int)strlen((char *)pValue) > psDBF->panFieldSize[iField])
1341 {
1342 j = psDBF->panFieldSize[iField];
1344 }
1345 else
1346 {
1347 memset(pabyRec + psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField]);
1348 j = strlen((char *)pValue);
1349 }
1350 memcpy((char *)(pabyRec + psDBF->panFieldOffset[iField]), (char *)pValue, j);
1351 break;
1352 }
1353
1354 return nRetResult;
1355}
static int DBFLoadRecord(DBFHandle psDBF, int iRecord)
static void DBFWriteHeader(DBFHandle psDBF)
static char DBFGetNullCharacter(char chType)
static int DBFFlushRecord(DBFHandle psDBF)