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

📄 htformat.c

📁 www工具包
💻 C
📖 第 1 页 / 共 2 页
字号:
/*								     HTFormat.c**	MANAGE DIFFERENT FILE FORMATS****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTFormat.c,v 1.100 1999/02/22 22:10:11 frystyk Exp $**** Bugs:**	Assumes the incoming stream is ASCII, rather than a local file**	format, and so ALWAYS converts from ASCII on non-ASCII machines.**	Therefore, non-ASCII machines can't read local files.**** HISTORY:**	8 Jul 94  FM	Insulate free from _free structure element.**	8 Nov 94  HFN	Changed a lot to make reentrant*//* Library Include files */#include "wwwsys.h"#include "WWWUtil.h"#include "HTStream.h"#include "HTWWWStr.h"#include "HTFWrite.h"#include "HTError.h"#include "HTFormat.h"					 /* Implemented here */#define NO_VALUE_FOUND	-1e30		 /* Stream Stack Value if none found */PRIVATE HTList * HTConversions = NULL;			    /* Content types */PRIVATE HTList * HTContentCoders = NULL;		   /* Content coders */PRIVATE HTList * HTTransferCoders = NULL;	  /* Content transfer coders */PRIVATE HTList * HTCharsets = NULL;PRIVATE HTList * HTLanguages = NULL;PRIVATE double HTMaxSecs = 1e10;		/* No effective limit */PRIVATE HTConverter * presentation_converter = NULL;struct _HTStream {    const HTStreamClass *	isa;};struct _HTCoding {    HTEncoding		encoding;    HTCoder *		encoder;    HTCoder *		decoder;    double		quality;};PRIVATE HTStream	HTBaseConverterStreamInstance;/* ------------------------------------------------------------------------- *//*				BASIC CONVERTERS			     *//* ------------------------------------------------------------------------- */PRIVATE int HTBlackHoleConverter_put_character (HTStream * me, char c){    return HT_OK;}PRIVATE int HTBlackHoleConverter_put_string (HTStream * me, const char * s){    return HT_OK;}PRIVATE int HTBlackHoleConverter_write (HTStream * me, const char * s, int l){    return HT_OK;}PRIVATE int HTBlackHoleConverter_flush (HTStream * me){    return HT_OK;}PRIVATE int HTBlackHoleConverter_free (HTStream * me){    return HT_OK;}PRIVATE int HTBlackHoleConverter_abort (HTStream * me, HTList * e){    return HT_ERROR;}PRIVATE const HTStreamClass HTBlackHoleConverterClass ={		    "BlackHoleConverter",    HTBlackHoleConverter_flush,    HTBlackHoleConverter_free,    HTBlackHoleConverter_abort,    HTBlackHoleConverter_put_character,    HTBlackHoleConverter_put_string,    HTBlackHoleConverter_write}; PUBLIC HTStream * HTBlackHoleConverter (HTRequest *	request,					void *		param,					HTFormat	input_format,					HTFormat	output_format,					HTStream *	output_stream){    HTTRACE(STREAM_TRACE, "BlackHole... Converter Created\n");    HTBaseConverterStreamInstance.isa = &HTBlackHoleConverterClass;    return &HTBaseConverterStreamInstance;}/*	HTThroughLine**	-------------**** This function is a dummy function that returns the same output stream** as given as a parameter. Henrik 01/03-94*/PUBLIC HTStream* HTThroughLine (HTRequest *	request,				void *		param,				HTFormat	input_format,				HTFormat	output_format,				HTStream *	output_stream){    return output_stream;}/*	HTSaveConverter**** This function is a place holder for a save to local file converter*/PUBLIC HTStream * HTSaveConverter (HTRequest *	request,				   void *	param,				   HTFormat	input_format,				   HTFormat	output_format,				   HTStream *	output_stream){    return HTBlackHole();}PUBLIC HTStream * HTIdentityCoding (HTRequest *	request,				    void *	param,				    HTEncoding	coding,				    HTStream *	output_stream){    return output_stream;}/***	For all `accept lists' there is a local list and a global list. The**	local list is a part of the request structure and the global list is**	internal to the HTFormat module. The global lists can be used when**	specifying accept lists for ALL requests and the local list can be **	used to add specific accept headers to the request.*//* ------------------------------------------------------------------------- *//* 	  			CONTENT TYPES				     *//* ------------------------------------------------------------------------- */PUBLIC void HTPresentation_setConverter (HTConverter * pconv){    presentation_converter = pconv;}PUBLIC HTConverter * HTPresentation_converter (void){    return presentation_converter;}/*	Define a presentation system command for a content-type**	-------------------------------------------------------** INPUT:**	conversions:	The list of conveters and presenters**	representation:	the MIME-style format name**	command:	the MAILCAP-style command template**	quality:	A degradation faction [0..1]**	maxbytes:	A limit on the length acceptable as input (0 infinite)**	maxsecs:	A limit on the time user will wait (0 for infinity)*/PUBLIC void HTPresentation_add (HTList *	conversions,				const char *	representation,				const char *	command,				const char *	test_command,				double		quality,				double		secs, 				double		secs_per_byte){    HTPresentation * pres;    if (presentation_converter) {	if ((pres = (HTPresentation  *) HT_CALLOC(1,sizeof(HTPresentation))) == NULL)	    HT_OUTOFMEM("HTSetPresentation");        pres->rep = HTAtom_for(representation);	pres->rep_out = WWW_PRESENT;		/* Fixed for now ... :-) */	pres->converter = presentation_converter;	pres->quality = quality;	pres->secs = secs;	pres->secs_per_byte = secs_per_byte;	pres->rep = HTAtom_for(representation);	pres->command = NULL;	StrAllocCopy(pres->command, command);	pres->test_command = NULL;	StrAllocCopy(pres->test_command, test_command);	HTTRACE(CORE_TRACE, "Presentation Adding `%s\' with quality %.2f\n" _ 		    command _ quality);	HTList_addObject(conversions, pres);    }}PUBLIC void HTPresentation_deleteAll (HTList * list){    if (list) {	HTList *cur = list;	HTPresentation *pres;	while ((pres = (HTPresentation*) HTList_nextObject(cur))) {	    HT_FREE(pres->command);	    HT_FREE(pres);	}	HTList_delete(list);    }}/*	Define a built-in function for a content-type**	---------------------------------------------*/PUBLIC void HTConversion_add (HTList *		conversions,			      const char *	representation_in,			      const char *	representation_out,			      HTConverter *	converter,			      double		quality,			      double		secs, 			      double		secs_per_byte){    HTPresentation * pres;    if ((pres = (HTPresentation*) HT_CALLOC(1,sizeof(HTPresentation))) == NULL)        HT_OUTOFMEM("HTSetPresentation");    pres->rep = HTAtom_for(representation_in);    pres->rep_out = HTAtom_for(representation_out);    pres->converter = converter;    pres->command = NULL;		/* Fixed */    pres->test_command = NULL;    pres->quality = quality;    pres->secs = secs;    pres->secs_per_byte = secs_per_byte;    HTTRACE(CORE_TRACE, "Conversions. Adding %p with quality %.2f\n" _ 		converter _ quality);    HTList_addObject(conversions, pres);}PUBLIC void HTConversion_deleteAll (HTList * list){    HTPresentation_deleteAll(list);}/* ------------------------------------------------------------------------- *//*		CONTENT ENCODING AND CONTENT TRANSFER ENCODING 		     *//* ------------------------------------------------------------------------- */PUBLIC BOOL HTCoding_add (HTList * 	list,			  const char *	encoding,			  HTCoder *	encoder,			  HTCoder *	decoder,			  double	quality){    if (list && encoding && (encoder || decoder)) {	HTCoding * me;	if ((me = (HTCoding *) HT_CALLOC(1, sizeof(HTCoding))) == NULL)	    HT_OUTOFMEM("HTCoding_add");	me->encoding = HTAtom_for(encoding);	me->encoder = encoder;	me->decoder = decoder;	me->quality = quality;	HTTRACE(CORE_TRACE, "Codings..... Adding %s with quality %.2f\n" _ 		    encoding _ quality);	return HTList_addObject(list, (void *) me);    }    HTTRACE(CORE_TRACE, "Codings..... Bad argument\n");    return NO;}PUBLIC void HTCoding_deleteAll (HTList * list){    if (list) {	HTList * cur = list;	HTCoding * pres;	while ((pres = (HTCoding *) HTList_nextObject(cur)))	    HT_FREE(pres);	HTList_delete(list);    }}PUBLIC const char * HTCoding_name (HTCoding * me){    return me ? HTAtom_name(me->encoding) : NULL;}PUBLIC double HTCoding_quality (HTCoding * me){    return me ? me->quality : 0.0;}/* ------------------------------------------------------------------------- *//* 	  			CONTENT LANGUAGE			     *//* ------------------------------------------------------------------------- */PUBLIC void HTLanguage_add (HTList *		list,			    const char *	lang,			    double		quality){    HTAcceptNode * node;    if (!list || !lang || !*lang)  {	HTTRACE(CORE_TRACE, "Languages... Bad argument\n");	return;    }    if ((node = (HTAcceptNode *) HT_CALLOC(1, sizeof(HTAcceptNode))) == NULL)        HT_OUTOFMEM("HTAcceptLanguage");    HTList_addObject(list, (void*)node);    node->atom = HTAtom_for(lang);    node->quality = quality;}PUBLIC void HTLanguage_deleteAll (HTList * list){    if (list) {	HTList *cur = list;	HTAcceptNode *pres;	while ((pres = (HTAcceptNode *) HTList_nextObject(cur))) {	    HT_FREE(pres);	}	HTList_delete(list);    }}/* ------------------------------------------------------------------------- *//* 	  			CONTENT CHARSET				     *//* ------------------------------------------------------------------------- */PUBLIC void HTCharset_add (HTList *		list,			   const char *		charset,			   double		quality){    HTAcceptNode * node;    if (!list || !charset || !*charset)  {	HTTRACE(CORE_TRACE, "Charset..... Bad argument\n");	return;    }    if ((node = (HTAcceptNode *) HT_CALLOC(1, sizeof(HTAcceptNode))) == NULL)        HT_OUTOFMEM("HTAcceptCharsetuage");    HTList_addObject(list, (void*)node);    node->atom = HTAtom_for(charset);    node->quality = quality;}PUBLIC void HTCharset_deleteAll (HTList * list){    if (list) {	HTList *cur = list;	HTAcceptNode *pres;	while ((pres = (HTAcceptNode *) HTList_nextObject(cur))) {	    HT_FREE(pres);	}	HTList_delete(list);    }}/* ------------------------------------------------------------------------- *//* 			GLOBAL LIST OF CONVERTERS ETC.			     *//* ------------------------------------------------------------------------- *//***	Global Accept Format Types Conversions**	list can be NULL*/PUBLIC void HTFormat_setConversion (HTList * list){    HTConversions = list;}PUBLIC HTList * HTFormat_conversion (void){    return HTConversions;}PUBLIC void HTFormat_addConversion (const char *	input_format,				    const char *	output_format,				    HTConverter *	converter,				    double		quality,				    double		secs, 				    double		secs_per_byte){    if (!HTConversions) HTConversions = HTList_new();    HTConversion_add(HTConversions, input_format, output_format,		     converter, quality, secs, secs_per_byte);}/***	Global list of Content Encodings**	list can be NULL*/PUBLIC void HTFormat_setContentCoding (HTList *list){    HTContentCoders = list;}PUBLIC HTList * HTFormat_contentCoding (void){    return HTContentCoders;}PUBLIC BOOL HTFormat_addCoding ( char *		encoding,				 HTCoder *	encoder,				 HTCoder *	decoder,				 double		quality){    if (!HTContentCoders) HTContentCoders = HTList_new();    return HTCoding_add(HTContentCoders, encoding, encoder, decoder, quality);}/***	Global list of Content Transfer Encodings**	list can be NULL*/PUBLIC void HTFormat_setTransferCoding (HTList *list){    HTTransferCoders = list;}PUBLIC HTList * HTFormat_transferCoding (void){    return HTTransferCoders;}PUBLIC BOOL HTFormat_addTransferCoding ( char *		encoding,					 HTCoder *	encoder,					 HTCoder *	decoder,					 double		quality){    if (!HTTransferCoders) HTTransferCoders = HTList_new();    return HTCoding_add(HTTransferCoders, encoding, encoder, decoder, quality);}/***	Global Accept Languages**	list can be NULL*/PUBLIC void HTFormat_setLanguage (HTList *list){    HTLanguages = list;}PUBLIC HTList * HTFormat_language (void){    return HTLanguages;}/***	Global Accept Charsets**	list can be NULL*/PUBLIC void HTFormat_setCharset (HTList *list){

⌨️ 快捷键说明

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