Annotation of libwww/Library/src/HTXParse.c, revision 2.21
2.1 frystyk 1: /* HTXParse.c
2: ** EXTPARSE CLASS
3: **
2.3 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.1 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.21 ! frystyk 6: ** @(#) $Id: HTXParse.c,v 2.20 1998/05/04 19:37:43 frystyk Exp $
2.1 frystyk 7: **
8: ** AUTHORS:
9: ** HWL 23/8/94
2.11 frystyk 10: **
11: ** HISTORY:
12: ** HWL 5/12/95: Added NUL-terminatio, changed name from Ext to X
2.1 frystyk 13: */
14:
15: /* Library include files */
2.20 frystyk 16: #include "wwwsys.h"
2.18 frystyk 17: #include "WWWUtil.h"
18: #include "WWWCore.h"
2.1 frystyk 19: #include "HTXParse.h" /* defines HTStreamClass */
2.5 frystyk 20: #include "HTEPtoCl.h" /* defines dummy routine for talking to client */
2.1 frystyk 21:
22: struct _HTStream {
2.14 frystyk 23: const HTStreamClass * isa;
2.11 frystyk 24: HTXParseStruct * eps;
2.1 frystyk 25: };
26:
2.11 frystyk 27: PRIVATE int HTXParse_put_character (HTStream * me, char c)
2.1 frystyk 28: {
2.11 frystyk 29: while ((me->eps->used + 1) > (me->eps->length + 1)) {
2.16 frystyk 30: me->eps->length += INPUT_BUFFER_SIZE;
2.1 frystyk 31: }
2.12 frystyk 32: if ((me->eps->buffer = (char *) HT_REALLOC(me->eps->buffer, (me->eps->length + 1))) == NULL)
33: HT_OUTOFMEM("me->eps->buffer ");
2.1 frystyk 34: *(me->eps->buffer + me->eps->used) = c;
35: me->eps->used++;
2.11 frystyk 36: me->eps->buffer[me->eps->used] = '\0'; /* null-terminate string */
2.2 frystyk 37: return HT_OK;
2.1 frystyk 38: }
39:
2.14 frystyk 40: PRIVATE int HTXParse_put_string (HTStream * me, const char * s)
2.1 frystyk 41: {
42: int l = strlen(s);
43:
2.21 ! frystyk 44: HTTRACE(STREAM_TRACE, "HTXParse_put_string, %s\n" _ s);
2.1 frystyk 45:
2.11 frystyk 46: while ((me->eps->used + l) > (me->eps->length + 1)) {
2.16 frystyk 47: me->eps->length += INPUT_BUFFER_SIZE;
2.1 frystyk 48: }
2.12 frystyk 49: if ((me->eps->buffer = (char *) HT_REALLOC(me->eps->buffer, (me->eps->length + 1))) == NULL)
50: HT_OUTOFMEM("me->eps->buffer ");
2.1 frystyk 51: memcpy( (me->eps->buffer + me->eps->used), s, l);
52: me->eps->used += l;
2.11 frystyk 53: me->eps->buffer[me->eps->used] = '\0'; /* null-terminate string */
2.2 frystyk 54: return HT_OK;
2.1 frystyk 55: }
56:
2.14 frystyk 57: PRIVATE int HTXParse_write (HTStream * me, const char * s, int l)
2.1 frystyk 58: {
2.11 frystyk 59: while ((me->eps->used + l) > (me->eps->length + 1)) {
2.16 frystyk 60: me->eps->length += INPUT_BUFFER_SIZE;
2.1 frystyk 61: }
2.12 frystyk 62: if ((me->eps->buffer = (char *) HT_REALLOC(me->eps->buffer, (me->eps->length + 1))) == NULL)
63: HT_OUTOFMEM("me->eps->buffer ");
2.1 frystyk 64: memcpy( (me->eps->buffer + me->eps->used), s, l);
65: me->eps->used += l;
2.11 frystyk 66: me->eps->buffer[me->eps->used] = '\0'; /* null-terminate string */
2.5 frystyk 67: (*(me->eps->call_client))(me->eps); /* client can give status info */
2.21 ! frystyk 68: HTTRACE(STREAM_TRACE, "HTXParse_write, l=%d, used = %d\n" _ l _ me->eps->used);
2.2 frystyk 69: return HT_OK;
2.1 frystyk 70: }
71:
72:
2.11 frystyk 73: PRIVATE int HTXParse_flush (HTStream * me)
2.2 frystyk 74: {
2.21 ! frystyk 75: HTTRACE(STREAM_TRACE, "HTXParse_flush\n");
2.2 frystyk 76: return HT_OK;
77: }
78:
2.11 frystyk 79: PRIVATE int HTXParse_free (HTStream * me)
2.1 frystyk 80: {
2.21 ! frystyk 81: HTTRACE(STREAM_TRACE, "HTXParse_free\n");
2.1 frystyk 82: me->eps->finished = YES;
2.5 frystyk 83: (*(me->eps->call_client))(me->eps); /* client will free buffer */
2.12 frystyk 84: HT_FREE(me->eps);
85: HT_FREE(me);
2.2 frystyk 86: return HT_OK;
2.1 frystyk 87: }
88:
2.11 frystyk 89: PRIVATE int HTXParse_abort (HTStream * me, HTList * e)
2.1 frystyk 90: {
2.21 ! frystyk 91: HTTRACE(STREAM_TRACE, "HTXParse_abort\n");
2.11 frystyk 92: HTXParse_free(me); /* Henrik Nov 2 94 */
2.2 frystyk 93: return HT_ERROR;
2.1 frystyk 94: }
95:
96:
2.11 frystyk 97: /* XParse stream
2.1 frystyk 98: ** -----------------
99: */
100:
101:
2.14 frystyk 102: PRIVATE const HTStreamClass HTXParseClass =
2.1 frystyk 103: {
2.11 frystyk 104: "XParse",
105: HTXParse_flush,
106: HTXParse_free,
107: HTXParse_abort,
108: HTXParse_put_character,
109: HTXParse_put_string,
110: HTXParse_write
2.1 frystyk 111: };
112:
2.11 frystyk 113: PUBLIC HTStream* HTXParse (HTRequest * request,
2.10 frystyk 114: void * param,
115: HTFormat input_format,
116: HTFormat output_format,
117: HTStream * output_stream)
2.1 frystyk 118: {
119: HTStream* me;
120:
2.21 ! frystyk 121: #ifdef HTDEBUG
2.19 frystyk 122: if (STREAM_TRACE) {
2.21 ! frystyk 123: HTTRACE(STREAM_TRACE, "HTXConvert..");
2.1 frystyk 124: if (input_format && input_format->name)
2.21 ! frystyk 125: HTTRACE(STREAM_TRACE, ".. input format is %s" _ input_format->name);
2.1 frystyk 126: if (output_format && output_format->name)
2.21 ! frystyk 127: HTTRACE(STREAM_TRACE, ".. output format is %s" _ output_format->name);
! 128: HTTRACE(STREAM_TRACE, "\n");
2.1 frystyk 129: }
2.21 ! frystyk 130: #endif /* HTDEBUG */
2.1 frystyk 131:
2.12 frystyk 132: if ((me = (HTStream *) HT_CALLOC(1, sizeof(*me))) == NULL)
133: HT_OUTOFMEM("HTXConvert");
2.11 frystyk 134: me->isa = &HTXParseClass;
2.1 frystyk 135:
2.12 frystyk 136: if ((me->eps = (HTXParseStruct *) HT_CALLOC(1, sizeof(HTXParseStruct))) == NULL)
137: HT_OUTOFMEM("HTXConvert");
2.1 frystyk 138:
2.4 frystyk 139: if (input_format)
140: me->eps->content_type = input_format->name;
2.1 frystyk 141: me->eps->call_client = HTCallClient;
2.16 frystyk 142: if ((me->eps->buffer = (char *) HT_CALLOC(INPUT_BUFFER_SIZE,1)) == NULL)
2.19 frystyk 143: HT_OUTOFMEM("HTXParse");
2.1 frystyk 144: me->eps->used = 0;
145: me->eps->finished = NO;
2.16 frystyk 146: me->eps->length = INPUT_BUFFER_SIZE;
2.1 frystyk 147: me->eps->request = request;
148: return me;
149: }
Webmaster