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

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

?? cdoclinemgr_new.cpp

?? 日本的開源編輯器源碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//	$Id: CDocLineMgr_New.cpp,v 1.21 2005/04/17 10:01:03 genta Exp $
/*!	@file
	@brief 行データの管理

	@author Norio Nakatani
	@date 1999/12/17  新規作成
	@date 2001/12/03  hor Bookmark機能追加
	$Revision: 1.21 $
*/
/*
	Copyright (C) 1998-2001, Norio Nakatani
	Copyright (C) 2001, hor
	Copyright (C) 2002, hor, aroka, MIK

	This source code is designed for sakura editor.
	Please contact the copyright holder to use this code for other purpose.
*/
#include "charcode.h"
#include "CDocLineMgr.h"
#include "debug.h"
#include "charcode.h"
#include <io.h>
#include <commctrl.h>
#include "global.h"
#include "etc_uty.h"
#include "CRunningTimer.h"
#include "CDlgCancel.h"
#include "CDocLine.h"// 2002/2/10 aroka
#include "CMemory.h"// 2002/2/10 aroka
#include "CBregexp.h"// 2002/2/10 aroka
#include "sakura_rc.h"// 2002/2/10 aroka
#include "my_icmp.h" // 2002/11/30 Moca 追加

/* 指定範囲のデータを置換(削除 & データを挿入)
  Fromを含む位置からToの直前を含むデータを削除する
  Fromの位置へテキストを挿入する
*/
void CDocLineMgr::ReplaceData( DocLineReplaceArg* pArg )
{
	MY_RUNNINGTIMER( cRunningTimer, "CDocLineMgr::ReplaceData()" );

	/* 挿入によって増えた行の數 */
	pArg->nInsLineNum = 0;
	/* 削除した行の総數 */
	pArg->nDeletedLineNum = 0;
	/* 削除されたデータ */
	pArg->pcmemDeleted->SetDataSz( "" );

	CDocLine* pCDocLine;
	CDocLine* pCDocLinePrev;
	CDocLine* pCDocLineNext;
	CDocLine* pCDocLineNew;
	int nWorkPos;
	int nWorkLen;
	char* pLine;
	int nLineLen;
// 2002/2/10 aroka 未使用
//	char* pLine2;
//	int nLineLen2;
	int i;
	int			nBgn;
	int			nPos;
	int			nAllLinesOld;
	int			nCount;
	int			nProgress;
	CMemory		cmemPrevLine;
	CMemory		cmemCurLine;
	CMemory		cmemNextLine;
	//	May 15, 2000
	CEOL cEOLType;
	CEOL cEOLTypeNext;
	CDlgCancel*	pCDlgCancel = NULL;
	HWND		hwndCancel = NULL;	//	初期化
	HWND		hwndProgress = NULL;	//	初期化

	pArg->nNewLine = pArg->nDelLineFrom;
	pArg->nNewPos =  pArg->nDelPosFrom;

	/* 大量のデータを操作するとき */
	if( 3000 < pArg->nDelLineTo - pArg->nDelLineFrom
	 || 1024000 < pArg->nInsDataLen
	){

		/* 進捗ダイアログの表示 */
		pCDlgCancel = new CDlgCancel;
		if( NULL != ( hwndCancel = pCDlgCancel->DoModeless( ::GetModuleHandle( NULL ), NULL, IDD_OPERATIONRUNNING ) ) ){
			hwndProgress = ::GetDlgItem( hwndCancel, IDC_PROGRESS );
			::SendMessage( hwndProgress, PBM_SETRANGE, 0, MAKELPARAM(0, 100) );
 			::SendMessage( hwndProgress, PBM_SETPOS, 0, 0 );
		}
	}


	// 削除データの取得のループ
	/* 前から処理していく */
	/* 現在行の情報を得る */
	pCDocLine = GetLineInfo( pArg->nDelLineFrom );
	for( i = pArg->nDelLineFrom; i <= pArg->nDelLineTo && NULL != pCDocLine; i++ ){
		pLine = pCDocLine->m_pLine->GetPtr(); // 2002/2/10 aroka CMemory変更
		nLineLen = pCDocLine->m_pLine->GetLength(); // 2002/2/10 aroka CMemory変更
		pCDocLinePrev = pCDocLine->m_pPrev;
		pCDocLineNext = pCDocLine->m_pNext;
		/* 現在行の削除開始位置を調べる */
		if( i == pArg->nDelLineFrom ){
			nWorkPos = pArg->nDelPosFrom;
		}else{
			nWorkPos = 0;
		}
		/* 現在行の削除データ長を調べる */
		if( i == pArg->nDelLineTo ){
			nWorkLen = pArg->nDelPosTo - nWorkPos;
		}else{
			nWorkLen = nLineLen - nWorkPos; // 2002/2/10 aroka CMemory変更
		}
		if( 0 == nWorkLen ){
			/* 前の行へ */
			goto next_line;
		}
		if( 0 > nWorkLen ){
			::MYMESSAGEBOX(	NULL, MB_OK | MB_ICONINFORMATION, "作者に教えて欲しいエラー",
				"CDocLineMgr::ReplaceData()\n\n0 > nWorkLen\nnWorkLen=%d\ni=%d\npArg->nDelLineTo=%d", nWorkLen, i, pArg->nDelLineTo
			);
		}

		/* 改行も削除するんかぃのぉ???? */
		if( EOL_NONE != pCDocLine->m_cEol &&
			nWorkPos + nWorkLen > nLineLen - pCDocLine->m_cEol.GetLen() // 2002/2/10 aroka CMemory変更
		){
			/* 削除する長さに改行も含める */
			nWorkLen = nLineLen - nWorkPos; // 2002/2/10 aroka CMemory変更
		}
		/* 削除されたデータを保存 */
		// 2002/2/10 aroka from here CMemory変更 念のため。
		if( pLine != pCDocLine->m_pLine->GetPtr() ){
			::MYMESSAGEBOX(	NULL, MB_OK | MB_ICONINFORMATION, "作者に教えて欲しいエラー",
				"CDocLineMgr::ReplaceData()\n\npLine != pCDocLine->m_pLine->GetPtr() =%d\ni=%d\npArg->nDelLineTo=%d", pLine, i, pArg->nDelLineTo
			);
		}
		// 2002/2/10 aroka to here CMemory変更
		if( NULL == pArg->pcmemDeleted->Append( &pLine[nWorkPos], nWorkLen ) ){
			/* メモリ確保に失敗した */
			pArg->pcmemDeleted->SetDataSz( "" );
			break;
		}
next_line:;
		/* 次の行のオブジェクトのポインタ */
		pCDocLine = pCDocLineNext;
		/* 最近參照した行番號と行データ */
		++m_nPrevReferLine;
		m_pCodePrevRefer = pCDocLine;

		if( NULL != hwndCancel){
			if( 0 != (i - pArg->nDelLineFrom) && ( 0 == ((i - pArg->nDelLineFrom) % 32)) ){
				nProgress = (i - pArg->nDelLineFrom) * 100 / (pArg->nDelLineTo - pArg->nDelLineFrom) / 2;
				::SendMessage( hwndProgress, PBM_SETPOS, nProgress, 0 );

			}
		}
	} // 削除データの取得のループ


	/* 現在行の情報を得る */
	pCDocLine = GetLineInfo( pArg->nDelLineTo );
	i = pArg->nDelLineTo;
	if( 0 < pArg->nDelLineTo && NULL == pCDocLine ){
		pCDocLine = GetLineInfo( pArg->nDelLineTo - 1 );
		i--;
	}
	/* 後ろから処理していく */
	for( ; i >= pArg->nDelLineFrom && NULL != pCDocLine; i-- ){
		pLine = pCDocLine->m_pLine->GetPtr(); // 2002/2/10 aroka CMemory変更
		nLineLen = pCDocLine->m_pLine->GetLength(); // 2002/2/10 aroka CMemory変更
		pCDocLinePrev = pCDocLine->m_pPrev;
		pCDocLineNext = pCDocLine->m_pNext;
		/* 現在行の削除開始位置を調べる */
		if( i == pArg->nDelLineFrom ){
			nWorkPos = pArg->nDelPosFrom;
		}else{
			nWorkPos = 0;
		}
		/* 現在行の削除データ長を調べる */
		if( i == pArg->nDelLineTo ){
			nWorkLen = pArg->nDelPosTo - nWorkPos;
		}else{
			nWorkLen = nLineLen - nWorkPos; // 2002/2/10 aroka CMemory変更
		}

		if( 0 == nWorkLen ){
			/* 前の行へ */
			goto prev_line;
		}
		/* 改行も削除するんかぃのぉ???? */
		if( EOL_NONE != pCDocLine->m_cEol &&
			nWorkPos + nWorkLen > nLineLen - pCDocLine->m_cEol.GetLen() // 2002/2/10 aroka CMemory変更
		){
			/* 削除する長さに改行も含める */
			nWorkLen = nLineLen - nWorkPos; // 2002/2/10 aroka CMemory変更
		}


		/* 行全體の削除 */
		if( nWorkLen >= nLineLen ){ // 2002/2/10 aroka CMemory変更
			/* 削除した行の総數 */
			++(pArg->nDeletedLineNum);
			/* 行オブジェクトの削除、リスト変更、行數-- */
			DeleteNode( pCDocLine );
			pCDocLine = NULL;
		}else
		/* 次の行と連結するような削除 */
		if( nWorkPos + nWorkLen >= nLineLen ){ // 2002/2/10 aroka CMemory変更

			/* 行內データ削除 */
			{// 20020119 aroka ブロック內に pWork を閉じ込めた
				char* pWork = new char[nWorkPos + 1];
				memcpy( pWork, pLine, nWorkPos ); // 2002/2/10 aroka 何度も GetPtr を呼ばない
				pCDocLine->m_pLine->SetData( pWork, nWorkPos );
				delete [] pWork;
			}

			/* 次の行がある */
			if( NULL != pCDocLineNext ){
				/* 改行コードの情報を更新 (次の行からもらう) */
				pCDocLine->m_cEol = pCDocLineNext->m_cEol;	/* 改行コードの種類 */

				/* 次の行のデータを最後に追加 */
				// 2002/2/10 aroka 直接 CMemory を Append
				//pLine2 = pCDocLineNext->m_pLine->GetPtr();
				//nLineLen2 = pCDocLineNext->m_pLine->GetLength();
				pCDocLine->m_pLine->Append( pCDocLineNext->m_pLine );
				/* 次の行 行オブジェクトの削除 */
				DeleteNode( pCDocLineNext );
				pCDocLineNext = NULL;
				/* 削除した行の総數 */
				++(pArg->nDeletedLineNum);
			}else{
				/* 改行コードの情報を更新 */
				pCDocLine->m_cEol.SetType( EOL_NONE );
			}
			pCDocLine->SetModifyFlg(true);	/* 変更フラグ */
		}else{
		/* 行內だけの削除 */
			{// 20020119 aroka ブロック內に pWork を閉じ込めた
				// 2002/2/10 aroka CMemory変更 何度も GetLength,GetPtr をよばない。
				int nLength = pCDocLine->m_pLine->GetLength();
				char* pWork = new char[nLength - nWorkLen + 1];
				memcpy( pWork, pLine, nWorkPos );

				memcpy( &pWork[nWorkPos], &pLine[nWorkPos + nWorkLen], nLength - ( nWorkPos + nWorkLen ) );

				pCDocLine->m_pLine->SetData( pWork, nLength - nWorkLen );
				delete [] pWork;
			}
			pCDocLine->SetModifyFlg(true);	/* 変更フラグ */
		}

prev_line:;
		/* 直前の行のオブジェクトのポインタ */
		pCDocLine = pCDocLinePrev;
		/* 最近參照した行番號と行データ */
		--m_nPrevReferLine;
		m_pCodePrevRefer = pCDocLine;

		if( NULL != hwndCancel){
			if( 0 != (pArg->nDelLineTo - i) && ( 0 == ((pArg->nDelLineTo - i) % 32) ) ){
				nProgress = (pArg->nDelLineTo - i) * 100 / (pArg->nDelLineTo - pArg->nDelLineFrom) / 2 + 50;
				::SendMessage( hwndProgress, PBM_SETPOS, nProgress, 0 );
			}
		}
	}


	/* データ挿入処理 */
	if( 0 == pArg->nInsDataLen ){
		goto end_of_func;
	}
	nAllLinesOld = m_nLines;
	pArg->nNewLine = pArg->nDelLineFrom;	/* 挿入された部分の次の位置の行 */
	pArg->nNewPos  = 0;	/* 挿入された部分の次の位置のデータ位置 */

	/* 挿入データを行終端で區切った行數カウンタ */
	nCount = 0;
	pArg->nInsLineNum = 0;
	pCDocLine = GetLineInfo( pArg->nDelLineFrom );



	if( NULL == pCDocLine ){
		/* ここでNULLが帰ってくるということは、*/
		/* 全テキストの最後の次の行を追加しようとしていることを示す */
		cmemPrevLine.SetDataSz( "" );
		cmemNextLine.SetDataSz( "" );
		cEOLTypeNext.SetType( EOL_NONE );
		// ::MessageBox( NULL, "pDocLine==NULL","Warning",MB_OK);
	}else{
		pCDocLine->SetModifyFlg(true);	/* 変更フラグ */

		// 2002/2/10 aroka 何度も GetPtr を呼ばない
		pLine = pCDocLine->m_pLine->GetPtr( &nLineLen );
		cmemPrevLine.SetData( pLine, pArg->nDelPosFrom );
		cmemNextLine.SetData( &pLine[pArg->nDelPosFrom], nLineLen - pArg->nDelPosFrom );

		cEOLTypeNext = pCDocLine->m_cEol;
	}
	nBgn = 0;
	for( nPos = 0; nPos < pArg->nInsDataLen; ){
		if( pArg->pInsData[nPos] == '\n' || pArg->pInsData[nPos] == '\r' ){
			/* 行終端子の種類を調べる */
			cEOLType.GetTypeFromString( &(pArg->pInsData[nPos]), pArg->nInsDataLen - nPos );
			/* 行終端子も含めてテキストをバッファに格納 */
			cmemCurLine.SetData( &(pArg->pInsData[nBgn]), nPos - nBgn + cEOLType.GetLen() );
			nBgn = nPos + cEOLType.GetLen();
			nPos = nBgn;
			if( NULL == pCDocLine){
				pCDocLineNew = new CDocLine;

				pCDocLineNew->m_pLine = new CMemory;
				/* 挿入データを行終端で區切った行數カウンタ */
				if( 0 == nCount ){
					if( NULL == m_pDocLineTop ){
						m_pDocLineTop = pCDocLineNew;
					}
					pCDocLineNew->m_pPrev = m_pDocLineBot;
					if( NULL != m_pDocLineBot ){
						m_pDocLineBot->m_pNext = pCDocLineNew;
					}
					m_pDocLineBot = pCDocLineNew;
					pCDocLineNew->m_pNext = NULL;
					pCDocLineNew->m_pLine->SetData( &cmemPrevLine );
					*(pCDocLineNew->m_pLine) += cmemCurLine;

					pCDocLineNew->m_cEol = cEOLType;	/* 改行コードの種類 */
				}else{
					if( NULL != m_pDocLineBot ){
						m_pDocLineBot->m_pNext = pCDocLineNew;
					}
					pCDocLineNew->m_pPrev = m_pDocLineBot;
					m_pDocLineBot = pCDocLineNew;
					pCDocLineNew->m_pNext = NULL;
					pCDocLineNew->m_pLine->SetData( &cmemCurLine );

					pCDocLineNew->m_cEol = cEOLType;	/* 改行コードの種類 */
				}
				pCDocLine = NULL;
				++m_nLines;
			}else{
				/* 挿入データを行終端で區切った行數カウンタ */
				if( 0 == nCount ){
					pCDocLine->m_pLine->SetData( &cmemPrevLine );
					*(pCDocLine->m_pLine) += cmemCurLine;

					pCDocLine->m_cEol = cEOLType;	/* 改行コードの種類 */
					pCDocLine = pCDocLine->m_pNext;
				}else{
					pCDocLineNew = new CDocLine;
					pCDocLineNew->m_pLine = new CMemory;
					pCDocLineNew->m_pPrev = pCDocLine->m_pPrev;
					pCDocLineNew->m_pNext = pCDocLine;
					pCDocLine->m_pPrev->m_pNext = pCDocLineNew;
					pCDocLine->m_pPrev = pCDocLineNew;
					pCDocLineNew->m_pLine->SetData( &cmemCurLine );

					pCDocLineNew->m_cEol = cEOLType;	/* 改行コードの種類 */

					++m_nLines;
				}
			}

			/* 挿入データを行終端で區切った行數カウンタ */
			++nCount;
			++(pArg->nNewLine);	/* 挿入された部分の次の位置の行 */
			if( NULL != hwndCancel ){
				if( 0 != pArg->nInsDataLen && ( 0 == (nPos % 1024) ) ){
					nProgress = nPos * 100 / pArg->nInsDataLen;
					::SendMessage( hwndProgress, PBM_SETPOS, nProgress, 0 );
				}
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
94色蜜桃网一区二区三区| 天天av天天翘天天综合网色鬼国产 | 中文字幕欧美激情| 日韩**一区毛片| 日韩免费高清av| 国产一区二区三区免费| 国产欧美日本一区视频| 91小视频免费看| 亚洲国产日韩一级| 日韩一区二区免费在线电影 | 精品少妇一区二区三区在线视频| 日本vs亚洲vs韩国一区三区二区 | 不卡高清视频专区| 亚洲男人的天堂在线aⅴ视频| 在线这里只有精品| 蜜臀91精品一区二区三区 | 97国产一区二区| 婷婷久久综合九色综合绿巨人 | 国产精品日日摸夜夜摸av| 色先锋aa成人| 精品一区二区在线视频| 久久精品视频免费| 欧美男生操女生| 国产一区二区看久久| 亚洲国产裸拍裸体视频在线观看乱了| 777亚洲妇女| 国产91精品久久久久久久网曝门| 亚洲综合999| 国产日产欧美一区二区三区| 欧美日韩在线一区二区| 国产福利91精品| 婷婷久久综合九色综合伊人色| 国产欧美精品国产国产专区| 欧美日韩精品一区二区三区四区| 国产91精品免费| 青草av.久久免费一区| 国产精品精品国产色婷婷| 日韩视频一区二区三区在线播放| 色婷婷久久99综合精品jk白丝 | 国产一区二区三区日韩| 一区二区三区日韩在线观看| 久久综合九色综合久久久精品综合| 97精品视频在线观看自产线路二| 精品一区免费av| 日韩黄色免费网站| 亚洲精品五月天| 国产女人18水真多18精品一级做| 日韩精品中文字幕在线一区| 欧美亚洲尤物久久| 91在线看国产| 国产v综合v亚洲欧| 激情伊人五月天久久综合| 亚洲成人av电影| 亚洲激情图片小说视频| 国产精品沙发午睡系列990531| 日韩免费视频线观看| 欧美日韩国产不卡| 欧洲一区在线观看| av在线不卡免费看| 成人av中文字幕| 国产成人精品在线看| 久久国产视频网| 热久久国产精品| 美腿丝袜在线亚洲一区| 免费在线一区观看| 久久精品免费观看| 日本女优在线视频一区二区| 日日嗨av一区二区三区四区| 午夜精品久久久久久久99樱桃| 亚洲电影视频在线| 亚洲va韩国va欧美va| 日韩精品一二三| 亚洲成人tv网| 青青草成人在线观看| 天天做天天摸天天爽国产一区| 亚洲风情在线资源站| 天堂蜜桃一区二区三区| 日产欧产美韩系列久久99| 天堂影院一区二区| 日本不卡视频在线观看| 经典三级视频一区| 国产激情一区二区三区| 国产a区久久久| 99精品视频免费在线观看| av成人动漫在线观看| 色狠狠桃花综合| 91黄色免费看| 欧美一区二区视频免费观看| 日韩精品一区二区在线| 久久久久久久av麻豆果冻| 国产日韩精品一区二区浪潮av| 国产精品久久久久久久久久久免费看 | 日韩精品欧美成人高清一区二区| 五月激情丁香一区二区三区| 麻豆国产91在线播放| 精久久久久久久久久久| 丁香啪啪综合成人亚洲小说| 色综合天天综合网天天看片| 91精品中文字幕一区二区三区| 欧美一区二区视频在线观看| 国产欧美一区二区精品性色超碰| 中文字幕一区二区三区色视频| 一区二区三区不卡在线观看 | 成人午夜av影视| 91成人免费在线视频| 日韩女优毛片在线| 中文字幕亚洲一区二区va在线| 亚洲综合视频网| 免费视频最近日韩| 成人福利视频网站| 538prom精品视频线放| 久久久久亚洲蜜桃| 一区二区三区四区视频精品免费| 奇米影视一区二区三区小说| 国产91露脸合集magnet| 欧美剧在线免费观看网站| 精品国产成人系列| 亚洲男人天堂av网| 国产一区二区精品久久| 欧美性一区二区| 久久久亚洲午夜电影| 亚洲大型综合色站| caoporm超碰国产精品| 日韩欧美资源站| 亚洲午夜一区二区| 成人av综合在线| 欧美一二三四在线| 亚洲一区二区在线免费观看视频| 国产麻豆日韩欧美久久| 欧美日产国产精品| 国产精品久久久久久久久果冻传媒 | 美女被吸乳得到大胸91| 91香蕉视频在线| 国产亚洲成av人在线观看导航| 日本视频一区二区三区| 91成人在线精品| 中文字幕制服丝袜成人av| 美女尤物国产一区| 欧美人与禽zozo性伦| 亚洲日本在线看| 国产91丝袜在线播放0| 日韩精品一区国产麻豆| 日韩在线a电影| 欧美中文字幕一区二区三区亚洲| 中文字幕中文字幕一区二区| 国产制服丝袜一区| 欧美一区二区三区思思人 | 日韩国产高清影视| 色婷婷综合激情| 国产精品无遮挡| 国产丶欧美丶日本不卡视频| 欧美第一区第二区| 丝瓜av网站精品一区二区| 欧美日韩一区中文字幕| 亚洲国产裸拍裸体视频在线观看乱了| 99久久免费精品高清特色大片| 欧美国产日韩精品免费观看| 老司机免费视频一区二区| 欧美日韩精品三区| 亚洲大片一区二区三区| 色成年激情久久综合| 国产精品理论在线观看| 不卡一区二区三区四区| 国产欧美日韩不卡免费| 成人ar影院免费观看视频| 欧美韩国日本不卡| 成人精品鲁一区一区二区| 欧美经典三级视频一区二区三区| 粉嫩av一区二区三区| 中文字幕中文字幕在线一区| 成人a区在线观看| 亚洲柠檬福利资源导航| 欧洲国内综合视频| 日韩影院免费视频| 精品免费视频一区二区| 国产成人午夜精品影院观看视频| 久久久久久久综合狠狠综合| 国产成人久久精品77777最新版本| 国产日产欧美精品一区二区三区| 成人美女在线视频| 一区二区三区日韩欧美| 欧美美女激情18p| 国产在线不卡视频| 国产精品乱码妇女bbbb| 色拍拍在线精品视频8848| 亚洲成人黄色小说| 精品久久久久99| 成人ar影院免费观看视频| 一区二区三区不卡在线观看| 制服丝袜日韩国产| 国产精品一区一区| 亚洲欧美电影一区二区| 91麻豆精品国产综合久久久久久| 蜜桃av一区二区三区| 国产精品天美传媒| 欧美日韩在线播放三区四区| 韩国成人福利片在线播放| 日韩三级视频中文字幕| 东方欧美亚洲色图在线| 亚洲午夜久久久久中文字幕久|