7298 lines
331 KiB
C++
7298 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 ;
|
|
}/*
|
|
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
|
|
/////////// ) */
|
|
|
|
|
|
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
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////*/
|