?? htformat.c
字號:
/* 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){
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -