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

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

?? mimetype.cpp

?? PGP—Pretty Good Privacy
?? CPP
字號:
/*
 *  Functions to manage emsMIMEtype structures
 *  for use with Eudora EMS API under MS Windows.
 *
 *  Filename: mimetype.cpp
 *
 *  Last Edited: Wednesday, April 2, 1996
 *
 *  Author: Scott Manjourides
 *
 *  Copyright 1995, 1996 QUALCOMM Inc.
 *
 *  Send comments and questions to <emsapi-info@qualcomm.com>
 */

#include <windows.h>
#include <string.h>
#include <malloc.h>

#include "ems-win.h"
#include "mimetype.h"
#include "rfc822.h"

/* ========================================================================= */

#define safefree(p) { if (p) { free(p); p = NULL; } }

/* ========================================================================= */

static void free_param_type(emsMIMEParamP paramPtr);

/* ========================================================================= */

/*
 *  Create an emsMIMEtype structure to hold MIME information. Only the
 *  type and subtype are set here, use add_mime_parameter() to add
 *  any name/value parameter pairs.
 *
 *  NOTE: All input strings are COPIED before permanent use. The user
 *        of this function is responsible for calling free_mime_type()
 *        on returned structure.
 *
 *  Args:
 *   mime_type    [IN] the main MIME type: e.g., text, application, image
 *   sub_type     [IN] the sub type: e.g., plain, octet-stream, jpeg
 *   mime_version [IN] the MIME verion number, if NULL will default to "1.0"
 *
 *  Returns: Pointer to the created emsMIMEtype structure, NULL if error.
 */
emsMIMEtypeP make_mime_type(const char *mime_type, const char *sub_type, 
							const char *mime_version)
{
	emsMIMEtypeP mimePtr = NULL;

	mimePtr = (emsMIMEtypeP) malloc(sizeof(emsMIMEtype));

	if ((mimePtr) && (mime_type) && (sub_type))
	{
		mimePtr->type = strdup(mime_type);
		mimePtr->subType = strdup(sub_type);

		if (mime_version)
			mimePtr->version = strdup(mime_version);
		else
			mimePtr->version = strdup("1.0");

		mimePtr->size = sizeof(emsMIMEtype);
		mimePtr->params = NULL;
		mimePtr->contentDisp = NULL;
		mimePtr->contentParams = NULL;

		if ((mimePtr->type) && (mimePtr->subType) && (mimePtr->version))
		{
			return mimePtr;
		}
	}

	// If we get here then something went wrong
	// Do complete cleanup and return NULL

	free_mime_type(mimePtr);

	return (NULL); // ERROR
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Create an emsMIMEtype structure to hold MIME information. Structure is
 *  initialized to values provided in RFC822 content-type header line. This
 *  includes all parameter name-value pairs.
 *   
 *  NOTE: The user of this function is responsible for calling
 *        free_mime_type() on returned structure.
 *
 *  Args:
 *   content_type [IN] The RFC822 content-type string to parse
 *
 *  Returns: Pointer to the created emsMIMEtype structure, NULL if error.
 */
emsMIMEtypeP parse_make_mime_type(const char *content_type)
{
	const char *kPrefixStr = "Content-Type:";
	const unsigned int kPrefixStrLen = strlen(kPrefixStr);

	if (strnicmp(content_type, kPrefixStr, kPrefixStrLen) != 0)
		return NULL;

	char *cp = (char *) content_type + kPrefixStrLen;
	char *mime_type = NULL, *mime_subtype = NULL;

	mime_type = rfc822_extract_token(&cp);

	if ((strlen(mime_type) > 0) && ((*cp++) == '/'))
	{
		mime_subtype = rfc822_extract_token(&cp);

		if (strlen(mime_subtype) > 0)
		{
			// We have a type/subtype, so create emsMIMEtype structure
			emsMIMEtypeP mimePtr = make_mime_type(mime_type, mime_subtype, 
													NULL);

			safefree(mime_type);
			safefree(mime_subtype);

			if (mimePtr)
			{
				char *name = NULL, *value = NULL;

				do {

					if ((*cp++) != ';') // Skip semi-colon
						break;
				
					if (!(name = rfc822_extract_token(&cp)))
						break;

					if ((*cp++) != '=') // Skip equals
						break;

					if (!(value = rfc822_extract_token(&cp)))
						break;

					if ((strlen(name) > 0) && (strlen(value) > 0))
						add_mime_parameter(mimePtr, name, value);

					safefree(name);
					safefree(value);
				} while (*cp);

				safefree(name);
				safefree(value);

				return mimePtr;
			}
		}
	}

	// If we get here then something went wrong
	// Do complete cleanup

	safefree(mime_type);
	safefree(mime_subtype);

	return (NULL); // ERROR
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Add a parameter to an existing emsMIMEtype structure. This structure
 *  should be created using make_mime_type().
 *
 *  NOTE: All input strings are COPIED before permanent use.
 *
 * Args:
 *   mimePtr [IN] Pointer to the emsMIMEtype structure to be added too
 *   name    [IN] Name of the parameter
 *   value   [IN] Value of the parameter
 *   
 *  Returns: Boolean (TRUE = success, FALSE = failure)
 */
int add_mime_parameter(emsMIMEtypeP mimePtr, const char *name, 
					   const char *value)
{
	if (!mimePtr)
		return (FALSE);
	
	emsMIMEParamP paramPtr = (emsMIMEParamP) malloc (sizeof(emsMIMEparam));

	if (paramPtr)
	{
		paramPtr->size = sizeof(emsMIMEparam);
		paramPtr->name = strdup(name);
		paramPtr->value = strdup(value);
		paramPtr->next = NULL;

		if ((paramPtr->name) && (paramPtr->value))
		{
			emsMIMEParamP *paramEnd = &(mimePtr->params);

		    while (*paramEnd)
				paramEnd = &((*paramEnd)->next);

			*paramEnd = paramPtr;

			return (TRUE);
		}
	}

	// If we get here then something went wrong
	// Do complete cleanup

	free_param_type(paramPtr);
	return (FALSE);
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Free an emsMIMEtype structure, including all strings and parameters.
 *
 *  Args:
 *   mimePtr [IN] Pointer to the emsMIMEtype structure to be freed
 *
 *  No return value.
 */
void free_mime_type(emsMIMEtypeP mimePtr)
{
	if (mimePtr)
	{
		safefree(mimePtr->version);
		safefree(mimePtr->type);
		safefree(mimePtr->subType);
		
		free_param_type(mimePtr->params);

		safefree(mimePtr->contentDisp);
		free_param_type(mimePtr->contentParams);

		safefree(mimePtr);
	}
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Convert an emsMIMEtype structure to a Content-Type header field line
 *  in the format specified by RFC 882.
 *
 *  NOTE: The user of this function is responsible for freeing the
 *        returned string.
 *
 *  Args:
 *   mimePtr [IN] Pointer to the emsMIMEtype structure
 *
 *  Returns: String containing header field; dynamically allocated.
 */
char *string_mime_type(emsMIMEtypeP mimePtr) 
{
	const char *kPrefixStr          = "Content-Type: ";
	const char *kParamSepStr        = ";\r\n  ";
	const char *kTypeSubtypeSepStr  = "/";
	const char *kAttValueSepStr     = "=";

	// Must have a valid mime structure
	if (!mimePtr)
		return NULL;

	// Both TYPE and SUBTYPE are required by RFC822
	if ((!mimePtr->type) || (!mimePtr->subType))
		return NULL;

	// Calculate the length of the header string
	unsigned int hLen = 0;

	hLen += strlen(kPrefixStr);
	hLen += rfc822_quoted_strlen(mimePtr->type);
	hLen += strlen(kTypeSubtypeSepStr);
	hLen += rfc822_quoted_strlen(mimePtr->subType);

	emsMIMEParamP paramPtr = mimePtr->params;

	while (paramPtr)
	{
		hLen += strlen(kParamSepStr);
		hLen += rfc822_quoted_strlen(paramPtr->name);
		hLen += strlen(kAttValueSepStr);
		hLen += rfc822_quoted_strlen(paramPtr->value);

		paramPtr = paramPtr->next;
	}

	// Allocate space for the header line
	char *hStr = (char *) malloc(hLen + 1);
	
	if (!hStr)
		return NULL;

	// Build the header line
	char *cp = hStr;

	cp = strchr(strcpy(cp, kPrefixStr), '\0');
	cp = rfc822_quote_strcpy(cp, mimePtr->type);
	cp = strchr(strcpy(cp, kTypeSubtypeSepStr), '\0');
	cp = rfc822_quote_strcpy(cp, mimePtr->subType);

	paramPtr = mimePtr->params;
	while (paramPtr)
	{
		cp = strchr(strcpy(cp, kParamSepStr), '\0');
		cp = rfc822_quote_strcpy(cp, paramPtr->name);
		cp = strchr(strcpy(cp, kAttValueSepStr), '\0');
		cp = rfc822_quote_strcpy(cp, paramPtr->value);

		paramPtr = paramPtr->next;
	}

	// Return the header line
	return (hStr);
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Pick out a specific parameter name-value pair from an emsMIMEtype
 *  structure. The match is case sensitive.
 *
 *  NOTE: The user of this function should NOT alter the returned string
 *        in any way -- it should be considered READ-ONLY.
 *
 *  Args:
 *   mimePtr   [IN] Pointer to the emsMIMEtype structure
 *   paramName [IN] Name of parameter to look for
 *
 *  Returns: String of the associated value or NULL if no match is found
 */
const char *get_mime_parameter(emsMIMEtypeP mimePtr, const char *paramName)
{
	if (!mimePtr)
		return NULL;

	emsMIMEParamP paramPtr = mimePtr->params;

	while (paramPtr)
	{
		if (strcmp(paramPtr->name, paramName) == 0)
			return (paramPtr->value);

		paramPtr = paramPtr->next;
	}

    return (NULL);
}				

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Remove a parameter from an existing emsMIMEtype structure. This structure
 *  should be created using make_mime_type().
 *
 *  NOTE: All input strings are COPIED before permanent use.
 *
 * Args:
 *   mimePtr [IN] Pointer to the emsMIMEtype structure to altered
 *   name    [IN] Name of the parameter to be removed
 *   
 *  Returns: Boolean (TRUE = success, FALSE = failure)
 */
int remove_mime_parameter(emsMIMEtypeP mimePtr, const char *name)
{
	if (!mimePtr)
		return (FALSE);

	emsMIMEParamP paramPtr = mimePtr->params, prevParamPtr = NULL;

	/* Find the parameter */
	while (paramPtr)
	{
		if (strcmp(paramPtr->name, name) == 0)
			break;

		prevParamPtr = paramPtr;
		paramPtr = paramPtr->next;
	}

	if (!paramPtr)
	    return (FALSE); /* Not found */

	if (prevParamPtr == NULL) /* Removing first in list */
		mimePtr->params = paramPtr->next;
	else
		prevParamPtr->next = paramPtr->next;

	paramPtr->next = NULL;
	free_param_type(paramPtr);

	return (TRUE);
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

/*
 *  Check for a matching MIME type/subtype. If either type or subtype is
 *  NULL, then it won't be checked. If both are NULL, then TRUE is always
 *  returned.
 *
 *  Args:
 *   mimePtr   [IN] Pointer to the emsMIMEtype structure
 *   mime_type [IN] The major MIME type to check
 *   sub_type  [IN] The MIME subtype to check
 *  
 *  Returns: Boolean (TRUE if the MIME type matches, FALSE if not)
 */
int match_mime_type(emsMIMEtypeP mimePtr, const char *mime_type,
					const char *sub_type)
{
	if (!mimePtr)
		return (FALSE);

	return (
			((mime_type == NULL) || (stricmp(mimePtr->type, mime_type) == 0))
			&&
			((sub_type == NULL) || (stricmp(mimePtr->subType, sub_type) == 0))
		   );
}

/* ========================================================================== */
/*                              LOCAL FUNCTIONS                               */
/* ========================================================================== */

/* Private function used to free the parameter linked-list */
/* static */ void free_param_type(emsMIMEParamP paramPtr)
{
	emsMIMEParamP nextParamPtr;

	while (paramPtr)
	{
		nextParamPtr = paramPtr->next;

		safefree(paramPtr->name);
		safefree(paramPtr->value);
		safefree(paramPtr);

		paramPtr = nextParamPtr;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
youjizz久久| 高清成人在线观看| 亚洲精品成人a在线观看| 26uuu欧美| 日韩精品一区二区三区老鸭窝 | 国产一区二区日韩精品| 亚洲一区二区美女| 中文成人av在线| 精品国产乱码久久| 91精品欧美久久久久久动漫| 波多野结衣在线一区| 激情丁香综合五月| 久久99热狠狠色一区二区| 亚洲国产精品久久人人爱| 亚洲三级在线免费观看| 1024亚洲合集| 亚洲观看高清完整版在线观看| 久久久久久久久久久黄色| 26uuu精品一区二区| 欧美xxxxxxxx| 精品国产免费人成在线观看| 欧美大片在线观看一区二区| 欧美一区二区三区在线电影| 日韩一级二级三级| 精品成人私密视频| 欧美成人aa大片| 国产调教视频一区| 亚洲四区在线观看| 亚洲国产综合91精品麻豆| 日本v片在线高清不卡在线观看| 天天影视涩香欲综合网| 国产一区二区在线观看视频| 不卡视频一二三四| 欧美亚日韩国产aⅴ精品中极品| 欧美探花视频资源| 欧美电视剧在线观看完整版| 国产日本一区二区| 亚洲国产va精品久久久不卡综合| 美日韩一区二区| av福利精品导航| 91麻豆精品国产91久久久| 国产欧美综合在线观看第十页 | 国产精品久久久久婷婷| 亚洲国产视频在线| 国产伦精品一区二区三区视频青涩 | 国产精品一二三四五| 欧美在线小视频| 亚洲精品一区二区精华| 一区二区三区日韩欧美| 精彩视频一区二区三区| 91免费观看视频| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 久久99国产精品久久| 欧美午夜一区二区| 国产欧美一区二区三区在线老狼| 亚洲第一久久影院| 96av麻豆蜜桃一区二区| 久久久一区二区| 美日韩黄色大片| 欧美久久久久久久久| 亚洲欧美在线观看| 国产成人在线影院| 国产亚洲综合av| 国产综合久久久久影院| 日韩欧美www| 美女免费视频一区二区| 欧美一区二区网站| 日韩中文字幕91| 日韩一区二区麻豆国产| 男人的j进女人的j一区| 91精品久久久久久久99蜜桃| 久久精品72免费观看| 制服丝袜日韩国产| 日日摸夜夜添夜夜添精品视频| 欧美日韩大陆在线| 日韩av在线免费观看不卡| 这里只有精品视频在线观看| 蜜臀av一级做a爰片久久| 日韩视频一区二区在线观看| 国产精品亚洲人在线观看| 国产农村妇女精品| 色呦呦一区二区三区| 亚洲福利国产精品| 91精品国产综合久久久久久久| 欧美日韩国产经典色站一区二区三区| 视频在线观看91| 国产三级三级三级精品8ⅰ区| av不卡免费电影| 丝袜脚交一区二区| 日本一区二区视频在线| 色一区在线观看| 久久综合综合久久综合| 亚洲欧美日韩系列| 日韩女优毛片在线| 一本色道久久加勒比精品| 久久精品久久综合| 亚洲美女淫视频| 久久久久88色偷偷免费| 欧美日韩一区三区四区| 成人国产一区二区三区精品| 日韩一区精品视频| 亚洲乱码一区二区三区在线观看| 精品国产乱码久久| 777xxx欧美| 色婷婷综合久久| 国产成人一区在线| 国产麻豆午夜三级精品| 亚洲va欧美va人人爽午夜| 国产精品视频在线看| 国产亚洲欧美在线| 日韩精品一区二区三区视频在线观看| av激情成人网| 91亚洲精品一区二区乱码| 国产成人精品三级| 麻豆视频观看网址久久| 日韩高清电影一区| 天天综合网天天综合色| 亚洲国产毛片aaaaa无费看| 中文字幕精品三区| 国产欧美精品国产国产专区| 久久久久久黄色| 久久久久久久久久看片| 丝袜脚交一区二区| 久久99国产精品久久99| 国产一区二区三区香蕉| 国产成人在线视频网站| 成人精品一区二区三区四区 | 欧洲一区在线电影| 欧美性感一区二区三区| 欧美老女人在线| 日韩午夜激情av| 久久精品在这里| 中文字幕av免费专区久久| 国产精品不卡一区二区三区| 亚洲免费在线观看| 亚洲电影第三页| 国模冰冰炮一区二区| 99精品欧美一区二区三区综合在线| 在线观看一区二区视频| 精品久久久久久久久久久久久久久 | 激情综合色丁香一区二区| 国产成人免费在线视频| 在线观看不卡一区| 久久久99久久精品欧美| 亚洲女性喷水在线观看一区| 亚洲观看高清完整版在线观看| 久久精品国产免费看久久精品| 国产91精品免费| 欧美午夜在线一二页| 久久亚洲精华国产精华液| 亚洲老司机在线| 精品一区二区三区香蕉蜜桃| 97精品超碰一区二区三区| 日韩美女在线视频| 亚洲精品视频在线看| 韩国三级中文字幕hd久久精品| 色视频欧美一区二区三区| 日韩欧美不卡一区| 香港成人在线视频| av亚洲产国偷v产偷v自拍| 久久久久久久久久久久久久久99| 午夜精品福利久久久| 在线观看av一区| 亚洲同性同志一二三专区| 国产在线视频一区二区| 欧美一区二区三区在| 狂野欧美性猛交blacked| 在线观看91精品国产入口| 亚洲视频你懂的| av成人老司机| 国产精品每日更新在线播放网址| 国产成人av电影在线观看| 精品人伦一区二区色婷婷| 秋霞av亚洲一区二区三| 欧美日韩电影在线| 日日夜夜精品视频天天综合网| 欧美综合在线视频| 成人午夜视频福利| 欧美日韩一区二区三区不卡| 亚洲精选视频在线| 色香蕉久久蜜桃| 一区二区三区四区蜜桃| 日本精品视频一区二区三区| 中文字幕一区二区三区av| 99久久久国产精品免费蜜臀| 亚洲四区在线观看| 欧美伊人久久久久久午夜久久久久| 亚洲欧洲成人自拍| 在线观看91精品国产麻豆| 日韩av不卡一区二区| 亚洲精品在线免费播放| 99久久777色| 日韩精品乱码免费| 久久久99久久| 欧美色视频在线观看| 久久精品国产久精国产| 中文字幕制服丝袜成人av| 欧美日韩国产高清一区| 国产jizzjizz一区二区| 亚洲成人av资源|