[Bf-blender-cvs] [c5018c6] master: BLI_fileops: Some fixes and cleanup.

Bastien Montagne noreply at git.blender.org
Mon Aug 24 22:18:50 CEST 2015


Commit: c5018c65b97c93810c7c90f5db11ae1cc10900f3
Author: Bastien Montagne
Date:   Mon Aug 24 22:09:01 2015 +0200
Branches: master
https://developer.blender.org/rBc5018c65b97c93810c7c90f5db11ae1cc10900f3

BLI_fileops: Some fixes and cleanup.

* Fix BLI_file_touch, used to add one dummy byte ((unsigned char)EOF) to empty files!
* Get rid of static global temp string in WIN32 area (very bad, and useless!).
* Get rid of paranoid NULL checks in WIN32's BLI_gzopen().
* Add non-relative filename asserts to WIN32 file operations too.
* ifdef-out BLI_move and BLI_create_symlink, unused (and the later is not even implemented for windows).

Partly based on patch and points raised by Jason Wilkins (jwilkins) in T32870, thanks!

===================================================================

M	source/blender/blenlib/BLI_fileops.h
M	source/blender/blenlib/intern/fileops.c

===================================================================

diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index ba59c41..33dae45 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -58,8 +58,10 @@ int    BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 int    BLI_copy(const char *path, const char *to) ATTR_NONNULL();
 int    BLI_rename(const char *from, const char *to) ATTR_NONNULL();
 int    BLI_delete(const char *path, bool dir, bool recursive) ATTR_NONNULL();
+#if 0  /* Unused */
 int    BLI_move(const char *path, const char *to) ATTR_NONNULL();
 int    BLI_create_symlink(const char *path, const char *to) ATTR_NONNULL();
+#endif
 
 /* keep in sync with the definition of struct direntry in BLI_fileops_types.h */
 #ifdef WIN32
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index bb75db7..bc95216 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -193,15 +193,25 @@ bool BLI_file_is_writable(const char *filename)
 
 /**
  * Creates the file with nothing in it, or updates its last-modified date if it already exists.
- * Returns true if successful. (like the unix touch command)
+ * Returns true if successful (like the unix touch command).
  */
 bool BLI_file_touch(const char *file)
 {
 	FILE *f = BLI_fopen(file, "r+b");
+
 	if (f != NULL) {
 		int c = getc(f);
-		rewind(f);
-		putc(c, f);
+
+		if (c == EOF) {
+			/* Empty file, reopen in truncate write mode... */
+			fclose(f);
+			f = BLI_fopen(file, "w+b");
+		}
+		else {
+			/* Otherwise, rewrite first byte. */
+			rewind(f);
+			putc(c, f);
+		}
 	}
 	else {
 		f = BLI_fopen(file, "wb");
@@ -220,10 +230,10 @@ static void callLocalErrorCallBack(const char *err)
 	printf("%s\n", err);
 }
 
-static char str[MAXPATHLEN + 12];
-
 FILE *BLI_fopen(const char *filename, const char *mode)
 {
+	BLI_assert(!BLI_path_is_rel(filename));
+
 	return ufopen(filename, mode);
 }
 
@@ -247,41 +257,42 @@ void *BLI_gzopen(const char *filename, const char *mode)
 {
 	gzFile gzfile;
 
-	if (!filename || !mode) {
-		return 0;
-	}
-	else {
-		/* xxx Creates file before transcribing the path */
-		if (mode[0] == 'w')
-			fclose(ufopen(filename, "a"));
+	BLI_assert(!BLI_path_is_rel(filename));
 
-		/* temporary #if until we update all libraries to 1.2.7
-		 * for correct wide char path handling */
+	/* xxx Creates file before transcribing the path */
+	if (mode[0] == 'w')
+		fclose(ufopen(filename, "a"));
+
+	/* temporary #if until we update all libraries to 1.2.7
+	 * for correct wide char path handling */
 #if ZLIB_VERNUM >= 0x1270 && !defined(FREE_WINDOWS)
-		UTF16_ENCODE(filename);
+	UTF16_ENCODE(filename);
 
-		gzfile = gzopen_w(filename_16, mode);
+	gzfile = gzopen_w(filename_16, mode);
 
-		UTF16_UN_ENCODE(filename);
+	UTF16_UN_ENCODE(filename);
 #else
-		{
-			char short_name[256];
-			BLI_get_short_name(short_name, filename);
-			gzfile = gzopen(short_name, mode);
-		}
-#endif
+	{
+		char short_name[256];
+		BLI_get_short_name(short_name, filename);
+		gzfile = gzopen(short_name, mode);
 	}
+#endif
 
 	return gzfile;
 }
 
 int   BLI_open(const char *filename, int oflag, int pmode)
 {
+	BLI_assert(!BLI_path_is_rel(filename));
+
 	return uopen(filename, oflag, pmode);
 }
 
 int   BLI_access(const char *filename, int mode)
 {
+	BLI_assert(!BLI_path_is_rel(filename));
+
 	return uaccess(filename, mode);
 }
 
@@ -351,6 +362,8 @@ int BLI_delete(const char *file, bool dir, bool recursive)
 {
 	int err;
 
+	BLI_assert(!BLI_path_is_rel(file));
+
 	if (recursive) {
 		err = delete_recursive(file);
 	}
@@ -365,6 +378,7 @@ int BLI_delete(const char *file, bool dir, bool recursive)
 #if 0
 int BLI_move(const char *file, const char *to)
 {
+	char str[MAXPATHLEN + 12];
 	int err;
 
 	/* windows doesn't support moving to a directory
@@ -396,6 +410,7 @@ int BLI_move(const char *file, const char *to)
 
 int BLI_copy(const char *file, const char *to)
 {
+	char str[MAXPATHLEN + 12];
 	int err;
 
 	/* windows doesn't support copying to a directory
@@ -424,13 +439,16 @@ int BLI_copy(const char *file, const char *to)
 	return err;
 }
 
+#if 0
 int BLI_create_symlink(const char *file, const char *to)
 {
+	/* See patch from T30870, should this ever become needed. */
 	callLocalErrorCallBack("Linking files is unsupported on Windows");
 	(void)file;
 	(void)to;
 	return 1;
 }
+#endif
 
 /** \return true on success (i.e. given path now exists on FS), false otherwise. */
 bool BLI_dir_create_recursive(const char *dirname)
@@ -968,10 +986,12 @@ int BLI_copy(const char *file, const char *to)
 	return ret;
 }
 
+#if 0
 int BLI_create_symlink(const char *file, const char *to)
 {
 	return symlink(to, file);
 }
+#endif
 
 /** \return true on success (i.e. given path now exists on FS), false otherwise. */
 bool BLI_dir_create_recursive(const char *dirname)




More information about the Bf-blender-cvs mailing list