File/installation paths: fix path of startup.blend for OSX
[blender.git] / source / blender / blenlib / BLI_path_util.h
1 /**
2  * blenlib/BLI_storage_types.h
3  *
4  * Some types for dealing with directories
5  *
6  * $Id$
7  *
8  * ***** BEGIN GPL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25  * All rights reserved.
26  *
27  * The Original Code is: all of this file.
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL LICENSE BLOCK *****
32  */
33 #ifndef BLI_PATH_UTIL_H
34 #define BLI_PATH_UTIL_H
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 struct ListBase;
41 struct direntry;
42
43 char *BLI_gethome(void);
44 char *BLI_gethome_folder(char *folder_name, int flag);
45
46 /* BLI_gethome_folder flag */
47 #define BLI_GETHOME_LOCAL               1<<1 /* relative location for portable binaries */
48 #define BLI_GETHOME_SYSTEM              1<<2 /* system location, or set from the BLENDERPATH env variable (UNIX only) */
49 #define BLI_GETHOME_USER                1<<3 /* home folder ~/.blender */
50 #define BLI_GETHOME_ALL                 (BLI_GETHOME_SYSTEM|BLI_GETHOME_LOCAL|BLI_GETHOME_USER)
51
52
53 #ifdef __APPLE__
54 typedef enum {
55         BasePath_Temporary = 1,
56         BasePath_BlenderShared,
57         BasePath_BlenderUser,
58         BasePath_ApplicationBundle
59 } basePathesTypes;
60
61 /**
62  * Gets the base path. The path may not exist.
63  * Note that return string must be copied as its persistence is not guaranteed
64  *
65  * @return base path of pathType
66  */
67 const char* BLI_osx_getBasePath(basePathesTypes pathType);
68 #endif
69
70 char *BLI_get_folder(int folder_id, char *subfolder);
71 char *BLI_get_folder_create(int folder_id, char *subfolder);
72
73 /* folder_id */
74
75 /* general, will find baserd on user/local/system priority */
76 #define BLENDER_CONFIG                          1
77 #define BLENDER_DATAFILES                       2
78 #define BLENDER_SCRIPTS                         3
79 #define BLENDER_PLUGINS                         4
80 #define BLENDER_PYTHON                          5
81
82 /* user-specific */
83 #define BLENDER_USER_CONFIG                     31
84 #define BLENDER_USER_DATAFILES          32
85 #define BLENDER_USER_SCRIPTS            33
86 #define BLENDER_USER_PLUGINS            34
87
88 /* system */
89 #define BLENDER_SYSTEM_CONFIG           51      /* optional */
90 #define BLENDER_SYSTEM_DATAFILES        52
91 #define BLENDER_SYSTEM_SCRIPTS          53
92 #define BLENDER_SYSTEM_PLUGINS          54
93 #define BLENDER_SYSTEM_PYTHON           54
94
95 #define BLENDER_TEMP                            80
96
97 #define BLENDER_USERFOLDER(id) (id >= BLENDER_USER_CONFIG && id <= BLENDER_USER_PLUGINS)
98
99 #define BLENDER_STARTUP_FILE    "startup.blend"
100 #define BLENDER_BOOKMARK_FILE   "bookmarks.txt"
101 #define BLENDER_HISTORY_FILE    "recent-files.txt"
102
103 #ifdef WIN32
104 #define BLENDER_BASE_FORMAT             "%s\\Blender Foundation\\Blender\\%s"
105 #elif __APPLE__
106 #define BLENDER_BASE_FORMAT                     "%s/Blender/%s"
107 #else
108 #define BLENDER_BASE_FORMAT                     "%s/.blender/%s"
109 #endif
110
111 void BLI_setenv(const char *env, const char *val);
112 void BLI_setenv_if_new(const char *env, const char* val);
113
114 void BLI_make_file_string(const char *relabase, char *string,  const char *dir, const char *file);
115 void BLI_make_exist(char *dir);
116 void BLI_make_existing_file(char *name);
117 void BLI_split_dirfile(const char *string, char *dir, char *file);
118 void BLI_join_dirfile(char *string, const char *dir, const char *file);
119 char *BLI_path_basename(char *path);
120 int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char *base_dir, const char *src_dir, const char *dest_dir);
121 void BLI_getlastdir(const char* dir, char *last, int maxlen);
122 int BLI_testextensie(const char *str, const char *ext);
123 int BLI_replace_extension(char *path, int maxlen, const char *ext);
124 void BLI_uniquename(struct ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len);
125 void BLI_newname(char * name, int add);
126 int BLI_stringdec(const char *string, char *head, char *start, unsigned short *numlen);
127 void BLI_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic);
128 void BLI_splitdirstring(char *di,char *fi);
129
130 /* make sure path separators conform to system one */
131 void BLI_clean(char *path);
132
133 /**
134          * dir can be any input, like from buttons, and this function
135          * converts it to a regular full path.
136          * Also removes garbage from directory paths, like /../ or double slashes etc 
137          */
138 void BLI_cleanup_file(const char *relabase, char *dir);
139 void BLI_cleanup_dir(const char *relabase, char *dir); /* same as above but adds a trailing slash */
140
141 /* go back one directory */
142 int BLI_parent_dir(char *path);
143
144 /* return whether directory is root and thus has no parent dir */
145 int BLI_has_parent(char *path);
146
147         /**
148          * Blender's path code replacement function.
149          * Bases @a path strings leading with "//" by the
150          * directory @a basepath, and replaces instances of
151          * '#' with the @a framenum. Results are written
152          * back into @a path.
153          * 
154          * @a path The path to convert
155          * @a basepath The directory to base relative paths with.
156          * @a framenum The framenumber to replace the frame code with.
157          * @retval Returns true if the path was relative (started with "//").
158          */
159 int BLI_path_abs(char *path, const char *basepath);
160 int BLI_path_frame(char *path, int frame, int digits);
161 int BLI_path_frame_range(char *path, int sta, int end, int digits);
162 int BLI_path_cwd(char *path);
163
164 void BLI_path_rel(char *file, const char *relfile);
165
166         /**
167          * Change every @a from in @a string into @a to. The
168          * result will be in @a string
169          *
170          * @a string The string to work on
171          * @a from The character to replace
172          * @a to The character to replace with
173          */
174 void BLI_char_switch(char *string, char from, char to);
175
176 /**
177          * Checks if name is a fully qualified filename to an executable.
178          * If not it searches $PATH for the file. On Windows it also
179          * adds the correct extension (.com .exe etc) from
180          * $PATHEXT if necessary. Also on Windows it translates
181          * the name to its 8.3 version to prevent problems with
182          * spaces and stuff. Final result is returned in fullname.
183          *
184          * @param fullname The full path and full name of the executable
185          * @param name The name of the executable (usually argv[0]) to be checked
186          */
187 void BLI_where_am_i(char *fullname, const char *name);
188
189 char *get_install_dir(void);
190         /**
191          * Gets the temp directory when blender first runs.
192          * If the default path is not found, use try $TEMP
193          * 
194          * Also make sure the temp dir has a trailing slash
195          *
196          * @param fullname The full path to the temp directory
197          */
198 void BLI_where_is_temp(char *fullname, int usertemp);
199
200
201 #ifdef WITH_ICONV
202 void BLI_string_to_utf8(char *original, char *utf_8, const char *code);
203 #endif
204
205 #ifdef __cplusplus
206 }
207 #endif
208
209 #endif
210