
//[2009.01.11.일][생성!!!]

#include "c_define.h"


struct OBJECT1STLABELITEM
{
  //[2009.01.14.수][생성!!!]{-------------------------------------------------------
  //한개 [지역라벨] 의 정보를 저장하며 실제는 처리하는 <*.asm> 의 [전체행수]*1/5 의
  //크기로 저장소를 동적 생성하여 사용한다.
  //}-------------------------------------------------------------------------------

  //[지역라벨] 도 [기호길이] 를 넘지 않으므로 이 길이도 설정한다.
  char                name[OPT_1st_symbol_length];

  //_FUNC_:BASE 의 [추가주소] 를 저장한다.
  unsigned long long  ofsAdr;

};

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

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

  //_STR_ 의 _FUNC_:BASE 의 [추가주소] 를 갖는다.
  //실제는 "FD.X.STR.{:" 위치가 되며 2단계에서 [피연산자] 에 사용된 [문자열] 의 _FUNC_:BASE 로한
  //[추가주소] 를 확정하는데 사용된다.
  unsigned long long  strBase;

  //[2009.01.14.수][추가!!!]
  //{
      //Object1st() 함수 처음에 <*.asm> 문서 행수의 1/5 로 동적 생성하고,
      //이 함수를 다 처리한뒤 삭제한다.
      //이 정보는 [함수영역] 단위로 사용된다.
      struct OBJECT1STLABELITEM  *labelItems;

      //현재 저장된 item 의 개수를 가진다(BASE : 0).
      //새로운 [함수영역] 이 시작돨때마다 0 으로 초기화 해야 한다.
      int                         labelItemCount;

  //}

  //[행라벨 저장소]
  //{
      //[2009.01.22.목][추가!!!]

      //[$행번호] 를 저장한다.
      struct STRBUF  lineLabel;

      //[저장 형식]
      //{
          //[함수영역] 단위로 저장된다.
          //이는 [행번호] 도 일종의 [지역라벨] 이므로...
          //[추가주소] 는 _FUNC_ 의 주소로 정확하게 알수 있는 값이다.

          // [함수라벨]
          // [행번호] [추가주소]
          // [행번호] [추가주소]
          // [행번호] [추가주소]
          // ...
          //
          // [함수라벨]
          // [행번호] [추가주소]
          // [행번호] [추가주소]
          // [행번호] [추가주소]
          // ...

      //}

  //}

  //[<*.gasm2> 의 저장소]
  //{
      //[2009.03.29.일][추가!!!]{-----------------------------------------------------
      //<*.gasm> 과 1:1 로 행이 대응하는 [추가주소] 문자열을 만들어 준다.
      //이는 순수하게 [명령행] 의 경우만 해당되고 [함수라벨] 이나 [지역라벨] 등은
      //추가하지 않고 대신 공백으로 채워준다.
      //[추가주소] 는 [8 Byte] 의 16진수 문자열로 고정 형식으로 추가해 주어야 하고,
      //추가되지 않는 행의 경우는 같은 길이의 [공백] 으로 추가해 주어야 한다.
      //이 문서는 나중에 <*.gasm> 문서로 다시 합성되어 왼쪽에 [추가주소] 가 붙어 있는
      //제대로된 <*.gasm> 문서로 완성된다.
      //}-----------------------------------------------------------------------------

      struct STRBUF  gasm2;

  //}

};

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

  //처리중인 *.asm 문서의 위치가 들어있다.
  char  *asmBuf;

  //변환 중인 *.ob1 문서의 위치가 들어있다.
  char  *ob1Buf;

  //현재 문서의 총 행수(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 OBJECT1STINFOETC *infoEtc;

};


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

//[2011.11.09.수][완료!!!]
bool __fastcall Object1st(char  *pTempFileName);

//[1단계 처리 함수]-------------------------------------------------------------

//[2009.03.20.금][완료!!!]
int __fastcall Tree_Object1st_1st_FuncLabel(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.22.목][완료!!!]
int __fastcall Tree_Object1st_1st_LineNumber(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.13.화][완료!!!]
int __fastcall Tree_Object1st_1st_StrAreaStart(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.03.29.일][완료!!!]
int __fastcall Tree_Object1st_1st_StrAreaEnd(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.13.화][완료!!!]
int __fastcall Tree_Object1st_1st_Label(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.13.화][완료!!!]
int __fastcall Tree_Object1st_1st_OpcodeLine(struct OBJECT1STINFO  *prObject1stInfo);

//[2단계 처리 함수]-------------------------------------------------------------

//[2009.01.13.화][완료!!!]
int __fastcall Tree_Object1st_2st_FuncLabel(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.22.목][완료!!!]
int __fastcall Tree_Object1st_2st_LineNumber(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.13.화][완료!!!]
int __fastcall Tree_Object1st_2st_StrAreaStart(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.13.화][완료!!!]
int __fastcall Tree_Object1st_2st_Label(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.20.화][완료!!!]
int __fastcall Tree_Object1st_2st_OpcodeLine(struct OBJECT1STINFO  *prObject1stInfo);

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

//[2009.01.12.월][완료!!!]
void __fastcall Object1st_GetWord(//정보구조체.
                                  struct OBJECT1STINFO  *prObject1stInfo,
                                  //지정 단어 순번(BASE : 0).
                                  int    pWordXst);

//[2009.01.16.금][완료!!!]
int __fastcall Object1st_Get_OpndSize(char  *pOpndAsmSymbol);

//[2009.01.19.월][완료!!!]
void __fastcall Object1st_Get_AsmSymbol_LocalLabel(struct OBJECT1STINFO  *pObject1stInfo,
                                                   char                  *pWord,
                                                   char                   rAsmSymbol[]);
//[2009.01.19.월][완료!!!]
void __fastcall Object1st_Get_AsmSymbol_String(struct OBJECT1STINFO  *pObject1stInfo,
                                               char                  *pWord,
                                               char                   rAsmSymbol[]);






//[2009.01.22.목][완료!!!]
void __fastcall Object1st_LineNumberFileSave(struct OBJECT1STINFO  *pObject1stInfo,
                                             //일단 기본이 되는 *.obj 문서 이름으로 전달 받는다.
                                             char                  *pOb1FileName);

//[2009.03.30.월][완료!!!]
bool __fastcall Object1st_LineNumberExistCheck(struct OBJECT1STINFO  *pObject1stInfo,
                                               //일단 기본이 되는 *.obj 문서 이름으로 전달 받는다.
                                               char                  *pLineNumberSym);

//[<*.gasm2> 문서 관련]---------------------------------------------------------

//[2009.03.29.일][완료!!!]
void __fastcall Object1st_Gasm2_AddOfsAdr(struct OBJECT1STINFO  *pObject1stInfo,
                                          //[주소:true] 이고 [공백:false] 가된다.
                                          bool                   pTadrFspace,
                                          //<pTadrFspace:false> 인 경우는 의미 없는 값이다.
                                          unsigned long long     pOfsAdr);

//[2009.03.29.일][완료!!!]
void __fastcall Object1st_Gasm2FileSave(struct OBJECT1STINFO  *pObject1stInfo,
                                        //일단 기본이 되는 *.obj 문서 이름으로 전달 받는다.
                                        char                  *pOb1FileName);

//[검증용 함수]-----------------------------------------------------------------

//[2009.01.16.금][완료!!!]
void __fastcall Object1st_Debug_LabelView(struct OBJECT1STINFO  *prObject1stInfo);

//[2009.01.16.금][완료!!!]
void __fastcall Object1st_Debug_LabelView_Clear(struct OBJECT1STINFO  *prObject1stInfo);
