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