
//[2009.02.07.토][생성!!!]


#include "c_define.h"

//[2012.06.30.토][추가!!!]
#include "str_heap.h"

struct LINKLABELITEM
{
  //[2009.02.08.일][생성!!!]{---------------------------------------------------
  //한개 [함수라벨] 의 정보를 저장하며 [Object] 행수의 1/5 크기로 동적 생성하고
  //Link() 가 끝나면 삭제한다.
  //}---------------------------------------------------------------------------

  //[함수라벨] 도 [기호길이] 를 넘지 않으므로 이 길이도 설정한다.
  //[2022.08.28.일][수정]{***********************************************************
  //[함수라벨] 의 경우 [함수이름] 과 같은 이름을 갖기 때문에 [함수이름] 이
  //아주 긴 경우는 <OPT_1st_symbol_length:60 Byte> 로 다룰수 없게 된다.
  //따라서, [이름] 길이로 정의한다.
  //[문서검색기] 에 [이름변경대화상자] 를 추가하면서 [함수이름] 길이가
  //너무 긴 경우가 발견되어 [LINK 오류] 가 발생한 원인을 수정하기 위한것.
  //<OPT_1st_symbol_length> => <OPT_name_length> 로 변경(아주 긴 함수이름을 위한것).
  char                name[OPT_name_length];
  //}********************************************************************************

  //_CODE_:BASE 의 [추가주소] 를 저장한다(실제 [함수라벨] 의 주소).
  unsigned long long  ofsAdr;

  //[2011.05.22.일][추가!!!]{----------------------------------------------------------
  //[함수의 종료 위치] 가 되는 <fnend:0x2f> 명령의 위치(_CODE_:BASE)를 가진다.
  //
  //이 <fnend> 는 "FD.X.}:" 에 해당하는 위치로 함수당 [한개] 밖에 없으며
  //반드시 [함수라벨] 과 1:1 로 대응하게 된다.
  //이 정보는 검증시 [함수탈출] 에 반드시 필요하며 [함수라벨] 을 <*.$lst> 문서에
  //재정리 할때 [함수라벨] 과 대응하는 이름으로 생성되어 추가되야 한다.
  //이는 실제 검증시에는 <*.$lst> 문서가 기본이 되기 때문이다.
  unsigned long long  ofsAdr_fnend;
  //
  //[처리방법]-------------------------------------------------------------------------
  //<link:1st> 처리시에 [함수라벨] 과 같이 _CODE_:BASE 의 [추가주소] 가 바로 얻어진다.
  //}----------------------------------------------------------------------------------

  //[2011.05.23.월][추가!!!]{-------------------------------------------------
  //이 [함수라벨] 이 존재하는 [문서] 의 [설계묶음안경로] 를 가진다.
  //이는 [함수라벨(특히 함수묶음안의 함수라벨)] 이 어떤 [문서] 안에 있는지
  //검증시 정확하게 알필요가 있기 때문이다.
  //
  //[2011.05.24.화][수정!!!]--------------------------------------------------
  //1) [함수라벨] 은 순서대로 온다.
  //2) 문서 정보는 중복될 필요가 없다.
  //<DebugFile_Make_LineListFile_FuncEndInfo()> 함수에서 일일히 [문서이름] 을
  //비교하여 중복여부를 가리지 않도록, [문서이름] 후 첫 [함수라벨] 정보만
  //[문서이름] 을 할당하고, 이후 [함수라벨] 은 새로운 [문서이름] 이 나오기
  //전까지는 NULL 을 할당한다.
  //이렇게하면 [문서이름:NULL] 인 경우는 [중복] 으로 같은 문서안에 여러개의
  //함수가 있다는 것을 쉽게 알수 있다.
  //
  //이 처리는 <Tree_Link1st_FuncLabel()> 함수안에서 처리된다.
  //같은 날짜의 수정 내용을 확인한다.
  char                fileName[OPT_pathInGprj_length];
  //}-------------------------------------------------------------------------

};

struct LINKINFOETC
{
  //[2009.02.07.토][생성!!!]{-------------------------------
  //<*.glnk> 문서를 번역하는데 필요한 부가 정보를 관리한다.
  //}-------------------------------------------------------

  //각 [라벨] 의 _CODE_:BASE 의 [추가주소] 를 계산할때 사용된다.
  unsigned long long  ofsAdr; //(BASE : 0)

  //[Object] 행수의 1/5 크기로 동적 생성하고 Link() 가 끝나면 삭제한다.
  struct LINKLABELITEM  *labelItems;

  //현재 저장된 item 의 개수를 가진다(BASE : 0).
  int    labelItemCount;

};

struct LINKINFO
{
  //[2009.02.07.토][생성!!!]{------------------------------------
  //Link 로 번역시 현재 진행되고 있는 각종 중요 정보를 관리한다.
  //}------------------------------------------------------------

  //처리중인 함성된 <*.gobj> 문서의 위치가 들어있다.
  char  *objBuf;
  int    objBufSize;

  //변환 중인 <*.glnk> 문서의 위치가 들어있다.
  char  *lnkBuf;
  int    lnkBufSize;

  //현재 문서의 총 행수(BASE : 0).
  int    lineTotalCount;

  //현재 처리중인 행의 시작 index(BASE : 0).
  int    lineStartIndex;

  //현재 처리중인 행의 행 index(BASE : 0).
  int    line;

  //현재 추출한 단어.
  //이 단계에서는 추출하는 [단어] 중에 완전히 [code] 로 번역된 [문자열] 이 존재하므로
  //아주 넉넉하게 공간을 마련해 주어야 한다.
  char   word[1024*10];

  //현재 추출한 단어의 시작 index(BASE : 0).
  int    wordStartIndex;

  //부가 정보를 관리한다.
  //단, 이 젙체 정보 구조체가 복사 되어 사용되므로 대용량을 가지는 부가정보는 [포인터] 로 관리한다.
  //이렇게 하면 주소만 복사되므로 [부가정보] 의 용량과는 무관하게 된다.
  struct LINKINFOETC *infoEtc;

  //[2011.05.23.월][추가!!!]{----------------------------------------------------------
  //현재 처리중인 문서의 [설계묶은 안 경로] 를 관리한다.
  //{ #문서경로 } 행을 처리하면서 해당 정보를 기록하면 된다.
  //
  //이는 [함수라벨] 이 어떤 [문서] 안에 존재하는지에 대한 정보를 처리하기 위한 것이다.
  char   fileName[OPT_pathInGprj_length];
  //}----------------------------------------------------------------------------------

};

//[함수]------------------------------------------------------------------------

//[2012.07.30.토][완료!!!]
bool __fastcall Link(char  rSaveFileName[]);

//[2009.02.08.일][완료!!!]
int __fastcall Tree_Link1st_VectorLine(struct LINKINFO  *prLinkInfo);

//[2011.05.23.일][완료!!!]
int __fastcall Tree_Link1st_FuncLabel(struct LINKINFO  *prLinkInfo);

//[2009.02.08.일][완료!!!]
int __fastcall Tree_Link1st_Line(struct LINKINFO  *prLinkInfo);

//[2011.05.22.일][완료!!!]
int __fastcall Tree_Link1st_FuncEnd(struct LINKINFO  *prLinkInfo);

//[2011.05.23.월][완료!!!]
int __fastcall Tree_Link1st_FileName(struct LINKINFO  *prLinkInfo);


//[LINK]------------------------------------------------------------------------

//[2009.02.09.월][완료!!!]
int __fastcall Tree_Link_VectorLine(struct LINKINFO  *prLinkInfo);

//[2011.05.23.월][완료!!!]
int __fastcall Tree_Link_FileName(struct LINKINFO  *prLinkInfo);

//[2009.02.09.월][완료!!!]
int __fastcall Tree_Link_FuncLabel(struct LINKINFO  *prLinkInfo);

//[2009.02.09.월][완료!!!]
int __fastcall Tree_Link_Line(struct LINKINFO  *prLinkInfo);

//------------------------------------------------------------------------------
//[추가함수]--------------------------------------------------------------------
//------------------------------------------------------------------------------

//[2011.05.22.일][완료!!!]
int __fastcall Link_Get_ObjectFileTotalSize(int  *rObjectFileTotalSize);

//[2009.02.08.일][완료!!!]
bool __fastcall Link_Check_Main(struct LINKINFO  *prLinkInfo);

//[2009.02.08.일][완료!!!]
void __fastcall Link_Get_Label_ItemIndex(struct LINKINFO  *prLinkInfo,
                                         char             *pLabelName,
                                         int              *rItemIndex);

//[2009.03.28.토][완료!!!]
void __fastcall Link_Database_FuncOfsAdr(struct LINKINFO  *pLinkInfo);

//[2011.05.24.화][완료!!!]
int __fastcall Link_Get_FuncOfsAdrHexStr_withName(struct  LINKINFOETC  *pLinkInfoEtc,
                                                  char   *pFuncLabelName,
                                                  //16자리로 확정해야 하는 경우는 true.
                                                  bool    p16Digit,
                                                  char   *rHexStr);

//[2011.05.24.화][완료!!!]
int __fastcall Link_Get_FuncEndOfsAdrHexStr_withName(struct  LINKINFOETC  *pLinkInfoEtc,
                                                     //찾을때는 [함수라벨] 로 찾는다.
                                                     char   *pFuncLabelName,
                                                     //16자리로 확정해야 하는 경우는 true.
                                                     bool    p16Digit,
                                                     char   *rHexStr);

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

//[2009.02.08.일][완료!!!]
void __fastcall Link_GetWord(//정보구조체.
                             struct LINKINFO  *prLinkInfo,
                             //지정 단어 순번(BASE : 0).
                             int    pWordXst);

//[최적화 관련]
//{
    //[2012.07.02.월][완료!!!]
    void __fastcall Link_Delete_UnUseFunction(//<*.gobj/*.glib> 가 하나로 합성돼있는 저장소 자체 주소를 넘겨받는다.
                                              //내부적으로 [재생성] 되며 다시 [재생성] 공간을 등록해 주어야 하기 때문.
                                              //[재생성] 장소는 같은 크기를 갖는다.
                                              char  **prObjBuf_,
                                              int     pObjBufSize,
                                              //재처리한 문서 전체 크기.
                                              int    *rTotalSize_);




//}




