⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htnettxt.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
字号:
/*								     HTNetTxt.c**	NETWORK TELNET TO INTERNAL CHARACTER TEXT AND VISE VERSA****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTNetTxt.c,v 2.10 1998/05/04 19:37:07 frystyk Exp $****	This module provides two basic streams that converts from CRLF to**	an internal C representation (\n) and from the C representation to**	CRLF.**** HISTORY:**	27 Mar 95  HFN	Spawned off from HTFormat.c*//* Library Include files */#include "wwwsys.h"#include "HTUtils.h"#include "HTString.h"#include "HTStream.h"#include "HTNetTxt.h"					 /* Implemented here *//* Typedefs and global variable local to this module */struct _HTStream {    const HTStreamClass *	isa;    HTStream * 			target;    const char *		start;    BOOL			had_cr;};#define PUTC(c)		(*me->target->isa->put_character)(me->target, c)#define PUTBLOCK(b, l)	(*me->target->isa->put_block)(me->target, b, l)/* ------------------------------------------------------------------------- *//*	Converter from CRLF to \n**	-------------------------**	The input is assumed to be in local representation with lines**	delimited by (CR,LF) pairs in the local representation.**	The conversion to local representation is always done in HTSocket.c**	The (CR,LF) sequence when found is changed to a '\n' character,**	the internal C representation of a new line.*/PRIVATE int NetToText_put_block (HTStream * me, const char * s, int l){    int status;    if (!me->start)	me->start = s;    else {	l -= (me->start - s);	s = me->start;    }    while (l-- > 0) {	if (me->had_cr && *s == LF) {	    if (s > me->start+1) {		if ((status = PUTBLOCK(me->start, s - me->start-1)) != HT_OK)		    return status;	    }	    me->start = s+1;	    if ((status = PUTC('\n')) != HT_OK)		return status;	}	me->had_cr = (*s++ == CR);    }    if (me->start < s && (status = PUTBLOCK(me->start, s-me->start)) != HT_OK)	return status;    me->start = NULL;			      /* Whole buffer is written :-) */    return HT_OK;}PRIVATE int NetToText_put_character (HTStream * me, char c){    return NetToText_put_block(me, &c, 1);}PRIVATE int NetToText_put_string (HTStream * me, const char * s){        return NetToText_put_block(me, s, (int) strlen(s));}PRIVATE int Net_flush (HTStream * me){    return me->target ? (*me->target->isa->flush)(me->target) : HT_OK;}PRIVATE int Net_free (HTStream * me){    int status = HT_OK;    if (me->target) {	if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)	    return HT_WOULD_BLOCK;    }    HT_FREE(me);    return status;}PRIVATE int Net_abort (HTStream * me, HTList * e){    if (me->target)	(*me->target->isa->abort)(me->target, e);    HT_FREE(me);    return HT_ERROR;}PRIVATE HTStreamClass NetToTextClass = {    "NetToText",    Net_flush,    Net_free,    Net_abort,    NetToText_put_character,    NetToText_put_string,    NetToText_put_block};PUBLIC HTStream * HTNetToText (HTStream * target){    HTStream* me;    if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)        HT_OUTOFMEM("NetToText");    me->isa = &NetToTextClass;    me->had_cr = NO;    me->target = target;    return me;}/*	Converter from \n to CRLF**	-------------------------**	The input is assumed to be in local representation with lines**	delimited by \n. The \n when found is changed to a CRLF sequence,**	the network representation of a new line.**	Conversion: '\r' is stripped and \n => CRLF*/PRIVATE int TextToNet_put_block (HTStream * me, const char* b, int len){    int status;#if 0    const char *limit = b+len;#endif        if (!me->start)	me->start = b;    else {	len -= (me->start - b);	b = me->start;    }    while (len-- > 0) {	if (me->had_cr && *b == LF) {	    if (b > me->start+1) {		if ((status = PUTBLOCK(me->start, b - me->start-1)) != HT_OK)		    return status;	    }	    me->start = b+1;	    if ((status = PUTC('\n')) != HT_OK)		return status;	}	me->had_cr = (*b++ == CR);    }    if (me->start < b && (status = PUTBLOCK(me->start, b-me->start)) != HT_OK)	return status;    me->start = NULL;			      /* Whole buffer is written :-) */    return HT_OK;}PRIVATE int TextToNet_put_character (HTStream * me, char c){    return TextToNet_put_block(me, &c, 1);}PRIVATE int TextToNet_put_string (HTStream * me, const char * s){        return TextToNet_put_block(me, s, (int) strlen(s));}PRIVATE HTStreamClass TextToNetClass = {    "TextToNet",    Net_flush,    Net_free,    Net_abort,    TextToNet_put_character,    TextToNet_put_string,    TextToNet_put_block};PUBLIC HTStream * HTTextToNet (HTStream * target){    HTStream* me;    if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)        HT_OUTOFMEM("TextToNet");    me->isa = &TextToNetClass;    me->had_cr = NO;    me->target = target;    return me;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -