campo-sirio/cb5/d4data.h
alex a0f5e0898b This commit was generated by cvs2svn to compensate for changes in r975,
which included commits to RCS files with non-trunk default branches.

git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
1995-02-06 15:33:45 +00:00

917 lines
26 KiB
C++
Executable File

/* d4data.h (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
extern char v4buffer[257] ;
#ifdef S464BIT
#define S4LONG int
#else
#define S4LONG long
#endif
typedef int S4CALL S4CMP_FUNCTION( S4CMP_PARM, S4CMP_PARM, size_t) ;
#ifdef __SC__
typedef void _cdecl C4DTOK( char S4PTR *, double ) ;
typedef void _cdecl C4STOK( char S4PTR *, char S4PTR *, int ) ;
#else
typedef void C4DTOK( char S4PTR *, double ) ;
typedef void C4STOK( char S4PTR *, char S4PTR *, int ) ;
#endif
struct DATA4_st ;
struct F4MEMO_st ;
struct INDEX4_st ;
struct TAG4_st ;
#ifdef __cplusplus
class S4CLASS FILE4 ;
#else
struct FILE4_st ;
#endif
#ifdef __cplusplus
class S4CLASS CODE4 ;
#else
struct CODE4_st ;
#endif
#ifdef __cplusplus
#ifdef S4WINDOWS
#ifdef S4WIN32
typedef struct _declspec(dllexport) l4link_st
#else
typedef struct _export l4link_st
#endif
#else
typedef struct l4link_st
#endif
#else
typedef struct l4link_st
#endif
{
struct l4link_st S4PTR *n, S4PTR *p ;
} LINK4 ;
#ifdef __cplusplus
class S4CLASS LIST4
{
public:
#else
typedef struct
{
#endif
LINK4 S4PTR *last_node ; /* The last Link */
void S4PTR *selected ;
int n_link ; /* The number of links in the list */
#ifdef __cplusplus
} ;
#else
} LIST4 ;
#endif
typedef struct
{
LINK4 link ;
double data ; /* Make sure it is on a boundry good for at least a double */
} Y4CHUNK ;
typedef struct
{
LINK4 link ;
LIST4 chunks ; /* Chunks of pieces */
LIST4 pieces ; /* A list of available memory pieces */
#ifdef __cplusplus
CODE4 S4PTR *code_base ;
#else
struct CODE4_st *code_base ;
#endif
int unit_start; /* The starting # of entries for the Memory Type */
unsigned unit_size ; /* The size of each allocated piece */
int unit_expand ; /* The expansion # of entries for the Memory Type */
int n_repeat ; /* The number of times entry returned for 'new' */
/* If n_repeat is '-1', it is a temporary entry. */
int n_used ; /* The number of entries used */
} MEM4 ;
typedef struct OPT4BLOCK_st
{
LINK4 link ;
LINK4 lru_link ;
char changed ;
unsigned len ;
/* these next 2 elements must match the OPT4CMP structure above */
#ifdef __cplusplus
FILE4 S4PTR *file ;
#else
struct FILE4_st *file ;
#endif
long pos ;
void S4PTR *data ;
} OPT4BLOCK ;
#ifdef __cplusplus
typedef struct S4CLASS
#else
typedef struct
#endif
{
int num_buffers ;
unsigned long block_size ;
unsigned long buffer_size ;
unsigned long hash_trail ; /* where last optimized file ended */
unsigned long num_blocks ;
LIST4 avail ;
LIST4 dbf_lru ;
LIST4 index_lru ;
LIST4 other_lru ;
LIST4 S4PTR *prio[3] ;
unsigned char old_mode ;
unsigned char do_update ;
unsigned char check_count ;
unsigned char dummy_char ;
int min_link ;
void S4PTR* S4PTR* buffers ;
OPT4BLOCK S4PTR *blocks ;
char block_power ;
char num_shift ;
unsigned long num_lists ;
unsigned long mask ;
LIST4 S4PTR *lists ;
unsigned max_blocks ;
LIST4 opt_files ;
char is_skip ;
char force_current ; /* switch forces a read of current contents */
char S4PTR *read_buffer ;
unsigned long read_start_pos ;
int in_read_buf ;
char S4PTR *write_buffer ;
unsigned long write_start_pos ;
unsigned long write_cur_pos ;
unsigned write_block_count ; /* is the buffer full? */
#ifdef __cplusplus
FILE4 S4PTR *write_file ;
#else
struct FILE4_st S4PTR *write_file ; /* which file has the write buffer? */
#endif
} OPT4 ;
#ifdef __cplusplus
class S4CLASS CODE4
{
public:
#else
typedef struct CODE4_st
{
#endif
unsigned hWnd ; /* For use under Microsoft Windows */
unsigned hInst ;
LIST4 data_list ; /* A list of open data files. */
int default_unique_error ; /* e4unique, r4unique, r4unique_continue */
char date_format[20]; /* Longest is September 15, 1990 */
unsigned mem_size_block ; /* Block size (bytes) for memo and index files */
unsigned mem_size_sort_pool ; /* The default pool size for sorting */
unsigned mem_size_sort_buffer ;/* The default file buffer size when sorting */
unsigned mem_size_buffer ; /* Pack, Zap */
unsigned mem_size_memo ;
unsigned mem_size_memo_expr ;
int mem_expand_block ; /* Expanding block memory allocation */
int mem_expand_data ; /* Expanding data file allocation */
int mem_expand_index ; /* Expanding index file allocation */
int mem_expand_tag ; /* Expanding index file allocation */
unsigned mem_start_data ; /* Initial data file allocation */
unsigned mem_start_block ; /* Initial block memory allocation for index files */
unsigned mem_start_index ; /* Initial index file allocation */
unsigned mem_start_tag ; /* Initial index file allocation */
unsigned mem_start_buffer ;
unsigned long mem_start_max ;
/* True/False Flags */
int auto_open ; /* Automatic production index file opening */
int create_error ; /* Do 'file4create' error ? */
int off_error ; /* Show error messages? */
int exclusive ; /* how should files be opened? */
int file_flush ; /* force hard file flush during write */
int expr_error ;
int field_name_error ;
int go_error ; /* Do 'd4go' error ? */
int open_error ; /* Do 'file4open' error ? */
int optimize ; /* should files be automatically bufferred? */
int read_lock ; /* Do lock when reading database ? */
int read_only ;
int relate_error ; /* do relate4terminate error when no match and relate4terminate selected */
int safety ; /* File create with safety ? */
int skip_error ; /* Do 'DataIndex::skip' error ? */
int tag_name_error;
int lock_attempts ; /* How many times to attempt locks. */
MEM4 S4PTR *index_memory ;
MEM4 S4PTR *data_memory ;
MEM4 S4PTR *tag_memory ;
MEM4 S4PTR *calc_memory ;
MEM4 S4PTR *bitmap_memory ;
LIST4 calc_list ;
MEM4 S4PTR *total_memory ;
LIST4 total_list ; /* A list of T4TOTAL */
LIST4 font_list;
int num_reports ;
int s4cr2;
int error_code ;
int debug_int ; /* used to check structure integrity (set to 0x5281) */
short pageno;
char S4PTR *field_buffer ; /* used by the f4str() function */
unsigned buf_len ;
char S4PTR *expr_work_buf ; /* used by expression parsing */
unsigned expr_buf_len ;
char S4PTR *stored_key ; /* used by the expr4key() function */
unsigned stored_key_len ;
int bitmap_disable ; /* used for testing purposes to test disabled bitmaps */
int do_index_verify ; /* for internal purposes only at this point */
#ifndef S4OPTIMIZE_OFF
int optimize_write ;
OPT4 opt ;
int has_opt, do_opt ;
unsigned int mode ;
#endif
#ifdef S4CLIPPER
int numeric_str_len ; /* the default length for clipper index files */
int decimals ; /* the default # decimals for clipper index files */
#endif
#ifdef S4OS2SEM
#ifdef S4OS2
#ifndef S4IBMOS2
#ifndef __WATCOMC__
HMTX hmtx_mem, hmtx_expr ;
#endif
#endif
#endif
#endif
char saved_key[I4MAX_KEY_SIZE + 2 * sizeof(long)] ; /* used by i4remove.c, i4tag.c and i4addtag.c, i4version_check, t4version_check */
#ifdef __cplusplus
} ;
#else
} CODE4 ;
#endif
#ifdef __cplusplus
class S4CLASS FILE4
{
public:
#else
typedef struct FILE4_st
{
#endif
#ifndef S4OPTIMIZE_OFF
LINK4 link ; /* set to 0 if file not optimized */
long hash_init ;
long len ; /* internal if optimized */
char type ; /* dbf, index, other */
char buffer_writes ; /* are writes being bufferred? */
int do_buffer ; /* is the file bufferring on? */
#endif
char S4PTR *name ;
CODE4 S4PTR *code_base ;
int hand ;
char is_temp ; /* True if it is a temporary file */
/* is_exclusive and is_read_only both on indicate 'r' attribute on file */
/* is_read_only only on indicates user access is limited to read only */
/* if is_exclusive, will do full bufferring, if is_read_only, will avoid */
/* performing any disk writes */
char is_exclusive ; /* True if opened exclusive */
char is_read_only ; /* True if file is read only */
char do_alloc_free ;
char write_buffer ; /* buffer writes where possible */
char file_created ; /* false if the file has not been created yet - i.e. if a memory-only file */
#ifdef S4DEBUG_DEV
char dup_name[255] ;
int has_dup ;
int in_use ;
#endif
#ifdef __cplusplus
} ;
#else
} FILE4 ;
#endif
typedef struct
{
FILE4 file ;
short block_size ; /* Bytes */
struct DATA4_st S4PTR *data ;
int file_lock ; /* True if file is locked */
} MEMO4FILE ;
#ifdef __cplusplus
class S4CLASS FILE4SEQ_READ
{
public:
#else
typedef struct
{
#endif
FILE4 S4PTR *file ;
long pos ; /* The next position to read from */
char S4PTR *buffer ;
unsigned next_read_len ;
unsigned total ; /* Total buffer length */
unsigned working ; /* Temporary working buffer length (to help align write) */
unsigned avail ; /* # of bytes currently available */
#ifdef __cplusplus
} ;
#else
} FILE4SEQ_READ ;
#endif
#ifdef __cplusplus
class S4CLASS FILE4SEQ_WRITE
{
public:
#else
typedef struct
{
#endif
FILE4 S4PTR *file ;
long pos ; /* The next position to read from */
char S4PTR *buffer ;
unsigned total ; /* Total buffer length */
unsigned working ; /* Temporary working buffer length (to help align write) */
unsigned avail ; /* # of bytes left in working buffer */
#ifdef __cplusplus
} ;
#else
} FILE4SEQ_WRITE ;
#endif
typedef struct /* Data File Format */
{
char name[11] ;
char type ;
char filler[4] ;
unsigned char len ;
unsigned char dec ;
char filler2[13] ;
char has_tag ;
} FIELD4IMAGE ;
typedef struct /* Internal Structure and Field Routines. */
{
char name[11] ;
unsigned len ;
int dec ;
int type ;
int offset ;
struct DATA4_st S4PTR *data ;
struct F4MEMO_st S4PTR *memo ;
#ifdef S4VBASIC
int debug_int ; /* used to check structure integrity (set to 0x5281) */
#endif
} FIELD4 ;
typedef struct F4MEMO_st
{
int is_changed ;
int status ; /* 0 - Current contents, 1 - Unknown */
char S4PTR *contents ;
unsigned len ;
unsigned len_max ;
FIELD4 S4PTR *field ;
} F4MEMO ;
typedef struct /* Creating Data File */
{
char S4PTR *name ;
int type ;
unsigned int len ;
unsigned int dec ;
} FIELD4INFO ;
typedef struct
{
/* Database Header Information */
char version ; /* 83H with .dbt, 03H without */
char yy ; /* Last Update */
char mm ;
char dd ;
S4LONG num_recs ;
unsigned short header_len; /* Header Length, Indicates start of data */
unsigned short record_len;
char zero[16] ;
char has_mdx ; /* 1 for true */
char dummy ;
char zero2[2] ;
} DATA4HEADER_FULL ;
typedef struct DATA4_st
{
LINK4 link ;
/* Database Header Information */
char version ; /* 83H with .dbt, 03H without */
char yy ; /* Last Update */
char mm ;
char dd ;
S4LONG num_recs ;
unsigned short header_len; /* Header Length, Indicates start of data */
char S4PTR *record ; /* Data allocated with 'u4alloc' */
char S4PTR *record_old ; /* Data allocated with 'u4alloc' */
/* Extra byte added for temporary CTRL_Z */
unsigned record_width ;
int record_changed ; /* T/F */
S4LONG rec_num ; /* Record number; -1 unknown; 0 for append */
S4LONG rec_num_old ; /* Record number, -1 none present; 0 for append */
FILE4 file ;
char alias[11] ;
char memo_validated ; /* Can we be sure memo id #'s are up to date. */
CODE4 S4PTR *code_base ;
char has_mdx ; /* Has an MDX file attached to it */
FIELD4 S4PTR *fields ; /* An array of field pointers */
int n_fields ; /* The number of data fields in the database */
F4MEMO S4PTR *fields_memo ; /* A list of fields to be flushed */
int n_fields_memo ; /* The number of memo files in the database */
long locked_record ; /* 'locks' data when 'n_locks <= 1' */
long S4PTR *locks ;
int n_locks ; /* Number of elements in 'locks' allocated */
int num_locked ; /* Number of records locked */
int file_lock ; /* True if entire file is locked */
int append_lock ; /* True if the file is locked for appending */
int file_changed ; /* True if the file has been changed since */
/* the header has been updated. */
LIST4 indexes ;
int bof_flag, eof_flag ; /* Beginning/End of File flags */
short block_size ;
MEMO4FILE memo_file ; /* Memo file handle */
#ifdef S4VBASIC
int debug_int ; /* used to check structure integrity (set to 0x5281) */
#endif
#ifndef S4SINGLE
long minCount ; /* used as a minimum record count for various functions */
#endif
long count ; /* a fairly current record count on the database */
/* used by relate module, by put here for compatibility with report writer... */
} DATA4 ;
typedef void S4OPERATOR(void) ;
typedef struct E4INFO_st
{
FIELD4 S4PTR *field_ptr ;
char S4PTR *p1 ;
int len ; /* Length */
int num_entries ; /* Number of entries in sub-expression */
int num_parms ;
int result_pos ; /* The position in the result array for result. */
int i1 ; /* Could be constant position. 'i1' and 'result_pos'
and 'function_i' and 'function'
must be at last position due to memcmp() in e4is_tag() */
int function_i ;
S4OPERATOR S4PTR *function ;
} E4INFO ;
typedef struct e4expr_st
{
E4INFO S4PTR *info ;
int info_n ;
char S4PTR *source ;
char S4PTR *constants ;
int len ;
int type ;
#ifdef S4CLIPPER
int key_dec ; /* used for CLIPPER version */
int key_len ;
#endif
DATA4 S4PTR *data ;
CODE4 S4PTR *code_base ;
int len_eval ; /* This is the length of the buffer needed for evaluation. */
int num_parms ; /* This is the # of parameter positions used in evaluation. */
char has_trim ; /* special case for key evaluation */
} EXPR4 ;
#ifdef N4OTHER
typedef struct
{
long pointer ; /* =0L if record, not pointer */
long num ;
char value[1] ; /* The key size is variable */
} B4KEY_DATA ;
#else
typedef struct
{
S4LONG num ;
char value[1] ; /* The key size is variable */
} B4KEY_DATA ;
#endif
#ifdef S4FOX
/* the following structure is used only on the leaf nodes of the tree structure */
typedef struct
{
short free_space ; /* # bytes available in node */
unsigned char rec_num_mask[4] ; /* record number mask */
unsigned char dup_byte_cnt ; /* duplicate byte mask count */
unsigned char trail_byte_cnt ; /* Trailing byte mask count */
unsigned char rec_num_len ; /* # bits used for record number */
unsigned char dup_cnt_len ; /* # bits used for duplicate count */
unsigned char trail_cnt_len ; /* # bits used for trail count */
unsigned char info_len ; /* # bytes for holding record number, */
} B4NODE_HEADER ;
typedef struct
{
short node_attribute ; /* 0=index, 1=root, 2=leaf */
short n_keys ; /* Block Image starts here */
long left_node ; /* -1 if not present */
long right_node ; /* -1 if not present */
} B4STD_HEADER ;
typedef struct
{
LINK4 link ;
struct TAG4_st S4PTR *tag ;
int changed ;
long file_block ; /* Identifies block within index file */
int key_on ; /* The current key within the block */
int cur_trail_cnt ; /* current value used for seeking */
int cur_dup_cnt ; /* current value used for seeking */
int dup_pos ; /* bit offset into the info for the duplicate data */
int trail_pos ; /* bit offset into the info for the trail data */
int rec_pos ; /* bit offset into the info for the record # data */
char *cur_pos ; /* current position into the data (starts at end) */
int built_on ; /* the 'current' key value (i.e. key really 'on') */
char S4PTR *built_pos ; /* position where built on */
B4KEY_DATA S4PTR *built_key ;
B4STD_HEADER header ;
B4NODE_HEADER node_hdr ; /* only if the block is a leaf */
char data[1] ; /* the remaining data */
} B4BLOCK ;
#endif /* ifdef S4FOX */
#ifndef S4FOX
#ifdef S4NDX
typedef struct
{
long root ;
long eof ;
char n1_dummy ;
char type ;
char n2_dummy[2] ;
short key_len ;
short keys_max ; /* Maximum # of keys per block; <= 100 */
short int_or_date ; /* TRUE (1) if Numeric or Date Key */
short group_len ; /* key_len plus 8 increased to a multiple of 2 */
short dummy ;
short unique ; /* TRUE if Unique */
/* char expression[256] ; */
/* long version ; */
} I4IND_HEAD_WRITE;
#else
#ifdef S4CLIPPER
typedef struct
{
short sign ;
short version ;
long root ; /* Root Block */
long eof ; /* First Free Block Pointer */
short group_len ; /* Key Length + 2*sizeof(long) */
short key_len ; /* Key Length */
short key_dec ; /* Number of Decimals in Key */
short keys_max ; /* Maximum # of keys per block; <= 100 */
short keys_half ; /* Maximum # of keys per half block */
/* char expression[256]; The index expression corresponding to the database. */
/* short unique ; TRUE if Unique */
} I4IND_HEAD_WRITE;
#endif
#endif
#ifdef S4NDX
typedef struct
{
long old_version ;
int header_offset ;
long root ;
long eof ;
char n1_dummy ;
char type ;
char n2_dummy[2] ;
short key_len ;
short keys_max ; /* Maximum # of keys per block; <= 100 */
short int_or_date ; /* TRUE (1) if Numeric or Date Key */
short group_len ; /* key_len plus 8 increased to a multiple of 2 */
short dummy ;
short unique ; /* TRUE if Unique */
/* char expression[256] ; */
long version ;
} T4HEADER ;
#else
#ifdef S4CLIPPER
typedef struct
{
long old_version ;
int header_offset ;
long virtual_eof ; /* The next available file block */
short sign ;
short version ;
long root ; /* Root Block */
long eof ; /* First Free Block Pointer */
short group_len ; /* Key Length + 2*sizeof(long) */
short key_len ; /* Key Length */
short key_dec ; /* Number of Decimals in Key */
short keys_max ; /* Maximum # of keys per block; <= 100 */
short keys_half ; /* Maximum # of keys per half block */
/* char expression[256] ; The index expression corresponding to the database. */
short unique ; /* TRUE if Unique */
short descending ; /* The descending flag corresponding to the index file */
/* char filter[256] ; The filter(for) expression corresponding to the database. */
} T4HEADER ;
#else
typedef struct
{
char two ; /* Version number (currently 2) */
char yymmdd[3] ; /* Date of last reindex */
char data_name[12] ; /* Name of associated data file */
char dummy1[4] ; /* extra 4 bytes for data-names-not used in DOS */
short block_chunks ; /* Block Size 1 to 32 (512 byte chunks) */
short block_rw ; /* Block Read/Write Size in bytes */
char is_production ; /* 1 if production index, else 0 */
char num_slots ; /* number possible tags (48) */
short slot_size ; /* number bytes/tag slot (32) */
short num_tags ;
short dummy2 ;
S4LONG eof ;
S4LONG free_list ; /* start of the free list */
char zero[4] ;
char create_date[3]; /* not used by CodeBase */
char blank ;
} I4HEADER ;
#endif /* ifdef S4CLIPPER */
#endif /* ifdef S4NDX */
#endif /* ifndef S4FOX */
#ifndef S4FOX
typedef struct
{
LINK4 link ;
struct TAG4_st S4PTR *tag ;
long file_block ; /* Identifies block within index file */
int changed ;
int key_on ; /* The current key within the block */
short n_keys ; /* Block Image starts here */
#ifdef S4NDX
char dummy[2] ;
B4KEY_DATA data ;
#else
#ifdef S4CLIPPER
short pointers[( B4BLOCK_SIZE / 2 - 1 )] ;
B4KEY_DATA S4PTR *data ;
#else
char dummy[6] ;
B4KEY_DATA info ;
#endif
#endif
} B4BLOCK ;
typedef struct
{
S4LONG header_pos ; /* Header position (in 512 byte chunks) */
char tag[10] ;
short x1000 ; /* used for dBASE/SQL expression type - dBASE only allowed for CBPP 1.0x */
char left_chld ;
char right_chld ;
char parent ;
char x2 ;
char index_type ;
char zeros[11] ;
} T4DESC ;
#endif /* ifndef S4FOX */
#ifndef N4OTHER
typedef struct
{
#ifdef S4FOX
S4LONG root ; /* -1 means unknown */
S4LONG free_list ; /* start of the free list (-1 if none) */
unsigned S4LONG version ; /* used multi-user only */
short key_len ; /* Key Length */
unsigned char type_code; /* 0x01 Uniq; 0x08 For Clause; 0x32 Compact; 0x80 Compound */
unsigned char signature ; /* unused */
/* char dummy2[482] ; unused */
char dummy3[4] ;
short descending ; /* 1 = descending, 0 = ascending */
short filter_pos ; /* not used, == to expr_len */
short filter_len ; /* length of filter clause */
short expr_pos ; /* not used, == to 0 */
short expr_len ; /* length of expression */
/* char expr_pool[512] ; expression and filter pool */
#else
S4LONG root ; /* -1 means unknown */
char dummy1[4] ;
char type_code; /* 0x10 Normal; 0x58 Uniq,Desc; 0x50 Uniq; 0x18 Desc */
char type ; /* N,D, or C (F is type N) */
char dummy2[2] ;
short key_len ;
short keys_max ; /* Maximum # of keys per block; <= 100 */
char dummy3[2] ; /* 1 if Numeric or Date Key (NDX only) */
short group_len ; /* key_len plus 4 (MDX); plus 8 (NDX) */
unsigned char version ;
char dummy4 ;
short unique ; /* 0x4000 (TRUE)if Unique */
/* Note, 'expr_key[220]' comes after 'unique' and */
/* 'expr_filter[220]' comes at position 0x2FA */
#endif
} T4HEADER ;
#endif /* ifndef N4OTHER */
typedef struct TAG4_st
{
LINK4 link ;
EXPR4 S4PTR *expr ;
EXPR4 S4PTR *filter ;
int unique_error; /* Is rewriting a unique key an error ? */
struct INDEX4_st S4PTR *index ;
S4CMP_FUNCTION *cmp ;
C4STOK S4PTR *stok ; /* Conversion for 'seek' */
C4DTOK S4PTR *dtok ; /* Conversion for 'seek' */
CODE4 S4PTR *code_base ;
char alias[11] ;
char has_keys ;
LIST4 blocks ;
FILE4 file ;
int file_locked ;
T4HEADER header ;
long header_offset ; /* Offset in file to the tag's header info. */
int root_write ; /* True if 'header.root' needs to be written */
int key_dec ;
LIST4 saved ;
int debug_int ; /* used to check structure integrity (set to 0x5281) */
#ifdef S4MDX
char had_keys ;
#endif
#ifdef S4FOX
char p_char ;
#endif
#ifdef S4CLIPPER
long check_eof ; /* used for debug purposes to verify eof length */
#endif
#ifdef S4MDX
long changed ;
#endif
#ifdef S4UNIX
int key_type ;
#endif
} TAG4 ;
typedef struct
{
char S4PTR *name ;
char S4PTR *expression ;
char S4PTR *filter ;
int unique ;
unsigned int descending ;
} TAG4INFO ;
typedef struct INDEX4_st
{
LINK4 link ;
FILE4 file ;
DATA4 S4PTR *data ;
CODE4 S4PTR *code_base ;
LIST4 tags ;
char alias[11] ;
#ifdef S4FOX
TAG4 S4PTR *tag_index ; /* the tags are a tag in the index file! */
long eof ;
#else
#ifdef N4OTHER
char S4PTR *path ;
#else
I4HEADER header ;
#endif
#endif
MEM4 S4PTR *block_memory ;
int file_locked ; /* True if locked */
#ifdef S4FOX
unsigned long version_old ;
#else
#ifdef S4MDX
long changed ;
#else
long version_old ;
#endif
#endif
} INDEX4 ;
/* Memo File Structures */
typedef struct
{
#ifdef S4MFOX
S4LONG next_block ; /* Memo Entry 1,2, ... */
char usused[2] ;
short block_size ; /* Bytes */
#else
#ifdef S4MNDX
long next_block ; /* Memo Entry 1,2, ... */
#else
S4LONG next_block ; /* Memo Entry 1,2, ... */
S4LONG zero ;
char file_name[8] ;
short zero2 ;
short x102 ;
short block_size ; /* Bytes */
short zero3 ;
#endif
#endif
} MEMO4HEADER ;
#ifndef S4MNDX
#ifndef S4MFOX
typedef struct
{
S4LONG next ; /* The next free block area */
S4LONG num ; /* The number of free blocks in the free block area */
int to_disk ; /* TRUE if this information needs to be written to disk */
S4LONG block_no ; /* The current block number */
} MEMO4CHAIN_ENTRY ;
#endif /* ifndef S4MFOX */
typedef struct
{
#ifdef S4MFOX
long type ; /* 0 for picture, 1 for text -- picture not supported */
long num_chars ; /* Including the 'MemoBlock' */
#else
short minus_one ; /* '-1' for dBASE IV */
short start_pos ;
S4LONG num_chars ; /* Including the 'MemoBlock' */
#endif
} MEMO4BLOCK ;
#endif /* ifndef S4MNDX */
typedef struct
{
unsigned char sig_dig ; /* The number of significant digits; 52 is zero */
unsigned char digit_info ; /* contains one, len and sign */
unsigned char bcd[10] ;
} C4BCD ;