diff options
Diffstat (limited to 'ncurses/base/safe_sprintf.c')
| -rw-r--r-- | ncurses/base/safe_sprintf.c | 36 | 
1 files changed, 26 insertions, 10 deletions
diff --git a/ncurses/base/safe_sprintf.c b/ncurses/base/safe_sprintf.c index 1868c009660c..8816e58c2ca8 100644 --- a/ncurses/base/safe_sprintf.c +++ b/ncurses/base/safe_sprintf.c @@ -1,5 +1,5 @@  /**************************************************************************** - * Copyright 2018,2020 Thomas E. Dickey                                     * + * Copyright 2018-2021,2023 Thomas E. Dickey                                *   * Copyright 1998-2012,2013 Free Software Foundation, Inc.                  *   *                                                                          *   * Permission is hereby granted, free of charge, to any person obtaining a  * @@ -34,7 +34,7 @@  #include <curses.priv.h>  #include <ctype.h> -MODULE_ID("$Id: safe_sprintf.c,v 1.33 2020/02/02 23:34:34 tom Exp $") +MODULE_ID("$Id: safe_sprintf.c,v 1.37 2023/09/30 10:42:42 tom Exp $")  #if USE_SAFE_SPRINTF @@ -223,9 +223,9 @@ NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx  				    const char *fmt,  				    va_list ap)  { -    char *result = 0; +    char *result = NULL; -    if (SP_PARM != 0 && fmt != 0) { +    if (SP_PARM != NULL && fmt != NULL) {  #if USE_SAFE_SPRINTF  	va_list ap2;  	int len; @@ -238,7 +238,7 @@ NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx  	    my_length = (size_t) (2 * (len + 1));  	    my_buffer = typeRealloc(char, my_length, my_buffer);  	} -	if (my_buffer != 0) { +	if (my_buffer != NULL) {  	    *my_buffer = '\0';  	    if (len >= 0) {  		vsprintf(my_buffer, fmt, ap); @@ -255,21 +255,37 @@ NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx  	    if (screen_columns(SP_PARM) > MyCols)  		MyCols = screen_columns(SP_PARM);  	    my_length = (size_t) (MyRows * (MyCols + 1)) + 1; +	    if (my_length < 80) +		my_length = 80;  	    my_buffer = typeRealloc(char, my_length, my_buffer);  	} -	if (my_buffer != 0) { +	if (my_buffer != NULL) {  # if HAVE_VSNPRINTF -	    vsnprintf(my_buffer, my_length, fmt, ap);	/* SUSv2, 1997 */ +	    /* SUSv2, 1997 */ +	    int used; + +	    do { +		va_list ap2; + +		begin_va_copy(ap2, ap); +		used = vsnprintf(my_buffer, my_length, fmt, ap2); +		end_va_copy(ap2); +		if (used < (int) my_length) +		    break; +		my_length = (size_t) ((3 * used) / 2); +		my_buffer = typeRealloc(char, my_length, my_buffer); +	    } while (my_buffer != NULL);  # else -	    vsprintf(my_buffer, fmt, ap);	/* ISO/ANSI C, 1989 */ +	    /* ISO/ANSI C, 1989 */ +	    vsprintf(my_buffer, fmt, ap);  # endif  	    result = my_buffer;  	}  #endif -    } else if (my_buffer != 0) {	/* see _nc_freeall() */ +    } else if (my_buffer != NULL) {	/* see _nc_freeall() */  	free(my_buffer); -	my_buffer = 0; +	my_buffer = NULL;  	my_length = 0;      }      return result;  | 
