📄 output.c
字号:
//////////////////////////////////////////
// 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 + -