#pragma prototyped
#ifndef _SS_H
#define _SS_H 1
#include <ast.h>
#include <error.h>
#include <recsort.h>
#include <recfmt.h>
#include <vmalloc.h>
#define SS_VERSION 20050611L
#define SS_MARKED "*%+([a-z0-9])?(" SS_SUFFIX ")"
#define SS_SUFFIX ".*([!A-Z/])"
#define SS_V_IBM REC_V_TYPE(4,0,2,0,1)
#define SS_DD_IN "SORTIN"
#define SS_DD_OUT "SORTOF"
#define SS_DD_XSUM "SORTXSUM"
#define SS_ascii 'a'
#define SS_bcd 'p'
#define SS_be 'b'
#define SS_bit 'B'
#define SS_ebcdic 'c'
#define SS_ibm 'i'
#define SS_le 'l'
#define SS_ss 'S'
#define SS_void 'v'
#define SS_zd 'z'
#define SS_AC_alt 'Q'
#define SS_AC_dec 'D'
#define SS_AC_flt 'F'
#define SS_AC_hex 'H'
#define SS_AC_oct 'O'
#define SS_CH_dec 'd'
#define SS_CH_flt 'f'
#define SS_CH_hex 'h'
#define SS_CH_oct 'o'
#define SS_OP_false 0
#define SS_OP_true 1
#define SS_OP_field 2
#define SS_OP_value 3
#define SS_OP_lt 4
#define SS_OP_le 5
#define SS_OP_eq 6
#define SS_OP_ne 7
#define SS_OP_ge 8
#define SS_OP_gt 9
#define SS_OP_and 10
#define SS_OP_or 11
#define SS_OP_not 12
#define ssopdata(o) ((o)<=SS_OP_value)
#define ssopexpr(o) ((o)>=SS_OP_and)
typedef uintmax_t Sscount_t;
typedef int (*Ssexit_f)(Rsobj_t*, Rsobj_t*, void**);
typedef int (*Ssintercept_f)(Ssexit_f, Rsobj_t*, Rsobj_t*, void**);
struct Ssdisc_s; typedef struct Ssdisc_s Ssdisc_t;
struct Ssexpr_s; typedef struct Ssexpr_s Ssexpr_t;
struct Ssfield_s; typedef struct Ssfield_s Ssfield_t;
struct Ssfile_s; typedef struct Ssfile_s Ssfile_t;
struct Ssgroup_s; typedef struct Ssgroup_s Ssgroup_t;
struct Ss_s; typedef struct Ss_s Ss_t;
union Ssop_u; typedef union Ssop_u Ssop_t;
struct Ssdisc_s
{
unsigned long version;
int code;
Error_f errorf;
};
struct Ssfield_s
{
Ssfield_t* next;
size_t offset;
size_t size;
char* value;
unsigned char type;
unsigned char reverse;
};
union Ssop_u
{
Ssfield_t* field;
Ssexpr_t* expr;
};
struct Ssexpr_s
{
Ssop_t left;
Ssop_t right;
unsigned char op;
};
struct Ssgroup_s
{
Ssgroup_t* next;
char* id;
char* name;
Sfio_t* io;
#ifdef _SS_GROUP_PRIVATE_
_SS_GROUP_PRIVATE_
#endif
};
struct Ssfile_s
{
Ssfile_t* next;
Ssgroup_t* group;
Ssexpr_t* expr;
Ssfield_t* out;
size_t size;
Recfmt_t format;
unsigned char omit;
unsigned char save;
#ifdef _SS_FILE_PRIVATE_
_SS_FILE_PRIVATE_
#endif
};
struct Ss_s
{
Ssfile_t* file;
Ssfield_t* in;
Ssfield_t* sort;
Ssfield_t* sum;
Ssdisc_t* disc;
Vmalloc_t* vm;
Sscount_t skip;
Sscount_t stop;
size_t size;
size_t insize;
Recfmt_t format;
char* suffix;
Ssexpr_t* expr;
void* exitstate;
Ssexit_f initexit;
Ssexit_f doneexit;
Ssexit_f readexit;
Ssexit_f summaryexit;
Ssexit_f writeexit;
Ssintercept_f intercept;
unsigned char copy;
unsigned char mark;
unsigned char merge;
unsigned char omit;
unsigned char stable;
unsigned char type;
unsigned char uniq;
#ifdef _SS_PRIVATE_
_SS_PRIVATE_
#endif
};
#define ssinit(d,e) (memset(d,0,sizeof(Ssdisc_t)),(d)->version=SS_VERSION,(d)->errorf=(Error_f)(e))
extern Ss_t* ssopen(const char*, Ssdisc_t*);
extern int ssdd(const char*, const char*, Ssdisc_t*);
extern int sseval(Ss_t*, Ssexpr_t*, const char*, size_t);
extern char* sskey(Ss_t*, Ssfield_t*);
extern int sslist(Ss_t*, Sfio_t*);
extern int sssum(Ss_t*, Ssfield_t*, const char*, size_t, char*);
extern ssize_t sscopy(Ss_t*, Ssfile_t*, const char*, size_t, char*, size_t);
extern ssize_t sswrite(Ss_t*, Ssfile_t*, const char*, size_t);
extern int ssio(Ss_t*, int);
extern int ssannounce(Ss_t*, Rs_t*);
extern int ssclose(Ss_t*);
#endif