Re: Using vsnprintf or vasprintf in sid

Scott Dattalo <[email protected]>
Newsgroups gmane.comp.emulators.sid.devel
Message-ID <[email protected]>
On 26 May 2003, Ben Elliston wrote:

> Hi Dave!
> 
> Dave Brolley <[email protected]> writes:
> 
> > I have a need for printf-like printing into a buffer, however I have
> > no control over the input and so I don't know the size of the buffer
> > which will be required. It looks like vsnprintf (_ISOC99_SOURCE) or
> > vasprintf (_GNU_SOURCE) are what I need. Is it ok to use these
> > function in sid and, if so, how do I get configure to add the
> > necessary -Dxxxx to the sid compilations and (if necessary) specify
> > the library to look in?
> 
> I'm not aware of any policy (the problem with SID is that it lacks the
> strict policies and exciting politics of other free software
> projects!) that would prevent you from using either of these functions
> in SID, provided that you use Autoconf tests as you suggest.  I think
> it's important to have a fall-back implementation, though, in the case
> that neither is available.
> 
> Take a look at using AC_CHECK_FUNC to do the test and set a #define in
> config.h to indicate the function(s) presence.  If you can, try and
> isolate the test to the configure script used in the part of the
> source tree you're working in rather than running the test in the
> top-level configure script.

IIRC, when I used vnsprintf in SDCC the Solaris users were affected. 
Here's the code in question:


#ifdef USE_VSNPRINTF
  // Alas, vsnprintf is not ANSI standard, and does not exist
  // on Solaris (and probably other non-Gnu flavored Unixes).

/*-----------------------------------------------------------------*/
/* SAFE_snprintf - like snprintf except the string pointer is      */
/*                 after the string has been printed to. This is   */
/*                 useful for printing to string as though if it   */
/*                 were a stream.                                  */
/*-----------------------------------------------------------------*/
void SAFE_snprintf(char **str, size_t *size, const  char  *format, ...)
{
  va_list val;
  int len;

  if(!str || !*str)
    return;

  va_start(val, format);

  vsnprintf(*str, *size, format, val);

  va_end (val);

  len = strlen(*str);
  if(len > *size) {
    fprintf(stderr,"WARNING, it looks like %s has 
overflowed\n",__FUNCTION__);
    fprintf(stderr,"len = %d is > str size %d\n",len,*size);
  }

  *str += len;
  *size -= len;

}

#else  //  USE_VSNPRINTF

// This version is *not* safe, despite the name.

void SAFE_snprintf(char **str, size_t *size, const  char  *format, ...)
{
  va_list val;
  int len;
  static char buffer[1024]; /* grossly conservative, but still not 
inherently safe */

  if(!str || !*str)
    return;

  va_start(val, format);

  vsprintf(buffer, format, val);
  va_end (val);

  len = strlen(buffer);
  if(len > *size) {
    fprintf(stderr,"WARNING, it looks like %s has 
overflowed\n",__FUNCTION__);
    fprintf(stderr,"len = %d is > str size %d\n",len,*size);
  }

  strcpy(*str, buffer);
  *str += len;
  *size -= len;

}

#endif    //  USE_VSNPRINTF


So the fix is a hack that really isn't fool-proof. 

Scott
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.