Skip to content

Instantly share code, notes, and snippets.

@itrobotics
Last active June 7, 2018 16:34
Show Gist options
  • Select an option

  • Save itrobotics/138c81ad2d0bb1adfb42 to your computer and use it in GitHub Desktop.

Select an option

Save itrobotics/138c81ad2d0bb1adfb42 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#define MAX_TITLE 32
#define MAX_SUBMENUS 16
typedef struct _menu menu;
struct _menu {
char title[MAX_TITLE];
void (*command)(int data);
int data;
short num_submenus;
struct _menu *submenu[10];
};
void negative_menu(menu *m,int level);
void do_command (int data);
menu sub1 = { "Submenu 1", do_command,1,0,0};
menu sub3 = { "Submenu 3", NULL,3,0,0};
menu sub2_1 = { "Submenu 2-1", do_command,21,0,0};
menu sub2_2 = { "Submenu 2-2", do_command,22,0,0};
menu sub2 = { "Submenu 2", do_command,2,2,{&sub2_1,&sub2_2}};
menu main_menu = { "Main Menu", NULL,0,3,{ &sub1, &sub2, &sub3} };
int main()
{
int level=0;
negative_menu(&main_menu,level);
// display_menu(main_menu.submenu[1]);
/*
main_menu.submenu[1]->command(main_menu.submenu[0]->data);
main_menu.submenu[1]->command(main_menu.submenu[1]->data);
*/
getchar();
return 0;
}
void do_command (int data)
{
printf("%s:%d\n",__func__,data);
}
void negative_menu(menu *m,int level)
{
int i;
// display_menu(&main_menu);
if (m!=NULL)
printf("\n%s: submenu=%d\n",m->title,m->num_submenus);
for (i=0;i<MAX_SUBMENUS;i++)
if (m->submenu[i]!=NULL && i<m->num_submenus) {
printf("%*s %s\n",level," ",m->submenu[i]->title);
if (m->submenu[i]->submenu[0])
negative_menu(m->submenu[i],level+4);
}
return ;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment