📄 get_menu.c
字号:
iProcOrd = GetProcOrd(pMenuItem[j].sProcName);
if (iProcOrd < 0) {
fprintf(pfErrorFile, "第%d行对应的函数(%s)不存在, 此行忽略。\n",
pMenuItem[j].iLine, pMenuItem[j].sProcName);
cWarnFlag = 1;
continue;
}
}
if (pMenuItem[j].cProcType == 'E'
&& pMenuItem[j].sProcName[0] != '\0') {
iProcOrd = GetProcOrd(pMenuItem[j].sProcName);
if (iProcOrd < 0) {
fprintf(pfErrorFile, "第%d行对应的函数(%s)不存在, 此行忽略。\n",
pMenuItem[j].iLine, pMenuItem[j].sProcName);
cWarnFlag = 1;
continue;
}
}
if (pMenuItem[j].cProcType == 'M') {
/*
* 在SMenu[]中查找sMenuId, 若不存在,则报错
*/
iMenuOrd = GetMenuOrd(pMenuItem[j].sMenuId);
if (iMenuOrd < 0) {
fprintf(pfErrorFile, "第%d行%s对应的菜单项在SMenu[]中不存在, 此行忽略。\n",
pMenuItem[j].iLine, pMenuItem[j].sMenuId);
cWarnFlag = 1;
continue;
}
if (pMenuItem[j].sProcName[0] != '\0') {
iProcOrd = GetProcOrd(pMenuItem[j].sProcName);
if (iProcOrd < 0) {
fprintf(pfErrorFile, "第%d行对应的函数(%s)不存在, 此行忽略。\n",
pMenuItem[j].iLine, pMenuItem[j].sProcName);
cWarnFlag = 1;
continue;
}
}
}
if (pMenuItem[j].cProcType == 'X') {
if (pMenuItem[j].sShell[0] == '\0') {
fprintf(pfErrorFile, "第%d行对应的Shell串不可为空, 此行忽略。\n",
pMenuItem[j].iLine);
cWarnFlag = 1;
continue;
}
}
/*
* 在SMenuItem[]中查找sMenuId
*/
for (k = 0; k < iMenuItemCount; k++) {
if (!strcmp(pMenuItem[j].sItemId, SMenuItem[k].sItemId))
break;
}
if (k < iMenuItemCount
&& SMenuItem[k].cReplace != 1
&& strcmp(G_oper_no, "00") != 0) {
fprintf(pfErrorFile, "第%d行对应的选择项(%s)不允许更改, 此行忽略。\n",
pMenuItem[j].iLine, pMenuItem[j].sItemId);
cWarnFlag = 1;
continue;
}
if (k == iMenuItemCount) {
/*
* 若找不到则在后面新添一项
*/
strcpy(SMenuItem[k].sItemId, pMenuItem[j].sItemId);
SMenuItem[k].cReplace = 1; /* 新增项允许更改 */
strcpy(SMenuItem[k].sName, pMenuItem[j].sItemName);
iMenuItemCount ++;
if (iMenuItemCount >= MAX_MENU_ITEMS) {
fprintf(pfErrorFile, "第%d行对应的选择项(%s)不可再新增, 此行忽略。\n",
pMenuItem[j].iLine, pMenuItem[j].sItemId);
cWarnFlag = 1;
continue;
}
/*
* 置I_END以防后用
*/
SMenuItem[iMenuItemCount].sName[0] = '\0';
strcpy(SMenuItem[iMenuItemCount].sItemId, "I_END");
SMenuItem[iMenuItemCount].iChildMenu = 99;
}
SMenuItem[k].cProcType = pMenuItem[j].cProcType;
if (iProcOrd >= 0)
SMenuItem[k].mproc = proctab[iProcOrd].p_proc;
SMenuItem[k].iChildMenu = iMenuOrd;
strcpy(SMenuItem[k].sShell, pMenuItem[j].sShell);
strcpy(SMenuItem[k].sParam, pMenuItem[j].sParam);
strcpy(SMenuItem[k].sHelpId, pMenuItem[j].sHelpID);
}
free(pMenuItem);
getdatef(sDate, "-");
gettimef(sTime, ":");
if (cWarnFlag == 0)
fprintf(pfErrorFile, "\nOK!\n");
fprintf(pfErrorFile, "\n%s %s ****Finish 附加菜单项文件(%s)分析\n\n", sDate, sTime, MENU_add);
fclose(pfErrorFile);
if (cWarnFlag == 1)
return(-2);
else
return(0);
}
/*
* 根据选择项标识查找选择项序号
*/
GetItemOrd(pcItemId)
char *pcItemId;
{
int i;
for (i = 0; i < iMenuItemCount; i++) {
if (!strcmp(SMenuItem[i].sItemId, pcItemId))
return(i);
}
return(-1);
}
/*
* 根据菜单标识查找菜单序号
*/
GetMenuOrd(pMenuId)
char *pMenuId;
{
int i;
for (i = 0; i < iMenuCount; i++) {
if (!strcmp(SMenu[i].sMenuId, pMenuId))
return(i);
}
return(-1);
}
#define LINE_FIRST 0
#define LINE_MENU 1
#define LINE_ITEM 3
#define LINE_NOTE 4
#define LINE_SHELL 5
/*
* 获取实际使用的菜单结构
*/
int GetActiveMenu(pfMenuFile)
FILE *pfMenuFile;
{
int c, i, j, iItemHead;
char name[WIDTH1+1];
char sMenuId[10], sItemId[10];
char sTmpStr[1024];
char *pcIdOff = NULL;
char cFirstChar;
int iLine = 0;
int iMenuNo = -1;
int iItemNo = -1;
char cItemOrd = 0;
char cLastFlag = LINE_FIRST;
char cErrorFlag = 0, cWarnFlag = 0;
char sDate[12], sTime[12];
FILE *pfErrorFile;
getdatef(sDate, "-");
gettimef(sTime, ":");
pfErrorFile = fopen("/tmp/Menu.match.error", "a+");
if (pfErrorFile == NULL)
pfErrorFile = stderr;
fprintf(pfErrorFile, "\n%s %s ****Start 运行菜单定义文件(%s)分析\n\n", sDate, sTime, MENU_f);
rewind(pfMenuFile);
while (!feof(pfMenuFile)) {
if (fgets(sTmpStr, 1024, pfMenuFile) == NULL) {
break;
}
iLine++;
del_NL_CR(sTmpStr);
del_all_space(sTmpStr);
cFirstChar = sTmpStr[0];
strcpy(sTmpStr, &sTmpStr[1]);
switch (cFirstChar) {
case '&':
if (cLastFlag != LINE_FIRST) {
if (cLastFlag == LINE_MENU)
fprintf(pfErrorFile, "\t行%d:菜单中未定义选择项!\n", iLine-1);
else if (cLastFlag == LINE_ITEM)
fprintf(pfErrorFile, "\t行%d:未定义选择项说明!\n", iLine-1);
else if (cLastFlag == LINE_NOTE || cLastFlag == LINE_SHELL)
fprintf(pfErrorFile, "\t行%d前面:未有'$'标识行!\n", iLine);
cErrorFlag ++;
}
if (iMenuNo >= 0)
SMenu[iMenuNo].iMenuItemSet[cItemOrd] = -1;
iMenuNo = -1;
iItemNo = -1;
cItemOrd = 0;
cLastFlag = LINE_MENU;
pcIdOff = (char *)strstr(sTmpStr, "M_"); /* 取菜单标识 */
if (pcIdOff != NULL) {
strncpy(sMenuId, pcIdOff, 9);
sMenuId[9] = '\0';
} else {
fprintf(pfErrorFile, "\t行%d: 无菜单标识号!\n", iLine);
cErrorFlag ++;
iMenuNo = -1;
break;
}
if ((iMenuNo = GetMenuOrd(sMenuId)) < 0) {
fprintf(pfErrorFile, "\t行%d: 菜单标识号\"%s\"有误!\n", iLine, sMenuId);
cErrorFlag ++;
iMenuNo = -1;
break;
}
break;
case '%':
if (cLastFlag == LINE_FIRST) {
fprintf(pfErrorFile, "\t行%d前面:未定义菜单!\n", iLine);
cErrorFlag ++;
cLastFlag = LINE_ITEM;
break;
} else if (cLastFlag == LINE_ITEM) {
fprintf(pfErrorFile, "\t行%d前面:未定义选择项说明!\n", iLine);
cWarnFlag ++;
}
cLastFlag = LINE_ITEM;
pcIdOff = (char *)strstr(sTmpStr, "I_"); /* 取选择项标识 */
if (pcIdOff != NULL) {
strncpy(sItemId, pcIdOff, 9);
sItemId[9] = '\0';
} else {
fprintf(pfErrorFile, "\t行%d: 无选择项标识号!\n", iLine);
/* 将此项忽略,不算致命错误 */
cWarnFlag ++;
iItemNo = -1;
break;
}
if ((iItemNo = GetItemOrd(sItemId)) < 0) {
fprintf(pfErrorFile, "\t行%d: 选择项标识号%s有误!\n", iLine, sMenuId);
/* 将此项忽略,不算致命错误 */
cWarnFlag ++;
iItemNo = -1;
break;
} else {
if (iMenuNo >= 0) {
SMenu[iMenuNo].iMenuItemSet[cItemOrd] = iItemNo;
SMenuItem[iItemNo].iPower = 1;
cItemOrd ++;
} else {
/* 由于菜单非法,故其下的选择项也非法 */
iItemNo = -1;
}
}
break;
case '#':
if (cLastFlag == LINE_MENU || cLastFlag == LINE_FIRST) {
fprintf(pfErrorFile, "\t行%d前面:未定义选择项! (忽略)\n", iLine);
cWarnFlag ++;
break;
} else if (cLastFlag == LINE_NOTE) {
fprintf(pfErrorFile, "\t行%d:选择项说明多行定义! (忽略)\n", iLine);
cWarnFlag ++;
break;
} else if (cLastFlag == LINE_SHELL) {
fprintf(pfErrorFile, "\t行%d:注释行不应出现在Shell命令行之后! (忽略)\n", iLine);
cWarnFlag ++;
break;
}
cLastFlag = LINE_NOTE;
if (iItemNo >= 0)
strcpy(SMenuItem[iItemNo].sText, sTmpStr);
break;
case '!':
if (cLastFlag == LINE_NOTE) {
cLastFlag = LINE_SHELL;
if (iItemNo >= 0) {
SMenuItem[iItemNo].cProcType = 'X';
strcpy(SMenuItem[iItemNo].sShell, sTmpStr);
}
break;
}
fprintf(pfErrorFile, "\t行%d:此处不应出现Shell程序定义! (忽略)\n", iLine);
break;
case '$':
if (cLastFlag == LINE_ITEM) {
fprintf(pfErrorFile, "\t行%d前面:选择项无说明!\n", iLine);
cWarnFlag ++;
} else if (cLastFlag == LINE_MENU) {
fprintf(pfErrorFile, "\t行%d前面:菜单无选择项定义!\n", iLine);
cErrorFlag ++;
}
if (iMenuNo >= 0)
SMenu[iMenuNo].iMenuItemSet[cItemOrd] = -1;
iMenuNo = -1;
iItemNo = -1;
cItemOrd = 0;
cLastFlag = LINE_FIRST;
break;
default:
break;
}
}
if (cErrorFlag)
fprintf(pfErrorFile, "\n ********* 有错误!! *******\n");
else if (cWarnFlag)
fprintf(pfErrorFile, "\n ********* 有警告!! *******\n");
else
fprintf(pfErrorFile, "\n ********* OK !! *******\n");
getdatef(sDate, "-");
gettimef(sTime, ":");
fprintf(pfErrorFile, "\n%s %s ****Finish 运行菜单结构定义文件(%s)分析\n\n", sDate, sTime, MENU_f);
fclose(pfErrorFile);
if (cErrorFlag)
return(-1);
else if (cWarnFlag)
return(-2);
return(0);
}
/*
* 功能: 初始化菜单项信息
* 入口: 菜单号, 菜单信息文件句柄
* 出口: 菜单选择项名
* 选择项说明
* 选择项首字母
* 选择项的帮助文件索引
* 当前选择项所在行的首尾项号
*/
int GetItemInfo(iMenuNo, pfMenuFile)
int iMenuNo;
FILE *pfMenuFile;
{
int c, i, j, iItemHead;
char sItemName[WIDTH1+1];
char sMenuId[10], sItemId[10];
char sTmpStr[1024];
char *pcIdOff = NULL;
char cFirstChar;
int iItemNo = -1;
char cItemOrd = 0;
char cMenuFlag = 0;
char cLastFlag = LINE_FIRST;
char cErrorFlag = 0, cWarnFlag = 0;
char sDate[12], sTime[12];
rewind(pfMenuFile);
while (!feof(pfMenuFile)) {
if (fgets(sTmpStr, 1024, pfMenuFile) == NULL) {
break;
}
del_NL_CR(sTmpStr);
del_all_space(sTmpStr);
cFirstChar = sTmpStr[0];
strcpy(sTmpStr, &sTmpStr[1]);
switch (cFirstChar) {
case '&':
if (cMenuFlag == 1) {
SMenu[iMenuNo].iMenuItemSet[cItemOrd] = -1;
return(0);
}
pcIdOff = (char *)strstr(sTmpStr, "M_"); /* 取菜单标识 */
if (pcIdOff != NULL) {
strncpy(sMenuId, pcIdOff, 9);
sMenuId[9] = '\0';
} else {
break;
}
if (!strcmp(SMenu[iMenuNo].sMenuId, sMenuId)) {
cMenuFlag = 1; /* 找到菜单定义 */
cItemOrd = 0;
cLastFlag = LINE_MENU;
break;
}
break;
case '%':
if (cMenuFlag == 0)
break;
cLastFlag = LINE_ITEM;
iItemNo = -1;
pcIdOff = (char *)strstr(sTmpStr, "I_"); /* 取选择项标识 */
if (pcIdOff != NULL) {
strncpy(sItemId, pcIdOff, 9);
sItemId[9] = '\0';
*pcIdOff = '\0';
strcpy(sItemName, sTmpStr);
} else {
break;
}
if ((iItemNo = GetItemOrd(sItemId)) < 0) {
break;
} else {
SMenu[iMenuNo].iMenuItemSet[cItemOrd] = iItemNo;
strcpy(SMenuItem[iItemNo].sName, sItemName);
if (isalpha(sItemName[0]) || isdigit(sItemName[0]))
SMenuItem[iItemNo].cFirstChar = sItemName[0];
cItemOrd ++;
}
break;
case '#':
if (cMenuFlag == 0)
break;
if (iItemNo == -1)
break;
cLastFlag = LINE_NOTE;
if (cLastFlag != LINE_ITEM) {
break;
}
strcpy(SMenuItem[iItemNo].sText, sTmpStr);
break;
case '!':
if (cMenuFlag == 0)
break;
if (iItemNo == -1)
break;
if (cLastFlag != LINE_NOTE) {
break;
}
cLastFlag = LINE_SHELL;
SMenuItem[iItemNo].cProcType = 'X';
strcpy(SMenuItem[iItemNo].sShell, sTmpStr);
break;
case '$':
if (cMenuFlag == 1) {
SMenu[iMenuNo].iMenuItemSet[cItemOrd] = -1;
return(0);
}
cLastFlag = LINE_FIRST;
break;
default:
break;
}
}
if (cMenuFlag == 0) {
return(-1);
}
return(-2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -