/* Ported to GNU C openVMS/Alpha by Klaus Kämpf, kkaempf@progis.de */ /* * * RMS key XAB definitions */ #ifndef _XABKEYDEF_H #define _XABKEYDEF_H #ifdef __cplusplus extern "C" { #endif #define XAB$C_KEY 21 /* xabkey ID code */ /* key option flags (FLG) bit mask values) */ #define XAB$V_DUP 0 #define XAB$V_CHG 1 #define XAB$V_NUL 2 #define XAB$V_IDX_NCMPR 3 #define XAB$V_KEY_NCMPR 6 #define XAB$V_DAT_NCMPR 7 #define XAB$M_DUP (1< #endif #ifdef __ALPHA #define XABKEY xabkeydef #else struct XABKEY { __XABSTART_FIELDS unsigned char xab$b_ian; /* index level area number */ unsigned char xab$b_lan; /* lowest index level area number */ unsigned char xab$b_dan; /* data level area number */ unsigned char xab$b_lvl; /* level of root bucket */ unsigned char xab$b_ibs; /* size of index buckets in virtual blocks */ unsigned char xab$b_dbs; /* size of data buckets in virtual blocks */ /*(possible alignment problem here)*/ unsigned long xab$l_rvb; /* root bucket start vbn */ unsigned char xab$b_flg; /* key option flags */ unsigned char xab$b_dtp; /* key field data type */ unsigned char xab$b_nsg; /* number of key segments */ unsigned char xab$b_nul; /* nul key character */ unsigned char xab$b_tks; /* total key field size (bytes) */ unsigned char xab$b_ref; /* key of reference (0=prim key, 1-254 = alternate keys) */ unsigned short xab$w_mrl; /* minimun record length to contain key field */ unsigned short xab$w_ifl; /* index bucket fill size (bytes) */ unsigned short xab$w_dfl; /* data bucket fil size (bytes) */ unsigned short xab$w_pos[8]; /* key field record offset positions */ unsigned char xab$b_siz[8]; /* key field segment sizes */ unsigned short : 16; /* spare */ char *xab$l_knm; /* pointer to 32 character key name buffer */ unsigned long xab$l_dvb; /* first data bucket start vbn */ /*- end of ancient XABKEY -*/ /* Additions for prologue 3 files */ unsigned char xab$b_typ[8]; /* key field segment types */ unsigned char xab$b_prolog; /* indicate prologue version desired (primary key only) */ unsigned : 24; /* spare */ /*- end of old XABKEY -*/ void *xab$l_coltbl; /* address of collate table */ unsigned long xab$l_colsiz; /* size of collate table */ char *xab$l_colnam; /* name of collate table */ unsigned : 32, : 32, : 32; /* spare */ } __attribute__ ((packed)); #endif struct xabkeydef { __XABSTART_FIELDS /* The field layout of the key xab is such that it matchs as closely as possible the layout of a key decriptor in the index file prologue. This is so the contents may be moved between the two structures as efficiently as possible. */ unsigned char xab$b_ian; /* index level area number */ unsigned char xab$b_lan; /* lowest index level area number */ unsigned char xab$b_dan; /* data level area number */ unsigned char xab$b_lvl; /* level of root bucket */ unsigned char xab$b_ibs; /* size of index buckets in virtual blocks */ unsigned char xab$b_dbs; /* size of data buckets in virtual blocks */ /*(possible alignment problem here)*/ unsigned long xab$l_rvb; /* root bucket start vbn */ union { unsigned char xab$b_flg; /* key option flags */ #define xab$b_flg xab$r_flg_overlay.xab$b_flg struct { unsigned char xab$v_dup : 1; /* duplicate key values allowed */ unsigned char xab$v_chg : 1; /* alt key only--key field may change on update */ unsigned char xab$v_nul : 1; /* alt key only--null key value enable */ unsigned char xab$v_idx_ncmpr : 1; /* indicate index records for given key are not compressed */ unsigned char : 2; /* spare */ unsigned char xab$v_key_ncmpr : 1; /* indicates key is not compressed in data record */ unsigned char xab$v_dat_ncmpr : 1; /* data record is not compressed */ } xab$r_flg_bits; #define xab$v_dup xab$r_flg_overlay.xab$r_flg_bits.xab$v_dup #define xab$v_chg xab$r_flg_overlay.xab$r_flg_bits.xab$v_chg #define xab$v_nul xab$r_flg_overlay.xab$r_flg_bits.xab$v_nul #define xab$v_idx_ncmpr xab$r_flg_overlay.xab$r_flg_bits.xab$v_idx_ncmpr #define xab$v_key_ncmpr xab$r_flg_overlay.xab$r_flg_bits.xab$v_key_ncmpr #define xab$v_dat_ncmpr xab$r_flg_overlay.xab$r_flg_bits.xab$v_dat_ncmpr } xab$r_flg_overlay; unsigned char xab$b_dtp; /* key field data type */ unsigned char xab$b_nsg; /* number of key segments */ unsigned char xab$b_nul; /* nul key character */ unsigned char xab$b_tks; /* total key field size (bytes) */ unsigned char xab$b_ref; /* key of reference (0=prim key, 1-254 = alternate keys) */ unsigned short xab$w_mrl; /* minimun record length to contain key field */ unsigned short xab$w_ifl; /* index bucket fill size (bytes) */ unsigned short xab$w_dfl; /* data bucket fil size (bytes) */ union { unsigned short xab$w_pos[8]; /* key field record offset positions */ #define xab$w_pos xab$r_pos_overlay.xab$w_pos struct { unsigned short xab$w_pos0; /* segment 0 */ unsigned short xab$w_pos1; /* segment 1 */ unsigned short xab$w_pos2; /* segment 2 */ unsigned short xab$w_pos3; /* segment 3 */ unsigned short xab$w_pos4; /* segment 4 */ unsigned short xab$w_pos5; /* segment 5 */ unsigned short xab$w_pos6; /* segment 6 */ unsigned short xab$w_pos7; /* segment 7 */ } xab$r_pos_fields; #define xab$w_pos0 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos0 #define xab$w_pos1 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos1 #define xab$w_pos2 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos2 #define xab$w_pos3 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos3 #define xab$w_pos4 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos4 #define xab$w_pos5 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos5 #define xab$w_pos6 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos6 #define xab$w_pos7 xab$r_pos_overlay.xab$r_pos_fields.xab$w_pos7 } xab$r_pos_overlay; union { unsigned char xab$b_siz[8]; /* key field segment sizes */ #define xab$b_siz xab$r_siz_overlay.xab$b_siz struct { unsigned char xab$b_siz0; /* segment 0 */ unsigned char xab$b_siz1; /* segment 1 */ unsigned char xab$b_siz2; /* segment 2 */ unsigned char xab$b_siz3; /* segment 3 */ unsigned char xab$b_siz4; /* segment 4 */ unsigned char xab$b_siz5; /* segment 5 */ unsigned char xab$b_siz6; /* segment 6 */ unsigned char xab$b_siz7; /* segment 7 */ } xab$r_siz_fields; #define xab$b_siz0 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz0 #define xab$b_siz1 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz1 #define xab$b_siz2 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz2 #define xab$b_siz3 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz3 #define xab$b_siz4 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz4 #define xab$b_siz5 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz5 #define xab$b_siz6 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz6 #define xab$b_siz7 xab$r_siz_overlay.xab$r_siz_fields.xab$b_siz7 } xab$r_siz_overlay; unsigned short : 16; /* short fill; spare */ /* The positions of the above fields are dictated by the key descriptor record layout in the index file prologue. */ char *xab$l_knm; /* pointer to 32 character key name buffer */ unsigned long xab$l_dvb; /* first data bucket start vbn */ /*- end of ancient XABKEY -*/ /* Additions for prologue 3 files */ union { unsigned char xab$b_typ[8]; /* key field segment types */ #define xab$b_typ xab$r_typ_overlay.xab$b_typ struct { unsigned char xab$b_typ0; /* segment 0 */ unsigned char xab$b_typ1; /* segment 1 */ unsigned char xab$b_typ2; /* segment 2 */ unsigned char xab$b_typ3; /* segment 3 */ unsigned char xab$b_typ4; /* segment 4 */ unsigned char xab$b_typ5; /* segment 5 */ unsigned char xab$b_typ6; /* segment 6 */ unsigned char xab$b_typ7; /* segment 7 */ } xab$r_typ_fields; #define xab$b_typ0 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ0 #define xab$b_typ1 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ1 #define xab$b_typ2 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ2 #define xab$b_typ3 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ3 #define xab$b_typ4 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ4 #define xab$b_typ5 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ5 #define xab$b_typ6 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ6 #define xab$b_typ7 xab$r_typ_overlay.xab$r_typ_fields.xab$b_typ7 } xab$r_typ_overlay; unsigned char xab$b_prolog; /* indicate prologue version desired (primary key only) */ unsigned char : 8; /* char fill; spare */ unsigned short : 16; /* short fill; spare */ /*- end of old XABKEY -*/ void *xab$l_coltbl; /* address of collate table */ unsigned long xab$l_colsiz; /* size of collate table */ char *xab$l_colnam; /* name of collate table */ unsigned : 32, : 32, : 32; /* long fill1, fill2, fill3; spare */ } __attribute__ ((packed)); /* declare initialized prototype data structure */ #ifdef __ALPHA extern struct XABKEY *cc$rms_xabkey_ptr __asm("DECC$GA_RMS_XABKEY"); #define cc$rms_xabkey (*cc$rms_xabkey_ptr) #else extern struct XABKEY cc$rms_xabkey __asm("_$$PsectAttributes_GLOBALSYMBOL$$cc$rms_xabkey"); /* globalref struct XABKEY cc$rms_xabkey; */ #endif #ifdef __cplusplus } #endif #endif /*_XABKEYDEF_H*/