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

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

?? stdio.cpp

?? Evc編的一個在wince5.0上運行的flash播放器
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
		// Leftovers at the end
		const int cch = ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, 
			pchSrc, cbSrc,
			pwchDst, cchAvailable);
		if (0 == cch)
		{
			*pcchEmitted = cchOut;
			return FALSE;
		}
		cchOut += cch;
		pwchDst += cch;
		cchAvailable -= cch;
	}

	*pcchEmitted = cchOut;
	return TRUE;
}


// Expanding newlines into CRNL sequences, sans Unicode

BOOL CookOutputTextAA(const char* pchSrc, unsigned cbSrc, unsigned cbNewlines,
				      char* pchDst, unsigned cchAvailable, unsigned* pcchEmitted )
{
	unsigned cchOut = 0; // count of characters written to pwchOut

	if (cbNewlines > 0 && cbSrc > 0)
	{
		// Seeking newlines in the sourcetext, one line at a time
		// Thought: since we have cbNewlines, could use strchr here,
		// decrementing a count of the # of newlines found.
		// That approach would easily transition to an approach
		// where the initial cbNewline count also saved offsets.

		const char* pch = pchSrc;
		unsigned cb = cbSrc;
		while (cb--)
		{
			if (*pch++ == '\n') //$ BUGBUG DBCS, again
			{
				// Copy/convert everything but the newline
				const int cbLine = cbSrc - cb - 1;
				if (cbLine > 0)
				{
					memcpy(pchDst, pchSrc, cbLine);
					cchOut += cbLine;
					pchDst += cbLine;
					cchAvailable -= cbLine;
				}
				// Emit a 'cooked' newline sequence to replace the newline
				*pchDst++ = '\r';
				*pchDst++ = '\n';
				cchOut += 2;
				cchAvailable -= 2;

				cbSrc = cb;
				pchSrc = pch;
			}
		}
	}
	if (cbSrc > 0)
	{
		// Leftovers at the end
		memcpy(pchDst, pchSrc, cbSrc);
		cchOut += cbSrc;
		pchDst += cbSrc;
		cchAvailable -= cbSrc;
	}

	*pcchEmitted = cchOut;
	return TRUE;
}


// Count the number of newlines in source

unsigned CountNewlines(const char* pch, unsigned cb)
{
	//$ BUGBUG DBCS - sigh -
	// can't use strchr loop because pchOut not NUL terminated

	unsigned cbNewlines = 0;
	while (cb--)
		if (*pch++ == '\n')
			++cbNewlines;
	return cbNewlines;
}


CXFileStream::CXFileStream()
	: _h(NULL), _fUseUnicode(FALSE), _cchCRsEaten(0)
{
	// Since this object is reused, do all real init in Open
}


CXFileStream::~CXFileStream()
{
	Close();
}


BOOL CXFileStream::LoadReadBuffer(unsigned cbHint)
{
	const int cchReadQuantum = 512; // used instead of 'cbHint'

	if (NULL == _h)
		return FALSE;

	if (!_fCooked)
	{
		// 1 character, 1 byte. Life is simple and good.

		if (!RequireBuffer(cchReadQuantum)) // set _{c,p}bBuffer
			return FALSE;

		DWORD cbActuallyRead = 0L;
		if (!::ReadFile(_h, _pbBuffer, cchReadQuantum, &cbActuallyRead, NULL))
		{
			//$ BUGBUG better error logging?
			return FALSE;
		}
		if (0 == cbActuallyRead)
			return FALSE;
		_cbActual = cbActuallyRead;
	}
	else
	{
		// Require space for reading text from file,
		// plus space for cooking text: CRNL->NL, possibly Unicode->MBCS.

		// cbRequired: one of the (1+cchReadQuantum)*cbChar is for the WCHAR input,
		// and one is for the MBCS output,
		// pessimistically assuming that every wchar will expand into a 2-byte dbcs sequence.
		// While this seems pointless, given that dbcs input would blow SIOD out of the water,
		// that might change someday....

		const unsigned cbOneChar = _fUseUnicode ? sizeof(WCHAR) : sizeof(char);
		const unsigned cbRead = cchReadQuantum*cbOneChar;
		const unsigned cbRequired = 2*((1+cchReadQuantum)*cbOneChar);

		if (!RequireBuffer(cbRequired)) // set _{c,p}bBuffer
			return FALSE;

		// Fetch source text into tail-end of buffer

		const int ibOffset = (1+cchReadQuantum)* cbOneChar;
		BYTE* pbInPreConvert = _pbBuffer+ibOffset;
		DWORD cbActuallyRead = 0L;
		if (!::ReadFile(_h, pbInPreConvert, cbRead, &cbActuallyRead, NULL))
			return FALSE;
		if (0 == cbActuallyRead)
			return FALSE;

		BOOL fHadTrailingCR;
		unsigned cchCRsEaten;
		if (_fUseUnicode)
		{
			// Convert to MBCS, flattening CRLF sequences to LF as we go
			const unsigned cch = cbActuallyRead/sizeof(WCHAR);
			((WCHAR*)pbInPreConvert)[cch] = 0;
			if (!CookInputTextWA((const WCHAR*)pbInPreConvert, cch, 
				(char*)_pbBuffer, ibOffset, &_cbActual, &fHadTrailingCR, &cchCRsEaten))
				return FALSE;
		}
		else
		{
			// Copy and flatten
			((char*)pbInPreConvert)[cbActuallyRead] = 0;
			if (!CookInputTextAA((const char*)pbInPreConvert, cbActuallyRead, 
				(char*)_pbBuffer, ibOffset, &_cbActual, &fHadTrailingCR, &cchCRsEaten))
				return FALSE;
		}

		// Special evil case: if last character was a CR, 
		// we might have a CRLF sequence crossing the boundary of the read buffer.

		if (fHadTrailingCR)
		{
			// Peek ahead to see if it is so.
			// (Assumes we're working from a disk file. Were this a live IPC channel,
			// we'd delete the trailing CR, then save the pending-possible-CRLF
			// state to resolve in the next Read call.)

			BOOL fFoundNL;
			if (_fUseUnicode)
			{
				WCHAR chReadAhead;
				if (!::ReadFile(_h, &chReadAhead, sizeof(WCHAR), &cbActuallyRead, NULL))
					return FALSE;
				fFoundNL = (sizeof(WCHAR) == cbActuallyRead && __T('\n') == chReadAhead);
			}
			else
			{
				char chReadAhead;
				if (!::ReadFile(_h, &chReadAhead, sizeof(char), &cbActuallyRead, NULL))
					return FALSE;
				fFoundNL = (sizeof(char) == cbActuallyRead && '\n' == chReadAhead);
			}

			if (fFoundNL)
			{
				_pbBuffer[_cbActual] = '\n';
				++cchCRsEaten;
			}
			if (cbActuallyRead > 0 && !fFoundNL)
				::SetFilePointer(_h, -1*cbActuallyRead, NULL, FILE_CURRENT);
		}

		_cchCRsEaten = cchCRsEaten;
	}

	return (_cbActual > 0);
}


void CXFileStream::Write(const BYTE* pbOut, unsigned cbOut, unsigned* pcbOutActual)
{
	if (NULL == _h)
		return;

	if (_fAppending)
	{
		// All writes move to end of file
		::SetFilePointer(_h, 0, NULL, FILE_END);
	}
	else if (_fReading && _cbActual > 0)
	{
		// Write must move back to point of last "read" character
		int ibOffset = _cbActual - _ibCurrent;
		if (_fCooked && ibOffset > 0)
			ibOffset += CountNewlines((const char*)(_pbBuffer+_ibCurrent), ibOffset);
		if (_fUseUnicode && ibOffset > 0)
			ibOffset *= sizeof(WCHAR);
		if (ibOffset > 0)
			::SetFilePointer(_h, -ibOffset, NULL, FILE_CURRENT);
	}

	if (_fReading)
		ResetReadBuffer();

	if (!_fCooked)
	{
		DWORD cbActualWrite = 0L;
		if (!::WriteFile(_h, pbOut, cbOut, &cbActualWrite, NULL))
		{
			//$ BUGBUG better error logging?
			*pcbOutActual = 0;
			return;
		}
		*pcbOutActual = cbActualWrite;
	}
	else
	{
		// Use "cooked" to emit Unicode text, expand LF to CRLF.

		const unsigned cbNewlines = CountNewlines((const char*)pbOut, cbOut);
		const unsigned cbOneChar = _fUseUnicode ? sizeof(WCHAR) : sizeof(char);

		CLocalTempBuffer buf;
		if (!buf.Init( (cbOut+cbNewlines)*cbOneChar ))
		{
			*pcbOutActual = 0;
			return;
		}
		BYTE* pbOutConverted = buf.GetBuffer();

		unsigned cch = 0;
		if (_fUseUnicode)
		{
			if (!CookOutputTextAW((const char*)pbOut, cbOut, cbNewlines,
				(WCHAR*)pbOutConverted, cbOut+cbNewlines, &cch))
			{
				*pcbOutActual = 0;
				return;
			}
		}
		else
		{
			if (!CookOutputTextAA((const char*)pbOut, cbOut, cbNewlines,
				(char*)pbOutConverted, cbOut+cbNewlines, &cch))
			{
				*pcbOutActual = 0;
				return;
			}
		}

		DWORD cbActualWrite = 0L;
		if (!::WriteFile(_h, pbOutConverted, cbOneChar*cch, &cbActualWrite, NULL))
		{
			//$ BUGBUG better error logging?
			*pcbOutActual = 0;
			return;
		}
		*pcbOutActual = cbActualWrite;
	}
}


unsigned CXFileStream::TellUnbuffered()
{
	unsigned ib = ::SetFilePointer(_h, 0, NULL, FILE_CURRENT);

	if (_fUseUnicode)
	{
		ib /= sizeof(WCHAR);
		ib -= 1; // for BOM
	}

	return ib;
}


unsigned CXFileStream::Tell()
{
	if (NULL == _h)
		return 0;

	unsigned ib = TellUnbuffered();

	if (_fReading)
	{
		// Adjust for characters in read buffer
		ib -= _cbActual;
		// Adjust again for CR characters missing from read buffer
		if (_fCooked)
			ib -= _cchCRsEaten;
		// Move forward by characters "read" in read buffer
		ib += _ibCurrent;
	}

	return ib;
}


BOOL CXFileStream::Seek(int ibOffset, int nType)
{
	if (NULL == _h)
		return FALSE;

	DWORD dwMethod;
	switch (nType)
	{
	case SEEK_CUR:
		dwMethod = FILE_CURRENT;
		break;
	case SEEK_END:
		dwMethod = FILE_END;
		break;
	case SEEK_SET:
	default:
		dwMethod = FILE_BEGIN;
		break;
	}

	//
	// File offsets vs. stream buffer offsets
	// ====================================================
	//         ^         ^          ^  
	//         |         |          |
	//         |         |          |
	//         ibInFile  |          ibInFile 
	//      - _cbActual  |          (TRUE file offset)
	//   - _cchCRsEaten  |
	//                   ibInFile
	//                 - _cbActual
	//                 - _cchCRsEaten
	//                 + _ibCurrent
	//                  (VIRTUAL file offset)
	//
	// Note that for the purposes of these calculations
	// we place all the imaginary lost bytes represented by _cchCRsEaten
	// between the last buffered-read byte - _pbBuffer+_cbActual-1 - and ibInFile.
	// There is no attempt to associate a particular lost CR 
	// with a particular offset in the file.

	if (_fReading )
	{
		if (nType != SEEK_END)
		{
			// If the new offset lands within the read-buffer, "seek" takes place therein

			const unsigned ibInFile = TellUnbuffered();
			const unsigned ibStartBuf = ibInFile - _cbActual - _cchCRsEaten;
			const unsigned ibVirtual = ibStartBuf + _ibCurrent;

			unsigned ibNewVirtual;
			if (nType == SEEK_CUR)
			{
				// Need signed arithmetic, since relative offset is signed
				ibNewVirtual = (unsigned)((int)ibVirtual + ibOffset);
			}
			else // SEEK_SET
			{
				ibNewVirtual = (unsigned)ibOffset;
			}

			if (ibNewVirtual >= ibStartBuf && ibNewVirtual < ibInFile)
			{
				_ibCurrent = ibNewVirtual - ibStartBuf;
				return TRUE;
			}
		}

		// Untested hypothesis: it is worthwhile to preserve sequential-read behavior
		// when presenting reads and seeks to the filesystem.
		// Adjust the relative seek offset to compensate for read-buffer position,
		// i.e. the characters buffered but not yet "read,"
		// since true file offset is ahead of virtual offset.
		// Could instead convert all relative seeks to absolute seeks,
		// but then the lack of true CRLF adjustment might bite harder.

		if (nType == SEEK_CUR)
		{
			const unsigned dbRelative = _cbActual - _ibCurrent;
			ibOffset -= ((int)dbRelative + (int)_cchCRsEaten);
		}

		// Having adjusted for the seek-ptr offset as necessary, 
		// discard the now useless readbuffer

		ResetReadBuffer();
	}

	if (_fUseUnicode)
	{
		int nGuard = ibOffset; // test for overflow
		ibOffset *= sizeof(WCHAR);

		if (  ((ibOffset > 0) && (ibOffset < nGuard))
			||((ibOffset < 0) && (ibOffset > nGuard)) )
			return FALSE;

		if (dwMethod != FILE_END)
		{
			nGuard = ibOffset;
			ibOffset += sizeof(WCHAR); // for BOM
			if (ibOffset < nGuard) // test again for overflow
				return FALSE;
		}
	}

	if (0xffffffff == ::SetFilePointer(_h, ibOffset, NULL, dwMethod))
		return FALSE;
	return TRUE;
}


void CXFileStream::Close()
{
	ResetReadBuffer();
	ReleaseBuffer();

	if (NULL == _h)
		return;

	::CloseHandle(_h);
	_h = NULL;
}


/* MODE flags for an opened file:
 *  "r": read       "w": write      "a": append
 *  "r+": read/write                "w+": open empty for read/write
 *  "a+": read/append

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人国产一区二区| 亚洲午夜电影在线| 亚洲乱码中文字幕| 免费日本视频一区| 91浏览器在线视频| 国产亚洲一二三区| 日本免费在线视频不卡一不卡二| 成人a级免费电影| 日韩一区二区三区四区| 亚洲免费观看高清完整版在线观看熊 | 人人超碰91尤物精品国产| 成人白浆超碰人人人人| 精品入口麻豆88视频| 丝袜亚洲另类欧美综合| 一本到三区不卡视频| 欧美激情一区二区在线| 九九九久久久精品| 欧美一二三四区在线| 亚洲妇女屁股眼交7| 色婷婷久久99综合精品jk白丝| 久久精品人人做人人爽人人| 精品一区二区三区免费观看| 欧美一区二区在线观看| 亚洲成人免费看| 欧美午夜精品一区二区三区 | www一区二区| 精品在线一区二区| 日韩一区二区在线观看视频| 美国三级日本三级久久99| 欧美久久一二区| 手机精品视频在线观看| 欧美视频在线一区| 亚洲高清视频在线| 欧美日韩一区小说| 五月婷婷综合网| 欧美乱妇23p| 日本免费新一区视频| 6080日韩午夜伦伦午夜伦| 日韩国产欧美一区二区三区| 欧美一级一区二区| 日韩国产欧美视频| 精品久久国产老人久久综合| 蜜臀久久99精品久久久画质超高清 | 欧美精选午夜久久久乱码6080| 亚洲电影激情视频网站| 欧美一级二级三级乱码| 美女爽到高潮91| 久久精品一区二区三区不卡| k8久久久一区二区三区| 亚洲视频在线观看三级| 91免费看片在线观看| 亚洲综合偷拍欧美一区色| 欧美日韩1区2区| 狠狠色丁香久久婷婷综合_中| 国产亚洲精品中文字幕| 91在线你懂得| 亚洲超碰97人人做人人爱| 欧美成人一区二区三区在线观看| 国产一区二区成人久久免费影院 | 成人毛片在线观看| 波多野结衣亚洲| 久久久综合视频| 9i在线看片成人免费| 亚洲一区二区三区影院| 日韩精品一区二| 99riav一区二区三区| 亚洲福利视频导航| xfplay精品久久| 在线亚洲高清视频| 美女性感视频久久| 亚洲卡通欧美制服中文| 91麻豆精品国产自产在线观看一区| 精品一区二区在线免费观看| 一区二区三区中文字幕在线观看| 日韩一区二区在线观看视频播放| av综合在线播放| 免费成人在线观看| 亚洲女人小视频在线观看| 精品剧情v国产在线观看在线| 一本大道久久精品懂色aⅴ| 蜜臀久久99精品久久久久久9| 亚洲视频在线观看一区| 日韩精品在线一区| 在线免费观看视频一区| 国产东北露脸精品视频| 午夜精品影院在线观看| 日韩理论片一区二区| 26uuu精品一区二区三区四区在线| 色偷偷久久一区二区三区| 国产精品资源站在线| 水蜜桃久久夜色精品一区的特点| 国产精品天天看| 精品国产三级电影在线观看| 欧美日韩亚洲另类| 成人高清在线视频| 国产精品中文欧美| 麻豆成人在线观看| 三级一区在线视频先锋| 亚洲激情校园春色| 亚洲视频精选在线| 欧美国产精品久久| 久久久.com| 日韩一区二区在线免费观看| 色噜噜狠狠色综合欧洲selulu| 国产成人免费9x9x人网站视频| 免费在线一区观看| 日本不卡123| 日韩成人一级大片| 亚洲欧美日韩一区二区三区在线观看| 久久精品在线免费观看| 精品91自产拍在线观看一区| 日韩丝袜美女视频| 精品久久久久久久久久久久久久久 | 视频一区中文字幕国产| 亚洲夂夂婷婷色拍ww47| 亚洲视频一二三区| 亚洲女人****多毛耸耸8| 亚洲人吸女人奶水| 一区二区三区中文字幕在线观看| 亚洲精品中文在线影院| 伊人一区二区三区| 亚洲欧美日本在线| 亚洲卡通欧美制服中文| 一区二区三区四区av| 亚洲成av人片www| 天堂va蜜桃一区二区三区 | 一区二区在线观看免费视频播放 | 欧美精品一区二区三区蜜臀| 精品嫩草影院久久| 26uuu国产在线精品一区二区| 精品久久久久av影院| 国产欧美精品国产国产专区 | 久久久国产精品不卡| 欧美激情自拍偷拍| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲综合丁香婷婷六月香| 青青草97国产精品免费观看| 国产做a爰片久久毛片| av一区二区久久| 欧美日本在线看| 精品国产一区二区三区久久久蜜月 | 在线观看日韩精品| 91精品国产一区二区| 久久一留热品黄| 国产精品理论在线观看| 一区二区三区免费看视频| 日日骚欧美日韩| 成人深夜在线观看| 欧美中文字幕一区二区三区亚洲| 91精品国产欧美一区二区成人| 欧美大片日本大片免费观看| 日本一区二区三区免费乱视频| 一区二区不卡在线播放| 国产伦精品一区二区三区在线观看| 成人免费视频播放| 欧美放荡的少妇| 中文字幕av一区二区三区| 午夜精品视频一区| 岛国精品在线播放| 欧美少妇性性性| 国产亚洲1区2区3区| 亚洲国产视频在线| 国产精品一区不卡| 欧美一区永久视频免费观看| 国产精品水嫩水嫩| 日本强好片久久久久久aaa| 波波电影院一区二区三区| 欧美日韩中文一区| 中文字幕精品在线不卡| 日韩国产精品久久久久久亚洲| 波多野结衣亚洲| 久久蜜桃一区二区| 婷婷成人综合网| 99精品一区二区三区| 精品国产乱码91久久久久久网站| 亚洲综合激情小说| www.亚洲色图| 久久日韩精品一区二区五区| 日韩精品一级二级| 欧美性猛交xxxxxx富婆| 中文字幕av不卡| 国产精品99精品久久免费| 日韩欧美一级精品久久| 午夜精品在线看| 欧美在线观看禁18| 亚洲日本丝袜连裤袜办公室| 国产久卡久卡久卡久卡视频精品| 制服丝袜av成人在线看| 亚洲成人av一区二区三区| 色偷偷一区二区三区| 亚洲欧洲日本在线| 成人免费毛片高清视频| 国产日韩欧美激情| 国产精品白丝jk黑袜喷水| 久久综合成人精品亚洲另类欧美| 麻豆国产精品官网| 精品人伦一区二区色婷婷| 老司机一区二区| 精品日韩欧美一区二区| 国模一区二区三区白浆|