
//[!]{---------------------
//[2011.06.08.수][생성!!!]
//}------------------------

#ifndef debug_view_h
#define debug_view_h


#include "c_define.h"
#include "database.h"

//[2021.11.24.수][추가]
#include  "vmos_def.h"


struct DEBUGVIEWINFO
{
  //[2011.06.08.수][생성!!!]{--------------------
  //[검증보기] 관련 모든 정보를 여기서 관리한다.
  //}--------------------------------------------

  //[검증식] 문자열을 저장한다.
  //실제 [검증식] 의 해석은 이곳의 문자열을 대상으로 한다.
  char  expBuf[Opt_DebugView_StrBufSize];

  //[2011.06.09.목][추가!!!]{-----------------------------------------------------------------------
  //{DATABASE} 상의 {FILELIST} 의 [문서번호] 를 관리한다.
  //이는 [검증식] 문자열을 처리 하기 위하여 <Get_NextWord()> 함수를 사용하는데
  //<#define> 으로 정의된 이름을 검사할때 <ParserInfo.filelistindex> 정보가 필요하기 때문이다.
  //이는 [정의이름] 은 반드시 현재 [정의이름] 이 존재하는 [문서번호] 부터 검사를 시작하기 때문이다.
  //<{DATABASE}.FILELIST_GetIndex_WithName()>, <{DATABASE}.FILELIST_GetSize_WithIndex()> 함수로
  //간단하게 정보를 추출할수 있다.
  //
  int   dbFileListIndex; //(기본값 : 0)
  //<DebugView_Get_ExpStr_fromEditor()> 함수에서 처리.
  //}-----------------------------------------------------------------------------------------------

  //[2011.06.21.화][추가!!!]
  //현재 [선택영역] 을 가지는 [함수] 의 {DB} 상 위치.
  //[2011.07.19.화][개념정리!!!]
  //현재 검증중인 함수의 위치가 된다.
  //[선택영역] 이 있는 함수위 위치가 아니다!!!
  //<DebugViewDisplay_Make_DisplayStr> 에서 [검증식 보기판] 의 문자열을 정리할때는 이
  //정보로 [현재 함수영역 이름] 을 얻는데, [검증식 결과가 지역변수] 인 경우는
  //같은 영역인 경우는 원래 [검증식] 이 존재하는 함수이름이 되어 상관이 없으며
  //현재 [검증식] 이 있는 [함수영역] 이 아닌 경우는 [계산불가] 가 되어 자동으로
  //[검증식 보기판] 이 닫히게 되어 보이지 않으므로 무관하게 된다.
  //더불어, [전역변수] 인 경우는 자동적으로 현재 [검증중인 함수이름] 이 나오므로 더 좋다.
  //금일 개념을 확실하게 정리하고 기록한다.
  int   dbFuncRecIndex;
  //<DebugView_Get_ExpStr_fromEditor()> 함수에서 처리.

  //[2011.06.21.화][추가!!!]
  //[검증식] 의 최종 처리 결과 <exprecord> 를 가진다.
  //[자료형] 을 정확하게 알기 위하여 반드시 필요하다.
  struct EXPRECORD  expRecord;
  //<DebugView_DebugExp_CalCulate()> 함수에서 처리.

};



//[2011.07.24.일][완료!!!]
void __fastcall DebugView_Create(void);

//[2011.06.23.목][완료!!!]
void __fastcall DebugView_Delete(void);



//[2011.07.17.일][완료!!!]
bool __fastcall DebugView_EditorSelExpStr(//[2011.06.21.화][추가!!!]
                                          struct DEBUGVIEWINFO      *pDbgViewInfo,
                                          struct DEBUGVIEW_DISPLAY  *pDbgViewDisplay);


//[2011.06.21.화][완료!!!]
bool __fastcall DebugView_Get_ExpStr_fromEditor(//[2011.06.21.화][추가!!!]
                                                struct DEBUGVIEWINFO  *pDbgViewInfo);

//[2011.07.17.일][완료!!!]
bool __fastcall DebugView_DebugExp_CalCulate(char              *pExpStr,
                                             int                pFileListIndex,
                                             //[2011.07.19.화][주의!!!]{-------
                                             //현재 검증중인 함수영역 정보.
                                             int                pFuncRecIndex,
                                             //}-------------------------------
                                             struct EXPRECORD  *rExpRecord,
                                             char              *rExpRsltSymbol);
//[2011.06.21.화][완료!!!]
//bool __fastcall DebugView_DebugExp_CalCulate(//[2011.06.21.화][추가!!!]
//                                             struct DEBUGVIEWINFO  *pDbgViewInfo,
//                                             char                  *rExpRsltSymbol);

//[2011.06.21.화][완료!!!]
void __fastcall DebugViewInfo_Init(struct DEBUGVIEWINFO  *pDbgViewInfo);


//[2011.07.17.일][완료!!!]
bool __fastcall DebugView_Check_DebugExp(char  *pExpStr,
                                         int    pFileListIndex);



struct DBG_OPND
{
  //[2011.06.14.화][생성!!!]{------------------------------------------
  //<DebugView_WrRd()> 함수를 위한 인수를 선언한다.
  //[인수] 의 종류가 많고 수정의 가능성이 있으므로 [구조체] 로 만든다.
  //}------------------------------------------------------------------

  //실제 정보를 추출하는 대상 [기호].
  //[2011.06.16.목][수정!!!]
  //[기호] 를 가지고 있어야 하므로 [저장소] 로 선언한다.
  char                symbol[OPT_name_length];

  //[<실수/정수> 구분]{----------------------------------------------------------------------
  //쓰기의 경우는 [실수/정수] 인지 지정을 읽기의 경우는 읽은 값이 [실수/정수] 인지 반환한다.
  //<d_Integer/d_Float> 중 하나.
  //실제는 읽은 것의 정보를 알려주는 것이 주기능이다.
  int                 f_i;
  //}----------------------------------------------------------------------------------------

  //기록할때는 메모리 처럼 기록한다.
  unsigned char       mem[8];

  //[2011.06.17.금][중요추가!!!]{---------------------------------------------------------
  //자연스럽게 구해지는 [피연산자] 의 [절대주소] 를 관리한다.
  //부가 정보이지만 <DbgExp_Opcode_Operator_10()> 에서 [연산자:&] 를 처리하는데 필요하다.
  unsigned long long  adrAbs;
  //}-------------------------------------------------------------------------------------

  //[2011.06.21.화][추가!!!]{----------------------------------------------------------
  //[기반주소] 종류를 구분한다.
  //G(DATA), L(LOCAL), T(TEMP) 로 문자 한개로 쉽게 구분할수 있다.
  //이 정보는 [보기문자열] 을 만들때 필요한데, 어차피 <DebugView_Opnd_WrRd()> 함수에서
  //얻어지는 정보이며, 기호 자체로 다시 정보를 얻는 것이 복잡하므로 관리하도록 한다.
  char  segmentChar;
  //}----------------------------------------------------------------------------------

  int                  s_u;
  int                  size;

};

//[2011.07.25.월][완료!!!]
//[2022.01.13.목][완료]
bool __fastcall DebugView_Opnd_WrRd(//<맷돌대상:true>, <가상대상:flase>.
                                    bool  pTmtdl_Fsim,
                                    //쓰기/읽기 선택.
                                    //<d_Wr/d_Rd> 중 선택.
                                    int   pW_R,
                                     //[2011.06.14.화][수정!!!]
                                    //전용 [인수] 구조체로 대체한다.
                                    struct DBG_OPND  *prOpnd);

//[2021.11.28.일][완료]                                    
bool __fastcall DebugView_Str_Cut_CRLF(//[맷돌(G.MTDL.X)] 상의 읽어들일 [문자열] 절대주소.
                                       DTU8   pAdr,
                                       //읽어들인 문자열.
                                       char  *rStr,
                                       //문자열 길이를 강제 설정(0이면 사용하지 않음).
                                       int    pSetLength,
                                       //반환 문자열의 길이.
                                       int   *rStrSize);

//[2021.11.28.일][완료]                                       
bool __fastcall DebugView_Str_Read(//[맷돌(G.MTDL.X)] 상의 읽어들일 [문자열] 절대주소.
                                   DTU8   pAdr,
                                   //읽어들인 문자열.
                                   char  *rStr,
                                   //문자열 길이를 강제 설정(0이면 사용하지 않음).
                                   int    pSetLength,
                                   //반환 문자열의 길이.
                                   int   *rStrSize);

//[2011.07.23.토][완료!!!]
bool __fastcall AbsAdrRange_Check(unsigned long long  pAdr);

//[2011.06.13.월][완료!!!]
int __fastcall SizeTo2Exp(int pSize);


//[가상 TEMP 관련]
//{
    //[2011.06.15.수][완료!!!]
    void __fastcall VTemp_WrRd(int                  pW_R,
                               unsigned long long   pAdr,
                               int                  pSize,
                               void                *pMem);

//}

//[검증식 실제 계산 관련]
//{
    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_1(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x01) 1)  : "[]"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_2(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x02) 2)  : "->"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_3(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x03) 3)  : "."

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_4(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x04) 4)  : "!/"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_5(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x05) 5)  : "~/"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_8(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x08) 8)  : "-/"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_9(//1차번역문장.
                                             char  *p1stCode); //(OPCODE : (0x09) 9)  : "*/"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_10(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x0a) 10) : "&/"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_11(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x0b) 11) : "*"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_12(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x0c) 12) : "/"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_13(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x0d) 13) : "%"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_14(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x0e) 14) : "+"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_15(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x0f) 15) : "+*"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_16(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x10) 16) : "-"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_17(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x11) 17) : "-*"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_18(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x12) 18) : "<<"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_19(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x13) 19) : ">>"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_20(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x14) 20) : "<"

    //[2011.06.17.금][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_21(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x15) 21) : "<="

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_22(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x16) 22) : ">"

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_23(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x17) 23) : ">="

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_24(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x18) 24) : "=="

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_25(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x19) 25) : "!="

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_26(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x1a) 26) : "&"

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_27(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x1b) 27) : "^"

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_28(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x1c) 28) : "|"

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_29(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x1d) 29) : "&&"

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_30(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x1e) 30) : "||"

    //[2011.06.18.토][완료!!!]
    bool __fastcall DbgExp_Opcode_Operator_31(//1차번역문장.
                                              char  *p1stCode); //(OPCODE : (0x1f) 31) : "="

//}


//[검증식 표시]
//{
    struct  DEBUGVIEW_DISPLAY
    {
      //[2011.06.21.화][생성!!!]{-----------------------------
      //[검증보기] 결과를 [편집기] 상에 표시할 정보를 가진다.
      //}-----------------------------------------------------

      //[2011.06.20.월][추가!!!]{---------------------------------------------
      //현재는 4개의 정보가 4개 행으로 표시되므로 이 표시 내용을 모두
      //한개의 문자열로 담아두고, 처리하는 쪽에서 행단위로 추출하여 사용한다.
      char  displayStr[Opt_DebugView_ViewStrSize];
      //}---------------------------------------------------------------------

      //[2011.07.01.금][추가!!!]{------------------------
      //2진수/10진수/16진수중 어떤 것으로 보여줄 것인가?
      //직접 [2, 10, 16 의 숫자]로 직관적으로 구분한다.
      //
      //[2018.07.24.화][추가!!!]-------------------------
      //[문자열] 지원을 추가 한다.
      //'$' 문자로 지정. 
      int   viewKind; //(기본값:16)
      //}------------------------------------------------

    };

    //[2011.06.22.수][완료!!!]
    //[2018.07.24.화][완료!!!]
    //[2021.11.28.일][완료]
    //[2022.01.13.목][완료]
    void __fastcall DebugViewDisplay_Make_DisplayStr(struct DEBUGVIEWINFO      *pDbgViewInfo,
                                                     struct DEBUGVIEW_DISPLAY  *pDbgViewDisplay,
                                                     struct DBG_OPND           *pOpnd);

//}


//[검증식 보기창 관련]
//{
    //[2011.07.12.화][추가!!!]{-----------------------
    //[Tree:검증식 보기창] 관련 정보를 정의 처리한다.
    //}-----------------------------------------------

    struct DBGEXP_TREE_INFO
    {
      //[2011.07.12.화][생성!!!]{------------------------------------------
      //[Tree:검증식 보기창] 에 추가하는 [검증식 정보] 를 관리한다.
      //이 정보를 받아서 처리후 등록하게 된다.
      //이 정보는 [등록] 할때 [인수] 로 정보를 넘겨주는 용도로만 사용된다.
      //}------------------------------------------------------------------

      //[문자열 구조]{------------------------------------------------------------
      //
      //검증식...
      //값(2/10/16진수 표기)
      //함수이름 : ...
      //기반주소 : ...
      //자료유형 : ...
      //
      //의 5행 으로 된 문자열로써 각 행을 하나의 정해진 [항목] 으로 구분처리한다.
      //}-------------------------------------------------------------------------

      //실제 [검증식] 을 표기하는데 사용하는 기본 정보가 정리된 문자열(5행의 문자열).
      //[2011.07.17.일][수정!!!]
      //기본적으로 [검증식 문자열] 크기로 저장소를 할당해 준다.
      char   infoStr[Opt_DebugView_StrBufSize];      //(기본값 : NULL)

      //[검증식] 이 존재하는 {DB} 상의 [문서번호].
      int    fileListIndex; //(기본값 : -1)

      //[개념정확중요!!!]{------------------------------------------------------------------------
      //[검증식] 이 존재하는 [함수] 의 {DB} 상의 위치.
      //[2011.07.19.화][주의!!!][수정!!!]
      //이 정보는 실제 [검증식 계산] 에는 불필요하다.
      //[검증식 계산] 에는 현재 [검증중인 함수 정보] <debug.cpp:_debug_FuncRecIndex> 를 사용한다.
      int    funcRecIndex;  //(기본값 : -1)
      //}-----------------------------------------------------------------------------------------

      //해당 문서상 지정된 [검증식] 의 [시작/끝 위치].
      //실제 [선택영역] 으로 지정되므로 [선택영역] 의 [시작/끝] 위치와 같다.
      int    expStartIndex; //(기본값 : -1)
      int    expEndIndex;   //(기본값 : -1)

    };

    //[2011.07.12.화][완료!!!]
    void __fastcall DbgExpTreeInfo_Format(struct DBGEXP_TREE_INFO  *pInfo);

    //[처리함수]
    //{
        //[2011.07.17.일][완료!!!]
        bool __fastcall DbgExpTreeInfo_Make_AddInfo(struct DBGEXP_TREE_INFO  *pInfo);

        //[2012.09.22.토][완료!!!]
        bool __fastcall DbgExpTreeInfo_Make_AddInfo_Edit(struct DBGEXP_TREE_INFO  *pInfo);

        //[2012.04.21.토][완료!!!]
        //[2018.07.24.화][완료!!!]
        //[2021.11.28.일][완료]
        //[2022.01.13.목][완료]
        void __fastcall DbgExpTree_Set_Info(//처리할 검증식 항목위치(반드시 [항목:검증식] 이어야 함).
                                            int                pExpItemIndex,
                                            int                pFuncRecIndex,
                                            struct EXPRECORD  *pExpRecord,
                                            struct DBG_OPND   *pOpnd);

        //[2012.04.21.토][완료!!!]
        //실제 [Tree:검증식 보기창] 의 지정 [검증식] 을 계산하고 해당 정보를 수정하는 함수.
        bool __fastcall DbgExpTree_View(//처리할 검증식 항목위치(반드시 [항목:검증식] 이어야 함).
                                        int  pExpItemIndex);

        //[2011.07.20.수][완료!!!]
        bool __fastcall DbgExpTree_ViewAll(//[2011.07.20.수][추가!!!]
                                           //true : [검증식 정보창] 을 다시 그린다.
                                           bool  pTreeRePaint);
                                        
    //}

//}

//[검증식 관련 부가 함수]
//{




//}


#endif
