#include "sfdchdr.h"
typedef struct _tee_s
{ Sfdisc_t disc;
Sfio_t* tee;
int status;
} Tee_t;
#if __STD_C
static ssize_t teewrite(Sfio_t* f, const Void_t* buf, size_t size, Sfdisc_t* disc)
#else
static ssize_t teewrite(f,buf,size,disc)
Sfio_t* f;
Void_t* buf;
size_t size;
Sfdisc_t* disc;
#endif
{
reg Tee_t* te = (Tee_t*)disc;
if(te->status == 0 && sfwrite(te->tee,buf,size) != (ssize_t)size)
te->status = -1;
return sfwr(f,buf,size,disc);
}
#if __STD_C
static int teeexcept(Sfio_t* f, int type, Void_t* data, Sfdisc_t* disc)
#else
static int teeexcept(f,type,data,disc)
Sfio_t* f;
int type;
Void_t* data;
Sfdisc_t* disc;
#endif
{
if(type == SF_FINAL || type == SF_DPOP)
free(disc);
return 0;
}
#if __STD_C
int sfdctee(Sfio_t* f, Sfio_t* tee)
#else
int sfdctee(f, tee)
Sfio_t* f;
Sfio_t* tee;
#endif
{
reg Tee_t* te;
if(!(te = (Tee_t*)malloc(sizeof(Tee_t))) )
return -1;
te->disc.readf = NIL(Sfread_f);
te->disc.seekf = NIL(Sfseek_f);
te->disc.writef = teewrite;
te->disc.exceptf = teeexcept;
te->tee = tee;
te->status = 0;
if(sfdisc(f,(Sfdisc_t*)te) != (Sfdisc_t*)te)
{ free(te);
return -1;
}
return 0;
}