

//[2010.12.06.화][생성!!!]{----------------------------------------------------
//[VMOS 통합] 으로 인하여 새로운 방식으로 VMOS 가 관리된다.
//VMOS폴더{ vmos.gos, vmos.ginf } 가 같이 운영되는데 이때 <*.ginf> 라는 새로운
//문서를 지원하기 위하여 새로운 함수군을 만든다.
//}----------------------------------------------------------------------------

//[<*.ginf> 구조]{----------------------------------------------------
//
//한행에 한가지 정보만 위치하고 [구분자] 역시 한 행단위로만 유효하다.
//
//<식별자>
//8Byte 16진수 VMOS 각각의 식별자 값.
//<설명문>
//여러행이 될수 있는 VMOS 자체 설명글.
//
//}-------------------------------------------------------------------


#include <vcl.h>
#pragma hdrstop


//[2010.12.10.금][추가!!!]
#include  "c_define.h"

#include  "file.h"
#include  "ide_library.h"

#include  "file_ginf.h"

//[2010.12.16.목][추가!!!]
#include  "ide_main.h"


bool __fastcall Ginf_Open(char            *pFileName,
                          //저장소위치를 받아 동적 생성해야 하므로 반드시 (**) 로 선언한다.
                          unsigned char  **rFileBuf,
                          //NULL 인 경우는 반환하지 않는다.
                          int             *rFileSize)
{
  //[2006.09.04.월][생성!!!]{--------------------------------------------------
  //file 을 열어서 지정된 buffer 에 기록하고 filesize 를 반환한다.
  //[2006.11.29.수][수정!!!]---------------------------------------------------
  //*.txt 등 문서파일을 여는 경우는 맨 뒤에 '\0' 까지 불러 들이지 않는것 같다.
  //따라서, 1 만큼 file_size 를 증가 시키고 제일 뒤에 '\0' 을 붙여준다.
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      int  fileHandle;
      int  fileSize;

  //}

  //[문서 존재 확인]
  //{
      //전달받은 file 이 존재 하는지 확인한다.
      if(FileExists(pFileName) != true)
      {
        //이 파일은 존재하지 않는 것이므로 열어서는 안된다.
        return(false);

      }

  //}

  //[파일열기]
  //{
      //[파일 열기]
      //{
          //읽기 전용 모드로 파일을 연다.
          fileHandle = FileOpen(pFileName, fmOpenRead);

      //}

      //[파일크기]
      //{
          //파일 끝으로 포인터를 이동하여 위치를 얻는데 이것이 크기가 된다.
          fileSize = FileSeek(fileHandle, 0, 2);

          //포인터를 다시 파일의 처음으로 돌려 놓는다.
          FileSeek(fileHandle, 0, 0);

      //}

      //[저장소 생성]
      //{
          //[생성]
          //{
              //[!]{-------------------------------------------
              //file 크기에 맞게 buffer[] 를 생성한다.
              //'\0' 을 뒤에 붙이기 위하여 +1 크기로 지정한다.
              //}----------------------------------------------

              //(*rFileBuf) = new unsigned char[fileSize + 1];
              //[동적생성단위적용][2021.01.24.일][수정]
              (*rFileBuf) = new unsigned char[UnitX(1024, fileSize + 1)];

          //}

      //}

      //[파일 읽기]
      //{
          //파일을 [저장소] 로 읽어 들인다.
          FileRead(fileHandle, (*rFileBuf), fileSize);

          (*rFileBuf)[fileSize] = '\0';

      //}

      //[파일 닫기]
      //{
          //파일을 닫아준다.
          FileClose(fileHandle);

      //}

  //}

  //[반환]
  //{
      //[!]{------------------------------
      //[파일크기] 정보를 반환한다.
      //'\0' 도 포함시킨다.
      //단, NULL 이 아닌 경우만 처리한다.
      //}---------------------------------

      if(rFileSize != NULL) { (*rFileSize) = fileSize + 1; }

  //}

  return(true);

}

unsigned long long __fastcall Ginf_Get_Id(//<*.ginf> 문서가 들어있는 저장소 위치.
                                          char  *pGinfStr)
{
  //[2010.12.06.화][생성!!!]{----------------------------------------------
  //<*.ginf> 에서 [제목:<식별자>] 에 해당하는 8Byte ID 를 읽어서 반환한다.
  //문자열 형태의 값을 숫자로 바꿔서 반환해야 한다.
  //}----------------------------------------------------------------------

  //[VAR]
  //{
      char                idStr[1024];
      unsigned long long  id;

      int                 lineCount;
      int                 searchLineNumber;

  //}

  //[전체 행수 얻기]
  //{
      lineCount = STR_Get_LineCount(pGinfStr);

  //}

  //[정보 추출]
  //{
      //<식별자> 제목 행을 찾는다.
      //[대/소 문자 구분] 을 하지 않는다---------v
      STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<식별자>", &searchLineNumber);

      //[제목] 다음 행이 해당 정보가 존재하는 행이 된다.
      STR_Get_LineStr_withLineNumber(pGinfStr, searchLineNumber + 1, idStr);

  //}

  //[문자열=>값 변환]
  //{
      //16진수 문자열을 8Byte 값으로 변환한다.
      CONV_HexStr_To_LongVal(idStr, (long long *)(&id));

  //}

  //[반환]
  //{
      return(id);

  //}

}

unsigned long long __fastcall Ginf_Get_Date(//<*.ginf> 문서가 들어있는 저장소 위치.
                                            char  *pGinfStr)
{
  //[2010.12.14.화][생성!!!]{-------------------------------------------
  //<*.ginf> 에서 [제목:<날짜>] 에 해당하는 8Byte 값을 읽어서 반환한다.
  //문자열 형태의 값을 숫자로 바꿔서 반환해야 한다.
  //}-------------------------------------------------------------------

  //[VAR]
  //{
      char                dateStr[1024];
      unsigned long long  date;

      int                 lineCount;
      int                 searchLineNumber;

  //}

  //[전체 행수 얻기]
  //{
      lineCount = STR_Get_LineCount(pGinfStr);

  //}

  //[정보 추출]
  //{
      //<식별자> 제목 행을 찾는다.
      //[대/소 문자 구분] 을 하지 않는다---------v
      STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<제작날짜>", &searchLineNumber);

      //[제목] 다음 행이 해당 정보가 존재하는 행이 된다.
      STR_Get_LineStr_withLineNumber(pGinfStr, searchLineNumber + 1, dateStr);

  //}

  //[문자열=>값 변환]
  //{
      //16진수 문자열을 8Byte 값으로 변환한다.
      CONV_HexStr_To_LongVal(dateStr, (long long *)(&date));

  //}

  //[반환]
  //{
      return(date);

  //}

}

unsigned long long __fastcall Ginf_Get_OS_Size(//<*.ginf> 문서가 들어있는 저장소 위치.
                                               char  *pGinfStr)
{
  //[2010.12.11.토][생성!!!]{-----------------------------------------------------
  //<*.ginf> 에서 [제목:<운영체제크기>] 에 해당하는 8Byte 크기를 읽어서 반환한다.
  //문자열 형태의 값을 숫자로 바꿔서 반환해야 한다.
  //}-----------------------------------------------------------------------------

  //[VAR]
  //{
      char                osSizeStr[1024];
      unsigned long long  osSize;

      int                 lineCount;
      int                 searchLineNumber;

  //}

  //[전체 행수 얻기]
  //{
      lineCount = STR_Get_LineCount(pGinfStr);

  //}

  //[정보 추출]
  //{
      //<식별자> 제목 행을 찾는다.
      //[대/소 문자 구분] 을 하지 않는다---------v
      STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<운영체제크기>", &searchLineNumber);

      //[제목] 다음 행이 해당 정보가 존재하는 행이 된다.
      STR_Get_LineStr_withLineNumber(pGinfStr, searchLineNumber + 1, osSizeStr);

  //}

  //[문자열=>값 변환]
  //{
      //10진수 문자열을 8Byte 값으로 변환한다.
      CONV_DecStr_To_LongVal(osSizeStr, (long long *)(&osSize));

  //}

  //[반환]
  //{
      return(osSize);

  //}

}

void __fastcall Ginf_Get_DescriptStr(//<*.ginf> 문서가 들어있는 저장소 위치.
                                     char  *pGinfStr,
                                     //추출된 [설명문자열] 반환.
                                     char  *rDecriptStr)
{
  //[2010.12.06.화][생성!!!]{---------------------------------------------
  //<*.ginf> 에서 [구분자:<설명문>] 에 해당하는 문자열을 읽어서 반환한다.
  //}---------------------------------------------------------------------

  //[VAR]
  //{
      int   lineCount;
      int   searchLineNumber;

      //문자열 시작 행(<설명문> 다음행).
      int   strStartLineNum;
      //문자열 끝 행(<설명문끝> 이전행).
      int   strEndLineNum;

  //}

  //[전체 행수 얻기]
  //{
      lineCount = STR_Get_LineCount(pGinfStr);

  //}

  //[정보 추출]
  //{
      //[문자열 시작 행 얻기]
      //{
          //<식별자> 제목 행을 찾는다.
          //[대/소 문자 구분] 을 하지 않는다---------v
          STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<설명문>", &searchLineNumber);

          //문자열은 <설명문> 다음 행 부터 시작한다.
          strStartLineNum = searchLineNumber + 1;

      //}

      //[문자열 끝 행 얻기]
      //{
          //<식별자끝> 제목 행을 찾는다.
          //[대/소 문자 구분] 을 하지 않는다---------v
          STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<설명문끝>", &searchLineNumber);

          //문자열은 <설명문> 이전 행 까지다.
          strEndLineNum = searchLineNumber - 1;

      //}

      //[설명문 추출]
      //{
          //[!]{-----------------------------------------------------
          //[<설명문>..<설명문끝>] 안의 모든 문자열을 추출하면 된다.
          //}--------------------------------------------------------

          STR_Get_LineToLineStr(pGinfStr, strStartLineNum, strEndLineNum, rDecriptStr);

      //}

  //}

}

void __fastcall Ginf_Get_ApiListStr(//<*.ginf> 문서가 들어있는 저장소 위치.
                                    char  *pGinfStr,
                                    //1개 행으로 정리된 목록을 반환.
                                    char  *rApiListStr,
                                    //단어 수를 반환한다(NULL 이 아닌 경우).
                                    int   *rWordCount)
{
  //[2010.12.16.목][생성!!!]{--------------------------------------------------
  //<*.ginf> 에서 [구분자:<지원API>] 에 해당하는 문자열을 읽어서 한행으로
  //[공백] 한개의 단어 단위로 합성하여 반환한다.
  //이는 처리하는 쪽에서 보다 쉽게 [단어] 를 읽어들일수 있게 하기 위한 것이다.
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      int   lineCount;
      int   searchLineNumber;

      //문자열 시작 행(<설명문> 다음행).
      int   strStartLineNum;
      //문자열 끝 행(<설명문끝> 이전행).
      int   strEndLineNum;

      char  tempStr[OPT_lineStrSize*5];
      char  lineStr[OPT_lineStrSize];
      char  wordStr[OPT_lineStrSize];

      int   i, w, wordCount;

  //}

  //[전체 행수 얻기]
  //{
      lineCount = STR_Get_LineCount(pGinfStr);

  //}

  //[정보 추출]
  //{
      //[문자열 시작 행 얻기]
      //{
          //<식별자> 제목 행을 찾는다.
          //[대/소 문자 구분] 을 하지 않는다---------v
          STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<지원API>", &searchLineNumber);

          //문자열은 <설명문> 다음 행 부터 시작한다.
          strStartLineNum = searchLineNumber + 1;

      //}

      //[문자열 끝 행 얻기]
      //{
          //<식별자끝> 제목 행을 찾는다.
          //[대/소 문자 구분] 을 하지 않는다---------v
          STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<지원API끝>", &searchLineNumber);

          //문자열은 <설명문> 이전 행 까지다.
          strEndLineNum = searchLineNumber - 1;

      //}

      //[문자열 추출]
      //{
          //[!]{-------------------------------------------------------
          //[<지원API>..<지원API끝>] 안의 모든 문자열을 추출하면 된다.
          //}----------------------------------------------------------

          STR_Get_LineToLineStr(pGinfStr, strStartLineNum, strEndLineNum, tempStr);

      //}

  //}

  //[한 행 문자열로 정리]
  //{
      //[!]{---------------------------------------------------------------------------------
      //각 행을 추출하고 [단어] 를 추출하여 [공백 1 개] 를 [구분자] 로 한 문자열로 합성한다.
      //}------------------------------------------------------------------------------------

      //[초기화]
      //{
          //반환문자열 초기화.
          STR_Assign(rApiListStr, "");

          //[행수 얻기]
          //{
              lineCount = STR_Get_LineCount(tempStr);

          //}

      //}

      for(i = 0, wordCount = 0; i < lineCount; i++)
      {
        //[행 추출]
        //{
            STR_Get_LineStr_withLineNumber(tempStr, i, lineStr);

        //}

        //[단어 추출/합성]
        //{
            //[!]{----------------------------------------------------
            //[단어] 만 추출하여 공백한개의 간격의 문자열로 합성한다.
            //}-------------------------------------------------------

            for(w = 0; ; w++)
            {
              //[단어 추출]
              //{
                  STR_Get_LineWord_withSpace(lineStr, w, wordStr);

                  //추출된 단어가 "" 인 것은 더이상 추출할 단어가 없다는 것이므로 다음으로 넘어간다.
                  if(wordStr[0] == '\0') break;

              //}

              //[단어 함성]
              //{
                  //뒤에 [공백] 한개를 붙여준다.
                  STR_Add(rApiListStr, wordStr); STR_Add(rApiListStr, " ");

                  //단어 개수를 증가시킨다.
                  wordCount++;

              //}

            }

        //}

      }

      //[합성된 단어개수 반환]
      //{
          if(rWordCount != NULL) { (*rWordCount) = wordCount; }

      //}

  //}

}

void __fastcall Ginf_Get_ApiClassName(//<*.ginf> 문서가 들어있는 저장소 위치.
                                      char  *pGinfStr,
                                      char  *rApiClassName)
{
  //[2010.12.16.목][생성!!!]{----------------------------------------------------------------
  //<*.ginf> 에서 [제목:<명령API분류이름>] 에 해당하는 "문자열" 단어 1 개를 찾아서 반환한다.
  //}----------------------------------------------------------------------------------------

  //[VAR]
  //{
      int  lineCount;
      int  searchLineNumber;

  //}

  //[전체 행수 얻기]
  //{
      lineCount = STR_Get_LineCount(pGinfStr);

  //}

  //[정보 추출]
  //{
      //<식별자> 제목 행을 찾는다.
      //[대/소 문자 구분] 을 하지 않는다---------v
      STR_Search_Word(pGinfStr, lineCount, 0, 0, false, "<명령API분류이름>", &searchLineNumber);

      //[제목] 다음 행이 해당 정보가 존재하는 행이 된다.
      STR_Get_LineStr_withLineNumber(pGinfStr, searchLineNumber + 1, rApiClassName);

  //}

}

//------------------------------------------------------------------------------
//[직접 파일에서 읽기]----------------------------------------------------------
//------------------------------------------------------------------------------

bool __fastcall Ginf_Get_Id_InFile(char                *pGinfFileName,
                                   unsigned long long  *rID)
{
  //[2010.12.10.금][생성!!!]{--------------------------------
  //<*.ginf> 문서로 부터 바로 <식별자> 를 추출하여 반환한다.
  //}--------------------------------------------------------

  //[VAR]
  //{
      char  *fileBuf = NULL;

  //}

  //[<*.ginf> 문서 읽기]
  //{
      if(Ginf_Open(pGinfFileName, (unsigned char **)(&fileBuf), NULL) != true) return(false);

  //}

  //[<식별자> 추출]
  //{
      (*rID) = Ginf_Get_Id(fileBuf);

  //}

  //[저장소 삭제]
  //{
      //Ginf_Open() 에서 동적으로 생성된 저장소를 삭제한다.
      delete [] fileBuf; fileBuf = NULL;

  //}

  return(true);


}

bool __fastcall Ginf_Get_Date_InFile(char                *pGinfFileName,
                                     unsigned long long  *rDate)
{
  //[2010.12.17.금][생성!!!]{------------------------------
  //<*.ginf> 문서로 부터 바로 <날짜> 를 추출하여 반환한다.
  //}------------------------------------------------------

  //[VAR]
  //{
      char  *fileBuf = NULL;

  //}

  //[<*.ginf> 문서 읽기]
  //{
      if(Ginf_Open(pGinfFileName, (unsigned char **)(&fileBuf), NULL) != true) return(false);

  //}

  //[<식별자> 추출]
  //{
      (*rDate) = Ginf_Get_Date(fileBuf);

  //}

  //[저장소 삭제]
  //{
      //Ginf_Open() 에서 동적으로 생성된 저장소를 삭제한다.
      delete [] fileBuf; fileBuf = NULL;

  //}

  return(true);


}

bool __fastcall Ginf_Get_ApiListStr_InFile(char  *pGinfFileName,
                                           //1개 행으로 정리된 목록을 반환.
                                           char  *rApiListStr,
                                           //존재하는 단어개수를 반환(NULL 이 아닌 경우).
                                           int   *rWordCount)
{
  //[2010.12.10.금][생성!!!]{---------------------------------------------------------------------
  //<*.ginf> 문서로 부터 직접 <지원API> 를추출하여 1 행의 문자열 형식의 목록으로 만들어 반환한다.
  //}---------------------------------------------------------------------------------------------

  //[VAR]
  //{
      char  *fileBuf;

  //}

  //[<*.ginf> 문서 읽기]
  //{
      if(Ginf_Open(pGinfFileName, (unsigned char **)(&fileBuf), NULL) != true) return(false);

  //}

  //[<명령API분류이름> 추출]
  //{
      Ginf_Get_ApiListStr(fileBuf, rApiListStr, rWordCount);

  //}

  //[저장소 삭제]
  //{
      //Ginf_Open() 에서 동적으로 생성된 저장소를 삭제한다.
      delete [] fileBuf; fileBuf = NULL;

  //}

  return(true);


}

bool __fastcall Ginf_Get_ApiClassName_InFile(char  *pGinfFileName,
                                             char  *rApiClassName)
{
  //[2010.12.10.금][생성!!!]{-----------------------------------------
  //<*.ginf> 문서로 부터 직접 <명령API분류이름> 을 추출하여 반환한다.
  //1 개의 단어로 이루어진 정보다.
  //}-----------------------------------------------------------------

  //[VAR]
  //{
      char  *fileBuf;

  //}

  //[<*.ginf> 문서 읽기]
  //{
      if(Ginf_Open(pGinfFileName, (unsigned char **)(&fileBuf), NULL) != true) return(false);

  //}

  //[<명령API분류이름> 추출]
  //{
      Ginf_Get_ApiClassName(fileBuf, rApiClassName);

  //}

  //[저장소 삭제]
  //{
      //Ginf_Open() 에서 동적으로 생성된 저장소를 삭제한다.
      delete [] fileBuf; fileBuf = NULL;

  //}

  return(true);


}

//------------------------------------------------------------------------------
//[특수 기능 함수]--------------------------------------------------------------
//------------------------------------------------------------------------------

bool __fastcall Ginf_Get_OsGinfFileName_withID(unsigned long long   pID,
                                               char                *rGinfFileName)
{
  //[2010.12.16.목][생성!!!]{--------------------------------------------------------
  //<식별자> 를 전달 받아서 [os] 폴더에서 이 <식별자> 를 가지는 <*.ginf> 문서를 찾아
  //[문서이름(모든 경로 포함)] 을 반환한다.
  //}--------------------------------------------------------------------------------

  //[VAR]
  //{
      //[os폴더] 안의 [폴더] 목록을 관리한다.
      //이 [폴더] 은 [vmos], [osx] 등 [운영체제] 의 큰 분류가 된다.
      TStringList  *osFolderList = NULL;

      //<osFolderList> 에서 구한 목록 안의 [폴더] 목록을 관리한다.
      //이는 [vmos] 나 [osx] 등 안의각각의 세부 [운영체제 목록] 이 된다.
      TStringList  *osList = NULL;

      int           i, m;

      //[<*.ginf> 문서 처리용]
      //{
          char               ginfFileName[OPT_lineStrSize];

          char               lastFolderName[OPT_lineStrSize];

          unsigned long long ginfID;

      //}

  //}

  //[운영체제 대분류 목록 얻기]
  //{
      //[!]{-------------------------------------------------
      //[os 폴더] 안의 [운영체제 대분류 폴더] 목록을 만든다.
      //현재는 [vmos], [osx] 2 개 뿐이다.
      //}----------------------------------------------------

      osFolderList = new TStringList;
      osFolderList->Clear();

      osList       = new TStringList;

      //[목록 구하기]
      //{
          //[!]{--------------------------------------------
          //전용 함수를 사용하여 안의 [폴더목록] 을 구한다.
          //}-----------------------------------------------

          Dir_Get_FileList_BoundDir(Ide_OS_Root_Path,
                                    "*",
                                    //지정 폴더안만 대상으로 한다.
                                    true,
                                    //안의 [폴더] 만 대상으로 하고 경로까지 얻는다(기본).
                                    //버튼 이름으로 사용할 것이 아니므로 [경로] 까지 다 얻어야 한다.
                                    d_Directory,// | d_NameOnly,
                                    osFolderList);

      //}

  //}

  //[운영체제 찾기]
  //{
      //[!]{-------------------------------------------------------------------------
      //위에서 구한 [목록] 을 사용하여 차례로 맷돌에서 읽어들인 [식별자] 와 일치하는
      //[운영체제] 가 있는지 확인하고, 이 운영체제의 <*.ginf> 문서 경로를 얻는다.
      //}----------------------------------------------------------------------------

      for(i = 0; i < osFolderList->Count; i++)
      {
        //[운영체제 목록 얻기]
        //{
            //[!]{--------------------------------------
            //[운영체제] 폴더안의 [운영체제 목록] 얻기.
            //}-----------------------------------------

            osList->Clear();

            //[목록 구하기]
            //{
                //[!]{--------------------------------------------
                //전용 함수를 사용하여 안의 [폴더목록] 을 구한다.
                //}-----------------------------------------------

                //[운영체제 대분류] 를 기준으로 하나씩 처리한다.
                Dir_Get_FileList_BoundDir(osFolderList->Strings[i] + "\\",
                                          "*",
                                          //지정 폴더안만 대상으로 한다.
                                          true,
                                          //안의 [폴더] 만 대상으로 하고 경로까지 얻는다(기본).
                                          //버튼 이름으로 사용할 것이 아니므로 [경로] 까지 다 얻어야 한다.
                                          d_Directory,// | d_NameOnly,
                                          osList);

            //}

        //}

        for(m = 0; m < osList->Count; m++)
        {
          //[!]{--------------------------------------------------------------------------
          //지정된 [운영체제] 가 맷돌에 설치된 것과 같은지 [식별자] 를 비교하여 알아낸다.
          //}-----------------------------------------------------------------------------

          //[최종폴더이름 얻기]
          //{
              //[!]{----------------------------------------------------------------
              //[폴더이름] 과 "폴더이름.ginf" 로 같은 이름을 사용하도록 돼 있으므로
              //최종 [폴더이름] 을 구한다.
              //}-------------------------------------------------------------------

              STR_Get_FileFullName_LastFolderName(((AnsiString)(osList->Strings[m] + "\\")).c_str(), lastFolderName);

          //}

          //[<*.ginf> 문서이름 만들기]
          //{
              //[!]{-------------------------------------------------
              //"[문서이름] = [폴더경로] + [폴더이름.ginf]" 가 된다.
              //}----------------------------------------------------

			  STR_Assign(ginfFileName, ((AnsiString)(osList->Strings[m])).c_str()); STR_Add(ginfFileName, "\\");
              STR_Add(ginfFileName, lastFolderName); STR_Add(ginfFileName, ".ginf");

          //}

          //[<식별자> 읽기]
          //{
              if(Ginf_Get_Id_InFile(ginfFileName, &ginfID) != true) goto lbError;

          //}

          //[일치하나?]
          //{
              if(pID == ginfID)
              {
                //<식별자> 가 같은 <*.ginf> 를 찾았으므로 이 문서이름을 반환한다.
                STR_Assign(rGinfFileName, ginfFileName);

                goto lbOk;

              }

          //}

        }

      }

      //[찾는 것이 없다!!!]
      //{
          //이 경우는 오류로 간주한다.
          goto lbError;

      //}

  //}

  lbOk:
  {

    //[동적 삭제]
    //{
        //혹시 동적 생성이 돼 있는 경우는 삭제한다.
        if(osFolderList != NULL) { delete osFolderList; osFolderList = NULL; }
        if(osList       != NULL) { delete osList;       osList       = NULL; }

    //}

    return(true);

  }

  lbError:
  {
    //[동적 삭제]
    //{
        //혹시 동적 생성이 돼 있는 경우는 삭제한다.
        if(osFolderList != NULL) { delete osFolderList; osFolderList = NULL; }
        if(osList       != NULL) { delete osList;       osList       = NULL; }

    //}

    return(false);

  }

}








