Files
RepoMain/ZCppMain/ZtCMainChars.H

7306 lines
331 KiB
C++

#ifndef __ZCPPMAIIN__ZTCMAINCHARS_H__
#define __ZCPPMAIIN__ZTCMAINCHARS_H__
#include "ZCppMain/ZMainHead.H"
namespace ZNsMain
{
namespace ZNsChars
{
typedef ZNsMain::IterEasyID IterEasyID ;
typedef ZNsMain::IterEasyIDc IterEasyIDc;
namespace ZNsEnum
{
typedef ZNsMain::ZNsEnum::ZERun ZERun ;
typedef ZNsMain::ZNsEnum::ZERunEx ZERunEx;
enum ZESearchMax
{
ZESearchMax_Over,
ZESearchMax_Stop
};/*
enum ZESearchMax*/
/*////////////////////////////////////////////////////////////////////////////
■ ESearchMaxFind 은 ZtCMainChars<>::GetLength_Repeat_Find() 등의 함수에서,
최대 발견 횟수(AI_RepeatMax)가 유효한 값인 경우, AI_RepeatMax 만큼 발견한
시점에서 문자열 조회를 멈출 것인지, 한 번 더 조회할 것인지(그래서 해당 문
자열을 또 다시 발견하면, AI_RepeatMax+1 번 발견한 것이 되고, 이것은 조건에
맞지 않는 것으로 판단해야 한다)를 결정한다.
-- 2011-07-16 03:49:00
////////////////////////////////////////////////////////////////////////////*/
/*//////////////////////////////////////////////////////
■ 해당 표현식과 일치하는 문자열이 있으면 시작 위치값을
ZERegMatch_MoveNot 이면 이동하지 않는다.
ZERegMatch_MovePos 이면 이동시킨다.
//////////////////////////////////////////////////////*/
enum ZERegMatch
{
ZERegMatch_MoveNot,
ZERegMatch_MovePos
};/*
enum ZERegMatch*/
/*//////////////////////////////////////////////////////
■ 해당 표현식과 일치하는 문자열이 있으면, 위치 정보를
ZERegMatchSavePos_Not 이면 저장하지 않는다.
ZERegMatchSavePos_Yes 이면 저장한다.
//////////////////////////////////////////////////////*/
enum ZERegMatchSavePos
{
ZERegMatchSavePos_Not,
ZERegMatchSavePos_Yes
};/*
enum ZERegMatchSavePos*/
enum ZERegFlag
{
ZERegFlag_Nothing ,
ZERegFlag_Permit , // 찾는 문자열의 목록 중에 하나라도 일치해야 ...
ZERegFlag_PermitRange , // 찾는 문자열의 목록 범위에 속해 있으면 ...
ZERegFlag_PermitChar , // 찾는 문자열의 각 문자 중에 하나라도 일치해야 ...
ZERegFlag_PermitCharRange , // 찾는 문자열의 2 개 문자단위로 허용 범위를 나타내는데, 이 범위에 문자가 있어야...
ZERegFlag_NoPermit , // 찾는 문자열의 목록과 모두가 일치하지 않아야 ...
ZERegFlag_NoPermitRange , // 찾는 문자열의 목록 범위에 속해 있지 않으면 ...
ZERegFlag_NoPermitChar , // 찾는 문자열의 모든 문자에 일치하지 않아야 ...
ZERegFlag_NoPermitCharRange, // 찾는 문자열의 2 개 문자단위로 허용하지 않는 범위를 나타내는데, 이 범위 밖에 문자가 있어야...
ZERegFlag_Find , // 찾는 문자열의 목록 중에 하나라도 일치하면 그 길이까지 구해온다.
ZERegFlag_FindChar , // 찾는 문자여의 각 문자 중에 하나라도 일치하면 그 길이까지 구해온다.
ZERegFlag_FindSerial , // 찾는 문자열의 목록을 순서대로 찾아야 한다.
ZERegFlag_FindSerialChar , // 찾는 문자열의 각 문자를 순서대로 찾아야 한다.
ZERegFlag_FindEscape , // 찾는 문자열의 목록 중에 하나라도 일치하고 escape 문자열로 시작하지 않으면 그 길이까지 구한다.
ZERegFlag_StartFind , // 찾는 문자열의 목록 중, 1 번 원소부터 시작하고, 2 번 원소부터 찾기 시작한다.
ZERegFlag_StartFindChar , // ZERegFlag_FindSerialChar 와 비슷하나, 1 번 문자로 시작해야 하는 점이 다르다.
ZERegFlag_BlockStart , // '조회 Block'의 시작 부분
ZERegFlag_BlockClose // '조회 Block'의 종료 부분
};/*
enum ZERegFlag*/
/*////////////////////////////////////////////////////////////////////////////
■ enum ZERegErr 은 class ZtCSearchCChars<TCharsArr> 에서 사용하는 에러 코드다.
□ ZERegErr_CharCount : 찾은 문자 갯수가
ZtCSearchCChars<TCharsArr>::mi_SearchCharMin 와
ZtCSearchCChars<TCharsArr>::mi_SearchCharMax 사이에 있지 않다.
□ ZERegErr_CharSum :
ZtCSearchCChars<TCharsArr> 의 컨테이너(주로 배열)을 인수로 받아서,
연속해서 ZtCSearchCChars<TCharsArr> 와 일치하는 문자를 찾는 경우,
일치하는 문자를 특정 변수(주로 지역 변수)에 계속 더하게 되는데, 찾은
총 문자 문자 갯수가, 즉 이 변수의 값이
ZtCSearchCChars<TCharsArr>::mi_SearchSumMin 와
ZtCSearchCChars<TCharsArr>::mi_SearchSumMax 사이에 있지 않은 경우이다.
□ --
■ 조회 Block
지정된 문자열에서 특정 패턴을 찾는 조건이 복잡할 경우는, 찾는 조건 object 를
배열이나 tree 형태로 설계하게 되는데, 이때의 찾는 조건의 처음 원소와 끝 원소
의 단위를 '조회 Block'이라고 한다. 특히 tree 형태일 때 하위 노드로 내려가면
새로운 노드 리스트가 있고, 따라서 새로운 '조회 Block' 이 발생하는 것을 설명
하기 위해 필요한 용어이다.
-- 2013-06-25 23:37:00
////////////////////////////////////////////////////////////////////////////*/
enum ZERegErr // 정규 표현식 관련 에러 코드.
{
ZERegErr_None , // 에러 없음.
ZERegErr_CharCount, // 찾은 문자 갯수 에러.
ZERegErr_CharSum // 찾은 문자 누적 갯수 에러.
};/*
enum ZERegErr*/
enum ZETypeCharTmplChain
{
ZETypeCharTmplChain_No ,
ZETypeCharTmplChain_Char ,
ZETypeCharTmplChain_Char2
};/*
enum ZETypeCharTmplChain*/
}/*
namespace ZNsEnum*/
namespace ZNsIFace
{
template<typename TTypeLength> class ZtCStackOfTmplChain
{
private:
TTypeLength ml_SearchSum;
public :
ZtCStackOfTmplChain()
{
ml_SearchSum=0;
}/*
ZtCStackOfTmplChain()*/
TTypeLength GetSearchSum() const{return ml_SearchSum;}
void SetSearchSum(TTypeLength AI_Length){ml_SearchSum =AI_Length;}
void AddSearchSum(TTypeLength AL_Length){ml_SearchSum+=AL_Length;}
public :
};/*
template<typename TypeLength> class ZtCStackOfTmplChain */
}/*
namespace ZNsIFace*/
namespace ZNsType
{
// 경우에 따라 TTypeChar 는 short int 나 int 가 될 수 있다.
template< typename TTypeChar =char,
typename TTypeLength=ZTypLength // signed 형이어야 한다.
>
class ZtCTypeChars /*////////////////////*/
{
public:
typedef TTypeChar TypeChar ;
typedef TTypeLength TypeLength;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef const TypeChar TypeCharC ;
typedef const TypeChar* TypeCharCP;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef ZNsMain::ZtCChars
<TTypeChar, TTypeLength> ZCChars;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static TypeChar GetCharOfAnsi(char AC_AnsiChar)
{
return AC_AnsiChar;
}/*
static TypeChar GetCharOfAnsi(char AC_AnsiChar)*/
static bool IsAnsiChars(TypeCharC* APC_Char,TypeLength AI_Length)
{
// Ansi 7bit 문자이면 true 를 리턴.
// AI_Length<1 인 경우에도 true 를 리턴
while(--AI_Length>=0)
{
if((*APC_Char++)<0) return false;
}/*
while(--AI_Length>=0)*/
return true;
}/*
static bool IsAnsiChars(TypeCharC* APC_Char,TypeLength AI_Length)*/
static TypeLength GetLength(TypeCharC* APC_TypeChar)
{
return ZNsMain::ZftGetLengthType<TypeLength, TypeCharC>(APC_TypeChar);
}/*
static TypeLength GetLength(TypeCharC* APC_TypeChar)
public:*/
public:
static TypeChar GetUpperChar(TypeChar AC_TypeChar)
{
const int CI_Distance='a'-'A'; return
(AC_TypeChar>='a' && AC_TypeChar<='z') ?
AC_TypeChar-CI_Distance : AC_TypeChar ;
}/*
static TypeChar GetUpperChar(TypeChar AC_TypeChar)*/
static TypeChar GetLowerChar(TypeChar AC_TypeChar)
{
const int CI_Distance='a'-'A'; return
(AC_TypeChar>='A' && AC_TypeChar<='Z') ?
AC_TypeChar-CI_Distance : AC_TypeChar ;
}/*
static TypeChar GetLowerChar(TypeChar AC_TypeChar)*/
public:
};/*
template< typename TTypeChar =char,
typename TTypeLength=ZTypLength
>
class ZtCTypeChars //////////////////////*/
}/*
namespace ZNsType*/
template< typename TTypeChars=ZNsType::ZtCTypeChars<char>
>
class ZtCMainChars ////////////////////////////////////////
{
public:
typedef TTypeChars ZCTypeChars;
typedef ZtCMainChars ZCMainChars;
typedef typename ZCTypeChars::ZCChars ZCChars ;
typedef typename ZCTypeChars::TypeChar TypeChar ;
typedef typename ZCTypeChars::TypeLength TypeLength ;
public:
typedef const TypeChar TypeCharC ;
typedef const TypeChar* TypeCharCP;
public:
static int Minus(const ZCChars& AR_CChars1, const ZCChars& AR_CChars2)
{
return ZtCMainChars::Minus(
AR_CChars1.data, AR_CChars2.data(), AR_CChars1.size(), AR_CChars2.size());
}/*
static int Minus(const ZCChars& AR_CChars1, const ZCChars& AR_CChars2)*/
static int Minus /*#################################################*/
(
TypeCharC* APC_Left , TypeCharC* APC_Right,
TypeLength AL_LeftLength, TypeLength AL_RightLength
)
/*##################################################################*/
{
// 두 문자열이 같으면 0
// 왼쪽 문자열이 크면 0 보다 큰 어떤 수
// 오른쪽 문자열이 크면 0 보다 작은 어떤 수를 반환
if(AL_LeftLength<1 || AL_RightLength<1)
{
return AL_LeftLength - AL_RightLength;
}/*
if(AL_LeftLength<1 || AL_RightLength<1)*/
const TypeChar* VP_Left = APC_Left ;
const TypeChar* VP_Right= APC_Right ;
TypeLength VL_Index = 0 ;
TypeLength VL_Loop =
( AL_LeftLength<=AL_RightLength ?
AL_LeftLength : AL_RightLength ) ;
#if(_CODE_OLD_)
TypeChar VC_Minus=0;
while(VL_Index<VL_Loop)
{
if((VC_Minus=(*VP_Left++ - *VP_Right++))!=0)
{
return VC_Minus; // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고.
}/*
if((VC_Minus=(*VP_Left++ - *VP_Right++))!=0)*/
++VL_Index;
}/*
while(VL_Index<VL_Loop)*/
#else
while(VL_Index<VL_Loop)
{
if(*VP_Left++ != *VP_Right++)
{
return int(*(VP_Left-1))-int(*(VP_Right-1)); // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고.
}/*
if(*VP_Left++ != *VP_Right++)*/
++VL_Index;
}/*
while(VL_Index<VL_Loop)*/
#endif
return AL_LeftLength-AL_RightLength;
}/*
static int Minus #@###################################################
(
TypeCharC* APC_Left , TypeCharC* APC_Right,
TypeLength AL_LeftLength, TypeLength AL_RightLength
)
####################################################################*/
static TypeChar* Trim(TypeChar* APC_Char, TypeLength& ARRL_Length)
{
// ARRL_Length 은 APC_Char 의 길이인 동시에 APC_Char 을 Trim 한 후의 길이를 대입받는다.
if(ARRL_Length<1) return 0;
TypeLength i=0; TypeChar* VPC_Char=APC_Char; TypeChar VC_Char=0;
for(; i<ARRL_Length; ++i)
{
const bool CB_IsTrue = /////////////////////////////
(
(VC_Char = *VPC_Char++) != ' ' &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\t') &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\r') &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\n') &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\0')
);
////////////////////////////////////////////////////
if(CB_IsTrue) break;
}/*
for(; i<ARRL_Length; ++i)*/
// 이 시점에서 i 는 앞에서 trim 되는 문자의 길이다.
if(i>0)
{
// 문자를 i 개 앞으로 당긴다.
for(TypeLength t=i; t<ARRL_Length; ++t)
{
APC_Char[t-i] = APC_Char[t];
}/*
for(TypeLength t=i; t<ARRL_Length; ++t)*/
ARRL_Length -= i;
}/*
if(i>0)*/
VPC_Char = APC_Char+(ARRL_Length-1); // 맨 끝을 가리킨다.
for(i=ARRL_Length-1; i>=0; --i)
{
const bool CB_IsTrue = /////////////////////////////
(
(VC_Char = *VPC_Char--) != ' ' &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\t') &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\r') &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\n') &&
VC_Char!=ZCTypeChars::GetCharOfAnsi('\0')
);
////////////////////////////////////////////////////
if(CB_IsTrue) break;
APC_Char[--ARRL_Length] = ZCTypeChars::GetCharOfAnsi('\0');
}/*
for(i=ARRL_Length-1; i>=0; --i)*/
return APC_Char;
}/*
static TypeChar* Trim(TypeChar* APC_Char,TypeLength& ARRL_Length)*/
static ZCChars& Trim(ZCChars& ARR_CChars)
{
ZtCMainChars::Trim(ARR_CChars.data(), RR(ARR_CChars.ml_TypeSize)); return ARR_CChars;
}/*
static ZCChars& Trim(ZCChars& ARR_CChars)*/
template<typename TStringArray> static int GetStartCStrObjNum(
TypeCharC* APC_Origin, TypeLength AL_OriginLength, TStringArray& ARA_SearchArray)
{
long VL_ArrSize=ARA_SearchArray.size(); if(AL_OriginLength<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
__for1(TypeLength, i, VL_ArrSize)
{
const bool CB_IsOK= ZtCMainChars::DoStart
(
APC_Origin , ARA_SearchArray.ItD(CI_IterEasyID).data(),
AL_OriginLength, ARA_SearchArray.ItD(CI_IterEasyID).size()
);
/*:::::::::::::::::::::::::::::::::::::*/
if(CB_IsOK){return i;} ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
__for1(TypeLength, i, VL_ArrSize)*/
return 0;
}/*
template<typename TStringArray> static int GetStartCStrObjNum(
TypeCharC* APC_Origin, TypeLength AL_OriginLength, TStringArray& ARA_SearchArray) */
template<typename TTyChars, typename TStringArray>
static TypeLength GetStartCStrObjNum(const TTyChars& AR_CCharsOrigin, TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetStartCStrObjNum(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetStartCStrObjNum(const TTyChars& AR_CCharsOrigin, TStringArray& ARA_SearchArray) */
template<typename TStringArray, typename TString>
static TypeLength GetStartCStrObjNum2( /*###############*/
TypeCharC* APC_Origin , TypeLength AL_OriginLength,
TStringArray& ARA_SearchArray, TString*& APR_CStringStart
/*#####*/ ) /*##########################################*/
{
APR_CStringStart=0; long VL_ArrSize=ARA_SearchArray.size();
if(AL_OriginLength<1) return 0; ////////////////////////////
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
/* 상수 반복자 const_iterator 으로 코딩하면 APR_CStringStart 는
함수 외부에서 const TString* VP_CStringData 형태로 선언되어야 한다. */
for(TypeLength i=1; i<=VL_ArrSize; ++i)
{
const bool CB_IsOK = ZtCMainChars::DoStart
(
APC_Origin , ARA_SearchArray.ItD(CI_IterEasyID).data(),
AL_OriginLength, ARA_SearchArray.ItD(CI_IterEasyID).size()
);
/*::::::::::::::::::::::::::::::::::::::*/
if(CB_IsOK)
{
APR_CStringStart=&(ARA_SearchArray.ItD(CI_IterEasyID)); return i;
}/*
if(CB_IsOK)*/
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=1; i<=VL_ArrSize; ++i)*/
return 0;
}/*
template<typename TStringArray, typename TString>
static TypeLength GetStartCStrObjNum2(
TypeCharC* APC_Origin , TypeLength AL_OriginLength,
TStringArray& ARA_SearchArray, TString*& APR_CStringStart ) */
template<typename TTyChars, typename TStringArray, typename TString> static TypeLength
GetStartCStrObjNum2(const TTyChars& AR_CCharsOrigin, TStringArray& ARA_SearchArray, TString*& APR_CStringStart)
{
return ZtCMainChars::GetStartCStrObjNum2(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray, RR(APR_CStringStart));
}/*
template<typename TTyChars, typename TStringArray, typename TString> static TypeLength
GetStartCStrObjNum2(const TTyChars& AR_CCharsOrigin, TStringArray& ARA_SearchArray, TString*& APR_CStringStart)*/
/*//////////////////////////////////////////////////////////////////
■ 아래 typename TTyChars 인자를 가진 템플릿 함수는 TTyChars 의 자리
에, ZCChars 클래스같이 data(), size() 멤버를 갖는 클래스가 올 수 있다.
-- 2011-07-13 05:39:00
//////////////////////////////////////////////////////////////////*/
template<typename TTyChars> static bool DoStart(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::DoStart(AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.size());
}/*
template<typename TTyChars> static bool DoStart(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
static bool DoStart(
TypeCharC* APC_Origin, TypeCharC* APC_Search, TypeLength AL_OriginLength, TypeLength AL_SearchLength)
{
if(AL_OriginLength<1 || AL_SearchLength<1 || AL_OriginLength<AL_SearchLength) return false;
return ZtCMainChars::Minus(APC_Origin, APC_Search, AL_SearchLength, AL_SearchLength)==0 ;
}/*
static bool DoStart(
TypeCharC* APC_Origin, TypeCharC* APC_Search, TypeLength AL_OriginLength, TypeLength AL_SearchLength)*/
template<typename TTyChars> static bool DoClose(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::DoClose(AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.size());
}/*
template<typename TTyChars> static bool DoClose(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
static bool DoClose /*//////////////////////////////////////*/
(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLength, TypeLength AL_SearchLength
)
/*##########################################################*/
{
const bool CB_IsBad = /*:::::::::::::::*/
(
AL_OriginLength < 1 ||
AL_SearchLength < 1 ||
AL_OriginLength < AL_OriginLength
);
if(CB_IsBad) return false; /*:::::::::*/
const TypeChar* VP_Char1 = APC_Origin+(AL_OriginLength-AL_SearchLength);
const TypeChar* VP_Char2 = APC_Search ;
for(TypeLength i=0; i<AL_SearchLength; ++i)
{
if(*VP_Char1++ != *VP_Char2++) return false;
}/*
for(TypeLength i=0; i<AL_SearchLength; ++i)*/
return true;
}/*
static bool DoClose //////////////////////////////////////////
(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLength, TypeLength AL_SearchLength
)
############################################################*/
template<typename TTyChars> static bool DoEndLinear(
const TTyChars& AR_CCharsOrigin1, const TTyChars& AR_CCharsOrigin2, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::DoEndLinear(
AR_CCharsOrigin1.data(), AR_CCharsOrigin2.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin1.size(), AR_CCharsOrigin2.size(), AR_CCharsSearch.size() );
}/*
template<typename TTyChars> static bool DoEndLinear(
const TTyChars& AR_CCharsOrigin1, const TTyChars& AR_CCharsOrigin2, const TTyChars& AR_CCharsSearch) */
static bool DoEndLinear /*#################################################################*/
(
TypeCharC* APC_Origin1 , TypeCharC* APC_Origin2 , TypeCharC* APC_Search,
TypeLength AL_OriginLength1, TypeLength AL_OriginLength2, TypeLength AL_SearchLength
)
/*#########################################################################################*/
{
/* APC_Origin1 와 APC_Origin2 을 연속된 문자열로 보았을때,
전체 문자열이 APC_Search 로 끝나면 true 를 반환한다.
*/
const bool CB_IsBad = /*:::::::::::::::::::::::::::::::::::::*/
(
AL_SearchLength<1 ||
AL_OriginLength1 + AL_OriginLength2 < AL_SearchLength
);
if(CB_IsBad) return false; /*::::::::::::::::::::::::::::::::*/
/*/////////////////////////////////////////////////////
■ 경우1 : AL_OriginLength2>AL_SearchLength
APC_Origin1, APC_Origin2 ☞ ABCDEFGH IJKLMNOPQRSTU
APC_Search ☞ LMNOPQRSTU
■ 경우2 : AL_OriginLength2<=AL_SearchLength
APC_Origin1, APC_Origin2 ☞ ABCDEFGH IJKLMNOPQRSTU
APC_Search ☞ GHIJKLMNOPQRSTU
■ -- 2011-03-09 09:49:00
/////////////////////////////////////////////////////*/
TypeCharC* VPC_OrginStart =APC_Origin2+AL_OriginLength2;
TypeCharC* VPC_SearchStart=APC_Search +AL_SearchLength ;
TypeLength VI_CompareCnt =(
AL_OriginLength2>AL_SearchLength ? AL_SearchLength : AL_OriginLength2);
for(TypeLength i=0; i<VI_CompareCnt; ++i)
{
if(*(--VPC_OrginStart) != *(--VPC_SearchStart)) return false;
}/*
for(TypeLength i=0; i<VI_CompareCnt; ++i)*/
if(VI_CompareCnt >=AL_SearchLength) return true ;
if(AL_OriginLength1+VI_CompareCnt< AL_SearchLength) return false;
VI_CompareCnt =AL_SearchLength-VI_CompareCnt;
VPC_OrginStart=APC_Origin1+AL_OriginLength1;
for(TypeLength i=0; i<VI_CompareCnt; ++i)
{
if(*(--VPC_OrginStart) != *(--VPC_SearchStart)) return false;
}/*
for(TypeLength i=0; i<VI_CompareCnt; ++i)*/
return true;
}/*
static bool DoEndLinear
(
TypeCharC* APC_Origin1 , TypeCharC* APC_Origin2 , TypeCharC* APC_Search,
TypeLength AL_OriginLength1, TypeLength AL_OriginLength2, TypeLength AL_SearchLength
)
###########################################################################################*/
// 앞뒤 부분의 문자열이 APC_Search 로 끝나면 true.
bool DoWrap(TypeCharC* APC_Origin, TypeCharC* APC_Search, TypeLength AL_OriginLen, TypeLength AL_SearchLen)
{
if(AL_OriginLen<1 || AL_SearchLen<1 || AL_SearchLen*2>AL_OriginLen) return false;
return ZtCMainChars::DoStart(APC_Origin,APC_Search,AL_OriginLen,AL_SearchLen) &&
ZtCMainChars::DoClose(APC_Origin,APC_Search,AL_OriginLen,AL_SearchLen) ;
}/*
bool DoWrap(TypeCharC* APC_Origin, TypeCharC* APC_Search, TypeLength AL_OriginLen, TypeLength AL_SearchLen) */
template<typename TTyChars> static TypeLength FindPos(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TypeLength AL_StartPos=0)
{
return ZtCMainChars::FindPos(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(), AL_StartPos);
}/*
template<typename TTyChars> static TypeLength FindPos(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TypeLength AL_StartPos=0) */
static TypeLength FindPos /*############################################*/
(
TypeCharC* APC_Origin , TypeCharC* APC_Search ,
TypeLength AL_OriginLength, TypeLength AL_SearchLength,
TypeLength AL_StartPos=0
)
/*######################################################################*/
{
const bool CB_IsBad = ////////////////////////////////////
(
AL_OriginLength< 1 || AL_SearchLength< 1 ||
AL_StartPos < 0 || AL_StartPos >= AL_OriginLength
);
//////////////////////////////////////////////////////////
if(CB_IsBad) return -1;
TypeLength VL_Loop= AL_OriginLength-AL_SearchLength;
TypeLength i = AL_StartPos ;
TypeLength j = 0 ;
/*//////////////////////////////////////////////////////
■ 아래 while 문 코드에서
if(j<1) ++i; else i+=j;
부분을 주목할 것.
연속된 N 개의 문자를 찾아야 하는데, M(<N) 번째 문자가
불일치하다면 M 개 문자를 건너뛰는 것이다.
-- 2010-06-12 13:24:00
//////////////////////////////////////////////////////*/
while(i<=VL_Loop)
{
for(j=0; j<AL_SearchLength ;++j)
{
if(APC_Origin[i+j]!=APC_Search[j]) break;
}/*
for(j=0; j<AL_SearchLength; ++j)*/
if(j==AL_SearchLength) return i;
if(j<1) ++i; else i+=j;
}/*
while(i<=VL_Loop)*/
return -1;
}/*
static TypeLength FindPos ###############################################
(
TypeCharC* APC_Origin , TypeCharC* APC_Search ,
TypeLength AL_OriginLength, TypeLength AL_SearchLength,
TypeLength AL_StartPos=0
)
########################################################################*/
template<typename TTyChars> static TypeLength FindPosLen(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TypeLength& ARRL_MatchLen, TypeLength AL_StartPos=0)
{
return ZtCMainChars::FindPosLen(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(), RR(ARRL_MatchLen), AL_StartPos);
}/*
template<typename TTyChars> static TypeLength FindPosLen(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TypeLength& ARRL_MatchLen, TypeLength AL_StartPos=0) */
static TypeLength FindPosLen( /////////////////////////////////////
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeLength AL_OriginLength ,
TypeLength AL_SearchLength ,
TypeLength& ARRL_MatchLen ,
TypeLength AL_StartPos=0
/*////////*/ ) /*///////////////////////////////////////////////*/
{
const bool CB_IsBad = /////////////////////////////////////////
(
AL_OriginLength< 1 || AL_SearchLength< 1 ||
AL_StartPos < 0 || AL_StartPos >= AL_OriginLength
);
///////////////////////////////////////////////////////////////
if(CB_IsBad) return -1;
TypeLength VL_Loop=AL_OriginLength-AL_SearchLength;
TypeLength i =AL_StartPos;
TypeLength j =0 ;
while(i<=VL_Loop)
{
for(j=0; j<AL_SearchLength; ++j)
{
if(APC_Origin[i+j]!=APC_Search[j]) break;
}/*
for(j=0; j<AL_SearchLength; ++j)*/
if(j==AL_SearchLength) return i;
if(j<1) ++i; else i+=j;
}/*
while(i<=VL_Loop)*/
/* 못찾은 경우인데 이때는 APC_Origin 의 뒷부분과 APC_Search 의 앞부분이
일치하는 길이를 구하여 AR_CCharsMatch 에 전달한다. */
// 현재 i==AL_OriginLength-AL_SearchLength+1 이다.
TypeLength VL_MatchLen=0;
for(; i<AL_OriginLength; ++i)
{
for(j=0; j<AL_OriginLength-i; ++j)
{
if(APC_Origin[i+j] != APC_Search[j])
{
VL_MatchLen=0; break;
}
/*::::::::::::::::::::::::::::::::*/
++VL_MatchLen;
}/*
for(j=0; j<AL_OriginLength-i; ++j)*/
if(j==AL_OriginLength-i) break;
}/*
for(; i<AL_OriginLength; ++i)*/
ARRL_MatchLen=VL_MatchLen; return -1;
}/*
static TypeLength FindPosLen( ////////////////////////////////////
const TypeChar* APC_Origin ,
const TypeChar* APC_Search ,
TypeLength AL_OriginLength ,
TypeLength AL_SearchLength ,
TypeLength& ARRL_MatchLen ,
TypeLength AL_StartPos=0
//////////// ) ////////////////////////////////////////////////*/
static TypeLength FindPosEsc /////////////////////////////////////
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeCharC* APC_Escape ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_StartPos=0
)
//////////////////////////////////////////////////////////////////
{
if(AL_EscapeLen<1) return ZtCMainChars::FindPos
(
APC_Origin, APC_Search, AL_OriginLen, AL_SearchLen, AL_StartPos
);
/*:::::::::::::::::::::::::::::::::::::::::::*/
const bool CB_IsBad = /////////////////////////
(
AL_OriginLen< 1 || AL_SearchLen<1 ||
AL_OriginLen< AL_SearchLen+AL_StartPos
);
///////////////////////////////////////////////
if(CB_IsBad) return -1;
TypeCharC* VP_Origin = APC_Origin+AL_StartPos ;
bool VB_DoEscape= false ;
TypeLength i = 0 ;
TypeLength VL_MaxLoop =
AL_OriginLen-AL_SearchLen-AL_StartPos ;
while(i<=VL_MaxLoop)
{
// VP_Origin 이 APC_Escape 문자열로 시작하는지 조사한다.
if(VB_DoEscape==false)
{
VB_DoEscape = ZtCMainChars::DoStart
(VP_Origin, APC_Escape, AL_OriginLen-i, AL_EscapeLen);
if(VB_DoEscape==true)
{
VP_Origin += AL_EscapeLen ;
i += AL_EscapeLen ;
}/*
if(VB_DoEscape==true)*/
}/*
if(VB_DoEscape==false)*/
#define __TEMP_DOSTART__ ZtCMainChars::DoStart \
( \
VP_Origin , \
APC_Search , \
AL_OriginLen-i-AL_StartPos, \
AL_SearchLen \
) /*:::::::::::::::::::::::::::::::::::::::*/
if(__TEMP_DOSTART__ == false)
{
VB_DoEscape=false; ++VP_Origin; ++i; continue;
}/*
if(__TEMP_DOSTART__ == false)*/
#undef __TEMP_DOSTART__
// 찾은 경우
if(VB_DoEscape==false) return i+AL_StartPos;
// 찾았는데 APC_Escape 문자열로 시작하는 경우
VB_DoEscape=false; VP_Origin++; i++;
}/*
while(i<=VL_MaxLoop)*/
return -1;
}/*
static TypeLength FindPosEsc /////////////////////////////////////
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeCharC* APC_Escape ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_StartPos=0
)
////////////////////////////////////////////////////////////////*/
template<typename TTyChars> static TypeLength FindPosEsc(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, const TTyChars& AR_CCharsEscape, TypeLength AL_StartPos=0)
{
return ZtCMainChars::FindPosEsc(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsEscape.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(), AR_CCharsEscape.size(), AL_StartPos);
}/*
template<typename TTyChars> static TypeLength FindPosEsc(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, const TTyChars& AR_CCharsEscape, TypeLength AL_StartPos=0) */
/* APC_Search 문자열을 찾는데 APC_WrapStart 로 시작한다면 APC_WrapClose
을 찾고 바로 다음에 APC_Search 이 있어야 그 위치를 반환한다. */
static TypeLength FindPosEscWrap /////////////////////////////////
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeCharC* APC_Escape ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
TypeLength AL_StartPos=0
)
//////////////////////////////////////////////////////////////////
{
const bool CB_IsBad = ///////////////////////
(
AL_OriginLen<1 || AL_SearchLen<1 ||
AL_OriginLen<AL_SearchLen+AL_StartPos
) ;
/////////////////////////////////////////////
if(CB_IsBad) return -1;
const bool CB_DoStart = ZtCMainChars::DoStart
(
APC_Origin+AL_StartPos ,
APC_WrapStart ,
AL_OriginLen-AL_StartPos,
AL_WrapStartLen
);
/*:::::::::::::::::::::::::::::::::::::::::*/
if(CB_DoStart)
{
TypeLength VL_WrapClosePos = ZtCMainChars::FindPosEsc
(
APC_Origin ,
APC_WrapClose ,
APC_Escape ,
AL_OriginLen ,
AL_WrapCloseLen ,
AL_EscapeLen ,
AL_StartPos+AL_WrapStartLen
);
/*:::::::::::::::::::::::::::::::::::::::::::::::::*/
if(VL_WrapClosePos<0) return -1;
// 종료 태그(APC_Close)를 찾았으면 바로 다음에 APC_Search 가 시작되는지 조사한다.
const bool CB_DoStart2 = ZtCMainChars::DoStart
(
APC_Origin +VL_WrapClosePos+AL_WrapCloseLen, APC_Search ,
AL_OriginLen-VL_WrapClosePos-AL_WrapCloseLen, AL_SearchLen
);
/*::::::::::::::::::::::::::::::::::::::::::*/
if(CB_DoStart2==false) return -1 ;
return VL_WrapClosePos+AL_WrapCloseLen;
}/*
if(CB_DoStart) */
return ZtCMainChars::FindPos
(APC_Origin, APC_Search, AL_OriginLen, AL_SearchLen, AL_StartPos);
}/*
static TypeLength FindPosEscWrap /////////////////////////////////
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeCharC* APC_Escape ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
TypeLength AL_StartPos=0
)
////////////////////////////////////////////////////////////////*/
template<typename TTyChars> static TypeLength FindPosEscWrap /////
(
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
const TTyChars& AR_CCharsEscape ,
const TTyChars& AR_CCharsWrapStart,
const TTyChars& AR_CCharsWrapClose,
TypeLength AL_StartPos=0
)
//////////////////////////////////////////////////////////////////
{
return ZtCMainChars::FindPosEscWrap
(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsEscape.data(), AR_CCharsWrapStart.data(), AR_CCharsWrapClose.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(), AR_CCharsEscape.size(), AR_CCharsWrapStart.size(), AR_CCharsWrapClose.size(), AL_StartPos
);
/*********************************/
}
/*////////////////////////////////////////////////////////////////
■ FindPosEscWrap() 테스트.
typedef std::NsChars::ZNsType::ZtCTypeChars<char> ZCTypeChars;
typedef std::NsChars::ZtCMainChars<ZCTypeChars> ZCMainChars;
std::string CStrOrigin("{{ABC\\}}\"}},ABC");
std::string CStrSearch(",");
std::string CStrEscape("\\");
std::string CStrWrapStart("{{");
std::string CStrWrapClose("}}");
cout<<"FindPosEscWrap="<<ZCMainChars::FindPosEscWrap(CStrOrigin,CStrSearch,CStrEscape,CStrWrapStart,CStrWrapClose)<<endl;
CStrOrigin =("\"ABC\\\"DEF\",ABC");
CStrSearch =(",");
CStrEscape =("\\");
CStrWrapStart=("\"");
CStrWrapClose=("\"");
cout<<"FindPosEscWrap="<<ZCMainChars::FindPosEscWrap(CStrOrigin,CStrSearch,CStrEscape,CStrWrapStart,CStrWrapClose)<<endl;
이 실행 결과가 각각 11, 10 이 나와야 한다.
■ -- FindPosEscWrap() 테스트.
////////////////////////////////////////////////////////////////*/
template<
typename TStringArray, typename TString> /////////////////////
static TypeLength FindPosEscWrap2
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Escape ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
TStringArray& ARA_SearchArray ,
TString*& APR_CStringStart
)
//////////////////////////////////////////////////////////////////
{
if(AL_OriginLen<1) return -1;
if(ZtCMainChars::DoStart(APC_Origin, APC_WrapStart, AL_OriginLen, AL_WrapStartLen)==true)
{
TypeLength VL_FindPos = ZtCMainChars::FindPosEsc(
APC_Origin ,
APC_WrapClose ,
APC_Escape ,
AL_OriginLen ,
AL_WrapCloseLen ,
AL_EscapeLen ,
AL_WrapStartLen
/*////////*/ ); /////////////////////////////////
if(VL_FindPos<0) return -1;
const bool CB_IsOK = ZtCMainChars::GetStartCStrObjNum2
(
APC_Origin +VL_FindPos+AL_WrapCloseLen,
AL_OriginLen-VL_FindPos-AL_WrapCloseLen,
ARA_SearchArray ,
RR(APR_CStringStart)
) > 0 ;
//////////////////////////////////////////////////////
if(CB_IsOK){return VL_FindPos+AL_WrapCloseLen;} return -1;
}/*
if(ZtCMainChars::DoStart(APC_Origin, APC_WrapStart, AL_OriginLen, AL_WrapStartLen)==true)*/
for(TypeLength i=0; i<AL_OriginLen; ++i)
{
const bool CB_IsTrue =
(
ZtCMainChars::GetStartCStrObjNum2
(
APC_Origin+i , AL_OriginLen-i,
ARA_SearchArray, RR(APR_CStringStart)
) > 0
);
/////////////////////////////////////////////////
if(CB_IsTrue) return i;
}/*
for(TypeLength i=0; i<AL_OriginLen; ++i)*/
return -1;
}/*
template<
typename TStringArray, typename TString> /////////////////////
static TypeLength FindPosEscWrap2
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Escape ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
TStringArray& ARA_SearchArray ,
TString*& APR_CStringStart
)
////////////////////////////////////////////////////////////////*/
template<
typename TTyChars, typename TStringArray, typename TString>
static TypeLength FindPosEscWrap2( ///////////////////////////////
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsEscape ,
const TTyChars& AR_CCharsWrapStart,
const TTyChars& AR_CCharsWrapClose,
TStringArray& ARA_SearchArray ,
TString*& APR_CStringStart
/*//////////*/ ) ///////////////////////////////////////////////*/
{
return ZtCMainChars::FindPosEscWrap2
(
AR_CCharsOrigin.data(), AR_CCharsEscape.data(), AR_CCharsWrapStart.data(), AR_CCharsWrapClose.data(),
AR_CCharsOrigin.size(), AR_CCharsEscape.size(), AR_CCharsWrapStart.size(), AR_CCharsWrapClose.size(), ARA_SearchArray, RR(APR_CStringStart)
);
/*::::::::::::::::::::::::::::::::*/
}
/*////////////////////////////////////////////////////////////////
■ FindPosEscWrap2() 테스트.
typedef std::NsChars::ZNsType::ZtCTypeChars<char> ZCTypeChars;
typedef std::NsChars::ZtCMainChars<ZCTypeChars> ZCMainChars;
std::vector<std::string> VO_Vec;
std::string VO_CString="\"3\\\"4\"==\"56\"";
std::string* VP_CString=0;
VO_Vec.push_back("==");
VO_Vec.push_back(">");
VO_Vec.push_back("<");
cout<<"pos="<<ZCMainChars::FindPosEscWrap2(VO_CString.data(),"\\","\"","\"",VO_CString.size(),1,1,1,VO_Vec,VP_CString)<<endl;
pos=6 이 출력되어야 한다.
■ -- FindPosEscWrap2() 테스트.
////////////////////////////////////////////////////////////////*/
static TypeLength FindPosFromEnd /*######################################################*/
(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLen, TypeLength AL_SearchLen
)
/*#######################################################################################*/
{
// APC_Origin 문자열에서 APC_Search을 AL_StartPos 번째 부터 역방향으로 접근해서 찾는다.
if(AL_OriginLen<1 || AL_SearchLen<1) return -1;
TypeLength i=AL_OriginLen-AL_SearchLen;
while(i>=0)
{
TypeLength j=0;
for(; j<AL_SearchLen; ++j)
{
if(APC_Origin[i+j]!=APC_Search[j]) break;
}
/*//////////////////////*/
if(j==AL_SearchLen){return i;} --i;
}/*
while(i>=0)*/
return -1;
}/*
static TypeLength FindPosFromEnd ##########################################################
(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLen, TypeLength AL_SearchLen
)
#########################################################################################*/
template<typename TTyChars> static TypeLength FindPosFromEnd
(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZCMainChars::FindPosFromEnd(AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.size());
}/*
template<typename TTyChars> static TypeLength FindPosFromEnd
(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
template<typename TTyChars> static TypeLength GetMatchLenFromEnd
(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::GetMatchLenFromEnd(AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.size());
}/*
template<typename TTyChars> static TypeLength GetMatchLenFromEnd
(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
static TypeLength GetMatchLenFromEnd /*#################################*/
(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLength, TypeLength AL_SearchLength
)
/*######################################################################*/
{
if(AL_OriginLength<1 || AL_SearchLength<1) return 0;
TypeLength VL_LoopCnt =
( AL_SearchLength>AL_OriginLength ?
AL_OriginLength : AL_SearchLength
);
TypeCharC* VP_OriTemp =
( AL_SearchLength>AL_OriginLength ?
APC_Origin :
APC_Origin+ (AL_OriginLength-AL_SearchLength)
) ;
TypeCharC* VP_OriTempIn= 0 ;
TypeCharC* VP_SeaTemp = APC_Search;
TypeLength i=0; TypeLength j=0 ;
for(i=VL_LoopCnt; i>0; --i)
{
VP_OriTempIn= VP_OriTemp++;
VP_SeaTemp = APC_Search ;
for(j=0; j<i; ++j)
{
if(*VP_OriTempIn++ != *VP_SeaTemp++) break;
}
/*::::::::::::::*/
if(j>=i) return i;
}/*
for(i=VL_LoopCnt; i>0; --i)*/
return 0;
}/*
static TypeLength GetMatchLenFromEnd #####################################
(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLength, TypeLength AL_SearchLength
)
########################################################################*/
/* 앞에서부터 감싸는 문자열 APC_WrapStart 와 APC_WrapClose 사이에 있는 문자열이 n 회
반복된 전체 길이를 가져온다. APC_WrapStart 와 APC_WrapClose 길이를 포함한다.
APC_WrapStart 와 APC_WrapClose 이 " 인 경우
"ABC""AAABBDD"ABC 라는 문자열에 대해서 "ABC""AAABBDD" 여기까지의 길이를 반환한다. */
static TypeLength GetWrapLen( ////////////////////////////////////
TypeCharC* APC_OriginChar ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen
/*//////////*/ ) ///////////////////////////////////////////////*/
{
if(AL_OriginLen<1) return 0;
TypeLength VL_SearchPos=0;
TypeLength VL_SearchLen=0;
TypeLength VL_FindPos =0;
do ////
{
const bool CB_DoStart = ZtCMainChars::DoStart
(
APC_OriginChar+ VL_SearchPos, APC_WrapStart,
AL_OriginLen - VL_SearchPos, AL_WrapStartLen
);
/////////////////////////////////////////////
if(CB_DoStart==false) return VL_SearchLen;
// APC_WrapStart 로 시작하는 경우
VL_SearchPos += AL_WrapStartLen;
VL_SearchLen += AL_WrapStartLen;
VL_FindPos = ZtCMainChars::FindPos
(
APC_OriginChar, APC_WrapClose ,
AL_OriginLen , AL_WrapStartLen, VL_SearchPos
);
//////////////////////////////////
if(VL_FindPos<0)
{
// APC_WrapCloase 를 못 찾은 경우.
return VL_SearchLen-AL_WrapStartLen;
}/*
if(VL_FindPos<0)*/
VL_SearchPos=VL_FindPos+AL_WrapCloseLen;
VL_SearchLen=VL_FindPos+AL_WrapCloseLen;
}
while(VL_SearchLen<AL_OriginLen);
return VL_FindPos;
}/*
static TypeLength GetWrapLen( ////////////////////////////////////
TypeCharC* APC_OriginChar ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen
////////////// ) ///////////////////////////////////////////////*/
template<typename TTyChars> static TypeLength GetWrapLen(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsWrapStart, const TTyChars& AR_CCharsWrapClose)
{
return ZtCMainChars::GetWrapLen(
AR_CCharsOrigin.data(), AR_CCharsWrapStart.data(), AR_CCharsWrapClose.data(), AR_CCharsOrigin.size(), AR_CCharsWrapStart.size(), AR_CCharsWrapClose.size());
}/*
template<typename TTyChars> static TypeLength GetWrapLen(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsWrapStart, const TTyChars& AR_CCharsWrapClose)*/
static TypeLength FindPosLinear //////////////////////////////////
(
TypeCharC* APC_Origin1 ,
TypeCharC* APC_Origin2 ,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen1 ,
TypeLength AL_OriginLen2 ,
TypeLength AL_SearchLength ,
TypeLength& ARRL_SearchedPos1 ,
TypeLength& ARRL_SearchedPos2 ,
TypeLength& ARRL_SearchedLen1 ,
TypeLength& ARRL_SearchedLen2
)
/*##############################################################*/
{
/* APC_Origin1 과 APC_Origin2 이 이어진 문자열로 보았을때
APC_Search 이 나오는 위치를 구한다.
APC_Origin1 에서 발견된 위치는 ARRL_SearchedPos1 에
APC_Origin2 에서 발견된 위치는 ARRL_SearchedPos2 에 셋팅한다.
APC_Origin1 에서 발견된 길이는 ARRL_SearchedLen1 에
APC_Origin2 에서 발견된 길이는 ARRL_SearchedLen2 에 셋팅한다.
*/
ARRL_SearchedPos1 = -1 ;
ARRL_SearchedPos2 = -1 ;
ARRL_SearchedLen1 = 0 ;
ARRL_SearchedLen2 = 0 ;
if(AL_SearchLength<1) return -1;
TypeLength VL_MatchLen = 0 ;
TypeLength VL_FindPos = -1 ;
if(APC_Origin1<APC_Search)
{
VL_FindPos = ZtCMainChars::FindPosLen
(
APC_Origin1 , APC_Search ,
AL_OriginLen1 , AL_SearchLength ,
RR(VL_MatchLen) , 0
);
//////////////////////////////////////
}
else
{
VL_FindPos = ZtCMainChars::FindPosLen
(
APC_Origin1 , APC_Search ,
AL_OriginLen1 , AL_SearchLength ,
RR(VL_MatchLen) , AL_OriginLen1-AL_SearchLength
);
//////////////////////////////////////
}/*
else*/
if(VL_FindPos>=0)
{
ARRL_SearchedLen1=AL_SearchLength; return ARRL_SearchedPos1=VL_FindPos ;
}/*
if(VL_FindPos>=0)*/
if(VL_MatchLen>0)
{
if(AL_SearchLength-VL_MatchLen > AL_OriginLen2)
{ return -1; }
/*:::::::::::::::::::::::::::::::::::::::::::*/
bool VB_IsOK = ZtCMainChars::DoStart
(
APC_Origin2 ,
APC_Search +VL_MatchLen,
AL_OriginLen2 ,
AL_SearchLength-VL_MatchLen
);
////////////////////////////////////
if(VB_IsOK)
{
ARRL_SearchedPos1= AL_OriginLen1-VL_MatchLen
; ARRL_SearchedPos2= 0
; ARRL_SearchedLen1= VL_MatchLen
; ARRL_SearchedLen2= AL_SearchLength-VL_MatchLen
;
return 0;
}/*
if(VB_IsOK)*/
}/*
if(VL_MatchLen>0)*/
ARRL_SearchedPos2 = ZtCMainChars::FindPos(
APC_Origin2 ,
APC_Search ,
AL_OriginLen2 ,
AL_SearchLength ,
0
/*/////////*/ ); /////////////////////////
if(ARRL_SearchedPos2>=0)
ARRL_SearchedLen2=AL_SearchLength;
return ARRL_SearchedPos2;
}/*
static TypeLength FindPosLinear //////////////////////////////////
(
TypeCharC* APC_Origin1 ,
TypeCharC* APC_Origin2 ,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen1 ,
TypeLength AL_OriginLen2 ,
TypeLength AL_SearchLength ,
TypeLength& ARRL_SearchedPos1 ,
TypeLength& ARRL_SearchedPos2 ,
TypeLength& ARRL_SearchedLen1 ,
TypeLength& ARRL_SearchedLen2
)
################################################################*/
template<typename TTyChars> static TypeLength FindPosLinear //////
(
const TTyChars& AR_CCharsOrigin1 ,
const TTyChars& AR_CCharsOrigin2 ,
const TTyChars& AR_CCharsSearch ,
TypeLength& ARRL_SearchedPos1,
TypeLength& ARRL_SearchedPos2,
TypeLength& ARRL_SearchedLen1,
TypeLength& ARRL_SearchedLen2
)
/*##############################################################*/
{
return ZtCMainChars::FindPosLinear
(
AR_CCharsOrigin1.data(), AR_CCharsOrigin2.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin1.size(), AR_CCharsOrigin2.size(), AR_CCharsSearch.size(),
RR(ARRL_SearchedPos1) , RR(ARRL_SearchedPos2) , RR(ARRL_SearchedLen1) , RR(ARRL_SearchedLen2)
);
/*::::::::::::::::::::::::::::::*/
}
/*##############################################################*/
/*////////////////////////////////////////////////////////////////////////////////////////////
■ template<typename TReadyExec, typename TString> bool FindPosReady
(
TReadyExec AR_CReadyExec ,
const ZCChars& AR_CCharsOrigin ,
const ZCChars& AR_CCharsSearch ,
TString& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
)
어떤 문자열에서 찾으려고 하는 데이타가 있는데, 문자열이 너무 길어서 한 번에 다 읽지 못하는 경우,
문자열을 조금씩 읽어서 찾는 문자열을 탐색할 필요가 있다. 구체적으로 아래 문자열로 예를 들어보자.
abc_BOUND1_defg_BOUND2_hijkmln_BO_BOUND3_opqrstuvwxyz
이 문자열에서 찾는 문자열은 순서대로 BOUND1, BOUND2, BOUND3 이며 이 문자열을 찾을 때마다 그 이전
어떤 자료에 대하여 특정한 처리를 하고자 하는 것이다.
처음에는 abc_BOU 까지만 읽었다고 치자. 그러면 처음에 찾아야 하는 문자열 BOUND1 이 없으므로, abc_BOU
에 대하여 어떤 처리를 해줄 수 있다. 그런데 abc_BOU 는 끝나는 문자열이 찾는 문자열의 앞부분을 몇 글
자(BOU) 포함하고 있으므로, 이 부분을 제외한 abc_ 에 대해서만 처리를 해주어야 한다(다음으로 로딩하는
문자열이 ND1 으로 시작할 수 있는 것이다.) 그리고 나머지 BOU 는 버퍼에 저장해 놓는다.
그후 2 번째로 ND1_de 을 읽었다면, 먼저 버퍼에 찾는 문자열인 BOUND1 중에 BOU 는 버퍼에 이미 있으므로
그 다음 ND1_de 에서, BOU 뒤에 찾는 문자열인 ND1 을 찾아본다. 그러면 BOUND1 을 찾게 되고, 그 다음 데
이타 _de 을 얻는다. 이 이전 데이타는 모두 버린다. 버퍼도 비운다. 새로 얻은 데이타 _de 은 2 번째로 찾
는 문자열 BOUND2 를 전혀 포함하지 않거나, 찾는 문자열 앞 부분 몇 개의 문자와 동일한 문자로 끝나지도
않았다. 그래서 이 _de 에 대해서 안심하고(?) 예정된 처리를 해준다.
3 번째로 fg_BOUND2_hijkmln_BO 을 읽었다. 2 번째로 찾는 문자열 BOUND2 을 찾게 된다. 그러면 그 이전 문
자열 fg_ 에 대해서 처리를 해 주고 3 번째로 찾는 문자열 BOUND3 를 찾는다. BOUND3 는 없다. 그런데 BOUND3
의 앞 부분 BO 로 끝나고 있으므로, 이 BO 만 빼고(다음에 로딩하는 문자열이 UND3 로 시작할 수 있기 때문
에)나머지 문자열 _hijkmln_ 에 대해서 처리를 해준다. BO 는 버퍼에 저장해 놓는다.
4 번째로 _BOUND3_opqrstuvwxyz 을 읽었다. 버퍼에 있는 BO 를 생각하면 BO_BOUND3_opqrstuvwxyz 를 읽은 것
이 된다. 여기서 BOUND3 을 찾게 되고 버퍼에 있는 데이타 BO 와 그 다음 _ 에 대해서 지정된 처리를 해주면
된다. 그 다음 BOUND3 의 다음 데이타 _opqrstuvwxyz 을 처리해 주면 된다.
이 알고리즘을 구현한 것이 FindPosReady(~) 이다.
FindPosReady() 은 일단 찾을 문자열 AR_CCharsSearch 을 AR_CCharsOrigin.data() 에서 찾는다.
못 찾았으면 다음에 읽을 문자열에 찾는 문자열이 존재할 수 있으므로, 일단 AR_CCharsOrigin.data() 의 뒤에
서 AR_CCharsSearch.data() 의 앞부분과 일치하는 문자를 ARR_CStrReadyBuff 에 저장한다. (이 문자들은 찾는
문자열의 일부일 수 있다.)
■ TReadyExec 는 아래 두 멤버를 가져야 하며 참조형일 수 있다.
std::ZNsEnum::ZERun TReadyExec::OnMeetNormal(TypeCharC*, TypeLength);
std::ZNsEnum::ZERun TReadyExec::OnMeetReady (TypeCharC*, TypeLength, ZNsMain::ZNsEnum::ZERun);
찾는 문자열은 ARR_CStrReadyBuff 와 AR_CCharsOrigin.data() 에 동시에 갈라져 있을 수 있는데, 찾는 문자열을
완전히 찾은 경우는
OnMeetReady() 멤버의 3 번 인수가 ZNsMain::ZNsEnum::ZERun_NO 이고
못찾은 경우는 3 번 인수가 ZNsMain::ZNsEnum::ZERun_OK 이다.
■ 인수 TString& ARR_CStrReadyBuff 을 빼고 좀 더 최적화할 수 있는 여지는 있다.
////////////////////////////////////////////////////////////////////////////////////////////*/
template<
typename TReadyExec, typename TTyChars, typename TString> /*###########################*/
static bool FindPosReady
(
TReadyExec AR_CReadyExec ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
TString& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
)
/*##########################################################################################*/
{
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
■ ARR_CStrReadyBuff 에는 AR_CCharsSearch.data() 의 앞부분과 일치하는 문자열이 들어 있다.
다른 엉뚱한 데이타가 들어있지 않도록 만전을 기해야 한다.
■ ARRL_StartPos 는 이 함수가 true 를 반환할 때는
(즉 AR_CCharsSearch.data() 를 찾았으면) AR_CCharsOrigin.data() 에서 다시 조회를 시작해야
하는 위치로 셋팅된다. 그래서 다음 번 조회시에는 AR_CCharsOrigin.data()+ARRL_StartPos 부터
조회하면 된다.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
using ZNsMain::ZNsEnum::ZERun_NO ;
using ZNsMain::ZNsEnum::ZERun_OK ;
ZCChars VO_CCharsOrigin
(AR_CCharsOrigin.data(), AR_CCharsOrigin.size());
VO_CCharsOrigin += ARRL_StartPos;
if(VO_CCharsOrigin.size()<1 || AR_CCharsSearch.size()<1)
{ return false; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
TypeLength VL_ReadyBuffSize= ARR_CStrReadyBuff.size();
TypeLength VL_MatchLen = 0 ;
if(VL_ReadyBuffSize+VO_CCharsOrigin.size()<AR_CCharsSearch.size())
{
// 찾는 데이타의 길이는 AR_CCharsOrigin.size() 이 된다.
bool VB_IsOK = ZtCMainChars::DoStart ///////////
(
VO_CCharsOrigin.data() ,
AR_CCharsSearch.data()+VL_ReadyBuffSize,
VO_CCharsOrigin.size() ,
VO_CCharsOrigin.size()
);
////////////////////////////////////////////////
if(VB_IsOK)
{
ARR_CStrReadyBuff.append(
VO_CCharsOrigin.data(), VO_CCharsOrigin.size());
ARRL_StartPos = -1; return false;
}/*
if(VB_IsOK)*/
/* 찾지 못한 경우 ARR_CStrReadyBuff 버퍼 앞 1 바이트가
아니라, 그 버퍼 전체가 찾는 대상에 포함되지 않는다.
*/
ARRL_StartPos = -1;
if(VL_ReadyBuffSize>0)
{
ARRE_ERun = AR_CReadyExec.
OnMeetNormal(ARR_CStrReadyBuff.data(), VL_ReadyBuffSize);
ARR_CStrReadyBuff = "" ;
if(ARRE_ERun==ZERun_NO) return false;
}/*
if(VL_ReadyBuffSize>0)*/
VL_MatchLen = ZtCMainChars::GetMatchLenFromEnd( ///////////
VO_CCharsOrigin.data(),
AR_CCharsSearch.data(),
VO_CCharsOrigin.size(),
VO_CCharsOrigin.size()
/*/////////*/ ); //////////////////////////////////////////
TypeLength VL_ValidLen = VO_CCharsOrigin.size()-VL_MatchLen;
if(VL_MatchLen>0)
ARR_CStrReadyBuff.append
( VO_CCharsOrigin.data()+VL_ValidLen, VL_MatchLen );
if(VL_ValidLen>0)
ARRE_ERun=AR_CReadyExec.OnMeetNormal
( VO_CCharsOrigin.data() , VL_ValidLen );
return false;
}/*
if(VL_ReadyBuffSize+AR_CCharsOrigin.size()<AR_CCharsSearch.size())*/
bool VB_IsOK = ZtCMainChars::DoStart
(
VO_CCharsOrigin.data() ,
AR_CCharsSearch.data()+VL_ReadyBuffSize,
VO_CCharsOrigin.size() ,
AR_CCharsSearch.size()-VL_ReadyBuffSize
);
////////////////////////////////////
if(VB_IsOK==true)
{
TypeLength VL_ReadyLen = AR_CCharsSearch.size()-VL_ReadyBuffSize;
if(VL_ReadyBuffSize>0)
{
ARRE_ERun = AR_CReadyExec.OnMeetReady( /////////
ARR_CStrReadyBuff.data(),
VL_ReadyBuffSize ,
ZERun_OK
/*/////////*/ ); ///////////////////////////////
if(ARRE_ERun==ZERun_NO) return true;
}/*
if(VL_ReadyBuffSize>0)*/
ARRE_ERun = AR_CReadyExec.OnMeetReady
( VO_CCharsOrigin.data(), VL_ReadyLen, ZERun_NO );
ARRL_StartPos += VL_ReadyLen;
ARR_CStrReadyBuff = "" ; return true;
}/*
if(VB_IsOK==true)*/
if(VL_ReadyBuffSize>0)
{
ARRE_ERun = AR_CReadyExec.OnMeetNormal
(ARR_CStrReadyBuff.data(), VL_ReadyBuffSize);
ARR_CStrReadyBuff = "";
if(ARRE_ERun==ZERun_NO) return false;
}/*
if(VL_ReadyBuffSize>0)*/
VL_MatchLen=0; TypeLength VL_FindPos = ZtCMainChars::FindPosLen
(
VO_CCharsOrigin.data(), AR_CCharsSearch.data(),
VO_CCharsOrigin.size(), AR_CCharsSearch.size(),
RR(VL_MatchLen)
);
////////////////////////////////////////////////////////////////
if(VL_FindPos<0)
{
ARRL_StartPos = -1 ;
ARRE_ERun = AR_CReadyExec.OnMeetNormal
(
VO_CCharsOrigin.data()
, VO_CCharsOrigin.size()-VL_MatchLen
);
ARR_CStrReadyBuff.append
(
VO_CCharsOrigin.data() +
VO_CCharsOrigin.size() - VL_MatchLen
, VL_MatchLen
);
return false; //////////////////////////////////
}/*
if(VL_FindPos<0)*/
if(VL_FindPos>0)
{
ARRE_ERun = AR_CReadyExec.
OnMeetNormal(VO_CCharsOrigin.data(), VL_FindPos);
if(ARRE_ERun==ZERun_NO) return true;
}/*
if(VL_FindPos>0)*/
ARRE_ERun = AR_CReadyExec.OnMeetReady
(
VO_CCharsOrigin.data()+VL_FindPos
, AR_CCharsSearch.size()
, ZERun_NO
);
ARRL_StartPos += (VL_FindPos+AR_CCharsSearch.size());
return true; ////////////////////////////////////////
}/*
template<
typename TReadyExec, typename TTyChars, typename TString>
static bool FindPosReady
(
TReadyExec AR_CReadyExec ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
TString& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
)
///////////////////////////////////////////////////////////*/
template<
typename TReadyExec, typename TStringData> //////////////
static bool FindPosReady(
TReadyExec AR_CReadyExec ,
TypeCharC* AP_OriginData ,
TypeCharC* AP_SearchData ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AP_OriginData 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
/*//////////*/ ) //////////////////////////////////////////*/
{
return FindPosReady<TReadyExec, ZCChars, TStringData>(
AR_CReadyExec ,
ZCChars(AP_OriginData, AL_OriginLen),
ZCChars(AP_SearchData, AL_SearchLen),
ARR_CStrReadyBuff ,
ARRL_StartPos , // AP_OriginData 의 offset 이다.
ARRE_ERun
/*/////*/ ); /////////////////////////////////////////
}/*
template<
typename TReadyExec, typename TStringData> //////////////
static bool FindPosReady(
TReadyExec AR_CReadyExec ,
TypeCharC* AP_OriginData ,
TypeCharC* AP_SearchData ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AP_OriginData 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
////////////// ) //////////////////////////////////////////*/
/*////////////////////////////////////////////////////////////////////////////////
■ 일종의 Call Back 함수인 TReadyExec::OnMeetNormal() 이나 TReadyExec::OnMeetReady()
에서 더 자세한 정보를 받을 수 있도록 AO_CHelpType 인수를 추가로 갖는 함수를
설계한다. 참조형이 아닌 값으로 넘기고 있다(THelpType AO_CHelpType). 따라서
THelpType 이 크기가 큰 object 일 경우는 포인터나, 포인터를 멤버로 갖는 object 로
포장해서 넘겨야 한다.
////////////////////////////////////////////////////////////////////////////////*/
template< typename TReadyExec , typename TTyChars,
typename TStringData, typename THelpType
>
static bool FindPosReady /*#####################################*/
(
TReadyExec AR_CReadyExec ,
THelpType AO_CHelpType ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
)
/*##############################################################*/
{
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
■ ARR_CStrReadyBuff 에는 AR_CCharsSearch.data() 의 앞부분과 일치하는 문자열이 들어 있다.
다른 엉뚱한 데이타가 들어있지 않도록 만전을 기해야 한다.
■ ARRL_StartPos 는 이 함수가 true 를 반환할 때는 (즉 AR_CCharsSearch.data() 를 찾았으면)
AR_CCharsOrigin.data() 에서 다시 조회를 시작해야 하는 위치로 셋팅된다. 그래서 다음 번
조회시에는 AR_CCharsOrigin.data()+ARRL_StartPos 부터 조회하면 된다.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
using ZNsMain::ZNsEnum::ZERun_NO ;
using ZNsMain::ZNsEnum::ZERun_OK ;
typedef ZNsMain::ZtCCheckRef<THelpType> ZCCheckRef ;
typedef typename ZCCheckRef::TypeData TypeObject ;
ZCChars VO_CCharsOrigin
(AR_CCharsOrigin.data(), AR_CCharsOrigin.size());
VO_CCharsOrigin += ARRL_StartPos ;
if(VO_CCharsOrigin.size()<1 || AR_CCharsSearch.size()<1)
{ return false; }
TypeLength VL_ReadyBuffSize=ARR_CStrReadyBuff.size();
TypeLength VL_MatchLen =0;
if(VL_ReadyBuffSize+AR_CCharsOrigin.size()<AR_CCharsSearch.size())
{
// 찾는 데이타의 길이는 AR_CCharsOrigin.size() 이 된다.
bool VB_IsOK = ZtCMainChars::DoStart( //////////////////
VO_CCharsOrigin.data() ,
AR_CCharsSearch.data()+VL_ReadyBuffSize,
VO_CCharsOrigin.size() ,
VO_CCharsOrigin.size()
/*/////////*/ ); ///////////////////////////////////////
if(VB_IsOK==true)
{
ARR_CStrReadyBuff.append(
VO_CCharsOrigin.data(), VO_CCharsOrigin.size());
ARRL_StartPos=-1; return false;
}/*
if(VB_IsOK==true)*/
/* 찾지 못한 경우 ARR_CStrReadyBuff 버퍼 앞 1 바이트가 아니라
그 버퍼 전체가 찾는 대상에 포함되지 않는다. */
ARRL_StartPos = -1;
if(VL_ReadyBuffSize>0)
{
ARRE_ERun= AR_CReadyExec.template OnMeetNormal<TypeObject>
(
ARR_CStrReadyBuff.data(),
VL_ReadyBuffSize ,
ZCCheckRef::PassData(AO_CHelpType)
);
ARR_CStrReadyBuff = ""; //////////////////////////////////
if(ARRE_ERun==ZERun_NO) return false;
}/*
if(VL_ReadyBuffSize>0)*/
VL_MatchLen = ZtCMainChars::GetMatchLenFromEnd(
VO_CCharsOrigin.data(),
AR_CCharsSearch.data(),
VO_CCharsOrigin.size(),
VO_CCharsOrigin.size()
/*/////////*/ ); //////////////////////////////
TypeLength VL_ValidLen = VO_CCharsOrigin.size()-VL_MatchLen;
if(VL_MatchLen>0)
{
ARR_CStrReadyBuff.append
(VO_CCharsOrigin.data()+VL_ValidLen, VL_MatchLen);
}
if(VL_ValidLen>0)
{
ARRE_ERun = AR_CReadyExec.template OnMeetNormal<TypeObject>
(
VO_CCharsOrigin.data(),
VL_ValidLen ,
ZCCheckRef::PassData(AO_CHelpType)
);
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
}/*
if(VL_ValidLen>0)*/
return false;
}/*
if(VL_ReadyBuffSize+AR_CCharsOrigin.size()<AR_CCharsSearch.size())*/
bool VB_IsOK = ZtCMainChars::DoStart
(
VO_CCharsOrigin.data() , AR_CCharsSearch.data()+VL_ReadyBuffSize,
VO_CCharsOrigin.size() , AR_CCharsSearch.size()-VL_ReadyBuffSize
);
////////////////////////////////////
if(VB_IsOK==true)
{
TypeLength VL_ReadyLen = AR_CCharsSearch.size()-VL_ReadyBuffSize;
if(VL_ReadyBuffSize>0)
{
ARRE_ERun= AR_CReadyExec.template OnMeetReady<TypeObject>
(
ARR_CStrReadyBuff.data(), VL_ReadyBuffSize,
ZERun_OK , ZCCheckRef::PassData(AO_CHelpType)
);
/////////////////////////////////////////////////////////
if(ARRE_ERun==ZERun_NO) return true;
}
//if(VL_ReadyBuffSize>0)
ARRE_ERun= AR_CReadyExec.template OnMeetReady<TypeObject>
(
VO_CCharsOrigin.data(), VL_ReadyLen ,
ZERun_NO , ZCCheckRef::PassData(AO_CHelpType)
);
/////////////////////////////////////////////////////////
ARRL_StartPos += VL_ReadyLen;
ARR_CStrReadyBuff = "" ;
return true;
}/*
if(VB_IsOK==true)*/
if(VL_ReadyBuffSize>0)
{
ARRE_ERun= AR_CReadyExec.template OnMeetNormal<TypeObject>
(
ARR_CStrReadyBuff.data(),
VL_ReadyBuffSize ,
ZCCheckRef::PassData(AO_CHelpType)
);
//////////////////////////////////////////////////////////
ARR_CStrReadyBuff = "";
if(ARRE_ERun==ZERun_NO){ return false; }
}/*
if(VL_ReadyBuffSize>0)*/
VL_MatchLen=0; TypeLength VL_FindPos= ZtCMainChars::FindPosLen(
VO_CCharsOrigin.data(),
AR_CCharsSearch.data(),
VO_CCharsOrigin.size(),
AR_CCharsSearch.size(),
RR(VL_MatchLen)
/*/////////*/ ); //////////////////////////////////////////////
if(VL_FindPos<0)
{
ARRL_StartPos= -1 ;
ARRE_ERun = AR_CReadyExec.template OnMeetNormal<TypeObject>
(
VO_CCharsOrigin.data() ,
VO_CCharsOrigin.size()-VL_MatchLen,
ZCCheckRef::PassData(AO_CHelpType)
);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
ARR_CStrReadyBuff.append
(
VO_CCharsOrigin.data() +
VO_CCharsOrigin.size() - VL_MatchLen,
VL_MatchLen
);
////////////////////////
return false;
}/*
if(VL_FindPos<0)*/
if(VL_FindPos>0)
{
ARRE_ERun = AR_CReadyExec.template OnMeetNormal<TypeObject>
(
VO_CCharsOrigin.data(),
VL_FindPos ,
ZCCheckRef::PassData(AO_CHelpType)
);
///////////////////////////////////////////////////////////
if(ARRE_ERun==ZERun_NO) return true;
}/*
if(VL_FindPos>0)*/
ARRE_ERun = AR_CReadyExec.template OnMeetReady<TypeObject>
(
VO_CCharsOrigin.data()+VL_FindPos, AR_CCharsSearch.size(),
ZERun_NO , ZCCheckRef::PassData(AO_CHelpType)
);
ARRL_StartPos += (VL_FindPos+AR_CCharsSearch.size()); return true;
}/*
template< typename TReadyExec , typename TTyChars,
typename TStringData, typename THelpType> ////////////
static bool FindPosReady(
TReadyExec AR_CReadyExec ,
THelpType AO_CHelpType ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
////////////// ) ///////////////////////////////////////////////*/
template
<typename TReadyExec, typename TStringData, typename THelpType>
static bool FindPosReady
(
TReadyExec AR_CReadyExec ,
THelpType AO_CHelpType ,
TypeCharC* AP_OriginData ,
TypeCharC* AP_SearchData ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AP_OriginData 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
)
/////////////////////////////////////////////////////////////////*/
{
typedef ZNsMain::ZtCCheckRef<THelpType> ZCCheckRef ;
typedef typename ZCCheckRef::TypeData TypeObject ;
return FindPosReady<TReadyExec, ZCChars, TStringData, TypeObject>
(
AR_CReadyExec ,
ZCCheckRef::PassData(AO_CHelpType) ,
ZCChars(AP_OriginData, AL_OriginLen),
ZCChars(AP_SearchData, AL_SearchLen),
ARR_CStrReadyBuff ,
ARRL_StartPos , // AP_OriginData 의 offset 이다.
ARRE_ERun
);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}/*
template
<typename TReadyExec, typename TStringData, typename THelpType>
static bool FindPosReady
(
TReadyExec AR_CReadyExec ,
THelpType AO_CHelpType ,
TypeCharC* AP_OriginData ,
TypeCharC* AP_SearchData ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos , // AP_OriginData 의 offset 이다.
ZNsEnum::ZERun& ARRE_ERun
)
//////////////////////////////////////////////////////////////////*/
template
<typename TTyChars, typename TStringData>
static bool FindPosReadyValid
(
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos ,
TypeLength& ARRL_ValidReady , // ARR_CStrReadyBuff 의 유효길이
TypeLength& ARRL_ValidLen
)
///////////////////////////////////////////*/
{
// ARRL_ValidReady 은 0 이나 ARR_CStrReadyBuff.size() 중 한 값이다.
if(ARRL_StartPos<0) ARRL_StartPos=0;
ZCChars VO_CCharsOrigin(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size());
VO_CCharsOrigin+=ARRL_StartPos;
/*/////////////////////////////////////////////////////////////////////////////////////////
■ FindPosReady() 함수와 비슷한 기능을 하는데, AR_CReadyExec 인수가 없는 대신
FindPosReady() 에서 쓰인 지역변수 VL_ValidLen 와 같은 의미를 가진 길이를
참조 인수 ARRL_ValidLen 에 전달한다.
ARRL_ValidLen 은
AR_CCharsOrigin.data() 의 길이 중에서 찾는 문자열 영역에 포함되지 않는 길이를 나타내며,
AR_CCharsOrigin.data() 의 앞에서부터 이 길이의 문자열 영역은 어떤 처리의 대상이 된다.
ARR_CStrReadyBuff 가 가진 문자열이 AR_CCharsSearch.data() 와 match 되는 문자열이 없어서
ARR_CStrReadyBuff 이 찾는 대상의 일부가 아니라 어떤 처리의 대상이 되는 경우,
ARR_CStrReadyBuff 의 길이를 참조 인수 ARRL_ValidReady 에 전달한다.
ARR_CStrReadyBuff 는 AR_CCharsSearch.data() 의 일부분이므로
ARRL_ValidLen 데이타를 처리하기 앞서, AR_CCharsSearch.data() 에서 ARRL_ValidReady 만큼의
데이타를 먼저 처리를 해주어야 한다.
ARRL_ValidReady 은 0 이나 ARR_CStrReadyBuff.size() 중 한 값이다.
/////////////////////////////////////////////////////////////////////////////////////////*/
if(VO_CCharsOrigin.size()<1 || AR_CCharsSearch.size()<1)
{
ARRL_StartPos =-1;
ARRL_ValidReady = 0;
ARRL_ValidLen = 0;
return false;
}/*
if(VO_CCharsOrigin.size()<1 || AR_CCharsSearch.size()<1)*/
TypeLength VL_ReadyBuffSize=ARR_CStrReadyBuff.size();
TypeLength VL_MatchLen =0;
if(VL_ReadyBuffSize+VO_CCharsOrigin.size()<AR_CCharsSearch.size())
{
// 찾는 데이타의 길이는 AR_CCharsOrigin.size() 이 된다.
bool VB_IsOK=ZtCMainChars::DoStart
(
VO_CCharsOrigin.data() ,
AR_CCharsSearch.data()+VL_ReadyBuffSize,
VO_CCharsOrigin.size() ,
VO_CCharsOrigin.size()
);
//////////////////////////////////
if(VB_IsOK==true)
{
ARR_CStrReadyBuff.append(
VO_CCharsOrigin.data(), VO_CCharsOrigin.size() );
ARRL_ValidReady = 0;
ARRL_ValidLen = 0;
ARRL_StartPos =-1;
return false;
}/*
if(VB_IsOK==true)*/
ARR_CStrReadyBuff="";
ARRL_ValidReady = VL_ReadyBuffSize;
ARRL_StartPos =-1;
VL_MatchLen = ZtCMainChars::GetMatchLenFromEnd
(
VO_CCharsOrigin.data(),
AR_CCharsSearch.data(),
VO_CCharsOrigin.size(),
VO_CCharsOrigin.size()
);
//////////////////////////////////////////////
ARRL_ValidLen=AR_CCharsOrigin.size()-VL_MatchLen;
if(VL_MatchLen>0) ARR_CStrReadyBuff.append
(VO_CCharsOrigin.data()+ARRL_ValidLen, VL_MatchLen);
return false; //////
}/*
if(VL_ReadyBuffSize+AR_CCharsOrigin.size()<AR_CCharsSearch.size())*/
bool VB_IsOK=ZtCMainChars::DoStart
(
VO_CCharsOrigin.data() ,
AR_CCharsSearch.data()+VL_ReadyBuffSize,
VO_CCharsOrigin.size() ,
AR_CCharsSearch.size()-VL_ReadyBuffSize
);
//////////////////////////////////
ARR_CStrReadyBuff = "";
if(VB_IsOK==true)
{
ARRL_ValidReady = 0 ;
ARRL_ValidLen = 0 ;
ARRL_StartPos +=
AR_CCharsSearch.size() - VL_ReadyBuffSize;
return true;
}/*
if(VB_IsOK==true)*/
VL_MatchLen=0;
TypeLength VL_FindPos = ZtCMainChars::FindPosLen
(
VO_CCharsOrigin.data(), AR_CCharsSearch.data(),
VO_CCharsOrigin.size(), AR_CCharsSearch.size(),
RR(VL_MatchLen)
);
////////////////////////////////////////////////
ARRL_ValidReady = VL_ReadyBuffSize;
if(VL_FindPos<0)
{
ARRL_ValidLen =
AR_CCharsOrigin.size()-VL_MatchLen-ARRL_StartPos ;
ARRL_StartPos = -1 ;
ARR_CStrReadyBuff.append(
VO_CCharsOrigin.data()+ARRL_ValidLen, VL_MatchLen);
return false;
}/*
if(VL_FindPos<0)*/
ARRL_ValidLen =VL_FindPos;
ARRL_StartPos+=(VL_FindPos+AR_CCharsSearch.size());
return true; /////////////
}/*
template
<typename TTyChars, typename TStringData>
static bool FindPosReadyValid
(
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
TStringData& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos ,
TypeLength& ARRL_ValidReady , // ARR_CStrReadyBuff 의 유효길이
TypeLength& ARRL_ValidLen
)
///////////////////////////////////////////*/
template<typename TString> static bool FindPosReadyValid( ////////
TypeCharC* AP_CharOrigin ,
TypeCharC* AP_CharSearch ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TString& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos ,
TypeLength& ARRL_ValidReady , // ARR_CStrReadyBuff 의 유효길이
TypeLength& ARRL_ValidLen
/*//////////*/ ) ///////////////////////////////////////////////*/
{
return FindPosReadyValid( //::::::::::::::::::::::::::::::::::
ZCChars(AP_CharOrigin, AL_OriginLen),
ZCChars(AP_CharSearch, AL_SearchLen),
RR(ARR_CStrReadyBuff) ,
ARRL_StartPos ,
ARRL_ValidReady ,
ARRL_ValidLen
/*:::::::::*/ ); //:::::::::::::::::::::::::::::::::::::::::::
}/*
template<typename TString> static bool FindPosReadyValid( ////////
TypeCharC* AP_CharOrigin ,
TypeCharC* AP_CharSearch ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TString& ARR_CStrReadyBuff,
TypeLength& ARRL_StartPos ,
TypeLength& ARRL_ValidReady , // ARR_CStrReadyBuff 의 유효길이
TypeLength& ARRL_ValidLen
////////////// ) ///////////////////////////////////////////////*/
static TypeLength GetFindCnt(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLen, TypeLength AL_SearchLen )
{
const bool CB_IsBad =
(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen<AL_SearchLen) ;
if(CB_IsBad) return 0;
TypeLength VL_SearchOffset=0;
TypeLength VL_SearchCount =0;
__for0(TypeLength, i, AL_OriginLen)
{
if(APC_Origin[i]==APC_Search[VL_SearchOffset])
{
if(++VL_SearchOffset==AL_SearchLen)
{
++VL_SearchCount; VL_SearchOffset=0;
}/*
/////////////////////////////////*/
}
else VL_SearchOffset=0;
}/*
__for0(TypeLength, i, AL_OriginLen)*/
return VL_SearchCount;
}/*
static TypeLength GetFindCnt(
TypeCharC* APC_Origin , TypeCharC* APC_Search,
TypeLength AL_OriginLen, TypeLength AL_SearchLen )*/
template<typename TTyChars> static TypeLength GetFindCnt(
const TTyChars& AR_CCharsOrigin, const TTyChars& APC_CCharsSearch)
{
return ZtCMainChars::GetFindCnt(
AR_CCharsOrigin.data(), APC_CCharsSearch.data(),
AR_CCharsOrigin.size(), APC_CCharsSearch.size() ) ;
}/*
template<typename TTyChars> static TypeLength GetFindCnt(
const TTyChars& AR_CCharsOrigin, const TTyChars& APC_CCharsSearch) */
/*//////////////////////////////////////////////////////////////////////////////
■ APC_Origin 이 APC_Search+AL_SearchOffset 으로 시작하는지를 판단한다.
AL_OriginLen<AL_SearchLen-AL_SearchOffset 이면 APC_Search+AL_SearchOffset
의 앞에서 부터 찾은 길이를 반환한다. 한 버퍼에 들어있지 않은 2 개의 문자열이
논리적으로 연속된 문자열로 간주했을 때, 특정 문자열로 시작하는지를 판단할 때
필요하다.
//////////////////////////////////////////////////////////////////////////////*/
static TypeLength GetStartLength /*#############################*/
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen,
TypeLength AL_SearchLen,
TypeLength AL_SearchOffset=0
)
/*##############################################################*/
{
const bool CB_IsBad =
(AL_OriginLen<1 || AL_SearchLen<1 || AL_SearchLen-AL_SearchOffset<1) ;
if(CB_IsBad) return 0;
if(AL_OriginLen<AL_SearchLen-AL_SearchOffset)
{
const bool CB_IsOK = ZtCMainChars::DoStart
(
APC_Origin, APC_Search+AL_SearchOffset,
AL_OriginLen, AL_OriginLen
);
//////////////////////////////////////////
if(CB_IsOK==false){return 0;} return AL_OriginLen;
}/*
if(AL_OriginLen<AL_SearchLen-AL_SearchOffset)*/
const bool CB_IsOK = ZtCMainChars::DoStart
(
APC_Origin, APC_Search +AL_SearchOffset,
AL_OriginLen, AL_SearchLen-AL_SearchOffset
);
//////////////////////////////////////////
if(CB_IsOK==false){return 0;} return AL_SearchLen-AL_SearchOffset;
}/*
TypeLength GetStartLength ########################################
(
TypeCharC* APC_Origin ,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen,
TypeLength AL_SearchLen,
TypeLength AL_SearchOffset=0
)
################################################################*/
template<typename TTyChars> static TypeLength GetStartLength(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TypeLength AL_SearchOffset=0)
{
return ZtCMainChars::GetStartLength(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.size(), AL_SearchOffset);
}/*
template<typename TTyChars> static TypeLength GetStartLength(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TypeLength AL_SearchOffset=0) */
template<typename TFunctor> static void SplitEach( ///////////////
TFunctor AO_Functor ,
TypeCharC* APC_OriginChar ,
TypeCharC* APC_SearchChar ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
bool AB_DoExecNull=true // 구분 문자로 잘린 문자열 길이가 0 인 경우에도 펑크터를 수행한다.
/*//////////*/ ) ///////////////////////////////////////////////*/
{
if(AL_OriginLen<1 || AL_OriginLen<AL_SearchLen) return;
int VI_SearchCount=0; // AO_Functor() 에게 찾은 번호를 전달하기 위한 변수
if(AL_SearchLen<1)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(APC_OriginChar, AL_OriginLen, ++VI_SearchCount);
return; ////////////////////////////////////
}/*
if(AL_SearchLen<1)*/
TypeLength VL_Loop =AL_OriginLen-AL_SearchLen;
TypeLength VL_Index =0 ;
TypeLength VL_CopyStartPos=0 ;
while(VL_Index<=VL_Loop)
{
TypeLength j;
for(j=0; j<AL_SearchLen; ++j)
{
if(APC_OriginChar[VL_Index+j]!=APC_SearchChar[j]) break;
}/*
for(j=0; j<AL_SearchLen; ++j)*/
if(j!=AL_SearchLen) // 찾지 못했다면...
{
++VL_Index; continue;
}/*
if(j!=AL_SearchLen)*/
// 찾았다면...
if(VL_Index>VL_CopyStartPos)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
APC_OriginChar+VL_CopyStartPos ,
VL_Index -VL_CopyStartPos ,
++VI_SearchCount
) ;
////////////////////////////////////////////
}
else if(AB_DoExecNull==true)
{
ZtCTypeData<TFunctor>::GetObjRef
(AO_Functor)(0, 0, ++VI_SearchCount) ;
}/*
else if(AB_DoExecNull==true)*/
VL_CopyStartPos=VL_Index+=AL_SearchLen;
}/*
while(VL_Index<=VL_Loop)*/
if(VL_CopyStartPos>=AL_OriginLen) return;
if(VI_SearchCount==0 && VL_CopyStartPos==0)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(APC_OriginChar, AL_OriginLen, ++VI_SearchCount) ;
}
else
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
APC_OriginChar+VL_CopyStartPos ,
AL_OriginLen -VL_CopyStartPos ,
++VI_SearchCount
) ;
////////////////////////////////////////////
}/*
else*/
}/*
template<typename TFunctor> static void SplitEach( ///////////////
TFunctor AO_Functor ,
TypeCharC* APC_OriginChar ,
TypeCharC* APC_SearchChar ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
bool AB_DoExecNull=true
////////////// ) ///////////////////////////////////////////////*/
template<typename TFunctor, typename TTyChars> static void SplitEach(
TFunctor AO_Functor, const TTyChars& AR_CCharsOrigin , const TTyChars& AR_CCharsSearch, bool AB_DoExecNull=true)
{
ZtCMainChars::template SplitEach<TFunctor, TTyChars>( /////////
AO_Functor,
AR_CCharsOrigin.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(),
AB_DoExecNull
/*/////////*/ ); //////////////////////////////////////////////
}/*
template<typename TFunctor, typename TTyChars> static void SplitEach(
TFunctor AO_Functor, const TTyChars& AR_CCharsOrigin , const TTyChars& AR_CCharsSearch, bool AB_DoExecNull=true) */
template<typename TString> static bool SplitTwo( /////////////////
TypeCharC* APC_OriginChar ,
TypeCharC* APC_SearchChar ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TString& ARR_CString1 ,
TString& ARR_CString2
/*//////////*/ ) ///////////////////////////////////////////////*/
{
TypeLength VL_FindPos=ZtCMainChars::
FindPos(APC_OriginChar, APC_SearchChar, AL_OriginLen, AL_SearchLen);
if(VL_FindPos<0) return false;
ARR_CString1(APC_OriginChar, VL_FindPos);
ARR_CString2(
APC_OriginChar+VL_FindPos+AL_SearchLen,
AL_OriginLen -VL_FindPos-AL_SearchLen );
return true;
}/*
template<typename TString> static bool SplitTwo( /////////////////
TypeCharC* APC_OriginChar ,
TypeCharC* APC_SearchChar ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TString& ARR_CString1 ,
TString& ARR_CString2
////////////// ) ///////////////////////////////////////////////*/
template<typename TTyChars, typename TString> static bool SplitTwo(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TString& ARR_CString1, TString& ARR_CString2)
{
return ZtCMainChars::SplitTwo(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.size(), RR(ARR_CString1), RR(ARR_CString2));
}/*
template<typename TTyChars, typename TString> static bool SplitTwo(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, TString& ARR_CString1, TString& ARR_CString2) */
template<typename TStringList> static TStringList& SplitToList( /*######*/
TStringList& ARR_SaveList ,
TypeCharC* APC_OriginChar,
TypeCharC* APC_SearchChar,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false,
bool AB_DoAppendEmpty =false
/*############*/ ) /*###################################################*/
{
/*//////////////////////////////////////////////////////////////////////////
■ AB_DoEndWhenNoMatch==true 이면 구분문자열을 하나도 찾지 못한 경우
전체 원본 문자열 APC_OriginChar 을 ARR_SaveList 에 저장하지 않고 종료한다.
■ 연속된 APC_SearchChar 사이에 다른 문자가 없어도
비어 있는 TString object 를 ARR_SaveList 에 저장한다.
//////////////////////////////////////////////////////////////////////////*/
if(AL_OriginLen<1 || AL_OriginLen<AL_SearchLen)
{
return ARR_SaveList;
}/*
if(AL_OriginLen<1 || AL_OriginLen<AL_SearchLen)*/
TypeLength VL_PrevSize =ARR_SaveList.size();
TypeLength VL_Loop =AL_OriginLen-AL_SearchLen;
TypeLength VL_Index =0 ;
TypeLength VL_CopyStartPos=0 ;
typedef typename TStringList::TypeData CStringData;
while(VL_Index<=VL_Loop)
{
TypeLength j=0;
for(; j<AL_SearchLen; ++j)
{
if( APC_OriginChar[VL_Index+j] != APC_SearchChar[j] )
{ break; }
/*=================================================*/
}/*
for(; j<AL_SearchLen; ++j)*/
if(j!=AL_SearchLen){ ++VL_Index; continue; } // 찾지 못했다면
// 찾았다면...
if(VL_Index>VL_CopyStartPos)
{
if(AB_DoAppendEachLink==true)
{
((CStringData&)ARR_SaveList).append
(APC_OriginChar+VL_CopyStartPos, VL_Index-VL_CopyStartPos) ;
}
else
{ ((CStringData&)ARR_SaveList).Invalidate().append
(APC_OriginChar+VL_CopyStartPos, VL_Index-VL_CopyStartPos) ;
}/*
else*/
}
else if(AB_DoAppendEmpty==true)
{
(CStringData&)ARR_SaveList;
}/*
else if(AB_DoAppendEmpty==true)*/
VL_CopyStartPos=VL_Index+=AL_SearchLen;
}/*
while(VL_Index<=VL_Loop)*/
if(VL_CopyStartPos>=AL_OriginLen)
{
return ARR_SaveList;
}/*
if(VL_CopyStartPos>=AL_OriginLen)*/
if(VL_PrevSize<ARR_SaveList.size() || AB_DoEndWhenNoMatch==false)
{
if(AB_DoAppendEachLink==true)
{
((CStringData&)ARR_SaveList).append
(APC_OriginChar+VL_CopyStartPos, AL_OriginLen-VL_CopyStartPos) ;
}
else
{ ((CStringData&)ARR_SaveList).Invalidate().append
(APC_OriginChar+VL_CopyStartPos, AL_OriginLen-VL_CopyStartPos) ;
}/*
else*/
}/*
if(VL_PrevSize<ARR_SaveList.size() || AB_DoEndWhenNoMatch==false)*/
return ARR_SaveList;
}/*
template<typename TStringList> static TStringList& SplitToList( ##########
TStringList& ARR_SaveList ,
TypeCharC* APC_OriginChar,
TypeCharC* APC_SearchChar,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false,
bool AB_DoAppendEmpty =false
################# ) ####################################################*/
template<
typename TTyChars, typename TStringList> /*#########################*/
static TStringList& SplitToList
(
TStringList& ARR_SaveList ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false,
bool AB_DoAppendEmpty =false
)
/*######################################################################*/
{
return ZtCMainChars::SplitToList(
RR(ARR_SaveList),
AR_CCharsOrigin.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(),
AB_DoEndWhenNoMatch , AB_DoAppendEachLink , AB_DoAppendEmpty
/*//////////*/ );
}/*
template<
typename TTyChars, typename TStringList>
static TStringList& SplitToList
(
TStringList& ARR_SaveList ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false,
bool AB_DoAppendEmpty =false
)
########################################################################*/
/*//////////////////////////////////////////////////////////////////////////
■ APC_SearchChar 로 APC_OriginChar 을 자르는데 자르는 단위의 문자열은
앞뒤에 APC_EscapeChar 으로 감쌀 수도 있다.
APC_EscapeChar 으로 감싸는 문자열 안에는 APC_SearchChar 이 들어갈 수 있다.
APC_EscapeChar 으로 감싸는 문자열 안에는 APC_EscapeChar 문자열이 짝수개가 나와야 한다.
APC_SearchChar 이 "," 이고 APC_EscapeChar 가 "\"" 이라면
문자열 1,2,"My, Data=""Love""",10 은 아래 4 개로 나뉘어 진다.
1
2
My, Data=""Love""
10
■ --
//////////////////////////////////////////////////////////////////////*/
template<typename TStringList> static TStringList& SplitToListWrap /////
(
TStringList& ARR_SaveList ,
TypeCharC* APC_OriginChar ,
TypeCharC* APC_SearchChar ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false
)
/*######################################################################*/
{
// AB_DoEndWhenNoMatch==true 이면 구분 문자열을 하나도 찾지 못한 경우
// 전체 원본 문자열 APC_OriginChar 을 ARR_SaveList 에 저장하지 않고 종료한다.
if(AL_WrapStartLen<1 && AL_WrapCloseLen<1)
{
ZtCMainChars::SplitToList
(
ARR_SaveList ,
APC_OriginChar ,
APC_SearchChar ,
AL_OriginLen ,
AL_SearchLen ,
AB_DoEndWhenNoMatch ,
AB_DoAppendEachLink
);
return ARR_SaveList; ////////
}
if(AL_OriginLen<1 || AL_OriginLen<AL_SearchLen)
{
return ARR_SaveList;
}
/*///////////////////////////////////////////*/
TypeLength VL_PrevSize =ARR_SaveList.size();
TypeLength VL_SearchPos=0;
TypeLength VL_SearchLen=0;
TypeLength VL_FindPos =0;
TypeLength VL_WrapLen =0;
while(VL_SearchPos<AL_OriginLen)
{
VL_SearchLen += ZtCMainChars::GetWrapLen
(
APC_OriginChar+VL_SearchPos, APC_WrapStart , APC_WrapClose,
AL_OriginLen -VL_SearchPos, AL_WrapStartLen, AL_WrapCloseLen
);
VL_FindPos = ZtCMainChars::FindPos
(
APC_OriginChar, APC_SearchChar, AL_OriginLen,
AL_SearchLen , VL_SearchPos+VL_SearchLen
) ;
/////////////////////////////////////////////////////
if(VL_FindPos<1)
{
VL_SearchLen=AL_OriginLen-VL_SearchPos;
if(VL_SearchLen>0 && ( VL_PrevSize<ARR_SaveList.size() || AB_DoEndWhenNoMatch==false ) )
{
if(AB_DoAppendEachLink==true)
{
ARR_SaveList.AddTailDef()->GetData().
append(APC_OriginChar+VL_SearchPos, VL_SearchLen) ;
}
else
{
ARR_SaveList.AddTailDef()->GetData().Invalidate().
append(APC_OriginChar+VL_SearchPos, VL_SearchLen) ;
}/*
else*/
}/*
if(VL_SearchLen>0 && ( VL_PrevSize<ARR_SaveList.size() || AB_DoEndWhenNoMatch==false ) )*/
return ARR_SaveList;
}/*
if(VL_FindPos<1)*/
VL_SearchLen=VL_FindPos-VL_SearchPos;
if(VL_SearchLen>0)
{
if(AB_DoAppendEachLink==true)
{
ARR_SaveList.AddTailDef()->GetData().
append(APC_OriginChar+VL_SearchPos, VL_SearchLen) ;
}else{
ARR_SaveList.AddTailDef()->GetData().Invalidate().
append(APC_OriginChar+VL_SearchPos, VL_SearchLen) ;
}
}/*
if(VL_SearchLen>0)*/
VL_SearchLen=0;
VL_SearchPos=VL_FindPos+AL_SearchLen;
}/*
while(VL_SearchPos<AL_OriginLen)*/
return ARR_SaveList;
}/*
template<typename TStringList> static TStringList& SplitToListWrap ///////
(
TStringList& ARR_SaveList ,
TypeCharC* APC_OriginChar ,
TypeCharC* APC_SearchChar ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false
)
########################################################################*/
template<typename TStringList, typename TTyChars> ////////////////////////
static TStringList& SplitToListWrap(
TStringList& ARR_SaveList ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
const TTyChars& AR_CCharsWrapStart,
const TTyChars& AR_CCharsWrapClose,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false
/*//////////*/ ) ///////////////////////////////////////////////////////*/
{
return ZtCMainChars::SplitToListWrap(
ARR_SaveList,
AR_CCharsOrigin.data(), AR_CCharsSearch.data(), AR_CCharsWrapStart.data(), AR_CCharsWrapClose.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(), AR_CCharsWrapStart.size(), AR_CCharsWrapClose.size(),
AB_DoEndWhenNoMatch, AB_DoAppendEachLink
/*//////////*/ );
}/*
template<typename TStringList, typename TTyChars> ////////////////////////
static TStringList& SplitToListWrap(
TStringList& ARR_SaveList ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsSearch ,
const TTyChars& AR_CCharsWrapStart,
const TTyChars& AR_CCharsWrapClose,
bool AB_DoEndWhenNoMatch=true ,
bool AB_DoAppendEachLink=false
////////////// ) ///////////////////////////////////////////////////////*/
template<typename TStringList, typename TStringArray> ////////////
static TStringList& SplitToListWrap2(
TStringList& ARR_CStrListSave,
TypeCharC* APC_Origin ,
TypeCharC* APC_Escape ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
TStringArray& ARA_SearchArray
/*//////////*/ ) ///////////////////////////////////////////////*/
{
typedef typename
TStringList::TypeData CStringData;
CStringData* VP_CStringStart=0;
long VL_SearchPos= 0 ;
long VL_FindPos =-1 ;
long VL_PrevSize =ARR_CStrListSave.size();
while(VL_SearchPos<AL_OriginLen)
{
VL_FindPos = ZtCMainChars::FindPosEscWrap
(
APC_Origin+VL_SearchPos ,
APC_Escape ,
APC_WrapStart ,
APC_WrapClose ,
AL_OriginLen-VL_SearchPos,
AL_EscapeLen ,
AL_WrapStartLen ,
AL_WrapCloseLen ,
ARA_SearchArray ,
RR(VP_CStringStart)
);
/////////////////////////////////////////
if(VL_FindPos<0)
{
if(ARR_CStrListSave.size()>VL_PrevSize)
{
ARR_CStrListSave.AddTailDef()->GetData().
append(APC_Origin+VL_SearchPos, AL_OriginLen-VL_SearchPos) ;
}/*
if(ARR_CStrListSave.size()>VL_PrevSize)*/
return ARR_CStrListSave;
}/*
if(VL_FindPos<0)*/
if(VL_FindPos>0)
{
ARR_CStrListSave.AddTailDef()->GetData()(APC_Origin+VL_SearchPos, VL_FindPos);
ARR_CStrListSave.AddTailDef()->GetData()=(*VP_CStringStart);
}/*
if(VL_FindPos>0)*/
VL_SearchPos += VL_FindPos + VP_CStringStart->size();
}/*
while(VL_SearchPos<AL_OriginLen)*/
return ARR_CStrListSave;
}/*
template<typename TStringList, typename TStringArray> ////////////
static TStringList& SplitToListWrap2(
TStringList& ARR_CStrListSave,
TypeCharC* APC_Origin ,
TypeCharC* APC_Escape ,
TypeCharC* APC_WrapStart ,
TypeCharC* APC_WrapClose ,
TypeLength AL_OriginLen ,
TypeLength AL_EscapeLen ,
TypeLength AL_WrapStartLen ,
TypeLength AL_WrapCloseLen ,
TStringArray& ARA_SearchArray
////////////// ) ///////////////////////////////////////////////*/
template<typename TStringList, typename TTyChars, typename TStringArray>
TStringList& SplitToListWrap2(
TStringList& ARR_CStrListSave ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsEscape ,
const TTyChars& AR_CCharsWrapStart,
const TTyChars& AR_CCharsWrapClose,
TStringArray& ARA_SearchArray
/*//////////*/ ) ///////////////////////////////////////////////////*/
{
return ZtCMainChars::SplitToListWrap2(
RR(ARR_CStrListSave),
AR_CCharsOrigin.data(), AR_CCharsEscape.data(), AR_CCharsWrapStart.data(), AR_CCharsWrapClose.data(),
AR_CCharsOrigin.size(), AR_CCharsEscape.size(), AR_CCharsWrapStart.size(), AR_CCharsWrapClose.size(),
ARA_SearchArray
/*//////////*/ );
}/*
template<typename TStringList, typename TTyChars, typename TStringArray>
TStringList& SplitToListWrap2(
TStringList& ARR_CStrListSave ,
const TTyChars& AR_CCharsOrigin ,
const TTyChars& AR_CCharsEscape ,
const TTyChars& AR_CCharsWrapStart,
const TTyChars& AR_CCharsWrapClose,
TStringArray& ARA_SearchArray
////////////// ) ///////////////////////////////////////////////////*/
/* APC_OriginChar 에서 APC_Search 을 찾았으면 찾은 정보를
TSearchInfoList 에 입력한다. TSearchPosList 는 정수 컨테이너이다. */
template<typename TSearchPosList> static void MakeInfoList(
TypeCharC* APC_OriginChar,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_StartPos ,
TSearchPosList& ARR_InfoList
/*//////////*/ ) ////////////////////////////////////////*/
{
if(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen<AL_SearchLen)
{
return ;
}/*
if(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen<AL_SearchLen)*/
TypeCharC* VP_Origin=APC_OriginChar;
TypeLength VL_Loop =AL_OriginLen-AL_SearchLen ;
TypeLength i =AL_StartPos ;
while(i<=VL_Loop)
{
TypeLength j=0;
for(; j<AL_SearchLen; ++j)
{
if(VP_Origin[i+j]!=APC_Search[j]) break;
}/*
for(; j<AL_SearchLen; ++j)*/
if(j!=AL_SearchLen) // 찾지 못했으면
{
++i; continue;
}/*
if(j!=AL_SearchLen)*/
// 찾았으면...
ARR_InfoList.push_back(i); i += AL_SearchLen ;
}/*
while(i<=VL_Loop)*/
}/*
template<typename TSearchPosList> static void MakeInfoList(
TypeCharC* APC_OriginChar,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_StartPos ,
TSearchPosList& ARR_InfoList
////////////// ) ////////////////////////////////////////*/
template<typename TTyChars, typename TSearchPosList> static void MakeInfoList
(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch,
TypeLength AL_StartPos , TSearchPosList& ARR_InfoList
)
/////////////////////////////////////////////////////////////////////////////
{
ZtCMainChars::MakeInfoList(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(),
AL_StartPos, RR(ARR_InfoList)
/*//////////*/ );
}/*
template<typename TTyChars, typename TSearchPosList> static void MakeInfoList
(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch,
TypeLength AL_StartPos , TSearchPosList& ARR_InfoList
)
///////////////////////////////////////////////////////////////////////////*/
/*/////////////////////////////////////////////////////////////////////////
■ TSearchInfo 클래스는 (const TypeChar* StartPos, long Pos, long Length) 의
인수를 갖는 생성자를 가져야 한다.
■ void MakeInfoList 함수와는 달리 APC_Search 문자열로 나뉘어지는 각 구간의
문자열 정보 리스트를 얻는다.
/////////////////////////////////////////////////////////////////////////*/
template<typename TSearchInfoList> static void MakeSplitInfoList(
TypeCharC* APC_OriginChar,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_StartPos ,
TSearchInfoList& ARR_InfoList
/*//////////*/ ) //////////////////////////////////////////////*/
{
typedef typename TSearchInfoList::TypeData ZCSearchInfo;
if(AL_OriginLen<1 || AL_SearchLen<1) return ;
TypeCharC* VP_Origin=APC_OriginChar ;
TypeLength i =AL_StartPos;
TypeLength VL_PrevPos=AL_StartPos;
TypeLength VL_Loop =AL_OriginLen-AL_SearchLen ;
while(i<=VL_Loop)
{
TypeLength j=0;
for(; j<AL_SearchLen; ++j)
{
if(VP_Origin[i+j]!=APC_Search[j]) break;
}/*
for(; j<AL_SearchLen; ++j)*/
if(j!=AL_SearchLen) // 찾지 못했으면
{
++i; continue;
}/*
if(j!=AL_SearchLen)*/
// 찾았으면
if(i-VL_PrevPos>0)
{
ZCSearchInfo VO_CSearchInfo(
VP_Origin+VL_PrevPos, VL_PrevPos, i-VL_PrevPos);
ARR_InfoList.push_back(VO_CSearchInfo);
}/*
if(i-VL_PrevPos>0)*/
VL_PrevPos = i += AL_SearchLen ;
}/*
while(i<=VL_Loop)*/
if(VL_PrevPos<AL_OriginLen)
{
ZCSearchInfo VO_CSearchInfo(
VP_Origin+VL_PrevPos, VL_PrevPos, AL_OriginLen-VL_PrevPos);
ARR_InfoList.push_back(VO_CSearchInfo);
}/*
if(VL_PrevPos<AL_OriginLen)*/
}/*
template<typename TSearchInfoList> static void MakeSplitInfoList(
TypeCharC* APC_OriginChar,
TypeCharC* APC_Search ,
TypeLength AL_OriginLen ,
TypeLength AL_SearchLen ,
TypeLength AL_StartPos ,
TSearchInfoList& ARR_InfoList
////////////// ) //////////////////////////////////////////////*/
template<typename TTyChars, typename TSearchInfoList> static void MakeSplitInfoList
(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch,
TypeLength AL_StartPos , TSearchInfoList& ARR_InfoList
)
/////////////////////////////////////////////////////////////////////////////////*/
{
ZtCMainChars::MakeSplitInfoList(
AR_CCharsOrigin.data(), AR_CCharsSearch.data(),
AR_CCharsOrigin.size(), AR_CCharsSearch.size(),
AL_StartPos, RR(ARR_InfoList)
/*//////////*/ );
}/*
template<typename TTyChars, typename TSearchInfoList> static void MakeSplitInfoList
(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch,
TypeLength AL_StartPos , TSearchInfoList& ARR_InfoList
)
/////////////////////////////////////////////////////////////////////////////////*/
// APC_Search 문자열을 찾아서, 있으면 그 문자열 길이까지 구한다.
static TypeLength GetLength_Find(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
/*//////////*/ )
{
if(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen<AL_SearchLen)
return 0;
/////////////////////////////////////////////////////////////////
// 현재 AL_OriginLen>=AL_SearchLen
TypeLength j=0;
TypeLength VL_MaxLoop=AL_OriginLen-AL_SearchLen;
TypeCharC* VP_Origin =APC_Origin;
TypeCharC* VP_Left ;
TypeCharC* VP_Right;
for(TypeLength i=0; i<=VL_MaxLoop; ++i)
{
VP_Left =VP_Origin;
VP_Right=APC_Search ;
for(j=0; j<AL_SearchLen; ++j)
{
if(*VP_Left++ != *VP_Right++) break;
}
/*/////////////////////////*/
if(j>=AL_SearchLen) return i+AL_SearchLen;
++VP_Origin; /////////////////////////////
}/*
for(TypeLength i=0; i<=VL_MaxLoop; ++i)*/
return 0;
}/*
static TypeLength GetLength_Find(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
////////////// ) */
template<typename TTyChars> static TypeLength
GetLength_Find(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch)
{
return ZtCMainChars::GetLength_Find(
CCharsOrigin.data(), CCharsOrigin.size(),
CCharsSearch.data(), CCharsSearch.size()
/*//////////*/ );
}/*
template<typename TTyChars> static TypeLength
GetLength_Find(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch) */
/* ARA_SearchArray 의 앞 원소인 문자열부터 찾기 시작하므로,
먼저 찾아야 하는 문자열은 ARA_SearchArray 의 앞에 있는 것이 좋다. */
template<typename TStringArray> static TypeLength GetLength_Find2(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray)
{
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize;
if(VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_NowSize = ZtCMainChars::GetLength_Find
(
APC_Origin, AL_OriginLen,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
/////////////////////////////////////////
if(VL_NowSize>0) return VL_NowSize;
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return 0;
}/*
template<typename TStringArray> static TypeLength GetLength_Find2(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray) */
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Find2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_Find2(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Find2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
// APC_Search 문자열의 문자 중에 하나라도 일치하면 그 길이까지 구해온다.
static TypeLength GetLength_FindChar(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
/*//////////*/ )
{
if(AL_OriginLen<1 || AL_SearchLen<1) return 0;
TypeLength j =0 ;
TypeCharC* VP_Origin =APC_Origin;
TypeCharC* VP_Left =0 ;
TypeCharC* VP_Right =0 ;
for(TypeLength i=0; i<AL_OriginLen; ++i)
{
VP_Left = VP_Origin ;
VP_Right = APC_Search ;
// 문자를 찾았으면 찾은 위치 i 에 찾은 문자 길이 1 을 더해서 리턴한다.
for(j=0; j<AL_SearchLen; ++j)
{
if(*VP_Left++ == *VP_Right++) return i+1;
}
/*/////////////////////////*/
++VP_Origin;
}/*
for(TypeLength i=0; i<AL_OriginLen; ++i)*/
return 0;
}/*
static TypeLength GetLength_FindChar(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
////////////// ) */
template<typename TTyChars>
static TypeLength GetLength_FindChar(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch)
{
return ZtCMainChars::GetLength_FindChar(
CCharsOrigin.data(), CCharsOrigin.size(),
CCharsSearch.data(), CCharsSearch.size()
/*//////////*/ );
}/*
template<typename TTyChars>
static TypeLength GetLength_FindChar(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch) */
template<typename TStringArray> static TypeLength GetLength_FindChar2(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray)
{
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize=0;
TypeLength VL_SumSize=0;
if(VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SumSize += VL_NowSize=ZtCMainChars::GetLength_FindChar
(
APC_Origin +VL_SumSize ,
AL_OriginLen-VL_SumSize ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
/////////////////////////////////////////////////////////
if(VL_NowSize<1) return 0;
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_NowSize;
}/*
template<typename TStringArray> static TypeLength GetLength_FindChar2(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray) */
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindChar2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_FindChar2(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindChar2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
/* APC_Search 문자열을 찾아서, 있으면 그 문자열 길이까지 구한다.
단 찾는 문자열 앞에 APC_Escape 문자열이 없어야 한다. */
static TypeLength GetLength_FindEscape
(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen,
TypeCharC* APC_Escape, TypeLength AL_EscapeLen
)
//////////////////////////////////////
{
if(AL_EscapeLen<1) return ZtCMainChars::
GetLength_Find(APC_Origin, AL_OriginLen, APC_Search,AL_SearchLen);
if(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen<AL_SearchLen)
{ return 0; }
/////////////////////////////////////////////////////////////////
TypeCharC* VP_Origin =APC_Origin;
TypeLength i =0;
TypeLength VL_MaxLoop =AL_OriginLen-AL_SearchLen;
bool VB_DoEscape=false;
while(i<=VL_MaxLoop)
{
// VP_Origin 이 APC_Escape 문자열로 시작하는지 조사한다.
if(VB_DoEscape==false)
{
VB_DoEscape = ZtCMainChars::DoStart(
VP_Origin, APC_Escape, AL_OriginLen-i, AL_EscapeLen );
if(VB_DoEscape==true)
{
VP_Origin+=AL_EscapeLen;
i +=AL_EscapeLen;
}/*
if(VB_DoEscape==true)*/
}/*
if(VB_DoEscape==false)*/
if(ZtCMainChars::DoStart(VP_Origin, APC_Search, AL_OriginLen-i, AL_SearchLen)==false)
{
VB_DoEscape=false; ++VP_Origin; ++i; continue;
}/*
if(ZtCMainChars::DoStart(VP_Origin, APC_Search, AL_OriginLen-i, AL_SearchLen)==false)*/
// 찾은 경우
if(VB_DoEscape==false)
{ return i+AL_SearchLen; }
// 찾았는데 APC_Escape 문자열로 시작하는 경우
VB_DoEscape=false; VP_Origin++; i++;
}/*
while(i<=VL_MaxLoop)*/
return 0;
}/*
static TypeLength GetLength_FindEscape
(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen,
TypeCharC* APC_Escape, TypeLength AL_EscapeLen
)
////////////////////////////////////*/
template<typename TTyChars> static TypeLength GetLength_FindEscape(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, const TTyChars& AR_CCharsEscape)
{
return ZtCMainChars::GetLength_FindEscape
(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(),
AR_CCharsSearch.data(), AR_CCharsSearch.size(),
AR_CCharsEscape.data(), AR_CCharsEscape.size()
) ;
/////////////////////////////////////////
}/*
template<typename TTyChars> static TypeLength GetLength_FindEscape(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch, const TTyChars& AR_CCharsEscape) */
template<typename TStringArray> static TypeLength GetLength_FindEscape2
(
TypeCharC* APC_Origin ,
TypeLength AL_OriginLen, const
TStringArray& ARA_SearchArray
)
///////////////////////////////////////////////////////////////////////
{
/* ARA_SearchArray 의 첫번째 원소를 escape 문자열로 쓴다.
따라서 ARA_SearchArray 의 배열 갯수는 2 이상이어야 한다. */
const int CI_MinArrSize=2;
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize ;
if(VL_ArrSize<CI_MinArrSize) return 0;
IterEasyIDc VI_IterEasyEsc(ARA_SearchArray.GetHeadIterEasyID());
IterEasyIDc CI_IterEasyID (ARA_SearchArray.GetHeadIterEasyID());
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
for(TypeLength i=1; i<VL_ArrSize; ++i)
{
VL_NowSize = ZtCMainChars::GetLength_FindEscape
(
APC_Origin ,
AL_OriginLen ,
ARA_SearchArray.ItD(CI_IterEasyID ).data(),
ARA_SearchArray.ItD(CI_IterEasyID ).size(),
ARA_SearchArray.ItD(VI_IterEasyEsc).data(),
ARA_SearchArray.ItD(VI_IterEasyEsc).size()
);
///////////////////////////////////////////////
if(VL_NowSize>0) return VL_NowSize;
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=1; i<VL_ArrSize; ++i)*/
return 0;
}/*
template<typename TStringArray> static TypeLength GetLength_FindEscape2
(
TypeCharC* APC_Origin ,
TypeLength AL_OriginLen, const
TStringArray& ARA_SearchArray
)
/////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindEscape2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_FindEscape2(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindEscape2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
template<typename TStringArray> static TypeLength GetLength_FindSerial
(
TypeCharC* APC_Origin ,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
//////////////////////////////////////////////////////////////////////
{
/*//////////////////////////////////////////////////
■ ZtCMainChars::GetLength_Find() 함수를 이용하여,
ARA_SearchArray 의 1번 원소부터 순서대로 찾는다.
-- 2011-08-09 03:44:00
//////////////////////////////////////////////////*/
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize=0;
TypeLength VL_SumSize=0;
if(VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_NowSize=ZtCMainChars::GetLength_Find
(
APC_Origin+VL_SumSize ,
AL_Length -VL_SumSize ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
///////////////////////////////////////
if(VL_NowSize<1){return 0;} VL_SumSize += VL_NowSize;
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SumSize;
}/*
template<typename TStringArray> static TypeLength GetLength_FindSerial
(
TypeCharC* APC_Origin ,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindSerial(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_FindSerial(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindSerial(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
static TypeLength GetLength_FindSerialChar(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
/*//////////*/ )
{
// APC_Search 의 각 문자가 APC_Origin 에 순서대로 있어야 한다.
if(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen<AL_SearchLen)
return 0;
//endif
TypeLength VL_NowPos =0;
TypeLength VL_FindCnt =0;
TypeLength VL_SearchLen=AL_SearchLen;
TypeCharC* VP_Origin =APC_Origin;
TypeCharC* VP_Search =APC_Search;
for(TypeLength i=0; i<AL_OriginLen; ++i)
{
if(*VP_Origin++ == *VP_Search)
{
++VL_FindCnt; --VL_SearchLen; VL_NowPos=i+1; ++VP_Search;
}
/*//////////////////////////*/
if(VL_SearchLen<1) break;
}/*
for(TypeLength i=0; i<AL_OriginLen; ++i)*/
return VL_FindCnt<AL_SearchLen ? 0 : VL_NowPos ;
}/*
static TypeLength GetLength_FindSerialChar(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
////////////// ) */
template<typename TTyChars>
static TypeLength GetLength_FindSerialChar(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch)
{
return ZtCMainChars::GetLength_FindSerialChar(
CCharsOrigin.data(), CCharsOrigin.size(),
CCharsSearch.data(), CCharsSearch.size()
/*//////////*/ );
}/*
template<typename TTyChars>
static TypeLength GetLength_FindSerialChar(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch) */
template<typename TStringArray> static TypeLength GetLength_FindSerialChar2(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray)
{
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize=0;
TypeLength VL_SumSize=0;
if(VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SumSize += VL_NowSize=ZtCMainChars::GetLength_FindSerialChar
(
APC_Origin +VL_SumSize ,
AL_OriginLen-VL_SumSize ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
///////////////////////////////////////////////////////////////
if(VL_NowSize<1) return 0;
ARA_SearchArray.
MoveNextIter( RR(CI_IterEasyID) );
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SumSize;
}/*
template<typename TStringArray> static TypeLength GetLength_FindSerialChar2(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray) */
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindSerialChar2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_FindSerialChar2(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_FindSerialChar2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
template<typename TStringArray> static TypeLength GetLength_StartFind
(
TypeCharC* APC_Origin ,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
/*#################################################################*/
{
/*//////////////////////////////////////////////////
■ ARA_SearchArray 의 1번 원소부터 시작하면, 그 다음부터는
ZtCMainChars::GetLength_Find() 함수를 이용하여,
ARA_SearchArray 의 2번 원소부터 순서대로 찾는다.
-- 2011-08-09 04:19:00
//////////////////////////////////////////////////*/
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize=0;
TypeLength VL_SumSize=0;
if(VL_ArrSize<2) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
const bool CB_IsOK = ZtCMainChars::DoStart
(
APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(),
AL_Length , ARA_SearchArray.ItD(CI_IterEasyID).size()
);
//////////////////////////////////////////
if(!CB_IsOK) return 0;
VL_SumSize=ARA_SearchArray.ItD(CI_IterEasyID).size();
ARA_SearchArray.MoveNextIter( RR(CI_IterEasyID) );
for(TypeLength i=1; i<VL_ArrSize; ++i) // VL_ArrSize-1 번 순환.
{
VL_NowSize=ZtCMainChars::GetLength_Find
(
APC_Origin+VL_SumSize, AL_Length-VL_SumSize,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
///////////////////////////////////////
if(VL_NowSize<1){return 0;} VL_SumSize+=VL_NowSize;
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=1; i<VL_ArrSize; ++i)*/
return VL_SumSize;
}/*
template<typename TStringArray> static TypeLength GetLength_StartFind
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
) */
/*#################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_StartFind(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_StartFind(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_StartFind(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
// GetLength_FindSerialChar() 와 비슷하나, 1 번 원소의 1 번 문자로 시작해야 하는 점이 다르다.
static TypeLength GetLength_StartFindChar
(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
)
/////////////////////////////////////////
{
// APC_Search 의 각 문자가 APC_Origin 에 순서대로 있어야 한다.
const bool CB_IsBad =
(
AL_OriginLen<1 || AL_SearchLen<1 ||
AL_OriginLen<AL_SearchLen
);
if(CB_IsBad) {return 0;}
TypeLength VL_NowPos =0 ;
TypeLength VL_FindCnt =0 ;
TypeLength VL_SearchLen=AL_SearchLen;
TypeCharC* VP_Origin =APC_Origin ;
TypeCharC* VP_Search =APC_Search ;
// 첫번째 문자로 시작하지 않으면 바로 리턴한다.
if(*APC_Origin++ != *APC_Search) return 0;
++VL_FindCnt; --VL_SearchLen; ++VP_Search; VL_NowPos=1;
for(TypeLength i=1; i<AL_OriginLen; ++i) // AL_OriginLen-1 번 순환.
{
if(*VP_Origin++ == *VP_Search)
{
++VL_FindCnt; --VL_SearchLen; VL_NowPos=i+1; ++VP_Search;
}
/*//////////////////////////*/
if(VL_SearchLen<1) break;
}/*
for(TypeLength i=1; i<AL_OriginLen; ++i)*/
return VL_FindCnt<AL_SearchLen ? 0 : VL_NowPos ;
}/*
static TypeLength GetLength_StartFindChar
(
TypeCharC* APC_Origin, TypeLength AL_OriginLen,
TypeCharC* APC_Search, TypeLength AL_SearchLen
)
///////////////////////////////////////*/
template<typename TTyChars> static TypeLength
GetLength_StartFindChar(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch)
{
return ZtCMainChars::GetLength_StartFindChar(
CCharsOrigin.data(), CCharsOrigin.size(),
CCharsSearch.data(), CCharsSearch.size()
/*//////////*/ );
}/*
template<typename TTyChars> static TypeLength
GetLength_StartFindChar(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch) */
template<typename TStringArray> static TypeLength GetLength_StartFindChar2
(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray
)
//////////////////////////////////////////////////////////////////////////
{
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize=0;
TypeLength VL_SumSize=0;
if(VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SumSize += VL_NowSize=ZtCMainChars::GetLength_StartFindChar
(
APC_Origin +VL_SumSize ,
AL_OriginLen-VL_SumSize ,
ARA_SearchArray.ItD(CI_IterEasyID).data() ,
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
//////////////////////////////////////////////////////////////
if(VL_NowSize<1){return 0;} ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SumSize;
}/*
template<typename TStringArray> static TypeLength GetLength_StartFindChar2
(
TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray
)
////////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_StartFindChar2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_FindSerialChar2(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_StartFindChar2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
template<typename TStringArray> static TypeLength GetLength_Permit(
TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray)
{
TypeLength VL_ArrSize=ARA_SearchArray.size();
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
const bool CB_IsOK = ZtCMainChars::DoStart
(
APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(),
AL_Length , ARA_SearchArray.ItD(CI_IterEasyID).size()
);
//////////////////////////////////////////
if(CB_IsOK) return
ARA_SearchArray.ItD(CI_IterEasyID).size() ;
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return 0;
}/*
template<typename TStringArray> static TypeLength GetLength_Permit(
TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray) */
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Permit(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_Permit(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray) ;
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Permit(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
/*//////////////////////////////////////////////////////////////////////
■ TStringArray 배열(혹은 어떤 containter)의 각 홀수 번째 원소 이상이고
그 다음 원소 이하인 데이타를 구한다. 따라서 TStringArray 배열원소수/2
번 순환한다.
찾은 데이타의 길이는 길이가 작은 쪽을 반환한다. 예를 들어 어떤 데이타
가 "ab" 와 "def" 사이에 있다면 찾은 길이는 작은 쪽 "ab" 에 맞추어 2 로
한다.
//////////////////////////////////////////////////////////////////////*/
template<typename TStringArray> static TypeLength GetLength_PermitRange
(
TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray
)
///////////////////////////////////////////////////////////////////////
{
TypeLength VL_ArrSize=ARA_SearchArray.size()/2;
TypeLength VL_NowSize=0;
TypeLength VL_Result =0;
TypeLength i =0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(; i<VL_ArrSize; ++i)
{
if(ARA_SearchArray.ItD(CI_IterEasyID).size()>0)
{
VL_NowSize = ARA_SearchArray.ItD(CI_IterEasyID).size()>AL_Length ?
AL_Length : ARA_SearchArray.ItD(CI_IterEasyID).size() ;
if (VL_Result==0 ) VL_Result=VL_NowSize;
else if(VL_Result> VL_NowSize) VL_Result=VL_NowSize;
if(ZtCMainChars::Minus(APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(), VL_NowSize, ARA_SearchArray.ItD(CI_IterEasyID).size())<0)
{
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
continue; // 최소 범위를 벗어났다면
}/*
if(ZtCMainChars::Minus(APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(), VL_NowSize, ARA_SearchArray.ItD(CI_IterEasyID).size())<0)*/
}/*
if(ARA_SearchArray.ItD(CI_IterEasyID).size()>0)*/
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
if(ARA_SearchArray.ItD(CI_IterEasyID).size()>0)
{
VL_NowSize = ARA_SearchArray.ItD(CI_IterEasyID).size()>AL_Length ?
AL_Length : ARA_SearchArray.ItD(CI_IterEasyID).size() ;
if(VL_Result>VL_NowSize) VL_Result=VL_NowSize;
if(ZtCMainChars::Minus(APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(), VL_NowSize, ARA_SearchArray.ItD(CI_IterEasyID).size())>0)
{
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID)); continue; // 최대 범위를 벗어났다면
}/*
if(ZtCMainChars::Minus(APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(), VL_NowSize, ARA_SearchArray.ItD(CI_IterEasyID).size())>0)*/
break;
}/*
if(ARA_SearchArray.ItD(CI_IterEasyID).size()>0)*/
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(; i<VL_ArrSize; ++i)*/
if(i>=VL_ArrSize){return 0;} return VL_Result;
}/*
template<typename TStringArray> static TypeLength GetLength_PermitRange
(
TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray
)
/////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_PermitRange(const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_PermitRange(AR_CChars.data(), AR_CChars.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_PermitRange(const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray) */
static TypeLength GetLength_PermitChar
(
TypeCharC* APC_Origin, TypeLength AL_Length,
TypeCharC* APC_Permit, TypeLength AL_PermitLength
)
//////////////////////////////////////
{
if(AL_Length<1 || AL_PermitLength<1) return 0;
TypeCharC* VPC_Origin =APC_Origin;
TypeCharC* VPC_Permit =APC_Permit;
TypeLength VL_SearchLen=0 ;
TypeLength j =0 ;
for(TypeLength i=0; i<AL_Length; ++i)
{
for(; j<AL_PermitLength; ++j)
{
if(*VPC_Origin== *VPC_Permit++)
{
++VL_SearchLen; break;
}
/*///////////////////////////*/
}/*
for(; j<AL_PermitLength; ++j)*/
if(j>=AL_PermitLength) return VL_SearchLen;
VPC_Origin++; VPC_Permit=APC_Permit; j=0;
}/*
for(TypeLength i=0; i<AL_Length; ++i)*/
return VL_SearchLen;
}/*
static TypeLength GetLength_PermitChar
(
TypeCharC* APC_Origin, TypeLength AL_Length,
TypeCharC* APC_Permit, TypeLength AL_PermitLength
)
////////////////////////////////////*/
template<typename TTyChars>
static TypeLength GetLength_PermitChar(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::GetLength_PermitChar(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.data(), AR_CCharsSearch.size());
}/*
template<typename TTyChars>
static TypeLength GetLength_PermitChar(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
static TypeLength GetLength_PermitCharRange(
TypeCharC* APC_Origin, TypeLength AL_Length, TypeCharC* APC_Permit, TypeLength AL_PermitLength)
{
/*////////////////////////////////////////////////
■ AL_PermitLength 은 2 의 배수로서, 2개의 문자가,
허용하는 문자의 범위를 나타낸다.
-- 2011-08-12 00:53:00
////////////////////////////////////////////////*/
if(AL_Length<1 || AL_PermitLength<2) return 0;
TypeCharC* VPC_Origin=APC_Origin;
TypeCharC* VPC_Permit=APC_Permit;
TypeLength VL_SearchLen =0;
TypeLength VL_PermitLength=AL_PermitLength/2;
TypeLength j =0;
for(TypeLength i=0; i<AL_Length; ++i)
{
for(; j<VL_PermitLength; ++j)
{
if(*VPC_Origin>=*VPC_Permit && *VPC_Origin<=*(VPC_Permit+1))
{
++VL_SearchLen; break;
}
/*////////////////////////////////////////////////////////*/
VPC_Permit+=2;
}/*
for(; j<VL_PermitLength; ++j)*/
if(j>=VL_PermitLength) return VL_SearchLen;
VPC_Origin++; VPC_Permit=APC_Permit; j=0;
}/*
for(TypeLength i=0; i<AL_Length; ++i)*/
return VL_SearchLen;
}/*
static TypeLength GetLength_PermitCharRange(
TypeCharC* APC_Origin, TypeLength AL_Length, TypeCharC* APC_Permit, TypeLength AL_PermitLength)*/
template<typename TTyChars>
static TypeLength GetLength_PermitCharRange(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::GetLength_PermitCharRange(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.data(), AR_CCharsSearch.size());
}/*
template<typename TTyChars>
static TypeLength GetLength_PermitCharRange(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
template<typename TStringArray> static TypeLength GetLength_PermitCharRange2
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
/*########################################################################*/
{
// ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다.
TypeLength VL_ArrSize =ARA_SearchArray.size();
TypeLength VL_SearchNow=0;
TypeLength VL_SearchSum=0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SearchNow=GetLength_PermitCharRange
(
APC_Origin+VL_SearchSum ,
AL_Length -VL_SearchSum ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
//////////////////////////////////////
if(VL_SearchNow<1) return 0 ;
VL_SearchSum += VL_SearchNow;
ARA_SearchArray.ItNext(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SearchSum;
}/*
template<typename TStringArray> static TypeLength GetLength_PermitCharRange2
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
##########################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_PermitCharRange2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_PermitCharRange2(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray );
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_PermitCharRange2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
template<typename TStringArray> static TypeLength GetLength_PermitChar2
(
TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray
)
/*###################################################################*/
{
// ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다.
TypeLength VL_ArrSize =ARA_SearchArray.size();
TypeLength VL_SearchNow=0;
TypeLength VL_SearchSum=0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SearchSum += VL_SearchNow = GetLength_PermitChar
(
APC_Origin+VL_SearchSum ,
AL_Length -VL_SearchSum ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
///////////////////////////////////////////////////
if(VL_SearchNow<1) return 0;
ARA_SearchArray.
MoveNextIter( RR(CI_IterEasyID) );
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SearchSum;
}/*
template<typename TStringArray> static TypeLength GetLength_PermitChar2
(
TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray
)
#####################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_PermitChar2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_PermitChar2(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_PermitChar2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
/* 특정 문자열이 특정 문자열을 가지고 있지 않으면, 해당 길이를 1 로 반환한다.
그 다음 문자부터는 '불허용 문자열'일 수 있기 때문이다. */
template<typename TStringArray> static TypeLength GetLength_NoPermit
(
TypeCharC* APC_Origin ,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
/*################################################################*/
{
TypeLength VL_ArrSize=ARA_SearchArray.size();
TypeLength VL_NowSize=0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
const TypeLength CI_NewSize =
ARA_SearchArray.ItD(CI_IterEasyID).size() ;
VL_NowSize = /////////////////////////////
(
AL_Length > CI_NewSize ? CI_NewSize : AL_Length
);
//////////////////////////////////////////
const bool CB_IsOK = ZtCMainChars::DoStart
(
APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(),
AL_Length , ARA_SearchArray.ItD(CI_IterEasyID).size()
);
if(CB_IsOK) return 0; ////////////////////
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return 1;
}/*
template<typename TStringArray> static TypeLength GetLength_NoPermit
(
TypeCharC* APC_Origin ,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
##################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermit(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_NoPermit(AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermit(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
template<typename TStringArray> static TypeLength GetLength_NoPermitRange
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
/////////////////////////////////////////////////////////////////////////
{
TypeLength VL_ArrSize=ARA_SearchArray.size()/2;
TypeLength VL_NowSize=0;
TypeLength i =0;
int VI_Compare=0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID
( ARA_SearchArray.GetHeadIterEasyID() );
for(; i<VL_ArrSize; ++i)
{
if(ARA_SearchArray.ItD(CI_IterEasyID).size()>0)
{
VL_NowSize =
ARA_SearchArray.ItD(CI_IterEasyID).size()>AL_Length ?
AL_Length : ARA_SearchArray.ItD(CI_IterEasyID).size() ;
VI_Compare=ZtCMainChars::Minus(
APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(),
VL_NowSize, ARA_SearchArray.ItD(CI_IterEasyID).size() );
}/*
if(ARA_SearchArray.ItD(CI_IterEasyID).size()>0)*/
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
if(VI_Compare>=0 && ARA_SearchArray.ItD(CI_IterEasyID).size()>0)
{
VL_NowSize = /////////
(
ARA_SearchArray.ItD(CI_IterEasyID).size()>AL_Length ?
AL_Length : ARA_SearchArray.ItD(CI_IterEasyID).size()
) ;
//////////////////////
const bool CB_IsTrue =
(
ZtCMainChars::Minus
(
APC_Origin, ARA_SearchArray.ItD(CI_IterEasyID).data(),
VL_NowSize, ARA_SearchArray.ItD(CI_IterEasyID).size()
) <=0
);
//////////////////////
if(CB_IsTrue){return 0;}
}/*
if(VI_Compare>=0 && ARA_SearchArray.ItD(CI_IterEasyID).size()>0)*/
ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID));
}/*
for(; i<VL_ArrSize; ++i)*/
return 1;
}/*
template<typename TStringArray> static TypeLength GetLength_NoPermitRange
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
template<typename TStringArray> static TypeLength GetLength_NoPermitRange*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermitRange(
const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_NoPermitRange(
AR_CChars.data(), AR_CChars.size(), ARA_SearchArray );
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermitRange(
const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray) */
static TypeLength GetLength_NoPermitChar
(
TypeCharC* APC_Origin , TypeLength AL_Length,
TypeCharC* APC_NoPermit, TypeLength AL_NoPermitLength
)
////////////////////////////////////////
{
if(AL_Length<1 || AL_NoPermitLength<1) return 0;
TypeCharC* VPC_Origin =APC_Origin ;
TypeCharC* VPC_NoPermit=APC_NoPermit;
TypeLength VL_SearchLen=0;
TypeLength j =0;
for(TypeLength i=0; i<AL_Length; ++i)
{
for(; j<AL_NoPermitLength; ++j)
{
if(*VPC_Origin==*VPC_NoPermit++) break;
}/*
for(; j<AL_NoPermitLength; ++j)*/
if(j<AL_NoPermitLength) return VL_SearchLen;
++VPC_Origin; ++VL_SearchLen; VPC_NoPermit=APC_NoPermit; j=0;
}/*
for(TypeLength i=0; i<AL_Length; ++i)*/
return VL_SearchLen;
}/*
static TypeLength GetLength_NoPermitChar
(
TypeCharC* APC_Origin , TypeLength AL_Length,
TypeCharC* APC_NoPermit, TypeLength AL_NoPermitLength
)
//////////////////////////////////////*/
template<typename TTyChars>
static TypeLength GetLength_NoPermitChar(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::GetLength_NoPermitChar(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.data(), AR_CCharsSearch.size());
}/*
template<typename TTyChars>
static TypeLength GetLength_PermitChar(
const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
template<typename TStringArray> static TypeLength GetLength_NoPermitChar2
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
/*#####################################################################*/
{
// ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다.
TypeLength VL_ArrSize =ARA_SearchArray.size();
TypeLength VL_SearchNow=0;
TypeLength VL_SearchSum=0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SearchSum += VL_SearchNow=GetLength_NoPermitChar
(
APC_Origin+VL_SearchSum ,
AL_Length -VL_SearchSum ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
///////////////////////////////////////////////////
if(VL_SearchNow<0){return 0;} ARA_SearchArray.MoveNextIter( RR(CI_IterEasyID) );
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SearchSum;
}/*
template<typename TStringArray> static TypeLength GetLength_NoPermitChar2
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
#######################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermitChar2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_NoPermitChar2(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermitChar2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
static TypeLength GetLength_NoPermitCharRange
(
TypeCharC* APC_Origin, TypeLength AL_Length,
TypeCharC* APC_Permit, TypeLength AL_PermitLength
)
/*#########################################*/
{
/*////////////////////////////////////////////////
■ AL_PermitLength 은 2 의 배수로서, 2개의 문자가,
허용하지 않는 문자의 범위를 나타낸다.
-- 2011-08-12 00:53:00
////////////////////////////////////////////////*/
if(AL_Length<1 || AL_PermitLength<2) return 0;
TypeCharC* VPC_Origin=APC_Origin;
TypeCharC* VPC_Permit=APC_Permit;
TypeLength VL_SearchLen =0;
TypeLength VL_PermitLength=AL_PermitLength/2;
TypeLength j =0;
for(TypeLength i=0; i<AL_Length; ++i)
{
for(; j<VL_PermitLength; ++j)
{
if(*VPC_Origin>=*VPC_Permit && *VPC_Origin<=*(VPC_Permit+1))
{
++VL_SearchLen; break;
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
VPC_Permit+=2;
}/*
for(; j<VL_PermitLength; ++j)*/
if(j<VL_PermitLength) return VL_SearchLen;
VPC_Origin++; VPC_Permit=APC_Permit; j=0;
}/*
for(TypeLength i=0; i<AL_Length; ++i)*/
return VL_SearchLen;
}/*
static TypeLength GetLength_NoPermitCharRange
(
TypeCharC* APC_Origin, TypeLength AL_Length,
TypeCharC* APC_Permit, TypeLength AL_PermitLength
)
###########################################*/
template<typename TTyChars>
static TypeLength GetLength_NoPermitCharRange(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch)
{
return ZtCMainChars::GetLength_NoPermitCharRange(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), AR_CCharsSearch.data(), AR_CCharsSearch.size());
}/*
template<typename TTyChars>
static TypeLength GetLength_NoPermitCharRange(const TTyChars& AR_CCharsOrigin, const TTyChars& AR_CCharsSearch) */
template<typename TStringArray> static TypeLength GetLength_NoPermitCharRange2
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
/*##########################################################################*/
{
// ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다.
TypeLength VL_ArrSize =ARA_SearchArray.size();
TypeLength VL_SearchNow=0;
TypeLength VL_SearchSum=0;
if(AL_Length<1 || VL_ArrSize<1) return 0;
IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID());
for(TypeLength i=0; i<VL_ArrSize; ++i)
{
VL_SearchSum += VL_SearchNow = GetLength_NoPermitCharRange
(
APC_Origin+VL_SearchSum ,
AL_Length -VL_SearchSum ,
ARA_SearchArray.ItD(CI_IterEasyID).data(),
ARA_SearchArray.ItD(CI_IterEasyID).size()
);
//////////////////////////////////////////////////////////
if(VL_SearchNow<1) return 0;
ARA_SearchArray.
MoveNextIter( RR(CI_IterEasyID) );
}/*
for(TypeLength i=0; i<VL_ArrSize; ++i)*/
return VL_SearchSum;
}/*
template<typename TStringArray> static TypeLength GetLength_NoPermitCharRange2
(
TypeCharC* APC_Origin,
TypeLength AL_Length , const
TStringArray& ARA_SearchArray
)
############################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermitCharRange2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray)
{
return ZtCMainChars::GetLength_NoPermitCharRange2(
AR_CCharsOrigin.data(), AR_CCharsOrigin.size(), ARA_SearchArray);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_NoPermitCharRange2(
const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */
template<typename TStringArray> static TypeLength GetLength_Repeat_Find
(
int AI_RepeatMin ,
int AI_RepeatMax ,
TypeCharC* APC_Origin ,
TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*###################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_Find2
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do ////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_Find2
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
////////////////////////////////////////////////////////////
// 현재 VI_RepeatCnt<AI_RepeatMax 상태다.
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0; // '최대 반복 횟수'를 넘으면 0 을 반환.
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll; // '최대 반복 횟수'에 이르면 즉시 리턴.
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1 */
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_Find
(
int AI_RepeatMin ,
int AI_RepeatMax ,
TypeCharC* APC_Origin ,
TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
#####################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_Find(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_Find(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_Find(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray>
static TypeLength GetLength_Repeat_FindChar( ///////////////////////////////
int AI_RepeatMin ,
int AI_RepeatMax ,
TypeCharC* APC_Origin ,
TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
/*/////////*/ )
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_FindChar2
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
////////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_FindChar2
(
APC_Origin+VL_LengthAll, AL_Length -VL_LengthAll, ARA_SearchArray
);
////////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray>
static TypeLength GetLength_Repeat_FindChar( ///////////////////////////////
int AI_RepeatMin ,
int AI_RepeatMax ,
TypeCharC* APC_Origin ,
TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
/?/////////// ) */
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_FindChar(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_FindEscape
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*#########################################################################*/
{
/* ARA_SearchArray 의 첫번째 원소를 escape 문자열로 쓴다.
따라서 ARA_SearchArray 의 배열 갯수는 2 이상이어야 한다.
ARA_SearchArray 의 앞 원소인 문자열부터 찾기 시작하므로
찾는 문자열 순서를 잘 지정해야 한다. */
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_FindEscape2( ///////////
APC_Origin+VL_LengthAll ,
AL_Length -VL_LengthAll ,
ARA_SearchArray
/*/////////*/ ); ///////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_FindEscape2
(
APC_Origin+VL_LengthAll ,
AL_Length -VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////////
// 현재 VI_RepeatCnt<AI_RepeatMax 상태다.
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_FindEscape
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
###########################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindEscape(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_FindEscape(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindEscape(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_FindSerial
(
int AI_RepeatMin , int AI_RepeatMax ,
TypeCharC* APC_Origin , TypeLength AL_Length,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/////////////////////////////////////////////////////////////////////////////
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_FindSerial
(
APC_Origin+VL_LengthAll ,
AL_Length -VL_LengthAll ,
ARA_SearchArray
);
//////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_FindSerial
(
APC_Origin+VL_LengthAll ,
AL_Length -VL_LengthAll ,
ARA_SearchArray
);
//////////////////////////////////
// 현재 VI_RepeatCnt<AI_RepeatMax 상태다.
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_FindSerial
(
int AI_RepeatMin , int AI_RepeatMax ,
TypeCharC* APC_Origin , TypeLength AL_Length,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
///////////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindSerial(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_FindSerial(AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindSerial(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static
TypeLength GetLength_Repeat_FindSerialChar /*##############################*/
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*#############################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_FindSerialChar2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
///////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_FindSerialChar2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
///////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{ if(++VI_RepeatCnt> AI_RepeatMax) return 0 ; }
else { if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll; }
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static
TypeLength GetLength_Repeat_FindSerialChar ##################################
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
###############################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindSerialChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_FindSerialChar(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_FindSerialChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_StartFind
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*########################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_StartFind
(
APC_Origin+VL_LengthAll ,
AL_Length -VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_StartFind
(
APC_Origin+VL_LengthAll ,
AL_Length -VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////
// 현재 VI_RepeatCnt<AI_RepeatMax 상태다.
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_StartFind
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
##########################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_StartFind(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_StartFind(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_StartFind(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_StartFindChar
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*#############################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_StartFindChar2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
//////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_StartFindChar2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
//////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_StartFindChar
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
###############################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_StartFindChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_StartFindChar(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_StartFindChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_Permit
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*#####################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_Permit
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
/////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_Permit
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
/////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_Permit
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
///////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_Permit(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_Permit(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_Permit(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_PermitRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
//////////////////////////////////////////////////////////////////////////////
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 최대 반복 횟수의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_PermitRange
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
//////////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_PermitRange
(
APC_Origin+VL_LengthAll, AL_Length-VL_LengthAll, ARA_SearchArray
);
//////////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_PermitRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
////////////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_PermitRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_PermitRange(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_PermitRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_PermitChar
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*#########################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_PermitChar2
(
APC_Origin+ VL_LengthAll,
AL_Length - VL_LengthAll,
ARA_SearchArray
);
///////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_PermitChar2
(
APC_Origin+ VL_LengthAll,
AL_Length - VL_LengthAll,
ARA_SearchArray
);
///////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_PermitChar
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
###########################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_PermitChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_PermitChar(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_PermitChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_PermitCharRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*##############################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_PermitCharRange2
(
APC_Origin+ VL_LengthAll,
AL_Length - VL_LengthAll,
ARA_SearchArray
);
////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_PermitCharRange2
(
APC_Origin+VL_LengthAll ,
AL_Length-VL_LengthAll ,
ARA_SearchArray
);
////////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_PermitCharRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
################################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_PermitCharRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_PermitCharRange(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_PermitCharRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermit
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
///////////////////////////////////////////////////////////////////////////
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 최대 반복 횟수의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_NoPermit
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
///////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow = ZtCMainChars::GetLength_NoPermit
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
///////////////////////////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermit
(
int AI_RepeatMin , int AI_RepeatMax ,
TypeCharC* APC_Origin , TypeLength AL_Length,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/////////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermit(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_NoPermit(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermit(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermitRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
////////////////////////////////////////////////////////////////////////////////
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 최대 반복 횟수의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_NoPermitRange
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_NoPermitRange
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermitRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
//////////////////////////////////////////////////////////////////////////////*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermitRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_NoPermitRange(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermitRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermitChar
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*###########################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 최대 반복횟수의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_NoPermitChar2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_NoPermitChar2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
/////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermitChar
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
#############################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermitChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_NoPermitChar(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermitChar(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermitCharRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
/*################################################################################*/
{
int VI_RepeatCnt=0;
TypeLength VL_LengthAll=0;
TypeLength VL_LengthNow=0;
if(AI_RepeatMax<1) // 유효하지 않은 최대 반복 횟수의 경우, 무한대 반복 허용
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_NoPermitCharRange2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
//////////////////////////////////////////////
if(VL_LengthNow<1)
{
if(VI_RepeatCnt>=AI_RepeatMin)
return VL_LengthAll;
else return 0;
}/*
if(VL_LengthNow<1)*/
++VI_RepeatCnt;
}
while(true);
}
else // AI_RepeatMax>=1
{
do //////
{
VL_LengthAll += VL_LengthNow =
ZtCMainChars::GetLength_NoPermitCharRange2
(
APC_Origin+ VL_LengthAll ,
AL_Length - VL_LengthAll ,
ARA_SearchArray
);
//////////////////////////////////////////////
if(VL_LengthNow<1)
{
// 현재 VI_RepeatCnt<=AI_RepeatMax 상태다.
if(VI_RepeatCnt<AI_RepeatMin)
return 0;
else return VL_LengthAll ;
}/*
if(VL_LengthNow<1)*/
if(AE_ESearchMax==ZNsEnum::ZESearchMax_Over)
{
if(++VI_RepeatCnt> AI_RepeatMax) return 0;
}
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop
{
if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll;
}/*
else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/
}
while(true);
}/*
else // AI_RepeatMax>=1*/
return VL_LengthAll;
}/*
template<typename TStringArray> static TypeLength GetLength_Repeat_NoPermitCharRange
(
int AI_RepeatMin, int AI_RepeatMax,
TypeCharC* APC_Origin , TypeLength AL_Length ,
const TStringArray& ARA_SearchArray ,
ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
)
##################################################################################*/
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermitCharRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over)
{
return ZtCMainChars::GetLength_Repeat_NoPermitCharRange(
AI_RepeatMin, AI_RepeatMax, AR_CChars.data(), AR_CChars.size(), ARA_SearchArray, AE_ESearchMax);
}/*
template<typename TTyChars, typename TStringArray>
static TypeLength GetLength_Repeat_NoPermitCharRange(
int AI_RepeatMin, int AI_RepeatMax, const TTyChars& AR_CChars, const TStringArray& ARA_SearchArray, ZNsEnum::ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over) */
public:
};/*
template< typename TTypeChars=ZNsType::ZtCTypeChars<char>
>
class ZtCMainChars //////////////////////////////////////*/
namespace ZNsIFace
{
template<typename TCChars> class ZtISearchCCharsEmpty
{
public:
typedef typename TCChars::TypeChar TypeChar ;
typedef typename TCChars::TypeLength TypeLength;
public:
typedef ZtISearchCCharsEmpty ZCNowObj ;
typedef ZtISearchCCharsEmpty ZCNextObj;
typedef ZtISearchCCharsEmpty ZCNodeObj;
public:
enum{EBoolNextObj=0};
public:
int GetLength (const TypeChar*, TypeLength) const{return 0;}
int GetRepeatCntMin () const{return 0;}
int GetRepeatCntMax () const{return 0;}
int GetSearchCharMin() const{return 0;}
int GetSearchCharMax() const{return 0;}
int GetSearchSumMin () const{return 0;}
int GetSearchSumMax () const{return 0;}
ZNsEnum::ZERegFlag GetERegFlag () const{return ZNsEnum::ZERegFlag_Nothing;}
ZNsEnum::ZESearchMax GetESearchMax() const{return ZNsEnum::ZESearchMax_Over ;}
ZtISearchCCharsEmpty& GetNowObj (){return *this;}
ZtISearchCCharsEmpty& GetNextObj(){return *this;}
ZtISearchCCharsEmpty& GetSubObj (){return *this;}
const ZtISearchCCharsEmpty& GetNowObj ()const{return *this;}
const ZtISearchCCharsEmpty& GetNextObj()const{return *this;}
const ZtISearchCCharsEmpty& GetSubObj ()const{return *this;}
public:
};/*
template<typename TCChars> class ZtISearchCCharsEmpty*/
}/*
namespace ZNsIFace*/
#define _ISEARCH_CCHARS_EMPTY_ ZNsIFace::ZtISearchCCharsEmpty<typename TCharsArr::TypeData>
template< typename TCharsArr ,
typename TNextObj =_ISEARCH_CCHARS_EMPTY_, // ZNsIFace::ZtISearchCCharsEmpty, ZtCSearchCChars<>, etc
bool TBoolNextObj=false
>
class ZtCSearchCChars : public TNextObj
{
public :
enum{EBoolNextObj=(int)TBoolNextObj} ;
public :
typedef ZtCSearchCChars ZCSearchCChars;
typedef ZtCSearchCChars ZCNowObj ; // cf) std::NsTmplChain::CTmplChain_T<>
typedef TNextObj ZCNextObj ;
public :
typedef TCharsArr ZCCharsArr ;
typedef ZNsEnum::ZERegFlag ZERegFlag ;
typedef ZNsEnum::ZESearchMax ZESearchMax ;
public :
typedef typename TCharsArr::TypeData ZCChars ;
typedef typename ZCChars ::ZCTypeChars ZCTypeChars;
typedef typename ZCChars ::TypeChar TypeChar ;
typedef typename ZCChars ::TypeCharC TypeCharC ;
typedef typename ZCChars ::TypeLength TypeLength ;
typedef ZtCMainChars<ZCTypeChars> ZCMainChars;
protected:
int mi_RepeatCntMin ;
int mi_RepeatCntMax ;
int mi_SearchCharMin; // enum ZERegErr 의 주석을 참고.
int mi_SearchCharMax;
int mi_SearchSumMin ; // enum ZERegErr 의 주석을 참고.
int mi_SearchSumMax ;
ZERegFlag me_ERegFlag ;
ZESearchMax me_ESearchMax;
ZCCharsArr mo_CCharsArr ;
/*protected:*/
protected:
/*///////////////////////////////////////////////////////////////////////////////
■ 아래 2 개 멤버 변수는 ZtCSearchCChars<> 의 컨테이너에서만 의미가 있다.
int mi_SearchSumMin;
int mi_SearchSumMax;
즉 ZtCSearchCChars<> 컨테이너의 각 원소를 순회하면서, 찾은 길이를 계속 더하게
되는데, 이때 이 더하는 누적값의 허용 범위를 지정하는 것이다.
-- 2011-10-02 18:52:00
///////////////////////////////////////////////////////////////////////////////*/
/*protected:*/
public :
ZtCSearchCChars()
{
Init();
}/*
ZtCSearchCChars()*/
ZtCSearchCChars //////////////////////////////////////////////////
(
int AI_RepeatCntMin , int AI_RepeatCntMax ,
int AI_SearchCharMin, int AI_SearchCharMax,
int AI_SearchSumMin , int AI_SearchSumMax ,
ZERegFlag AE_ERegFlag,
ZESearchMax AE_ESearchMax = ZNsEnum::ZESearchMax_Over
)
/*##############################################################*/
{
Init(AI_RepeatCntMin, AI_RepeatCntMax, AI_SearchCharMin, AI_SearchCharMax, AI_SearchSumMin, AI_SearchSumMax, AE_ERegFlag, AE_ESearchMax);
}/*
ZtCSearchCChars(int AI_RepeatCntMin , int AI_RepeatCntMax ,
int AI_SearchCharMin, int AI_SearchCharMax,
int AI_SearchSumMin , int AI_SearchSumMax ,
ZERegFlag AE_ERegFlag, ZESearchMax AE_ESearchMax=ZNsEnum::ZESearchMax_Over
////////////// ) */
void Init()
{
mi_RepeatCntMin =0;
mi_RepeatCntMax =0;
mi_SearchCharMin=0;
mi_SearchCharMax=0;
mi_SearchSumMin =0;
mi_SearchSumMax =0;
me_ERegFlag =ZNsEnum::ZERegFlag_Nothing;
me_ESearchMax =ZNsEnum::ZESearchMax_Over ;
}/*
void Init()*/
void Init ////////////////////////////////////////////////////////
(
int AI_RepeatCntMin , int AI_RepeatCntMax ,
int AI_SearchCharMin, int AI_SearchCharMax,
int AI_SearchSumMin , int AI_SearchSumMax ,
ZERegFlag AE_ERegFlag ,
ZESearchMax AE_ESearchMax = ZNsEnum::ZESearchMax_Over
)
/*##############################################################*/
{
mi_RepeatCntMin =AI_RepeatCntMin ;
mi_RepeatCntMax =AI_RepeatCntMax ;
mi_SearchCharMin=AI_SearchCharMin;
mi_SearchCharMax=AI_SearchCharMax;
mi_SearchSumMin =AI_SearchSumMin ;
mi_SearchSumMax =AI_SearchSumMax ;
me_ERegFlag =AE_ERegFlag ;
me_ESearchMax =AE_ESearchMax ;
}
/*##############################################################*/
ZtCSearchCChars& GetNowObj() {return *this;}
const ZtCSearchCChars& GetNowObj() const{return *this;}
ZCNextObj& GetNextObj() {return static_cast< ZCNextObj&>(*this);}
const ZCNextObj& GetNextObj() const{return static_cast<const ZCNextObj&>(*this);}
ZCCharsArr& GetCCharsArr() {return mo_CCharsArr;}
const ZCCharsArr& GetCCharsArr() const{return mo_CCharsArr;}
int GetRepeatCntMin () const{return mi_RepeatCntMin ;}
int GetRepeatCntMax () const{return mi_RepeatCntMax ;}
int GetSearchCharMin() const{return mi_SearchCharMin;}
int GetSearchCharMax() const{return mi_SearchCharMax;}
int GetSearchSumMin () const{return mi_SearchSumMin ;}
int GetSearchSumMax () const{return mi_SearchSumMax ;}
ZERegFlag GetERegFlag () const{return me_ERegFlag ;}
ZESearchMax GetESearchMax() const{return me_ESearchMax;}
TypeLength GetLength(TypeCharC* APC_Origin, TypeLength AL_Length) const
{
switch(me_ERegFlag)
{
case ZNsEnum::ZERegFlag_Permit : return ZCMainChars::GetLength_Repeat_Permit (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_PermitRange : return ZCMainChars::GetLength_Repeat_PermitRange (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_PermitChar : return ZCMainChars::GetLength_Repeat_PermitChar (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_PermitCharRange : return ZCMainChars::GetLength_Repeat_PermitCharRange (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_NoPermit : return ZCMainChars::GetLength_Repeat_NoPermit (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_NoPermitRange : return ZCMainChars::GetLength_Repeat_NoPermitRange (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_NoPermitChar : return ZCMainChars::GetLength_Repeat_NoPermitChar (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_NoPermitCharRange : return ZCMainChars::GetLength_Repeat_NoPermitCharRange(mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_Find : return ZCMainChars::GetLength_Repeat_Find (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_FindChar : return ZCMainChars::GetLength_Repeat_FindChar (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_FindSerial : return ZCMainChars::GetLength_Repeat_FindSerial (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_FindSerialChar : return ZCMainChars::GetLength_Repeat_FindSerialChar (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_FindEscape : return ZCMainChars::GetLength_Repeat_FindEscape (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_StartFind : return ZCMainChars::GetLength_Repeat_StartFind (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
case ZNsEnum::ZERegFlag_StartFindChar : return ZCMainChars::GetLength_Repeat_StartFindChar (mi_RepeatCntMin, mi_RepeatCntMax, APC_Origin, AL_Length, mo_CCharsArr, me_ESearchMax);
}/*
switch(me_ERegFlag)*/
return 0;
}/*
TypeLength GetLength(TypeCharC* APC_Origin, TypeLength AL_Length) const*/
template<typename TCChars> TypeLength GetLength(const TCChars& AR_CChars) const
{
return GetLength(AR_CChars.data(), AR_CChars.size());
}/*
template<typename TCChars> TypeLength GetLength(const TCChars& AR_CChars) const */
TypeLength GetLengthEx
(
ZNsEnum::ZERegErr& ARRE_ZERegErr,
TypeCharC* APC_Origin , TypeLength AL_Length
) const
/*##################*/
{
TypeLength VL_Length =
GetLength(APC_Origin, AL_Length);
ARRE_ZERegErr=ZNsEnum::ZERegErr_None;
const bool CB_IsTrue = (
VL_Length <mi_SearchCharMin ||
(mi_SearchCharMax>0 && VL_Length>mi_SearchCharMax)
);
if(CB_IsTrue)
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharCount;
return VL_Length;
}/*
TypeLength GetLengthEx
(
ZNsEnum::ZERegErr& ARRE_ZERegErr,
TypeCharC* APC_Origin , TypeLength AL_Length
) const
////////////////////*/
template<typename TCChars> TypeLength
GetLengthEx(ZNsEnum::ZERegErr& ARRE_ZERegErr, const TCChars& AR_CChars) const
{
return GetLengthEx(RR(ARRE_ZERegErr), AR_CChars.data(), AR_CChars.size());
}/*
template<typename TCChars> TypeLength
GetLengthEx(ZNsEnum::ZERegErr& ARRE_ZERegErr, const TCChars& AR_CChars) const */
template<typename TSearchCCharsArr>
static TypeLength GetLengthByCSearchCCharsArr
(
const TSearchCCharsArr& AR_CSearchCCharsArr ,
ZNsEnum::ZERegErr& ARRE_ZERegErr ,
TypeCharC* APC_Origin ,
TypeLength AL_Length
)
/*#################################################*/
{
typedef typename TSearchCCharsArr::iterator iterator;
typedef typename TSearchCCharsArr::TypeData TypeData;
const iterator VO_iterator(AR_CSearchCCharsArr.begin());
TypeLength VL_SearchSum=0;
TypeLength VL_SearchNow=0;
int VI_ArrSize =AR_CSearchCCharsArr.size();
if(VI_ArrSize<1) return 0;
for(int i=0; i<VI_ArrSize; ++i)
{
TypeData& VR_CSearchCChars = *VO_iterator;
VL_SearchSum += VL_SearchNow=VR_CSearchCChars.
GetLength(APC_Origin+VL_SearchSum, AL_Length-VL_SearchSum);
if(VL_SearchNow<VR_CSearchCChars.GetSearchCharMin() || (VR_CSearchCChars.GetSearchCharMax()>0 && VL_SearchNow>VR_CSearchCChars.GetSearchCharMax()))
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharCount; return 0;
}
if(VL_SearchSum<VR_CSearchCChars.GetSearchSumMin () || (VR_CSearchCChars.GetSearchSumMax ()>0 && VL_SearchSum>VR_CSearchCChars.GetSearchSumMax ()))
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharSum ; return 0;
}/*
if(VL_SearchSum<VR_CSearchCChars.GetSearchSumMin () || (VR_CSearchCChars.GetSearchSumMax ()>0 && VL_SearchSum>VR_CSearchCChars.GetSearchSumMax ()))*/
/*///////////////////////////////////////////////////////
if(AL_Length<=VL_SearchSum) return VL_SearchSum;
■ 위 코드를 주석으로 막는다. 다음 조건에 따라서,
찾는 문자열이 길이가 0 인 것이 정상일 수도 있는 것이다.
-- 2011-08-05 16:30:00
///////////////////////////////////////////////////////*/
AR_CSearchCCharsArr.MoveNextIter(VO_iterator);
}/*
for(int i=0; i<VI_ArrSize; ++i)*/
return VL_SearchSum;
}/*
template<typename TSearchCCharsArr>
static TypeLength GetLengthByCSearchCCharsArr
(
const TSearchCCharsArr& AR_CSearchCCharsArr ,
ZNsEnum::ZERegErr& ARRE_ZERegErr ,
TypeCharC* APC_Origin ,
TypeLength AL_Length
)
///////////////////////////////////////////////////*/
template<typename TSearchCCharsArr, typename TCChars>
static TypeLength GetLengthByCSearchCCharsArr
(
const TSearchCCharsArr& AR_CSearchCCharsArr ,
ZNsEnum::ZERegErr& ARRE_ZERegErr ,
const TCChars& AR_CChars
)
/*#################################################*/
{
return GetLengthByCSearchCCharsArr(
AR_CSearchCCharsArr, RR(ARRE_ZERegErr), AR_CChars.data(), AR_CChars.size() );
}/*
template<typename TSearchCCharsArr, typename TCChars>
static TypeLength GetLengthByCSearchCCharsArr
(
const TSearchCCharsArr& AR_CSearchCCharsArr ,
ZNsEnum::ZERegErr& ARRE_ZERegErr ,
const TCChars& AR_CChars
)
///////////////////////////////////////////////////*/
public:
};/*
template< typename TCharsArr ,
typename TNextObj =_ISEARCH_CCHARS_EMPTY_, // ZNsIFace::ZtISearchCCharsEmpty, ZtCSearchCChars<>, etc
bool TBoolNextObj=false
>
class ZtCSearchCChars /////////////////////////////////*/
template< typename TCharsArr ,
typename TNextObj =_ISEARCH_CCHARS_EMPTY_, // ZNsIFace::ZtISearchCCharsEmpty, ZtCSearchCChars<>, etc
typename TSubObj =_ISEARCH_CCHARS_EMPTY_, // ZNsIFace::ZtISearchCCharsEmpty, ZtCSearchCChars<>, etc
bool TBoolNextObj=false
>
class ZtCSearchCCharsEx : public ZtCSearchCChars<TCharsArr,TNextObj,TBoolNextObj>
{
public :
enum{EBoolNextObj=(int)TBoolNextObj};
public :
typedef ZtCSearchCChars<TCharsArr,TNextObj,TBoolNextObj> ZCSearchCChars;
public :
typedef ZCSearchCChars ZCNowObj ;
typedef TNextObj ZCNextObj;
typedef TSubObj CSubObj ;
private:
CSubObj mo_CSubObj;
public :
/***/ CSubObj& GetCSubObj() {return mo_CSubObj;}
const CSubObj& GetCSubObj()const{return mo_CSubObj;}
public :
};/*
template< typename TCharsArr ,
typename TNextObj =_ISEARCH_CCHARS_EMPTY_, // ZNsIFace::ZtISearchCCharsEmpty, ZtCSearchCChars<>, etc
typename TSubObj =_ISEARCH_CCHARS_EMPTY_, // ZNsIFace::ZtISearchCCharsEmpty, ZtCSearchCChars<>, etc
bool TBoolNextObj=false
>
class ZtCSearchCCharsEx */
#undef _ISEARCH_CCHARS_EMPTY_ // ZNsIFace::ZtISearchCCharsEmpty<typename TCharsArr::TypeData>
namespace ZNsType
{
template< ZTypLength TIntCode , // 'A' 나 L'가' 등의 구체적인 문자가 온다.
typename TTypeChar=char,
typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다.
>
class ZtCTypeCharChain
{
public:
typedef TTypeChar TypeChar;
typedef TCharCInt TypeCInt;
public:
typedef const TTypeChar TypeCharC;
public:
enum{ZETypeCharTmplChain=ZNsEnum::ZETypeCharTmplChain_Char};
public:
static TypeCInt GetCInt(){return (TypeCInt)TIntCode;}
static TypeChar GetChar(){return (TypeChar)TIntCode;}
public:
static bool DoHave(TypeChar AC_Char){return AC_Char==(TypeChar)TIntCode;}
public:
};/*
template< ZTypLength TIntCode , // 'A' 나 L'가' 등의 구체적인 문자가 온다.
typename TTypeChar=char,
typename TCharCInt =char // TTypeChar 를 표현할 수 있는 정수 자료형이다.
>
class ZtCTypeCharChain */
// ZtCTypeChar2Chain<> 은 2 개 문자의 범위를 나타낸다.
template< ZTypLength TIntCode1 , // 'A' 나 L'가' 등의 구체적인 문자가 온다.
ZTypLength TIntCode2 , // 'A' 나 L'가' 등의 구체적인 문자가 온다.
typename TTypeChar=char,
typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다.
>
class ZtCTypeChar2Chain
{
public:
typedef TTypeChar TypeChar;
typedef TCharCInt TypeCInt;
public:
typedef const TTypeChar TypeCharC;
public:
enum{ZETypeCharTmplChain=ZNsEnum::ZETypeCharTmplChain_Char2};
public:
static TypeCInt GetCInt1(){return (TypeCInt)TIntCode1;}
static TypeCInt GetCInt2(){return (TypeCInt)TIntCode2;}
static TypeChar GetChar1(){return (TypeChar)TIntCode1;}
static TypeChar GetChar2(){return (TypeChar)TIntCode2;}
public:
static bool DoHave(TypeChar AC_Char)
{
return AC_Char>=(TypeChar)TIntCode1 && AC_Char<=(TypeChar)TIntCode2;
}/*
static bool DoHave(TypeChar AC_Char)*/
public:
};/*
template< ZTypLength TIntCode1 , // 'A' 나 L'가' 등의 구체적인 문자가 온다.
ZTypLength TIntCode2 , // 'A' 나 L'가' 등의 구체적인 문자가 온다.
typename TTypeChar=char,
typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다.
>
class ZtCTypeChar2Chain */
template< typename TTypeChar=char,
typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다.
>
class ZtCTypeCharChainEach
{
public:
typedef ZtCTypeCharChain<TTypeChar('A' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfA;
typedef ZtCTypeCharChain<TTypeChar('B' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfB;
typedef ZtCTypeCharChain<TTypeChar('C' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfC;
typedef ZtCTypeCharChain<TTypeChar('D' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfD;
typedef ZtCTypeCharChain<TTypeChar('E' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfE;
typedef ZtCTypeCharChain<TTypeChar('F' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfF;
typedef ZtCTypeCharChain<TTypeChar('G' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfG;
typedef ZtCTypeCharChain<TTypeChar('H' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfH;
typedef ZtCTypeCharChain<TTypeChar('I' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfI;
typedef ZtCTypeCharChain<TTypeChar('J' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfJ;
typedef ZtCTypeCharChain<TTypeChar('K' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfK;
typedef ZtCTypeCharChain<TTypeChar('L' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfL;
typedef ZtCTypeCharChain<TTypeChar('M' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfM;
typedef ZtCTypeCharChain<TTypeChar('N' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfN;
typedef ZtCTypeCharChain<TTypeChar('O' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfO;
typedef ZtCTypeCharChain<TTypeChar('P' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfP;
typedef ZtCTypeCharChain<TTypeChar('Q' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfQ;
typedef ZtCTypeCharChain<TTypeChar('R' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfR;
typedef ZtCTypeCharChain<TTypeChar('S' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfS;
typedef ZtCTypeCharChain<TTypeChar('T' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfT;
typedef ZtCTypeCharChain<TTypeChar('U' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfU;
typedef ZtCTypeCharChain<TTypeChar('V' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfV;
typedef ZtCTypeCharChain<TTypeChar('W' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfW;
typedef ZtCTypeCharChain<TTypeChar('X' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfX;
typedef ZtCTypeCharChain<TTypeChar('Y' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfY;
typedef ZtCTypeCharChain<TTypeChar('Z' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfZ;
typedef ZtCTypeCharChain<TTypeChar('a' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfa;
typedef ZtCTypeCharChain<TTypeChar('b' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfb;
typedef ZtCTypeCharChain<TTypeChar('c' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfc;
typedef ZtCTypeCharChain<TTypeChar('d' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfd;
typedef ZtCTypeCharChain<TTypeChar('e' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfe;
typedef ZtCTypeCharChain<TTypeChar('f' ),TTypeChar,TCharCInt> CTypeCharTmplChainOff;
typedef ZtCTypeCharChain<TTypeChar('g' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfg;
typedef ZtCTypeCharChain<TTypeChar('h' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfh;
typedef ZtCTypeCharChain<TTypeChar('i' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfi;
typedef ZtCTypeCharChain<TTypeChar('j' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfj;
typedef ZtCTypeCharChain<TTypeChar('k' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfk;
typedef ZtCTypeCharChain<TTypeChar('l' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfl;
typedef ZtCTypeCharChain<TTypeChar('m' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfm;
typedef ZtCTypeCharChain<TTypeChar('n' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfn;
typedef ZtCTypeCharChain<TTypeChar('o' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfo;
typedef ZtCTypeCharChain<TTypeChar('p' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfp;
typedef ZtCTypeCharChain<TTypeChar('q' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfq;
typedef ZtCTypeCharChain<TTypeChar('r' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfr;
typedef ZtCTypeCharChain<TTypeChar('s' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfs;
typedef ZtCTypeCharChain<TTypeChar('t' ),TTypeChar,TCharCInt> CTypeCharTmplChainOft;
typedef ZtCTypeCharChain<TTypeChar('u' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfu;
typedef ZtCTypeCharChain<TTypeChar('v' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfv;
typedef ZtCTypeCharChain<TTypeChar('w' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfw;
typedef ZtCTypeCharChain<TTypeChar('x' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfx;
typedef ZtCTypeCharChain<TTypeChar('y' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfy;
typedef ZtCTypeCharChain<TTypeChar('z' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfz;
typedef ZtCTypeCharChain<TTypeChar('0' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf0;
typedef ZtCTypeCharChain<TTypeChar('1' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf1;
typedef ZtCTypeCharChain<TTypeChar('2' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf2;
typedef ZtCTypeCharChain<TTypeChar('3' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf3;
typedef ZtCTypeCharChain<TTypeChar('4' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf4;
typedef ZtCTypeCharChain<TTypeChar('5' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf5;
typedef ZtCTypeCharChain<TTypeChar('6' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf6;
typedef ZtCTypeCharChain<TTypeChar('7' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf7;
typedef ZtCTypeCharChain<TTypeChar('8' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf8;
typedef ZtCTypeCharChain<TTypeChar('9' ),TTypeChar,TCharCInt> CTypeCharTmplChainOf9;
typedef ZtCTypeCharChain<TTypeChar(' ' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfSpace ; // space bar
typedef ZtCTypeCharChain<TTypeChar('\t'),TTypeChar,TCharCInt> CTypeCharTmplChainOfTab ; // horizontal tab
typedef ZtCTypeCharChain<TTypeChar('\r'),TTypeChar,TCharCInt> CTypeCharTmplChainOfLF ; // line feed(개행)
typedef ZtCTypeCharChain<TTypeChar('\n'),TTypeChar,TCharCInt> CTypeCharTmplChainOfCR ; // carriage return(복귀)
typedef ZtCTypeCharChain<TTypeChar('`' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfGraAcc ; // grave accent
typedef ZtCTypeCharChain<TTypeChar('~' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfTilde ; // tilde, swung dash
typedef ZtCTypeCharChain<TTypeChar('!' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfExcMark ; // exclamation mark
typedef ZtCTypeCharChain<TTypeChar('@' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfAt ; // at sign
typedef ZtCTypeCharChain<TTypeChar('#' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfHash ; // number sign/pound/hash
typedef ZtCTypeCharChain<TTypeChar('$' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfDollar ; // dollar sign
typedef ZtCTypeCharChain<TTypeChar('%' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfPercent ;
typedef ZtCTypeCharChain<TTypeChar('^' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfCaret ; // caret
typedef ZtCTypeCharChain<TTypeChar('&' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfAmper ; // ampersand
typedef ZtCTypeCharChain<TTypeChar('*' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfAster ; // asterisk
typedef ZtCTypeCharChain<TTypeChar('(' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfRoundB ; // round brackets, open brackets, brackets (UK), or parentheses
typedef ZtCTypeCharChain<TTypeChar(')' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfRoundB2 ;
typedef ZtCTypeCharChain<TTypeChar('[' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfSquareB ; // square brackets, closed brackets, or brackets (US)
typedef ZtCTypeCharChain<TTypeChar(']' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfSquareB2 ;
typedef ZtCTypeCharChain<TTypeChar('>' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfMoreThan ; // inequality signs, brakets
typedef ZtCTypeCharChain<TTypeChar('<' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfLessThan ; // inequality signs, brakets
typedef ZtCTypeCharChain<TTypeChar('{' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfBrace ; // curly brackets, definite brackets, swirly brackets, curly braces, birdie brackets, Scottish brackets, squirrelly brackets, braces, gullwings, fancy brackets, or squiggly brackets
typedef ZtCTypeCharChain<TTypeChar('}' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfBrace2 ;
typedef ZtCTypeCharChain<TTypeChar('-' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfHyphen ; // hyphen
typedef ZtCTypeCharChain<TTypeChar('_' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfUnderSco ; // underscore, understrike, low line, low dash
typedef ZtCTypeCharChain<TTypeChar('+' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfPlus ; // plus sign
typedef ZtCTypeCharChain<TTypeChar('=' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfEquals ; // equality sign, equals sign
typedef ZtCTypeCharChain<TTypeChar('|' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfVertical ; // vertical bar
typedef ZtCTypeCharChain<TTypeChar('\\'),TTypeChar,TCharCInt> CTypeCharTmplChainOfBackslash; // backslash, reverse solidus
typedef ZtCTypeCharChain<TTypeChar(';' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfSemiColon;
typedef ZtCTypeCharChain<TTypeChar(':' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfColon ;
typedef ZtCTypeCharChain<TTypeChar('\''),TTypeChar,TCharCInt> CTypeCharTmplChainOfApostrop ; // apostrophe
typedef ZtCTypeCharChain<TTypeChar('"' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfQuotation; // quotation mark
typedef ZtCTypeCharChain<TTypeChar(',' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfComma ; // comma
typedef ZtCTypeCharChain<TTypeChar('.' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfPeriod ; // period
typedef ZtCTypeCharChain<TTypeChar('?' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfQuestion ; // question mark
typedef ZtCTypeCharChain<TTypeChar('/' ),TTypeChar,TCharCInt> CTypeCharTmplChainOfSlash ; // slash, solidus
typedef ZtCTypeChar2Chain<TTypeChar('a'),TTypeChar('z'),TTypeChar,TCharCInt> CTypeChar2TmplChainOfaz;
typedef ZtCTypeChar2Chain<TTypeChar('A'),TTypeChar('Z'),TTypeChar,TCharCInt> CTypeChar2TmplChainOfAZ;
typedef ZtCTypeChar2Chain<TTypeChar('0'),TTypeChar('9'),TTypeChar,TCharCInt> CTypeChar2TmplChainOf09;
public:
};/*
template< typename TTypeChar=char,
typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다.
>
class ZtCTypeCharChainEach */
}/*
namespace ZNsType*/
/*///////////////////////////////////////////////////////////
■ typename TTypeCharChain 은
ZNsType::ZtCTypeCharChain<>
ZNsType::ZtCTypeChar2Chain<>
ZNsType::ZtCTypeCharChainEach<>::CTypeCharTmplChainOf~
ZNsType::ZtCTypeCharChainEach<>::CTypeChar2TmplChainOf~
등이 될 수 있다.
-- 2011-10-09 05:27:00
///////////////////////////////////////////////////////////*/
template< typename TTypeCharChain,
typename TNextCharChain,
typename TNextCharChain2
>
class ZtCCharChain /////////////////
{
public:
typedef TTypeCharChain TypeCharChain ;
typedef TNextCharChain ZCNextObj ;
typedef TNextCharChain2 ZCNextObj2;
typedef typename TypeCharChain::TTypeChar TypeChar ;
typedef typename TypeCharChain::TCharCInt TypeCInt ;
public:
typedef const TypeChar TypeCharC;
public:
enum{ENextObjNo =ZCNextObj ::ENextObjNo +1};
enum{ENextObjNo2 =ZCNextObj2::ENextObjNo2+1};
enum{EObjChainCnt =ZCNextObj ::EObjChainCnt+ZCNextObj2::EObjChainCnt+2};
enum{EBoolNextObj =1};
enum{EBoolNextObj2=1};
public:
static bool DoHave(TypeChar AC_Char){return TypeCharChain::DoHave(AC_Char);}
public:
};/*
template< typename TTypeCharChain,
typename TNextCharChain,
typename TNextCharChain2
>
class ZtCCharChain ///////////////*/
template< typename TTypeCharChain, ///////////////////////////////
typename TNextCharChain
>
class ZtCCharChain<TTypeCharChain, TNextCharChain, ZNsMain::ZCEmpty>
{
public:
typedef TTypeCharChain TypeCharChain ;
typedef TNextCharChain ZCNextObj ;
typedef TNextCharChain ZCNextObj2; // interface 호환을 위해서만 존재.
typedef typename TypeCharChain::TTypeChar TypeChar ;
typedef typename TypeCharChain::TCharCInt TypeCInt ;
public:
typedef const TypeChar TypeCharC;
public:
enum{ENextObjNo =ZCNextObj::ENextObjNo+1};
enum{ENextObjNo2 =0};
enum{EBoolNextObj =1};
enum{EBoolNextObj2=0};
enum{EObjChainCnt =ZCNextObj::EObjChainCnt+1};
public:
static bool DoHave(TypeChar AC_Char){return TypeCharChain::DoHave(AC_Char);}
public:
};/*
template< typename TTypeCharChain, //////////////////////////////////
typename TNextCharChain
>
class ZtCCharChain<TTypeCharChain, TNextCharChain, ZNsMain::ZCEmpty> */
template< typename TTypeCharChain, ////////////////////////////////
typename TNextCharChain2
>
class ZtCCharChain<TTypeCharChain, ZNsMain::ZCEmpty, TNextCharChain2>
{
public:
typedef TTypeCharChain TypeCharChain ;
typedef TNextCharChain2 ZCNextObj ; // interface 호환을 위해서만 존재.
typedef TNextCharChain2 ZCNextObj2;
typedef typename TypeCharChain::TTypeChar TypeChar ;
typedef typename TypeCharChain::TCharCInt TypeCInt ;
public:
typedef const TypeChar TypeCharC;
public:
enum{ENextObjNo =0};
enum{ENextObjNo2 =ZCNextObj2::ENextObjNo2+1};
enum{EBoolNextObj =0};
enum{EBoolNextObj2=1};
enum{EObjChainCnt =ZCNextObj2::EObjChainCnt+1};
public:
static bool DoHave(TypeChar AC_Char){return TypeCharChain::DoHave(AC_Char);}
public:
};/*
template< typename TTypeCharChain, ///////////////////////////////////
typename TNextCharChain2
>
class ZtCCharChain<TTypeCharChain, ZNsMain::ZCEmpty, TNextCharChain2> */
template<typename TTypeCharChain> class ZtCCharChain
< TTypeCharChain, ZNsMain::ZCEmpty, ZNsMain::ZCEmpty >
{
public:
typedef ZtCCharChain< //////////////////////////////
TTypeCharChain ,
ZNsMain::ZCEmpty,
ZNsMain::ZCEmpty
/*/////////*/ > CCharChain; ////////////////////////
public:
typedef TTypeCharChain TypeCharChain ;
typedef CCharChain ZCNextObj ; // interface 호환을 위해서만 존재.
typedef CCharChain ZCNextObj2; // interface 호환을 위해서만 존재.
typedef typename TypeCharChain::TTypeChar TypeChar ;
typedef typename TypeCharChain::TCharCInt TypeCInt ;
public:
typedef const TypeChar TypeCharC;
public:
enum{ENextObjNo =0};
enum{ENextObjNo2 =0};
enum{EBoolNextObj =0};
enum{EBoolNextObj2=0};
enum{EObjChainCnt =1};
public:
static bool DoHave(TypeChar AC_Char){return TypeCharChain::DoHave(AC_Char);}
public:
};/*
template<typename TTypeCharChain> class ZtCCharChain
< TTypeCharChain, ZNsMain::ZCEmpty, ZNsMain::ZCEmpty > */
template< typename TTypeChars=ZNsType::ZtCTypeChars<char>
>
class ZtCSearchCursor /////////////////////////////////////
{
public :
typedef TTypeChars ZCTypeChars;
typedef ZtCMainChars<ZCTypeChars> ZCMainChars;
typedef typename ZCTypeChars::ZCChars ZCChars ;
typedef typename ZCTypeChars::TypeChar TypeChar ;
typedef typename ZCTypeChars::TypeCharC TypeCharC ;
typedef typename ZCTypeChars::TypeLength TypeLength ;
private:
TypeChar* mpc_OriginChar;
TypeLength ml_OriginLen ;
TypeLength ml_SearchPos ;
TypeLength ml_SearchLen ;
public :
ZtCSearchCursor()
{
Init();
}/*
ZtCSearchCursor()*/
void Init()
{
mpc_OriginChar=0;
ml_OriginLen =0;
ml_SearchPos =0;
ml_SearchLen =0;
}/*
void Init()*/
void InitSearch()
{
ml_SearchPos =0;
ml_SearchLen =0;
}/*
void InitSearch()*/
void InitOrigin(TypeChar* APC_Origin, TypeLength AL_Length)
{
mpc_OriginChar=APC_Origin;
ml_OriginLen =AL_Length ;
}/*
void InitOrigin(TypeChar* APC_Origin, TypeLength AL_Length)*/
void InitOrigin(ZCChars& AR_CCharsOrigin)
{
mpc_OriginChar=AR_CCharsOrigin.data();
ml_OriginLen =AR_CCharsOrigin.size();
}/*
void InitOrigin(ZCChars& AR_CCharsOrigin)*/
void InitOrigin(const ZCChars& AR_CCharsOrigin)
{
mpc_OriginChar=const_cast<TypeChar*>(AR_CCharsOrigin.data());
ml_OriginLen = AR_CCharsOrigin.size() ;
}/*
void InitOrigin(const ZCChars& AR_CCharsOrigin)*/
TypeChar* GetOriginData()
{
return mpc_OriginChar;
}/*
TypeChar* GetOriginData()*/
TypeCharC* GetOriginData() const
{
return mpc_OriginChar;
}/*
TypeCharC* GetOriginData() const*/
TypeLength GetOriginLen() const{return ml_OriginLen ;}
TypeLength GetRemainLen() const{return ml_OriginLen-ml_SearchPos;}
void AddSearchPos()
{
ml_SearchPos+=ml_SearchLen;
}/*
void AddSearchPos()*/
void AddSearchPos(TypeLength AL_AddSearchPos)
{
ml_SearchPos += AL_AddSearchPos ;
}/*
void AddSearchPos(TypeLength AL_AddSearchPos)*/
void AddInitSearchPos()
{
ml_SearchPos+=ml_SearchLen; ml_SearchLen=0;
}/*
void AddInitSearchPos()*/
TypeLength GetSearchLen() const{return ml_SearchLen;}
TypeLength GetSearchPos() const{return ml_SearchPos;}
void SetSearchLen(TypeLength AL_SearchLen)
{
if(AL_SearchLen>=0) ml_SearchLen=AL_SearchLen;
}/*
void SetSearchLen(TypeLength AL_SearchLen)*/
void SetSearchPos(TypeLength AL_SearchPos)
{
if(AL_SearchPos>=0) ml_SearchPos=AL_SearchPos;
}/*
void SetSearchPos(TypeLength AL_SearchPos)*/
void SetSearchPos()
{
ml_SearchPos=ml_SearchLen;
}/*
void SetSearchPos()*/
bool DoStart(TypeCharC* APC_Search, TypeLength AL_Length)
{
return ZCMainChars::DoStart(
mpc_OriginChar+ml_SearchPos, APC_Search, ml_OriginLen-ml_SearchPos, AL_Length);
}/*
bool DoStart(TypeCharC* APC_Search, TypeLength AL_Length)*/
template<typename TCChars> bool DoStart(const TCChars& AR_CChars)
{
return DoStart(AR_CChars.data(), AR_CChars.size());
}/*
template<typename TCChars> bool DoStart(const TCChars& AR_CChars) */
TypeLength FindPos(TypeCharC* APC_Search,TypeLength AL_Length)
{
return ZCMainChars::FindPos(
mpc_OriginChar, APC_Search, ml_OriginLen, AL_Length, ml_SearchPos);
}/*
TypeLength FindPos(TypeCharC* APC_Search,TypeLength AL_Length)*/
template<typename TCChars> TypeLength FindPos(const TCChars& AR_CChars)
{
return FindPos(AR_CChars.data(), AR_CChars.size());
}/*
template<typename TCChars> TypeLength FindPos(const TCChars& AR_CChars) */
TypeLength AddSearchByFind(TypeCharC* APC_Search, TypeLength AL_Length)
{
// APC_Search 을 찾았으면, 그 이전까지의 길이를 리턴한다.
TypeLength VL_FindPos = FindPos(APC_Search, AL_Length);
if(VL_FindPos<0) return -1;
return ml_SearchLen = VL_FindPos-ml_SearchPos;
}/*
TypeLength AddSearchByFind(TypeCharC* APC_Search, TypeLength AL_Length)*/
template<typename TCChars> bool AddSearchByFind(const TCChars& AR_CChars)
{
return AddSearchByFind(AR_CChars.data(), AR_CChars.size());
}/*
template<typename TCChars> bool AddSearchByFind(const TCChars& AR_CChars) */
template<typename TSearchCChars>
TypeLength AddSearchByCSearchCChars(const TSearchCChars& AR_CSearchCChars)
{
return ml_SearchLen += AR_CSearchCChars.GetLength
( mpc_OriginChar+ml_SearchPos, ml_OriginLen-ml_SearchPos );
}/*
template<typename TSearchCChars>
TypeLength AddSearchByCSearchCChars(const TSearchCChars& AR_CSearchCChars) */
template<typename TChainStack, typename TTmplChain>
TypeLength AddSearchByTmplChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplChain& AR_CTmplChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
{
// TChainStack 은 ZNsIFace::ZtCStackOfTmplChain<> 의 interface 를 갖는다.
ml_SearchLen += GetLengthByTmplChain(
RR(AR_CStackOfTmplChain), AR_CTmplChain, RR(ARRE_ZERegErr));
return (ARRE_ZERegErr==ZNsEnum::ZERegErr_None) ? ml_SearchLen : 0 ;
}/*
template<typename TChainStack, typename TTmplChain>
TypeLength AddSearchByTmplChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplChain& AR_CTmplChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
/////////////////////////////////////////////////*/
template<typename TTmplChain> TypeLength
AddSearchByTmplChain(TTmplChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr)
{
ZNsIFace::ZtCStackOfTmplChain<TypeLength> VO_CStackOfTmplChain;
return AddSearchByTmplChain(VO_CStackOfTmplChain, AR_CTmplChain, RR(ARRE_ZERegErr));
}/*
template<typename TTmplChain> TypeLength
AddSearchByTmplChain(TTmplChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr) */
template<typename TChainStack, typename TTmplTreeChain>
TypeLength AddSearchByTmplTreeChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplTreeChain& AR_CTmplChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
{
// TChainStack 은 ZNsIFace::ZtCStackOfTmplChain<> 의 interface 를 갖는다.
ml_SearchLen += GetLengthByTmplTreeChain(
RR(AR_CStackOfTmplChain), AR_CTmplChain, RR(ARRE_ZERegErr));
return (ARRE_ZERegErr==ZNsEnum::ZERegErr_None) ? ml_SearchLen : 0 ;
}/*
template<typename TChainStack, typename TTmplTreeChain>
TypeLength AddSearchByTmplTreeChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplTreeChain& AR_CTmplChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
/////////////////////////////////////////////////////*/
template<typename TTmplTreeChain> TypeLength AddSearchByTmplTreeChain
( const TTmplTreeChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr )
{
ZNsIFace::
ZtCStackOfTmplChain <TypeLength> VO_CStackOfTmplChain ;
return AddSearchByTmplTreeChain(
VO_CStackOfTmplChain, AR_CTmplChain, RR(ARRE_ZERegErr) );
}/*
template<typename TTmplChain> TypeLength AddSearchByTmplTreeChain
( const TTmplTreeChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr ) */
template<typename TChainStack, typename TTmplChain>
TypeLength GetLengthByTmplChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplChain& AR_CTmplChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
/*###############################################*/
{
/*////////////////////////////////////////////////////////////////////////////
■ TTmplChain 자료형으로는 ZtCSearchCChars<> 가 적합하다.
-- 2011-09-29 22:47:00
■ AR_CStackOfTmplChain 이 있으므로 해서 *this 의 멤버를 변경하지 않아도 된다.
-- 2013-06-26 01:56:00
////////////////////////////////////////////////////////////////////////////*/
typedef typename TTmplChain::ZCNowObj ZCNowObj;
const ZCNowObj& VR_CNowObj=AR_CTmplChain.GetNowObj();
TypeLength VL_LengthNow =VR_CNowObj.GetLength
(
mpc_OriginChar+ml_SearchPos+AR_CStackOfTmplChain.GetSearchSum(),
ml_OriginLen -ml_SearchPos-AR_CStackOfTmplChain.GetSearchSum()
);
/////////////////////////////////////////////
if(VL_LengthNow <VR_CNowObj.GetSearchCharMin() || (VR_CNowObj.GetSearchCharMax()>0 && VL_LengthNow>VR_CNowObj.GetSearchCharMax()))
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharCount; return 0;
}
if(AR_CStackOfTmplChain.GetSearchSum()<VR_CNowObj.GetSearchSumMin () || (VR_CNowObj.GetSearchSumMax ()>0 && VL_LengthNow>VR_CNowObj.GetSearchSumMax ()))
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharSum ; return 0;
}/*
if(AR_CStackOfTmplChain.GetSearchSum()<VR_CNowObj.GetSearchSumMin () || (VR_CNowObj.GetSearchSumMax ()>0 && VL_LengthNow>VR_CNowObj.GetSearchSumMax ()))*/
AR_CStackOfTmplChain.AddSearchSum(VL_LengthNow);
if(TTmplChain::EBoolNextObj<1)
return AR_CStackOfTmplChain.GetSearchSum() ;
return VL_LengthNow + GetLengthByTmplChain(
AR_CStackOfTmplChain, AR_CTmplChain.GetNextObj(), RR(ARRE_ZERegErr));
}/*
template<typename TChainStack, typename TTmplChain>
TypeLength GetLengthByTmplChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplChain& AR_CTmplChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
/////////////////////////////////////////////////*/
template<typename TTmplChain> TypeLength
GetLengthByTmplChain(TTmplChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr)
{
ZNsIFace::ZtCStackOfTmplChain<TypeLength> VO_CStackOfTmplChain;
return GetLengthByTmplChain(VO_CStackOfTmplChain, AR_CTmplChain, RR(ARRE_ZERegErr));
}/*
template<typename TTmplChain> TypeLength
GetLengthByTmplChain(TTmplChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr) */
template<typename TChainStack, typename TTmplTreeChain>
TypeLength GetLengthByTmplTreeChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplTreeChain& AR_CTmplTreeChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
///////////////////////////////////////////////////////
{
// 테스트가 필요. 2013-06-26 17:20:00
typedef typename TTmplTreeChain::ZCNowObj ZCNowObj;
const ZCNowObj& VR_CNowObj=AR_CTmplTreeChain.GetNowObj();
if(VR_CNowObj.GetERegFlag()==ZNsEnum::ZERegFlag_BlockStart)
{
TChainStack VO_CChainStack;
ZNsEnum::ZERegErr VE_ZERegErr =ZNsEnum::ZERegErr_None;
TypeLength VL_LengthNow=0;
TypeLength VL_LengthSum=0;
TypeLength VL_SearchCnt=0;
/*//////////////////////////////////////////////////////////////////////////////////
■ *this 멤버를 전혀 건드리지 않는 또 다른 방법은, AR_CStackOfTmplChain 이외에 스택
에 ZtCCharChain<> object 를 선언해서 사용하면 되는데, 이 구현이 더 좋을까?
-- 2013-06-26 01:08:00
//////////////////////////////////////////////////////////////////////////////////*/
while(true)
{
// '조회 Block'에 대하여 찾은 횟수가 VR_CNowObj.GetRepeatCntMax() 를
// 넘지 않는 범위 내에서 while 문을 반복한다.
VL_LengthNow=GetLengthByTmplTreeChain( ///////
RR(VO_CChainStack) ,
AR_CTmplTreeChain.GetSubObj(),
RR(VE_ZERegErr)
/*/////////*/ ); /////////////////////////////
if(VE_ZERegErr!=ZNsEnum::ZERegErr_None)
{
AR_CStackOfTmplChain.AddSearchSum(-VL_LengthSum); break;
}/*
if(VE_ZERegErr!=ZNsEnum::ZERegErr_None)*/
++VL_SearchCnt; VL_LengthSum+=VL_LengthNow;
if(VR_CNowObj.GetESearchMax()==ZNsEnum::ZESearchMax_Stop)
{
if(VL_SearchCnt==VR_CNowObj.GetRepeatCntMax())
{
AR_CStackOfTmplChain.AddSearchSum(-VL_LengthSum); break;
}/*
if(VL_SearchCnt==VR_CNowObj.GetRepeatCntMax())*/
}
if(VR_CNowObj.GetRepeatCntMax()>0)
{
if(VL_SearchCnt>VR_CNowObj.GetRepeatCntMax())
{
AR_CStackOfTmplChain.AddSearchSum(-VL_LengthSum); VL_LengthSum=0; break;
}/*
if(VL_SearchCnt>VR_CNowObj.GetRepeatCntMax())*/
}/*
if(VR_CNowObj.GetRepeatCntMax()>0)*/
AR_CStackOfTmplChain.AddSearchSum(VL_LengthNow);
if(ml_OriginLen<=ml_SearchPos+AR_CStackOfTmplChain.GetSearchSum())
{
AR_CStackOfTmplChain.AddSearchSum(-VL_LengthSum); break;
}/*
if(ml_OriginLen<=ml_SearchPos+AR_CStackOfTmplChain.GetSearchSum())*/
}/*
while(true)*/
if(VL_SearchCnt<VR_CNowObj.GetRepeatCntMin()) VL_LengthSum=0;
const bool CB_IsCharCntErr= VL_LengthSum<VR_CNowObj.GetSearchCharMin() ||
(VR_CNowObj.GetSearchCharMax()>0 && VL_LengthSum>VR_CNowObj.GetSearchCharMax() ) ;
if(CB_IsCharCntErr)
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharCount; return 0;
}/*
if(CB_IsCharCntErr)*/
AR_CStackOfTmplChain.AddSearchSum(VL_LengthSum);
const bool CB_IsCharSumErr= AR_CStackOfTmplChain.GetSearchSum()<VR_CNowObj.GetSearchSumMin() ||
(VR_CNowObj.GetSearchSumMax()>0 && AR_CStackOfTmplChain.GetSearchSum()>VR_CNowObj.GetSearchSumMax() );
if(CB_IsCharSumErr)
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharSum;
AR_CStackOfTmplChain.
AddSearchSum( -VL_LengthSum );
return 0;
}/*
if(CB_IsCharSumErr)*/
if(TTmplTreeChain::EBoolNextObj<1) return VL_LengthSum;
return VL_LengthSum + GetLengthByTmplTreeChain(
AR_CStackOfTmplChain, AR_CTmplTreeChain.GetNextObj(), RR(ARRE_ZERegErr));
}/*
if (VR_CNowObj.GetERegFlag()==ZNsEnum::ZERegFlag_BlockStart)*/
else if(VR_CNowObj.GetERegFlag()==ZNsEnum::ZERegFlag_BlockClose)
{
return 0;
}/*
else if(VR_CNowObj.GetERegFlag()==ZNsEnum::ZERegFlag_BlockClose)*/
TypeLength VL_LengthNow = VR_CNowObj.GetLength
(
mpc_OriginChar+ml_SearchPos+AR_CStackOfTmplChain.GetSearchSum(),
ml_OriginLen -ml_SearchPos-AR_CStackOfTmplChain.GetSearchSum()
);
//////////////////////////////////////////////
if(VL_LengthNow <VR_CNowObj.GetSearchCharMin() || (VR_CNowObj.GetSearchCharMax()>0 && VL_LengthNow>VR_CNowObj.GetSearchCharMax()))
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharCount; return 0;
}
if(AR_CStackOfTmplChain.GetSearchSum()<VR_CNowObj.GetSearchSumMin () || (VR_CNowObj.GetSearchSumMax ()>0 && VL_LengthNow>VR_CNowObj.GetSearchSumMax ()))
{
ARRE_ZERegErr=ZNsEnum::ZERegErr_CharSum ; return 0;
}/*
if(AR_CStackOfTmplChain.GetSearchSum()<VR_CNowObj.GetSearchSumMin () || (VR_CNowObj.GetSearchSumMax ()>0 && VL_LengthNow>VR_CNowObj.GetSearchSumMax ()))*/
AR_CStackOfTmplChain.AddSearchSum(VL_LengthNow);
if(TTmplTreeChain::EBoolNextObj<1) return VL_LengthNow;
return VL_LengthNow + GetLengthByTmplTreeChain(
AR_CStackOfTmplChain, AR_CTmplTreeChain.GetNextObj(), RR(ARRE_ZERegErr));
}/*
template<typename TChainStack, typename TTmplTreeChain>
TypeLength GetLengthByTmplTreeChain
(
TChainStack& AR_CStackOfTmplChain,
const TTmplTreeChain& AR_CTmplTreeChain ,
ZNsEnum::ZERegErr& ARRE_ZERegErr
)
/////////////////////////////////////////////////////*/
template<typename TTmplTreeChain> TypeLength GetLengthByTmplTreeChain
( TTmplTreeChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr )
{
ZNsIFace::
ZtCStackOfTmplChain<TypeLength> VO_CStackOfTmplChain;
return GetLengthByTmplTreeChain(
VO_CStackOfTmplChain, AR_CTmplChain, RR(ARRE_ZERegErr));
}/*
template<typename TTmplTreeChain> TypeLength GetLengthByTmplTreeChain
( TTmplTreeChain& AR_CTmplChain, ZNsEnum::ZERegErr& ARRE_ZERegErr ) */
public:
};/*
template< typename TTypeChars=ZNsType::ZtCTypeChars<char>
>
class ZtCSearchCursor ///////////////////////////////////*/
typedef ZNsType::ZtCTypeChars<char, ZTypLength> ZCTypeChars;
typedef ZtCMainChars<ZCTypeChars> ZCMainChars;
}/*
namespace ZNsChars*/
typedef ZNsChars ::ZCTypeChars ZCTypeChars;
typedef ZNsChars ::ZCMainChars ZCMainChars;
typedef ZCMainChars::ZCChars ZCChars ;
}/*
namespace ZNsMain */
#endif // __ZCPPMAIIN__ZTCMAINCHARS_H__
/*/////////////////////////////////////////////////////////////////////////////////////////
■ namespace ZNsChars 에는 문자열 관련 함수들이 오는데, MainChars.H 에 있는 함수보다 좀 더
확장성있게 설계하였다. 그런데 사용하기에는 다소 복잡하다. 그리고 ZtCMainChars.H 는 추후에
MainChars.H 을 대체할 것이다.
-- 2011-07-10 03:48:00
그래서 아래 선언을 namespace std 에 추가해서, 사용하기 쉽게 했다.
typedef ZNsChars::ZCTypeChars ZCTypeChars;
typedef ZNsChars::ZCMainChars ZCMainChars;
-- 2011-08-15 18:16:00
■ ZtCMainChars<>::DoStart() 등의 함수에 대소문자를 구분 여부를, ZtCMainChars<> 의 템플릿
인자에 bool 등의 값으로 지정하려고 하였으나, utf8 등의 경우에 아주 골치 아플 것 같아서,
기본적으로 대소문자 구분을 하는 것으로 한다. 굳이 대소문자 구분을 하고 싶은 경우는, 정규
표현식 관련 object 을 쓰도록 하자.
-- 2011-07-12 07:14:00
■ 'char 의 int 확장에 따른 문제의 코드'
아래 함수에서
int ZtCMainChars<>::Minus(TypeCharC*, TypeCharC*, TypeLength, TypeLength)
return 문을
return VC_Minus; // VC_Minus 는 *(VP_Left-1)-*(VP_Right-1)
에서
return int(*(VP_Left-1))-int(*(VP_Right-1));
로 고쳤다. 컴파일러에 따라, 음수 char 을 int 로 확장하면 양수(+)가 될 수 있는 것이다. 이
것을 언제 알았냐면, LG CNS 에서 충전기 프로젝트를 할 때다. 그때 ELDK 4.0 tool chain 의
컴파일러를 사용했는데, NsUtility::CLoadSimUrlConfig_T<> 으로 설정 파일을 읽어들일 때, 자
꾸 몇몇 설정값을 인식하지 못하고 있었다. CLoadSimUrlConfig_T<> 은 ns1.cppschool.com 과
ns2.cppschool.com 에서 테스트된 클래스이다. 그런데도 이런 문제가 발생한 것이다. 이전에
Hemose 의 메신저 서버를 만들 때에도 이런 문제가 있었는데, 풀리지 않을 것 같은 문제로 여
기고 매우 긴장하고 있었다. CObjAVL.H 파일의 AddKey() 함수의 비교하는 부분에 cout 으로
출력해 보니까, 항상 '>' 조건이 아닌가. 그래서 ZtCMainChars<>::Minus() 함수까지 파들어가
리턴하는 값을 보니까 항상 양수였다! 이럴수가, 왼쪽이 작으면 음수를 리턴해야 한다. 그런
데 항상 양수라니. 좀 더 조사해 보니까, 해당 컴파일러의, char 의 int 형 확장에 따른 문제
였고 코드를 위처럼 고치게 되었다.
-- 2011-12-29 17:35:00
/////////////////////////////////////////////////////////////////////////////////////////*/