#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define SIZE_OF_DESCRIPTION 32

#define SIZE_OF_COMMAND 128

#define SIZE_OF_BUFFER 256





struct menuItem_t

{

char HotKey;

char Description[SIZE_OF_DESCRIPTION];

char Command[SIZE_OF_COMMAND];

} menuItem_t, *menuItem;



int main(int argc, char *argv[])

{

int charcode, i, cmdCount = 0;

FILE *CfgFile;

char Buffer[SIZE_OF_BUFFER];

if(argc < 2)

{

printf("Missing config file.\nUsage: %s config_file\nTry to read default config file\n", argv[0]);

// return 1;

}



CfgFile = fopen(argv[1], "rt"

if(CfgFile == NULL)

CfgFile = fopen("./menu.cfg", "rt"

if(CfgFile == NULL) return 1;

while (NULL != fgets(Buffer, SIZE_OF_BUFFER, CfgFile))

{

if(Buffer[0] != '#' && strlen(Buffer) > 10)

cmdCount++;

};

menuItem = calloc(cmdCount, sizeof(menuItem_t));

fseek(CfgFile, 0, SEEK_SET);

for (i = 0; i < cmdCount; )

{

int j = 0;

fgets(Buffer, 256, CfgFile);

for (j = 0; j < strlen(Buffer); j++)

if(Buffer[j] == 0x0D || Buffer[j] == 0x0A) Buffer[j] = 0x0;



if(Buffer[0] != '#' && strlen(Buffer) > 10)

{

int k = 0, stage = 0;

for (j = 0; j < strlen(Buffer); j++)

{

if(Buffer[j] == ',')

{

stage++;

switch (stage)

{

case 1:

{

k = j + 1;

menuItem.HotKey = Buffer[0];

break;

}

case 2:

{

memset(menuItem.Description, 0, SIZE_OF_DESCRIPTION);

memcpy(menuItem.Description, &Buffer[k], j - k);

k = j + 1;

memset(menuItem.Command, 0, SIZE_OF_COMMAND);

strcpy(menuItem.Command, &Buffer[k]);

break;

}

default: break;

}

}

}

i++;

}

}

fclose(CfgFile);

printf("Menu (Press ESC to quit)\nHotkey| Action\n"



for (i = 0; i < cmdCount; i++)

{

printf(" %c |%s\n", menuItem.HotKey, menuItem.Description);//, menuItem.Command);

// printf("%c+%s+%s\n", menuItem.HotKey, menuItem.Description, menuItem.Command);

}

do

{

int cmd_is_exec = 0;

// do{

charcode = getchar();

// }

// while (charcode == ERR);

// putchar(charcode);

for (i = 0; i < cmdCount; i++)

{

if(menuItem.HotKey == charcode)

{

printf("Execute command: %s\n", menuItem.Command);

cmd_is_exec = 1;

system(menuItem.Command);

}

}

// if(cmd_is_exec == 0 && charcode != 27)

// printf("Bad hotkey!\n"

}

while(charcode != 27);

free(menuItem);

return 0;

}