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
		
			
				
	
	
		
			917 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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 ;
 |