converted more mixed tab/space indentations to tabs. only whitespace changes.
[blender.git] / source / blender / blenlib / intern / fileops.c
index ffebd05f2f607f722e509389f4d9eeb4c3dfff2f..2e0f4b483b14f2ade2c4a93b3a6a8fb78d4806b1 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  * ***** END GPL LICENSE BLOCK *****
  */
 
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/blenlib/intern/fileops.c
+ *  \ingroup bli
+ */
+
+
 #include <string.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdio.h>
-#include <stdlib.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <errno.h>
 
 #include "zlib.h"
 
 #ifdef WIN32
 
 #include "zlib.h"
 
 #ifdef WIN32
-#include "BLI_winstuff.h"
 #include <io.h>
 #include <io.h>
+#include "BLI_winstuff.h"
+#include "BLI_callbacks.h"
 #else
 #include <unistd.h> // for read close
 #include <sys/param.h>
 #endif
 
 #include "BLI_blenlib.h"
 #else
 #include <unistd.h> // for read close
 #include <sys/param.h>
 #endif
 
 #include "BLI_blenlib.h"
-#include "BLI_storage.h"
-#include "BLI_fileops.h"
-#include "BLI_callbacks.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
 
 #include "BKE_utildefines.h"
 
 #include "BKE_utildefines.h"
-#include <errno.h>
 
 #include "BLO_sys_types.h" // for intptr_t support
 
 
 #include "BLO_sys_types.h" // for intptr_t support
 
-/* implementations: */
-char *first_slash(char *string) {
-       char *ffslash, *fbslash;
-       
-       ffslash= strchr(string, '/');   
-       fbslash= strchr(string, '\\');
-       
-       if (!ffslash) return fbslash;
-       else if (!fbslash) return ffslash;
-       
-       if ((intptr_t)ffslash < (intptr_t)fbslash) return ffslash;
-       else return fbslash;
-}
-
-char *BLI_last_slash(const char *string) {
-       char *lfslash, *lbslash;
-       
-       lfslash= strrchr(string, '/');  
-       lbslash= strrchr(string, '\\');
-
-       if (!lfslash) return lbslash; 
-       else if (!lbslash) return lfslash;
-       
-       if ((intptr_t)lfslash < (intptr_t)lbslash) return lbslash;
-       else return lfslash;
-}
-
-/* adds a slash if there isnt one there alredy */
-void BLI_add_slash(char *string) {
-       int len = strlen(string);
-#ifdef WIN32
-       if (len==0 || string[len-1]!='\\') {
-               string[len] = '\\';
-               string[len+1] = '\0';
-       }
-#else
-       if (len==0 || string[len-1]!='/') {
-               string[len] = '/';
-               string[len+1] = '\0';
-       }
-#endif
-}
-
-/* removes a slash if there is one */
-void BLI_del_slash(char *string) {
-       int len = strlen(string);
-       while (len) {
-#ifdef WIN32
-               if (string[len-1]=='\\') {
-#else
-               if (string[len-1]=='/') {
-#endif
-                       string[len-1] = '\0';
-                       len--;
-               } else {
-                       break;
-               }
-       }
-}
 
 /* gzip the file in from and write it to "to". 
  return -1 if zlib fails, -2 if the originating file does not exist
  note: will remove the "from" file
   */
 
 /* gzip the file in from and write it to "to". 
  return -1 if zlib fails, -2 if the originating file does not exist
  note: will remove the "from" file
   */
-int BLI_gzip(char *from, char *to) {
+int BLI_gzip(const char *from, const char *to) {
        char buffer[10240];
        int file;
        int readsize = 0;
        char buffer[10240];
        int file;
        int readsize = 0;
+       int rval= 0, err;
+       gzFile gzfile;
        
        
-       gzFile gzfile = gzopen(to,"wb"); 
-       if (NULL == gzfile) return -1;
+       gzfile = gzopen(to, "wb"); 
+       if(gzfile == NULL)
+               return -1;
        
        
-       file = open(from,O_BINARY|O_RDONLY);
-       
-       if ( -1 == file )       return -2;
+       file = open(from, O_BINARY|O_RDONLY);
+       if(file < 0)
+               return -2;
 
 
-       while ( 1 )
-       {
+       while(1) {
                readsize = read(file, buffer, 10240);
                readsize = read(file, buffer, 10240);
+
+               if(readsize < 0) {
+                       rval= -2; /* error happened in reading */
+                       fprintf(stderr, "Error reading file %s: %s.\n", from, strerror(errno));
+                       break;
+               }
+               else if(readsize == 0)
+                       break; /* done reading */
                
                
-               if (readsize <= 0) break;
-               
-               gzwrite(gzfile,buffer,readsize);
+               if(gzwrite(gzfile, buffer, readsize) <= 0) {
+                       rval= -1; /* error happened in writing */
+                       fprintf(stderr, "Error writing gz file %s: %s.\n", to, gzerror(gzfile, &err));
+                       break;
+               }
        }
        
        gzclose(gzfile);
        close(file);
        }
        
        gzclose(gzfile);
        close(file);
-       
-       remove(from);
 
 
-       return 0;
+       return rval;
 }
 
 /* return 1 when file can be written */
 }
 
 /* return 1 when file can be written */
-int BLI_is_writable(char *filename)
+int BLI_is_writable(const char *filename)
 {
        int file;
        
 {
        int file;
        
+       /* first try to open without creating */
        file = open(filename, O_BINARY | O_RDWR, 0666);
        
        file = open(filename, O_BINARY | O_RDWR, 0666);
        
-       if (file < 0)
-               return 0;
+       if (file < 0) {
+               /* now try to open and create. a test without actually
+                * creating a file would be nice, but how? */
+               file = open(filename, O_BINARY | O_RDWR | O_CREAT, 0666);
+               
+               if(file < 0) {
+                       return 0;
+               }
+               else {
+                       /* success, delete the file we create */
+                       close(file);
+                       BLI_delete(filename, 0, 0);
+                       return 1;
+               }
+       }
        else {
                close(file);
                return 1;
        else {
                close(file);
                return 1;
@@ -165,13 +133,13 @@ int BLI_is_writable(char *filename)
 
 int BLI_touch(const char *file)
 {
 
 int BLI_touch(const char *file)
 {
-   FILE *f = fopen(file,"r+b");
-   if (f != NULL) {
+       FILE *f = fopen(file,"r+b");
+       if (f != NULL) {
                char c = getc(f);
                rewind(f);
                putc(c,f);
        } else {
                char c = getc(f);
                rewind(f);
                putc(c,f);
        } else {
-          f = fopen(file,"wb");
+               f = fopen(file,"wb");
        }
        if (f) {
                fclose(f);
        }
        if (f) {
                fclose(f);
@@ -180,11 +148,15 @@ int BLI_touch(const char *file)
        return 0;
 }
 
        return 0;
 }
 
+int BLI_exists(const char *file) {
+       return BLI_exist(file);
+}
+
 #ifdef WIN32
 
 static char str[MAXPATHLEN+12];
 
 #ifdef WIN32
 
 static char str[MAXPATHLEN+12];
 
-int BLI_delete(char *file, int dir, int recursive) {
+int BLI_delete(const char *file, int dir, int recursive) {
        int err;
 
        if (recursive) {
        int err;
 
        if (recursive) {
@@ -201,7 +173,7 @@ int BLI_delete(char *file, int dir, int recursive) {
        return err;
 }
 
        return err;
 }
 
-int BLI_move(char *file, char *to) {
+int BLI_move(const char *file, const char *to) {
        int err;
 
        // windows doesn't support moveing to a directory
        int err;
 
        // windows doesn't support moveing to a directory
@@ -226,7 +198,7 @@ int BLI_move(char *file, char *to) {
 }
 
 
 }
 
 
-int BLI_copy_fileops(char *file, char *to) {
+int BLI_copy_fileops(const char *file, const char *to) {
        int err;
 
        // windows doesn't support copying to a directory
        int err;
 
        // windows doesn't support copying to a directory
@@ -251,17 +223,14 @@ int BLI_copy_fileops(char *file, char *to) {
        return err;
 }
 
        return err;
 }
 
-int BLI_link(char *file, char *to) {
+int BLI_link(const char *file, const char *to) {
        callLocalErrorCallBack("Linking files is unsupported on Windows");
        callLocalErrorCallBack("Linking files is unsupported on Windows");
-       
+       (void)file;
+       (void)to;
        return 1;
 }
 
        return 1;
 }
 
-int BLI_exists(char *file) {
-       return (GetFileAttributes(file) != 0xFFFFFFFF);
-}
-
-void BLI_recurdir_fileops(char *dirname) {
+void BLI_recurdir_fileops(const char *dirname) {
        char *lslash;
        char tmp[MAXPATHLEN];
        
        char *lslash;
        char tmp[MAXPATHLEN];
        
@@ -291,69 +260,65 @@ void BLI_recurdir_fileops(char *dirname) {
                        callLocalErrorCallBack("Unable to create directory\n");
 }
 
                        callLocalErrorCallBack("Unable to create directory\n");
 }
 
-int BLI_rename(char *from, char *to) {
+int BLI_rename(const char *from, const char *to) {
        if (!BLI_exists(from)) return 0;
 
        /* make sure the filenames are different (case insensitive) before removing */
        if (BLI_exists(to) && BLI_strcasecmp(from, to))
                if(BLI_delete(to, 0, 0)) return 1;
        if (!BLI_exists(from)) return 0;
 
        /* make sure the filenames are different (case insensitive) before removing */
        if (BLI_exists(to) && BLI_strcasecmp(from, to))
                if(BLI_delete(to, 0, 0)) return 1;
-               
+
        return rename(from, to);
 }
 
        return rename(from, to);
 }
 
-#else /* The sane UNIX world */
+#else /* The UNIX world */
 
 /*
 
 /*
- * but the sane UNIX world is tied to the interface, and the system
+ * but the UNIX world is tied to the interface, and the system
  * timer, and... We implement a callback mechanism. The system will
  * have to initialise the callback before the functions will work!
  * */
  * timer, and... We implement a callback mechanism. The system will
  * have to initialise the callback before the functions will work!
  * */
-static char str[MAXPATHLEN+12];
+static char str[12 + (MAXPATHLEN * 2)];
 
 
-int BLI_delete(char *file, int dir, int recursive) 
+int BLI_delete(const char *file, int dir, int recursive) 
 {
        if(strchr(file, '"')) {
                printf("Error: not deleted file %s because of quote!\n", file);
        }
        else {
                if (recursive) {
 {
        if(strchr(file, '"')) {
                printf("Error: not deleted file %s because of quote!\n", file);
        }
        else {
                if (recursive) {
-                       sprintf(str, "/bin/rm -rf \"%s\"", file);
+                       BLI_snprintf(str, sizeof(str), "/bin/rm -rf \"%s\"", file);
                        return system(str);
                }
                else if (dir) {
                        return system(str);
                }
                else if (dir) {
-                       sprintf(str, "/bin/rmdir \"%s\"", file);
+                       BLI_snprintf(str, sizeof(str), "/bin/rmdir \"%s\"", file);
                        return system(str);
                }
                else {
                        return system(str);
                }
                else {
-                       return remove(file); //sprintf(str, "/bin/rm -f \"%s\"", file);
+                       return remove(file); //BLI_snprintf(str, sizeof(str), "/bin/rm -f \"%s\"", file);
                }
        }
        return -1;
 }
 
                }
        }
        return -1;
 }
 
-int BLI_move(char *file, char *to) {
-       sprintf(str, "/bin/mv -f \"%s\" \"%s\"", file, to);
+int BLI_move(const char *file, const char *to) {
+       BLI_snprintf(str, sizeof(str), "/bin/mv -f \"%s\" \"%s\"", file, to);
 
        return system(str);
 }
 
 
        return system(str);
 }
 
-int BLI_copy_fileops(char *file, char *to) {
-       sprintf(str, "/bin/cp -rf \"%s\" \"%s\"", file, to);
+int BLI_copy_fileops(const char *file, const char *to) {
+       BLI_snprintf(str, sizeof(str), "/bin/cp -rf \"%s\" \"%s\"", file, to);
 
        return system(str);
 }
 
 
        return system(str);
 }
 
-int BLI_link(char *file, char *to) {
-       sprintf(str, "/bin/ln -f \"%s\" \"%s\"", file, to);
+int BLI_link(const char *file, const char *to) {
+       BLI_snprintf(str, sizeof(str), "/bin/ln -f \"%s\" \"%s\"", file, to);
        
        return system(str);
 }
 
        
        return system(str);
 }
 
-int BLI_exists(char *file) {
-       return BLI_exist(file);
-}
-
-void BLI_recurdir_fileops(char *dirname) {
+void BLI_recurdir_fileops(const char *dirname) {
        char *lslash;
        char tmp[MAXPATHLEN];
                
        char *lslash;
        char tmp[MAXPATHLEN];
                
@@ -371,11 +336,11 @@ void BLI_recurdir_fileops(char *dirname) {
        mkdir(dirname, 0777);
 }
 
        mkdir(dirname, 0777);
 }
 
-int BLI_rename(char *from, char *to) {
+int BLI_rename(const char *from, const char *to) {
        if (!BLI_exists(from)) return 0;
        
        if (BLI_exists(to))     if(BLI_delete(to, 0, 0)) return 1;
        if (!BLI_exists(from)) return 0;
        
        if (BLI_exists(to))     if(BLI_delete(to, 0, 0)) return 1;
-               
+
        return rename(from, to);
 }
 
        return rename(from, to);
 }