test_menu.c
来自「eCos操作系统源码」· C语言 代码 · 共 219 行
C
219 行
//=============================================================================//// test_menu.c - Cyclone Diagnostics////=============================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): Scott Coulter, Jeff Frazier, Eric Breeden// Contributors:// Date: 2001-01-25// Purpose: // Description: ////####DESCRIPTIONEND####////===========================================================================*//****************************************************************************** test_menu.c - Menu dispatching routine * * modification history* --------------------* 30aug00 ejb Ported to IQ80310 Cygmon*//*DESCRIPTION:A table-driven menu dispatcher*/#include "test_menu.h"#include "iq80310.h"#define QUIT -1#define MAX_INPUT_LINE_SIZE 80extern long decIn(void);/* * Internal routines */static int menuGetChoice (MENU_ITEM menuTable[], int numMenuItems, char *title, unsigned long options);static void printMenu (MENU_ITEM menuTable[], int numMenuItems, char *title);/***************************************************************************** menu - a table-driven menu dispatcher** RETURNS:** The menu item argument, or NULL if the item chosen is QUIT.*/MENU_ARG menu ( MENU_ITEM menuTable[], int numMenuItems, char *title, unsigned long options ){ int item; /* User's menu item choice */ /* * Get the user's first choice. Always display the menu the first time. */ item = menuGetChoice (menuTable, numMenuItems, title, MENU_OPT_NONE); if (item == QUIT) return (NULL); /* * If the user just wants a value returned, return the argument. If the * argument is null, return the item number itself. */ if (options & MENU_OPT_VALUE) { if (menuTable[item].arg == NULL) return ((void *)item); else return (menuTable[item].arg); } /* * Process menu items until the user selects QUIT */ while (TRUE) { /* * Call the action routine for the chosen item. If the argument is * NULL, pass the item number itself. */ if (menuTable[item].actionRoutine != NULL) { if (menuTable[item].arg == NULL) { printf("\n"); (*menuTable[item].actionRoutine) ((void *)item); } else { printf("\n"); (*menuTable[item].actionRoutine)(menuTable[item].arg); } } /* * Get the next choice, using any display options the user specified. */ item = menuGetChoice (menuTable, numMenuItems, title, options); if (item == QUIT) return (NULL); }}/***************************************************************************** menuGetChoice - Get the user's menu choice.** If display is not suppressed, display the menu, then prompt the user for* a choice. If the choice is out of range or invalid, display the menu and* prompt again. Continue to display and prompt until a valid choice is made.** RETURNS:* The item number of the user's menu choice. (-1 if they chose QUIT)*/static intmenuGetChoice (MENU_ITEM menuTable[], int numMenuItems, char *title, unsigned long options ){ int choice; /* * Suppress display of the menu the first time if we're asked */ if (!(options & MENU_OPT_SUPPRESS_DISP)) printMenu (menuTable, numMenuItems, title); /* * Prompt for a selection. Redisplay the menu and prompt again * if there's an error in the selection. */ choice = -1; while (choice < 0 || choice > numMenuItems) { printf ("\nEnter the menu item number (0 to quit): "); choice = decIn (); if (choice < 0 || choice > numMenuItems) printMenu (menuTable, numMenuItems, title); } if (choice == 0) return (QUIT); return (choice - 1);}/***************************************************************************** printMenu - Print the menu***/static voidprintMenu (MENU_ITEM menuTable[], int numMenuItems, char *title ){ int i; printf("\n%s\n\n", title); for (i = 0; i < numMenuItems; i++) printf ("%2d - %s\n", i+1, menuTable[i].itemName); printf(" 0 - quit");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?