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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 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';

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av一二三| 天堂久久一区二区三区| 久久久国产精华| 精品国产乱码久久久久久久 | 国产精品久久久久久久浪潮网站 | 99re6这里只有精品视频在线观看| 国产精品99久久久久久有的能看| 国产不卡在线视频| 粗大黑人巨茎大战欧美成人| 成人av电影在线观看| 在线视频你懂得一区| 欧美综合在线视频| 日韩一级视频免费观看在线| 精品国产一区二区亚洲人成毛片 | 国产精品色在线| 亚洲欧洲日韩在线| 亚洲精品乱码久久久久久| 亚洲福利视频导航| 激情五月激情综合网| 国产不卡在线一区| 欧美色精品天天在线观看视频| 91麻豆精品国产无毒不卡在线观看| 51精品国自产在线| 中文字幕精品三区| 亚洲猫色日本管| 蜜桃av一区二区在线观看 | 亚洲综合一区在线| 免费观看一级欧美片| 粉嫩一区二区三区在线看| 色综合天天综合网天天看片| 欧美一区永久视频免费观看| 国产日韩欧美一区二区三区综合 | 欧美一二三在线| 亚洲国产岛国毛片在线| 亚洲午夜一二三区视频| 国产精品资源在线看| 欧美影视一区在线| 国产欧美精品在线观看| 亚洲一二三级电影| 成人在线视频一区二区| 欧美军同video69gay| 国产精品人妖ts系列视频| 日韩av不卡一区二区| 99久久伊人网影院| 精品精品国产高清一毛片一天堂| 亚洲欧洲精品一区二区精品久久久| 五月婷婷久久丁香| 91色porny蝌蚪| 国产亚洲欧美日韩日本| 免费在线欧美视频| 色播五月激情综合网| 国产精品素人视频| 狠狠色狠狠色综合系列| 欧美喷潮久久久xxxxx| 成人欧美一区二区三区白人| 国产一区二区三区四| 7777精品伊人久久久大香线蕉超级流畅 | 欧美精品一区二区久久婷婷| 亚洲国产精品久久人人爱| 99国产精品国产精品毛片| 欧美国产激情二区三区| 精品写真视频在线观看| 欧美电影免费观看高清完整版 | 国内精品久久久久影院一蜜桃| 欧美日韩不卡在线| 91在线视频免费观看| 中文字幕av一区二区三区免费看| 韩国女主播成人在线观看| 91麻豆精品国产91久久久资源速度| 亚洲线精品一区二区三区 | 国产精品一区在线| 337p日本欧洲亚洲大胆精品| 精品一区免费av| 久久精品一区二区三区不卡牛牛| 精品亚洲国内自在自线福利| 精品久久久久久无| 国产激情一区二区三区四区 | 欧美日韩一区二区三区视频| 一区二区三区产品免费精品久久75| 99视频一区二区| 亚洲色图在线播放| 欧美性感一区二区三区| 日本vs亚洲vs韩国一区三区二区 | 亚洲综合丁香婷婷六月香| 在线观看日韩一区| 天堂一区二区在线| 26uuu亚洲综合色欧美| 国产成人精品影视| 椎名由奈av一区二区三区| 在线欧美日韩精品| 日韩精品一卡二卡三卡四卡无卡| 欧美一区二区三区免费| 韩国三级电影一区二区| 最新日韩在线视频| 欧美日韩国产在线播放网站| 久久 天天综合| 国产精品成人午夜| 欧美日本国产一区| 国产麻豆视频一区二区| 亚洲欧洲综合另类在线 | 韩国毛片一区二区三区| 中文字幕乱码久久午夜不卡| 色老头久久综合| 免费观看在线综合| 亚洲视频一二三区| 精品国产乱码久久久久久老虎| 波多野结衣的一区二区三区| 亚洲成a天堂v人片| 欧美激情一区二区三区全黄| 欧美视频在线观看一区二区| 国产一区二区三区黄视频 | 国精品**一区二区三区在线蜜桃| 国产精品伦一区| 日韩欧美国产系列| 99国产精品久久| 国产一区二区三区四| 亚洲线精品一区二区三区八戒| 久久久99精品久久| 7777女厕盗摄久久久| 99精品桃花视频在线观看| 奇米影视在线99精品| 亚洲欧美怡红院| 香蕉久久夜色精品国产使用方法 | 亚洲人成小说网站色在线| 日韩一区二区在线免费观看| a级高清视频欧美日韩| 久久精品国产一区二区三| 夜夜夜精品看看| 日韩伦理av电影| 欧美精品一区二区在线播放| 7777精品伊人久久久大香线蕉的| 91福利在线看| 99久久久免费精品国产一区二区| 久久99国产乱子伦精品免费| 亚洲成人免费视频| 亚洲精品菠萝久久久久久久| 国产精品日韩精品欧美在线| 久久丝袜美腿综合| 欧美成人aa大片| 日韩欧美中文字幕精品| 欧美人与z0zoxxxx视频| 欧美日韩高清在线| 欧美日韩一区 二区 三区 久久精品| av电影天堂一区二区在线| 国产suv精品一区二区三区| 久久精品国产精品亚洲综合| 日韩精品电影一区亚洲| 天堂在线亚洲视频| 美国十次综合导航| 精品亚洲免费视频| 国产福利精品一区| 国产91富婆露脸刺激对白| 国产不卡视频在线播放| 成人黄色a**站在线观看| 粉嫩av一区二区三区在线播放| 国产成人免费在线视频| 国产成人一区二区精品非洲| 国产成人精品免费看| jizz一区二区| 欧洲精品在线观看| 在线成人高清不卡| 欧美大片国产精品| 久久久久久麻豆| 亚洲桃色在线一区| 亚洲自拍欧美精品| 日本vs亚洲vs韩国一区三区 | 亚洲成av人片在www色猫咪| av高清不卡在线| 成人午夜又粗又硬又大| 99免费精品视频| 欧美三级视频在线观看| 欧美日韩国产成人在线免费| 精品国产百合女同互慰| 欧美激情一区二区三区四区 | 国产精品自拍毛片| 99久久综合精品| 欧美伦理视频网站| 久久九九久久九九| 依依成人精品视频| 蜜桃精品在线观看| av毛片久久久久**hd| 欧美精品亚洲一区二区在线播放| 日韩欧美高清dvd碟片| 国产女人aaa级久久久级| 一区二区三区91| 捆绑调教美女网站视频一区| 成人福利视频在线| 久久99国产精品成人| 午夜成人免费视频| 免费人成在线不卡| 国产91综合网| 欧美日韩一二三| 国产女人18毛片水真多成人如厕| 在线视频你懂得一区| 欧美国产日韩在线观看| 国产精品亚洲成人| 国产欧美日韩在线| 成人精品高清在线| 中文字幕中文字幕一区二区| www.亚洲精品|