evil: added evil_rename() a wrapper around rename().
authorChristophe Sadoine <chris@indefini.org>
Wed, 19 Jun 2013 06:47:20 +0000 (15:47 +0900)
committerCedric Bail <cedric.bail@samsung.com>
Tue, 25 Jun 2013 03:29:27 +0000 (12:29 +0900)
Signed-off-by: Cedric Bail <cedric.bail@samsung.com>
ChangeLog
NEWS
src/lib/evil/evil_stdio.c
src/lib/evil/evil_stdio.h

index 9ff23e9..9d02b31 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
        * Evas: optimized path for when map use the same color for all corner.
 
+2013-06-19  Christophe Sadoine
+
+       * Evil: Added evil_rename function, a wrapper around rename().
+
 2013-06-18  Cedric Bail
 
        * Evas: Use Eo array of callbacks to reduce edje memory foot print of Evas_Object_Box and Evas_Object_Table.
diff --git a/NEWS b/NEWS
index cd6dda8..be1b545 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@ Additions:
     * Add --with-api=XXX (both|legacy|eo)
     * Evil:
      - Add mkdtemp.
+     - Add evil_rename() a wrapper for rename().
     * eina:
      - Add DOCTYPE children parsing in eina_simple_xml
      - Add eina_barrier thread API
index 231e504..dd80004 100644 (file)
@@ -6,7 +6,7 @@
 #include "evil_private.h"
 
 #undef fopen
-
+#undef rename
 
 #ifdef _WIN32_WCE
 
@@ -199,3 +199,30 @@ int evil_fclose_native(FILE *stream)
 }
 
 #endif /* _WIN32_WCE */
+
+int 
+evil_rename(const char *src, const char* dst)
+{
+   struct stat st;
+
+   if (stat(dst, &st) < 0)
+        return rename(src, dst);
+
+   if (stat(src, &st) < 0)
+        return -1;
+
+   if (S_ISDIR(st.st_mode))
+     {
+        rmdir(dst);
+        return rename(src, dst);
+     }
+
+   if (S_ISREG(st.st_mode))
+     {
+        unlink(dst);
+        return rename(src, dst);
+     }
+
+   return -1;
+}
+
index 0baf00f..27c116e 100644 (file)
@@ -204,8 +204,26 @@ EAPI int evil_fclose_native(FILE *stream);
 
 
 /**
- * @}
+ * @brief Emulate the rename() function on Windows.
+ *
+ * @param src The old pathname.
+ * @param dst The new pathname.
+ * @return 0 on success, -1 otherwise.
+ *
+ * This function emulates the POSIX rename() function on Windows.
+ * The difference with the POSIX function is that the rename() function
+ * on windows fails if the destination exists.
+ *
+ * @since 1.8
+ */
+EAPI int evil_rename(const char *src, const char *dst);
+
+/**
+ * @def rename(src, dest)
+ *
+ * Wrapper around evil_rename().
  */
+# define rename(src, dst) evil_rename(src, dst)
 
 
 #endif /* __EVIL_STDIO_H__ */