
//[2009.01.20.화][생성!!!]{-------------------------------------------------
//*.ob1 문서를 번역하여 *.obj 문서를 만들어 준다.
//이 문서는 *.obj 로 만들기 위한 전단계의 모든 [지역라벨] 이 해당 [asm기호]
//로 치환되어 있는 상태로, 그대로 code 로 번역하면 바로 *.obj 가 된다.
//즉, *.obj 를 보다 간단하게 번역하기 위하여 임시로 만드는 문서가 된다.
//}-------------------------------------------------------------------------


#include <vcl.h>
#pragma hdrstop


//[사용 header file]
//{
    #include "c_define.h"
    #include "ide_library.h"
    #include "library.h"
    #include "file.h"
    #include "database.h"
    #include "parser.h"
    #include "asmencoder.h"
    #include "object1st.h"
    #include "object.h"
    #include "link.h"
    #include "gvmx.h"
    #include "vmos_def.h"

    #include "ide_msgbox.h"
    #include "msg_msg.h"

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

//}


bool __fastcall Gvmx(char  *pFileName)
{
  //[2009.01.20.화][생성!!!]{------------------------------------------------
  //<*.glnk> 를 읽어서 <*.gvmx> 를 만들어 준다.
  //여기서는 별도로 처리 할 것은 없으며 단지 <*.glnk> 를 [2진문서] 로 반들어
  //<*.gvmx> 로 저장해 주기만 하면 된다.
  //}------------------------------------------------------------------------

  //[VAR]
  //{
      class   DATABASE  *database;

      //처리에 필요한 정보 구조체는 한개만 생성하면 된다.
      struct  GVMX  gvmxInfo;

      //[2진화문서] 를 저장한다.
      char   *gvmxBuf = NULL;

      //gvmxBuf[] 상의 저장위치가 들어 있다(BASE : 0).
      int     gvmxBufPtr = 0;

      char    gvmxFileName[OPT_filepath_length];

      //[2009.08.17.월][추가!!!]
      char    gvmsFileName[OPT_filepath_length];

      int     strLength = 0;

      int     i;

      //1 Byte 크기의 16 진수 문자열을 저장한다("0x" 까지 저장한다).
      char    hexStr[5];

      int     byte;

      int     gvmiCount = 1;

  //}

  //[DATABASE 위치 얻기]
  //{
      DATABASE_GetPtr(&database);

  //}

  //[*.glnk 문서 열기]
  //{
      //[!]{-----------------------------------------------------------
      //<*.glnk> 문서를 열어준다.
      //{DATABASE} 안의 [문서정보구조체] 에 문서 크기 만큼 생성해준다.
      //}--------------------------------------------------------------

      if(FILE_Open2(pFileName,
                    (unsigned char **)(&(database->fileinfo.buf)),
                    &(database->fileinfo.size),
                    &(database->fileinfo.handle)) != true)
      {
        //<*.glnk> 문서열기 오류로 더이상 진행하지 않고 바로 종료한다.
        goto GVMX_ERROR;

      }

  //}

  //[<*.gvmx> 저장소 만들기]
  //{
      //[저장소 생성]
      //{
          //[!]{--------------------------------------------------------
          //<*.gvmx> 문서는 *.ob1 문서의 1/2 배 정도면 충분하다.
          //[일반문서] 를 [2진문서] 로 바꾸므로 정확하게 절반이면 된다.
          //실제 <*.glnk> 에는 CRLF 등도 있으므로 실제 약간 남는다.
          //}-----------------------------------------------------------

          /*gvmxBuf = new char [database->fileinfo.size *
                              OPT_GvmxFile_SizeFactor +
                              //<*.gvmx> 앞의 [선행정보] 크기만큼 더해준다.
                              d_VMEX_HdrSize];
          */
          //[동적생성단위적용][2021.01.24.일][수정]
          gvmxBuf = new char [UnitX(1024, database->fileinfo.size *
                                          OPT_GvmxFile_SizeFactor +
                                          //<*.gvmx> 앞의 [선행정보] 크기만큼 더해준다.
                                          d_VMEX_HdrSize)];

      //}

      //[<*.gvmx> 문서 이름 만들기]
      //{
          //<*.gvmx> 문서 이름을 미리 만들어 놓는다.
          //<*.glnk> 문서 이름을 그대로 사용하고 [확장자] 만 바꾼다.

          STR_ChangeFileExt(pFileName, "gvmx", gvmxFileName);

      //}

  //}

  //[tempfile][<*.gvmi> file buffer 생성]
  //{
      //[tempfile 저장소 생성]
      //{
          //<*.gvmi> 문서는 <*.glnk> 문서의 1.5 배로 생성한다.
          TEMPFILE_Create(database->fileinfo.size * OPT_GvmiFile_SizeFactor);

      //}

      //[<*.gvmi> 문서 이름 만들기]
      //{
          //<*.gvmi> 문서 이름을 미리 만들어 놓는다.
          TEMPFILE_MakeFileName(pFileName, "gvmi");

      //}

  //}

  //[정보 초기화]
  //{
      //*.ob1 문서가 저장되 있는 위치를 얻는다.
      gvmxInfo.lnkBuf  = database->fileinfo.buf;

      //<*.gvmx> 의 저장소 위치를 저장한다.
      gvmxInfo.gvmxBuf = gvmxBuf;

      //총 행수를 얻는다.
      gvmxInfo.lineTotalCount = STR_Get_LineCount(gvmxInfo.lnkBuf);

      gvmxInfo.lineStartIndex = 0;

      gvmxInfo.line           = 0;

      gvmxInfo.word[0]        = '\0';

      gvmxInfo.wordStartIndex = 0;

  //}

  //[초기화]
  //{
      //[2009.02.11.수]{-----------------------------------------------------
      //<*.gvmx> 에는 [선행정보] 가 앞에 위치하므로 이 위치 만큼 미리 공간을
      //확보해 준다.
      //이 공간은 최종적으로 완성된다.
      //}--------------------------------------------------------------------

      gvmxBufPtr = d_VMEX_HdrSize;

  //}

  //[Binary 처리]
  //{
      //[1단계 처리]
      //{
          GVMX_LINE_START:

          //[Win7 <응답이 없는 상태> 해결]
          //{
              //[2010.09.26.일][중요추가!!!]{---------------------------------------------------------------
              //WinXP 에서는 아무 문제가 없었는데, Win7 에서는 [무한반복] 이 계속되는 경우
              //일정 시간이 지나면 [응답이 없는 상태] 로 지정되어 [맷돌] 과 통신시에 [시간제한] 에
              //계속 걸리는 문제가 발생하고, [하얗게] 되는 문제가 발생한다.
              //보기에도 좋지 않고, 통신에도 문제가 방생하므로 [무한반복] 부분에 [외부 알림문 확인] 을 넣어
              //이런 형상이 발생하지 않도록 수정한다.
              //이는 [링크] 등 다른 부분도 마찬가지이므로 대규모 [무한반복] 을 처리하는 부분에는 전부
              //이 문장을 넣어 준다.
              //}-------------------------------------------------------------------------------------------

              Application->ProcessMessages();

          //}

          //여기서부터 또 하나의 행이 시작되는 것이다.

          //[현재 행에 내용이 있는가?]
          //{
              //현재 행에 처리할 것이 없다면 다음 행으로 넘어가야 한다.
              //[첫번째 단어] 만 추출해 보면 간단하게 알수 있다.
              Gvmx_GetWord(&gvmxInfo, 0);

              //첫 단어가 아무것도 없는 경우는 이 행에는 처리할게 없는 것이므로 다음 행으로 넘긴다.
              if(STR_Match(gvmxInfo.word, "") == true) { goto GVMX_LINE_END; }

          //}

          //[2진화 변환]
          //{
              //[2009.02.11.수][추가!!!]{------------------------------------
              //<*.glnk> 행단위로 읽어서 각각을 [2진화 문서] 로 만들어 준다.
              //}------------------------------------------------------------

              //[문자열 얻기]
              //{
                  //[!]{------------------------------------------------------
                  //<*.glnk> 는 한 행이 이미 공백이 없이 전부 붙어 있다.
                  //즉, 행 한개에 단어 한개 밖에는 존재하지 않므으로 행단위로
                  //첫단어만 읽어 들여 처리하면된다.
                  //}---------------------------------------------------------

                  Gvmx_GetWord(&gvmxInfo, 0);

              //}

              //[문자열 길이 얻기]
              //{
                  strLength = STR_Length(gvmxInfo.word);

              //}

              for(i = 0;
                  i < strLength;
                  //2개 문자가 1 Byte 로 합성된다.
                  i += 2,
                  //gvmxBuf[] 에는 1 Byte 씩 저장되므로 ++ 한다.
                  gvmxBufPtr++, gvmxInfo.gvmxSize = gvmxBufPtr, gvmiCount++)
              {
                //[값으로 변환]
                //{
                    //[16진수 문자열 합성]
                    //{
                        //[16진수] 문자열로 합성한다.
                        STR_Assign(hexStr, "0x");

                        hexStr[2] = gvmxInfo.word[i];

                        hexStr[3] = gvmxInfo.word[i + 1];

                        //문자열로 만들어 준다.
                        hexStr[4] = '\0';

                    //}

                    //값으로 변환한다.
                    CONV_HexStr_To_IntVal(hexStr, &byte);

                //}

                //[저장]
                //{
                    gvmxBuf[gvmxBufPtr] = byte;

                //}

                //[<*.gvmi> 문서를 합성]
                //{
                    TEMPFILE_Add(&(hexStr[2])); TEMPFILE_Add(" ");

                    if((gvmiCount % 16) == 0)
                    {
                      //한 행에 16 Byte 가 표시되게 만든다.
                      TEMPFILE_Add("\r\n");

                      gvmiCount = 0;

                    }

                //}

              }

          //}

          GVMX_LINE_END:

          //각각의 [행] 을 처리한 다음에 다음 [행] 을 지정하거나 문서의 끝에 도달한 경우 등의 처리를 수행한다.

          //[문서의 끝인가?]
          //{
              //현재 [행번호 + 2] 이 총 행수와 같다면 모든 행을 다 처리한 것이다.
              //이는 <*.glnk> 문서에 빈행은 없으나 맨 마지막 문서행은 내용이 없는 CRLF 만 있기 때문이다.

              if((gvmxInfo.line + 2) >= gvmxInfo.lineTotalCount)
              {
                //모든 행을 다 처리 하였으므로 문서를 저장하는 곳으로 이동한다.
                goto GVMX_OK;

              }
              else
              {
                //[다음행 지정]
                //{
                    //다음 행의 시작 index 를 구한다.
                    STR_Get_NextLineStartIndex(gvmxInfo.lnkBuf,
                                               gvmxInfo.lineStartIndex,
                                               &(gvmxInfo.lineStartIndex));

                    //행 순번 증가.
                    gvmxInfo.line++;

                //}

                //다시 다음 행을 처리한다.
                goto GVMX_LINE_START;

              }

          //}

      //}

  //}

  GVMX_OK:
  //{
      //[2009.08.17.월][수정!!!]{--------------------------------------------
      //[맷돌모듈] 용 <*.gvmx> 와 [가상구동기] 용 <*.gvms> 를 같이 생성한다.
      //이는 두개의 메모리 구조를 금일 다르게 만들었기 때문이다.
      //}--------------------------------------------------------------------

      //[<*.gvmx> 생성]
      //{
          //[선행정보 만들기]
          //{
              //[!]{--------------------------------------------------
              //<*.gvmx> 앞의 [선행정보] 를 만들어 준다.
              //반드시 gvmxBuf[] 가 삭제되기 전에 수행해 주어야 한다.
              //}-----------------------------------------------------

              Gvmx_Header(&gvmxInfo, "gvmx");

          //}

          //[<*.gvmx> file 저장]
          //{
              //gvmxBuf[] [저장소] 의 내용을 <*.gvmx> [2진화 문서] 로 저장한다.

              FILE_Save(gvmxFileName, gvmxBuf, gvmxBufPtr);

          //}

      //}

      //[<*.gvms> 생성]
      //{
          //[선행정보 만들기]
          //{
              //[!]{--------------------------------------------------
              //<*.gvms> 앞의 [선행정보] 를 만들어 준다.
              //반드시 gvmxBuf[] 가 삭제되기 전에 수행해 주어야 한다.
              //<*.gvmx> 와 완전히 같으나 MEM 크기정의만 다르다.
              //}-----------------------------------------------------

              Gvmx_Header(&gvmxInfo, "gvms");

          //}

          //[확장자 바꾸기]
          //{
              STR_ChangeFileExt(gvmxFileName, "gvms", gvmsFileName);

          //}

          //[<*.gvms> file 저장]
          //{
              //gvmxBuf[] [저장소] 의 내용을 <*.gvms> [2진화 문서] 로 저장한다.

              FILE_Save(gvmsFileName, gvmxBuf, gvmxBufPtr);

          //}

      //}

      //[삭제]
      //{
          //동적으로 삭제한다.
          if(gvmxBuf != NULL) { delete [] gvmxBuf; gvmxBuf = NULL; }

      //}

      TEMPFILE_Save();

      //[정보 문자열 출력]
      //{
          //[2009.07.31.금][추가!!!]{-------------
          //CODE, DATA 의 크기 정보를 출력해준다.
          //}-------------------------------------

          Gvmx_Info(&gvmxInfo);

      //}

      //[2012.04.28.토][추가!!!]
      database->FILEINFO_Delete(&(database->fileinfo));

      //여기까지 온것은 이상없는 것이다.
      return(true);

  //}

  GVMX_ERROR:
  //{
      //동적으로 생성된 [저장소] 들을 삭제한다.
      TEMPFILE_Delete();

      //[2012.04.28.토][추가!!!]
      database->FILEINFO_Delete(&(database->fileinfo));

      return(false);

  //}

}

//[기본 처리 함수]--------------------------------------------------------------

void __fastcall Gvmx_GetWord(//정보구조체.
                             struct GVMX  *prGvmxInfo,
                             //지정 단어 순번(BASE : 0).
                             int    pWordXst)
{
  //[2009.02.11.수][생성!!!]{--------------------------------------------------------------
  //[정보구조체] 를 전달 받아서 현재 정보를 참고하여 해당 순번의 단어를 추출하여 반환한다.
  //현재 행의 시작 index 값등 기본 정보는 전부 [정보구조체] 에 들어 있다.
  //}--------------------------------------------------------------------------------------

  //[단어 추출]
  //{
      //현재 행의 첫 단어를 추출한다.
      STR_GetLineWordBuf(prGvmxInfo->lnkBuf,
                         prGvmxInfo->lineStartIndex,
                         pWordXst,
                         &(prGvmxInfo->wordStartIndex),
                         prGvmxInfo->word);

  //}

  return;

}

//------------------------------------------------------------------------------
//[부가함수]--------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Gvmx_Header(struct GVMX  *pGvmxInfo,
                            //[2009.08.17.월][추가!!!]
                            //"gvmx" 인지 "gvms" 인지 구분.
                            char         *pKind)
{
  //[2009.02.11.수][생성!!!]{---------------------------------------------------
  //<*.gvmx> 앞의 [선행정보] 를 만들어 준다.
  //현재는 [시험용] 이므로 간단하게 구성한다.
  //
  //[2009.08.17.월][추가!!!]----------------------------------------------------
  //<*.gvmi> 는 "gvmx" 인 경우만 생성한다.
  //
  //[2011.12.28.수][중요수정!!!]
  //VMOS:API 처리 방식 변경에 따른 [가상기계:판번호] <0 -> 1> 로 변경.
  //
  //[2015.01.31.토][수정!!!]----------------------------------------------------
  //[선행정보] 의 각 위치를 <index> 가 아니라 [정의이름]  으로 수정.
  //이는 향후 수정시 서로 참조하는 내용을 동일하게 하여 혼란을 방지하기 위함.
  //
  //[2018.09.13.목][수정!!!]----------------------------------------------------
  //<*.gvmi> 의 정보는 모두 <gvmx/gvms> 공통이나 <Memory Size> 만 다른데
  //이 정보를 기존의 <gvmx> 것만 기술하지 않고 아래에 <gvms> 것도 같이 기술하는
  //것으로 수정.
  //}---------------------------------------------------------------------------

  //[VAR]
  //{
      class   DATABASE  *database;

      char    headerStr[OPT_str_default_size] = {""};

      char    tempStr[OPT_wordStrSize] = {""};
      char    codeStr[OPT_wordStrSize] = {""};

  //}

  //[VMOSINFO 위치 얻기]
  //{
      //[2010.12.10.금][추가!!!]
      struct VMOSINFO  *vmosInfo;

      VmosInfo_GetPtr(&vmosInfo);

  //}

  //[DATABASE 위치 얻기]
  //{
      DATABASE_GetPtr(&database);

  //}

  //[가상기계:판번호]
  //{
      //[2011.12.28.수][중요수정!!!]{---------------------------------------
      //VMOS 의 API 호출방식이 변경되었고 API 도 변경되었으므로
      //이전과 구분하기 위하여 [정의이름] 으로 정의된 [판번호] 를 사용한다.
      //금일 부로 <0 -> 1> 로 변경되었다.
      //}-------------------------------------------------------------------

      //(*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * 0]))) = Opt_Ide_GvmVersion;
      (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_Version]))) = Opt_Ide_GvmVersion;

      //[<*.gvmi> 문자열]
      //{
          if(STR_Match(pKind, "gvmx") == true)
          {
            STR_Add(headerStr, "< Version     > : ");

            CONV_LongVal_To_Hex(Opt_Ide_GvmVersion, 16, tempStr);

            Endian_Change_HexStr(tempStr, codeStr);

            STR_Add(headerStr, codeStr);
            STR_Add(headerStr, " \r\n");

          }

      //}

  //}

  //[<선행정보> 크기]
  //{
      //현재로서는 고정 크기를 갖는다.
      //(*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * 1]))) = d_VMEX_HdrSize;
      (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_HdrSize]))) = d_VMEX_HdrSize;

      //[<*.gvmi> 문자열]
      //{
          if(STR_Match(pKind, "gvmx") == true)
          {
            STR_Add(headerStr, "< Header Size > : ");

            CONV_LongVal_To_Hex(d_VMEX_HdrSize, 16, tempStr);

            Endian_Change_HexStr(tempStr, codeStr);

            STR_Add(headerStr, codeStr);
            STR_Add(headerStr, " \r\n");

          }

      //}

  //}

  //[<CODE> 크기]
  //{
      //이미 정보 구조체 안에 저장되 있다.
      //이 크기는 [선행정보] 크기가 같이 들어 있으므로 이 크기는 제외해 주어야 한다.
      //(*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * 2]))) = pGvmxInfo->gvmxSize - d_VMEX_HdrSize;
      (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_CodeSize]))) = pGvmxInfo->gvmxSize - d_VMEX_HdrSize;

      //[<*.gvmi> 문자열]
      //{
          if(STR_Match(pKind, "gvmx") == true)
          {
            //[2021.01.15.금][문자열 위치 수정]
            STR_Add(headerStr, "< Code   Size > : ");

            CONV_LongVal_To_Hex(pGvmxInfo->gvmxSize - d_VMEX_HdrSize, 16, tempStr);

            Endian_Change_HexStr(tempStr, codeStr);

            STR_Add(headerStr, codeStr);
            STR_Add(headerStr, " \r\n");

          }

      //}

  //}

  //[<DATA> 크기]
  //{
      //{DATABASE}:_DATA_ofsADR 에 이미 크기가 들어 있다,
      //(*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * 3]))) = database->_DATA_ofsADR;
      (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_DataSize]))) = database->_DATA_ofsADR;

      //[<*.gvmi> 문자열]
      //{
          if(STR_Match(pKind, "gvmx") == true)
          {
            //[2021.01.15.금][문자열 위치 수정]
            STR_Add(headerStr, "< Data   Size > : ");

            CONV_LongVal_To_Hex(database->_DATA_ofsADR, 16, tempStr);

            Endian_Change_HexStr(tempStr, codeStr);

            STR_Add(headerStr, codeStr);
            STR_Add(headerStr, " \r\n");

          }

      //}

  //}

  //[<MEM> 크기]
  //{
      //[2009.03.20.금][수정!!!]{---------------------------------------------------------
      //[RAM] 상에는 앞부분에 VMOS 가 사용하는 [선행정보] 가 있으므로 이 크기는 실제 사용
      //MEM 영역에서 제외해 주어야 한다. 이렇게 하지 않는 경우는 @SP 위치가 [RAM] 이
      //존재하지 않는 영역에 배치되어 오류가 발생한다.
      //
      //[2018.09.13.목][수정!!!]**********************************************************
      //<*.gvmi> 의 정보는 모두 <gvmx/gvms> 공통이나 <Memory Size> 만 다른데
      //이 정보를 기존의 <gvmx> 것만 기술하지 않고 아래에 <gvms> 것도 같이 기술하는
      //것으로 수정.
      ///
      //< Memory Size > : xxxxxxxxxxxxxxxx(gvmx)
      //                : xxxxxxxxxxxxxxxx(gvms)
      //
      //와 같이 두개 행으로 기술하고 옆에 식별 표시.
      //}---------------------------------------------------------------------------------

      if(STR_Match(pKind, "gvmx") == true)
      {
        //<*.gvmx> 인 경우를 처리한다.
        (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_MemSize]))) = vmosInfo->VMOS_RamSize -
                                                                                   //일단 1 개만 실행하는것으로 [선행정보] 크기를 제외해 준다.
                                                                                   (8 + d_VM_HdrSize);

      }
      else
      {
        //<*.gvms> 인 경우를 처리한다.
        (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_MemSize]))) = d_Sim_VMOS_RamSize -
                                                                                   //일단 1 개만 실행하는것으로 [선행정보] 크기를 제외해 준다.
                                                                                   (8 + d_VM_HdrSize);

      }

      //[<*.gvmi> 문자열]
      //{
          if(STR_Match(pKind, "gvmx") == true)
          {
            //[2021.01.15.금][수정]{*******************************
            //기존 < Memory Size > 를 < Ram    Size > 로 변경한다.
            //실제 [VMOS 에서 사용 가능한 Ram 크기] 를 의미하므로
            //의미를 혼동하지 않도록 아예 확실한 표기로 변경한다.
            //STR_Add(headerStr, "< Memory Size > : ");
            STR_Add(headerStr, "< Ram    Size > : ");
            //}****************************************************

            CONV_LongVal_To_Hex((*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_MemSize]))), 16, tempStr);

            Endian_Change_HexStr(tempStr, codeStr);

            STR_Add(headerStr, codeStr);

            //[2018.09.13.목][추가!!!]{*********************************
            //<gvms> 정보도 추가 되므로 뒤에 "(gvmx)" 라는 식별자 추가.
            STR_Add(headerStr, "(gvmx)");
            //}*********************************************************

            STR_Add(headerStr, " \r\n");

            //[GVMS 정보도 추가]
            //{
                //[2018.09.13.목][추가!!!]{--------------------------------
                //<gvmx> 정보 아래 같은 위치에 <gvms> 의 정보도 같이 추가.
                //}--------------------------------------------------------
                
                STR_Add(headerStr, "                : ");

                //<gvms> 의 메모리 크기(위의 <d_VMEX_Hdr_MemSize> 설정 정보 참고).
                CONV_LongVal_To_Hex((d_Sim_VMOS_RamSize - (8 + d_VM_HdrSize)), 16, tempStr);

                Endian_Change_HexStr(tempStr, codeStr);

                STR_Add(headerStr, codeStr);

                //뒤에 "(gvms)" 식별자 추가.
                STR_Add(headerStr, "(gvms)");

                STR_Add(headerStr, " \r\n");

            //}

          }

      //}

  //}

  //[OPTION]
  //{
      //현재 [시험용] 으로 무조건 0 이다.
      //(*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * 5]))) = 0;
      (*(unsigned long long *)(&(pGvmxInfo->gvmxBuf[8 * d_VMEX_Hdr_Option]))) = 0;

      //[<*.gvmi> 문자열]
      //{
          if(STR_Match(pKind, "gvmx") == true)
          {
            STR_Add(headerStr, "< Option      > : ");

            CONV_LongVal_To_Hex(0, 16, tempStr);

            Endian_Change_HexStr(tempStr, codeStr);

            STR_Add(headerStr, codeStr);
            STR_Add(headerStr, " \r\n");

          }

      //}

  //}

  //[<*.gvmi> 에 [선행정보] 문자열 추가]
  //{
      //무조건 가장 처음에 추가하면 된다.
      TEMPFILE_Insert(0, headerStr);

  //}

  return;

}

void __fastcall Gvmx_Info(struct GVMX  *pGvmxInfo)
{
  //[2009.07.31.금][생성!!!]{-----------------------------------------------
  //<*.gvmx> 생성후 [CODE] 와 [DATA] 의 Byte 단위 크기를 출력하여 알려준다.
  //<*.gvmx> 자체 크기가 아니라 순수하게 [CODE] 크기만 해당한다.
  //추후, 보다 다양한 정보가 추가 될수 있다.
  //}-----------------------------------------------------------------------

  //[VAR]
  //{
      class   DATABASE  *database;

      //최종적으로 출력할 문자열을 저장한다.
      char    infoStr[OPT_lineStrSize] = {""};
      char    tempStr[OPT_lineStrSize] = {""};

      int     codeSize;
      int     dataSize;

  //}

  //[DATABASE 위치 얻기]
  //{
      DATABASE_GetPtr(&database);

  //}

  //[<CODE> 크기]
  //{
      //<CODE> 크기는 <*.gvmx> 크기에서 [선행정보] 크기를 제외하면 된다.
      codeSize = pGvmxInfo->gvmxSize - d_VMEX_HdrSize;

      //[CODE 정보 추가]
      //{
          STR_Add(infoStr, "\r\n");
          STR_Add(infoStr, "< CODE 크기 > : 0x");

          //CONV_LongVal_To_Hex(codeSize, 16, tempStr);
          CONV_LongVal_To_Hex2(codeSize, tempStr);
          STR_Add(infoStr, tempStr);

          STR_Add(infoStr, "(");
		  STR_Add(infoStr, ((AnsiString)IntToStr(codeSize)).c_str());
          STR_Add(infoStr, " 바이트) \r\n");

      //}

  //}

  //[<DATA> 크기]
  //{
      //{DATABASE}:_DATA_ofsADR 에 이미 크기가 들어 있다,
      dataSize = database->_DATA_ofsADR;

      //[DATA 정보 추가]
      //{
          STR_Add(infoStr, "< DATA 크기 > : 0x");

          //CONV_LongVal_To_Hex(dataSize, 16, tempStr);
          CONV_LongVal_To_Hex2(dataSize, tempStr);
          STR_Add(infoStr, tempStr);
          //STR_Add(infoStr, " \r\n");

          STR_Add(infoStr, "(");
		  STR_Add(infoStr, ((AnsiString)IntToStr(dataSize)).c_str());
          STR_Add(infoStr, " 바이트) \r\n");

      //}

  //}

  //[알림글 출력]
  //{
      //[출력창] 에 정리된 정보 문자열을 출력한다.
      msg_msg_Form->_PrintAddLine(d_msg_msg, infoStr);

  //}

  return;

}




