亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? htgopher.c

?? www工具包. 這是W3C官方支持的www支撐庫. 其中提供通用目的的客戶端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*							       	     HTGopher.c**	GOPHER ACCESS****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**** History:**	26 Sep 90	Adapted from other accesses (News, HTTP) TBL**	29 Nov 91	Downgraded to C, for portable implementation.**	28 Apr 94	target no more global and icons implemented**			HF, frystyk@w3.org**	 2 May 94	Fixed possible security hole when the URL contains**			a newline, that could cause multiple commands to be**			sent to a Gopher server. AL, luotonen@www.cern.ch**	12 May 94	Checked and made ready for multi-threads, Frystyk**	 8 Jul 94  FM	Insulate free() from _free structure element.**	   Sep 95  HFN	Made non-blocking and state stream oriented*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "WWWHTML.h"#include "WWWDir.h"#include "WWWTrans.h"#include "HTNetMan.h"#include "HTGopher.h"					 /* Implemented here *//* Macros and other defines */#ifndef GOPHER_PORT#define GOPHER_PORT 70					/* See protocol spec */#endif/* Hypertext object building machinery */#define PUTC(c) (*target->isa->put_character)(target, c)#define PUTS(s) (*target->isa->put_string)(target, s)#define START(e) (*target->isa->start_element)(target, e, 0, 0)#define END(e) (*target->isa->end_element)(target, e)/* Type definitions and global variables etc. local to this module */typedef enum _HTGopherType {    GT_TEXT		= '0',    GT_MENU		= '1',    GT_CSO		= '2',    GT_ERROR		= '3',    GT_MACBINHEX	= '4',    GT_PCBINHEX		= '5',    GT_UUENCODED	= '6',    GT_INDEX		= '7',    GT_TELNET		= '8',    GT_BINARY		= '9',    GT_GIF		= 'g',    GT_HTML		= 'h',        				     /* HTML */    GT_INFO		= 'i',    GT_SOUND		= 's',    GT_WWW		= 'w',				       /* W3 address */    GT_IMAGE		= 'I',    GT_TN3270		= 'T',    GT_DUPLICATE	= '+',    GT_PLUS_IMAGE	= ':',			/* Addition from Gopher Plus */    GT_PLUS_MOVIE	= ';',    GT_PLUS_SOUND	= '<',    GT_EOF		= '.'} HTGopherType;/* Final states have negative value */typedef enum _GopherState {    GOPHER_ERROR	= -3,    GOPHER_NO_DATA	= -2,    GOPHER_GOT_DATA	= -1,    GOPHER_BEGIN	= 0,    GOPHER_NEED_CONNECTION,    GOPHER_NEED_REQUEST,    GOPHER_NEED_RESPONSE} GopherState;/* This is the context structure for the this module */typedef struct _gopher_info {    HTGopherType	type; 		                 /* Gopher item type */    GopherState		state;    char *		cmd;    HTNet *		net;} gopher_info;#define MAX_GOPHER_LINE		256struct _HTStructured {    const HTStructuredClass *	isa;};struct _HTStream {    const HTStreamClass *	isa;    HTStructured *	  	target;    HTRequest *			request;    HTEOLState			state;    char *			url;    BOOL			pre;		       /* Preformatted mode? */    BOOL			junk;		       /* For too long lines */    BOOL			CSO;    char			cso_rec[10];		/* CSO record number */    char 			buffer[MAX_GOPHER_LINE+1];    int				buflen;};struct _HTInputStream {    const HTInputStreamClass *	isa;};PRIVATE HTDirShow	dir_show = HT_DS_ICON;/* ------------------------------------------------------------------------- *//*	GopherIcon**	----------**	This function finds an appopriate icon for the item in the gopher**	list. Actually it is only a shell build upon HTIcon_find().*/PRIVATE HTIconNode *GopherIcon (HTGopherType type){    HTFormat   content_type = NULL;    HTEncoding content_encoding = NULL;    HTFileMode mode = HT_IS_FILE;    switch(type) {      case GT_MENU:	mode = HT_IS_DIR;      case GT_TEXT:	content_type = HTAtom_for("text/void");	break;      case GT_IMAGE:      case GT_PLUS_IMAGE:      case GT_GIF:	content_type = HTAtom_for("image/void");	break;      case GT_WWW:      case GT_HTML:	content_type = HTAtom_for("text/void");	break;      case GT_SOUND:      case GT_PLUS_SOUND:	content_type = HTAtom_for("audio/void");	break;      case GT_PLUS_MOVIE:	content_type = HTAtom_for("video/void");	break;      case GT_INDEX:	content_type = HTAtom_for("application/x-gopher-index");	break;      case GT_CSO:	content_type = HTAtom_for("application/x-gopher-cso");	break;      case GT_TELNET:	content_type = HTAtom_for("application/x-gopher-telnet");	break;      case GT_TN3270:	content_type = HTAtom_for("application/x-gopher-tn3270");	break;      case GT_DUPLICATE:	content_type = HTAtom_for("application/x-gopher-duplicate");	break;      case GT_ERROR:	content_type = HTAtom_for("www/unknown");	break;      case GT_BINARY:	content_type = WWW_BINARY;	break;      default:	content_type = HTAtom_for("www/unknown");	break;    }    return HTIcon_find(mode, content_type, content_encoding);}/* ------------------------------------------------------------------------- *//*				    STREAMS				     *//* ------------------------------------------------------------------------- *//*	GopherTitle**	-----------**	Create the top part of the page*/PRIVATE BOOL GopherTitle (HTStream *me){    HTStructured *target = me->target;    char *str = NULL;    StrAllocCopy(str, me->CSO ? "CSO Search " : "GopherMenu");    START(HTML_HTML);    START(HTML_HEAD);    START(HTML_TITLE);    if (me->CSO) {	char *keyword = strchr(me->url, '?');	if (keyword) {	    StrAllocCat(str, "for ");	    StrAllocCat(str, ++keyword);	}    }    PUTS(str);    END(HTML_TITLE);    END(HTML_HEAD);    START(HTML_BODY);    START(HTML_H1);    PUTS(str);    END(HTML_H1);    HT_FREE(str);    return YES;}/*	GopherBottom**	------------**	Create the bottom part of the page*/PRIVATE BOOL GopherBottom (HTStream *me){    HTStructured *target = me->target;    if (me->pre)	END(HTML_PRE);    END(HTML_BODY);    END(HTML_HTML);    return YES;}/*	GopherMenuLine**	--------------**	Parses a Gopher Menu Line**	Return YES if more data else NO*/PRIVATE BOOL GopherMenuLine (HTStream *me, char *line){    HTStructured *target = me->target;    HTGopherType gtype = (HTGopherType) *line++;    HTTRACE(PROT_TRACE, "HTGopher.... Menu line: `%s\'\n" _ line);    if (gtype == GT_INFO) {	char *stop = strchr(line, '\t');	if (stop) *stop = '\0';	PUTS(line);    } else if (gtype == GT_ERROR) {	char *stop = strchr(line, '\t');	if (stop) *stop = '\0';	PUTS(line);    } else if ((strstr(line, "error.host") || strstr(line, "errorhost"))) {	char *stop = strchr(line, '\t');	      /* Chop off error.host */	if (stop) *stop = '\0';	PUTS(line);    } else if (gtype == GT_EOF) {	return NO;    } else {				    /* Parse normal gopher menu line */	char *name = line;			     /* Get link information */	char *selector = strchr(name, '\t');	char *host = NULL;	char *port = NULL;	if (selector) {	    *selector++ = '\0';	    if ((host = strchr(selector, '\t'))) {		*host++ = '\0';		if ((port = strchr(host, '\t'))) {		    char *junk;		    *port = ':';	 	     /* delimit host a la W3 */		    if ((junk = strchr(port, '\t')) != NULL)			*junk = '\0';				/* Chop port */		    if (*(port+1) == '0' && !*(port+2))			*port = '\0';		}	    }	}	if (!me->pre) {		      /* For now we use preformatted listing */	    START(HTML_PRE);	    me->pre = YES;	}	if (dir_show & HT_DS_ICON) {		 	 /* Put out the icon */	    HTIconNode *icon = GopherIcon(gtype);	    if (icon) {		char * alt = HTIcon_alternative(icon, YES);		HTMLPutImg(target, HTIcon_url(icon), alt, NULL);		HT_FREE(alt);		PUTC(' ');	    }	}	if (gtype == GT_WWW) {			     /* Gopher pointer to W3 */	    char *escaped = NULL;	    escaped = HTEscape(selector, URL_PATH);	    HTStartAnchor(target, NULL, escaped);	    PUTS(name);	    END(HTML_A);	    HT_FREE(escaped);	} else if (port) {			    /* Other types need port */	    char *escaped = NULL;	    char *address = NULL;	    int addr_len;	    	    /* Calculate the length of the WWW-address */	    if (selector && *selector) {		escaped = HTEscape(selector, URL_PATH);		addr_len = 15 + strlen(escaped) + strlen(host) + 1;	    } else {		addr_len = 15 + strlen(host) + 1;	    }	    if ((address = (char *) HT_MALLOC(addr_len)) == NULL)	        HT_OUTOFMEM("GopherMenuLine");	    *address = '\0';	    if (gtype == GT_TELNET) {		if (escaped)		    sprintf(address, "telnet://%s@%s/", escaped, host);		else		    sprintf(address, "telnet://%s/", host);	    } else if (gtype == GT_TN3270) {		if (escaped)		    sprintf(address, "tn3270://%s@%s/", escaped, host);		else		    sprintf(address, "tn3270://%s/", host);	    } else {		if (escaped)		    sprintf(address, "//%s/%c%s", host, gtype, escaped);		else		    sprintf(address, "//%s/%c", host, gtype);	    }	    	    HTStartAnchor(target, NULL, address);	    PUTS(name);	    END(HTML_A);	    HT_FREE(address);	    HT_FREE(escaped);	    PUTC('\n');	} else {					   /* If parse error */	    HTTRACE(PROT_TRACE, "HTGopher.... Bad menu item, `%s\'\n" _ line);	}    }    return YES;}/*	GopherCSOLine**	--------------**	Parses a Gopher Menu Line**	Return YES if more data else NO*/PRIVATE BOOL GopherCSOLine (HTStream *me, char *line){    HTStructured *target = me->target;    if (*line == '1') {					 /* Information line */	char *start = strchr(line, ':');	if (start) start++; else start=line;	PUTS(start);    } else if (*line == '2') {				/* Transfer complete */	return NO;    } else if (*line == '5') {					    /* Error */	char *start = strchr(line, ':');	if (start) start++; else start=line;	PUTS(start);    } else if (*line == '-') {					     /* data */	/*  data lines look like '-200:code:field:value'	 *  where code is the search result number and can be  	 *  multiple digits (infinte?)	 *  find the second colon and check the digit to the	 *  left of it to see if they are diferent	 *  if they are then a different person is starting. 	 */	char *code;	char *field;	if ((code = strchr(line, ':')) && (field = strchr(++code, ':'))) {	    BOOL newrec = YES;	    *field++ = '\0';	    if (!*me->cso_rec) {		   /* Header of first record */		START(HTML_DL);	    } else if (strcmp(me->cso_rec, code)) {    /* Another new record */		START(HTML_B);	    } else		newrec = NO;	    START(HTML_DT);	    	    /* I'm not sure whether the name field comes in any	     *  special order or if its even required in a 	     *  record, so for now the first line is the header	     *  no matter what it is (it's almost always the	     *  alias)	     */	    {		char *value = strchr(field, ':');		if (!value)		    value = "Empty value";		else		    *value++ = '\0';		{		    char *strip = HTStrip(field);		    PUTS(strip);		    START(HTML_DD);		    strip = HTStrip(value);		    if (newrec) {			PUTS(strip);			END(HTML_B);		    } else			PUTS(strip);	    }	    /* Save the code for comparison on the next pass */	    strcpy(me->cso_rec, code);	    }	}    } else {						     /* Unknown line */	char *start = strchr(line, ':');	if (start) start++; else start=line;	PUTS(start);    }    return YES;}/***  Searches for Gopher line until buffer fills up or a CRLF or LF is found*/PRIVATE int GopherMenu_put_block (HTStream * me, const char * b, int l){    while (l-- > 0) {	if (me->state == EOL_FCR) {	    if (*b == LF && me->buflen) {		if (!me->junk) {		    BOOL cont;		    *(me->buffer+me->buflen) = '\0';

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
波多野洁衣一区| 91福利在线看| 亚洲激情av在线| 在线不卡中文字幕播放| 激情深爱一区二区| 亚洲色图在线视频| 日韩欧美国产高清| 色美美综合视频| 亚洲一区中文日韩| 精品粉嫩超白一线天av| 99re这里只有精品首页| 日韩精品免费专区| 国产精品素人视频| 91精品国产黑色紧身裤美女| 丁香亚洲综合激情啪啪综合| 午夜日韩在线观看| 亚洲国产成人自拍| 在线观看亚洲专区| 国产麻豆精品在线| 亚洲成人7777| 中文字幕亚洲成人| 久久综合九色综合欧美亚洲| 欧美中文字幕一区| av中文字幕不卡| 久久99精品一区二区三区| 亚洲精品ww久久久久久p站| 久久综合丝袜日本网| 在线观看视频91| 成人av免费在线播放| 精品一区二区三区影院在线午夜| 亚洲国产成人自拍| 久久综合色播五月| 欧美三级电影在线观看| 91女厕偷拍女厕偷拍高清| 国产一区二区三区免费观看| 亚洲国产日韩av| 亚洲三级电影网站| 国产精品私人自拍| 国产欧美精品日韩区二区麻豆天美| 91精品国产综合久久国产大片 | 亚洲sss视频在线视频| 国产精品欧美极品| 久久亚区不卡日本| 日韩三级电影网址| 欧美另类高清zo欧美| 91豆麻精品91久久久久久| av电影天堂一区二区在线观看| 亚洲第一av色| 亚洲国产综合在线| 中文字幕av一区二区三区| 久久亚洲一级片| 欧美成人精品福利| 久久久综合精品| 国产精品成人一区二区艾草 | 亚洲精品国产品国语在线app| 亚洲欧美日韩电影| 亚洲伊人色欲综合网| 日韩精品视频网| 激情图片小说一区| jiyouzz国产精品久久| 91美女片黄在线观看| 欧美日韩亚洲综合一区| 日韩欧美专区在线| 中文字幕不卡在线播放| 亚洲激情成人在线| 人人精品人人爱| 丁香网亚洲国际| 日本韩国精品在线| 91精品国产美女浴室洗澡无遮挡| 久久这里只有精品视频网| 中文字幕巨乱亚洲| 亚洲国产一区视频| 另类小说综合欧美亚洲| 成人黄色小视频在线观看| 欧美日韩中文另类| 久久综合久久综合久久综合| 国产精品成人免费精品自在线观看| 一区二区三区小说| 精品一区二区三区在线播放视频| 99精品欧美一区二区三区小说 | 国产精品国产三级国产有无不卡| 亚洲午夜电影在线观看| 韩国女主播成人在线| 色婷婷综合久久久久中文一区二区 | 亚洲国产乱码最新视频| 狠狠色2019综合网| 在线观看成人小视频| 日韩欧美三级在线| 亚洲三级在线免费| 激情成人综合网| 欧美午夜视频网站| 久久免费视频色| 亚洲v中文字幕| 97国产一区二区| 2023国产精品| 亚洲国产日韩一区二区| 风间由美性色一区二区三区| 欧美日韩你懂的| 国产精品视频在线看| 欧美a一区二区| 在线观看视频91| 国产精品少妇自拍| 久久av老司机精品网站导航| 在线免费观看视频一区| 国产欧美精品一区| 青青草97国产精品免费观看| 91行情网站电视在线观看高清版| 久久精品一级爱片| 免费成人美女在线观看| 欧日韩精品视频| 中文天堂在线一区| 国内不卡的二区三区中文字幕| 欧美日韩三级在线| 亚洲免费色视频| 成人免费视频视频| 久久你懂得1024| 久久99精品国产.久久久久久| 欧美色综合天天久久综合精品| 国产精品婷婷午夜在线观看| 国产成人在线视频网站| 精品国产一区二区三区不卡| 秋霞成人午夜伦在线观看| 欧美日韩一区国产| 亚洲一区影音先锋| 色激情天天射综合网| 亚洲欧美国产77777| 972aa.com艺术欧美| 国产精品传媒入口麻豆| 处破女av一区二区| 国产精品久久久久婷婷二区次| 国产一区二区不卡在线| 欧美成人一区二区三区在线观看| 日产国产高清一区二区三区| 在线不卡的av| 日产精品久久久久久久性色| 欧美一区中文字幕| 美洲天堂一区二卡三卡四卡视频| 欧美区一区二区三区| 日韩影视精彩在线| 欧美一区二区成人6969| 日本最新不卡在线| 精品电影一区二区| 风流少妇一区二区| 一区在线播放视频| 在线观看日韩毛片| 亚洲成人综合网站| 欧美群妇大交群的观看方式| 男女男精品网站| 国产午夜久久久久| 97se狠狠狠综合亚洲狠狠| 亚洲精品高清视频在线观看| 欧美日韩精品系列| 肉色丝袜一区二区| 亚洲精品一区二区三区精华液| 激情欧美一区二区三区在线观看| 国产亚洲成av人在线观看导航| 99久久99精品久久久久久| 亚洲欧美色综合| 欧美日韩一区二区在线视频| 美女一区二区视频| 久久久久国产精品人| 99精品国产视频| 丝袜国产日韩另类美女| 精品久久人人做人人爱| 成人a免费在线看| 亚洲一二三四久久| 精品久久久久99| 99久久精品一区| 天堂av在线一区| 久久久精品欧美丰满| 91色porny蝌蚪| 日本在线不卡视频| 国产精品剧情在线亚洲| 欧美综合亚洲图片综合区| 久久精品国产免费| 亚洲欧美一区二区视频| 911精品国产一区二区在线| 国内精品视频666| 伊人一区二区三区| 久久综合久色欧美综合狠狠| 色婷婷久久99综合精品jk白丝| 久久国产福利国产秒拍| 最新中文字幕一区二区三区| 7777精品伊人久久久大香线蕉最新版 | 欧美精品一区二区三区高清aⅴ| 成人高清视频在线| 日本视频免费一区| 国产精品国产成人国产三级| 6080日韩午夜伦伦午夜伦| 成人中文字幕在线| 美腿丝袜亚洲综合| 亚洲人成影院在线观看| 日韩亚洲欧美成人一区| 色综合久久综合网| 国产盗摄精品一区二区三区在线| 日本不卡的三区四区五区| 综合久久久久久| 久久久综合精品| 日韩欧美国产三级电影视频| 在线观看精品一区|