X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fdemo_menus.c;h=4d553e2ea73c98947085f4a5fe02a0bab6057ecd;hp=d572b2d17c99b43ab2786ca725ccbc066926189a;hb=95a30fbbfc81d5eb0a76e139c86e0a6505cad871;hpb=d44d7f381ba0173521cb788ba3adb12e261e5c96 diff --git a/test/demo_menus.c b/test/demo_menus.c index d572b2d1..4d553e2e 100644 --- a/test/demo_menus.c +++ b/test/demo_menus.c @@ -26,7 +26,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: demo_menus.c,v 1.23 2008/02/23 23:06:49 tom Exp $ + * $Id: demo_menus.c,v 1.28 2008/08/23 20:31:54 tom Exp $ * * Demonstrate a variety of functions from the menu library. * Thomas Dickey - 2005/4/9 @@ -107,12 +107,14 @@ static MENU *mpBanner; static MENU *mpFile; static MENU *mpSelect; +static bool loaded_file = FALSE; + #if !HAVE_STRDUP #define strdup my_strdup static char * strdup(char *s) { - char *p = (char *) malloc(strlen(s) + 1); + char *p = typeMalloc(char, strlen(s) + 1); if (p) strcpy(p, s); return (p); @@ -256,23 +258,35 @@ menu_create(ITEM ** items, int count, int ncols, MenuNo number) static void menu_destroy(MENU * m) { - ITEM **ip; int count; + Trace(("menu_destroy %p", m)); if (m != 0) { - delwin(menu_sub(m)); - delwin(menu_win(m)); + ITEM **items = menu_items(m); + const char *blob = 0; - ip = menu_items(m); count = item_count(m); + Trace(("menu_destroy %p count %d", m, count)); + if ((count > 0) && (m == mpSelect)) { + blob = item_name(*items); + } + unpost_menu(m); free_menu(m); -#if 0 - if (count > 0) { - while (*ip) { - Trace(("freeing item %d:%d", ip - menu_items(m), count)); - free_item(*ip++); + + /* free the extra data allocated in build_select_menu() */ + if ((count > 0) && (m == mpSelect)) { + if (blob && loaded_file) { + Trace(("freeing blob %p", blob)); + free((char *) blob); } + free(items); + } +#ifdef TRACE + if ((count > 0) && (m == mpTrace)) { + ITEM **ip = items; + while (*ip) + free(*ip++); } #endif } @@ -340,6 +354,7 @@ build_select_menu(MenuNo number, char *filename) ITEM **ip; CONST_MENUS char **ap = 0; + CONST_MENUS char **myList = 0; unsigned count = 0; if (filename != 0) { @@ -347,13 +362,13 @@ build_select_menu(MenuNo number, char *filename) if (stat(filename, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFREG && sb.st_size != 0) { - unsigned size = sb.st_size; + size_t size = (size_t) sb.st_size; unsigned j, k; - char *blob = malloc(size + 1); - CONST_MENUS char **list = - (CONST_MENUS char **) calloc(sizeof(*list), size + 1); + char *blob = typeMalloc(char, size + 1); + CONST_MENUS char **list = typeCalloc(CONST_MENUS char *, size + 1); - items = (ITEM **) calloc(sizeof(ITEM *), size + 1); + items = typeCalloc(ITEM *, size + 1); + Trace(("build_select_menu blob=%p, items=%p", blob, items)); if (blob != 0 && list != 0) { FILE *fp = fopen(filename, "r"); if (fp != 0) { @@ -375,16 +390,17 @@ build_select_menu(MenuNo number, char *filename) } list[k] = 0; count = k; - ap = list; + ap = myList = list; } fclose(fp); } + loaded_file = TRUE; } } } if (ap == 0) { count = SIZEOF(labels) - 1; - items = (ITEM **) calloc(count + 1, sizeof(*items)); + items = typeCalloc(ITEM *, count + 1); ap = labels; } @@ -394,6 +410,8 @@ build_select_menu(MenuNo number, char *filename) *ip = 0; mpSelect = menu_create(items, (int) count, 1, number); + if (myList != 0) + free(myList); } static int @@ -457,7 +475,7 @@ tracetrace(unsigned tlevel) size_t need = 12; for (n = 0; t_tbl[n].name != 0; n++) need += strlen(t_tbl[n].name) + 2; - buf = (char *) malloc(need); + buf = typeMalloc(char, need); } sprintf(buf, "0x%02x = {", tlevel); if (tlevel == 0) {