Annotation of libwww/Library/src/HTXParse.c, revision 2.18
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.18 ! frystyk 6: ** @(#) $Id: HTXParse.c,v 2.17 1996/05/16 19:03:26 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.14 frystyk 16: #include "sysdep.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.13 eric 44: if (WWWTRACE) HTTrace("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.7 frystyk 68: if (WWWTRACE)
2.13 eric 69: HTTrace("HTXParse_write, l=%d, used = %d\n",l,me->eps->used);
2.2 frystyk 70: return HT_OK;
2.1 frystyk 71: }
72:
73:
2.11 frystyk 74: PRIVATE int HTXParse_flush (HTStream * me)
2.2 frystyk 75: {
2.13 eric 76: if (WWWTRACE) HTTrace("HTXParse_flush\n");
2.2 frystyk 77: return HT_OK;
78: }
79:
2.11 frystyk 80: PRIVATE int HTXParse_free (HTStream * me)
2.1 frystyk 81: {
2.13 eric 82: if (WWWTRACE) HTTrace("HTXParse_free\n");
2.1 frystyk 83: me->eps->finished = YES;
2.5 frystyk 84: (*(me->eps->call_client))(me->eps); /* client will free buffer */
2.12 frystyk 85: HT_FREE(me->eps);
86: HT_FREE(me);
2.2 frystyk 87: return HT_OK;
2.1 frystyk 88: }
89:
2.11 frystyk 90: PRIVATE int HTXParse_abort (HTStream * me, HTList * e)
2.1 frystyk 91: {
2.7 frystyk 92: if (WWWTRACE)
2.13 eric 93: HTTrace("HTXParse_abort\n");
2.11 frystyk 94: HTXParse_free(me); /* Henrik Nov 2 94 */
2.2 frystyk 95: return HT_ERROR;
2.1 frystyk 96: }
97:
98:
2.11 frystyk 99: /* XParse stream
2.1 frystyk 100: ** -----------------
101: */
102:
103:
2.14 frystyk 104: PRIVATE const HTStreamClass HTXParseClass =
2.1 frystyk 105: {
2.11 frystyk 106: "XParse",
107: HTXParse_flush,
108: HTXParse_free,
109: HTXParse_abort,
110: HTXParse_put_character,
111: HTXParse_put_string,
112: HTXParse_write
2.1 frystyk 113: };
114:
2.11 frystyk 115: PUBLIC HTStream* HTXParse (HTRequest * request,
2.10 frystyk 116: void * param,
117: HTFormat input_format,
118: HTFormat output_format,
119: HTStream * output_stream)
2.1 frystyk 120: {
121: HTStream* me;
122:
2.7 frystyk 123: if (WWWTRACE) {
2.13 eric 124: HTTrace("HTXConvert..");
2.1 frystyk 125: if (input_format && input_format->name)
2.13 eric 126: HTTrace(".. input format is %s",input_format->name);
2.1 frystyk 127: if (output_format && output_format->name)
2.13 eric 128: HTTrace(".. output format is %s",output_format->name);
129: HTTrace("\n");
2.1 frystyk 130: }
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.12 frystyk 143: HT_OUTOFMEM("me->eps->buffer ");
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