#ifndef _RECSORT_H
#define _RECSORT_H 1
#if _PACKAGE_ast
#include <ast.h>
#else
#include <sfio.h>
#endif
#define RS_PLUGIN_VERSION AST_PLUGIN_VERSION(20100528L)
#define RS_VERSION 20030811L
#define RSKEY_VERSION 20111011L
#define SORTLIB(m) unsigned long plugin_version(void) { return RS_PLUGIN_VERSION; }
typedef struct _rsobj_s Rsobj_t;
typedef struct _rs_s Rs_t;
typedef struct _rsmethod_s Rsmethod_t;
typedef struct _rsdisc_s Rsdisc_t;
typedef ssize_t (*Rsdefkey_f)_ARG_((Rs_t*, unsigned char*, size_t, unsigned char*, size_t, Rsdisc_t*));
typedef int (*Rsevent_f)_ARG_((Rs_t*, int, Void_t*, Void_t*, Rsdisc_t*));
typedef struct _rskey_s Rskey_t;
typedef struct _rskeydisc_s Rskeydisc_t;
typedef struct _rskeyfield_s Rskeyfield_t;
typedef int (*Rskeyerror_f)_ARG_((Void_t*, Void_t*, int, ...));
typedef ssize_t (*Rskeycode_f)_ARG_((Rskey_t*, Rskeyfield_t*, unsigned char*, size_t, unsigned char*, unsigned char*));
struct _rsmethod_s
{ int (*insertf)_ARG_((Rs_t*, Rsobj_t*));
Rsobj_t* (*listf)_ARG_((Rs_t*));
ssize_t size;
int type;
char* name;
char* desc;
};
struct _rsdisc_s
{ unsigned long version;
int type;
ssize_t data;
ssize_t key;
ssize_t keylen;
Rsdefkey_f defkeyf;
Rsevent_f eventf;
unsigned long events;
Rsdisc_t* disc;
};
struct _rsobj_s
{ unsigned long order;
Rsobj_t* left;
Rsobj_t* right;
Rsobj_t* equal;
unsigned char* key;
ssize_t keylen;
unsigned char* data;
ssize_t datalen;
};
struct _rskeydisc_s
{ unsigned long version;
unsigned long flags;
Rskeyerror_f errorf;
};
struct _rskeyfield_s
{ Rskeyfield_t* next;
Rskeycode_f coder;
void* user;
unsigned flag;
unsigned char rflag;
#ifdef _RSKEYFIELD_PRIVATE_
_RSKEYFIELD_PRIVATE_
#endif
};
struct _rskey_s
{ const char* id;
Rskeydisc_t* keydisc;
Rsdisc_t* disc;
Rsmethod_t* meth;
int type;
char** input;
char* output;
size_t alignsize;
size_t fixed;
size_t insize;
size_t outsize;
size_t procsize;
size_t recsize;
unsigned long test;
int merge;
int nproc;
int verbose;
int code;
unsigned char tab[32];
Rskeyfield_t* head;
Rskeyfield_t* tail;
#ifdef _RSKEY_PRIVATE_
_RSKEY_PRIVATE_
#endif
};
struct _rs_s
{ Rsmethod_t* meth;
Rsdisc_t* disc;
Sfulong_t count;
int type;
#ifdef _RS_PRIVATE_
_RS_PRIVATE_
#endif
};
#define RS_CLOSE 0000001
#define RS_DISC 0000002
#define RS_METHOD 0000004
#define RS_OPEN 0001000
#define RS_POP 0000010
#define RS_PUSH 0000020
#define RS_READ 0000200
#define RS_SUMMARY 0000040
#define RS_VERIFY 0000100
#define RS_WRITE 0000400
#define RS_FILE_WRITE 0002000
#define RS_FILE_READ 0004000
#define RS_FILE_CLOSE 0010000
#define RS_TEMP_WRITE 0020000
#define RS_TEMP_READ 0040000
#define RS_TEMP_CLOSE 0100000
#define RS_TERMINATE (-1)
#define RS_ACCEPT 0
#define RS_DELETE 1
#define RS_INSERT 2
#define RS_DONE 3
#define RS_NEXT 0
#define RS_UNIQ 000001
#define RS_REVERSE 000002
#define RS_DATA 000004
#define RS_IGNORE 000040
#define RS_CAT 040000
#define RS_KSAMELEN 000010
#define RS_DSAMELEN 000020
#define RS_TYPES 040377
#define RS_ITEXT 000100
#define RS_OTEXT 000200
#define RS_TEXT 000300
#define RS_MTVERIFY 000400
#define RS_MTRASP 001000
#define RS_MTRADIX 002000
#define RS_MTSPLAY 004000
#define RS_MTCOPY 020000
#define RSKEY_ERROR 000001
#define RSKEY_KEYS 000002
#define RSKEYDISC(p) (((Rskey_t*)((char*)(p)-offsetof(Rskey_t,disc)))->keydisc)
#define rscount(rs) ((rs)->count)
_BEGIN_EXTERNS_
#if defined(__EXPORT__)
#define extern __EXPORT__
#endif
extern Rsdisc_t* rs_disc _ARG_((Rskey_t*, const char*));
#undef extern
#if _BLD_recsort && defined(__EXPORT__)
#define extern extern __EXPORT__
#endif
#if !_BLD_recsort && defined(__IMPORT__)
#define extern extern __IMPORT__
#endif
extern Rsmethod_t* Rscopy;
extern Rsmethod_t* Rsrasp;
extern Rsmethod_t* Rsradix;
extern Rsmethod_t* Rssplay;
extern Rsmethod_t* Rsverify;
#undef extern
_END_EXTERNS_
_BEGIN_EXTERNS_
#if _BLD_recsort && defined(__EXPORT__)
#define extern __EXPORT__
#endif
extern Rs_t* rsnew _ARG_((Rsdisc_t*));
extern int rsinit _ARG_((Rs_t*, Rsmethod_t*, ssize_t, int, Rskey_t*));
extern Rs_t* rsopen _ARG_((Rsdisc_t*, Rsmethod_t*, ssize_t, int));
extern int rsclear _ARG_((Rs_t*));
extern int rsclose _ARG_((Rs_t*));
extern ssize_t rsprocess _ARG_((Rs_t*, Void_t*, ssize_t));
extern int rslib _ARG_((Rs_t*, Rskey_t*, const char*, int));
extern Rsobj_t* rslist _ARG_((Rs_t*));
extern int rswrite _ARG_((Rs_t*, Sfio_t*, int));
extern int rsmerge _ARG_((Rs_t*, Sfio_t*, Sfio_t**, int, int));
extern Rsdisc_t* rsdisc _ARG_((Rs_t*, Rsdisc_t*, int));
extern Rsmethod_t* rsmethod _ARG_((Rs_t*, Rsmethod_t*));
extern Rskey_t* rskeyopen _ARG_((Rskeydisc_t*, Rsdisc_t*));
extern int rskey _ARG_((Rskey_t*, const char*, int));
extern int rskeyopt _ARG_((Rskey_t*, const char*, int));
extern Rsmethod_t* rskeymeth _ARG_((Rskey_t*, const char*));
extern int rskeylist _ARG_((Rskey_t*, Sfio_t*, int));
extern void rskeydump _ARG_((Rskey_t*, Sfio_t*));
extern int rskeyinit _ARG_((Rskey_t*));
extern int rskeyclose _ARG_((Rskey_t*));
extern int rsfilewrite _ARG_((Rs_t*, Sfio_t*, const char*));
extern int rsfileread _ARG_((Rs_t*, Sfio_t*, const char*));
extern int rsfileclose _ARG_((Rs_t*, Sfio_t*));
extern Sfio_t* rstempwrite _ARG_((Rs_t*, Sfio_t*));
extern int rstempread _ARG_((Rs_t*, Sfio_t*));
extern int rstempclose _ARG_((Rs_t*, Sfio_t*));
#undef extern
_END_EXTERNS_
#endif