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

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
                      9: */
                     10: 
                     11: /* Library include files */
                     12: #include "tcp.h"
                     13: #include "HTUtils.h"
                     14: #include "HTFormat.h"                  /* defines INPUT_BUFFER_SIZE */
                     15: #include "HTXParse.h"                 /* defines HTStreamClass */
2.5       frystyk    16: #include "HTEPtoCl.h"         /* defines dummy routine for talking to client */
2.6     ! frystyk    17: #include "HTSocket.h"
2.4       frystyk    18: #include "HTEvntrg.h"
2.1       frystyk    19: 
                     20: struct _HTStream {
                     21:        CONST HTStreamClass *   isa;
                     22:        HTExtParseStruct *      eps;
                     23: };
                     24: 
2.2       frystyk    25: PRIVATE int HTExtParse_put_character ARGS2(HTStream *, me, char, c)
2.1       frystyk    26: {
                     27:     while ((me->eps->used + 1) > me->eps->length) {
                     28:        me->eps->length += INPUT_BUFFER_SIZE;
                     29:     }
                     30:     me->eps->buffer = (char *) realloc(me->eps->buffer, me->eps->length);
                     31:     *(me->eps->buffer + me->eps->used) = c;
                     32:     me->eps->used++;
2.2       frystyk    33:     return HT_OK;
2.1       frystyk    34: }
                     35: 
2.2       frystyk    36: PRIVATE int HTExtParse_put_string ARGS2(HTStream *, me, CONST char*, s)
2.1       frystyk    37: {
                     38:     int l = strlen(s);
                     39: 
                     40:     if (TRACE) fprintf(TDEST, "HTExtParse_put_string, %s\n",s);
                     41: 
                     42:     while ((me->eps->used + l) > me->eps->length) {
                     43:        me->eps->length += INPUT_BUFFER_SIZE;
                     44:     }
                     45:     me->eps->buffer = (char *) realloc(me->eps->buffer, me->eps->length);
                     46:     memcpy( (me->eps->buffer + me->eps->used), s, l); 
                     47:     me->eps->used += l;
2.2       frystyk    48:     return HT_OK;
2.1       frystyk    49: }
                     50: 
2.2       frystyk    51: PRIVATE int HTExtParse_write ARGS3(HTStream *, me, CONST char*, s, int, l)
2.1       frystyk    52: {
                     53:     while ((me->eps->used + l) > me->eps->length) {
                     54:        me->eps->length += INPUT_BUFFER_SIZE;
                     55:     }
                     56:     me->eps->buffer = (char *) realloc(me->eps->buffer, me->eps->length);
                     57:     memcpy( (me->eps->buffer + me->eps->used), s, l); 
                     58:     me->eps->used += l;
2.5       frystyk    59:     (*(me->eps->call_client))(me->eps);       /* client can give status info */
2.1       frystyk    60:     if (TRACE)
                     61:        fprintf(TDEST, "HTExtParse_write, l=%d, used = %d\n",l,me->eps->used);
2.2       frystyk    62:     return HT_OK;
2.1       frystyk    63: }
                     64: 
                     65: 
2.2       frystyk    66: PRIVATE int HTExtParse_flush ARGS1(HTStream *, me)
                     67: {
                     68:     if (TRACE) fprintf(TDEST, "HTExtParse_flush\n");
                     69:     return HT_OK;
                     70: }
                     71: 
2.1       frystyk    72: PRIVATE int HTExtParse_free ARGS1(HTStream *, me)
                     73: {
                     74:     if (TRACE) fprintf(TDEST, "HTExtParse_free\n");
                     75:     me->eps->finished = YES;
2.5       frystyk    76:     (*(me->eps->call_client))(me->eps);           /* client will free buffer */
2.1       frystyk    77:     free(me->eps);
                     78:     free(me);
2.2       frystyk    79:     return HT_OK;
2.1       frystyk    80: }
                     81: 
                     82: PRIVATE int HTExtParse_abort ARGS2(HTStream *, me, HTError, e)
                     83: {
                     84:     if (TRACE)
                     85:        fprintf(TDEST, "HTExtParse_abort\n");
                     86:     HTExtParse_free(me);                                 /* Henrik Nov 2 94 */
2.2       frystyk    87:     return HT_ERROR;
2.1       frystyk    88: }
                     89: 
                     90: 
                     91: /*     ExtParse stream
                     92: **     -----------------
                     93: */
                     94: 
                     95: 
                     96: PRIVATE CONST HTStreamClass HTExtParseClass =
                     97: {              
                     98:        "ExtParse",
2.2       frystyk    99:        HTExtParse_flush,
2.1       frystyk   100:        HTExtParse_free,
                    101:        HTExtParse_abort,
                    102:        HTExtParse_put_character,
                    103:        HTExtParse_put_string,
                    104:        HTExtParse_write
                    105: }; 
                    106: 
                    107: /*
                    108: extern void SetBufferPt PARAMS((char * p, int l));
                    109: extern void GiveReadStatus PARAMS((char * p, int l));
                    110: */
                    111: 
                    112: PUBLIC HTStream* HTExtParse ARGS5(
                    113:        HTRequest *,            request,
                    114:        void *,                 param,
                    115:        HTFormat,               input_format,
                    116:        HTFormat,               output_format,
                    117:        HTStream *,             output_stream)
                    118: {
                    119:     HTStream* me;
                    120:   
                    121:     if (TRACE) {
                    122:        fprintf(TDEST, "HTExtConvert..");
                    123:        if (input_format && input_format->name)
                    124:             fprintf(TDEST, ".. input format is %s",input_format->name);
                    125:        if (output_format && output_format->name)
                    126:             fprintf(TDEST, ".. output format is %s",output_format->name);
                    127:        fprintf(TDEST, "\n");
                    128:     }
                    129: 
                    130:     me = (HTStream*)calloc(1, sizeof(*me));
                    131:     if (me == NULL) outofmem(__FILE__, "HTExtConvert");
                    132:     me->isa = &HTExtParseClass;
                    133: 
                    134:     me->eps = (HTExtParseStruct *) calloc(1, sizeof(HTExtParseStruct));
                    135:     if (me->eps == NULL) outofmem(__FILE__, "HTExtConvert");
                    136: 
2.4       frystyk   137:     if (input_format)
                    138:         me->eps->content_type = input_format->name;
2.1       frystyk   139:     me->eps->call_client = HTCallClient;
                    140:     me->eps->buffer = (char *)calloc(INPUT_BUFFER_SIZE,1);
                    141:     me->eps->used = 0;
                    142:     me->eps->finished = NO;
                    143:     me->eps->length = INPUT_BUFFER_SIZE;
                    144:     me->eps->request = request;
                    145:     return me;
                    146: }

Webmaster