Merge from vendor branch TNF:
[pkgsrcv2.git] / www / lynx / patches.v6 / patch-aq
1 $NetBSD: patch-aq,v 1.1 2000/01/15 17:44:24 hubertf Exp $
2
3 diff -x *.orig -urN ./WWW/Library/Implementation/HTWriter.c /usr/pkgsrc/www/lynx/work.unpatched/lynx2-8-2/WWW/Library/Implementation/HTWriter.c
4 --- ./WWW/Library/Implementation/HTWriter.c     Thu Jan  1 01:00:00 1970
5 +++ /usr/pkgsrc/www/lynx/work.unpatched/lynx2-8-2/WWW/Library/Implementation/HTWriter.c Sat Jan 15 07:57:18 2000
6 @@ -0,0 +1,183 @@
7 +/*             FILE WRITER                     HTWrite.c
8 +**             ===========
9 +**
10 +*/
11 +
12 +#include <HTUtils.h>
13 +
14 +#include <HTWriter.h>
15 +
16 +#define BUFFER_SIZE 4096       /* Tradeoff */
17 +
18 +#include <LYLeaks.h>
19 +
20 +/*             HTML Object
21 +**             -----------
22 +*/
23 +
24 +struct _HTStream {
25 +       CONST HTStreamClass *   isa;
26 +
27 +       int     soc;
28 +       char    *write_pointer;
29 +       char    buffer[BUFFER_SIZE];
30 +#ifdef NOT_ASCII
31 +       BOOL    make_ascii;     /* Are we writing to the net? */
32 +#endif
33 +};
34 +
35 +
36 +/*     Write the buffer out to the socket
37 +**     ----------------------------------
38 +*/
39 +
40 +PRIVATE void flush ARGS1(HTStream *, me)
41 +{
42 +    char *read_pointer = me->buffer;
43 +    char *write_pointer = me->write_pointer;
44 +
45 +#ifdef NOT_ASCII
46 +    if (me->make_ascii) {
47 +       char * p;
48 +       for(p = me->buffer; p < me->write_pointer; p++)
49 +           *p = TOASCII(*p);
50 +    }
51 +#endif
52 +    while (read_pointer < write_pointer) {
53 +       int status;
54 +       status = NETWRITE(me->soc, me->buffer,  /* Put timeout? @@@ */
55 +                       write_pointer - read_pointer);
56 +       if (status<0) {
57 +           CTRACE(tfp, "HTWrite: Error: write() on socket returns %d !!!\n", status);
58 +           return;
59 +       }
60 +       read_pointer = read_pointer + status;
61 +    }
62 +    me->write_pointer = me->buffer;
63 +}
64 +
65 +
66 +/*_________________________________________________________________________
67 +**
68 +**                     A C T I O N     R O U T I N E S
69 +*/
70 +
71 +/*     Character handling
72 +**     ------------------
73 +*/
74 +
75 +PRIVATE void HTWriter_put_character ARGS2(HTStream *, me, char, c)
76 +{
77 +    if (me->write_pointer == &me->buffer[BUFFER_SIZE]) flush(me);
78 +    *me->write_pointer++ = c;
79 +}
80 +
81 +
82 +
83 +/*     String handling
84 +**     ---------------
85 +**
86 +**     Strings must be smaller than this buffer size.
87 +*/
88 +PRIVATE void HTWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
89 +{
90 +    int l = strlen(s);
91 +    if (me->write_pointer + l > &me->buffer[BUFFER_SIZE]) flush(me);
92 +    strcpy(me->write_pointer, s);
93 +    me->write_pointer = me->write_pointer + l;
94 +}
95 +
96 +
97 +/*     Buffer write.  Buffers can (and should!) be big.
98 +**     ------------
99 +*/
100 +PRIVATE void HTWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
101 +{
102 +
103 +    CONST char *read_pointer   = s;
104 +    CONST char *write_pointer = s+l;
105 +
106 +    flush(me);         /* First get rid of our buffer */
107 +
108 +    while (read_pointer < write_pointer) {
109 +       int status = NETWRITE(me->soc, (char *)read_pointer,
110 +                       write_pointer - read_pointer);
111 +       if (status<0) {
112 +           CTRACE(tfp, "HTWriter_write: Error on socket output stream!!!\n");
113 +           return;
114 +       }
115 +       read_pointer = read_pointer + status;
116 +    }
117 +}
118 +
119 +
120 +
121 +
122 +/*     Free an HTML object
123 +**     -------------------
124 +**
125 +**     Note that the SGML parsing context is freed, but the created object is not,
126 +**     as it takes on an existence of its own unless explicitly freed.
127 +*/
128 +PRIVATE void HTWriter_free ARGS1(HTStream *, me)
129 +{
130 +    flush(me);
131 +    NETCLOSE(me->soc);
132 +    FREE(me);
133 +}
134 +
135 +PRIVATE void HTWriter_abort ARGS2(HTStream *, me, HTError, e GCC_UNUSED)
136 +{
137 +    HTWriter_free(me);
138 +}
139 +
140 +
141 +/*     Structured Object Class
142 +**     -----------------------
143 +*/
144 +PRIVATE CONST HTStreamClass HTWriter = /* As opposed to print etc */
145 +{
146 +       "SocketWriter",
147 +       HTWriter_free,
148 +       HTWriter_abort,
149 +       HTWriter_put_character, HTWriter_put_string,
150 +       HTWriter_write
151 +};
152 +
153 +
154 +/*     Subclass-specific Methods
155 +**     -------------------------
156 +*/
157 +
158 +PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
159 +{
160 +    HTStream* me = (HTStream*)malloc(sizeof(*me));
161 +    if (me == NULL) outofmem(__FILE__, "HTML_new");
162 +    me->isa = &HTWriter;
163 +
164 +#ifdef NOT_ASCII
165 +    me->make_ascii = NO;
166 +#endif
167 +    me->soc = soc;
168 +    me->write_pointer = me->buffer;
169 +    return me;
170 +}
171 +
172 +/*     Subclass-specific Methods
173 +**     -------------------------
174 +*/
175 +
176 +PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
177 +{
178 +    HTStream* me = (HTStream*)malloc(sizeof(*me));
179 +    if (me == NULL) outofmem(__FILE__, "HTML_new");
180 +    me->isa = &HTWriter;
181 +
182 +#ifdef NOT_ASCII
183 +    me->make_ascii = YES;
184 +#endif
185 +    me->soc = soc;
186 +    me->write_pointer = me->buffer;
187 +    return me;
188 +}
189 +