# HG changeset patch # User jwe # Date 953788645 0 # Node ID 0886bbb236cb1abe697d211ff3bbf080eae6276a # Parent a7fe24b18fa43c0119f50fd2dfdd70e9e936f825 [project @ 2000-03-23 05:17:23 by jwe] diff -r a7fe24b18fa4 -r 0886bbb236cb ChangeLog --- a/ChangeLog Wed Mar 22 21:56:19 2000 +0000 +++ b/ChangeLog Thu Mar 23 05:17:25 2000 +0000 @@ -1,3 +1,7 @@ +2000-03-22 John W. Eaton + + * configure.in: Check for vsnprintf. + 2000-03-21 John W. Eaton * Makefile.in (liboctave.$(SHLEXT)): Delete target before rebuilding. diff -r a7fe24b18fa4 -r 0886bbb236cb configure.in --- a/configure.in Wed Mar 22 21:56:19 2000 +0000 +++ b/configure.in Thu Mar 23 05:17:25 2000 +0000 @@ -21,7 +21,7 @@ ### Software Foundation, 59 Temple Place - Suite 330, Boston, MA ### 02111-1307, USA. -AC_REVISION($Revision: 1.325 $) +AC_REVISION($Revision: 1.326 $) AC_PREREQ(2.9) AC_INIT(src/octave.cc) AC_CONFIG_HEADER(config.h) @@ -786,9 +786,10 @@ gethostname getpgrp getpid getppid getpwent getpwnam getpwuid \ gettimeofday getuid getwd localtime_r lstat memmove mkdir mkfifo \ on_exit pipe poll putenv rename rindex rmdir select setgrent \ - setpwent setvbuf sigaction sigpending sigprocmask sigsuspend stat \ - strcasecmp strdup strerror strftime stricmp strncasecmp strnicmp \ - strptime tempnam umask unlink usleep vfprintf vsprintf waitpid) + setpwent setvbuf sigaction sigpending sigprocmask sigsuspend \ + stat strcasecmp strdup strerror strftime stricmp strncasecmp \ + strnicmp strptime tempnam umask unlink usleep vfprintf vsprintf \ + vsnprintf waitpid) OCTAVE_SMART_PUTENV diff -r a7fe24b18fa4 -r 0886bbb236cb src/ChangeLog --- a/src/ChangeLog Wed Mar 22 21:56:19 2000 +0000 +++ b/src/ChangeLog Thu Mar 23 05:17:25 2000 +0000 @@ -1,5 +1,15 @@ 2000-03-22 John W. Eaton + * oct-stream.cc (do_printf_conv): Use octave_format instead of + ostream::form. Return number of characters written. + (octave_base_stream::do_printf): Return number of characters written. + + * error.cc (verror, vwarning): Use octave_format instead of + ostream::vform. + + * utils.cc (octave_format, octave_vformat): New functions. + * cutils.c (octave_snprintf, octave_vsnprintf): New functions. + * oct-lvalue.h (dummy_val): New static variable. (octave_lvalue::octave_lvalue): Use it to initialize val. diff -r a7fe24b18fa4 -r 0886bbb236cb src/cutils.c --- a/src/cutils.c Wed Mar 22 21:56:19 2000 +0000 +++ b/src/cutils.c Thu Mar 23 05:17:25 2000 +0000 @@ -39,6 +39,9 @@ #include #endif +#include +#include +#include #include static void @@ -92,6 +95,46 @@ return strncasecmp (s1, s2, n); } +char * +octave_vsnprintf (size_t n, const char *fmt, va_list args) +{ +#if defined (HAVE_VSNPRINTF) + size_t size = 100; + + char *buf = malloc (size); + + while (1) + { + int nchars = vsnprintf (buf, size, fmt, args); + + if (nchars > -1) + return buf; + else + { + size *= 2; + buf = realloc (buf, size); + } + } +#else + return 0; +#endif +} + +char * +octave_snprintf (size_t n, const char *fmt, ...) +{ + char *retval = 0; + + va_list args; + va_start (args, fmt); + + retval = octave_vsnprintf (n, fmt, args); + + va_end (args); + + return retval; +} + /* ;;; Local Variables: *** ;;; mode: C++ *** diff -r a7fe24b18fa4 -r 0886bbb236cb src/error.cc --- a/src/error.cc Wed Mar 22 21:56:19 2000 +0000 +++ b/src/error.cc Thu Mar 23 05:17:25 2000 +0000 @@ -72,8 +72,8 @@ std::cerr << name << ": "; } - octave_diary.vform (fmt, args); - std::cerr.vform (fmt, args); + octave_vformat (octave_diary, fmt, args); + octave_vformat (std::cerr, fmt, args); octave_diary << std::endl; std::cerr << std::endl; @@ -91,9 +91,12 @@ if (to_beep_or_not_to_beep_p) output_buf << "\a"; + if (name) output_buf << name << ": "; - output_buf.vform (fmt, args); + + octave_vformat (output_buf, fmt, args); + output_buf << std::endl << std::ends; char *msg = output_buf.str (); diff -r a7fe24b18fa4 -r 0886bbb236cb src/oct-stream.cc --- a/src/oct-stream.cc Wed Mar 22 21:56:19 2000 +0000 +++ b/src/oct-stream.cc Thu Mar 23 05:17:25 2000 +0000 @@ -2100,56 +2100,60 @@ // Ugh again and again. template -void +int do_printf_conv (std::ostream& os, const char *fmt, int nsa, int sa_1, int sa_2, bool have_arg, T arg) { + int retval = 0; + switch (nsa) { case 2: if (have_arg) - os.form (fmt, sa_1, sa_2, arg); + retval = octave_format (os, fmt, sa_1, sa_2, arg); else - os.form (fmt, sa_1, sa_2); + retval = octave_format (os, fmt, sa_1, sa_2); break; case 1: if (have_arg) - os.form (fmt, sa_1, arg); + retval = octave_format (os, fmt, sa_1, arg); else - os.form (fmt, sa_1); + retval = octave_format (os, fmt, sa_1); break; case 0: if (have_arg) - os.form (fmt, arg); + retval = octave_format (os, fmt, arg); else - os.form (fmt); + retval = octave_format (os, fmt); break; default: ::error ("fprintf: internal error handling format"); break; } + + return retval; } -template void +template int do_printf_conv (std::ostream&, const char*, int, int, int, bool, int); -template void +template int do_printf_conv (std::ostream&, const char*, int, int, int, bool, long); -template void +template int do_printf_conv (std::ostream&, const char*, int, int, int, bool, double); -template void +template int do_printf_conv (std::ostream&, const char*, int, int, int, bool, const char*); int octave_base_stream::do_printf (printf_format_list& fmt_list, const octave_value_list& args) { - int retval = -1; + int retval = 0; std::ostream *osp = output_stream (); @@ -2197,7 +2201,8 @@ const char *fmt = elt->text; if (doing_percent || args == 0) - do_printf_conv (os, fmt, nsa, sa_1, sa_2, false, 0.0); + retval += do_printf_conv (os, fmt, nsa, sa_1, sa_2, + false, 0.0); else { if (elt->type == 's' && val_cache.looking_at_string ()) @@ -2205,8 +2210,8 @@ std::string val = val_cache.string_value (); if (val_cache) - do_printf_conv (os, fmt, nsa, sa_1, sa_2, true, - val.c_str ()); + retval += do_printf_conv (os, fmt, nsa, sa_1, + sa_2, true, val.c_str ()); else break; } @@ -2222,20 +2227,23 @@ case 'X': case 'u': case 'c': { if (elt->modifier == 'l') - do_printf_conv (os, fmt, nsa, sa_1, - sa_2, true, - static_cast (val)); + retval + += do_printf_conv (os, fmt, nsa, + sa_1, sa_2, true, + static_cast (val)); else - do_printf_conv (os, fmt, nsa, sa_1, - sa_2, true, - static_cast (val)); + retval + += do_printf_conv (os, fmt, nsa, + sa_1, sa_2, true, + static_cast (val)); } break; case 'f': case 'e': case 'E': case 'g': case 'G': - do_printf_conv (os, fmt, nsa, sa_1, - sa_2, true, val); + retval + += do_printf_conv (os, fmt, nsa, sa_1, + sa_2, true, val); break; default: @@ -2249,15 +2257,10 @@ } if (val_cache.no_more_values ()) - { - retval = 0; - break; - } + break; } - if (os) - retval += nsa + (doing_percent ? 0 : 1); - else + if (! os) { error ("fprintf: write error"); retval = -1; diff -r a7fe24b18fa4 -r 0886bbb236cb src/utils.cc --- a/src/utils.cc Wed Mar 22 21:56:19 2000 +0000 +++ b/src/utils.cc Thu Mar 23 05:17:25 2000 +0000 @@ -674,6 +674,56 @@ check_dimensions (nr, nc, warn_for); // May set error_state. } +extern int +octave_format (ostream& os, const char *fmt, ...) +{ + int retval = -1; + + va_list args; + va_start (args, fmt); + + retval = octave_vformat (os, fmt, args); + + va_end (args); + + return retval; +} + +extern int +octave_vformat (ostream& os, const char *fmt, va_list args) +{ + int retval = -1; + +#if defined (__GNUG__) + + ostrstream buf; + + buf.vform (fmt, args); + + buf << ends; + + char *s = buf.str (); + + retval = strlen (s); + + os << s; + +#else + + char *s = octave_vsnprintf (fmt, args); + + if (s) + { + os << s; + + retval = strlen (s); + } + +#endif + + return retval; +} + static int treat_neg_dim_as_zero (void) { diff -r a7fe24b18fa4 -r 0886bbb236cb src/utils.h --- a/src/utils.h Wed Mar 22 21:56:19 2000 +0000 +++ b/src/utils.h Thu Mar 23 05:17:25 2000 +0000 @@ -23,6 +23,8 @@ #if !defined (octave_utils_h) #define octave_utils_h 1 +#include + #include #include @@ -65,12 +67,22 @@ get_dimensions (const octave_value& a, const char *warn_for, int& nr, int& nc); +extern int +octave_format (ostream& os, const char *fmt, ...); + +extern int +octave_vformat (ostream& os, const char *fmt, va_list args); + extern "C" void octave_usleep (unsigned int useconds); extern "C" int octave_strcasecmp (const char *s1, const char *s2); extern "C" int octave_strncasecmp (const char *s1, const char *s2, size_t n); +extern "C" char *octave_snprintf (size_t n, const char *fmt, ...); + +extern "C" char *octave_vsnprintf (size_t n, const char *fmt, va_list args); + #endif /*