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

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

?? cdoclinemgr.cpp

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

	@author Norio Nakatani
	@date 1998/03/05  新規作成
	@date 2001/06/23 N.Nakatani 単語単位で検索する機能を実裝
	@date 2001/06/23 N.Nakatani WhereCurrentWord()変更 WhereCurrentWord_2をコールするようにした
	$Revision: 1.45 $
*/
/*
	Copyright (C) 1998-2001, Norio Nakatani
	Copyright (C) 2001, genta, jepro, hor
	Copyright (C) 2002, hor, aroka, MIK, Moca

	This source code is designed for sakura editor.
	Please contact the copyright holder to use this code for other purpose.
*/

/* for TRACE() of MFC */
//#ifdef _DEBUG
//	#include <afx.h>
//#endif
//#ifndef _DEBUG
//	#include <windows.h>
//#endif


#include "charcode.h"
#include "CDocLineMgr.h"
#include "debug.h"
#include "charcode.h"
// Oct 6, 2000 ao
#include <stdio.h>
#include <io.h>
//	Jun. 26, 2001 genta	正規表現ライブラリの差し替え
#include "CBregexp.h"
#include <commctrl.h>
#include "global.h"
#include "etc_uty.h"
#include "CRunningTimer.h"

//	May 15, 2000 genta
#include "CEol.h"
#include "CDocLine.h"// 2002/2/10 aroka ヘッダ整理
#include "CMemory.h"// 2002/2/10 aroka

#include "CFileWrite.h" //2002/05/22 Frozen
#include "CFileLoad.h" // 2002/08/30 Moca
#include "my_icmp.h" // Nov. 29, 2002 genta/moca

/* 文字種類識別子 */
#define	CK_NULL			0	/*!< NULL 0x0<=c<=0x0 */
#define	CK_TAB			1	/*!< タブ 0x9<=c<=0x9 */
#define	CK_CR			2	/*!< CR = 0x0d  */
#define	CK_LF			3	/*!< LF = 0x0a  */

#define	CK_SPACE		4	/*!< 半角のスペース 0x20<=c<=0x20 */
#define	CK_CSYM			5	/*!< 半角の英字、アンダースコア、數字のいずれか */
#define	CK_KATA			6	/*!< 半角のカタカナ 0xA1<=c<=0xFD */
#define	CK_ETC			7	/*!< 半角のその他 */

#define	CK_MBC_SPACE	12	/*!< 2バイトのスペース */
							/*!< 0x8140<=c<=0x8140 全角スペース */
#define	CK_MBC_NOVASU	13	/*!< 伸ばす記號 0x815B<=c<=0x815B 'ー' */
#define	CK_MBC_CSYM		14	/*!< 2バイトの英字、アンダースコア、數字のいずれか */
							/*!< 0x8151<=c<=0x8151 全角アンダースコア */
							/*!< 0x824F<=c<=0x8258 全角數字 */
							/*!< 0x8260<=c<=0x8279 全角英字大文字 */
							/*!< 0x8281<=c<=0x829a 全角英字小文字 */
#define	CK_MBC_KIGO		15	/*!< 2バイトの記號 */
							/*!< 0x8141<=c<=0x81FD */
#define	CK_MBC_HIRA		16	/*!< 2バイトのひらがな */
							/*!< 0x829F<=c<=0x82F1 全角ひらがな */
#define	CK_MBC_KATA		17	/*!< 2バイトのカタカナ */
							/*!< 0x8340<=c<=0x8396 全角カタカナ */
#define	CK_MBC_GIRI		18	/*!< 2バイトのギリシャ文字 */
							/*!< 0x839F<=c<=0x83D6 全角ギリシャ文字 */
#define	CK_MBC_ROS		19	/*!< 2バイトのロシア文字: */
							/*!< 0x8440<=c<=0x8460 全角ロシア文字大文字 */
							/*!< 0x8470<=c<=0x8491 全角ロシア文字小文字 */
#define	CK_MBC_SKIGO	20	/*!< 2バイトの特殊記號 */
							/*!< 0x849F<=c<=0x879C 全角特殊記號 */
#define	CK_MBC_ETC		21	/*!< 2バイトのその他(漢字など) */





CDocLineMgr::CDocLineMgr()
{
	Init();
}




CDocLineMgr::~CDocLineMgr()
{
	Empty();
}





void CDocLineMgr::Init()
{
	m_pDocLineTop = NULL;
	m_pDocLineBot = NULL;
	m_nLines = 0;
	m_nPrevReferLine = 0;
	m_pCodePrevRefer = NULL;
	m_bIsDiffUse = false;	/* DIFF使用中 */	//@@@ 2002.05.25 MIK
	return;
}

/*!
	データのクリア

	全ての行を削除する
*/
void CDocLineMgr::Empty()
{
	CDocLine* pDocLine;
	CDocLine* pDocLineNext;
	pDocLine = m_pDocLineTop;
	while( NULL != pDocLine ){
		pDocLineNext = pDocLine->m_pNext;
		delete pDocLine;
		pDocLine = pDocLineNext;
	}
	return;
}





const char* CDocLineMgr::GetLineStr( int nLine, int* pnLineLen )
{
	CDocLine* pDocLine;
	pDocLine = GetLineInfo( nLine );
	if( NULL == pDocLine ){
		*pnLineLen = 0;
		return NULL;
	}
	// 2002/2/10 aroka CMemory のメンバ変數に直接アクセスしない(inline化されているので速度的な問題はない)
	return pDocLine->m_pLine->GetPtr( pnLineLen );
//	*pnLineLen = pDocLine->m_pLine->m_nDataLen;
//	return pDocLine->m_pLine->m_pData;
}

/*!
	指定された行番號の文字列と改行コードを除く長さを取得
	
	@author Moca
	@date 2003.06.22
*/
const char* CDocLineMgr::GetLineStrWithoutEOL( int nLine, int* pnLineLen )
{
	const CDocLine* pDocLine = GetLineInfo( nLine );
	if( NULL == pDocLine ){
		*pnLineLen = 0;
		return NULL;
	}
	*pnLineLen = pDocLine->GetLengthWithoutEOL();
	return pDocLine->m_pLine->GetPtr();
}

/*!
	指定された番號の行へのポインタを返す

	@param nLine [in] 行番號
	@return 行オブジェクトへのポインタ。該當行がない場合はNULL。
*/
CDocLine* CDocLineMgr::GetLineInfo( int nLine )
{
	int nCounter;
	CDocLine* pDocLine;
	if( 0 == m_nLines ){
		return NULL;
	}
	// 2004.03.28 Moca nLineが負の場合のチェックを追加
	if( 0 > nLine || nLine >= m_nLines ){
		return NULL;
	}
	// 2004.03.28 Moca m_pCodePrevReferより、Top,Botのほうが近い場合は、そちらを利用する
	int nPrevToLineNumDiff = abs( m_nPrevReferLine - nLine );
	if( m_pCodePrevRefer == NULL
	  || nLine < nPrevToLineNumDiff
	  || m_nLines - nLine < nPrevToLineNumDiff
	){
		if( m_pCodePrevRefer == NULL ){
			MY_RUNNINGTIMER( cRunningTimer, "CDocLineMgr::GetLineInfo() 	m_pCodePrevRefer == NULL" );
		}




#if 0 /////////	1999.12.22
		nCounter = 0;
		pDocLine = m_pDocLineTop;
		do{
			if( nLine == nCounter ){
				m_nPrevReferLine = nLine;
				m_pCodePrevRefer = pDocLine;
				m_pDocLineCurrent = pDocLine->m_pNext;
				return pDocLine;
			}
			pDocLine = pDocLine->m_pNext;
			++nCounter;
		}while( NULL != pDocLine );
#endif ///////////////
		if( nLine < (m_nLines / 2) ){
			nCounter = 0;
			pDocLine = m_pDocLineTop;
			while( NULL != pDocLine ){
				if( nLine == nCounter ){
					m_nPrevReferLine = nLine;
					m_pCodePrevRefer = pDocLine;
					m_pDocLineCurrent = pDocLine->m_pNext;
					return pDocLine;
				}
				pDocLine = pDocLine->m_pNext;
				nCounter++;
			}
		}else{
			nCounter = m_nLines - 1;
			pDocLine = m_pDocLineBot;
			while( NULL != pDocLine ){
				if( nLine == nCounter ){
					m_nPrevReferLine = nLine;
					m_pCodePrevRefer = pDocLine;
					m_pDocLineCurrent = pDocLine->m_pNext;
					return pDocLine;
				}
				pDocLine = pDocLine->m_pPrev;
				nCounter--;
			}
		}

	}else{
		if( nLine == m_nPrevReferLine ){
			m_nPrevReferLine = nLine;
			m_pDocLineCurrent = m_pCodePrevRefer->m_pNext;
			return m_pCodePrevRefer;
		}else
		if( nLine > m_nPrevReferLine ){
			nCounter = m_nPrevReferLine + 1;
			pDocLine = m_pCodePrevRefer->m_pNext;
			while( NULL != pDocLine ){
				if( nLine == nCounter ){
					m_nPrevReferLine = nLine;
					m_pCodePrevRefer = pDocLine;
					m_pDocLineCurrent = pDocLine->m_pNext;
					return pDocLine;
				}
				pDocLine = pDocLine->m_pNext;
				++nCounter;
			}
		}else{
			nCounter = m_nPrevReferLine - 1;
			pDocLine = m_pCodePrevRefer->m_pPrev;
			while( NULL != pDocLine ){
				if( nLine == nCounter ){
					m_nPrevReferLine = nLine;
					m_pCodePrevRefer = pDocLine;
					m_pDocLineCurrent = pDocLine->m_pNext;
					return pDocLine;
				}
				pDocLine = pDocLine->m_pPrev;
				nCounter--;
			}
		}
	}
	return NULL;
}





/*! 順アクセスモード:先頭行を得る

	@param pnLineLen [out] 行の長さが返る。
	@return 1行目の先頭へのポインタ。
	データが1行もないときは、長さ0、ポインタNULLが返る。

*/
const char* CDocLineMgr::GetFirstLinrStr( int* pnLineLen )
{
	char* pszLine;
	if( 0 == m_nLines ){
		pszLine = NULL;
		*pnLineLen = 0;
	}else{
		pszLine = m_pDocLineTop->m_pLine->GetPtr( pnLineLen );

		m_pDocLineCurrent = m_pDocLineTop->m_pNext;
	}
	return (const char*)pszLine;
}





/*!
	順アクセスモード:次の行を得る

	@param pnLineLen [out] 行の長さが返る。
	@return 次行の先頭へのポインタ。
	GetFirstLinrStr()が呼び出されていないとNULLが返る

*/
const char* CDocLineMgr::GetNextLinrStr( int* pnLineLen )
{
	char* pszLine;
	if( NULL == m_pDocLineCurrent ){
		pszLine = NULL;
		*pnLineLen = 0;
	}else{
		pszLine = m_pDocLineCurrent->m_pLine->GetPtr( pnLineLen );

		m_pDocLineCurrent = m_pDocLineCurrent->m_pNext;
	}
	return (const char*)pszLine;
}




#if 0
	/* 末尾に行を追加 Ver0 */
	void CDocLineMgr::AddLineStrSz( const char* pszStr )
	{
	#ifdef _DEBUG
		CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::AddLineStrSz" );
	#endif
		CDocLine* pDocLine;
		if( 0 == m_nLines ){
			m_pDocLineBot = m_pDocLineTop = new CDocLine;
			m_pDocLineTop->m_pPrev = NULL;
			m_pDocLineTop->m_pNext = NULL;
			m_pDocLineTop->m_pLine = new CMemory( pszStr, lstrlen( pszStr ) );
		}else{
			pDocLine = new CDocLine;
			pDocLine->m_pPrev = m_pDocLineBot;
			pDocLine->m_pNext = NULL;
			pDocLine->m_pLine = new CMemory( pszStr, lstrlen( pszStr ) );
			m_pDocLineBot->m_pNext = pDocLine;
			m_pDocLineBot = pDocLine;
		}
		++m_nLines;
	}
	/* 末尾に行を追加 Ver1 */
	void CDocLineMgr::AddLineStr( const char* pData, int nDataLen )
	{
	#ifdef _DEBUG
		CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::AddLineStr(const char*, int)" );
	#endif
		CDocLine* pDocLine;
		if( 0 == m_nLines ){
			m_pDocLineBot = m_pDocLineTop = new CDocLine;
			m_pDocLineTop->m_pPrev = NULL;
			m_pDocLineTop->m_pNext = NULL;
			m_pDocLineTop->m_pLine = new CMemory( pData, nDataLen );
		}else{
			pDocLine = new CDocLine;
			pDocLine->m_pPrev = m_pDocLineBot;
			pDocLine->m_pNext = NULL;
			pDocLine->m_pLine = new CMemory( pData, nDataLen );
			m_pDocLineBot->m_pNext = pDocLine;
			m_pDocLineBot = pDocLine;
		}
		++m_nLines;
	}
	/* 末尾に行を追加 Ver2 */
	void CDocLineMgr::AddLineStr( CMemory& cmemData )
	{
	//#ifdef _DEBUG
	//	CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::AddLineStr(CMemory&)" );
	//#endif
		char*	pData;
		int		nDataLen;
		pData = cmemData.GetPtr( &nDataLen );
	//	AddLineStr( pData, nDataLen );

		CDocLine* pDocLine;
		if( 0 == m_nLines ){
			m_pDocLineBot = m_pDocLineTop = new CDocLine;
			m_pDocLineTop->m_pPrev = NULL;
			m_pDocLineTop->m_pNext = NULL;
			m_pDocLineTop->m_pLine = new CMemory( pData, nDataLen );
		}else{
			pDocLine = new CDocLine;
			pDocLine->m_pPrev = m_pDocLineBot;
			pDocLine->m_pNext = NULL;
			pDocLine->m_pLine = new CMemory( pData, nDataLen );
			m_pDocLineBot->m_pNext = pDocLine;
			m_pDocLineBot = pDocLine;
		}
		++m_nLines;
		return;
	}
#endif

/*!
	末尾に行を追加

	@version 1.5

	@param pData [in] 追加する文字列へのポインタ
	@param nDataLen [in] 文字列の長さ
	@param cEol [in] 行末コード

*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩卡一| 国内不卡的二区三区中文字幕| 亚洲成人激情自拍| 国产福利91精品| 777a∨成人精品桃花网| 国产精品美女久久久久久2018| 日韩国产一二三区| 色综合久久66| 日本一区二区视频在线| 久久成人羞羞网站| 欧美视频在线观看一区二区| 国产精品二区一区二区aⅴ污介绍| 蜜臀av亚洲一区中文字幕| 色呦呦日韩精品| 中文字幕第一区第二区| 国产精品资源在线观看| 欧美一区二区三区色| 亚洲成在线观看| 91久久精品一区二区三| 最新成人av在线| 国产91在线|亚洲| 久久综合成人精品亚洲另类欧美| 日韩黄色片在线观看| 欧美日韩一二三| 亚洲一区二区在线免费看| 99精品偷自拍| 亚洲欧美在线观看| 不卡的av在线播放| 欧美国产一区在线| 国产 欧美在线| 国产精品丝袜在线| 高清不卡一区二区在线| 国产日韩成人精品| 国产成人亚洲综合a∨婷婷| 久久精品视频一区二区三区| 国产精品一区免费在线观看| 欧美精品一区在线观看| 国产最新精品精品你懂的| 精品国产一区a| 国产一二三精品| 欧美极品xxx| 972aa.com艺术欧美| 亚洲毛片av在线| 色猫猫国产区一区二在线视频| 亚洲欧美另类综合偷拍| 尤物在线观看一区| 国产精品色婷婷久久58| 亚洲一区中文在线| 成人白浆超碰人人人人| 国产精品午夜电影| 色综合色综合色综合色综合色综合 | 亚洲777理论| 欧美区在线观看| 看电影不卡的网站| 久久青草欧美一区二区三区| 成人99免费视频| 亚洲夂夂婷婷色拍ww47 | 成人天堂资源www在线| 亚洲视频资源在线| 在线成人小视频| 黄一区二区三区| 国产精品狼人久久影院观看方式| 欧美专区在线观看一区| 琪琪久久久久日韩精品| 久久久精品人体av艺术| 91久久免费观看| 另类小说色综合网站| 国产精品免费人成网站| 欧美日韩中文精品| 国产成人在线影院| 亚洲成a天堂v人片| 日本一区二区三区电影| 欧美午夜精品一区二区三区| 国产一区二区按摩在线观看| 亚洲精品国产品国语在线app| 91麻豆精品国产自产在线观看一区 | 日韩国产欧美一区二区三区| 欧美精品一区二区在线观看| av日韩在线网站| 性欧美疯狂xxxxbbbb| 欧美激情一二三区| 欧美久久免费观看| 成人在线综合网| 日韩电影一二三区| 国产精品素人一区二区| 日韩一区二区三区在线观看 | 国产日韩影视精品| 欧美理论在线播放| 99国产精品久久久久久久久久久| 精品无人码麻豆乱码1区2区 | 国产精品亲子乱子伦xxxx裸| 日韩欧美在线综合网| 在线观看视频一区| 成人黄页毛片网站| 国产一区在线观看视频| 丝袜a∨在线一区二区三区不卡| 国产拍欧美日韩视频二区| 日韩一级欧美一级| 91亚洲精品久久久蜜桃网站| 精品亚洲porn| 日本系列欧美系列| 亚洲综合在线免费观看| 国产精品的网站| 精品国产不卡一区二区三区| 日韩一区二区视频| 欧美一级精品在线| 欧美日韩在线一区二区| 91成人网在线| 97se亚洲国产综合自在线观| 成人毛片视频在线观看| 国产激情一区二区三区四区| 韩国女主播一区| 麻豆一区二区三| 日本不卡123| 午夜精品一区二区三区三上悠亚| 国产精品理论片在线观看| 国产偷国产偷精品高清尤物| 久久综合久久综合九色| 久久综合成人精品亚洲另类欧美| 日韩精品中文字幕一区二区三区 | 欧美美女激情18p| 欧美日本乱大交xxxxx| 欧美网站一区二区| 欧美日韩国产乱码电影| 制服丝袜亚洲色图| 日韩视频永久免费| 精品第一国产综合精品aⅴ| 精品国产1区二区| 久久一二三国产| 国产精品久久久久影院老司| 日韩理论片一区二区| 亚洲一区二区综合| 日本麻豆一区二区三区视频| 久久国产夜色精品鲁鲁99| 国产一区二三区| av色综合久久天堂av综合| 在线观看欧美日本| 在线播放中文字幕一区| 久久一夜天堂av一区二区三区| 欧美激情在线观看视频免费| 亚洲精品国产一区二区精华液 | 国产91在线观看| 99免费精品视频| 欧美日韩亚洲另类| 精品国产在天天线2019| 国产精品网友自拍| 一区二区三区四区五区视频在线观看| 夜夜爽夜夜爽精品视频| 久久成人精品无人区| 国产成人av一区二区三区在线| 91视频国产资源| 在线播放国产精品二区一二区四区| 欧美一二三四区在线| 国产精品久久免费看| 午夜精品成人在线视频| 国产成人综合自拍| 欧美亚洲一区二区在线| 久久久噜噜噜久久人人看| 一区二区三区欧美日| 精品一区二区三区在线播放 | 久久99这里只有精品| 成人免费毛片高清视频| 欧美日韩国产一区二区三区地区| 久久综合资源网| 亚洲成人动漫av| 国产99久久久国产精品潘金| 欧美日韩日日骚| 亚洲国产精品99久久久久久久久| 亚洲午夜久久久久久久久电影网| 麻豆精品一二三| 欧美主播一区二区三区美女| 久久新电视剧免费观看| 午夜在线成人av| 91在线视频网址| 久久精品这里都是精品| 亚洲国产欧美另类丝袜| 99这里都是精品| 久久久蜜桃精品| 蜜臀av性久久久久蜜臀aⅴ| 色激情天天射综合网| 久久精品夜色噜噜亚洲a∨| 性做久久久久久久久| 日本久久一区二区三区| 中文无字幕一区二区三区| 久久国产精品99精品国产| 欧美色视频在线| 亚洲色图欧美偷拍| 高清国产一区二区三区| 26uuu成人网一区二区三区| 天堂影院一区二区| 欧美日韩国产系列| 亚洲国产精品一区二区久久恐怖片 | 亚洲青青青在线视频| 处破女av一区二区| 2017欧美狠狠色| 激情伊人五月天久久综合| 欧美成人vr18sexvr| 美女一区二区视频| 日韩精品在线一区| 精品一区二区三区的国产在线播放 |