From 1dd4a87e7517241971e03373e25491d3e850375a Mon Sep 17 00:00:00 2001 From: sauron Date: Sun, 17 Aug 2025 02:54:18 +0900 Subject: [PATCH] =?UTF-8?q?commit=202025-08-17=2002:54=20utf8=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20:=20some=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZCppMain/ZMainAVL.H | 36 +-- ZCppMain/ZMainXhtml.H | 10 +- ZCppMain/ZtCMainChars.H | 760 ++++++++++++++++++++++++------------------------ ZCppMain/ZtCTreeData.H | 156 +++++----- 4 files changed, 481 insertions(+), 481 deletions(-) diff --git a/ZCppMain/ZMainAVL.H b/ZCppMain/ZMainAVL.H index 885321a..2db47b4 100644 --- a/ZCppMain/ZMainAVL.H +++ b/ZCppMain/ZMainAVL.H @@ -1,4 +1,4 @@ - + #ifndef __ZCPPMAIN_ZMAINAVL_H__ #define __ZCPPMAIN_ZMAINAVL_H__ @@ -16,9 +16,9 @@ namespace ZNsMain enum ZEAVL_INSERT { ZEAVL_INSERT_RIGHT = +1, - ZEAVL_INSERT_OK = 0, /* 0 ̴. */ + ZEAVL_INSERT_OK = 0, /* 삽입 후의 평형계수가 0 이다. */ ZEAVL_INSERT_LEFT = -1, - ZEAVL_INSERT_NONE = -2 /* */ + ZEAVL_INSERT_NONE = -2 /* 삽입 안 됨 */ };/* enum ZEAVL_INSERT*/ @@ -50,13 +50,13 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////// - Ʒ ZtCAVL_NodeBase<> Լ ZtCAVL_BASE<> Լ - μ ϳ پ ִ. ZtCAVL_BASE<> ̸ Լ - ڿ ȣ ְ ̴. ZtCAVL_BASE<> Լ - , AP_Node->OnEqual() ZtCAVL_NodeBase<> Լ ȣ - , ZtCAVL_NodeBase<> 𿡼 ȣ ʴ´. - ̷ . ߴµ, Ƹ ZtCAVL_Multi_BASE<> - ZtCAVL_Multi_NodeBase<> ҷ ׷ ̴. + ■ 아래 ZtCAVL_NodeBase<> 의 각 멤버 함수는 ZtCAVL_BASE<> 의 멤버 함수보다 + 인수가 하나 줄어든 것을 볼 수 있다. ZtCAVL_BASE<> 에서 같은 이름의 함수를 + 자연스럽게 호출할 수 있게 한 것이다. 따라서 ZtCAVL_BASE<> 의 멤버 함수에 + 서, AP_Node->OnEqual() 등으로 ZtCAVL_NodeBase<> 의 멤버 함수를 호출해 주 + 지 않으면, ZtCAVL_NodeBase<> 의 멤버는 어디에서도 호출되지 않는다. 왜 최초 + 에 이런 식으로 설계했을까. 한참 생각했는데, 아마 ZtCAVL_Multi_BASE<> 와 + ZtCAVL_Multi_NodeBase<> 를 사용할려고 그랬을 것이다. -- 2012-09-03 19:20:00 @@ -104,8 +104,8 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////// - ZtCAVL_Multi_NodeBase template multi set/map ϴ , - ZtCAVL_Multi_NodeBase::TypeEqual ڷ ϴ . + ■ ZtCAVL_Multi_NodeBase template 로 multi set/map 을 구성하는 경우, + ZtCAVL_Multi_NodeBase::TypeEqual 자료형에 접근하는 예. class CTypeMy { @@ -154,8 +154,8 @@ namespace ZNsMain /*///////////////////////////////////////////////////////////////////// - AVL Ʈ Ÿ Ÿ , ͸ ó ٷ - ڸ ϴ Ŭ ø̴. + ■ AVL 트리의 데이타 타입이 포인터인 경우, 포인터를 정수처럼 다루어서 + 비교 연산자를 정의하는 클래스 템플릿이다. /////////////////////////////////////////////////////////////////////*/ @@ -217,9 +217,9 @@ namespace ZNsMain template class ZtCAVL_PtrLongData*/ - /* int, long 񱳿 primitive Ÿ̳ object - key ִ 쿡, ش AVL Ʈ Ÿ ٷ - ֵ wrap Ŭ ø */ + /* int, long 같이 비교연산이 가능한 primitive 타입이나 object 를 + key 로 가지고 있는 경우에, 해당 AVL 트리의 노드 데이타로 바로 + 쓸 수 있도록 wrap 한 클래스 템플릿 */ template< typename TKeyData , typename TMainData, @@ -305,7 +305,7 @@ namespace ZNsMain /*///////////////////////////////////////////////////////////////////////////////////// - mulit set Ȱϴ ڵ + ■ mulit set 으로 활용하는 예제코드 ZNsMain::CLargeAVL /////////////////////////////////// < diff --git a/ZCppMain/ZMainXhtml.H b/ZCppMain/ZMainXhtml.H index 82b1707..6f8828e 100644 --- a/ZCppMain/ZMainXhtml.H +++ b/ZCppMain/ZMainXhtml.H @@ -1,4 +1,4 @@ - + #ifndef __ZCPPMAIIN__ZMAINXHTML_H__ #define __ZCPPMAIIN__ZMAINXHTML_H__ @@ -9,9 +9,9 @@ namespace ZNsMain template TStringData& ZftConvertXhtml(TStringData& ARR_CString) { - /* Ÿ ״ Ŭ̾Ʈ ϸ - HTML ±׿ ȥ ִµ ̸ ϱ - ڵѴ. + /* 데이타를 그대로 클라이언트에 전송하면 + HTML 태그와 혼동될 수 있는데 이를 방지하기 위해 + 적절히 인코딩한다. */ return ARR_CString. Replace("&" ,"&" ). Replace("<" ,"<" ). @@ -22,7 +22,7 @@ namespace ZNsMain template TStringData& ZftConvertXhtmlAtt(TStringData& ARR_CString) { - // X(H)TML Ӽ ִ ڵѴ. + // X(H)TML 의 속성에 올 수 있는 값으로 인코딩한다. return ARR_CString. Replace("&" ,"&" ). Replace("<" ,"<" ). diff --git a/ZCppMain/ZtCMainChars.H b/ZCppMain/ZtCMainChars.H index cb176df..12c49dc 100644 --- a/ZCppMain/ZtCMainChars.H +++ b/ZCppMain/ZtCMainChars.H @@ -1,4 +1,4 @@ - + #ifndef __ZCPPMAIIN__ZTCMAINCHARS_H__ #define __ZCPPMAIIN__ZTCMAINCHARS_H__ @@ -33,11 +33,11 @@ namespace ZNsMain /*//////////////////////////////////////////////////////////////////////////// - ESearchMaxFind ZtCMainChars<>::GetLength_Repeat_Find() Լ, - ִ ߰ Ƚ(AI_RepeatMax) ȿ , AI_RepeatMax ŭ ߰ - ڿ ȸ , ȸ (׷ ش - ڿ ٽ ߰ϸ, AI_RepeatMax+1 ߰ ǰ, ̰ ǿ - ʴ Ǵؾ Ѵ) Ѵ. + ■ ESearchMaxFind 은 ZtCMainChars<>::GetLength_Repeat_Find() 등의 함수에서, + 최대 발견 횟수(AI_RepeatMax)가 유효한 값인 경우, AI_RepeatMax 만큼 발견한 + 시점에서 문자열 조회를 멈출 것인지, 한 번 더 조회할 것인지(그래서 해당 문 + 자열을 또 다시 발견하면, AI_RepeatMax+1 번 발견한 것이 되고, 이것은 조건에 + 맞지 않는 것으로 판단해야 한다)를 결정한다. -- 2011-07-16 03:49:00 @@ -46,9 +46,9 @@ namespace ZNsMain /*////////////////////////////////////////////////////// - ش ǥİ ġϴ ڿ ġ - ZERegMatch_MoveNot ̸ ̵ ʴ´. - ZERegMatch_MovePos ̸ ̵Ų. + ■ 해당 표현식과 일치하는 문자열이 있으면 시작 위치값을 + ZERegMatch_MoveNot 이면 이동하지 않는다. + ZERegMatch_MovePos 이면 이동시킨다. //////////////////////////////////////////////////////*/ @@ -62,9 +62,9 @@ namespace ZNsMain /*////////////////////////////////////////////////////// - ش ǥİ ġϴ ڿ , ġ - ZERegMatchSavePos_Not ̸ ʴ´. - ZERegMatchSavePos_Yes ̸ Ѵ. + ■ 해당 표현식과 일치하는 문자열이 있으면, 위치 정보를 + ZERegMatchSavePos_Not 이면 저장하지 않는다. + ZERegMatchSavePos_Yes 이면 저장한다. //////////////////////////////////////////////////////*/ @@ -79,66 +79,66 @@ namespace ZNsMain 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_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' κ + ZERegFlag_BlockStart , // '조회 Block'의 시작 부분 + ZERegFlag_BlockClose // '조회 Block'의 종료 부분 };/* enum ZERegFlag*/ /*//////////////////////////////////////////////////////////////////////////// - enum ZERegErr class ZtCSearchCChars ϴ ڵ. + ■ enum ZERegErr 은 class ZtCSearchCChars 에서 사용하는 에러 코드다. - ZERegErr_CharCount : ã + □ ZERegErr_CharCount : 찾은 문자 갯수가 - ZtCSearchCChars::mi_SearchCharMin - ZtCSearchCChars::mi_SearchCharMax ̿ ʴ. + ZtCSearchCChars::mi_SearchCharMin 와 + ZtCSearchCChars::mi_SearchCharMax 사이에 있지 않다. - ZERegErr_CharSum : + □ ZERegErr_CharSum : - ZtCSearchCChars ̳(ַ 迭) μ ޾Ƽ, - ؼ ZtCSearchCChars ġϴ ڸ ã , - ġϴ ڸ Ư (ַ ) ϰ Ǵµ, ã - , + ZtCSearchCChars 의 컨테이너(주로 배열)을 인수로 받아서, + 연속해서 ZtCSearchCChars 와 일치하는 문자를 찾는 경우, + 일치하는 문자를 특정 변수(주로 지역 변수)에 계속 더하게 되는데, 찾은 + 총 문자 문자 갯수가, 즉 이 변수의 값이 - ZtCSearchCChars::mi_SearchSumMin - ZtCSearchCChars::mi_SearchSumMax ̿ ̴. + ZtCSearchCChars::mi_SearchSumMin 와 + ZtCSearchCChars::mi_SearchSumMax 사이에 있지 않은 경우이다. - -- + □ -- - ȸ Block + ■ 조회 Block - ڿ Ư ã , ã object - 迭̳ tree · ϰ Ǵµ, ̶ ã ó ҿ - 'ȸ Block'̶ Ѵ. Ư tree - ο Ʈ ְ, ο 'ȸ Block' ߻ϴ - ϱ ʿ ̴. + 지정된 문자열에서 특정 패턴을 찾는 조건이 복잡할 경우는, 찾는 조건 object 를 + 배열이나 tree 형태로 설계하게 되는데, 이때의 찾는 조건의 처음 원소와 끝 원소 + 의 단위를 '조회 Block'이라고 한다. 특히 tree 형태일 때 하위 노드로 내려가면 + 새로운 노드 리스트가 있고, 따라서 새로운 '조회 Block' 이 발생하는 것을 설명 + 하기 위해 필요한 용어이다. -- 2013-06-25 23:37:00 ////////////////////////////////////////////////////////////////////////////*/ - enum ZERegErr // ǥ ڵ. + enum ZERegErr // 정규 표현식 관련 에러 코드. { - ZERegErr_None , // . - ZERegErr_CharCount, // ã . - ZERegErr_CharSum // ã . + ZERegErr_None , // 에러 없음. + ZERegErr_CharCount, // 찾은 문자 갯수 에러. + ZERegErr_CharSum // 찾은 문자 누적 갯수 에러. };/* enum ZERegErr*/ @@ -183,7 +183,7 @@ namespace ZNsMain namespace ZNsIFace { - // ̸ ZNsInterface ª ZNsIFace ε ǥ ϰ Ѵ. + // 이름공간 ZNsInterface 을 짧게 ZNsIFace 으로도 표기 가능하게 한다. using namespace ZNsInterface; }/* @@ -193,16 +193,16 @@ namespace ZNsMain namespace ZNsType { - // 쿡 TTypeChar short int int ִ. + // 경우에 따라 TTypeChar 는 short int 나 int 가 될 수 있다. template< typename TTypeChar =char, - typename TTypeLength=ZTypLength // signed ̾ Ѵ. + typename TTypeLength=ZTypLength // signed 형이어야 한다. > class ZtCTypeChars /*////////////////////*/ { public: typedef TTypeChar TypeChar ; - typedef TTypeLength TypeLength; // signed ̾ Ѵ. + typedef TTypeLength TypeLength; // signed 형이어야 한다. public: typedef const TypeChar TypeCharC ; typedef const TypeChar* TypeCharCP; @@ -216,8 +216,8 @@ namespace ZNsMain static bool IsAnsiChars(TypeCharC* APC_Char,TypeLength AI_Length) { - // Ansi 7bit ̸ true . - // AI_Length<1 쿡 true + // Ansi 7bit 문자이면 true 를 리턴. + // AI_Length<1 인 경우에도 true 를 리턴 while(--AI_Length>=0) { @@ -332,9 +332,9 @@ namespace ZNsMain int operator-(const ZCChars& rhs) const { - // ڿ 0 - // ڿ ũ 0 ū  - // ڿ ũ 0  ȯ + // 두 문자열이 같으면 0 + // 왼쪽 문자열이 크면 0 보다 큰 어떤 수 + // 오른쪽 문자열이 크면 0 보다 작은 어떤 수를 반환 TypeCharC* VP_Left = mp_TypeChar; TypeCharC* VP_Right=rhs.mp_TypeChar; @@ -342,7 +342,7 @@ namespace ZNsMain #if(_CODE_OLD_) TypeChar VC_Minus=0; #else - int VI_Minus=0; // ϴ 'char int Ȯ忡 ڵ' . + int VI_Minus=0; // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고. #endif TypeLength VL_Index=0; TypeLength VL_Loop =(ml_TypeLength<=rhs.ml_TypeLength ? ml_TypeLength : rhs.ml_TypeLength) ; @@ -358,7 +358,7 @@ namespace ZNsMain #else if((VI_Minus=int(*VP_Left++) - int(*VP_Right++))!=0) { - return VI_Minus; // ϴ 'char int Ȯ忡 ڵ' . + return VI_Minus; // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고. }/* if((VI_Minus=int(*VP_Left++) - int(*VP_Right++))!=0)*/ #endif @@ -585,9 +585,9 @@ namespace ZNsMain const TypeChar* APC_Left , const TypeChar* APC_Right, TypeLength AL_LeftLength, TypeLength AL_RightLength ) { - // ڿ 0 - // ڿ ũ 0 ū  - // ڿ ũ 0  ȯ + // 두 문자열이 같으면 0 + // 왼쪽 문자열이 크면 0 보다 큰 어떤 수 + // 오른쪽 문자열이 크면 0 보다 작은 어떤 수를 반환 if(AL_LeftLength<1 || AL_RightLength<1) { @@ -610,7 +610,7 @@ namespace ZNsMain { if((VC_Minus=(*VP_Left++ - *VP_Right++))!=0) { - return VC_Minus; // ϴ 'char int Ȯ忡 ڵ' . + return VC_Minus; // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고. }/* if((VC_Minus=(*VP_Left++ - *VP_Right++))!=0)*/ @@ -624,7 +624,7 @@ namespace ZNsMain { if(*VP_Left++ != *VP_Right++) { - return int(*(VP_Left-1))-int(*(VP_Right-1)); // ϴ 'char int Ȯ忡 ڵ' . + return int(*(VP_Left-1))-int(*(VP_Right-1)); // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고. }/* if(*VP_Left++ != *VP_Right++)*/ @@ -643,7 +643,7 @@ namespace ZNsMain static TypeChar* Trim(TypeChar* APC_Char, TypeLength& ARRL_Length) { - // ARRL_Length APC_Char ÿ APC_Char Trim ̸ Թ޴´. + // ARRL_Length 은 APC_Char 의 길이인 동시에 APC_Char 을 Trim 한 후의 길이를 대입받는다. if(ARRL_Length<1) return 0; @@ -664,11 +664,11 @@ namespace ZNsMain }/* for(; i0) { - // ڸ i . + // 문자를 i 개 앞으로 당긴다. for(TypeLength t=i; t0)*/ - VPC_Char = APC_Char+(ARRL_Length-1); // Ų. + VPC_Char = APC_Char+(ARRL_Length-1); // 맨 끝을 가리킨다. for(i=ARRL_Length-1; i>=0; --i) { @@ -752,8 +752,8 @@ namespace ZNsMain IterEasyIDc CI_IterEasyID(ARA_SearchArray.GetHeadIterEasyID()); - /* ݺ const_iterator ڵϸ APR_CStringStart - Լ ܺο const TString* VP_CStringData · Ǿ Ѵ. */ + /* 상수 반복자 const_iterator 으로 코딩하면 APR_CStringStart 는 + 함수 외부에서 const TString* VP_CStringData 형태로 선언되어야 한다. */ for(TypeLength i=1; i<=VL_ArrSize; ++i) { @@ -791,8 +791,8 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////// - Ʒ typename TTyChars ڸ ø Լ TTyChars ڸ - , ZCChars Ŭ data(), size() Ŭ ִ. + ■ 아래 typename TTyChars 인자를 가진 템플릿 함수는 TTyChars 의 자리 + 에, ZCChars 클래스같이 data(), size() 멤버를 갖는 클래스가 올 수 있다. -- 2011-07-13 05:39:00 @@ -858,8 +858,8 @@ namespace ZNsMain 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 ȯѴ. */ + /* APC_Origin1 와 APC_Origin2 을 연속된 문자열로 보았을때, + 전체 문자열이 APC_Search 로 끝나면 true 를 반환한다. */ const bool CB_IsBad = ( AL_SearchLength<1 || AL_OriginLength1+AL_OriginLength2AL_SearchLength + ■ 경우1 : AL_OriginLength2>AL_SearchLength - APC_Origin1, APC_Origin2 ABCDEFGH IJKLMNOPQRSTU - APC_Search LMNOPQRSTU + APC_Origin1, APC_Origin2 ☞ ABCDEFGH IJKLMNOPQRSTU + APC_Search ☞ LMNOPQRSTU - 2 : AL_OriginLength2<=AL_SearchLength + ■ 경우2 : AL_OriginLength2<=AL_SearchLength - APC_Origin1, APC_Origin2 ABCDEFGH IJKLMNOPQRSTU - APC_Search GHIJKLMNOPQRSTU + APC_Origin1, APC_Origin2 ☞ ABCDEFGH IJKLMNOPQRSTU + APC_Search ☞ GHIJKLMNOPQRSTU - -- 2011-03-09 09:49:00 + ■ -- 2011-03-09 09:49:00 /////////////////////////////////////////////////////*/ @@ -913,7 +913,7 @@ namespace ZNsMain TypeLength AL_OriginLength1, TypeLength AL_OriginLength2, TypeLength AL_SearchLength )*/ - // յ κ ڿ APC_Search true. + // 앞뒤 부분의 문자열이 APC_Search 로 끝나면 true. bool DoWrap(TypeCharC* APC_Origin, TypeCharC* APC_Search, TypeLength AL_OriginLen, TypeLength AL_SearchLen) { @@ -950,13 +950,13 @@ namespace ZNsMain /*////////////////////////////////////////////////////// - Ʒ while ڵ忡 + ■ 아래 while 문 코드에서 if(j<1) ++i; else i+=j; - κ ָ . - ӵ N ڸ ãƾ ϴµ, M( ZCTypeChars; typedef std::NsChars::ZtCMainChars ZCMainChars; @@ -1276,9 +1276,9 @@ namespace ZNsMain cout<<"FindPosEscWrap="< ZCTypeChars; typedef std::NsChars::ZtCMainChars ZCMainChars; @@ -1397,9 +1397,9 @@ namespace ZNsMain cout<<"pos="< + ■ template bool FindPosReady( TReadyExec AR_CReadyExec , const ZCChars& AR_CCharsOrigin , const ZCChars& AR_CCharsSearch , TString& ARR_CStrReadyBuff, - TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() offset ̴. + TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다. ZNsEnum::ZERun& ARRE_ERun ///////////// ) -  ڿ ã ϴ Ÿ ִµ, ڿ ʹ  ϴ , - ڿ ݾ о ã ڿ Ž ʿ䰡 ִ. ü Ʒ ڿ . + 어떤 문자열에서 찾으려고 하는 데이타가 있는데, 문자열이 너무 길어서 한 번에 다 읽지 못하는 경우, + 문자열을 조금씩 읽어서 찾는 문자열을 탐색할 필요가 있다. 구체적으로 아래 문자열로 예를 들어보자. abc_BOUND1_defg_BOUND2_hijkmln_BO_BOUND3_opqrstuvwxyz - ڿ ã ڿ BOUND1, BOUND2, BOUND3 ̸ ڿ ã -  ڷῡ Ͽ Ư ó ϰ ϴ ̴. + 이 문자열에서 찾는 문자열은 순서대로 BOUND1, BOUND2, BOUND3 이며 이 문자열을 찾을 때마다 그 이전 + 어떤 자료에 대하여 특정한 처리를 하고자 하는 것이다. - ó abc_BOU оٰ ġ. ׷ ó ãƾ ϴ ڿ BOUND1 Ƿ, abc_BOU - Ͽ  ó ִ. ׷ abc_BOU ڿ ã ڿ պκ - (BOU) ϰ Ƿ, κ abc_ ؼ ó ־ Ѵ( εϴ - ڿ ND1 ִ ̴.) ׸ BOU ۿ ´. + 처음에는 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 ؼ Ƚϰ(?) ó ش. + 그후 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 ۿ ´. + 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 ó ָ ȴ. + 4 번째로 _BOUND3_opqrstuvwxyz 을 읽었다. 버퍼에 있는 BO 를 생각하면 BO_BOUND3_opqrstuvwxyz 를 읽은 것 + 이 된다. 여기서 BOUND3 을 찾게 되고 버퍼에 있는 데이타 BO 와 그 다음 _ 에 대해서 지정된 처리를 해주면 + 된다. 그 다음 BOUND3 의 다음 데이타 _opqrstuvwxyz 을 처리해 주면 된다. - ˰ FindPosReady(~) ̴. + 이 알고리즘을 구현한 것이 FindPosReady(~) 이다. - FindPosReady() о ڿ AR_CCharsSearch.data() Ͽ AR_CCharsOrigin.data() ã´. - ã о ڿ ã ڿ Ƿ, ϴ AR_CCharsOrigin.data() - ڿ AR_CCharsSearch.data() պκа ġϴ ڸ ARR_CStrReadyBuff Ѵ. ( ڵ - ã ڿ Ϻ ִ.) + FindPosReady() 은 읽어들인 문자열을 AR_CCharsSearch.data() 에 대입하여 AR_CCharsOrigin.data() 을 찾는다. + 못찾았으면 다음에 읽어들인 문자열에 찾는 문자열이 존재할 수 있으므로, 일단 AR_CCharsOrigin.data() 의 + 뒤에서 AR_CCharsSearch.data() 의 앞부분과 일치하는 문자를 ARR_CStrReadyBuff 에 저장한다. (이 문자들은 + 찾는 문자열의 일부일 수 있다.) - TReadyExec Ʒ ϸ ִ. + ■ TReadyExec 는 아래 두 멤버를 가져야 하며 참조형일 수 있다. std::ZNsEnum::ZERun TReadyExec::OnMeetNormal(TypeCharC*,TypeLength); std::ZNsEnum::ZERun TReadyExec::OnMeetReady (TypeCharC*,TypeLength,std::ZNsEnum::ZERun); - ã ڿ ARR_CStrReadyBuff AR_CCharsOrigin.data() ÿ ִµ, ã ڿ - ã + 찾는 문자열은 ARR_CStrReadyBuff 와 AR_CCharsOrigin.data() 에 동시에 갈라져 있을 수 있는데, 찾는 문자열을 + 완전히 찾은 경우는 - OnMeetReady() 3 μ ZNsMain::ZNsEnum::ZERun_NO ̰ - ã 3 μ ZNsMain::ZNsEnum::ZERun_OK ̴. + OnMeetReady() 멤버의 3 번 인수가 ZNsMain::ZNsEnum::ZERun_NO 이고 + 못찾은 경우는 3 번 인수가 ZNsMain::ZNsEnum::ZERun_OK 이다. - μ TString& ARR_CStrReadyBuff ȭ ִ ִ. + ■ 인수 TString& ARR_CStrReadyBuff 을 빼고 좀 더 최적화할 수 있는 여지는 있다. ////////////////////////////////////////////////////////////////////////////////////////////*/ @@ -1771,19 +1771,19 @@ namespace ZNsMain const TTyChars& AR_CCharsOrigin , const TTyChars& AR_CCharsSearch , TString& ARR_CStrReadyBuff, - TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() offset ̴. + TypeLength& ARRL_StartPos , // AR_CCharsOrigin.data() 의 offset 이다. ZNsEnum::ZERun& ARRE_ERun /*//////////*/ ) ////////////////////////////////////////*/ { /*########################################################################################### - ARR_CStrReadyBuff AR_CCharsSearch.data() պκа ġϴ ڿ ִ. - ٸ Ÿ ʵ ؾ Ѵ. + ■ ARR_CStrReadyBuff 에는 AR_CCharsSearch.data() 의 앞부분과 일치하는 문자열이 들어 있다. + 다른 엉뚱한 데이타가 들어있지 않도록 만전을 기해야 한다. - ARRL_StartPos Լ true ȯ - ( AR_CCharsSearch.data() ã) AR_CCharsOrigin.data() ٽ ȸ ؾ - ϴ ġ õȴ. ׷ ȸÿ AR_CCharsOrigin.data()+ARRL_StartPos - ȸϸ ȴ. + ■ ARRL_StartPos 는 이 함수가 true 를 반환할 때는 + (즉 AR_CCharsSearch.data() 를 찾았으면) AR_CCharsOrigin.data() 에서 다시 조회를 시작해야 + 하는 위치로 셋팅된다. 그래서 다음 번 조회시에는 AR_CCharsOrigin.data()+ARRL_StartPos 부터 + 조회하면 된다. ###########################################################################################*/ @@ -1800,7 +1800,7 @@ namespace ZNsMain if(VL_ReadyBuffSize+VO_CCharsOrigin.size()VL_CopyStartPos) { @@ -2703,11 +2703,11 @@ namespace ZNsMain { /*////////////////////////////////////////////////////////////////////////// - AB_DoEndWhenNoMatch==true ̸ йڿ ϳ ã - ü ڿ APC_OriginChar ARR_SaveList ʰ Ѵ. + ■ AB_DoEndWhenNoMatch==true 이면 구분문자열을 하나도 찾지 못한 경우 + 전체 원본 문자열 APC_OriginChar 을 ARR_SaveList 에 저장하지 않고 종료한다. - ӵ APC_SearchChar ̿ ٸ ڰ  - ִ TString object ARR_SaveList Ѵ. + ■ 연속된 APC_SearchChar 사이에 다른 문자가 없어도 + 비어 있는 TString object 를 ARR_SaveList 에 저장한다. //////////////////////////////////////////////////////////////////////////*/ @@ -2734,13 +2734,13 @@ namespace ZNsMain }/* for(j=0; jVL_CopyStartPos) { @@ -2835,19 +2835,19 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////// - 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 . + ■ 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 - -- + ■ -- //////////////////////////////////////////////////////////////////////*/ @@ -2866,8 +2866,8 @@ namespace ZNsMain bool AB_DoAppendEachLink=false /*//////////*/ ) ///////////////////////////////////////////////*/ { - // AB_DoEndWhenNoMatch==true ̸ ڿ ϳ ã - // ü ڿ APC_OriginChar ARR_SaveList ʰ Ѵ. + // AB_DoEndWhenNoMatch==true 이면 구분 문자열을 하나도 찾지 못한 경우 + // 전체 원본 문자열 APC_OriginChar 을 ARR_SaveList 에 저장하지 않고 종료한다. if(AL_WrapStartLen<1 && AL_WrapCloseLen<1) { @@ -3103,8 +3103,8 @@ namespace ZNsMain ////////////// ) ///////////////////////////////////////////////////*/ - /* APC_OriginChar APC_Search ã ã - TSearchInfoList ԷѴ. TSearchPosList ̴̳. */ + /* APC_OriginChar 에서 APC_Search 을 찾았으면 찾은 정보를 + TSearchInfoList 에 입력한다. TSearchPosList 는 정수 컨테이너이다. */ template static void MakeInfoList( TypeCharC* APC_OriginChar, @@ -3135,13 +3135,13 @@ namespace ZNsMain }/* for(; j0) { @@ -3275,7 +3275,7 @@ namespace ZNsMain /////////////////////////////////////////////////////////////////////////////////*/ - // APC_Search ڿ ãƼ, ڿ ̱ Ѵ. + // APC_Search 문자열을 찾아서, 있으면 그 문자열 길이까지 구한다. static TypeLength GetLength_Find( TypeCharC* APC_Origin, TypeLength AL_OriginLen, @@ -3286,7 +3286,7 @@ namespace ZNsMain return 0; ///////////////////////////////////////////////////////////////// - // AL_OriginLen>=AL_SearchLen + // 현재 AL_OriginLen>=AL_SearchLen TypeLength j=0; TypeLength VL_MaxLoop=AL_OriginLen-AL_SearchLen; @@ -3330,8 +3330,8 @@ namespace ZNsMain GetLength_Find(const TTyChars& CCharsOrigin, const TTyChars& CCharsSearch) */ - /* ARA_SearchArray ڿ ã ϹǷ, - ãƾ ϴ ڿ ARA_SearchArray տ ִ . */ + /* ARA_SearchArray 의 앞 원소인 문자열부터 찾기 시작하므로, + 먼저 찾아야 하는 문자열은 ARA_SearchArray 의 앞에 있는 것이 좋다. */ template static TypeLength GetLength_Find2( TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray) @@ -3372,7 +3372,7 @@ namespace ZNsMain static TypeLength GetLength_Find2(const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */ - // APC_Search ڿ ߿ ϳ ġϸ ̱ ؿ´. + // APC_Search 문자열의 문자 중에 하나라도 일치하면 그 길이까지 구해온다. static TypeLength GetLength_FindChar( TypeCharC* APC_Origin, TypeLength AL_OriginLen, @@ -3391,7 +3391,7 @@ namespace ZNsMain VP_Left =VP_Origin ; VP_Right=APC_Search; - // ڸ ã ã ġ i ã 1 ؼ Ѵ. + // 문자를 찾았으면 찾은 위치 i 에 찾은 문자 길이 1 을 더해서 리턴한다. for(j=0; j static TypeLength GetLength_FindEscape2( TypeCharC* APC_Origin, TypeLength AL_OriginLen, const TStringArray& ARA_SearchArray) { - /* ARA_SearchArray ù° Ҹ escape ڿ . - ARA_SearchArray 迭 2 ̻̾ Ѵ. */ + /* ARA_SearchArray 의 첫번째 원소를 escape 문자열로 쓴다. + 따라서 ARA_SearchArray 의 배열 갯수는 2 이상이어야 한다. */ const int CI_MinArrSize=2; @@ -3596,8 +3596,8 @@ namespace ZNsMain { /*////////////////////////////////////////////////// - ZtCMainChars::GetLength_Find() Լ ̿Ͽ, - ARA_SearchArray 1 Һ ã´. + ■ ZtCMainChars::GetLength_Find() 함수를 이용하여, + ARA_SearchArray 의 1번 원소부터 순서대로 찾는다. -- 2011-08-09 03:44:00 @@ -3645,7 +3645,7 @@ namespace ZNsMain TypeCharC* APC_Search, TypeLength AL_SearchLen /*//////////*/ ) { - // APC_Search ڰ APC_Origin ־ Ѵ. + // APC_Search 의 각 문자가 APC_Origin 에 순서대로 있어야 한다. if(AL_OriginLen<1 || AL_SearchLen<1 || AL_OriginLen0) { - ARA_SearchArray.MoveNextIter(RR(CI_IterEasyID)); continue; // ִ ٸ + 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)*/ @@ -4055,8 +4055,8 @@ namespace ZNsMain { /*//////////////////////////////////////////////// - AL_PermitLength 2 μ, 2 ڰ, - ϴ Ÿ. + ■ AL_PermitLength 은 2 의 배수로서, 2개의 문자가, + 허용하는 문자의 범위를 나타낸다. -- 2011-08-12 00:53:00 @@ -4109,7 +4109,7 @@ namespace ZNsMain static TypeLength GetLength_PermitCharRange2( TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray) { - // ARA_SearchArray ڿ Ҹ ã´. + // ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다. TypeLength VL_ArrSize =ARA_SearchArray.size(); TypeLength VL_SearchNow=0; @@ -4157,7 +4157,7 @@ namespace ZNsMain static TypeLength GetLength_PermitChar2( TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray) { - // ARA_SearchArray ڿ Ҹ ã´. + // ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다. TypeLength VL_ArrSize =ARA_SearchArray.size(); TypeLength VL_SearchNow=0; @@ -4199,8 +4199,8 @@ namespace ZNsMain const TTyChars& AR_CCharsOrigin, const TStringArray& ARA_SearchArray) */ - /* Ư ڿ Ư ڿ , ش ̸ 1 ȯѴ. - ںʹ ' ڿ' ֱ ̴. */ + /* 특정 문자열이 특정 문자열을 가지고 있지 않으면, 해당 길이를 1 로 반환한다. + 그 다음 문자부터는 '불허용 문자열'일 수 있기 때문이다. */ template static TypeLength GetLength_NoPermit( @@ -4363,7 +4363,7 @@ namespace ZNsMain static TypeLength GetLength_NoPermitChar2( TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray) { - // ARA_SearchArray ڿ Ҹ ã´. + // ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다. TypeLength VL_ArrSize =ARA_SearchArray.size(); TypeLength VL_SearchNow=0; @@ -4410,8 +4410,8 @@ namespace ZNsMain { /*//////////////////////////////////////////////// - AL_PermitLength 2 μ, 2 ڰ, - ʴ Ÿ. + ■ AL_PermitLength 은 2 의 배수로서, 2개의 문자가, + 허용하지 않는 문자의 범위를 나타낸다. -- 2011-08-12 00:53:00 @@ -4464,7 +4464,7 @@ namespace ZNsMain static TypeLength GetLength_NoPermitCharRange2( TypeCharC* APC_Origin, TypeLength AL_Length, const TStringArray& ARA_SearchArray) { - // ARA_SearchArray ڿ Ҹ ã´. + // ARA_SearchArray 의 각 문자열 원소를 순서대로 찾는다. TypeLength VL_ArrSize =ARA_SearchArray.size(); TypeLength VL_SearchNow=0; @@ -4521,7 +4521,7 @@ namespace ZNsMain TypeLength VL_LengthAll=0; TypeLength VL_LengthNow=0; - if(AI_RepeatMax<1) // ȿ 'ִ ݺ Ƚ' , Ѵ ݺ + if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용 { do ////// { @@ -4554,11 +4554,11 @@ namespace ZNsMain ); //////////////////////////////////////////////////////////// - // VI_RepeatCnt AI_RepeatMax) return 0; // 'ִ ݺ Ƚ' 0 ȯ. + if(++VI_RepeatCnt> AI_RepeatMax) return 0; // '최대 반복 횟수'를 넘으면 0 을 반환. } else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop { - if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll; // 'ִ ݺ Ƚ' ̸ . + if(++VI_RepeatCnt>=AI_RepeatMax) return VL_LengthAll; // '최대 반복 횟수'에 이르면 즉시 리턴. }/* else // AE_ESearchMax==ZNsEnum::ZESearchMax_Stop*/ } @@ -4620,7 +4620,7 @@ namespace ZNsMain TypeLength VL_LengthAll=0; TypeLength VL_LengthNow=0; - if(AI_RepeatMax<1) // ȿ 'ִ ݺ Ƚ' , Ѵ ݺ + if(AI_RepeatMax<1) // 유효하지 않은 '최대 반복 횟수'의 경우, 무한대 반복 허용 { do ////// { @@ -4655,7 +4655,7 @@ namespace ZNsMain if(VL_LengthNow<1) { - // VI_RepeatCnt<=AI_RepeatMax ´. + // 현재 VI_RepeatCnt<=AI_RepeatMax 상태다. if(VI_RepeatCnt ̳ʿ ǹ̰ ִ. + ■ 아래 2 개 멤버 변수는 ZtCSearchCChars<> 의 컨테이너에서만 의미가 있다. int mi_SearchSumMin; int mi_SearchSumMax; - ZtCSearchCChars<> ̳ Ҹ ȸϸ鼭, ã ̸ ϰ - Ǵµ, ̶ ϴ ϴ ̴. + 즉 ZtCSearchCChars<> 컨테이너의 각 원소를 순회하면서, 찾은 길이를 계속 더하게 + 되는데, 이때 이 더하는 누적값의 허용 범위를 지정하는 것이다. -- 2011-10-02 18:52:00 @@ -6243,8 +6243,8 @@ namespace ZNsMain if(AL_Length<=VL_SearchSum) return VL_SearchSum; - ڵ带 ּ ´. ǿ , - ã ڿ ̰ 0 ִ ̴. + ■ 위 코드를 주석으로 막는다. 다음 조건에 따라서, + 찾는 문자열이 길이가 0 인 것이 정상일 수도 있는 것이다. -- 2011-08-05 16:30:00 @@ -6332,9 +6332,9 @@ namespace ZNsMain namespace ZNsType { - template< ZTypLength TIntCode , // 'A' L'' ü ڰ ´. + template< ZTypLength TIntCode , // 'A' 나 L'가' 등의 구체적인 문자가 온다. typename TTypeChar=char, - typename TCharCInt=char // TTypeChar ǥ ִ ڷ̴. + typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다. > class ZtCTypeCharChain { @@ -6352,19 +6352,19 @@ namespace ZNsMain static bool DoHave(TypeChar AC_Char){return AC_Char==(TypeChar)TIntCode;} public: };/* - template< ZTypLength TIntCode , // 'A' L'' ü ڰ ´. + template< ZTypLength TIntCode , // 'A' 나 L'가' 등의 구체적인 문자가 온다. typename TTypeChar=char, - typename TCharCInt =char // TTypeChar ǥ ִ ڷ̴. + typename TCharCInt =char // TTypeChar 를 표현할 수 있는 정수 자료형이다. > class ZtCTypeCharChain */ - // ZtCTypeChar2Chain<> 2 Ÿ. + // ZtCTypeChar2Chain<> 은 2 개 문자의 범위를 나타낸다. - template< ZTypLength TIntCode1 , // 'A' L'' ü ڰ ´. - ZTypLength TIntCode2 , // 'A' L'' ü ڰ ´. + template< ZTypLength TIntCode1 , // 'A' 나 L'가' 등의 구체적인 문자가 온다. + ZTypLength TIntCode2 , // 'A' 나 L'가' 등의 구체적인 문자가 온다. typename TTypeChar=char, - typename TCharCInt=char // TTypeChar ǥ ִ ڷ̴. + typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다. > class ZtCTypeChar2Chain { @@ -6388,16 +6388,16 @@ namespace ZNsMain static bool DoHave(TypeChar AC_Char)*/ public: };/* - template< ZTypLength TIntCode1 , // 'A' L'' ü ڰ ´. - ZTypLength TIntCode2 , // 'A' L'' ü ڰ ´. + template< ZTypLength TIntCode1 , // 'A' 나 L'가' 등의 구체적인 문자가 온다. + ZTypLength TIntCode2 , // 'A' 나 L'가' 등의 구체적인 문자가 온다. typename TTypeChar=char, - typename TCharCInt=char // TTypeChar ǥ ִ ڷ̴. + typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다. > class ZtCTypeChar2Chain */ template< typename TTypeChar=char, - typename TCharCInt=char // TTypeChar ǥ ִ ڷ̴. + typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다. > class ZtCTypeCharChainEach { @@ -6470,8 +6470,8 @@ namespace ZNsMain typedef ZtCTypeCharChain CTypeCharTmplChainOfSpace ; // space bar typedef ZtCTypeCharChain CTypeCharTmplChainOfTab ; // horizontal tab - typedef ZtCTypeCharChain CTypeCharTmplChainOfLF ; // line feed() - typedef ZtCTypeCharChain CTypeCharTmplChainOfCR ; // carriage return() + typedef ZtCTypeCharChain CTypeCharTmplChainOfLF ; // line feed(개행) + typedef ZtCTypeCharChain CTypeCharTmplChainOfCR ; // carriage return(복귀) typedef ZtCTypeCharChain CTypeCharTmplChainOfGraAcc ; // grave accent typedef ZtCTypeCharChain CTypeCharTmplChainOfTilde ; // tilde, swung dash typedef ZtCTypeCharChain CTypeCharTmplChainOfExcMark ; // exclamation mark @@ -6512,7 +6512,7 @@ namespace ZNsMain public: };/* template< typename TTypeChar=char, - typename TCharCInt=char // TTypeChar ǥ ִ ڷ̴. + typename TCharCInt=char // TTypeChar 를 표현할 수 있는 정수 자료형이다. > class ZtCTypeCharChainEach */ @@ -6522,14 +6522,14 @@ namespace ZNsMain /*/////////////////////////////////////////////////////////// - typename TTypeCharChain + ■ typename TTypeCharChain 은 ZNsType::ZtCTypeCharChain<> ZNsType::ZtCTypeChar2Chain<> ZNsType::ZtCTypeCharChainEach<>::CTypeCharTmplChainOf~ ZNsType::ZtCTypeCharChainEach<>::CTypeChar2TmplChainOf~ - ִ. + 등이 될 수 있다. -- 2011-10-09 05:27:00 @@ -6573,7 +6573,7 @@ namespace ZNsMain public: typedef TTypeCharChain TypeCharChain ; typedef TNextCharChain ZCNextObj ; - typedef TNextCharChain ZCNextObj2; // interface ȣȯ ؼ . + typedef TNextCharChain ZCNextObj2; // interface 호환을 위해서만 존재. typedef typename TypeCharChain::TTypeChar TypeChar ; typedef typename TypeCharChain::TCharCInt TypeCInt ; public: @@ -6600,7 +6600,7 @@ namespace ZNsMain { public: typedef TTypeCharChain TypeCharChain ; - typedef TNextCharChain2 ZCNextObj ; // interface ȣȯ ؼ . + typedef TNextCharChain2 ZCNextObj ; // interface 호환을 위해서만 존재. typedef TNextCharChain2 ZCNextObj2; typedef typename TypeCharChain::TTypeChar TypeChar ; typedef typename TypeCharChain::TCharCInt TypeCInt ; @@ -6632,8 +6632,8 @@ namespace ZNsMain /*/////////*/ > CCharChain; //////////////////////// public: typedef TTypeCharChain TypeCharChain ; - typedef CCharChain ZCNextObj ; // interface ȣȯ ؼ . - typedef CCharChain ZCNextObj2; // interface ȣȯ ؼ . + typedef CCharChain ZCNextObj ; // interface 호환을 위해서만 존재. + typedef CCharChain ZCNextObj2; // interface 호환을 위해서만 존재. typedef typename TypeCharChain::TTypeChar TypeChar ; typedef typename TypeCharChain::TCharCInt TypeCInt ; public: @@ -6799,7 +6799,7 @@ namespace ZNsMain TypeLength AddSearchByFind(TypeCharC* APC_Search, TypeLength AL_Length) { - // APC_Search ã, ̸ Ѵ. + // APC_Search 을 찾았으면, 그 이전까지의 길이를 리턴한다. TypeLength VL_FindPos = FindPos(APC_Search, AL_Length); @@ -6832,7 +6832,7 @@ namespace ZNsMain ZNsEnum::ZERegErr& ARRE_ZERegErr ) { - // TChainStack ZNsInterface::ZtCStackOfTmplChain<> interface ´. + // TChainStack 은 ZNsInterface::ZtCStackOfTmplChain<> 의 interface 를 갖는다. ml_SearchLen += GetLengthByTmplChain( RR(AR_CStackOfTmplChain), AR_CTmplChain, RR(ARRE_ZERegErr)); @@ -6867,7 +6867,7 @@ namespace ZNsMain ZNsEnum::ZERegErr& ARRE_ZERegErr ) { - // TChainStack ZNsInterface::ZtCStackOfTmplChain<> interface ´. + // TChainStack 은 ZNsInterface::ZtCStackOfTmplChain<> 의 interface 를 갖는다. ml_SearchLen += GetLengthByTmplTreeChain( RR(AR_CStackOfTmplChain), AR_CTmplChain, RR(ARRE_ZERegErr)); @@ -6907,11 +6907,11 @@ namespace ZNsMain { /*//////////////////////////////////////////////////////////////////////////// - TTmplChain ڷδ ZtCSearchCChars<> ϴ. + ■ TTmplChain 자료형으로는 ZtCSearchCChars<> 가 적합하다. -- 2011-09-29 22:47:00 - AR_CStackOfTmplChain Ƿ ؼ *this ʾƵ ȴ. + ■ AR_CStackOfTmplChain 이 있으므로 해서 *this 의 멤버를 변경하지 않아도 된다. -- 2013-06-26 01:56:00 @@ -6975,7 +6975,7 @@ namespace ZNsMain ) /////////////////////////////////////////////////////// { - // ׽Ʈ ʿ. 2013-06-26 17:20:00 + // 테스트가 필요. 2013-06-26 17:20:00 typedef typename TTmplTreeChain::ZCNowObj ZCNowObj; @@ -6991,8 +6991,8 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////////////// - *this ǵ帮 ʴ ٸ , AR_CStackOfTmplChain ̿ܿ - ZtCCharChain<> object ؼ ϸ Ǵµ, ? + ■ *this 멤버를 전혀 건드리지 않는 또 다른 방법은, AR_CStackOfTmplChain 이외에 스택 + 에 ZtCCharChain<> object 를 선언해서 사용하면 되는데, 이 구현이 더 좋을까? -- 2013-06-26 01:08:00 @@ -7000,8 +7000,8 @@ namespace ZNsMain while(true) { - // 'ȸ Block' Ͽ ã Ƚ VR_CNowObj.GetRepeatCntMax() - // ʴ while ݺѴ. + // '조회 Block'에 대하여 찾은 횟수가 VR_CNowObj.GetRepeatCntMax() 를 + // 넘지 않는 범위 내에서 while 문을 반복한다. VL_LengthNow=GetLengthByTmplTreeChain( /////// RR(VO_CChainStack) , @@ -7161,51 +7161,51 @@ namespace ZNsMain */ /*///////////////////////////////////////////////////////////////////////////////////////// - namespace ZNsChars ڿ Լ µ, MainChars.H ִ Լ - Ȯ强ְ Ͽ. ׷ ϱ⿡ ټ ϴ. ׸ ZtCMainChars.H Ŀ - MainChars.H ü ̴. +■ namespace ZNsChars 에는 문자열 관련 함수들이 오는데, MainChars.H 에 있는 함수보다 좀 더 + 확장성있게 설계하였다. 그런데 사용하기에는 다소 복잡하다. 그리고 ZtCMainChars.H 는 추후에 + MainChars.H 을 대체할 것이다. -- 2011-07-10 03:48:00 - ׷ Ʒ namespace std ߰ؼ, ϱ ߴ. + 그래서 아래 선언을 namespace std 에 추가해서, 사용하기 쉽게 했다. typedef ZNsChars::ZCTypeChars ZCTypeChars; typedef ZNsChars::ZCMainChars ZCMainChars; -- 2011-08-15 18:16:00 - ZtCMainChars<>::DoStart() Լ ҹڸ θ, ZtCMainChars<> ø - ڿ bool Ϸ Ͽ, utf8 쿡 ġ Ƽ, - ⺻ ҹ ϴ Ѵ. ҹ ϰ , - ǥ object . +■ ZtCMainChars<>::DoStart() 등의 함수에 대소문자를 구분 여부를, ZtCMainChars<> 의 템플릿 + 인자에 bool 등의 값으로 지정하려고 하였으나, utf8 등의 경우에 아주 골치 아플 것 같아서, + 기본적으로 대소문자 구분을 하는 것으로 한다. 굳이 대소문자 구분을 하고 싶은 경우는, 정규 + 표현식 관련 object 을 쓰도록 하자. -- 2011-07-12 07:14:00 - 'char int Ȯ忡 ڵ' +■ 'char 의 int 확장에 따른 문제의 코드' - Ʒ Լ + 아래 함수에서 int ZtCMainChars<>::Minus(TypeCharC*, TypeCharC*, TypeLength, TypeLength) - return + return 문을 - return VC_Minus; // VC_Minus *(VP_Left-1)-*(VP_Right-1) + 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 Ȯ忡 - ڵ带 ó ġ Ǿ. + 로 고쳤다. 컴파일러에 따라, 음수 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 diff --git a/ZCppMain/ZtCTreeData.H b/ZCppMain/ZtCTreeData.H index 8dc82bf..b01f069 100644 --- a/ZCppMain/ZtCTreeData.H +++ b/ZCppMain/ZtCTreeData.H @@ -1,4 +1,4 @@ - + #ifndef __ZCPPMAIN__ZCTREEDATA_H__ #define __ZCPPMAIN__ZCTREEDATA_H__ @@ -29,31 +29,31 @@ namespace ZNsMain ZNsMain::ZNsEnum::ZERun OnDataStart(TypeSize AI_Depth) { - ShowDepth(AI_Depth); cout<<" OnDataStart:"< Ȱϴ κ Ʒó + ■ class ZtCTypeTreeData 템플릿은 정의에서 또 다른 템플릿(list 등의 컨테이너 템플릿)을 + 포함하고 있음을 눈여겨 보자. 이것을 ZtCTreeData<> 에서 활용하는 부분은 아래처럼 typedef typename TTypeTreeData::template ZtCTypeClass::TypeData ZCNode1List; typedef typename TTypeTreeData::template ZtCTypeClass::TypeData ZCNode2List; - ټ δ. + 다소 복잡해 보인다. -- 2011-11-01 14:39:00 @@ -199,7 +199,7 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////////// - TViewClass interface + ■ TViewClass 의 interface ZNsMain::ZNsEnum::ZERun OnDataBody(TypeData, TypeSize AI_Depth, TypeSize AI_Index=0) @@ -374,9 +374,9 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////////////////////////// - ZCNode1 ZCNode2 ̹Ƿ, ZCNode2 IterPreOrder() IterPostOrder() - ʿ. ZCNode2 ZCNode1 ȯǾ ZCNode1 IterPreOrder() IterPostOrder() - ̱ ̴. + ■ ZCNode1 과 ZCNode2 가 동일한 구조이므로, ZCNode2 에서는 IterPreOrder() 와 IterPostOrder() 를 + 정의할 필요없다. ZCNode2 이 ZCNode1 로 형변환되어서 ZCNode1 의 IterPreOrder() 와 IterPostOrder() + 을 사용할 것이기 때문이다. -- 2011-11-01 10:40:00 @@ -435,9 +435,9 @@ namespace ZNsMain /*///////////////////////////////////////////////////////////////////////////////////////// - clear() Լ mo_RootNode.clear() ȣϰ ִµ, mo_RootNode.mo_TypeData - ̳ , mo_TypeData ߰ ʱȭϴ ڵ尡 ʿ ִ. ̿ ؼ - CXmlInfo_T<>::clear() Ѵ. + ■ 위 clear() 함수는 mo_RootNode.clear() 를 호출하고 있는데, 만약 mo_RootNode.mo_TypeData + 가 컨테이너 인 경우, mo_TypeData 를 추가로 초기화하는 코드가 필요할 수 있다. 이에 대해서 + 는 CXmlInfo_T<>::clear() 을 참고한다. -- 2012-10-12 13:20:00 @@ -468,7 +468,7 @@ namespace ZNsMain /*/////////////////////////////////////////////////////////////// - class ZtCTreeData -- 2015-08-14 14:00 + ■ class ZtCTreeData 예제 -- 2015-08-14 14:00 #include #include "ZCppMain/ZtCTreeData.H" @@ -522,54 +522,54 @@ namespace ZNsMain VO_CStrTreeData.IterPostOrder(VO_CViewTreeData); } - + □ 출력 # Pre Order - Index=0: ## Root Node ## - OnSubNodeStart: - Index=1: Node1 - OnSubNodeStart: - Index=1: Node11 - Index=2: Node12 - OnSubNodeStart: - Index=1: Node121 - Index=2: Node122 - OnSubNodeClose: - OnSubNodeClose: - Index=2: Node2 - OnSubNodeStart: - Index=1: Node21 - Index=2: Node22 - OnSubNodeClose: - Index=3: Node3 - OnSubNodeClose: + ※ Index=0: ## Root Node ## + ▶ OnSubNodeStart: + ※ Index=1: Node1 + ▶ OnSubNodeStart: + ※ Index=1: Node11 + ※ Index=2: Node12 + ▶ OnSubNodeStart: + ※ Index=1: Node121 + ※ Index=2: Node122 + ◀ OnSubNodeClose: + ◀ OnSubNodeClose: + ※ Index=2: Node2 + ▶ OnSubNodeStart: + ※ Index=1: Node21 + ※ Index=2: Node22 + ◀ OnSubNodeClose: + ※ Index=3: Node3 + ◀ OnSubNodeClose: # Post Order - OnSubNodeStart: - OnSubNodeStart: - Index=1: Node11 - OnSubNodeStart: - Index=1: Node121 - Index=2: Node122 - OnSubNodeClose: - Index=2: Node12 - OnSubNodeClose: - Index=1: Node1 - OnSubNodeStart: - Index=1: Node21 - Index=2: Node22 - OnSubNodeClose: - Index=2: Node2 - Index=3: Node3 - OnSubNodeClose: - Index=0: ## Root Node ## + ▶ OnSubNodeStart: + ▶ OnSubNodeStart: + ※ Index=1: Node11 + ▶ OnSubNodeStart: + ※ Index=1: Node121 + ※ Index=2: Node122 + ◀ OnSubNodeClose: + ※ Index=2: Node12 + ◀ OnSubNodeClose: + ※ Index=1: Node1 + ▶ OnSubNodeStart: + ※ Index=1: Node21 + ※ Index=2: Node22 + ◀ OnSubNodeClose: + ※ Index=2: Node2 + ※ Index=3: Node3 + ◀ OnSubNodeClose: + ※ Index=0: ## Root Node ## ///////////////////////////////////////////////////////////////*/ /*/////////////////////////////////////////////////////////////// - class ZtCTreeData <>::ZCNode1 mo_TypeData ִٸ, - class ZtCTreeDataEx<>::ZCNode1 mo_CDataList ִ. + ■ class ZtCTreeData <>::ZCNode1 에는 mo_TypeData 이 있다면, + class ZtCTreeDataEx<>::ZCNode1 에는 mo_CDataList 이 있다. ///////////////////////////////////////////////////////////////*/ @@ -651,7 +651,7 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////////// - TViewClass interface + ■ TViewClass 의 interface ZNsMain::ZNsEnum::ZERun OnDataStart(int AI_Depth) ZNsMain::ZNsEnum::ZERun OnDataBody(TypeData, TypeSize AI_Depth, TypeSize AI_Index) @@ -873,9 +873,9 @@ namespace ZNsMain /*////////////////////////////////////////////////////////////////////////////////////////////// - ZCNode1 ZCNode2 ̹Ƿ, ZCNode2 IterPreOrder() IterPostOrder() - ʿ. ZCNode2 ZCNode1 ȯǾ ZCNode1 IterPreOrder() IterPostOrder() - ̱ ̴. + ■ ZCNode1 과 ZCNode2 가 동일한 구조이므로, ZCNode2 에서는 IterPreOrder() 와 IterPostOrder() 를 + 정의할 필요없다. ZCNode2 이 ZCNode1 로 형변환되어서 ZCNode1 의 IterPreOrder() 와 IterPostOrder() + 을 사용할 것이기 때문이다. -- 2011-11-01 10:40:00 @@ -953,39 +953,39 @@ namespace ZNsMain*/ /*////////////////////////////////////////////////////////////////////////////////////////// - CTreeClass.H ü ̴. CTreeClass.H Ʈ ǥϴµ, - Ʒ +■ 이 파일은 CTreeClass.H 파일을 대체할 것이다. CTreeClass.H 에서는 트리 구조를 표현하는데, + 아래 형식의 class CMyNode; { public: TypeData mo_TypeData; - ZNsMain::ZtCObjList mo_NodeList; // Ʈ. + ZNsMain::ZtCObjList mo_NodeList; // 하위 노드 리스트. }; - , void* Ͽ. ׷ Ͽ, Ȱ - Ŭ ZCNode1, ZCNode2 ν, (!!) ͸ ϰ ִ. + 재귀 용법을 구현할 수가 없어서, void* 를 사용하였다. 그러나 이 파일에서는, 똑같은 구조의 + 두 클래스 ZCNode1, ZCNode2 를 사용함으로써, 멋지게(!!) 재귀를 구현하고 있다. - Ŭ ZCNode1 ZCNode2 ̳(Ʈ) ְ, - Ŭ ZCNode2 ZCNode1 ̳(Ʈ) ִ. + 클래스 ZCNode1 에서는 ZCNode2 의 컨테이너(리스트)를 가지고 있고, + 클래스 ZCNode2 에서는 ZCNode1 의 컨테이너(리스트)를 가지고 있다. - ϰ, ̶ ƴ . + 아주 깜찍하고, 기발한 방법이라고 아니할 수 없다. - 2011-10-29 , 7 ÿȭȸ 鼭, object - , ߿ object instance ϴ , Ų ذ - Ӹ ӿ ׷鼭, ̶ Ȯ . ׷ - , , ߴ Ų ƴϾ 巯. Ǹ ־ - , Ʈ , ȱ , ̸ ٸ 2 Ŭ Ʈ - ִٴ ó ̴. CTreeData.H ̴. + 2011-10-29 일 토요일, 저녁 7 시 군포시예술문화회관 공연을 보고 오면서, 먼저 선언된 object + 에서, 나중에 선언된 object 의 instance 를 참조하는 경우, 매끄럽게 해결할 수 있을 지도 모 + 르는 방법이 머릿 속에 그려지면서, 운명은 내편이라는 강한 확신이 들었었다. 그러나 집에 도 + 착 후, 조사 결과, 기대했던 매끄러운 방법은 아니었음이 드러났다. 실망할 수도 있었던 그 순 + 간, 트리를 구현할 때, 똑깥은 구조의, 이름만 다른 2 개의 클래스로 트리의 재귀 구조를 구현 + 할 수 있다는 생각이 번개처럼 떠 오른 것이다. 그 결과물이 이 파일 CTreeData.H 이다. - ׷, ̾. + 그래, 운명은 내편이었어. - ش µ, ڿ ΰ ִ , ٷ տ ŭ ٰ - . + 어느덧 해는 저무는데, 이제는 모든 것을 뒤에 두고 떠날 수 있는 날이, 바로 앞에 성큼 다가왔 + 다. -- 2011-10-31 23:47:00 - -- CTreeClass.H ŵǾ. -- 2013-05-01 17:22:00 + -- 현재 CTreeClass.H 는 제거되었다. -- 2013-05-01 17:22:00 //////////////////////////////////////////////////////////////////////////////////////////*/