[poppler] qt4/src/poppler-qiodeviceoutstream.cc: open_memstream is non-portable

Albert Astals Cid aacid at kde.org
Mon Jan 28 14:20:17 PST 2008


A Dilluns 28 Gener 2008, Jonathan Kew va escriure:
> The document saving code in the Qt4 wrapper uses open_memstream(),
> which is not available on all platforms. I would recommend using
> vasprintf() instead, which I suspect is more widely supported, but
> this is also a GNU extension and may not be available everywhere. So
> a fallback approach using vsnprintf() is also needed.
>
> Proposed changes below....

I'll let Pino comment on that, but he is travelling so it'll take a while.

Albert

>
> --
> Jonathan
> --
>
> diff --git a/configure.ac b/configure.ac
> index 99ffbda..602171a 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -17,6 +17,9 @@ AC_PROG_CXX
>   AC_PROG_INSTALL
>   AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY, 1,
> [Defines if gettimeofday is available on your system]))
>   AC_CHECK_FUNC(localtime_r, AC_DEFINE(HAVE_LOCALTIME_R, 1, [Defines
> if localtime_r is available on your system]))
> +AC_CHECK_FUNC(strndup, AC_DEFINE(HAVE_STRNDUP, 1, [Defines if
> strndup is available on your system]))
> +AC_CHECK_FUNC(vasprintf, AC_DEFINE(HAVE_VASPRINTF, 1, [Defines if
> vasprintf is available on your system]))
> +AC_CHECK_FUNC(open_memstream, AC_DEFINE(HAVE_OPEN_MEMSTREAM, 1,
> [Defines if open_memstream is available on your system]))
>
>   dnl Enable these unconditionally.
>   AC_DEFINE([OPI_SUPPORT], [1], [Generate OPI comments in PS output.])
>
> diff --git a/qt4/src/poppler-qiodeviceoutstream.cc b/qt4/src/poppler-
> qiodeviceoutstream.cc
> index 11fab97..6772c1d 100644
> --- a/qt4/src/poppler-qiodeviceoutstream.cc
> +++ b/qt4/src/poppler-qiodeviceoutstream.cc
> @@ -57,13 +57,43 @@ void QIODeviceOutStream::put(char c)
>   void QIODeviceOutStream::printf(const char *format, ...)
>   {
>     va_list ap;
> -  va_start(ap, format);
>     char* buf = 0;
> +#ifdef HAVE_VASPRINTF
> +  int bufsize;
> +  va_start(ap, format);
> +  bufsize = vasprintf(&buf, format, ap);
> +  va_end(ap);
> +  if (bufsize < 0)
> +    return; /* failed to allocate memory */
> +#else
> +#ifdef HAVE_OPEN_MEMSTREAM
>     size_t bufsize = 0;
>     FILE* stream = open_memstream(&buf, &bufsize);
> +  va_start(ap, format);
>     vfprintf(stream, format, ap);
>     va_end(ap);
>     fclose(stream);
> +#else /* do it the hard way - based on docs at linux.about.com */
> +  size_t bufsize = 100;
> +  if ((buf = (char*)malloc(bufsize)) == NULL)
> +    return;
> +  while (1) {
> +    va_start(ap, format);
> +    int n = vsnprintf(buf, bufsize, format, ap);
> +    va_end(ap);
> +    if (n > -1 && (size_t)n < bufsize) {
> +      bufsize = n;
> +      break;
> +    }
> +    if (n > -1)
> +      bufsize = n + 1; /* allocate exactly what is needed */
> +    else
> +      bufsize *= 2;    /* else try twice the old size */
> +    if ((buf = (char*)realloc(buf, bufsize)) == NULL)
> +      return; /* failure! */
> +  }
> +#endif
> +#endif
>     m_device->write(buf, bufsize);
>     free(buf);
>   }
>
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/poppler




More information about the poppler mailing list