#include #if !defined(_DBFDEF_H__INCLUDED_) #define _DBFDEF_H__INCLUDED_ #define MIN_DATE (-657434L) // about year 100 #define MAX_DATE 2958465L // about year 9999 #define TG_DBF_CENTURY 1990 // Memo File types #define MEMO_TYPE_DBASE 0x01 // .DBT - dBASE (lower dBASEIV) #define MEMO_TYPE_DBASEIV 0x03 // .DBT - dBASE (dBASEIV or higher) #define MEMO_TYPE_FOXPRO 0x04 // .FPT - FoxPro #define MEMO_TYPE_FOX_DATABASE 0x0C // .DCT - Visual FoxPro Database #define MEMO_TYPE_SIX 0x10 // .SMT - HiPer-SIx // Memo flag #define MF_BINARYREC 0x00000000 // binary memo record in FoxPro #define MF_TEXTREC 0x00000001 // text memo record in FoxPro #define MF_USEDREC 0x0008FFFF // used memo record in dBASEIV // Field types #define FLD_TYPE_CHARACTER 'C' // Character #define FLD_TYPE_CURRENCY 'Y' // Currency #define FLD_TYPE_NUMERIC 'N' // Float or integer #define FLD_TYPE_FLOAT 'F' // Float #define FLD_TYPE_DATE 'D' // Date #define FLD_TYPE_DATETIME 'T' // Date and time #define FLD_TYPE_DOUBLE 'B' // Double in FoxPro #define FLD_TYPE_BINARY 'B' // Binary in dBASE #define FLD_TYPE_INTEGER 'I' // Integer #define FLD_TYPE_LOGICAL 'L' // Logical #define FLD_TYPE_MEMO 'M' // Memo #define FLD_TYPE_GENERAL 'G' // General #define FLD_TYPE_PICTURE 'P' // Picture #define FLD_TYPE_NULLFLAGS '0' // _NullFlags // Lock Style #define LS_NOLOCK 0x00 #define LS_DBASE 0x01 #define LS_CLIPPER 0x02 #define LS_FOX 0x04 // Lock Type #define LT_PESSIMISTIC 0x01 #define LT_OPTIMISTIC 0x02 // Record flags #define REC_FLAG_DELETED '*' // record deleted #define REC_FLAG_NORMAL ' ' // record normal #define REC_EOF 0x1A // eof of head record or memo record // Field flags #define FLD_FLAG_SYSTEM 0x01 // System Column (not visible to user) #define FLD_FLAG_CANBENULL 0x02 // 0x02 Column can store null values #define FLD_FLAG_BINARY 0x04 // 0x04 Binary column (for CHAR and MEMO only) // Open flags #define TG_DBF_USE_SHARED (CFile::shareDenyNone | CFile::modeReadWrite) #define TG_DBF_USE_EXCLUSIVE (CFile::shareExclusive | CFile::modeReadWrite) #define TG_DBF_USE_READ_ONLY (CFile::shareDenyNone | CFile::modeRead) // DBF file types #define DBF_BOOL unsigned char // 1 byte #define DBF_CHAR char // 1 byte #define DBF_UCHAR unsigned char // 1 byte #define DBF_INT short // 2 bytes #define DBF_UINT unsigned short // 2 bytes #define DBF_LONG long // 4 bytes #define DBF_ULONG unsigned long // 4 bytes #define DBF_DOUBLE double // 8 bytes #define QWORD __int64 // 4 WORD - 8 bytes // Swap byte definition #define _SWAP_WORD_BYTE(w) (/**/ (((w)<<8) & 0xFF00)|(((w)>>8) & 0x00FF) /**/) #define SWAP_WORD_BYTE(l) (_SWAP_WORD_BYTE((WORD)(l))) #define _SWAP_DWORD_BYTE(dw) (/**/ ((dw)<<24)|(((dw)<<8) & 0x00FF0000)|(((dw)>>8) & 0x0000FF00)|((dw)>>24) /**/) #define SWAP_DWORD_BYTE(l) (_SWAP_DWORD_BYTE((DWORD)(l))) #define _SWAP_QWORD_BYTE(qw) (/**/ ((QWORD)SWAP_DWORD_BYTE(qw>>32)) | ((QWORD)SWAP_DWORD_BYTE(qw))<<32 /**/) #define SWAP_QWORD_BYTE(l) (_SWAP_QWORD_BYTE((QWORD)(l))) #ifndef HIDWORD #define HIDWORD(l) ((DWORD) (((QWORD) (l) >> 32) & 0xFFFFFFFF)) #endif #ifndef LODWORD #define LODWORD(l) ((DWORD) (l)) #endif //static VARIANT NullVariant = { VT_NULL, 0, 0, 0, 0 }; #pragma pack(1) typedef struct { DBF_UCHAR dbf_id; // 0x02 FoxBASE // 0x03 FoxBASE+/dBASE III PLUS, no memo // 0x30 Visual FoxPro // 0x43 dBASE IV SQL table files, no memo // 0x63 dBASE IV SQL system files, no memo // 0x83 FoxBASE+/dBASE III PLUS, with memo // 0x8B dBASE IV with memo // 0xCB dBASE IV SQL table files, with memo // 0xE5 HiPer-SIx with memo (.SMT) // 0xF5 FoxPro 2.x (or earler) with memo // 0xFB FoxBASE DBF_CHAR last_update[3];// Last update (YYMMDD) // Fox: curent century + YY // dBase: 1900 + YY // SIx: 0x700(1792) + YY DBF_LONG last_rec; // Number of record in file DBF_UINT data_offset; // Position of first data record DBF_UINT rec_size; // Lenght of one data record (including delete flag) DBF_CHAR filler[16]; // Reserved DBF_CHAR table_flag; // Table Flags (Only Visual Foxpro) // 0x01 file has structural .cdx or .mdx // 0x02 file has a Memo field // 0x04 file is a database .dbc // Note that this byte can contain the sum of // any of the above values. DBF_UCHAR code_page; // Code page mark // 0x01 437 U.S. MS-DOS // 0x69 620 Mazovia (Polish) MS-DOS // 0x6A 737 Greek MS-DOS (437G) // 0x02 850 International MS-DOS // 0x64 852 Eastern European MS-DOS // 0x67 861 Icelandic MS-DOS // 0x66 865 Nordic MS-DOS // 0x65 866 Russian MS-DOS // 0x68 895 Kamenicky (Czech) MS-DOS // 0x6B 857 Turkish MS-DOS // 0xC8 1250 Eastern European Windows // 0xC9 1251 Russian Windows // 0x03 1252 Windows ANSI // 0xCB 1253 Greek Windows // 0xCA 1254 Turkish Windows // 0x04 10000 Standard Macintosh // 0x98 10006 Greek Macintosh // 0x96 10007 Russian Macintosh // 0x97 10029 Eastern European Macintosh DBF_UINT reserved; // Recerved, contains 0x00 } DBF_HEAD; typedef struct { DBF_ULONG next_block; // Next free block DBF_UINT reserved; // Reserved DBF_UINT block_size; // Block size } FPT_HEAD; typedef struct { DBF_ULONG next_block; // Next free block DBF_LONG reserved1; // Reserved DBF_CHAR dbf_file_name[9]; // Name parent DBF table DBF_CHAR reserved2[3]; // Reserved DBF_UINT block_size; // Block size } DBT_HEAD; typedef struct { DBF_ULONG next_block; // Next free block DBF_LONG block_size; // Block size DBF_CHAR description[8]; // Description DBF_UINT reserved; // Reserved DBF_UINT free_rec_count; // Free rec count DBF_CHAR free_rec_ptr[490]; // Pointers on free record } SMT_HEAD; typedef struct { DBF_CHAR field_name[11];// Field name DBF_CHAR field_type; // Field type DBF_LONG field_offset; // Pointer on field offset in the record union LEN_INFO { DBF_UINT char_len; struct NUM_SIZE { DBF_CHAR len; // Field len DBF_CHAR dec; // Field decimal } num_size; } len_info; DBF_CHAR field_flag; // Field flag // 0x01 System Column (not visible to user) // 0x02 Column can store null values // 0x04 Binary column (for CHAR and MEMO only) DBF_CHAR filler[13]; // Non used } FIELD_REC; #pragma pack() /* void IEEE2DBF(double* db); double DBF2IEEE(DBF_CHAR* key); */ //{{_INSERT_LOCATION}} #endif // !defined(_DBFDEF_H__INCLUDED_)