From 178964348079734e427147edc6d8ba66bedc46b8 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 3 Apr 2016 17:50:42 +0000 Subject: [PATCH] Remove UserError on unknown MED function Jayman2000 reports that users who do not update their MED.MNU after updating to 8b61b9f ("Remove unused symbols") receive an "editor crash" on startup. This is not a crash, but instead is poor error handling in menubar.cpp, which calls UserError instead of ignoring the offending line. Calls to UserError are fatal, but do not crash the program. Replace that call with a con_printf(CON_URGENT) and ignore the line. Additionally, change the handling for excess menus and for excess menu items to con_printf+ignore instead of UserError. Reported-by: Jayman2000 Fixes: 8b61b9f0db35adcec91f344c518cc20e9ff8593b ("Remove unused symbols") --- common/ui/menubar.cpp | 100 ++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 48 deletions(-) diff --git a/common/ui/menubar.cpp b/common/ui/menubar.cpp index 56bea0eca..2bab7964e 100644 --- a/common/ui/menubar.cpp +++ b/common/ui/menubar.cpp @@ -740,7 +740,6 @@ void menubar_init( const char * file ) int np; char buf1[200]; char buf2[200]; - int menu, item; num_menus = state = 0; @@ -760,109 +759,114 @@ void menubar_init( const char * file ) if ( buffer[0] == ';' ) continue; CommaParse( 0, buf1, buffer ); - menu = atoi( buf1 ); - if (menu >= MAXMENUS) - UserError("Too many menus (%d).",menu); + char *p; + const auto mi = strtoul(buf1, &p, 10); + if (mi >= MAXMENUS) + { + con_printf(CON_URGENT, "%s:%u: too many menus defined: max=%u, requested=%lu in \"%s\"", __FILE__, __LINE__, MAXMENUS, mi, file); + break; + } CommaParse( 1, buf1, buffer ); - item = atoi(buf1 ); - if (item >= MAXITEMS) - UserError("Too many items (%d) in menu %d.",item+1,menu); + const auto ii = strtoul(buf1, &p, 10); + if (ii >= MAXITEMS) + { + con_printf(CON_URGENT, "%s:%u: too many items defined: max=%u, requested=%lu in \"%s\"", __FILE__, __LINE__, MAXITEMS, ii, file); + break; + } + auto &menu = Menu[mi]; + auto &item = menu.Item[ii]; CommaParse( 2, buf1, buffer ); ul_xlate(buf1); - if (buf1[0] != '-' ) - { - snprintf(buf2, sizeof(buf2), " %s ", buf1); - Menu[menu].Item[item].Text.reset(d_strdup(buf2)); - } else - Menu[menu].Item[item].Text.reset(d_strdup(buf1)); + item.Text.reset(d_strdup(buf1[0] == '-' ? buf1 : (snprintf(buf2, sizeof(buf2), " %s ", buf1), buf2))); - Menu[menu].Item[item].InactiveText.reset(d_strdup(Menu[menu].Item[item].Text.get())); + item.InactiveText.reset(d_strdup(item.Text.get())); for (int i = 0, j = 0;; i++ ) { - np = Menu[menu].Item[item].Text[i]; + np = item.Text[i]; if (np != CC_UNDERLINE) - Menu[menu].Item[item].InactiveText[j++] = np; + item.InactiveText[j++] = np; if (!np) break; } CommaParse( 3, buf1, buffer ); if (buf1[0]=='{' && buf1[1] =='}') - Menu[menu].Item[item].Hotkey = -1; + item.Hotkey = -1; else { const auto i = DecodeKeyText(buf1); if (i<1) { UserError("Unknown key, %s, in %s\n", buf1, file ); } else { - Menu[menu].Item[item].Hotkey = i; + item.Hotkey = i; } } CommaParse( 4, buf1, buffer ); if (buf1[0]) { - Menu[menu].Item[item].user_function = func_get(buf1, &np); + item.user_function = func_get(buf1, &np); - if (Menu[menu].Item[item].user_function==NULL) + if (!item.user_function) { - UserError( "Unknown function, %s, in %s\n", buf1, file ); - //ui_messagebox( -2, -2, 1, buffer, "Ok" ); + con_printf(CON_URGENT, "%s:%u: unknown function \"%s\" in \"%s\"", __FILE__, __LINE__, buf1, file); + break; } } - Menu[menu].Item[item].x = Menu[menu].x; - Menu[menu].Item[item].y = Menu[menu].y; + item.x = menu.x; + item.y = menu.y; int w, h; - if ( Menu[menu].Item[item].Text[0] == '-' ) + if (item.Text[0] == '-') { w = 1; h = 3; } else { - gr_get_string_size(Menu[menu].Item[item].Text.get(), &w, &h, nullptr); + gr_get_string_size(item.Text.get(), &w, &h, nullptr); w += 2; h += 2; } - if (menu==0) { - Menu[0].h = h; + if (mi == 0) + { + menu.h = h; - Menu[0].Item[item].x = Menu[0].x + Menu[0].w; + item.x = menu.x + menu.w; - Menu[0].Item[item].y = Menu[0].y; + item.y = menu.y; - Menu[item+1].x = Menu[0].x + Menu[0].w; - Menu[item+1].y = Menu[0].h - 2; + Menu[ii+1].x = menu.x + menu.w; + Menu[ii+1].y = menu.h - 2; - Menu[0].Item[item].w = w; - Menu[0].Item[item].h = h; + item.w = w; + item.h = h; - Menu[0].w += w; + menu.w += w; }else { - if ( w > Menu[menu].w ) + if (w > menu.w) { - Menu[menu].w = w; - range_for (auto &i, partial_range(Menu[menu].Item, Menu[menu].NumItems)) - i.w = Menu[menu].w; + menu.w = w; + range_for (auto &i, partial_range(menu.Item, menu.NumItems)) + i.w = w; } - Menu[menu].Item[item].w = Menu[menu].w; - Menu[menu].Item[item].x = Menu[menu].x; - Menu[menu].Item[item].y = Menu[menu].y+Menu[menu].h; - Menu[menu].Item[item].h = h; - Menu[menu].h += h; + item.w = menu.w; + item.x = menu.x; + item.y = menu.y+menu.h; + item.h = h; + menu.h += h; } - if ( item >= Menu[menu].NumItems ) + if (ii >= menu.NumItems) { - Menu[menu].NumItems = item+1; + menu.NumItems = ii + 1; } - if ( menu >= num_menus ) - num_menus = menu+1; + if (mi >= num_menus) + num_menus = mi + 1; } Menu[0].w = 700;