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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? unmime.c

?? 用于對(duì)收發(fā)郵件編碼進(jìn)行解碼的類文件,功能簡(jiǎn)潔
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
 * MIME mail decoding.
 *
 * This module contains decoding routines for converting
 * quoted-printable data into pure 8-bit data, in MIME
 * formatted messages.
 *
 * By Henrik Storner <storner@image.dk>
 *
 * Configuration file support for fetchmail 4.3.8 by 
 * Frank Damgaard <frda@post3.tele.dk>
 * 
 */

#include "config.h"
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "fetchmail.h"

static unsigned char unhex(unsigned char c)
{
  if ((c >= '0') && (c <= '9'))
    return (c - '0');
  else if ((c >= 'A') && (c <= 'F'))
    return (c - 'A' + 10);
  else if ((c >= 'a') && (c <= 'f'))
    return (c - 'a' + 10);
  else
    return c;
}

static int qp_char(unsigned char c1, unsigned char c2, unsigned char *c_out)
{
  c1 = unhex(c1);
  c2 = unhex(c2);

  if ((c1 > 15) || (c2 > 15)) 
    return 1;
  else {
    *c_out = 16*c1+c2;
    return 0;
  }
}



/*
 * Routines to decode MIME QP-encoded headers, as per RFC 2047.
 */

/* States of the decoding state machine */
#define S_COPY_PLAIN        0	/* Just copy, but watch for the QP flag */
#define S_SKIP_MIMEINIT     1	/* Get the encoding, and skip header */
#define S_COPY_MIME         2	/* Decode a sequence of coded characters */

static const char MIMEHDR_INIT[]  = "=?";	/* Start of coded sequence */
static const char MIMEHDR_END[]   = "?=";	/* End of coded sequence */

void UnMimeHeader(unsigned char *hdr)
{
  /* Decode a buffer containing data encoded according to RFC
   * 2047. This only handles content-transfer-encoding; conversion
   * between character sets is not implemented.  In other words: We
   * assume the charsets used can be displayed by your mail program
   * without problems. 
   */

  /* Note: Decoding is done "in-situ", i.e. without using an
   * additional buffer for temp. storage. This is possible, since the
   * decoded string will always be shorter than the encoded string,
   * due to the en- coding scheme.
   */

  int  state = S_COPY_PLAIN;
  unsigned char *p_in, *p_out, *p;
  unsigned char enc = '\0';		/* initialization pacifies -Wall */
  int  i;

  /* Speed up in case this is not a MIME-encoded header */
  p = strstr(hdr, MIMEHDR_INIT);
  if (p == NULL)
    return;   /* No MIME header */

  /* Loop through the buffer.
   *  p_in : Next char to be processed.
   *  p_out: Where to put the next processed char
   *  enc  : Encoding used (usually, 'q' = quoted-printable)
   */
  for (p_out = p_in = hdr; (*p_in); ) {
    switch (state) {
    case S_COPY_PLAIN:
      p = strstr(p_in, MIMEHDR_INIT);
      if (p == NULL) {
	/* 
	 * No more coded data in buffer, 
         * just move remainder into place. 
	 */
        i = strlen(p_in);   /* How much left */
	memmove(p_out, p_in, i);
	p_in += i; p_out += i;
      }
      else {
	/* MIME header init found at location p */
	if (p > p_in) {
          /* There are some uncoded chars at the beginning. */
          i = (p - p_in);
	  memmove(p_out, p_in, i);
	  p_out += i;
	}
	p_in = (p + 2);
	state = S_SKIP_MIMEINIT;
      }
      break;

    case S_SKIP_MIMEINIT:
      /* Mime type definition: "charset?encoding?" */
      p = strchr(p_in, '?');
      if (p != NULL) {
	/* p_in .. (p-1) holds the charset */

	/* *(p+1) is the transfer encoding, *(p+2) must be a '?' */
	if (*(p+2) == '?') {
	  enc = tolower(*(p+1));
	  p_in = p+3;
	  state = S_COPY_MIME;
	}
	else
	  state = S_COPY_PLAIN;
      }
      else
	state = S_COPY_PLAIN;   /* Invalid data */
      break;

    case S_COPY_MIME:
      p = strstr(p_in, MIMEHDR_END);  /* Find end of coded data */
      if (p == NULL) p = p_in + strlen(p_in);
      for (; (p_in < p); ) {
	/* Decode all encoded data */
	if (enc == 'q') {
	  if (*p_in == '=') {
	    /* Decode one char qp-coded at (p_in+1) and (p_in+2) */
	    if (qp_char(*(p_in+1), *(p_in+2), p_out) == 0)
	      p_in += 3;
	    else {
	      /* Invalid QP data - pass through unchanged. */
	      *p_out = *p_in;
	      p_in++;
	    }
	  }
	  else if (*p_in == '_') {
	    /* 
             * RFC 2047: '_' inside encoded word represents 0x20.
             * NOT a space - always the value 0x20.
             */
	    *p_out = 0x20;
	    p_in++;
	  }
	  else {
	    /* Copy unchanged */
	    *p_out = *p_in;
	    p_in++;
	  }
	  p_out++;
	}
	else if (enc == 'b') {
	  /* Decode base64 encoded data */
	  char delimsave;
	  int decoded_count;

	  delimsave = *p; *p = '\r';
	  decoded_count = from64tobits(p_out, p_in);
	  *p = delimsave;
	  if (decoded_count > 0) 
	    p_out += decoded_count;            
	  p_in = p;
	}
	else {
	  /* Copy unchanged */
	  *p_out = *p_in;
	  p_in++;
	  p_out++;
	}
      }
      if (*p_in)
	p_in += 2;   /* Skip the MIMEHDR_END delimiter */

      /* 
       * We've completed decoding one encoded sequence. But another
       * may follow immediately, in which case whitespace before the
       * new MIMEHDR_INIT delimiter must be discarded.
       * See if that is the case 
       */
      p = strstr(p_in, MIMEHDR_INIT);
      state = S_COPY_PLAIN;
      if (p != NULL) {
	/*
	 * There is more MIME data later on. Is there
         * whitespace  only before the delimiter? 
	 */
        unsigned char *q;
        int  wsp_only = 1;

        for (q=p_in; (wsp_only && (q < p)); q++)
          wsp_only = isspace(*q);

        if (wsp_only) {
	  /* 
	   * Whitespace-only before the MIME delimiter. OK,
           * just advance p_in to past the new MIMEHDR_INIT,
           * and prepare to process the new MIME charset/encoding
	   * header.
	   */
	  p_in = p + strlen(MIMEHDR_INIT);
	  state = S_SKIP_MIMEINIT;
        }
      }
      break;
    }
  }

  *p_out = '\0';
}



/*
 * Routines for decoding body-parts of a message.
 *
 * Since the "fetch" part of fetchmail gets a message body
 * one line at a time, we need to maintain some state variables
 * across multiple invokations of the UnMimeBodyline() routine.
 * The driver routine should call MimeBodyType() when all
 * headers have been received, and then UnMimeBodyline() for
 * every line in the message body.
 *
 */
#define S_BODY_DATA 0
#define S_BODY_HDR  1

/* 
 * Flag indicating if we are currently processing 
 * the headers or the body of a (multipart) message.
 */
static int  BodyState = S_BODY_DATA;

/* 
 * Flag indicating if we are in the process of decoding
 * a quoted-printable body part.
 */
static int  CurrEncodingIsQP = 0;

/* 
 * Delimiter for multipart messages. RFC 2046 states that this must
 * NEVER be longer than 70 characters. Add 3 for the two hyphens
 * at the beginning, and a terminating null.
 */
#define MAX_DELIM_LEN 70
static unsigned char MultipartDelimiter[MAX_DELIM_LEN+3];


/* This string replaces the "Content-Transfer-Encoding: quoted-printable"
 * string in all headers, including those in body-parts. The replacement
 * must be no longer than the original string.
 */
static const char ENC8BIT[] = "Content-Transfer-Encoding: 8bit";
static void SetEncoding8bit(unsigned char *XferEncOfs)
{
  unsigned char *p;

  if (XferEncOfs != NULL) {
     memcpy(XferEncOfs, ENC8BIT, strlen(ENC8BIT));

     /* If anything left, in this header, replace with whitespace */
     for (p=XferEncOfs+strlen(ENC8BIT); (*p >= ' '); p++) *p=' ';
  }
}

static char *GetBoundary(char *CntType)
{
  char *p1, *p2;
  int flag;

  /* Find the "boundary" delimiter. It must be preceded with a ';'
   * and optionally some whitespace.
   */
  p1 = CntType;
  do {
    p2 = strchr(p1, ';'); 
    if (p2)
      for (p2++; isspace(*p2); p2++);

    p1 = p2;
  } while ((p1) && (strncasecmp(p1, "boundary", 8) != 0));

  if (p1 == NULL)
    /* No boundary delimiter */
    return NULL;

  /* Skip "boundary", whitespace and '='; check that we do have a '=' */
  for (p1+=8, flag=0; (isspace(*p1) || (*p1 == '=')); p1++)
    flag |= (*p1 == '=');
  if (!flag)
    return NULL;

  /* Find end of boundary delimiter string */
  if (*p1 == '\"') {
    /* The delimiter is inside quotes */
    p1++;
    p2 = strchr(p1, '\"');
    if (p2 == NULL)
      return NULL;  /* No closing '"' !?! */
  }
  else {
    /* There might be more text after the "boundary" string. */
    p2 = strchr(p1, ';');  /* Safe - delimiter with ';' must be in quotes */
  }

  /* Zero-terminate the boundary string */
  if (p2 != NULL)
    *p2 = '\0';

  return (p1 && strlen(p1)) ? p1 : NULL;
}


/*
 * This routine does three things:
 * 1) It determines - based on the message headers - whether the
 *    message body is a MIME message that may hold 8 bit data.
 *    - A message that has a "quoted-printable" or "8bit" transfer 
 *      encoding is assumed to contain 8-bit data (when decoded).
 *    - A multipart message is assumed to contain 8-bit data
 *      when decoded (there might be quoted-printable body-parts).
 *    - All other messages are assumed NOT to include 8-bit data.
 * 2) It determines the delimiter-string used in multi-part message
 *    bodies.
 * 3) It sets the initial values of the CurrEncodingIsQP and BodyState
 *    variables, from the header contents.
 *
 * The return value is a bitmask.
 */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区在线观看免费| 国产精品午夜春色av| 99久久综合色| 精品午夜久久福利影院| 亚洲永久免费av| 国产精品久久久久9999吃药| 欧美一级二级三级蜜桃| 色哦色哦哦色天天综合| 粉嫩av亚洲一区二区图片| 日韩av中文字幕一区二区| 自拍av一区二区三区| 久久久精品人体av艺术| 日韩欧美一区二区三区在线| 欧美影视一区在线| 一本一本久久a久久精品综合麻豆| 精品伊人久久久久7777人| 亚洲国产成人porn| 艳妇臀荡乳欲伦亚洲一区| 日本一区二区三区dvd视频在线 | 欧美久久免费观看| 色综合色狠狠综合色| www.亚洲在线| 成人avav影音| 岛国精品一区二区| 国产美女av一区二区三区| 麻豆传媒一区二区三区| 午夜视频一区在线观看| 亚洲另类在线制服丝袜| 综合av第一页| 亚洲美女偷拍久久| 亚洲伦理在线精品| 樱花草国产18久久久久| 亚洲免费观看在线观看| 中文字幕一区二区三中文字幕| 国产色产综合色产在线视频| 久久综合久久99| 久久夜色精品国产欧美乱极品| 欧美大黄免费观看| 精品99999| 国产女人18毛片水真多成人如厕| 国产日产亚洲精品系列| 欧美国产精品专区| 亚洲欧洲av色图| 亚洲人精品午夜| 一区二区三区免费观看| 亚洲第四色夜色| 日本欧美在线观看| 看电视剧不卡顿的网站| 韩国理伦片一区二区三区在线播放| 国产一区久久久| 成人妖精视频yjsp地址| www.久久精品| 欧美日韩三级一区二区| 91精品欧美综合在线观看最新| 日韩一区和二区| 日本一区二区三区国色天香 | 一本到三区不卡视频| 日本道免费精品一区二区三区| 在线观看视频一区二区欧美日韩| 欧美日韩你懂得| 精品国产麻豆免费人成网站| 国产欧美日本一区视频| 亚洲美女少妇撒尿| 七七婷婷婷婷精品国产| 国产精品亚洲人在线观看| 91亚洲男人天堂| 7878成人国产在线观看| 久久精品夜夜夜夜久久| 一区二区三区在线播| 蜜臀国产一区二区三区在线播放 | 欧美一区三区四区| 国产日韩欧美在线一区| 一区二区三区在线看| 免费成人av在线播放| 国产成人精品免费看| 欧美性大战久久| 久久综合九色综合欧美98| 中文字幕在线不卡国产视频| 日韩成人一级大片| 99久久伊人久久99| 日韩一区二区在线观看| 亚洲欧美综合色| 麻豆久久久久久| 日本精品视频一区二区| 精品国产91洋老外米糕| 一区二区三区久久久| 国产一二精品视频| 欧美亚洲综合久久| 国产精品美女久久久久久| 免费看日韩a级影片| 色综合久久天天综合网| 精品国产乱码91久久久久久网站| 亚洲色图制服丝袜| 国产高清亚洲一区| 欧美一区二区大片| 亚洲激情图片一区| 高清不卡一区二区在线| 日韩欧美资源站| 亚洲成人激情av| 99久久精品免费| 久久久久久久久久久黄色| 日日夜夜一区二区| 色综合久久久久久久久久久| 久久免费美女视频| 日韩和的一区二区| 日本韩国欧美三级| 综合色天天鬼久久鬼色| 国产成人免费视频精品含羞草妖精| 欧美丰满嫩嫩电影| 亚洲国产aⅴ天堂久久| 91一区二区三区在线观看| 国产日韩欧美精品综合| 国内外精品视频| 欧美电影免费观看高清完整版在线 | 麻豆精品新av中文字幕| 欧美日韩国产一级片| 亚洲女同女同女同女同女同69| 国产剧情一区二区三区| 精品国产青草久久久久福利| 蜜臀久久99精品久久久久宅男| 欧美艳星brazzers| 中文字幕日本不卡| 成年人午夜久久久| 欧美激情中文不卡| 国产suv一区二区三区88区| 国产色91在线| 国产成人免费网站| 久久久精品2019中文字幕之3| 国产一区二区毛片| 久久精品视频免费| 国产99一区视频免费| 国产亚洲短视频| 大胆欧美人体老妇| 成人免费在线播放视频| av男人天堂一区| 亚洲欧美另类图片小说| 在线亚洲精品福利网址导航| 亚洲色图欧美激情| 色婷婷av一区二区三区gif| 亚洲激情校园春色| 欧美精品在线观看一区二区| 免费成人在线网站| 2020国产成人综合网| 国产不卡视频在线观看| 日本一区二区综合亚洲| 99re成人精品视频| 亚洲综合免费观看高清完整版在线| 欧美午夜在线观看| 日本午夜一区二区| 久久美女艺术照精彩视频福利播放| 国产激情精品久久久第一区二区| 国产精品麻豆视频| 欧洲av在线精品| 久久精品噜噜噜成人av农村| 久久久久久9999| 91在线视频官网| 天堂一区二区在线| 久久久国产一区二区三区四区小说| www.一区二区| 天天免费综合色| 久久九九全国免费| 91麻豆免费看| 麻豆国产欧美日韩综合精品二区| 国产日产欧美一区二区视频| 在线视频观看一区| 美美哒免费高清在线观看视频一区二区 | 成人激情校园春色| 亚洲国产另类精品专区| 精品粉嫩aⅴ一区二区三区四区| jiyouzz国产精品久久| 五月综合激情婷婷六月色窝| 久久久久久一级片| 欧美日韩在线播放三区四区| 美女mm1313爽爽久久久蜜臀| 综合欧美亚洲日本| 精品日韩99亚洲| 色综合天天性综合| 麻豆传媒一区二区三区| 亚洲欧美福利一区二区| 日韩午夜中文字幕| 日本久久精品电影| 国产91在线看| 日韩成人一区二区三区在线观看| 国产欧美精品一区二区色综合| 欧美嫩在线观看| 波多野结衣视频一区| 蜜桃视频免费观看一区| 夜夜揉揉日日人人青青一国产精品| 日韩写真欧美这视频| 色狠狠一区二区三区香蕉| 国产精品一区二区视频| 亚洲国产人成综合网站| 国产精品免费av| 欧美成人性战久久| 欧美日韩一二三| 色综合久久久久网| 成人动漫精品一区二区| 精品一区二区三区免费视频| 日韩高清不卡一区二区| 一级日本不卡的影视|