Annotation of libwww/Library/src/HTNetTxt.c, revision 2.2

2.1       frystyk     1: /*                                                                  HTNetTxt.c
                      2: **     NETWORK TELNET TO INTERNAL CHARACTER TEXT AND VISE VERSA
                      3: **
2.2     ! frystyk     4: **     (c) COPYRIGHT MIT 1995.
2.1       frystyk     5: **     Please first read the full copyright statement in the file COPYRIGH.
                      6: **
                      7: **     The input is assumed to be in local representation with lines
                      8: **     delimited by (CR,LF) pairs in the local representation.
                      9: **     The (CR,LF) sequenc when found is changed to a '\n' character,
                     10: **     the internal C representation of a new line.
                     11: **
                     12: ** HISTORY:
                     13: **     27 Mar 95  HFN  Spawned off from HTFormat.c
                     14: */
                     15: 
                     16: /* Library Include files */
                     17: #include "tcp.h"
                     18: #include "HTUtils.h"
                     19: #include "HTString.h"
                     20: #include "HTStream.h"
                     21: #include "HTNetTxt.h"                                   /* Implemented here */
                     22: 
                     23: /* Typedefs and global variable local to this module */
                     24: struct _HTStream {
                     25:     CONST HTStreamClass *      isa;
                     26:     HTStream *                         target;
                     27:     CONST char *               start;
                     28:     BOOL                       had_cr;
                     29: };
                     30: 
                     31: #define PUTC(c)                (*me->target->isa->put_character)(me->target, c)
                     32: #define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
                     33: 
                     34: /* ------------------------------------------------------------------------- */
                     35: 
                     36: PRIVATE int NetToText_put_character ARGS2(HTStream *, me, char, c)
                     37: {
                     38:     return PUTBLOCK(&c, 1);
                     39: }
                     40: 
                     41: PRIVATE int NetToText_put_string ARGS2(HTStream *, me, CONST char *, s)
                     42: {    
                     43:     return PUTBLOCK(s, (int) strlen(s));
                     44: }
                     45: 
                     46: PRIVATE int NetToText_put_block ARGS3(HTStream *, me, CONST char*, s, int, l)
                     47: {
                     48:     int status;
                     49:     if (!me->start)
                     50:        me->start = s;
                     51:     else {
                     52:        l -= (me->start - s);
                     53:        s = me->start;
                     54:     }
                     55:     while (l-- > 0) {
                     56:        if (me->had_cr && *s == LF) {
                     57:            if (s > me->start+1) {
                     58:                if ((status = PUTBLOCK(me->start, s - me->start-1)) != HT_OK)
                     59:                    return status;
                     60:            }
                     61:            me->start = s+1;
                     62:            if ((status = PUTC('\n')) != HT_OK)
                     63:                return status;
                     64:        }
                     65:        me->had_cr = (*s++ == CR);
                     66:     }
                     67:     if (me->start < s && (status = PUTBLOCK(me->start, s-me->start)) != HT_OK)
                     68:        return status;
                     69:     me->start = NULL;                        /* Whole buffer is written :-) */
                     70:     return HT_OK;
                     71: }
                     72: 
                     73: PRIVATE int NetToText_flush ARGS1(HTStream *, me)
                     74: {
                     75:     return me->target->isa->flush(me->target);
                     76: }
                     77: 
                     78: PRIVATE int NetToText_free ARGS1(HTStream *, me)
                     79: {
                     80:     me->target->isa->_free(me->target);                       /* Close rest of pipe */
                     81:     free(me);
                     82:     return HT_OK;
                     83: }
                     84: 
                     85: PRIVATE int NetToText_abort ARGS2(HTStream *, me, HTError, e)
                     86: {
                     87:     me->target->isa->abort(me->target,e);             /* Abort rest of pipe */
                     88:     free(me);
                     89:     return HT_ERROR;
                     90: }
                     91: 
                     92: PRIVATE HTStreamClass NetToTextClass = {
                     93:     "NetToText",
                     94:     NetToText_flush,
                     95:     NetToText_free,
                     96:     NetToText_abort,
                     97:     NetToText_put_character,
                     98:     NetToText_put_string,
                     99:     NetToText_put_block
                    100: };
                    101: 
                    102: PUBLIC HTStream * HTNetToText ARGS1(HTStream *, target)
                    103: {
                    104:     HTStream* me = (HTStream *) calloc(1, sizeof(*me));
                    105:     if (me == NULL) outofmem(__FILE__, "NetToText");
                    106:     me->isa = &NetToTextClass;
                    107:     
                    108:     me->had_cr = NO;
                    109:     me->target = target;
                    110:     return me;
                    111: }
                    112: 

Webmaster