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

📄 get_menu.c

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -