From ripley at stats.ox.ac.uk  Sat May 14 08:56:05 2005
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat May 14 08:56:13 2005
Subject: [Rd] add Rvsnprintf to API ??
In-Reply-To: <20050513194455.GA23627@stat.umn.edu>
References: <200505131003.j4DA3BSZ020947@hypatia.math.ethz.ch>
	<20050513194455.GA23627@stat.umn.edu>
Message-ID: <Pine.LNX.4.61.0505140720080.25685@gannet.stats>

On Fri, 13 May 2005, Charles Geyer wrote:

> Could Rvsnprintf (in src/main/errors.c) be added to the R API
> with prototype in include/R_ext/Print.h say?
>
> Here's my problem.  I'm trying to write some code that is not
> totally tied to R.  Hence I want R style error messaging to
> be isolated in a small module.  I do not want #include <R.h>
> and calls to error (Rf_error) in most of my code.
> Hence I want to write a module with something like
>
> ----- begin code snippet -----
> #include <stdarg.h>
> #include <stdio.h>
> #include <R.h>
>
> #define BUFSIZE 1024
>
> void die(const char *format, ...)
> {
>    char buf[BUFSIZE];
>    va_list arg;
>
>    va_start(arg, format);
>    vsnprintf(buf, BUFSIZE, format, arg);
>    va_end(arg);
>    buf[BUFSIZE - 1] = '\0';
>    error(buf);
> }
> ----- end code snippet -----
>
> But that's not portable because vsnprintf isn't.
> You've already made a big effort to work around nonportability of
> vsnprintf, but don't make it available in the API.  Why not?
>
> If I could change vsnprintf to Rvsnprintf above, then I wouldn't
> have to do some horrible autoconf song and dance that probably wouldn't
> be completely portable anyway.
>
> Or is there a better solution I haven't seen?

R guarantees to have *vsnprintf* available.  Putting things in the API is 
a one-way decision and ties our hands for ever.  Rvsnprintf is not even 
exported from errors.c: it is static and just a convenience wrapper.

About all a user package needs to do is

AC_CHECK_DECLS([vsnprintf])

and in your code snippet

#if defined(HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF
extern int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
#endif

However, AFAIK all known R platforms do have vsnprintf these days: the 
MinGW compiler used on Windows gained it within the last year.

-- 
Brian D. Ripley,                  ripley@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


[Rd] add Rvsnprintf to API ??
Prof Brian Ripley