From 7b175238d4a667c8ab9eb04aed18ddc56ebede95 Mon Sep 17 00:00:00 2001 From: "simon.kagstrom" Date: Thu, 19 Nov 2009 20:18:45 +0000 Subject: [PATCH] Utils --- menu.cpp | 124 +++++++++---------------------------------------------- menu.hh | 1 + utils.hh | 35 ++++++++++++++++ 3 files changed, 56 insertions(+), 104 deletions(-) diff --git a/menu.cpp b/menu.cpp index 7a38709..126b5f3 100644 --- a/menu.cpp +++ b/menu.cpp @@ -213,40 +213,6 @@ static void menu_draw(SDL_Surface *screen, menu_t *p_menu, int sel) } } -static int get_next_seq_y(menu_t *p_menu, int v, int dy) -{ - if (v + dy < 0) - return p_menu->n_entries - 1; - if (v + dy > p_menu->n_entries - 1) - return 0; - return v + dy; -} - -static void select_next(menu_t *p_menu, int dx, int dy) -{ - int next; - char buffer[256]; - - p_menu->cur_sel = get_next_seq_y(p_menu, p_menu->cur_sel, dy); - next = get_next_seq_y(p_menu, p_menu->cur_sel, dy + 1); - - if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' || - p_menu->pp_msgs[p_menu->cur_sel][0] == '#' || - IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]) ) - select_next(p_menu, dx, dy); - - /* If the next is a submenu */ - if (dx != 0 && IS_SUBMENU(p_menu->pp_msgs[next])) - { - submenu_t *p_submenu = find_submenu(p_menu, next); - - p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 : - (p_submenu->sel + dx) % p_submenu->n_entries; - } - else if (dx == -1 && !strcmp(p_menu->pp_msgs[0], "[..]")) - p_menu->cur_sel = 0; -} - static void select_one(menu_t *p_menu, int sel) { if (sel >= p_menu->n_entries) @@ -267,66 +233,6 @@ static int is_submenu_title(menu_t *p_menu, int n) } -uint32_t menu_wait_key_press(void) -{ - SDL_Event ev; - uint32_t keys = 0; - - while (1) - { - if (SDL_PollEvent(&ev)) - { - switch(ev.type) - { - case SDL_KEYDOWN: - switch (ev.key.keysym.sym) - { - case SDLK_UP: - keys |= KEY_UP; - break; - case SDLK_DOWN: - keys |= KEY_DOWN; - break; - case SDLK_LEFT: - keys |= KEY_LEFT; - break; - case SDLK_RIGHT: - keys |= KEY_RIGHT; - break; - case SDLK_PAGEDOWN: - keys |= KEY_PAGEDOWN; - break; - case SDLK_PAGEUP: - keys |= KEY_PAGEUP; - break; - case SDLK_RETURN: - case SDLK_SPACE: - keys |= KEY_SELECT; - break; - case SDLK_HOME: - case SDLK_ESCAPE: - keys |= KEY_ESCAPE; - break; - default: - break; - } - break; - case SDL_QUIT: - exit(0); - break; - default: - break; - - } - break; - } - if (keys != 0) - return keys; - SDL_Delay(100); - } - return keys; -} - static int menu_select_internal(SDL_Surface *screen, menu_t *p_menu, int *p_submenus, int sel, @@ -400,6 +306,20 @@ int Menu::getNextEntry(int dy) return v + dy; } +submenu_t *Menu::findSubmenu(int index) +{ + int i; + + for (i = 0; i < this->n_submenus; i++) + { + if (this->p_submenus[i].index == index) + return &this->p_submenus[i]; + } + + return NULL; +} + + void Menu::selectNext(int dx, int dy) { int next; @@ -419,8 +339,9 @@ void Menu::selectNext(int dx, int dy) /* If the next is a submenu */ if (dx != 0 && IS_SUBMENU(this->pp_msgs[next])) { - submenu_t *p_submenu = find_submenu(p_menu, next); + submenu_t *p_submenu = findSubmenu(p_menu, next); + panic_if(!p_submenu, "submenu in the menu text but no actual submenu\n"); p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 : (p_submenu->sel + dx) % p_submenu->n_entries; } @@ -552,15 +473,10 @@ void Menu::setText(const char *messages) continue; /* Length of submenus is unimportant */ } } - this->pp_msgs = (const char **)malloc(this->n_entries * sizeof(const char *)); - this->p_submenus = (submenu_t *)malloc(this->n_submenus * sizeof(submenu_t)); - for (int i = 0; i < this->n_entries; i++) { - this->pp_msgs[i] = strdup(messages[i]); - BUG_ON(!this->pp_msgs[i]); - } - - BUG_ON(!this->pp_msgs); - BUG_ON(!this->p_submenus); + this->pp_msgs = (const char **)xmalloc(this->n_entries * sizeof(const char *)); + this->p_submenus = (submenu_t *)xmalloc(this->n_submenus * sizeof(submenu_t)); + for (int i = 0; i < this->n_entries; i++) + this->pp_msgs[i] = xstrdup(messages[i]); submenu = 0; diff --git a/menu.hh b/menu.hh index dd2c694..694d1d4 100644 --- a/menu.hh +++ b/menu.hh @@ -60,6 +60,7 @@ protected: virtual void escapeCallback(int which); + submenu_t *findSubmenu(int index); int getNextEntry(int dy); diff --git a/utils.hh b/utils.hh index b2d8610..e0de583 100644 --- a/utils.hh +++ b/utils.hh @@ -3,4 +3,39 @@ #define BUG_ON(cond) +#define panic(x...) do \ + { \ + fprintf(stderr, "============Translator panic===========\n"); \ + fprintf(stderr, x); \ + fprintf(stderr, "=======================================\n"); \ + exit(1); \ + } while(0) + +#define panic_if(cond, x...) \ + do { if ((cond)) panic(x); } while(0) + +static inline char *xstrdup(const char *s) +{ + char *out = strdup(s); + + panic_if(!out, "strdup failed"); + + return out; +} + +static inline void *xmalloc(size_t sz) +{ + void *out = malloc(sz); + + panic_if(!out, "malloc failed"); + + return out; +} + + +#define xsnprintf(buf, size, fmt, x...) do { \ + int r = snprintf(buf, size, fmt, x); \ + panic_if(r < 0 || r >= (int)(size), "snprintf failed for %s with %d\n", fmt, r); \ +} while(0) + #endif /* __UTILS_H__ */