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