亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
91精品办公室少妇高潮对白| 欧美日韩电影在线播放| 日韩高清中文字幕一区| 精品视频1区2区| 久久电影国产免费久久电影| 亚洲国产一二三| 亚洲国产一区二区在线播放| 综合激情成人伊人| 国产精品剧情在线亚洲| 国产日产欧美一区二区三区| 国产肉丝袜一区二区| 欧美激情综合在线| 国产精品久久久久天堂| 日韩理论片一区二区| 成人免费视频视频在线观看免费| 成人一道本在线| 成人av影院在线| 在线观看91视频| 欧美精品高清视频| 精品国产3级a| 欧美xxxxx裸体时装秀| 亚洲国产精品天堂| 奇米色777欧美一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品资源网| 一本大道久久a久久精品综合 | 欧美午夜片在线看| 欧美色图一区二区三区| 欧美一二区视频| 中文av一区特黄| 亚洲在线视频网站| 极品尤物av久久免费看| 99久久精品国产网站| 欧美日韩一区二区三区在线看| 3d成人动漫网站| 欧美韩国日本不卡| 亚洲国产欧美另类丝袜| 极品少妇xxxx精品少妇偷拍| 成人免费av网站| 91精品久久久久久久久99蜜臂| 久久久久久一二三区| 一区二区三区不卡视频| 狠狠色丁香婷婷综合| 在线欧美日韩精品| 久久只精品国产| 亚洲v中文字幕| 国产乱码精品一区二区三区忘忧草 | 在线观看www91| 欧美群妇大交群中文字幕| 久久久久久久久久电影| 亚洲一二三专区| 国产成人午夜精品影院观看视频| 中文av一区二区| 激情文学综合丁香| 欧美日韩国产综合一区二区| 国产精品久久久久天堂| 另类专区欧美蜜桃臀第一页| 色老汉av一区二区三区| 国产日韩精品一区二区三区 | 亚洲综合男人的天堂| 国产精品一级黄| 欧美一级国产精品| 亚洲午夜精品在线| 99re热视频精品| 久久精品视频免费| 麻豆成人综合网| 欧美日韩国产免费一区二区| 亚洲色图在线播放| 丰满少妇在线播放bd日韩电影| 欧美大片免费久久精品三p| 不卡av免费在线观看| 亚洲国产精品99久久久久久久久 | 亚洲免费观看高清在线观看| 从欧美一区二区三区| 天天影视色香欲综合网老头| 欧美中文字幕不卡| 亚洲精品大片www| 91精彩视频在线观看| 亚洲欧洲三级电影| av在线不卡免费看| 亚洲欧美一区二区久久| 91亚洲永久精品| 亚洲免费在线观看视频| 色综合久久久久久久| 伊人性伊人情综合网| 成人av电影观看| 国产精品初高中害羞小美女文| 成人爱爱电影网址| 亚洲欧美综合色| 欧美综合在线视频| 亚洲国产精品天堂| 3atv在线一区二区三区| 精品中文字幕一区二区| 国产欧美一区二区精品秋霞影院| 成人h动漫精品一区二| 亚洲精品成人在线| 欧美一卡在线观看| 成人97人人超碰人人99| 一区二区三区四区高清精品免费观看| 欧美日韩视频第一区| 久热成人在线视频| 一色屋精品亚洲香蕉网站| 欧美日韩色综合| 国产成人一区二区精品非洲| 亚洲激情一二三区| 日韩亚洲欧美成人一区| 国产成人av一区二区| 欧美理论在线播放| 国产伦精品一区二区三区免费迷 | 久色婷婷小香蕉久久| 欧美激情一区二区| 五月综合激情网| 亚洲最大成人网4388xx| 午夜欧美一区二区三区在线播放| 亚洲日本中文字幕区| 久久精品一二三| 亚洲精品国产高清久久伦理二区| 亚洲日本韩国一区| 亚洲国产综合色| 日本不卡中文字幕| 日本一不卡视频| 成人黄页毛片网站| 色噜噜狠狠色综合中国| 欧美色综合久久| 欧美大尺度电影在线| 日韩精品中午字幕| 亚洲精品视频在线| 日本欧美在线观看| 国产传媒日韩欧美成人| 91啪在线观看| 88在线观看91蜜桃国自产| 国产精品免费aⅴ片在线观看| 亚洲精品欧美综合四区| 日韩电影在线观看网站| 福利视频网站一区二区三区| 欧美天天综合网| 91老师国产黑色丝袜在线| 欧美一级夜夜爽| 国产亚洲成年网址在线观看| 综合久久久久久| 日本女人一区二区三区| 国产精品一区二区久激情瑜伽| 国产一区二区三区| 色欧美片视频在线观看| 337p日本欧洲亚洲大胆精品| 亚洲日本护士毛茸茸| 久久av资源网| 欧美性猛交xxxxxxxx| 日韩三级.com| 亚洲成av人影院| 不卡一区二区在线| 精品日韩av一区二区| 中文字幕一区在线| 美女精品一区二区| 欧美日韩美女一区二区| 国产精品美女久久久久av爽李琼| 日韩精品亚洲一区| 色欲综合视频天天天| 国产精品看片你懂得| 日韩在线一区二区三区| 99国产精品久久久久久久久久| 精品少妇一区二区三区日产乱码| 国产精品国产成人国产三级 | 石原莉奈在线亚洲二区| 国产精品18久久久久久久网站| 欧美一个色资源| 亚洲精品国产视频| 成人激情电影免费在线观看| wwwwww.欧美系列| 男女激情视频一区| 91精品国产综合久久国产大片 | 欧美麻豆精品久久久久久| 椎名由奈av一区二区三区| 99久久伊人久久99| av网站免费线看精品| 精品91自产拍在线观看一区| 久久99九九99精品| 日韩欧美一区二区免费| 手机精品视频在线观看| 高清国产一区二区三区| 国产精品乱码久久久久久| 国产麻豆视频精品| 精品国产凹凸成av人导航| 免费人成在线不卡| 精品99久久久久久| 国产一区在线精品| 精品人在线二区三区| 裸体一区二区三区| 精品三级av在线| 国产自产v一区二区三区c| 精品人在线二区三区| 国内久久精品视频| 日韩一级片在线观看| 日韩国产一区二| 日韩欧美一区二区视频| 国产一区二区女| 亚洲日本在线天堂| 欧美日韩一区二区在线观看视频| 欧美亚洲日本国产| 日韩精品五月天|