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