X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_tparm.c;h=3fe42399855215f9ba1bc42408afdf21cc42658d;hp=7f0b20b99f6720a13c6a4dbe337fe1708c0f2d09;hb=81304798ee736c467839c779c9ca5dca48db7bea;hpb=5c90fc94a5ac426a5e51732720767d5f0041830d diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c index 7f0b20b9..3fe42399 100644 --- a/ncurses/tinfo/lib_tparm.c +++ b/ncurses/tinfo/lib_tparm.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * @@ -53,7 +53,7 @@ #include #include -MODULE_ID("$Id: lib_tparm.c,v 1.128 2020/10/10 21:18:09 tom Exp $") +MODULE_ID("$Id: lib_tparm.c,v 1.131 2021/04/03 22:05:59 tom Exp $") /* * char * @@ -173,14 +173,16 @@ _nc_free_tparm(void) { #if HAVE_TSEARCH if (MyCount != 0) { - delete_tparm = typeMalloc(TPARM_DATA *, MyCount); + delete_tparm = typeCalloc(TPARM_DATA *, MyCount); which_tparm = 0; twalk(MyCache, visit_nodes); for (which_tparm = 0; which_tparm < MyCount; ++which_tparm) { TPARM_DATA *ptr = delete_tparm[which_tparm]; - tdelete(ptr, &MyCache, cmp_format); - free((char *) ptr->format); - free(ptr); + if (ptr != NULL) { + tdelete(ptr, &MyCache, cmp_format); + free((char *) ptr->format); + free(ptr); + } } which_tparm = 0; twalk(MyCache, visit_nodes); @@ -405,7 +407,7 @@ parse_format(const char *s, char *format, int *len) * may be cases that we cannot see the explicit parameter numbers. */ NCURSES_EXPORT(int) -_nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount) +_nc_tparm_analyze(const char *string, char **p_is_s, int *popcount) { size_t len2; int i; @@ -589,12 +591,14 @@ tparm_setup(const char *string, TPARM_DATA * result) if ((fs = typeCalloc(TPARM_DATA, 1)) != 0) { *fs = *result; if ((fs->format = strdup(string)) != 0) { - if ((ft = tsearch(fs, &MyCache, cmp_format)) != 0) { + if (tsearch(fs, &MyCache, cmp_format) != 0) { ++MyCount; } else { + free(fs); rc = ERR; } } else { + free(fs); rc = ERR; } } else { @@ -983,7 +987,6 @@ NCURSES_EXPORT(char *) tparm(const char *string, ...) { TPARM_DATA myData; - va_list ap; char *result = NULL; _nc_tparm_err = 0; @@ -992,6 +995,7 @@ tparm(const char *string, ...) #endif /* TRACE */ if (tparm_setup(string, &myData) == OK) { + va_list ap; va_start(ap, string); tparm_copy_valist(&myData, TRUE, ap); @@ -1047,7 +1051,6 @@ NCURSES_EXPORT(char *) tiparm(const char *string, ...) { TPARM_DATA myData; - va_list ap; char *result = NULL; _nc_tparm_err = 0; @@ -1056,6 +1059,7 @@ tiparm(const char *string, ...) #endif /* TRACE */ if (tparm_setup(string, &myData) == OK) { + va_list ap; va_start(ap, string); tparm_copy_valist(&myData, FALSE, ap); @@ -1073,7 +1077,6 @@ NCURSES_EXPORT(char *) _nc_tiparm(int expected, const char *string, ...) { TPARM_DATA myData; - va_list ap; char *result = NULL; _nc_tparm_err = 0; @@ -1084,6 +1087,7 @@ _nc_tiparm(int expected, const char *string, ...) if (tparm_setup(string, &myData) == OK && myData.num_actual <= expected && myData.tparm_type == 0) { + va_list ap; va_start(ap, string); tparm_copy_valist(&myData, FALSE, ap);