Annotation of libwww/Library/src/HTXParse.c, revision 2.15

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"
2.15    ! frystyk    17: #include "HTFormat.h"                  /* defines CHANNEL_BUFFER_SIZE */
2.1       frystyk    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.15    ! frystyk    31:        me->eps->length += CHANNEL_BUFFER_SIZE;
2.1       frystyk    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.15    ! frystyk    48:        me->eps->length += CHANNEL_BUFFER_SIZE;
2.1       frystyk    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.15    ! frystyk    61:        me->eps->length += CHANNEL_BUFFER_SIZE;
2.1       frystyk    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.15    ! frystyk   143:     if ((me->eps->buffer = (char  *) HT_CALLOC(CHANNEL_BUFFER_SIZE,1)) == NULL)
2.12      frystyk   144:         HT_OUTOFMEM("me->eps->buffer ");
2.1       frystyk   145:     me->eps->used = 0;
                    146:     me->eps->finished = NO;
2.15    ! frystyk   147:     me->eps->length = CHANNEL_BUFFER_SIZE;
2.1       frystyk   148:     me->eps->request = request;
                    149:     return me;
                    150: }

Webmaster