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

📄 mbfilter.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				mbfl_convert_filter_devcat(pe->block_filter, &pe->tmpdev);				mbfl_memory_device_reset(&pe->tmpdev);				(*pe->block_filter->filter_function)(c, pe->block_filter);				pe->status1 = 11;			}		}		break;	}	return c;}mbfl_string *mime_header_encoder_result(struct mime_header_encoder_data *pe, mbfl_string *result){	if (pe->status1 >= 10) {		(*pe->conv2_filter->filter_flush)(pe->conv2_filter);		(*pe->encod_filter->filter_flush)(pe->encod_filter);		mbfl_memory_device_strncat(&pe->outdev, "\x3f\x3d", 2);		/* ?= */	} else if (pe->tmpdev.pos > 0) {		if (pe->outdev.pos > 0) {			if ((pe->outdev.pos - pe->linehead + pe->tmpdev.pos) > 74) {				mbfl_memory_device_strncat(&pe->outdev, pe->lwsp, pe->lwsplen);			} else {				mbfl_memory_device_output(0x20, &pe->outdev);			}		}		mbfl_memory_device_devcat(&pe->outdev, &pe->tmpdev);	}	mbfl_memory_device_reset(&pe->tmpdev);	pe->prevpos = 0;	pe->linehead = 0;	pe->status1 = 0;	pe->status2 = 0;	return mbfl_memory_device_result(&pe->outdev, result);}struct mime_header_encoder_data*mime_header_encoder_new(    enum mbfl_no_encoding incode,    enum mbfl_no_encoding outcode,    enum mbfl_no_encoding transenc){	int n;	const char *s;	const mbfl_encoding *outencoding;	struct mime_header_encoder_data *pe;	/* get output encoding and check MIME charset name */	outencoding = mbfl_no2encoding(outcode);	if (outencoding == NULL || outencoding->mime_name == NULL || outencoding->mime_name[0] == '\0') {		return NULL;	}	pe = (struct mime_header_encoder_data*)mbfl_malloc(sizeof(struct mime_header_encoder_data));	if (pe == NULL) {		return NULL;	}	mbfl_memory_device_init(&pe->outdev, 0, 0);	mbfl_memory_device_init(&pe->tmpdev, 0, 0);	pe->prevpos = 0;	pe->linehead = 0;	pe->firstindent = 0;	pe->status1 = 0;	pe->status2 = 0;	/* make the encoding description string  exp. "=?ISO-2022-JP?B?" */	n = 0;	pe->encname[n++] = 0x3d;	pe->encname[n++] = 0x3f;	s = outencoding->mime_name;	while (*s) {		pe->encname[n++] = *s++;	}	pe->encname[n++] = 0x3f;	if (transenc == mbfl_no_encoding_qprint) {		pe->encname[n++] = 0x51;	} else {		pe->encname[n++] = 0x42;		transenc = mbfl_no_encoding_base64;	}	pe->encname[n++] = 0x3f;	pe->encname[n] = '\0';	pe->encnamelen = n;	n = 0;	pe->lwsp[n++] = 0x0d;	pe->lwsp[n++] = 0x0a;	pe->lwsp[n++] = 0x20;	pe->lwsp[n] = '\0';	pe->lwsplen = n;	/* transfer encode filter */	pe->encod_filter = mbfl_convert_filter_new(outcode, transenc, mbfl_memory_device_output, 0, &(pe->outdev));	pe->encod_filter_backup = mbfl_convert_filter_new(outcode, transenc, mbfl_memory_device_output, 0, &(pe->outdev));	/* Output code filter */	pe->conv2_filter = mbfl_convert_filter_new(mbfl_no_encoding_wchar, outcode, mbfl_filter_output_pipe, 0, pe->encod_filter);	pe->conv2_filter_backup = mbfl_convert_filter_new(mbfl_no_encoding_wchar, outcode, mbfl_filter_output_pipe, 0, pe->encod_filter);	/* encoded block filter */	pe->block_filter = mbfl_convert_filter_new(mbfl_no_encoding_wchar, mbfl_no_encoding_wchar, mime_header_encoder_block_collector, 0, pe);	/* Input code filter */	pe->conv1_filter = mbfl_convert_filter_new(incode, mbfl_no_encoding_wchar, mime_header_encoder_collector, 0, pe);	if (pe->encod_filter == NULL ||	    pe->encod_filter_backup == NULL ||	    pe->conv2_filter == NULL ||	    pe->conv2_filter_backup == NULL ||	    pe->conv1_filter == NULL) {		mime_header_encoder_delete(pe);		return NULL;	}	if (transenc == mbfl_no_encoding_qprint) {		pe->encod_filter->status |= MBFL_QPRINT_STS_MIME_HEADER;		pe->encod_filter_backup->status |= MBFL_QPRINT_STS_MIME_HEADER;	} else {		pe->encod_filter->status |= MBFL_BASE64_STS_MIME_HEADER;		pe->encod_filter_backup->status |= MBFL_BASE64_STS_MIME_HEADER;	}	return pe;}voidmime_header_encoder_delete(struct mime_header_encoder_data *pe){	if (pe) {		mbfl_convert_filter_delete(pe->conv1_filter);		mbfl_convert_filter_delete(pe->block_filter);		mbfl_convert_filter_delete(pe->conv2_filter);		mbfl_convert_filter_delete(pe->conv2_filter_backup);		mbfl_convert_filter_delete(pe->encod_filter);		mbfl_convert_filter_delete(pe->encod_filter_backup);		mbfl_memory_device_clear(&pe->outdev);		mbfl_memory_device_clear(&pe->tmpdev);		mbfl_free((void*)pe);	}}intmime_header_encoder_feed(int c, struct mime_header_encoder_data *pe){	return (*pe->conv1_filter->filter_function)(c, pe->conv1_filter);}mbfl_string *mbfl_mime_header_encode(    mbfl_string *string,    mbfl_string *result,    enum mbfl_no_encoding outcode,    enum mbfl_no_encoding encoding,    const char *linefeed,    int indent){	int n;	unsigned char *p;	struct mime_header_encoder_data *pe;	mbfl_string_init(result);	result->no_language = string->no_language;	result->no_encoding = mbfl_no_encoding_ascii;	pe = mime_header_encoder_new(string->no_encoding, outcode, encoding);	if (pe == NULL) {		return NULL;	}	if (linefeed != NULL) {		n = 0;		while (*linefeed && n < 8) {			pe->lwsp[n++] = *linefeed++;		}		pe->lwsp[n++] = 0x20;		pe->lwsp[n] = '\0';		pe->lwsplen = n;	}	if (indent > 0 && indent < 74) {		pe->firstindent = indent;	}	n = string->len;	p = string->val;	while (n > 0) {		(*pe->conv1_filter->filter_function)(*p++, pe->conv1_filter);		n--;	}	result = mime_header_encoder_result(pe, result);	mime_header_encoder_delete(pe);	return result;}/* *  MIME header decode */struct mime_header_decoder_data {	mbfl_convert_filter *deco_filter;	mbfl_convert_filter *conv1_filter;	mbfl_convert_filter *conv2_filter;	mbfl_memory_device outdev;	mbfl_memory_device tmpdev;	int cspos;	int status;	enum mbfl_no_encoding encoding;	enum mbfl_no_encoding incode;	enum mbfl_no_encoding outcode;};static intmime_header_decoder_collector(int c, void* data){	const mbfl_encoding *encoding;	struct mime_header_decoder_data *pd = (struct mime_header_decoder_data*)data;	switch (pd->status) {	case 1:		if (c == 0x3f) {		/* ? */			mbfl_memory_device_output(c, &pd->tmpdev);			pd->cspos = pd->tmpdev.pos;			pd->status = 2;		} else {			mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);			mbfl_memory_device_reset(&pd->tmpdev);			if (c == 0x3d) {		/* = */				mbfl_memory_device_output(c, &pd->tmpdev);			} else if (c == 0x0d || c == 0x0a) {	/* CR or LF */				pd->status = 9;			} else {				(*pd->conv1_filter->filter_function)(c, pd->conv1_filter);				pd->status = 0;			}		}		break;	case 2:		/* store charset string */		if (c == 0x3f) {		/* ? */			/* identify charset */			mbfl_memory_device_output('\0', &pd->tmpdev);			encoding = mbfl_name2encoding((const char *)&pd->tmpdev.buffer[pd->cspos]);			if (encoding != NULL) {				pd->incode = encoding->no_encoding;				pd->status = 3;			}			mbfl_memory_device_unput(&pd->tmpdev);			mbfl_memory_device_output(c, &pd->tmpdev);		} else {			mbfl_memory_device_output(c, &pd->tmpdev);			if (pd->tmpdev.pos > 100) {		/* too long charset string */				pd->status = 0;			} else if (c == 0x0d || c == 0x0a) {	/* CR or LF */				mbfl_memory_device_unput(&pd->tmpdev);				pd->status = 9;			}			if (pd->status != 2) {				mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);				mbfl_memory_device_reset(&pd->tmpdev);			}		}		break;	case 3:		/* identify encoding */		mbfl_memory_device_output(c, &pd->tmpdev);		if (c == 0x42 || c == 0x62) {		/* 'B' or 'b' */			pd->encoding = mbfl_no_encoding_base64;			pd->status = 4;		} else if (c == 0x51 || c == 0x71) {	/* 'Q' or 'q' */			pd->encoding = mbfl_no_encoding_qprint;			pd->status = 4;		} else {			if (c == 0x0d || c == 0x0a) {	/* CR or LF */				mbfl_memory_device_unput(&pd->tmpdev);				pd->status = 9;			} else {				pd->status = 0;			}			mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);			mbfl_memory_device_reset(&pd->tmpdev);		}		break;	case 4:		/* reset filter */		mbfl_memory_device_output(c, &pd->tmpdev);		if (c == 0x3f) {		/* ? */			/* charset convert filter */			mbfl_convert_filter_reset(pd->conv1_filter, pd->incode, mbfl_no_encoding_wchar);			/* decode filter */			mbfl_convert_filter_reset(pd->deco_filter, pd->encoding, mbfl_no_encoding_8bit);			pd->status = 5;		} else {			if (c == 0x0d || c == 0x0a) {	/* CR or LF */				mbfl_memory_device_unput(&pd->tmpdev);				pd->status = 9;			} else {				pd->status = 0;			}			mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);		}		mbfl_memory_device_reset(&pd->tmpdev);		break;	case 5:		/* encoded block */		if (c == 0x3f) {		/* ? */			pd->status = 6;		} else {			(*pd->deco_filter->filter_function)(c, pd->deco_filter);		}		break;	case 6:		/* check end position */		if (c == 0x3d) {		/* = */			/* flush and reset filter */			(*pd->deco_filter->filter_flush)(pd->deco_filter);			(*pd->conv1_filter->filter_flush)(pd->conv1_filter);			mbfl_convert_filter_reset(pd->conv1_filter, mbfl_no_encoding_ascii, mbfl_no_encoding_wchar);			pd->status = 7;		} else {			(*pd->deco_filter->filter_function)(0x3f, pd->deco_filter);			if (c != 0x3f) {		/* ? */				(*pd->deco_filter->filter_function)(c, pd->deco_filter);				pd->status = 5;			}		}		break;	case 7:		/* after encoded block */		if (c == 0x0d || c == 0x0a) {	/* CR LF */			pd->status = 8;		} else {			mbfl_memory_device_output(c, &pd->tmpdev);			if (c == 0x3d) {		/* = */				pd->status = 1;			} else if (c != 0x20 && c != 0x09) {		/* not space */				mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);				mbfl_memory_device_reset(&pd->tmpdev);				pd->status = 0;			}		}		break;	case 8:		/* folding */	case 9:		/* folding */		if (c != 0x0d && c != 0x0a && c != 0x20 && c != 0x09) {			if (c == 0x3d) {		/* = */				if (pd->status == 8) {					mbfl_memory_device_output(0x20, &pd->tmpdev);	/* SPACE */				} else {					(*pd->conv1_filter->filter_function)(0x20, pd->conv1_filter);				}				mbfl_memory_device_output(c, &pd->tmpdev);				pd->status = 1;			} else {				mbfl_memory_device_output(0x20, &pd->tmpdev);				mbfl_memory_device_output(c, &pd->tmpdev);				mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);				mbfl_memory_device_reset(&pd->tmpdev);				pd->status = 0;			}		}		break;	default:		/* non encoded block */		if (c == 0x0d || c == 0x0a) {	/* CR LF */			pd->status = 9;		} else if (c == 0x3d) {		/* = */			mbfl_memory_device_output(c, &pd->tmpdev);			pd->status = 1;		} else {			(*pd->conv1_filter->filter_function)(c, pd->conv1_filter);		}		break;	}	return c;}mbfl_string *mime_header_decoder_result(struct mime_header_decoder_data *pd, mbfl_string *result){	switch (pd->status) {	case 1:	case 2:	case 3:	case 4:	case 7:	case 8:	case 9:		mbfl_convert_filter_devcat(pd->conv1_filter, &pd->tmpdev);		break;	case 5:	case 6:		(*pd->deco_filter->filter_flush)(pd->deco_filter);		(*pd->conv1_filter->filter_flush)(pd->conv1_filter);		break;	}	(*pd->conv2_filter->filter_flush)(pd->conv2_filter);	mbfl_memory_device_reset(&pd->tmpdev);	pd->status = 0;	return mbfl_memory_device_result(&pd->outdev, result);}struct mime_header_decoder_data*mime_header_decoder_new(enum mbfl_no_encoding outcode){	struct mime_header_decoder_data *pd;	pd = (struct mime_header_decoder_data*)mbfl_malloc(sizeof(struct mime_header_decoder_data));	if (pd == NULL) {		return NULL;	}	mbfl_memory_device_init(&pd->outdev, 0, 0);	mbfl_memory_device_init(&pd->tmpdev, 0, 0);	pd->cspos = 0;	pd->status = 0;	pd->encoding = mbfl_no_encoding_pass;	pd->incode = mbfl_no_encoding_ascii;	pd->outcode = outcode;	/* charset convert filter */	pd->conv2_filter = mbfl_convert_filter_new(mbfl_no_encoding_wchar, pd->outcode, mbfl_memory_device_output, 0, &pd->outdev);	pd->conv1_filter = mbfl_convert_filter_new(pd->incode, mbfl_no_encoding_wchar, mbfl_filter_output_pipe, 0, pd->conv2_filter);	/* decode filter */	pd->deco_filter = mbfl_convert_filter_new(pd->encoding, mbfl_no_encoding_8bit, mbfl_filter_output_pipe, 0, pd->conv1_filter);	if (pd->conv1_filter == NULL || pd->conv2_filter == NULL || pd->deco_filter == NULL) {		mime_header_decoder_delete(pd);		return NULL;	}	return pd;}voidmime_header_decoder_delete(struct mime_header_decoder_data *pd){	if (pd) {		mbfl_convert_filter_delete(pd->conv2_filter);		mbfl_convert_filter_delete(pd->conv1_filter);		mbfl_convert_filter_delete(pd->deco_filter);		mbfl_memory_device_clear(&pd->outdev);		mbfl_memory_device_clear(&pd->tmpdev);		mbfl_free((void*)pd);	}}intmime_header_decoder_feed(int c, struct mime_header_decoder_data *pd){	return mime_header_decoder_collector(c, pd);}mbfl_string *mbfl_mime_header_decode(    mbfl_string *string,    mbfl_string *result,    enum mbfl_no_encoding outcode){	int n;	unsigned char *p;	struct mime_header_decoder_data *pd;	mbfl_string_init(result);	result->no_language = string->no_language;	result->no_encoding = outcode;	pd = mime_header_decoder_new(outcode);	if (pd == NULL) {		return NULL;	}	/* feed data */	n = string->len;	p = string->val;	while (n > 0) {		mime_header_decoder_collector(*p++, pd);		n--;	}	result = mime_header_decoder_result(pd, result);	mime_header_decoder_delete(pd);	return result;}/* *  convert HTML numeric entity */struct collector_htmlnumericentity_data {	mbfl_convert_filter *decoder;	int status;	int cache;	int digit;	int *convmap;	int mapsize;};static intcollector_encode_htmlnumericentity(int c, void *data){	struct collector_htmlnumericentity_data *pc = (struct collector_htmlnumericentity_data *)data;	int f, n, s, r, d, size, *mapelm;	size = pc->mapsize;	f = 0;	n = 0;	while (n < size) {		mapelm = &(pc->convmap[n*4]);		if (c >= mapelm[0] && c <= mapelm[1]) {			s = (c + mapelm[2]) & mapelm[3];			if (s >= 0) {				(*pc->decoder->filter_function)(0x26, pc->decoder);	/* '&' */				(*pc->

⌨️ 快捷键说明

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