X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fdemo_terminfo.c;h=6e52e990b5e8b90677a4964ab0c573ec7eb1e6ba;hp=c6abc028b949ad886d12f494379c9426e1dcf832;hb=8d8a3537cd58af7879c6e1921235daeed2b74926;hpb=bf66beed16926edb72b65b5ac3e7610fb8f04523 diff --git a/test/demo_terminfo.c b/test/demo_terminfo.c index c6abc028..6e52e990 100644 --- a/test/demo_terminfo.c +++ b/test/demo_terminfo.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2009-2015,2016 Free Software Foundation, Inc. * + * Copyright (c) 2009-2017,2019 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -29,7 +29,7 @@ /* * Author: Thomas E. Dickey * - * $Id: demo_terminfo.c,v 1.41 2016/06/04 23:19:32 tom Exp $ + * $Id: demo_terminfo.c,v 1.49 2019/08/24 23:11:01 tom Exp $ * * A simple demo of the terminfo interface. */ @@ -69,8 +69,10 @@ static bool f_opt = FALSE; static bool n_opt = FALSE; static bool q_opt = FALSE; static bool s_opt = FALSE; +#ifdef NCURSES_VERSION static bool x_opt = FALSE; static bool y_opt = FALSE; +#endif static char *d_opt; static char *e_opt; @@ -95,8 +97,9 @@ static long total_s_values; static char * make_dbitem(char *p, char *q) { - char *result = malloc(strlen(e_opt) + 2 + (size_t) (p - q)); - sprintf(result, "%s=%.*s", e_opt, (int) (p - q), q); + size_t need = strlen(e_opt) + 2 + (size_t) (p - q); + char *result = malloc(need); + _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q); return result; } @@ -147,11 +150,12 @@ next_dbitem(void) db_item++; } } - printf("** %s\n", result); + if (result != 0) + printf("** %s\n", result); return result; } -#ifdef NO_LEAKS +#if NO_LEAKS static void free_dblist(void) { @@ -312,6 +316,12 @@ abcdefghijklmnopqrstuvwxyz_"; del_curterm(cur_term); } +#if USE_CODE_LISTS +#define fullname(type,n) f_opt ? type##fnames[n] : cap +#else +#define fullname(type,n) cap +#endif + static void demo_terminfo(char *name) { @@ -330,7 +340,7 @@ demo_terminfo(char *name) cap = my_boolcodes[n]; if (cap == 0) break; - dumpit(cap, f_opt ? boolfnames[n] : cap); + dumpit(cap, fullname(bool, n)); } } @@ -339,7 +349,7 @@ demo_terminfo(char *name) cap = my_numcodes[n]; if (cap == 0) break; - dumpit(cap, f_opt ? numfnames[n] : cap); + dumpit(cap, fullname(num, n)); } } @@ -348,15 +358,14 @@ demo_terminfo(char *name) cap = my_strcodes[n]; if (cap == 0) break; - dumpit(cap, f_opt ? strfnames[n] : cap); + dumpit(cap, fullname(str, n)); } } #ifdef NCURSES_VERSION if (x_opt && (my_blob == 0)) { - int mod; if (y_opt) { #if NCURSES_XNAMES - TERMTYPE *term = &(cur_term->type); + TERMTYPE *term = (TERMTYPE *) cur_term; if (term != 0 && ((NUM_BOOLEANS(term) != BOOLCOUNT) || (NUM_NUMBERS(term) != NUMCOUNT) @@ -380,6 +389,7 @@ demo_terminfo(char *name) "kLFT", "kNXT", "kPRV", "kRIT", "kUP", }; for (n = 0; n < SIZEOF(xterm_keys); ++n) { + int mod; for (mod = 0; mod < 8; ++mod) { if (mod == 0) { /* these happen to be standard - avoid duplicates */ @@ -390,9 +400,11 @@ demo_terminfo(char *name) !strcmp(xterm_keys[n], "kRIT")) { continue; } - sprintf(temp, "%.*s", 8, xterm_keys[n]); + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%.*s", 8, xterm_keys[n]); } else { - sprintf(temp, "%.*s%d", 8, xterm_keys[n], mod); + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%.*s%d", 8, xterm_keys[n], mod); } dumpit(temp, NULL); } @@ -717,7 +729,6 @@ copy_code_list(NCURSES_CONST char *const *list) size_t count; size_t length = 1; char **result = 0; - char *blob = 0; char *unused = 0; for (pass = 0; pass < 2; ++pass) { @@ -727,12 +738,12 @@ copy_code_list(NCURSES_CONST char *const *list) length += chunk; } else { result[count] = unused; - strcpy(unused, list[count]); + _nc_STRCPY(unused, list[count], length); unused += chunk; } } if (pass == 0) { - blob = malloc(length); + char *blob = malloc(length); result = typeCalloc(char *, count + 1); unused = blob; if (blob == 0 || result == 0) @@ -742,7 +753,18 @@ copy_code_list(NCURSES_CONST char *const *list) return result; } + +#if NO_LEAKS +static void +free_code_list(char **list) +{ + if (list) { + free(list[0]); + free(list); + } +} #endif +#endif /* USE_CODE_LISTS */ static void usage(void) @@ -895,17 +917,26 @@ main(int argc, char *argv[]) PLURAL(total_n_values), PLURAL(total_s_values)); -#ifdef NO_LEAKS +#if NO_LEAKS free_dblist(); - if (my_blob != 0) { - free(my_blob); - free(my_boolcodes); - free(my_numcodes); - free(my_numvalues); - free(my_strcodes); - free(my_strvalues); + if (input_name != 0) { + if (my_blob != 0) { + free(my_blob); + free(my_boolcodes); + free(my_numcodes); + free(my_numvalues); + free(my_strcodes); + free(my_strvalues); + } + } +#if USE_CODE_LISTS + else { + free_code_list(my_boolcodes); + free_code_list(my_numcodes); + free_code_list(my_strcodes); } #endif +#endif /* NO_LEAKS */ ExitProgram(EXIT_SUCCESS); }