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 ;
 |