Re: [Rd] add Rvsnprintf to API ??

2005-05-14 Thread Prof Brian Ripley
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,  [EMAIL PROTECTED]
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, UKFax:  +44 1865 272595
__
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


[Rd] add Rvsnprintf to API ??

2005-05-13 Thread Charles Geyer
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?

-- 
Charles Geyer
Professor, School of Statistics
University of Minnesota
[EMAIL PROTECTED]

__
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel