Remove spaces and tabs at end of lines.
[synfig.git] / ETL / trunk / ETL / _stringf.h
index b702689..120c326 100644 (file)
 #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
@@ -83,9 +91,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,14 +201,38 @@ dirname(const std::string &str)
                        break;
 
        if(iter==str.begin())
+       {
           if (*iter==ETL_DIRECTORY_SEPARATOR)
                   return "/";
           else
                   return ".";
+       }
 
        return std::string(str.begin(),iter);
 }
 
+// filename_extension("/f.e/d.c") => ".c"
+inline std::string
+filename_extension(const std::string &str)
+{
+       std::string base = basename(str);
+       std::string::size_type pos = base.find_last_of('.');
+       if (pos == std::string::npos) return std::string();
+       return base.substr(pos);
+}
+
+// filename_sans_extension("/f.e/d.c") => "/f.e/d"
+inline std::string
+filename_sans_extension(const std::string &str)
+{
+       std::string base = basename(str);
+       std::string::size_type pos = base.find_last_of('.');
+       if (pos == std::string::npos) return str;
+       std::string dir = dirname(str);
+       if (dir == ".") return base.substr(0,pos);
+       return dir + ETL_DIRECTORY_SEPARATOR + base.substr(0,pos);
+}
+
 inline bool
 is_absolute_path(const std::string &path)
 {