8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 05:23:03 +01:00

-Rollback

This commit is contained in:
brodsom 2004-06-09 18:11:27 +00:00
parent 1b02024c27
commit 0dbaf0453b
5 changed files with 109 additions and 147 deletions

View File

@ -87,33 +87,31 @@ enum act_t {
struct dbb;
struct act {
typedef struct act {
enum act_t act_type; // what to do
act* act_next; // next action in system
dbb* act_object; // object in question (dudley_rel, dudley_fld, idx, etc.)
USHORT act_line; // line the action started on
USHORT act_flags;
};
typedef act* ACT;
} *ACT;
const int ACT_ignore = 1; // Ignore the action
/* Context block */
struct dudley_ctx {
typedef struct dudley_ctx {
struct sym* ctx_name;
struct dudley_rel* ctx_relation;
struct dudley_fld* ctx_field;
USHORT ctx_view_rse;
USHORT ctx_context_id;
};
typedef dudley_ctx* DUDLEY_CTX;
} *DUDLEY_CTX;
/* Database Definition Block */
struct dbb {
typedef struct dbb {
struct sym* dbb_name;
struct dudley_rel* dbb_relations;
struct gfl* dbb_fields;
@ -133,9 +131,8 @@ struct dbb {
SSHORT dbb_numbufs;
SSHORT dbb_bufsize;
SLONG dbb_grp_cmt_wait;
fil* dbb_cache_file;
};
typedef dbb* DBB;
struct fil* dbb_cache_file;
} *DBB;
enum dbb_flags_vals {
DBB_null_description = 1,
@ -157,7 +154,7 @@ enum ods_versions {
/* Field block. Fields are what farms and databases are all about */
struct dudley_fld {
typedef struct dudley_fld {
SSHORT fld_dtype; /* data type of field */
SSHORT fld_length; /* field length in bytes */
SSHORT fld_scale; /* scale factor */
@ -188,8 +185,7 @@ struct dudley_fld {
struct txt* fld_compute_src; /* computed_by source */
struct txt* fld_valid_src; /* validation source */
SLONG* fld_ranges; /* ranges for multi-dim. array */
};
typedef dudley_fld* DUDLEY_FLD;
} *DUDLEY_FLD;
enum fld_flags_vals {
fld_explicit_position = 1,
@ -208,7 +204,7 @@ enum fld_flags_vals {
/* File description block */
struct fil {
typedef struct fil {
SLONG fil_length; /* File length in pages */
SLONG fil_start; /* Starting page */
struct sym* fil_name; /* File name */
@ -218,26 +214,24 @@ struct fil {
SSHORT fil_partitions; /* number of log file partitions */
SSHORT fil_raw; /* on raw device? */
SSHORT fil_conditional; /* flag to indicate conditional shadow */
};
typedef fil* FIL;
} *FIL;
/* Filter block */
struct filter {
typedef struct filter {
struct sym* filter_name; /* symbol for filter name */
struct txt* filter_description; /* description of filter */
struct sym* filter_module_name; /* symbol for module name */
struct sym* filter_entry_point; /* symbol for entrypoint */
SSHORT filter_input_sub_type;
SSHORT filter_output_sub_type;
};
typedef filter* FILTER;
} *FILTER;
/* Function argument block. */
struct funcarg {
typedef struct funcarg {
struct sym* funcarg_funcname; /* symbol for function name */
SSHORT funcarg_position; /* argument position */
SSHORT funcarg_mechanism; /* argument passed by value, or by reference */
@ -248,8 +242,7 @@ struct funcarg {
SSHORT funcarg_sub_type; /* sub_type of text */
SSHORT funcarg_has_sub_type; /* null field for sub_type field */
funcarg* funcarg_next; /* next field in function */
};
typedef funcarg* FUNCARG;
} *FUNCARG;
enum funcarg_mechanism_vals {
FUNCARG_mechanism_value = 0,
@ -262,7 +255,7 @@ enum funcarg_mechanism_vals {
/* Function description block */
struct func {
typedef struct func {
struct sym* func_name; /* symbol for function name */
struct sym* func_query_name; /* symbol for query name */
struct sym* func_module_name; /* symbol for module name */
@ -273,8 +266,7 @@ struct func {
struct txt* func_description; /* description of function */
funcarg* func_args; /* Known function arguments */
funcarg* func_return; /* Return argument */
};
typedef func* FUNC;
} *FUNC;
/* Index description block */
@ -285,7 +277,7 @@ enum idx_direction
IDX_type_descend = 1
};
struct dudley_idx {
typedef struct dudley_idx {
USHORT idx_count; /* Number of fields */
bool idx_unique; /* true if unique index */
bool idx_inactive; /* false if index is active */
@ -295,8 +287,7 @@ struct dudley_idx {
struct sym* idx_relation; /* Relation in question */
struct txt* idx_description; /* Description pointer */
struct sym* idx_field[1]; /* Fields */
};
typedef dudley_idx* DUDLEY_IDX;
} *DUDLEY_IDX;
enum idx_flags_vals {
IDX_active_flag = 1,
@ -348,13 +339,12 @@ enum nod_t {
nod_set_generator, nod_index
};
struct dudley_nod {
typedef struct dudley_nod {
enum nod_t nod_type; /* node type */
UCHAR* nod_blr; /* symbolic blr string */
SSHORT nod_count; /* number of sub-items */
dudley_nod* nod_arg[1]; /* argument */
};
typedef dudley_nod* DUDLEY_NOD;
} *DUDLEY_NOD;
static inline size_t NOD_LEN(const size_t cnt)
{
@ -364,7 +354,7 @@ static inline size_t NOD_LEN(const size_t cnt)
/* Relation block, not to be confused with siblings or in-laws */
struct dudley_rel {
typedef struct dudley_rel {
dbb* rel_database; /* parent database */
struct sym* rel_filename; /* external filename */
dudley_fld* rel_fields; /* linked list of known fields */
@ -377,8 +367,7 @@ struct dudley_rel {
USHORT rel_field_position; /* highest used field position */
SSHORT rel_system; /* 0 if relation is user defined */
USHORT rel_flags;
};
typedef dudley_rel* DUDLEY_REL;
} *DUDLEY_REL;
enum rel_flags_values {
rel_null_description = 1,
@ -393,24 +382,22 @@ enum rel_flags_values {
/* Security class handling */
struct scl {
typedef struct scl {
struct sym* scl_name; /* name of security class */
struct txt* scl_description; /* description of security class */
struct sce* scl_entries; /* list of entries */
};
typedef scl* SCL;
} *SCL;
const int SCL_write = 2;
/* Security entry */
struct sce {
typedef struct sce {
sce* sce_next; /* next security item in list */
SLONG sce_privileges; /* bitmask of privileges */
UCHAR* sce_idents[20]; /* misc identification stuff */
UCHAR sce_strings[1];
};
typedef sce* SCE;
} *SCE;
/* String block for build DYN & BLR strings */
@ -443,7 +430,7 @@ enum sym_t {
SYM_trigger /* any named element deserves to be hashed */
};
struct sym {
typedef struct sym {
TEXT* sym_string; /* address of asciz string */
SSHORT sym_length; /* length of string (exc. term.) */
enum sym_t sym_type; /* symbol type */
@ -452,8 +439,7 @@ struct sym {
sym* sym_collision; /* collision pointer */
sym* sym_homonym; /* homonym pointer */
TEXT sym_name[1]; /* space for name, if necessary */
};
typedef sym* SYM;
} *SYM;
const size_t SYM_LEN = sizeof(sym);
@ -461,7 +447,7 @@ const size_t SYM_LEN = sizeof(sym);
/* these are the externally visible trigger types */
enum TRG_T {
typedef enum {
trg_type_none = 0, /* pre store */
trg_store = 1, /* pre store */
trg_post_store = 2,
@ -469,7 +455,7 @@ enum TRG_T {
trg_post_modify = 4,
trg_pre_erase = 5,
trg_erase = 6 /* post erase */
};
} TRG_T;
/* these types are used in parsing */
@ -482,7 +468,7 @@ enum parse_trig_types {
trig_inact = 16
};
struct dudley_trg {
typedef struct dudley_trg {
TRG_T trg_type;
DUDLEY_REL trg_relation;
DUDLEY_NOD trg_statement; /* blr */
@ -492,8 +478,7 @@ struct dudley_trg {
SSHORT trg_sequence;
SSHORT trg_inactive; /* 0 = on, 1 = off */
USHORT trg_mflag; /* modify attributes */
};
typedef dudley_trg* DUDLEY_TRG;
} *DUDLEY_TRG;
/* trg_modify_flag */
@ -507,52 +492,48 @@ enum trg_modify_flag_vals {
/* Trigger message block */
struct trgmsg {
typedef struct trgmsg {
sym* trgmsg_trg_name; /* symbol for trigger */
SSHORT trgmsg_number; /* abort code */
sym* trgmsg_text;
};
typedef trgmsg* TRGMSG;
} *TRGMSG;
enum TRGMSG_T {
typedef enum {
trgmsg_none = 0,
trgmsg_add = 1,
trgmsg_modify = 2,
trgmsg_drop = 3
};
} TRGMSG_T;
/* Text block */
struct txt {
typedef struct txt {
TEXT* txt_file;
ULONG txt_position;
USHORT txt_length;
USHORT txt_start_line;
};
typedef txt* TXT;
} *TXT;
/* Type block */
struct typ {
typedef struct typ {
sym* typ_field_name; /* field name */
sym* typ_name; /* type name */
SSHORT typ_type; /* type value */
txt* typ_description; /* description of relation */
};
typedef typ* TYP;
} *TYP;
/* User privilege block */
struct userpriv {
typedef struct userpriv {
sym* userpriv_relation;
struct usre* userpriv_userlist;
struct upfe* userpriv_upflist;
USHORT userpriv_flags;
};
typedef userpriv* USERPRIV;
} *USERPRIV;
/* user privilege flags */
@ -573,19 +554,17 @@ static const char* const UPRIV_UPDATE = "UPDATE";
/* user name entry */
struct usre {
typedef struct usre {
usre* usre_next;
sym* usre_name;
};
typedef usre* USRE;
} *USRE;
/* update field entry */
struct upfe {
typedef struct upfe {
upfe* upfe_next;
sym* upfe_fldname;
};
typedef upfe* UPFE;
} *UPFE;
/* Data types */
@ -595,11 +574,10 @@ typedef upfe* UPFE;
/* Constant block */
struct con {
typedef struct con {
dsc con_desc;
UCHAR con_data[1];
};
typedef con* CON;
} *CON;
/* Program globals */

View File

@ -235,15 +235,14 @@ enum tok_t {
tok_eol
};
struct tok {
typedef struct tok {
enum tok_t tok_type; /* type of token */
sym* tok_symbol; /* hash block if recognized */
enum kwwords tok_keyword; /* keyword number, if recognized */
SLONG tok_position; /* byte number in input stream */
USHORT tok_length;
TEXT tok_string[MAXSYMLEN];
};
typedef tok* TOK;
} *TOK;
#endif // DUDLEY_PARSE_H

View File

@ -131,11 +131,10 @@ const USHORT IPS_MAX_PAGES_PER_CLI = 16; /* max 1k pages space per client */
#define IPS_UNPACK_MAPNUM(n) (((ULONG)(n - IP_BIAS) >> 8) & 0xFF)
#define IPS_UNPACK_USERNUM(n) ((n - IP_BIAS) & 0xFF)
struct bid {
typedef struct bid {
ULONG bid_relation_id; /* Relation id (or null) */
ULONG bid_number; /* Record number */
};
typedef bid* BID;
} *BID;
/* Block types */
@ -147,15 +146,14 @@ struct blk;
/* Block types */
struct cnct {
typedef struct cnct {
int *cnct_read_pipe; /* this is really a FILE pointer */
int *cnct_write_pipe; /* this is really a FILE pointer */
};
typedef cnct* CNCT;
} *CNCT;
/* mapped file structure */
struct ipm {
typedef struct ipm {
struct ipm *ipm_next; /* pointer to next one */
USHORT ipm_count; /* slots in use */
USHORT ipm_number; /* mapped area number */
@ -164,15 +162,14 @@ struct ipm {
LPVOID ipm_address; /* address of mapped memory */
UCHAR ipm_ids[IPS_MAX_NUM_CLI];
/* ids */
};
typedef ipm* IPM;
} *IPM;
/* mapped structure flags */
const USHORT IPMF_SERVER_SHUTDOWN = 1; /* server has shut down */
/* thread connection control block */
struct icc
typedef struct icc
{
blk icc_header;
struct icc* icc_next; /* pointer to next thread */
@ -191,8 +188,7 @@ struct icc
SSHORT icc_flags; /* status bits */
HANDLE icc_waits[2]; /* wait for these handles */
UCHAR* icc_mapped_addr; /* where the thread's mapped to */
};
typedef icc* ICC;
} *ICC;
/* icc structure flags */
const USHORT ICCF_SHUTDOWN = 1; /* shutdown in progress */
@ -201,7 +197,7 @@ const USHORT ICCF_UNMAP_CLIENT = 4; /* client maps must be shut down */
/* database block */
struct idb
typedef struct idb
{
blk idb_header;
struct icc* idb_thread; /* back pointer to thread */
@ -214,8 +210,7 @@ struct idb
int* idb_status_vector; /* pointer to status vector */
USHORT idb_flags; /* flags (see below) */
SCHAR* idb_setjmp;
};
typedef idb* IDB;
} *IDB;
const USHORT IDBF_DATABASE_ATTACHMENT = 1;
const USHORT IDBF_SERVICE_ATTACHMENT = 2;
@ -223,7 +218,7 @@ const USHORT IDBF_SERVER_SHUTDOWN = 4;
/* transaction block */
struct itr
typedef struct itr
{
blk itr_header;
struct idb* itr_idb;
@ -231,14 +226,13 @@ struct itr
struct ibl* itr_blobs;
FB_API_HANDLE itr_handle;
USHORT itr_flags;
};
typedef itr* ITR;
} *ITR;
const USHORT ITR_limbo = 1;
/* blob control block */
struct ibl
typedef struct ibl
{
blk ibl_header;
struct idb* ibl_idb;
@ -252,8 +246,7 @@ struct ibl
USHORT ibl_fragment_length;
USHORT ibl_buffer_length;
UCHAR ibl_buffer[1];
};
typedef ibl* IBL;
} *IBL;
//const USHORT IBL_eof = 1;
//const USHORT IBL_segment = 2;
@ -262,19 +255,18 @@ const USHORT IBL_create = 8;
/* request block */
struct irq {
typedef struct irq {
blk irq_header;
struct idb *irq_idb;
struct tra *irq_itr;
struct irq *irq_next;
struct irq **irq_user_handle;
FB_API_HANDLE irq_handle;
};
typedef irq* IRQ;
} *IRQ;
/* event structure */
struct ivnt {
typedef struct ivnt {
blk ivnt_header;
struct ivnt *ivnt_next;
struct idb *ivnt_idb;
@ -283,12 +275,11 @@ struct ivnt {
HWND ivnt_window;
SLONG ivnt_id;
SLONG ivnt_handle;
};
typedef ivnt* IVNT;
} *IVNT;
/* remote SQL request */
struct ipserver_isr {
typedef struct ipserver_isr {
blk isr_header;
struct ipserver_isr *isr_next;
struct idb *isr_idb;
@ -301,8 +292,7 @@ struct ipserver_isr {
ISC_STATUS_ARRAY isr_status;
UCHAR *isr_cursor;
UCHAR *isr_packed;
};
typedef ipserver_isr* IPSERVER_ISR;
} *IPSERVER_ISR;
#define BLKDEF(type, root, tail) type,
enum blk_t {
@ -337,7 +327,7 @@ enum blk_t {
each of the five transfer blocks.
*/
struct ips_string {
typedef struct {
ULONG ips_cl_size; /* client buffer size */
ULONG ips_sv_size; /* server buffer size */
ULONG ips_sv_alloced; /* server buffer size allocated */
@ -350,7 +340,7 @@ struct ips_string {
UCHAR *ips_cl_addr; /* address of client buffer */
const UCHAR* ips_sv_addr; /* address of server buffer */
UCHAR *ips_sv_buffer; /* allocated local buffer */
};
} ips_string;
const ULONG IPS_INPUT_BUFFER = 1; /* used for input from client */
const ULONG IPS_OUTPUT_BUFFER = 2; /* used for output to client */
@ -386,10 +376,10 @@ const ULONG IPS_OUTPUT_BUFFER = 2; /* used for output to client */
- unwind request
*/
struct ips_object {
typedef struct {
UCHAR *ips_handle; /* handle of object */
ULONG ips_parameter; /* a parameter, used if needed */
};
} ips_object;
const USHORT IPS_ATTACH_NAME = 0; /* use controller 0 for db name */
const USHORT IPS_ATTACH_DPB = 1; /* use controller 1 for dpb */
@ -415,33 +405,33 @@ const USHORT IPS_PREPARE_TRANS = 0; /* use controller 0 for string */
/* structure used to compile requests */
struct ips_compile_req {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
UCHAR *ips_rq_handle; /* returned request handle */
};
} ips_compile_req;
const USHORT IPS_COMPILE_REQ = 0; /* use controller 0 for blr */
/* structure used by create/open blob (and create/open blob2) */
struct ips_blob {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
UCHAR *ips_tr_handle; /* transaction handle */
UCHAR *ips_bl_handle; /* returned blob handle */
ULONG ips_rel_id; /* returned relation ID */
ULONG ips_bid_number; /* returned blob ID number */
};
} ips_blob;
const USHORT IPS_BLOB_BPB = 0; /* use contorller 0 for bpb */
/* structure used for DDL operations */
struct ips_ddl {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
UCHAR *ips_tr_handle; /* transaction handle */
};
} ips_ddl;
const USHORT IPS_DDL_DDL = 0; /* use controller 0 for ddl */
@ -459,7 +449,7 @@ const USHORT IPS_DDL_DDL = 0; /* use controller 0 for ddl */
- set cursor
*/
struct ips_dsql {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
UCHAR *ips_tr_handle; /* transaction handle (in/out) */
UCHAR *ips_st_handle; /* statement handle */
@ -467,7 +457,7 @@ struct ips_dsql {
USHORT ips_msg_type; /* message type */
USHORT ips_msg_out; /* output message type */
USHORT ips_rec_count; /* packed records count */
};
} ips_dsql;
const USHORT IPS_DSQL_EXEC_BLR = 0; /* use controller 0 for blr */
const USHORT IPS_DSQL_EXEC_MSG = 1; /* use controller 1 for message */
@ -502,23 +492,23 @@ const USHORT IPS_DSQL_SET_CURSOR = 0; /* use controller 0 for name */
/* structure used to get/put blob segments */
struct ips_segment {
typedef struct {
UCHAR *ips_bl_handle; /* blob handle */
USHORT ips_length; /* returned actual length */
};
} ips_segment;
const USHORT IPS_BLOB_SEGMENT = 0; /* use controller 0 for segment */
/* structure used to get/put array slices */
struct ips_slice {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
UCHAR *ips_tr_handle; /* transaction handle */
ULONG ips_rel_id; /* array rel id */
ULONG ips_number; /* array number */
ULONG ips_length; /* returned actual length */
};
} ips_slice;
const USHORT IPS_SLICE_SDL = 0; /* use controller 0 for sdl */
const USHORT IPS_SLICE_PARAM = 1; /* use controller 1 for parameters */
@ -527,20 +517,20 @@ const USHORT IPS_SLICE_BUFFER = 2; /* use controller 2 for slice */
/* structure for queueing events */
struct ips_que_events {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
ULONG ips_event_id; /* returned event id */
HWND ips_event_hwnd; /* window handle to return to */
FPTR_EVENT_CALLBACK ips_ast; /* ast address */
UCHAR* ips_arg; /* ast arg */
};
} ips_que_events;
const USHORT IPS_QUEUE_EVENT = 0; /* use controller 0 for event */
/* structure for send/receive message */
struct ips_request {
typedef struct {
UCHAR *ips_tr_handle; /* transaction handle */
UCHAR *ips_rq_handle; /* request handle */
USHORT ips_msg_type; /* message type */
@ -549,7 +539,7 @@ struct ips_request {
USHORT ips_direction; /* direction */
ULONG ips_offset; /* offset */
#endif
};
} ips_request;
const USHORT IPS_SEND_MESSAGE = 0; /* use controller 0 for message */
const USHORT IPS_RECEIVE_MESSAGE = 0; /* use controller 0 for message */
@ -557,38 +547,38 @@ const USHORT IPS_RECEIVE_MESSAGE = 0; /* use controller 0 for message */
/* structure used to reconnect transaction */
struct ips_reconnect {
typedef struct {
UCHAR *ips_db_handle; /* transaction handle */
UCHAR *ips_tr_handle; /* transaction handle */
};
} ips_reconnect;
const USHORT IPS_RECONNECT_ID = 0; /* use controller 0 for id */
/* structure used to seek into a blob */
struct ips_seek_blob {
typedef struct {
UCHAR *ips_bl_handle; /* blob handle */
ULONG ips_offset; /* offset into blob */
ULONG ips_result; /* returned result */
USHORT ips_mode; /* seek mode */
};
} ips_seek_blob;
/* structure used to start transactions */
struct ips_start_trans {
typedef struct {
UCHAR *ips_tr_handle; /* returned transaction handle */
USHORT ips_db_count; /* number of db's in transaction */
};
} ips_start_trans;
/* structure used for transact request */
struct ips_transact_request {
typedef struct {
UCHAR *ips_db_handle; /* database handle */
UCHAR *ips_tr_handle; /* transaction handle (in/out) */
};
} ips_transact_request;
const USHORT IPS_TRANS_REQ_BLR = 0; /* use controller 0 for blr */
const USHORT IPS_TRANS_REQ_IN_MSG = 1; /* use controller 1 for input msg */
@ -602,7 +592,7 @@ const USHORT IPS_TRANS_REQ_OUT_MSG = 2; /* use controller 2 for output msg */
const USHORT MAX_IPS_STRINGS = 5;
struct ips_comm_area {
typedef struct {
ULONG ips_server_protocol; /* server's protocol level */
ULONG ips_client_protocol; /* client's protocol level */
ISC_STATUS_ARRAY ips_status; /* status vector */
@ -631,8 +621,7 @@ struct ips_comm_area {
ips_transact_request ips_op_trans_req;
} ips_operations;
ULONG ips_data[1]; /* start of data area */
};
typedef ips_comm_area* IPS;
} ips_comm_area, *IPS;
/* size of mapped memory for a given client */
@ -653,13 +642,12 @@ static const char* IPI_EVENT_THREAD = "%sEventThread%d_%d";
/* local event queue structure */
struct eventq {
typedef struct eventq {
struct eventq *evq_next; /* next event */
SLONG evq_id; /* event ID */
USHORT evq_length; /* event length */
UCHAR evq_string[1]; /* event string */
};
typedef eventq* EVENTQ;
} *EVENTQ;
/* interprocess database thread structure */

View File

@ -36,7 +36,7 @@
See MET_format() and make_format() in MET.EPP for enlightenment.
*/
struct dsc
typedef struct dsc
{
dsc()
: dsc_dtype(0),
@ -57,8 +57,7 @@ struct dsc
SSHORT& dsc_ttype() { return dsc_sub_type;}
SSHORT dsc_ttype() const { return dsc_sub_type;}
#endif
};
typedef dsc DSC;
} DSC;
inline SSHORT DSC_GET_CHARSET(const dsc* desc) {
@ -71,12 +70,11 @@ inline SSHORT DSC_GET_COLLATE(const dsc* desc) {
}
//#define DSC_GET_COLLATE(dsc) (((dsc)->dsc_sub_type) >> 8)
struct alt_dsc {
typedef struct alt_dsc {
SLONG dsc_combined_type;
SSHORT dsc_sub_type;
USHORT dsc_flags; /* Not currently used */
};
typedef alt_dsc ALT_DSC;
} ALT_DSC;
inline bool DSC_EQUIV(const dsc* d1, const dsc* d2) {
return ((((ALT_DSC*) d1)->dsc_combined_type == ((ALT_DSC*) d2)->dsc_combined_type) &&

View File

@ -110,12 +110,11 @@ const ULONG MAX_SORT_RECORD = 65535; /* bytes */
/* the record struct actually contains the keyids etc, and the back_pointer
which points to the sort_record structure. */
struct sr
typedef struct sr
{
sort_record** sr_bckptr; /* Pointer back to sort list entry */
sort_record sr_sort_record;
};
typedef sr SR;
} SR;
/* scb_longs includes the size of sr_bckptr. */