void FoxPro::saveFields(WriteStream &dbf) const { for (size_t i = 0; i < _fields.size(); i++) { const Field &field = _fields[i]; int l = strlen(field.name.c_str()); dbf.write(field.name.c_str(), MIN(10, l)); dbf.writeByte(0x00); while ((10 - l++) > 0) dbf.writeByte(0x00); dbf.writeByte((byte) ((char) field.type)); dbf.writeUint32LE(field.offset); dbf.writeByte(field.size); dbf.writeByte(field.decimals); dbf.writeByte(field.flags); dbf.writeUint32LE(field.autoIncNext); dbf.writeByte (field.autoIncStep); dbf.writeUint32LE(0x00000000); // Reserved dbf.writeUint32LE(0x00000000); // Reserved } dbf.writeByte(0x0D); // Field end marker }
void FoxPro::saveHeader(WriteStream &dbf) const { dbf.writeByte(0xF5); // Version dbf.writeByte(_lastUpdate.year() - 2000); dbf.writeByte(_lastUpdate.month()); dbf.writeByte(_lastUpdate.day()); dbf.writeUint32LE(_records.size()); // Header + fields + field end marker uint16 firstRecordPos = 32 + _fields.size() * 32 + 1; dbf.writeUint16LE(firstRecordPos); uint16 recordSize = _fields.back().offset + _fields.back().size; dbf.writeUint16LE(recordSize); dbf.writeUint32LE(0x00000000); // Reserved dbf.writeUint32LE(0x00000000); // Reserved dbf.writeUint32LE(0x00000000); // Reserved dbf.writeUint32LE(0x00000000); // Reserved uint8 flags = (_hasIndex ? 0x01 : 0x00) | (_hasMemo ? 0x02 : 0x00); dbf.writeByte(flags); dbf.writeByte(0x00); // Codepage marker dbf.writeUint16LE(0x0000); // Reserved }