1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/*
** T E E C L A S S
**
** The Tee class just writes to two streams. Easy.
** See also the Black Hole stream which is even easier.
**
** HISTORY:
** 8 Jul 94 FM Insulate free() from _free structure element.
**
*/
#include "HTTee.h"
/* Stream Object
** ------------
*/
struct _HTStream {
CONST HTStreamClass * isa;
HTStream * s1;
HTStream * s2;
};
PRIVATE void HTTee_put_character ARGS2(HTStream *, me, char, c)
{
(*me->s1->isa->put_character)(me->s1, c);
(*me->s2->isa->put_character)(me->s2, c);
}
PRIVATE void HTTee_put_string ARGS2(HTStream *, me, CONST char*, s)
{
(*me->s1->isa->put_string)(me->s1, s);
(*me->s2->isa->put_string)(me->s2, s);
}
PRIVATE void HTTee_write ARGS3(HTStream *, me, CONST char*, s, int, l)
{
(*me->s1->isa->put_block)(me->s1, s, l);
(*me->s2->isa->put_block)(me->s2, s, l);
}
PRIVATE void HTTee_free ARGS1(HTStream *, me)
{
(*me->s1->isa->_free)(me->s1);
(*me->s2->isa->_free)(me->s2);
free(me);
}
PRIVATE void HTTee_abort ARGS2(HTStream *, me, HTError, e)
{
(*me->s1->isa->abort)(me->s1, e);
(*me->s2->isa->abort)(me->s2, e);
free(me);
}
/* Tee stream
** ----------
*/
PRIVATE CONST HTStreamClass HTTeeClass =
{
"Tee",
HTTee_free,
HTTee_abort,
HTTee_put_character, HTTee_put_string,
HTTee_write
};
/* Tee creation
*/
PUBLIC HTStream * HTTee ARGS2(HTStream *, s1,HTStream *, s2)
{
HTStream * me = (HTStream*)malloc(sizeof(*me));
if (!me) outofmem(__FILE__, "HTTee");
me->isa = &HTTeeClass;
me->s1 = s1;
me->s2 = s2;
return me;
}
|