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

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.9     ! frystyk     6: **     @(#) $Id: HTNetTxt.c,v 2.8 1996/04/12 17:48:13 frystyk Exp $
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.9     ! frystyk   136: #if 0
2.7       frystyk   137:     const char *limit = b+len;
2.9     ! frystyk   138: #endif    
2.3       frystyk   139:     if (!me->start)
                    140:        me->start = b;
                    141:     else {
                    142:        len -= (me->start - b);
                    143:        b = me->start;
                    144:     }
                    145:     while (len-- > 0) {
                    146:        if (me->had_cr && *b == LF) {
                    147:            if (b > me->start+1) {
                    148:                if ((status = PUTBLOCK(me->start, b - me->start-1)) != HT_OK)
                    149:                    return status;
                    150:            }
                    151:            me->start = b+1;
                    152:            if ((status = PUTC('\n')) != HT_OK)
                    153:                return status;
                    154:        }
                    155:        me->had_cr = (*b++ == CR);
                    156:     }
                    157:     if (me->start < b && (status = PUTBLOCK(me->start, b-me->start)) != HT_OK)
                    158:        return status;
                    159:     me->start = NULL;                        /* Whole buffer is written :-) */
                    160:     return HT_OK;
                    161: }
                    162: 
2.4       frystyk   163: PRIVATE int TextToNet_put_character (HTStream * me, char c)
2.3       frystyk   164: {
                    165:     return TextToNet_put_block(me, &c, 1);
                    166: }
                    167: 
2.7       frystyk   168: PRIVATE int TextToNet_put_string (HTStream * me, const char * s)
2.3       frystyk   169: {    
                    170:     return TextToNet_put_block(me, s, (int) strlen(s));
                    171: }
                    172: 
                    173: PRIVATE HTStreamClass TextToNetClass = {
                    174:     "TextToNet",
2.4       frystyk   175:     Net_flush,
                    176:     Net_free,
                    177:     Net_abort,
2.3       frystyk   178:     TextToNet_put_character,
                    179:     TextToNet_put_string,
                    180:     TextToNet_put_block
                    181: };
                    182: 
2.4       frystyk   183: PUBLIC HTStream * HTTextToNet (HTStream * target)
2.3       frystyk   184: {
2.6       frystyk   185:     HTStream* me;
                    186:     if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
                    187:         HT_OUTOFMEM("TextToNet");
2.3       frystyk   188:     me->isa = &TextToNetClass;
2.1       frystyk   189:     me->had_cr = NO;
                    190:     me->target = target;
                    191:     return me;
                    192: }
2.4       frystyk   193: 
                    194: 
                    195: 
2.1       frystyk   196: 

Webmaster