Annotation of libwww/Library/src/HTNetTxt.c, revision 2.8
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.8 ! frystyk 6: ** @(#) $Id: Date Author State $
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.7 frystyk 17: #include "sysdep.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.7 frystyk 136: const char *limit = b+len;
2.3 frystyk 137:
138: if (!me->start)
139: me->start = b;
140: else {
141: len -= (me->start - b);
142: b = me->start;
143: }
144: while (len-- > 0) {
145: if (me->had_cr && *b == LF) {
146: if (b > me->start+1) {
147: if ((status = PUTBLOCK(me->start, b - me->start-1)) != HT_OK)
148: return status;
149: }
150: me->start = b+1;
151: if ((status = PUTC('\n')) != HT_OK)
152: return status;
153: }
154: me->had_cr = (*b++ == CR);
155: }
156: if (me->start < b && (status = PUTBLOCK(me->start, b-me->start)) != HT_OK)
157: return status;
158: me->start = NULL; /* Whole buffer is written :-) */
159: return HT_OK;
160: }
161:
2.4 frystyk 162: PRIVATE int TextToNet_put_character (HTStream * me, char c)
2.3 frystyk 163: {
164: return TextToNet_put_block(me, &c, 1);
165: }
166:
2.7 frystyk 167: PRIVATE int TextToNet_put_string (HTStream * me, const char * s)
2.3 frystyk 168: {
169: return TextToNet_put_block(me, s, (int) strlen(s));
170: }
171:
172: PRIVATE HTStreamClass TextToNetClass = {
173: "TextToNet",
2.4 frystyk 174: Net_flush,
175: Net_free,
176: Net_abort,
2.3 frystyk 177: TextToNet_put_character,
178: TextToNet_put_string,
179: TextToNet_put_block
180: };
181:
2.4 frystyk 182: PUBLIC HTStream * HTTextToNet (HTStream * target)
2.3 frystyk 183: {
2.6 frystyk 184: HTStream* me;
185: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
186: HT_OUTOFMEM("TextToNet");
2.3 frystyk 187: me->isa = &TextToNetClass;
2.1 frystyk 188: me->had_cr = NO;
189: me->target = target;
190: return me;
191: }
2.4 frystyk 192:
193:
194:
2.1 frystyk 195:
Webmaster