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

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.
2.8     ! frystyk     6: **     @(#) $Id: Date Author State $
2.1       frystyk     7: **
2.3       frystyk     8: **     This module provides two basic streams that converts from CRLF to
                      9: **     an internal C representation (\n) and from the C representation to
                     10: **     CRLF.
2.1       frystyk    11: **
                     12: ** HISTORY:
                     13: **     27 Mar 95  HFN  Spawned off from HTFormat.c
                     14: */
                     15: 
                     16: /* Library Include files */
2.7       frystyk    17: #include "sysdep.h"
2.1       frystyk    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 {
2.7       frystyk    25:     const HTStreamClass *      isa;
2.1       frystyk    26:     HTStream *                         target;
2.7       frystyk    27:     const char *               start;
2.1       frystyk    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: 
2.4       frystyk    36: /*     Converter from CRLF to \n
                     37: **     -------------------------
                     38: **     The input is assumed to be in local representation with lines
                     39: **     delimited by (CR,LF) pairs in the local representation.
                     40: **     The conversion to local representation is always done in HTSocket.c
                     41: **     The (CR,LF) sequence when found is changed to a '\n' character,
                     42: **     the internal C representation of a new line.
2.3       frystyk    43: */
2.7       frystyk    44: PRIVATE int NetToText_put_block (HTStream * me, const char * s, int l)
2.1       frystyk    45: {
                     46:     int status;
                     47:     if (!me->start)
                     48:        me->start = s;
                     49:     else {
                     50:        l -= (me->start - s);
                     51:        s = me->start;
                     52:     }
                     53:     while (l-- > 0) {
                     54:        if (me->had_cr && *s == LF) {
                     55:            if (s > me->start+1) {
                     56:                if ((status = PUTBLOCK(me->start, s - me->start-1)) != HT_OK)
                     57:                    return status;
                     58:            }
                     59:            me->start = s+1;
                     60:            if ((status = PUTC('\n')) != HT_OK)
                     61:                return status;
                     62:        }
                     63:        me->had_cr = (*s++ == CR);
                     64:     }
                     65:     if (me->start < s && (status = PUTBLOCK(me->start, s-me->start)) != HT_OK)
                     66:        return status;
                     67:     me->start = NULL;                        /* Whole buffer is written :-) */
                     68:     return HT_OK;
                     69: }
                     70: 
2.4       frystyk    71: PRIVATE int NetToText_put_character (HTStream * me, char c)
2.3       frystyk    72: {
                     73:     return NetToText_put_block(me, &c, 1);
                     74: }
                     75: 
2.7       frystyk    76: PRIVATE int NetToText_put_string (HTStream * me, const char * s)
2.3       frystyk    77: {    
                     78:     return NetToText_put_block(me, s, (int) strlen(s));
                     79: }
                     80: 
2.4       frystyk    81: PRIVATE int Net_flush (HTStream * me)
2.1       frystyk    82: {
2.4       frystyk    83:     return me->target ? (*me->target->isa->flush)(me->target) : HT_OK;
2.1       frystyk    84: }
                     85: 
2.4       frystyk    86: PRIVATE int Net_free (HTStream * me)
2.1       frystyk    87: {
2.4       frystyk    88:     int status = HT_OK;
                     89:     if (me->target) {
                     90:        if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)
                     91:            return HT_WOULD_BLOCK;
                     92:     }
2.6       frystyk    93:     HT_FREE(me);
2.4       frystyk    94:     return status;
2.1       frystyk    95: }
                     96: 
2.5       frystyk    97: PRIVATE int Net_abort (HTStream * me, HTList * e)
2.1       frystyk    98: {
2.4       frystyk    99:     if (me->target)
                    100:        (*me->target->isa->abort)(me->target, e);
2.6       frystyk   101:     HT_FREE(me);
2.1       frystyk   102:     return HT_ERROR;
                    103: }
                    104: 
                    105: PRIVATE HTStreamClass NetToTextClass = {
                    106:     "NetToText",
2.4       frystyk   107:     Net_flush,
                    108:     Net_free,
                    109:     Net_abort,
2.1       frystyk   110:     NetToText_put_character,
                    111:     NetToText_put_string,
                    112:     NetToText_put_block
                    113: };
                    114: 
2.4       frystyk   115: PUBLIC HTStream * HTNetToText (HTStream * target)
2.1       frystyk   116: {
2.6       frystyk   117:     HTStream* me;
                    118:     if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
                    119:         HT_OUTOFMEM("NetToText");
2.1       frystyk   120:     me->isa = &NetToTextClass;
2.3       frystyk   121:     me->had_cr = NO;
                    122:     me->target = target;
                    123:     return me;
                    124: }
                    125: 
2.4       frystyk   126: /*     Converter from \n to CRLF
                    127: **     -------------------------
                    128: **     The input is assumed to be in local representation with lines
                    129: **     delimited by \n. The \n when found is changed to a CRLF sequence,
                    130: **     the network representation of a new line.
                    131: **     Conversion: '\r' is stripped and \n => CRLF
2.3       frystyk   132: */
2.7       frystyk   133: PRIVATE int TextToNet_put_block (HTStream * me, const char* b, int len)
2.3       frystyk   134: {
                    135:     int status;
2.7       frystyk   136:     const char *limit = b+len;
2.3       frystyk   137:     
                    138:     if (!me->start)
                    139:        me->start = b;
                    140:     else {
                    141:        len -= (me->start - b);
                    142:        b = me->start;
                    143:     }
                    144:     while (len-- > 0) {
                    145:        if (me->had_cr && *b == LF) {
                    146:            if (b > me->start+1) {
                    147:                if ((status = PUTBLOCK(me->start, b - me->start-1)) != HT_OK)
                    148:                    return status;
                    149:            }
                    150:            me->start = b+1;
                    151:            if ((status = PUTC('\n')) != HT_OK)
                    152:                return status;
                    153:        }
                    154:        me->had_cr = (*b++ == CR);
                    155:     }
                    156:     if (me->start < b && (status = PUTBLOCK(me->start, b-me->start)) != HT_OK)
                    157:        return status;
                    158:     me->start = NULL;                        /* Whole buffer is written :-) */
                    159:     return HT_OK;
                    160: }
                    161: 
2.4       frystyk   162: PRIVATE int TextToNet_put_character (HTStream * me, char c)
2.3       frystyk   163: {
                    164:     return TextToNet_put_block(me, &c, 1);
                    165: }
                    166: 
2.7       frystyk   167: PRIVATE int TextToNet_put_string (HTStream * me, const char * s)
2.3       frystyk   168: {    
                    169:     return TextToNet_put_block(me, s, (int) strlen(s));
                    170: }
                    171: 
                    172: PRIVATE HTStreamClass TextToNetClass = {
                    173:     "TextToNet",
2.4       frystyk   174:     Net_flush,
                    175:     Net_free,
                    176:     Net_abort,
2.3       frystyk   177:     TextToNet_put_character,
                    178:     TextToNet_put_string,
                    179:     TextToNet_put_block
                    180: };
                    181: 
2.4       frystyk   182: PUBLIC HTStream * HTTextToNet (HTStream * target)
2.3       frystyk   183: {
2.6       frystyk   184:     HTStream* me;
                    185:     if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
                    186:         HT_OUTOFMEM("TextToNet");
2.3       frystyk   187:     me->isa = &TextToNetClass;
2.1       frystyk   188:     me->had_cr = NO;
                    189:     me->target = target;
                    190:     return me;
                    191: }
2.4       frystyk   192: 
                    193: 
                    194: 
2.1       frystyk   195: 

Webmaster