Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-10-29 19:46:14 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-10-29 19:46:14 +0400
commit16702c172939a399ddd0e61fc14a8b0944c4249b (patch)
tree130c9c0e6f62af167309f22f720a4f7deacd8f2d /source/blender/blenlib/intern
parentf0ca79bccb5e8290d02318b81aebdeb713180886 (diff)
parentf1cea89d99f0c80bdccd2ba1359142b5ff14cdb9 (diff)
Merged changes in the trunk up to revision 41225.
Conflicts resolved: source/blender/render/intern/source/pipeline.c
Diffstat (limited to 'source/blender/blenlib/intern')
-rw-r--r--source/blender/blenlib/intern/BLI_args.c3
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c9
-rw-r--r--source/blender/blenlib/intern/bpath.c2
-rw-r--r--source/blender/blenlib/intern/fileops.c59
-rw-r--r--source/blender/blenlib/intern/freetypefont.c2
-rw-r--r--source/blender/blenlib/intern/path_util.c136
-rw-r--r--source/blender/blenlib/intern/storage.c47
-rw-r--r--source/blender/blenlib/intern/string_utf8.c295
-rw-r--r--source/blender/blenlib/intern/winstuff.c2
9 files changed, 466 insertions, 89 deletions
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index cf3605a80ff..00903aa42cd 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -35,12 +35,13 @@
#include <ctype.h> /* for tolower */
+#include <string.h>
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
-#include "BLI_utildefines.h"
#include "BLI_args.h"
#include "BLI_ghash.h"
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 03e3b7ab560..e34abaf15f9 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -32,11 +32,20 @@
* \ingroup bli
*/
+#include <string.h>
+#include <stdlib.h>
+
#include "MEM_guardedalloc.h"
+
+
+// #include "BLI_blenlib.h"
+
+#include "BLI_mempool.h"
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
+
#include "BLO_sys_types.h" // for intptr_t support
/***/
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index 65b9ba9ea4a..624b726e27e 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -967,7 +967,7 @@ void findMissingFiles(Main *bmain, const char *str)
//XXX waitcursor( 1 );
- BLI_split_dirfile(str, dirname, NULL, sizeof(dirname), 0);
+ BLI_split_dir_part(str, dirname, sizeof(dirname));
BLI_bpathIterator_init(&bpi, bmain, bmain->name, 0);
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index 9ccd7fbe121..fef102d8267 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -65,7 +65,8 @@
return -1 if zlib fails, -2 if the originating file does not exist
note: will remove the "from" file
*/
-int BLI_gzip(const char *from, const char *to) {
+int BLI_file_gzip(const char *from, const char *to)
+{
char buffer[10240];
int file;
int readsize = 0;
@@ -109,7 +110,7 @@ int BLI_gzip(const char *from, const char *to) {
/* gzip the file in from_file and write it to memery to_mem, at most size bytes.
return the unziped size
*/
-char *BLI_ungzip_to_mem(const char *from_file, int *size_r)
+char *BLI_file_ungzip_to_mem(const char *from_file, int *size_r)
{
gzFile gzfile;
int readsize, size, alloc_size=0;
@@ -150,7 +151,7 @@ char *BLI_ungzip_to_mem(const char *from_file, int *size_r)
/* return 1 when file can be written */
-int BLI_is_writable(const char *filename)
+int BLI_file_is_writable(const char *filename)
{
int file;
@@ -178,7 +179,7 @@ int BLI_is_writable(const char *filename)
}
}
-int BLI_touch(const char *file)
+int BLI_file_touch(const char *file)
{
FILE *f = fopen(file,"r+b");
if (f != NULL) {
@@ -195,15 +196,12 @@ int BLI_touch(const char *file)
return 0;
}
-int BLI_exists(const char *file) {
- return BLI_exist(file);
-}
-
#ifdef WIN32
static char str[MAXPATHLEN+12];
-int BLI_delete(const char *file, int dir, int recursive) {
+int BLI_delete(const char *file, int dir, int recursive)
+{
int err;
if (recursive) {
@@ -220,14 +218,15 @@ int BLI_delete(const char *file, int dir, int recursive) {
return err;
}
-int BLI_move(const char *file, const char *to) {
+int BLI_move(const char *file, const char *to)
+{
int err;
// windows doesn't support moveing to a directory
// it has to be 'mv filename filename' and not
// 'mv filename destdir'
- strcpy(str, to);
+ BLI_strncpy(str, to, sizeof(str));
// points 'to' to a directory ?
if (BLI_last_slash(str) == (str + strlen(str) - 1)) {
if (BLI_last_slash(file) != NULL) {
@@ -245,14 +244,15 @@ int BLI_move(const char *file, const char *to) {
}
-int BLI_copy_fileops(const char *file, const char *to) {
+int BLI_copy(const char *file, const char *to)
+{
int err;
// windows doesn't support copying to a directory
// it has to be 'cp filename filename' and not
// 'cp filename destdir'
- strcpy(str, to);
+ BLI_strncpy(str, to, sizeof(str));
// points 'to' to a directory ?
if (BLI_last_slash(str) == (str + strlen(str) - 1)) {
if (BLI_last_slash(file) != NULL) {
@@ -270,14 +270,16 @@ int BLI_copy_fileops(const char *file, const char *to) {
return err;
}
-int BLI_link(const char *file, const char *to) {
+int BLI_create_symlink(const char *file, const char *to)
+{
callLocalErrorCallBack("Linking files is unsupported on Windows");
(void)file;
(void)to;
return 1;
}
-void BLI_recurdir_fileops(const char *dirname) {
+void BLI_dir_create_recursive(const char *dirname)
+{
char *lslash;
char tmp[MAXPATHLEN];
@@ -286,7 +288,7 @@ void BLI_recurdir_fileops(const char *dirname) {
// blah1/blah2/ (with slash) after creating
// blah1/blah2 (without slash)
- strcpy(tmp, dirname);
+ BLI_strncpy(tmp, dirname, sizeof(tmp));
lslash= BLI_last_slash(tmp);
if (lslash == tmp + strlen(tmp) - 1) {
@@ -299,7 +301,7 @@ void BLI_recurdir_fileops(const char *dirname) {
if (lslash) {
/* Split about the last slash and recurse */
*lslash = 0;
- BLI_recurdir_fileops(tmp);
+ BLI_dir_create_recursive(tmp);
}
if(dirname[0]) /* patch, this recursive loop tries to create a nameless directory */
@@ -307,7 +309,8 @@ void BLI_recurdir_fileops(const char *dirname) {
callLocalErrorCallBack("Unable to create directory\n");
}
-int BLI_rename(const char *from, const 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 */
@@ -347,43 +350,48 @@ int BLI_delete(const char *file, int dir, int recursive)
return -1;
}
-int BLI_move(const char *file, const char *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);
}
-int BLI_copy_fileops(const char *file, const char *to) {
+int BLI_copy(const char *file, const char *to)
+{
BLI_snprintf(str, sizeof(str), "/bin/cp -rf \"%s\" \"%s\"", file, to);
return system(str);
}
-int BLI_link(const char *file, const char *to) {
+int BLI_create_symlink(const char *file, const char *to)
+{
BLI_snprintf(str, sizeof(str), "/bin/ln -f \"%s\" \"%s\"", file, to);
return system(str);
}
-void BLI_recurdir_fileops(const char *dirname) {
+void BLI_dir_create_recursive(const char *dirname)
+{
char *lslash;
char tmp[MAXPATHLEN];
if (BLI_exists(dirname)) return;
- strcpy(tmp, dirname);
+ BLI_strncpy(tmp, dirname, sizeof(tmp));
lslash= BLI_last_slash(tmp);
if (lslash) {
/* Split about the last slash and recurse */
*lslash = 0;
- BLI_recurdir_fileops(tmp);
+ BLI_dir_create_recursive(tmp);
}
mkdir(dirname, 0777);
}
-int BLI_rename(const char *from, const 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;
@@ -392,3 +400,4 @@ int BLI_rename(const char *from, const char *to) {
}
#endif
+
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index 0fe028eb3c0..7e5d03423e5 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -364,7 +364,7 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
// get the name
fontname = FT_Get_Postscript_Name(face);
- strcpy(vfd->name, (fontname == NULL) ? "" : fontname);
+ BLI_strncpy(vfd->name, (fontname == NULL) ? "" : fontname, sizeof(vfd->name));
// Extract the first 256 character from TTF
lcode= charcode= FT_Get_First_Char(face, &glyph_index);
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 21f91ce8f14..d28c1e29820 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -41,13 +41,11 @@
#include "MEM_guardedalloc.h"
-#include "DNA_userdef_types.h"
+#include "DNA_listBase.h"
#include "BLI_fileops.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
-#include "BLI_storage.h"
-#include "BLI_storage_types.h"
#include "BLI_utildefines.h"
#include "BKE_utildefines.h"
@@ -84,10 +82,24 @@
#endif /* WIN32 */
+/* standard paths */
+#ifdef WIN32
+#define BLENDER_USER_FORMAT "%s\\Blender Foundation\\Blender\\%s"
+#define BLENDER_SYSTEM_FORMAT "%s\\Blender Foundation\\Blender\\%s"
+#elif defined(__APPLE__)
+#define BLENDER_USER_FORMAT "%s/Blender/%s"
+#define BLENDER_SYSTEM_FORMAT "%s/Blender/%s"
+#else
+#define BLENDER_USER_FORMAT "%s/.blender/%s"
+#define BLENDER_SYSTEM_FORMAT "%s/blender/%s"
+#endif
+
/* local */
#define UNIQUE_NAME_MAX 128
-extern char bprogname[];
+static char bprogname[FILE_MAX]; /* path to program executable */
+static char bprogdir[FILE_MAX]; /* path in which executable is located */
+static char btempdir[FILE_MAX]; /* temporary directory */
static int add_win32_extension(char *name);
static char *blender_version_decimal(const int ver);
@@ -726,7 +738,7 @@ int BLI_path_cwd(char *path)
if (wasrelative==1) {
char cwd[FILE_MAXDIR + FILE_MAXFILE]= "";
- BLI_getwdN(cwd, sizeof(cwd)); /* incase the full path to the blend isnt used */
+ BLI_current_working_dir(cwd, sizeof(cwd)); /* incase the full path to the blend isnt used */
if (cwd[0] == '\0') {
printf( "Could not get the current working directory - $PWD for an unknown reason.");
@@ -875,7 +887,6 @@ static int test_env_path(char *path, const char *envvar)
static int get_path_local(char *targetpath, const char *folder_name, const char *subfolder_name, const int ver)
{
- char bprogdir[FILE_MAX];
char relfolder[FILE_MAX];
#ifdef PATH_DEBUG2
@@ -892,10 +903,7 @@ static int get_path_local(char *targetpath, const char *folder_name, const char
else {
relfolder[0]= '\0';
}
-
- /* use argv[0] (bprogname) to get the path to the executable */
- BLI_split_dirfile(bprogname, bprogdir, NULL, sizeof(bprogdir), 0);
-
+
/* try EXECUTABLE_DIR/2.5x/folder_name - new default directory for local blender installed files */
if(test_path(targetpath, bprogdir, blender_version_decimal(ver), relfolder))
return 1;
@@ -963,10 +971,6 @@ static int get_path_system(char *targetpath, const char *folder_name, const char
* these are only used when running blender from source */
char cwd[FILE_MAX];
char relfolder[FILE_MAX];
- char bprogdir[FILE_MAX];
-
- /* use argv[0] (bprogname) to get the path to the executable */
- BLI_split_dirfile(bprogname, bprogdir, NULL, sizeof(bprogdir), 0);
if(folder_name) {
if (subfolder_name) {
@@ -980,7 +984,7 @@ static int get_path_system(char *targetpath, const char *folder_name, const char
}
/* try CWD/release/folder_name */
- if(BLI_getwdN(cwd, sizeof(cwd))) {
+ if(BLI_current_working_dir(cwd, sizeof(cwd))) {
if(test_path(targetpath, cwd, "release", relfolder)) {
return 1;
}
@@ -1111,7 +1115,7 @@ char *BLI_get_folder_create(int folder_id, const char *subfolder)
if (!path) {
path = BLI_get_user_folder_notest(folder_id, subfolder);
- if (path) BLI_recurdir_fileops(path);
+ if (path) BLI_dir_create_recursive(path);
}
return path;
@@ -1244,7 +1248,7 @@ void BLI_make_existing_file(const char *name)
/* test exist */
if (BLI_exists(di) == 0) {
- BLI_recurdir_fileops(di);
+ BLI_dir_create_recursive(di);
}
}
@@ -1253,9 +1257,18 @@ void BLI_make_file_string(const char *relabase, char *string, const char *dir,
{
int sl;
- if (!string || !dir || !file) return; /* We don't want any NULLs */
-
- string[0]= 0; /* ton */
+ if (string) {
+ /* ensure this is always set even if dir/file are NULL */
+ string[0]= '\0';
+
+ if (ELEM(NULL, dir, file)) {
+ return; /* We don't want any NULLs */
+ }
+ }
+ else {
+ return; /* string is NULL, probably shouldnt happen but return anyway */
+ }
+
/* we first push all slashes into unix mode, just to make sure we don't get
any mess with slashes later on. -jesterKing */
@@ -1430,6 +1443,16 @@ void BLI_split_dirfile(const char *string, char *dir, char *file, const size_t d
}
}
+void BLI_split_dir_part(const char *string, char *dir, const size_t dirlen)
+{
+ BLI_split_dirfile(string, dir, NULL, dirlen, 0);
+}
+
+void BLI_split_file_part(const char *string, char *file, const size_t filelen)
+{
+ BLI_split_dirfile(string, NULL, file, 0, filelen);
+}
+
/* simple appending of filename to dir, does not check for valid path! */
void BLI_join_dirfile(char *dst, const size_t maxlen, const char *dir, const char *file)
{
@@ -1516,7 +1539,7 @@ int BKE_rebase_path(char *abs, size_t abs_len, char *rel, size_t rel_len, const
if (rel)
rel[0]= 0;
- BLI_split_dirfile(base_dir, blend_dir, NULL, sizeof(blend_dir), 0);
+ BLI_split_dir_part(base_dir, blend_dir, sizeof(blend_dir));
if (src_dir[0]=='\0')
return 0;
@@ -1631,7 +1654,7 @@ static int add_win32_extension(char *name)
int retval = 0;
int type;
- type = BLI_exist(name);
+ type = BLI_exists(name);
if ((type == 0) || S_ISDIR(type)) {
#ifdef _WIN32
char filename[FILE_MAXDIR+FILE_MAXFILE];
@@ -1651,7 +1674,7 @@ static int add_win32_extension(char *name)
strcat(filename, extensions);
}
- type = BLI_exist(filename);
+ type = BLI_exists(filename);
if (type && (! S_ISDIR(type))) {
retval = 1;
strcpy(name, filename);
@@ -1667,8 +1690,19 @@ static int add_win32_extension(char *name)
return (retval);
}
-/* filename must be FILE_MAX length minimum */
-void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name)
+/*
+* Checks if name is a fully qualified filename to an executable.
+* If not it searches $PATH for the file. On Windows it also
+* adds the correct extension (.com .exe etc) from
+* $PATHEXT if necessary. Also on Windows it translates
+* the name to its 8.3 version to prevent problems with
+* spaces and stuff. Final result is returned in fullname.
+*
+* @param fullname The full path and full name of the executable
+* (must be FILE_MAX minimum)
+* @param name The name of the executable (usually argv[0]) to be checked
+*/
+static void bli_where_am_i(char *fullname, const size_t maxlen, const char *name)
{
char filename[FILE_MAXDIR+FILE_MAXFILE];
const char *path = NULL, *temp;
@@ -1705,7 +1739,7 @@ void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name)
BLI_strncpy(fullname, name, maxlen);
if (name[0] == '.') {
char wdir[FILE_MAX]= "";
- BLI_getwdN(wdir, sizeof(wdir)); /* backup cwd to restore after */
+ BLI_current_working_dir(wdir, sizeof(wdir)); /* backup cwd to restore after */
// not needed but avoids annoying /./ in name
if(name[1]==SEP)
@@ -1748,12 +1782,37 @@ void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name)
}
}
-void BLI_where_is_temp(char *fullname, const size_t maxlen, int usertemp)
+void BLI_init_program_path(const char *argv0)
+{
+ bli_where_am_i(bprogname, sizeof(bprogname), argv0);
+ BLI_split_dir_part(bprogname, bprogdir, sizeof(bprogdir));
+}
+
+const char *BLI_program_path(void)
+{
+ return bprogname;
+}
+
+const char *BLI_program_dir(void)
+{
+ return bprogdir;
+}
+
+/**
+* Gets the temp directory when blender first runs.
+* If the default path is not found, use try $TEMP
+*
+* Also make sure the temp dir has a trailing slash
+*
+* @param fullname The full path to the temp directory
+* @param userdir Directory specified in user preferences
+*/
+void BLI_where_is_temp(char *fullname, const size_t maxlen, char *userdir)
{
fullname[0] = '\0';
- if (usertemp && BLI_is_dir(U.tempdir)) {
- BLI_strncpy(fullname, U.tempdir, maxlen);
+ if (userdir && BLI_is_dir(userdir)) {
+ BLI_strncpy(fullname, userdir, maxlen);
}
@@ -1787,13 +1846,28 @@ void BLI_where_is_temp(char *fullname, const size_t maxlen, int usertemp)
/* add a trailing slash if needed */
BLI_add_slash(fullname);
#ifdef WIN32
- if(U.tempdir != fullname) {
- BLI_strncpy(U.tempdir, fullname, maxlen); /* also set user pref to show %TEMP%. /tmp/ is just plain confusing for Windows users. */
+ if(userdir != fullname) {
+ BLI_strncpy(userdir, fullname, maxlen); /* also set user pref to show %TEMP%. /tmp/ is just plain confusing for Windows users. */
}
#endif
}
}
+void BLI_init_temporary_dir(char *userdir)
+{
+ BLI_where_is_temp(btempdir, FILE_MAX, userdir);
+}
+
+const char *BLI_temporary_dir(void)
+{
+ return btempdir;
+}
+
+void BLI_system_temporary_dir(char *dir)
+{
+ BLI_where_is_temp(dir, FILE_MAX, NULL);
+}
+
#ifdef WITH_ICONV
void BLI_string_to_utf8(char *original, char *utf_8, const char *code)
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index e336b914ffa..b3caeb71822 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -88,10 +88,9 @@
#include "DNA_listBase.h"
+#include "BLI_fileops.h"
#include "BLI_listbase.h"
#include "BLI_linklist.h"
-#include "BLI_storage.h"
-#include "BLI_storage_types.h"
#include "BLI_string.h"
#include "BKE_utildefines.h"
@@ -104,7 +103,7 @@ static struct ListBase dirbase_={NULL, NULL};
static struct ListBase *dirbase = &dirbase_;
/* can return NULL when the size is not big enough */
-char *BLI_getwdN(char *dir, const int maxncpy)
+char *BLI_current_working_dir(char *dir, const int maxncpy)
{
const char *pwd= getenv("PWD");
if (pwd){
@@ -116,7 +115,7 @@ char *BLI_getwdN(char *dir, const int maxncpy)
}
-int BLI_compare(struct direntry *entry1, struct direntry *entry2)
+static int bli_compare(struct direntry *entry1, struct direntry *entry2)
{
/* type is equal to stat.st_mode */
@@ -143,7 +142,7 @@ int BLI_compare(struct direntry *entry1, struct direntry *entry2)
}
-double BLI_diskfree(const char *dir)
+double BLI_dir_free_space(const char *dir)
{
#ifdef WIN32
DWORD sectorspc, bytesps, freec, clusters;
@@ -198,7 +197,7 @@ double BLI_diskfree(const char *dir)
#endif
}
-void BLI_builddir(const char *dirname, const char *relname)
+static void bli_builddir(const char *dirname, const char *relname)
{
struct dirent *fname;
struct dirlink *dlink;
@@ -273,7 +272,7 @@ void BLI_builddir(const char *dirname, const char *relname)
}
BLI_freelist(dirbase);
- if (files) qsort(files, actnum, sizeof(struct direntry), (int (*)(const void *,const void*))BLI_compare);
+ if (files) qsort(files, actnum, sizeof(struct direntry), (int (*)(const void *,const void*))bli_compare);
} else {
printf("%s empty directory\n",dirname);
}
@@ -284,7 +283,7 @@ void BLI_builddir(const char *dirname, const char *relname)
}
}
-void BLI_adddirstrings(void)
+static void bli_adddirstrings(void)
{
char datum[100];
char buf[512];
@@ -304,15 +303,15 @@ void BLI_adddirstrings(void)
for(num=0, file= files; num<actnum; num++, file++){
#ifdef WIN32
mode = 0;
- strcpy(file->mode1, types[0]);
- strcpy(file->mode2, types[0]);
- strcpy(file->mode3, types[0]);
+ BLI_strncpy(file->mode1, types[0], sizeof(file->mode1));
+ BLI_strncpy(file->mode2, types[0], sizeof(file->mode2));
+ BLI_strncpy(file->mode3, types[0], sizeof(file->mode3));
#else
mode = file->s.st_mode;
- strcpy(file->mode1, types[(mode & 0700) >> 6]);
- strcpy(file->mode2, types[(mode & 0070) >> 3]);
- strcpy(file->mode3, types[(mode & 0007)]);
+ BLI_strncpy(file->mode1, types[(mode & 0700) >> 6], sizeof(file->mode1));
+ BLI_strncpy(file->mode2, types[(mode & 0070) >> 3], sizeof(file->mode2));
+ BLI_strncpy(file->mode3, types[(mode & 0007)], sizeof(file->mode3));
if (((mode & S_ISGID) == S_ISGID) && (file->mode2[2]=='-'))file->mode2[2]='l';
@@ -392,7 +391,7 @@ void BLI_adddirstrings(void)
}
}
-unsigned int BLI_getdir(const char *dirname, struct direntry **filelist)
+unsigned int BLI_dir_contents(const char *dirname, struct direntry **filelist)
{
// reset global variables
// memory stored in files is free()'d in
@@ -401,8 +400,8 @@ unsigned int BLI_getdir(const char *dirname, struct direntry **filelist)
actnum = totnum = 0;
files = NULL;
- BLI_builddir(dirname,"");
- BLI_adddirstrings();
+ bli_builddir(dirname,"");
+ bli_adddirstrings();
if (files) {
*(filelist) = files;
@@ -416,7 +415,7 @@ unsigned int BLI_getdir(const char *dirname, struct direntry **filelist)
}
-size_t BLI_filesize(int file)
+size_t BLI_file_descriptor_size(int file)
{
struct stat buf;
@@ -425,20 +424,20 @@ size_t BLI_filesize(int file)
return (buf.st_size);
}
-size_t BLI_filepathsize(const char *path)
+size_t BLI_file_size(const char *path)
{
int size, file = open(path, O_BINARY|O_RDONLY);
if (file == -1)
return -1;
- size = BLI_filesize(file);
+ size = BLI_file_descriptor_size(file);
close(file);
return size;
}
-int BLI_exist(const char *name)
+int BLI_exists(const char *name)
{
#if defined(WIN32) && !defined(__MINGW32__)
struct _stat64i32 st;
@@ -471,10 +470,10 @@ int BLI_exist(const char *name)
/* would be better in fileops.c except that it needs stat.h so add here */
int BLI_is_dir(const char *file)
{
- return S_ISDIR(BLI_exist(file));
+ return S_ISDIR(BLI_exists(file));
}
-LinkNode *BLI_read_file_as_lines(const char *name)
+LinkNode *BLI_file_read_as_lines(const char *name)
{
FILE *fp= fopen(name, "r");
LinkNode *lines= NULL;
@@ -515,7 +514,7 @@ LinkNode *BLI_read_file_as_lines(const char *name)
return lines;
}
-void BLI_free_file_lines(LinkNode *lines)
+void BLI_file_free_lines(LinkNode *lines)
{
BLI_linklist_free(lines, (void(*)(void*)) MEM_freeN);
}
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
index dc6cb0ef228..b4c58d3bab4 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -18,6 +18,8 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2011 Blender Foundation.
+ * Code from gutf8.c Copyright (C) 1999 Tom Tromey
+ * Copyright (C) 2000 Red Hat, Inc.
* All rights reserved.
*
* Contributor(s): Campbell Barton.
@@ -31,8 +33,10 @@
*/
#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
-#include "BLI_string.h"
+#include "BLI_string_utf8.h"
/* from libswish3, originally called u8_isvalid(),
* modified to return the index of the bad character (byte index not utf).
@@ -183,9 +187,288 @@ char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy)
return dst_r;
}
-/* copied from glib */
+
+/* --------------------------------------------------------------------------*/
+/* wchar_t / utf8 functions */
+
+size_t BLI_strncpy_wchar_as_utf8(char *dst, const wchar_t *src, const size_t maxcpy)
+{
+ size_t len = 0;
+ while(*src && len < maxcpy) { /* XXX can still run over the buffer because utf8 size isnt known :| */
+ len += BLI_str_utf8_from_unicode(*src++, dst+len);
+ }
+
+ dst[len]= '\0';
+
+ return len;
+}
+
+/* wchar len in utf8 */
+size_t BLI_wstrlen_utf8(const wchar_t *src)
+{
+ size_t len = 0;
+
+ while(*src) {
+ len += BLI_str_utf8_from_unicode(*src++, NULL);
+ }
+
+ return len;
+}
+
+// utf8slen
+size_t BLI_strlen_utf8(const char *strc)
+{
+ int len=0;
+
+ while(*strc) {
+ if ((*strc & 0xe0) == 0xc0) {
+ if((strc[1] & 0x80) && (strc[1] & 0x40) == 0x00)
+ strc++;
+ } else if ((*strc & 0xf0) == 0xe0) {
+ if((strc[1] & strc[2] & 0x80) && ((strc[1] | strc[2]) & 0x40) == 0x00)
+ strc += 2;
+ } else if ((*strc & 0xf8) == 0xf0) {
+ if((strc[1] & strc[2] & strc[3] & 0x80) && ((strc[1] | strc[2] | strc[3]) & 0x40) == 0x00)
+ strc += 3;
+ }
+
+ strc++;
+ len++;
+ }
+
+ return len;
+}
+
+size_t BLI_strncpy_wchar_from_utf8(wchar_t *dst_w, const char *src_c, const size_t maxcpy)
+{
+ int len=0;
+
+ if(dst_w==NULL || src_c==NULL) return(0);
+
+ while(*src_c && len < maxcpy) {
+ size_t step= 0;
+ unsigned int unicode= BLI_str_utf8_as_unicode_and_size(src_c, &step);
+ if (unicode != BLI_UTF8_ERR) {
+ *dst_w= (wchar_t)unicode;
+ src_c += step;
+ }
+ else {
+ *dst_w = '?';
+ src_c= BLI_str_find_next_char_utf8(src_c, NULL);
+ }
+ dst_w++;
+ len++;
+ }
+ return len;
+}
+
+/* end wchar_t / utf8 functions */
+/* --------------------------------------------------------------------------*/
+
+/* copied from glib's gutf8.c */
+
+/* note, glib uses unsigned int for unicode, best we do the same,
+ * though we dont typedef it - campbell */
+
+#define UTF8_COMPUTE(Char, Mask, Len) \
+ if (Char < 128) { \
+ Len = 1; \
+ Mask = 0x7f; \
+ } \
+ else if ((Char & 0xe0) == 0xc0) { \
+ Len = 2; \
+ Mask = 0x1f; \
+ } \
+ else if ((Char & 0xf0) == 0xe0) { \
+ Len = 3; \
+ Mask = 0x0f; \
+ } \
+ else if ((Char & 0xf8) == 0xf0) { \
+ Len = 4; \
+ Mask = 0x07; \
+ } \
+ else if ((Char & 0xfc) == 0xf8) { \
+ Len = 5; \
+ Mask = 0x03; \
+ } \
+ else if ((Char & 0xfe) == 0xfc) { \
+ Len = 6; \
+ Mask = 0x01; \
+ } \
+ else { \
+ Len = -1; \
+ }
+
+/* same as glib define but added an 'Err' arg */
+#define UTF8_GET(Result, Chars, Count, Mask, Len, Err) \
+ (Result) = (Chars)[0] & (Mask); \
+ for ((Count) = 1; (Count) < (Len); ++(Count)) { \
+ if (((Chars)[(Count)] & 0xc0) != 0x80) { \
+ (Result) = Err; \
+ break; \
+ } \
+ (Result) <<= 6; \
+ (Result) |= ((Chars)[(Count)] & 0x3f); \
+ }
+
+
+/* uses glib functions but not from glib */
+/* gets the size of a single utf8 char */
+int BLI_str_utf8_size(const char *p)
+{
+ int mask = 0, len;
+ unsigned char c = (unsigned char) *p;
+
+ UTF8_COMPUTE (c, mask, len);
+
+ return len;
+}
+
+/* was g_utf8_get_char */
+/**
+ * BLI_str_utf8_as_unicode:
+ * @p: a pointer to Unicode character encoded as UTF-8
+ *
+ * Converts a sequence of bytes encoded as UTF-8 to a Unicode character.
+ * If @p does not point to a valid UTF-8 encoded character, results are
+ * undefined. If you are not sure that the bytes are complete
+ * valid Unicode characters, you should use g_utf8_get_char_validated()
+ * instead.
+ *
+ * Return value: the resulting character
+ **/
+unsigned int BLI_str_utf8_as_unicode(const char *p)
+{
+ int i, mask = 0, len;
+ unsigned int result;
+ unsigned char c = (unsigned char) *p;
+
+ UTF8_COMPUTE (c, mask, len);
+ if (len == -1)
+ return BLI_UTF8_ERR;
+ UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR);
+
+ return result;
+}
+
+/* varient that increments the length */
+unsigned int BLI_str_utf8_as_unicode_and_size(const char *p, size_t *index)
+{
+ int i, mask = 0, len;
+ unsigned int result;
+ unsigned char c = (unsigned char) *p;
+
+ UTF8_COMPUTE (c, mask, len);
+ if (len == -1)
+ return BLI_UTF8_ERR;
+ UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR);
+ *index += len;
+ return result;
+}
+
+/* another varient that steps over the index,
+ * note, currently this also falls back to latin1 for text drawing. */
+unsigned int BLI_str_utf8_as_unicode_step(const char *p, size_t *index)
+{
+ int i, mask = 0, len;
+ unsigned int result;
+ unsigned char c;
+
+ p += *index;
+ c= (unsigned char) *p;
+
+ UTF8_COMPUTE (c, mask, len);
+ if (len == -1) {
+ /* when called with NULL end, result will never be NULL,
+ * checks for a NULL character */
+ char *p_next= BLI_str_find_next_char_utf8(p, NULL);
+ /* will never return the same pointer unless '\0',
+ * eternal loop is prevented */
+ *index += (size_t)(p_next - p);
+ return BLI_UTF8_ERR;
+ }
+
+ /* this is tricky since there are a few ways we can bail out of bad unicode
+ * values, 3 possible solutions. */
+#if 0
+ UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR);
+#elif 1
+ /* WARNING: this is NOT part of glib, or supported by similar functions.
+ * this is added for text drawing because some filepaths can have latin1
+ * characters */
+ UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR);
+ if(result == BLI_UTF8_ERR) {
+ len= 1;
+ result= *p;
+ }
+ /* end warning! */
+#else
+ /* without a fallback like '?', text drawing will stop on this value */
+ UTF8_GET (result, p, i, mask, len, '?');
+#endif
+
+ *index += len;
+ return result;
+}
+
+/* was g_unichar_to_utf8 */
+/**
+ * BLI_str_utf8_from_unicode:
+ * @c: a Unicode character code
+ * @outbuf: output buffer, must have at least 6 bytes of space.
+ * If %NULL, the length will be computed and returned
+ * and nothing will be written to @outbuf.
+ *
+ * Converts a single character to UTF-8.
+ *
+ * Return value: number of bytes written
+ **/
+size_t BLI_str_utf8_from_unicode(unsigned int c, char *outbuf)
+{
+ /* If this gets modified, also update the copy in g_string_insert_unichar() */
+ unsigned int len = 0;
+ int first;
+ int i;
+
+ if (c < 0x80) {
+ first = 0;
+ len = 1;
+ }
+ else if (c < 0x800) {
+ first = 0xc0;
+ len = 2;
+ }
+ else if (c < 0x10000) {
+ first = 0xe0;
+ len = 3;
+ }
+ else if (c < 0x200000) {
+ first = 0xf0;
+ len = 4;
+ }
+ else if (c < 0x4000000) {
+ first = 0xf8;
+ len = 5;
+ }
+ else {
+ first = 0xfc;
+ len = 6;
+ }
+
+ if (outbuf) {
+ for (i = len - 1; i > 0; --i) {
+ outbuf[i] = (c & 0x3f) | 0x80;
+ c >>= 6;
+ }
+ outbuf[0] = c | first;
+ }
+
+ return len;
+}
+
+/* was g_utf8_find_prev_char */
/**
- * g_utf8_find_prev_char:
+ * BLI_str_find_prev_char_utf8:
* @str: pointer to the beginning of a UTF-8 encoded string
* @p: pointer to some position within @str
*
@@ -209,8 +492,9 @@ char * BLI_str_find_prev_char_utf8(const char *str, const char *p)
return NULL;
}
+/* was g_utf8_find_next_char */
/**
- * g_utf8_find_next_char:
+ * BLI_str_find_next_char_utf8:
* @p: a pointer to a position within a UTF-8 encoded string
* @end: a pointer to the byte following the end of the string,
* or %NULL to indicate that the string is nul-terminated.
@@ -240,8 +524,9 @@ char *BLI_str_find_next_char_utf8(const char *p, const char *end)
return (p == end) ? NULL : (char *)p;
}
+/* was g_utf8_prev_char */
/**
- * g_utf8_prev_char:
+ * BLI_str_prev_char_utf8:
* @p: a pointer to a position within a UTF-8 encoded string
*
* Finds the previous UTF-8 character in the string before @p.
diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c
index 9594197ef90..21ad0ff7253 100644
--- a/source/blender/blenlib/intern/winstuff.c
+++ b/source/blender/blenlib/intern/winstuff.c
@@ -56,7 +56,7 @@ int BLI_getInstallationDir( char * str ) {
int a;
GetModuleFileName(NULL,str,FILE_MAXDIR+FILE_MAXFILE);
- BLI_split_dirfile(str, dir, NULL, sizeof(dir), 0); /* shouldn't be relative */
+ BLI_split_dir_part(str, dir, sizeof(dir)); /* shouldn't be relative */
a = strlen(dir);
if(dir[a-1] == '\\') dir[a-1]=0;