/* r4relate.h   (c)Copyright Sequiter Software Inc., 1992-1994.  All rights reserved. */

#define relate4filter_record 101
#define relate4do_remove 102
#define relate4skipped 104
#define relate4blank 105
#define relate4skip_rec 106
#define relate4terminate 107
#define relate4exact 108
#define relate4scan 109
#define relate4approx 110
#define relate4sort_skip 120
#define relate4sort_done 121

struct DATA4LIST_ST ;
struct RELATE4_ST ;
struct RELATION4_ST ;

typedef struct
{
  struct DATA4LIST_ST *data_list ;
  TAG4 S4PTR *tag ;  /* The tag whose expression could replace the sub-expression */
} E4INFO_REPORT ;

typedef struct
{
  EXPR4 S4PTR *expr ;
  E4INFO_REPORT S4PTR *info_report ;  /* One per E4INFO entry */
  struct RELATION4_ST S4PTR *relation ;
  CODE4 S4PTR *code_base ;
  char  S4PTR *buf ;
  unsigned buf_pos, buf_len ;
} L4LOGICAL ;

typedef struct DATA4LIST_ST
{
  struct RELATE4_ST S4PTR * S4PTR *pointers ;
  unsigned mem_allocated ;
  int pointers_tot ;
  int pointers_used ;
} DATA4LIST ;

typedef struct RELATE4_ST
{
  LINK4 link ;

  EXPR4 S4PTR *master_expr ;     /* master expression */
  int     match_len ;      /* Number of characters to match */
  TAG4  S4PTR *data_tag ;        /* Null means record # lookup */
  int     relation_type, sort_type ;  /* relate4exact, relate4scan, relate4approx */
  /* Top data file is considered to be a Scan */
  int     error_action ;   /* relate4blank, relate4skip_rec, relate4terminate */
  char   S4PTR *scan_value ;     /* Allocated Memory */
  int     scan_value_len ;

  int is_read ;   /*  0 - Neither this data file nor its slaves read */
  /*  1 - This data file read, slaves unknown */
  DATA4 S4PTR *data ;   /* This is the master for 'slaves' (if any) and */
  /* possibly the slave for another data file. */
  struct RELATE4_ST S4PTR *master ;
  LIST4  slaves ;

  F4FLAG  set ;  /* Specify records for bitmap optimizable sub-expression. */
  struct RELATION4_ST S4PTR *relation ;
  CODE4 S4PTR *code_base ;
  char S4PTR *old_record;

#ifdef S4WINDOWS
  HWND hWnd;
  int total_children;
#endif
} RELATE4 ;

typedef struct
{
  LINK4 link ;
  RELATE4 S4PTR *ptr ;
} RELATE4LIST ;

typedef struct
{
  LINK4 link ;
  DATA4 S4PTR *data ;
  RELATE4 S4PTR *relate ;
} R4DATA_LIST ;

typedef struct RELATION4_ST
{
  RELATE4  relate ;

  LIST4 sort_data_list ;  /* data list for the sort */
  LIST4  relate_list ;  /* A list of scan Relate pointers; */
  /* Includes the top level Relate */
  char S4PTR *expr_source ;

  char locked ;

  SORT4 sort ;
  char S4PTR *sort_source ;
  char S4PTR *other_data, bitmaps_freed, sort_eof_flag, sort_done_flag ;
  int  sort_other_len ;
  long sort_rec_to, sort_rec_on, sort_file_pos, sort_rec_count ;
  FILE4 sorted_file ;
  char sorted_file_name[13] ;

  L4LOGICAL log ;
  int is_initialized ;
  char in_sort ;       /* are we skipping for sorting purposes? */
  char skip_backwards ;   /* is backwards skipping enabled? */

  MEM4 S4PTR *relate_memory ;
  MEM4 S4PTR *relate_list_memory ;
  MEM4 S4PTR *data_list_memory ;
} RELATION4 ;


#define BITMAP4LEAF 0x40
#define BITMAP4AND  0x20

typedef struct CONST4_st
{
  LINK4  link ;
  int    offset ;
  int    len ;
} CONST4 ;

typedef struct BITMAP4_st
{
  LINK4 link ;
  LINK4 eval ;

  /* flags */
  char  branch ;
  char  and_or ;    /* 1 = and, 2 = or, 0 means neither */
  char  evaluated ;
  char  finished;
  char  save_count ;
  char  flip_base ;
  char  pure_map ;
  char  no_match ;    /* no records match an and case */

  L4LOGICAL  S4PTR *log ;
  RELATE4    S4PTR *relate ;
  struct BITMAP4_st S4PTR *base ;
  int type ;   /* r4num, etc. */

  /* Branch only */
  LIST4 children ;
  TAG4 S4PTR *tag ;

  CONST4 lt ;
  CONST4 le ;
  CONST4 gt ;
  CONST4 ge ;
  CONST4 eq ;
  LIST4 ne ;
} BITMAP4 ;

#ifdef __cplusplus
extern "C" {
#endif

  S4EXPORT int S4FUNCTION bitmap4evaluate( L4LOGICAL S4PTR *, int ) ;
  S4EXPORT BITMAP4 S4PTR * S4FUNCTION bitmap4redistribute( BITMAP4 S4PTR *, BITMAP4 S4PTR *, char ) ;
  S4EXPORT BITMAP4 S4PTR * S4FUNCTION bitmap4redistribute_leaf( BITMAP4 S4PTR *, BITMAP4 S4PTR *, BITMAP4 S4PTR * ) ;
  S4EXPORT BITMAP4 S4PTR * S4FUNCTION bitmap4redistribute_branch( BITMAP4 S4PTR *, BITMAP4 S4PTR * ) ;
  S4EXPORT BITMAP4 S4PTR * S4FUNCTION bitmap4create( L4LOGICAL S4PTR *, RELATE4 S4PTR *, char, char ) ;
  S4EXPORT void S4FUNCTION bitmap4destroy( BITMAP4 S4PTR * ) ;
  S4EXPORT BITMAP4 S4PTR * S4FUNCTION bitmap4combine_leafs( BITMAP4 S4PTR *, BITMAP4 S4PTR *, BITMAP4 S4PTR * ) ;
  S4EXPORT long S4FUNCTION bitmap4seek( BITMAP4 S4PTR *, CONST4 S4PTR *, char, long, int ) ;
  S4EXPORT void S4FUNCTION bitmap4copy( BITMAP4 S4PTR *, BITMAP4 S4PTR * ) ;

  S4EXPORT void S4PTR * S4FUNCTION const4return( L4LOGICAL S4PTR *, CONST4 S4PTR * ) ;
  S4EXPORT int S4FUNCTION const4mem_alloc( L4LOGICAL S4PTR *, unsigned ) ;
  S4EXPORT int S4FUNCTION const4duplicate( CONST4 S4PTR *, CONST4 S4PTR *, L4LOGICAL S4PTR * ) ;
  S4EXPORT int S4FUNCTION const4get( CONST4 S4PTR *, BITMAP4 S4PTR *, L4LOGICAL S4PTR *, int ) ;
  S4EXPORT int S4FUNCTION const4less( CONST4 S4PTR *, CONST4 S4PTR *, BITMAP4 S4PTR * ) ;
  S4EXPORT int S4FUNCTION const4eq( CONST4 S4PTR *, CONST4 S4PTR *, BITMAP4 S4PTR * ) ;
  S4EXPORT int S4FUNCTION const4less_eq( CONST4 S4PTR *, CONST4 S4PTR *, BITMAP4 S4PTR * ) ;
  S4EXPORT void S4FUNCTION const4add_ne( BITMAP4 S4PTR *, CONST4 S4PTR * ) ;
  S4EXPORT void S4FUNCTION const4delete_ne( LIST4 S4PTR *, CONST4 S4PTR * ) ;


  /* functions used to build the sort data list */
  S4EXPORT int   S4FUNCTION r4data_list_add( LIST4 S4PTR *, DATA4 S4PTR *, RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION r4data_list_find( LIST4 S4PTR *, RELATE4 S4PTR * ) ;
  S4EXPORT void  S4FUNCTION r4data_list_free( LIST4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION r4data_list_build( LIST4 S4PTR *, RELATE4 S4PTR *, EXPR4 S4PTR *, int ) ;

  S4EXPORT int   S4FUNCTION e4is_constant( E4INFO S4PTR * ) ;
  S4EXPORT int   S4FUNCTION e4is_tag( E4INFO_REPORT S4PTR *, EXPR4 S4PTR *, E4INFO S4PTR *, DATA4 S4PTR * ) ;

  S4EXPORT int   S4FUNCTION log4add_to_list( L4LOGICAL S4PTR *, E4INFO S4PTR *, DATA4LIST S4PTR * ) ;
  /*static int log4build_database_lists( L4LOGICAL S4PTR * ) ;*/
  S4EXPORT int   S4FUNCTION log4true( L4LOGICAL S4PTR * ) ;
  S4EXPORT int   S4FUNCTION log4bitmap_do( L4LOGICAL S4PTR * ) ; /* Do everything regarding bitmaps */
  S4EXPORT int   S4FUNCTION log4determine_evaluation_order( L4LOGICAL S4PTR * ) ;
  S4EXPORT int   S4FUNCTION log4swap_entries( L4LOGICAL S4PTR *, int, int ) ;

  S4EXPORT int   S4FUNCTION data_list4add( DATA4LIST S4PTR *, CODE4 S4PTR *, RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION data_list4expand_from_db_tree( DATA4LIST S4PTR *, CODE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION data_list4is_in( DATA4LIST S4PTR *, RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION data_list4read_records( DATA4LIST S4PTR * ) ;
  S4EXPORT void  S4FUNCTION data_list4remove( DATA4LIST S4PTR *, DATA4LIST S4PTR * ) ;

  S4EXPORT void  S4FUNCTION relate4init_relate( RELATE4 S4PTR *, RELATION4 S4PTR *, DATA4 S4PTR *, CODE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4blank_set( RELATE4 S4PTR *, char ) ;       /* Recursive Blank */
  S4EXPORT int   S4FUNCTION relate4build_scan_list( RELATE4 S4PTR *, RELATION4 S4PTR * ) ;
  S4EXPORT RELATE4 S4PTR * S4FUNCTION relate4create_slave( RELATE4 S4PTR *, DATA4 S4PTR *,
                                                          char S4PTR *, TAG4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4free_relate( RELATE4 S4PTR *, int ) ;
  S4EXPORT void  S4FUNCTION relate4changed( RELATE4 S4PTR * ) ;  /* Slave has been added or freed */
  S4EXPORT RELATE4 S4PTR * S4FUNCTION relate4lookup_relate( RELATE4 S4PTR *, DATA4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4lookup( RELATE4 S4PTR *, char ) ;  /* Lookup the record */
  S4EXPORT int   S4FUNCTION relate4match_len( RELATE4 S4PTR *, int ) ;
  S4EXPORT int   S4FUNCTION relate4next_record_in_scan( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4prev_record_in_scan( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4read_in( RELATE4 S4PTR * ) ;   /* Read a record for this specific data file. */
  /* Assume Master has already been read ! */
  S4EXPORT int   S4FUNCTION relate4read_rest( RELATE4 S4PTR *, char ) ;
  S4EXPORT void  S4FUNCTION relate4set_not_read( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4sort( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4lock( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4unlock( RELATE4 S4PTR * ) ;

  S4EXPORT int   S4FUNCTION relate4error_action( RELATE4 S4PTR *, int ) ;  /* Set the error action */
  S4EXPORT int   S4FUNCTION relate4type( RELATE4 S4PTR *, int ) ;          /* Set the relate type */

  S4EXPORT int   S4FUNCTION relate4do( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4do_one( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4skip_enable( RELATE4 S4PTR *, int ) ;

  S4EXPORT int   S4FUNCTION relate4dbf_in_relation( RELATE4 S4PTR *, DATA4 S4PTR * ) ;


  /* RELATION4 functions */
  S4EXPORT RELATE4 S4PTR * S4FUNCTION relate4init( DATA4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4free( RELATE4 S4PTR *, int ) ;
  S4EXPORT void  S4FUNCTION relate4free_bitmaps( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4next_scan_record( RELATION4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4prev_scan_record( RELATION4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4skip( RELATE4 S4PTR *, long ) ;        /* Extended record skip */
  S4EXPORT int   S4FUNCTION relate4bottom( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4top( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4query_set( RELATE4 S4PTR *, char S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4eof( RELATE4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4sort_set( RELATE4 S4PTR *, char S4PTR * ) ;
  S4EXPORT void  S4FUNCTION relate4sort_free( RELATION4 S4PTR *, int ) ;
  S4EXPORT int   S4FUNCTION relate4sort_next_record( RELATION4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4sort_prev_record( RELATION4 S4PTR * ) ;
  S4EXPORT int   S4FUNCTION relate4sort_get_record( RELATION4 S4PTR *, long ) ;

  /* Used in designer, 1 Moved Down, 0 No Move, -X Moved Up X, 2 Done */
  S4EXPORT int S4FUNCTION relate4next( RELATE4 S4PTR * S4PTR * ) ;

#ifdef __cplusplus
}
#endif