⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 output.c

📁 关于rcp2c_v3.rar协议在LINUX下的实现程序
💻 C
📖 第 1 页 / 共 4 页
字号:
//////////////////////////////////////////
//       Written by LiBing   2001/09/19 //
//////////////////////////////////////////

//########################################
// Include files
//########################################
#include <sys/timeb.h>
#include <stdarg.h>

#include "public.h"
//########################################
// Macro define
//########################################

//########################################
// Type define
//########################################

//########################################
// Globals variable
//########################################
const FORMOBJINFO gv_FormObjInfo[] =
{
  { // frmFieldObj:
    "frmFieldObj",
    "FieldType",
    OutputObj_Field,
  },
  { // frmControlObj:
    "frmControlObj",
    "ControlType",
    OutputObj_Control,
  },
  { // frmListObj:
    "frmListObj",
    "ListType",
    OutputObj_List,
  },
  { // frmTableObj:
    "frmTableObj",
    "TableType",
    OutputObj_Table,
  },
  { // frmBitmapObj:
    "frmBitmapObj",
    "FormBitmapType",
    OutputObj_Bitmap,
  },
  { // frmLineObj:
    "frmLineObj",
    "FormLineType",
    OutputObj_Line,
  },
  { // frmFrameObj:
    "frmFrameObj",
    "FormFrameType",
    OutputObj_Frame,
  },
  { // frmRectangleObj:
    "frmRectangleObj",
    "FormRectangleType",
    OutputObj_Rectangle,
  },
  { // frmLabelObj:
    "frmLabelObj",
    "FormLabelType",
    OutputObj_Label,
  },
  { // frmTitleObj:
    "frmTitleObj",
    "FormTitleType",
    OutputObj_Title,
  },
  { // frmPopupObj:
    "frmPopupObj",
    "FormPopupType",
    OutputObj_Popup,
  },
  { // frmGraffitiStateObj:
    "frmGraffitiStateObj",
    "FrmGraffitiStateType",
    OutputObj_GraffitiState,
  },
  { // frmGadgetObj:
    "frmGadgetObj",
    "FormGadgetType",
    OutputObj_Gadget,
  },
  { // frmScrollbarObj:
    "frmScrollBarObj",
    "ScrollBarType",
    OutputObj_ScrollBar,
  },
  { // frmSliderObj:
    "frmSliderObj",
    "SliderControlType",
    OutputObj_Slider,
  },
  { // frmGraphicalControlObj:
    "frmControlObj",
    "GraphicControlType",
    OutputObj_Control,
  },
  { // ERROR
    "Error: Unknown form object ID type !",
    "Error: Unknown form object ID type !",
    NULL,
  },
};

int gv_FormCount = 0;
char gv_IDPrefix[IDPREFIX_LEN+1];

char szFormName[1024];

char szDefineInfoBuf[2048];

#define MAX_OBJECT 1024
char *pFormDefineInfo[MAX_OBJECT];
int nFormDefineInfoCount=0;

char *pMenuDefineInfo[MAX_OBJECT];
int nMenuDefineInfoCount=0;

char *pAlertDefineInfo[MAX_OBJECT];
int nAlertDefineInfoCount=0;

char *pBitmapDefineInfo[MAX_OBJECT];
int nBitmapDefineInfoCount=0;

//########################################
// Private Globals variable
//########################################
static char gv_OutFileName_H[_MAX_FNAME];
static FILE *gv_pfOutput_C, *gv_pfOutput_H, *gv_pfOutput_DEF;

static int gv_StartColumn = TAB_SIZE;

//########################################
// Private Function declare
//########################################
static void InitOutputFile_C(void);
static void BeginOutputFile_C(FRM *pFrm);
static void EndOutputFile_C(void);

static void InitOutputFile_H(void);
static void BeginOutputFile_H(FRM *pFrm);
static void EndOutputFile_H(FRM *pFrm);

static void InitOutputFile_DEF(void);

static void WriteResourceDefine2CFile(void);


//########################################
// Function implement
//########################################
void OpenCFile(char *pInputFilePath, char *pOutputFilePath)
{ char OutFilePath[_MAX_PATH];
  char OutFileDir[_MAX_DIR];
  char OutFileName[_MAX_FNAME];
  char *pInputFileName, *pInputFileNameExt;

  // Set output file: dir & name
  strcpy(OutFileDir, pOutputFilePath);
  _strlwr(OutFileDir);
  if (!stricmp(".", OutFileDir) || OutFileDir[strlen(OutFileDir) -1] != '\\')
  {
    strcat(OutFileDir, "\\");
  }
  pInputFileName = strrchr(pInputFilePath, '\\');
  if (!pInputFileName)
    strcpy(OutFileName, pInputFilePath);
  else
    strcpy(OutFileName, ++pInputFileName);
  _strlwr(OutFileName);
  
  ///////////////////////
  pInputFileNameExt = strchr(OutFileName, '.');
  if (!pInputFileNameExt)
    pInputFileNameExt = OutFileName;
  if (pInputFileNameExt - OutFileName < IDPREFIX_LEN)
  { struct _timeb timebuffer;
    char TimeBuf[IDPREFIX_LEN +1];

    strncpy(gv_IDPrefix, OutFileName, pInputFileNameExt - OutFileName);
    _strupr(gv_IDPrefix);
    _strlwr(gv_IDPrefix +1);

    _ftime(&timebuffer);
    sprintf(TimeBuf, "%3d", timebuffer.millitm);
    strncat(gv_IDPrefix + (pInputFileNameExt - OutFileName), TimeBuf, IDPREFIX_LEN - (pInputFileNameExt - OutFileName));
  }
  else
  {
    strncpy(gv_IDPrefix, OutFileName, IDPREFIX_LEN);
    _strupr(gv_IDPrefix);
    _strlwr(gv_IDPrefix +1);
  }
  
  ///////////////////////
  // H File name
  strcpy(gv_OutFileName_H, OutFileName);
  pInputFileNameExt = strrchr(gv_OutFileName_H, '.');
  strcpy(pInputFileNameExt, "_h.h");
  // H File full path
  strcpy(OutFilePath, OutFileDir);
  strcat(OutFilePath, gv_OutFileName_H);
  // Open H file
  gv_pfOutput_H = fopen(OutFilePath, "wt");
  if (!gv_pfOutput_H)
    Error("Error: Create output H file !");
  printf("\nOutput %s\n", OutFilePath);
  ///////////////////////
  // C File name
  pInputFileNameExt = strrchr(OutFileName, '.');
  if (!pInputFileNameExt)
    strcat(OutFileName, "_c.h");//strcat(OutFileName, ".c");
  else
    strcpy(pInputFileNameExt, "_c.h");//strcpy(pInputFileNameExt, ".c");
  // C File full path
  strcpy(OutFilePath, OutFileDir);
  strcat(OutFilePath, OutFileName);
  // Open C file
  gv_pfOutput_C = fopen(OutFilePath, "wt");
  if (!gv_pfOutput_C)
    Error("Error: Create output C file !");
  printf("Output %s\n", OutFilePath);
  ///////////////////////
  // DEF File name
  strcpy(OutFileName, gv_OutFileName_H);
  pInputFileNameExt = strrchr(OutFileName, '.');
  pInputFileNameExt-=2;
  strcpy(pInputFileNameExt, "_def.h");//strcpy(pInputFileNameExt, ".def");
  // DEF File full path
  strcpy(OutFilePath, OutFileDir);
  strcat(OutFilePath, OutFileName);
  // Open DEF file
  gv_pfOutput_DEF = fopen(OutFilePath, "wt");
  if (!gv_pfOutput_DEF)
    Error("Error: Create output DEF file !");
  printf("Output %s\n", OutFilePath);
  ///////////////////////
  InitOutputFile_C();
  InitOutputFile_H();
  InitOutputFile_DEF();
}

void CloseCFile(void)
{
  if (gv_pfOutput_C)
  {
    WriteResourceDefine2CFile();
    fclose(gv_pfOutput_C);
    gv_pfOutput_C = NULL;
  }
  if (gv_pfOutput_H)
  {
    fprintf(gv_pfOutput_H, "\n#endif\n");

    fclose(gv_pfOutput_H);
    gv_pfOutput_H = NULL;
  }
  if (gv_pfOutput_DEF)
  {
    fprintf(gv_pfOutput_DEF, "\n#endif\n");

    fclose(gv_pfOutput_DEF);
    gv_pfOutput_DEF = NULL;
  }
}

void DumpFormToCFile(FRM *pFrm)
{ 
  char szIdName[1024];
  char lpBuf[1024];
  OBJINFO ObjInfo;
  unsigned int ObjCount, MaxListItemLen;
  int i;
  RCFORMOBJLIST *pObjList;
  char *pObjText;
  char *pTemp;
  RCFieldType Field;

  BeginOutputFile_C(pFrm);
  BeginOutputFile_H(pFrm);
  
  ObjInfo.pFrm = pFrm;
  ObjCount = PBAFIELD(pFrm, form.numObjects);
  for (ObjInfo.ObjNum = 0; ObjInfo.ObjNum < ObjCount; ObjInfo.ObjNum++)
  {    
    pObjText = NULL;
    // Output Objs
    pObjList = PlexGetElementAt(&PBAFIELD16(pFrm, pllt), ObjInfo.ObjNum);
    ObjInfo.ObjType = PBAFIELD(pObjList, objectType);
    ObjInfo.pObj = (vfLE32? &PBAFIELD32(pObjList, u.object) : &PBAFIELD16(pObjList, u.object));
    GetElementIdName(pObjList,szIdName);
    ObjInfo.szIdName=strdup(szIdName);
    pTemp=strstr(szIdName,"\1");
    if(pTemp)
        *pTemp='_';    //由于PopupType在szIdName里面使用了'\1'字符作为名字间的分隔,写入变量定义前需要还原
    switch(ObjInfo.ObjType)
    {
      case frmFieldObj:
            pObjText = PBAFIELD(ObjInfo.pObj->field, text);
            if (!pObjText)
              pObjText = "";
            break;
      case frmControlObj:
            pObjText = PBAFIELD(ObjInfo.pObj->control, u.text);
            break;
      case frmListObj:
            pObjText = PBAFIELD(ObjInfo.pObj->list, itemsText);
            break;
      case frmTableObj:
            // Get table text
            if (vfLE32)
            {
              Field.s32 = PBAFIELD32(ObjInfo.pObj->table, currentField);
              pObjText = BAFIELD32(Field, text);
            }
            else
            {
              Field.s16 = PBAFIELD16(ObjInfo.pObj->table, currentField);
              pObjText = BAFIELD16(Field, text);
            }
            if (!pObjText)
              pObjText = "";
            break;
      case frmLabelObj:
            pObjText = PBAFIELD(ObjInfo.pObj->label, text);
            break;
      case frmTitleObj:
            pObjText = ObjInfo.pObj->title->text;
            break;
      case frmGraphicalControlObj:
            pObjText = "";
            break;
    }
    if (!gv_FormObjInfo[ObjInfo.ObjType].pfnObjOutput)
    {
      sprintf(lpBuf,"Error: %s: Unknown Obj output function !",szIdName);
      Error(lpBuf);
      return;
    }
    // Write C file --- OBJ
    fprintf(gv_pfOutput_C, "\n");
    WriteSpace(gv_pfOutput_C, gv_StartColumn);
    fprintf(gv_pfOutput_C, "{ // %s %s\n",
           gv_FormObjInfo[ObjInfo.ObjType].pObjTypeName, szIdName
           );
    gv_StartColumn += TAB_SIZE;

    gv_FormObjInfo[ObjInfo.ObjType].pfnObjOutput(&ObjInfo, gv_pfOutput_C, gv_StartColumn);
      
    gv_StartColumn -= TAB_SIZE;
    WriteSpace(gv_pfOutput_C, gv_StartColumn);
    fprintf(gv_pfOutput_C, "},\n");
    // Write C file --- OBJ_TEXT
    if (pObjText)
    {
      if (ObjInfo.ObjType != frmListObj)
      {
        WriteSpace(gv_pfOutput_C, gv_StartColumn);
        fprintf(gv_pfOutput_C, "// Char %s_str[%d+1]\n", szIdName, strlen(pObjText));
        WriteSpace(gv_pfOutput_C, gv_StartColumn);
        fprintf(gv_pfOutput_C, "\"%s\",\n", pObjText);
      }
      else
      {
        WriteSpace(gv_pfOutput_C, gv_StartColumn);
        fprintf(gv_pfOutput_C, "{ // Char %s_str_array[%d][]\n",szIdName,PBAFIELD(ObjInfo.pObj->list, numItems));
        gv_StartColumn += TAB_SIZE;

        MaxListItemLen = 0;
        if (pObjText && *pObjText)
        { // Write List item array
          for (i = PBAFIELD(ObjInfo.pObj->list, numItems); i; i--)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -