# HG changeset patch # User jwe # Date 1061497774 0 # Node ID bd3cfa59eb61a7640e7799ca0ae9a5eccd66bea5 # Parent 468ddfbce2e22defb87138679b892c4be66e9711 [project @ 2003-08-21 20:29:34 by jwe] diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2003-08-21 John W. Eaton + + * utils.cc (octave_vsnprintf): Copy va_list to avoid using more + than once. + 2003-08-07 John W. Eaton * utils.cc (octave_vsnprintf): Call octave_raw_vsnprintf instead diff --git a/src/utils.cc b/src/utils.cc --- a/src/utils.cc +++ b/src/utils.cc @@ -950,6 +950,14 @@ octave_throw_interrupt_exception (); \ BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_2 +#if defined __GNUC__ && defined __va_copy +#define SAVE_ARGS(saved_args, args) __va_copy (saved_args, args) +#elif defined va_copy +#define SAVE_ARGS(saved_args, args) va_copy (saved_args, args) +#else +#define SAVE_ARGS(saved_args, args) saved_args = args +#endif + char * octave_vsnprintf (const char *fmt, va_list args) { @@ -973,6 +981,13 @@ #if defined (HAVE_C99_VSNPRINTF) + // Note that the caller is responsible for calling va_end on args. + // We will do it for saved_args. + + va_list saved_args; + + SAVE_ARGS (saved_args, args); + BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_FOR_VSNPRINTF; nchars = octave_raw_vsnprintf (buf, size, fmt, args); @@ -991,19 +1006,27 @@ { BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_FOR_VSNPRINTF; - octave_raw_vsnprintf (buf, size, fmt, args); + octave_raw_vsnprintf (buf, size, fmt, saved_args); END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; } } + va_end (saved_args); + #else while (1) { + va_list saved_args; + + SAVE_ARGS (saved_args, args); + BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_FOR_VSNPRINTF; - nchars = octave_raw_vsnprintf (buf, size, fmt, args); + nchars = octave_raw_vsnprintf (buf, size, fmt, saved_args); + + va_end (saved_args); END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;