Revert modifications for Fedora compatibility due to stability problems.
[synfig.git] / ETL / trunk / ETL / _stringf.h
index 8173214..3d0c020 100644 (file)
 
 /* === H E A D E R S ======================================================= */
 
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
 #include <string>
 #include <cstdarg>
 #include <cstdlib>
+#include <cstdio>
 
 /* === M A C R O S ========================================================= */
 
 #define ETL_STRPRINTF_MAX_LENGTH       (800)
 #endif
 
+#ifdef WIN32
+#define POPEN_BINARY_READ_TYPE "rb"
+#define POPEN_BINARY_WRITE_TYPE "wb"
+#else
+#define POPEN_BINARY_READ_TYPE "r"
+#define POPEN_BINARY_WRITE_TYPE "w"
+#endif
+
 /* === T Y P E D E F S ===================================================== */
 
 _ETL_BEGIN_CDECLS
@@ -50,22 +63,33 @@ _ETL_BEGIN_CDECLS
 #define ETL_NO_THROW throw()
 #endif
 
+// Prefer prototypes from glibc headers, since defining them ourselves
+// works around glibc security mechanisms
+
 #ifdef HAVE_VASPRINTF  // This is the preferred method
- extern int vasprintf(char **,const char *,va_list)ETL_NO_THROW;
+ #ifndef __GLIBC__
+  extern int vasprintf(char **,const char *,va_list)ETL_NO_THROW;
+ #endif
 #else
 
 # ifdef HAVE_VSNPRINTF // This is the secondary method
- extern int vsnprintf(char *,size_t,const char*,va_list)ETL_NO_THROW;
+ #ifndef __GLIBC__
+  extern int vsnprintf(char *,size_t,const char*,va_list)ETL_NO_THROW;
+ #endif
 # endif
 
 #endif
 
 #ifdef HAVE_VSSCANF
-extern int vsscanf(const char *,const char *,va_list)ETL_NO_THROW;
+ #ifndef __GLIBC__
+  extern int vsscanf(const char *,const char *,va_list)ETL_NO_THROW;
+ #endif
 #else
 #define ETL_NO_VSTRSCANF
 #ifdef HAVE_SSCANF
-extern int sscanf(const char *buf, const char *format, ...)ETL_NO_THROW;
+ #ifndef __GLIBC__
+  extern int sscanf(const char *buf, const char *format, ...)ETL_NO_THROW;
+ #endif
 #endif
 #endif
 
@@ -83,9 +107,12 @@ vstrprintf(const char *format, va_list args)
 #ifdef HAVE_VASPRINTF  // This is the preferred method (and safest)
        char *buffer;
        std::string ret;
-       vasprintf(&buffer,format,args);
-       ret=buffer;
-       free(buffer);
+       int i=vasprintf(&buffer,format,args);
+       if (i>-1)
+       {
+               ret=buffer;
+               free(buffer);
+       }
        return ret;
 #else
 #ifdef HAVE_VSNPRINTF  // This is the secondary method (Safe, but bulky)
@@ -190,10 +217,12 @@ dirname(const std::string &str)
                        break;
 
        if(iter==str.begin())
+       {
           if (*iter==ETL_DIRECTORY_SEPARATOR)
                   return "/";
           else
                   return ".";
+       }
 
        return std::string(str.begin(),iter);
 }