1
0
Fork 0
forked from len0rd/rockbox

FS#7003 - Allow forward references of menus in tagnavi.config.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13685 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2007-06-22 12:48:06 +00:00
parent aa202027c2
commit 6ecb06f97a
2 changed files with 39 additions and 11 deletions

View file

@ -69,6 +69,7 @@ enum variables {
static long *uniqbuf; static long *uniqbuf;
#define MAX_TAGS 5 #define MAX_TAGS 5
#define MAX_MENU_ID_SIZE 32
static struct tagcache_search tcs, tcs2; static struct tagcache_search tcs, tcs2;
static bool sort_inverse; static bool sort_inverse;
@ -122,9 +123,8 @@ struct menu_entry {
struct root_menu { struct root_menu {
char title[64]; char title[64];
char id[32]; char id[MAX_MENU_ID_SIZE];
int itemcount; int itemcount;
struct root_menu *parent;
struct menu_entry *items[TAGMENU_MAX_ITEMS]; struct menu_entry *items[TAGMENU_MAX_ITEMS];
}; };
@ -517,6 +517,7 @@ static bool parse_search(struct menu_entry *entry, const char *str)
struct search_instruction *inst = entry->si; struct search_instruction *inst = entry->si;
char buf[MAX_PATH]; char buf[MAX_PATH];
int i; int i;
struct root_menu *new_menu;
strp = str; strp = str;
@ -542,12 +543,25 @@ static bool parse_search(struct menu_entry *entry, const char *str)
if (!strcasecmp(menus[i]->id, buf)) if (!strcasecmp(menus[i]->id, buf))
{ {
entry->link = i; entry->link = i;
menus[i]->parent = menu;
return true; return true;
} }
} }
return false; if (menu_count >= TAGMENU_MAX_MENUS)
{
logf("max menucount reached");
return false;
}
/* Allocate a new menu unless link is found. */
menus[menu_count] = buffer_alloc(sizeof(struct root_menu));
new_menu = menus[menu_count];
memset(new_menu, 0, sizeof(struct root_menu));
strncpy(new_menu->id, buf, MAX_MENU_ID_SIZE-1);
entry->link = menu_count;
++menu_count;
return true;
} }
if (entry->type != menu_next) if (entry->type != menu_next)
@ -738,7 +752,6 @@ static int parse_line(int n, const char *buf, void *parameters)
if (read_menu) if (read_menu)
{ {
/* End the menu */ /* End the menu */
menu_count++;
read_menu = false; read_menu = false;
} }
return 0; return 0;
@ -779,21 +792,36 @@ static int parse_line(int n, const char *buf, void *parameters)
return 0; return 0;
} }
menus[menu_count] = buffer_alloc(sizeof(struct root_menu)); if (get_token_str(data, sizeof data) < 0)
menu = menus[menu_count];
memset(menu, 0, sizeof(struct root_menu));
if (get_token_str(menu->id, sizeof(menu->id)) < 0)
{ {
logf("%%menu_start id empty"); logf("%%menu_start id empty");
return 0; return 0;
} }
menu = NULL;
for (i = 0; i < menu_count; i++)
{
if (!strcasecmp(menus[i]->id, data))
{
menu = menus[i];
}
}
if (menu == NULL)
{
menus[menu_count] = buffer_alloc(sizeof(struct root_menu));
menu = menus[menu_count];
++menu_count;
memset(menu, 0, sizeof(struct root_menu));
strncpy(menu->id, data, MAX_MENU_ID_SIZE-1);
}
if (get_token_str(menu->title, sizeof(menu->title)) < 0) if (get_token_str(menu->title, sizeof(menu->title)) < 0)
{ {
logf("%%menu_start title empty"); logf("%%menu_start title empty");
return 0; return 0;
} }
logf("menu: %s", menu->title); logf("menu: %s", menu->title);
menu->itemcount = 0;
read_menu = true; read_menu = true;
break; break;

View file

@ -25,7 +25,7 @@
#define TAGNAVI_VERSION "#! rockbox/tagbrowser/2.0" #define TAGNAVI_VERSION "#! rockbox/tagbrowser/2.0"
#define TAGMENU_MAX_ITEMS 64 #define TAGMENU_MAX_ITEMS 64
#define TAGMENU_MAX_MENUS 16 #define TAGMENU_MAX_MENUS 32
#define TAGMENU_MAX_FMTS 32 #define TAGMENU_MAX_FMTS 32
enum table { root = 1, navibrowse, allsubentries, playtrack }; enum table { root = 1, navibrowse, allsubentries, playtrack };