/*
Postman's Sort (R) Version 1.0
Copyright (c) Robert Ramey 1991. All Rights Reserved
*/
#include "stack.h"
/*********************************************************************
data structure and data for each data memory held in memory or in
the working file
**********************************************************************/
/* structure for a record */
typedef union {
	size_t field[1];		/* displacement of fields with in record */
	unsigned char data[1];	/* actual record data */
} RECORD;

/* The usage of a RECORD is as follows:
	field[0]	Total length of record
	field[1]	displacement of first field
	...
	field[n]	displacement of n th field
	blk num		one character containing block number
	num data	bytes added to permit sorting of numerics
				starts at data_offset
	byte data	data contained in record
				starts at record_offset
*/
extern size_t record_size;
extern size_t record_offset;
extern STACK *d_stack;

#define blk_offset		(record_offset-1)
/* data[blk_offset] will contain one of three fields
 * depending on what state the record is currently in:
 */
/* when record is stored in stack memory, it contains the number */
/* of the stack frame */
#define rec_frame(ra) 	(ra->data[blk_offset])
/* when it is stored on disk it contains a flag indicating that is */
/* is the last record in a chain for the current sublist */
#define rec_eob(ra) 	(ra->data[blk_offset])
/* after the record has been retrieved but before it has been attached */
/* to a new sublist or sent to output this field contains a flag indicating */
/* its provenance.  */
#define rec_memflag(ra) (ra->data[blk_offset])
#define rec_size(ra) (ra->field[0])

void
rec_init(int, char **);
RECORD *
rec_variable();
RECORD *
rec_fixed();
void
rec_output(RECORD *);
