Annotation of libwww/Library/src/HTNetTxt.c, revision 2.10
2.1 frystyk 1: /* HTNetTxt.c
2: ** NETWORK TELNET TO INTERNAL CHARACTER TEXT AND VISE VERSA
3: **
2.2 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.1 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.10 ! frystyk 6: ** @(#) $Id: HTNetTxt.c,v 2.9 1996/08/24 18:10:11 frystyk Exp $
2.1 frystyk 7: **
2.3 frystyk 8: ** This module provides two basic streams that converts from CRLF to
9: ** an internal C representation (\n) and from the C representation to
10: ** CRLF.
2.1 frystyk 11: **
12: ** HISTORY:
13: ** 27 Mar 95 HFN Spawned off from HTFormat.c
14: */
15:
16: /* Library Include files */
2.10 ! frystyk 17: #include "wwwsys.h"
2.1 frystyk 18: #include "HTUtils.h"
19: #include "HTString.h"
20: #include "HTStream.h"
21: #include "HTNetTxt.h" /* Implemented here */
22:
23: /* Typedefs and global variable local to this module */
24: struct _HTStream {
2.7 frystyk 25: const HTStreamClass * isa;
2.1 frystyk 26: HTStream * target;
2.7 frystyk 27: const char * start;
2.1 frystyk 28: BOOL had_cr;
29: };
30:
31: #define PUTC(c) (*me->target->isa->put_character)(me->target, c)
32: #define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
33:
34: /* ------------------------------------------------------------------------- */
35:
2.4 frystyk 36: /* Converter from CRLF to \n
37: ** -------------------------
38: ** The input is assumed to be in local representation with lines
39: ** delimited by (CR,LF) pairs in the local representation.
40: ** The conversion to local representation is always done in HTSocket.c
41: ** The (CR,LF) sequence when found is changed to a '\n' character,
42: ** the internal C representation of a new line.
2.3 frystyk 43: */
2.7 frystyk 44: PRIVATE int NetToText_put_block (HTStream * me, const char * s, int l)
2.1 frystyk 45: {
46: int status;
47: if (!me->start)
48: me->start = s;
49: else {
50: l -= (me->start - s);
51: s = me->start;
52: }
53: while (l-- > 0) {
54: if (me->had_cr && *s == LF) {
55: if (s > me->start+1) {
56: if ((status = PUTBLOCK(me->start, s - me->start-1)) != HT_OK)
57: return status;
58: }
59: me->start = s+1;
60: if ((status = PUTC('\n')) != HT_OK)
61: return status;
62: }
63: me->had_cr = (*s++ == CR);
64: }
65: if (me->start < s && (status = PUTBLOCK(me->start, s-me->start)) != HT_OK)
66: return status;
67: me->start = NULL; /* Whole buffer is written :-) */
68: return HT_OK;
69: }
70:
2.4 frystyk 71: PRIVATE int NetToText_put_character (HTStream * me, char c)
2.3 frystyk 72: {
73: return NetToText_put_block(me, &c, 1);
74: }
75:
2.7 frystyk 76: PRIVATE int NetToText_put_string (HTStream * me, const char * s)
2.3 frystyk 77: {
78: return NetToText_put_block(me, s, (int) strlen(s));
79: }
80:
2.4 frystyk 81: PRIVATE int Net_flush (HTStream * me)
2.1 frystyk 82: {
2.4 frystyk 83: return me->target ? (*me->target->isa->flush)(me->target) : HT_OK;
2.1 frystyk 84: }
85:
2.4 frystyk 86: PRIVATE int Net_free (HTStream * me)
2.1 frystyk 87: {
2.4 frystyk 88: int status = HT_OK;
89: if (me->target) {
90: if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)
91: return HT_WOULD_BLOCK;
92: }
2.6 frystyk 93: HT_FREE(me);
2.4 frystyk 94: return status;
2.1 frystyk 95: }
96:
2.5 frystyk 97: PRIVATE int Net_abort (HTStream * me, HTList * e)
2.1 frystyk 98: {
2.4 frystyk 99: if (me->target)
100: (*me->target->isa->abort)(me->target, e);
2.6 frystyk 101: HT_FREE(me);
2.1 frystyk 102: return HT_ERROR;
103: }
104:
105: PRIVATE HTStreamClass NetToTextClass = {
106: "NetToText",
2.4 frystyk 107: Net_flush,
108: Net_free,
109: Net_abort,
2.1 frystyk 110: NetToText_put_character,
111: NetToText_put_string,
112: NetToText_put_block
113: };
114:
2.4 frystyk 115: PUBLIC HTStream * HTNetToText (HTStream * target)
2.1 frystyk 116: {
2.6 frystyk 117: HTStream* me;
118: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
119: HT_OUTOFMEM("NetToText");
2.1 frystyk 120: me->isa = &NetToTextClass;
2.3 frystyk 121: me->had_cr = NO;
122: me->target = target;
123: return me;
124: }
125:
2.4 frystyk 126: /* Converter from \n to CRLF
127: ** -------------------------
128: ** The input is assumed to be in local representation with lines
129: ** delimited by \n. The \n when found is changed to a CRLF sequence,
130: ** the network representation of a new line.
131: ** Conversion: '\r' is stripped and \n => CRLF
2.3 frystyk 132: */
2.7 frystyk 133: PRIVATE int TextToNet_put_block (HTStream * me, const char* b, int len)
2.3 frystyk 134: {
135: int status;
2.9 frystyk 136: #if 0
2.7 frystyk 137: const char *limit = b+len;
2.9 frystyk 138: #endif
2.3 frystyk 139: if (!me->start)
140: me->start = b;
141: else {
142: len -= (me->start - b);
143: b = me->start;
144: }
145: while (len-- > 0) {
146: if (me->had_cr && *b == LF) {
147: if (b > me->start+1) {
148: if ((status = PUTBLOCK(me->start, b - me->start-1)) != HT_OK)
149: return status;
150: }
151: me->start = b+1;
152: if ((status = PUTC('\n')) != HT_OK)
153: return status;
154: }
155: me->had_cr = (*b++ == CR);
156: }
157: if (me->start < b && (status = PUTBLOCK(me->start, b-me->start)) != HT_OK)
158: return status;
159: me->start = NULL; /* Whole buffer is written :-) */
160: return HT_OK;
161: }
162:
2.4 frystyk 163: PRIVATE int TextToNet_put_character (HTStream * me, char c)
2.3 frystyk 164: {
165: return TextToNet_put_block(me, &c, 1);
166: }
167:
2.7 frystyk 168: PRIVATE int TextToNet_put_string (HTStream * me, const char * s)
2.3 frystyk 169: {
170: return TextToNet_put_block(me, s, (int) strlen(s));
171: }
172:
173: PRIVATE HTStreamClass TextToNetClass = {
174: "TextToNet",
2.4 frystyk 175: Net_flush,
176: Net_free,
177: Net_abort,
2.3 frystyk 178: TextToNet_put_character,
179: TextToNet_put_string,
180: TextToNet_put_block
181: };
182:
2.4 frystyk 183: PUBLIC HTStream * HTTextToNet (HTStream * target)
2.3 frystyk 184: {
2.6 frystyk 185: HTStream* me;
186: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
187: HT_OUTOFMEM("TextToNet");
2.3 frystyk 188: me->isa = &TextToNetClass;
2.1 frystyk 189: me->had_cr = NO;
190: me->target = target;
191: return me;
192: }
2.4 frystyk 193:
194:
195:
2.1 frystyk 196:
Webmaster