- replaced G.{edve,eded,edvl} with G.editMesh, atm just a structure to
[blender.git] / source / blender / blenlib / intern / winstuff.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * Windows-posix compatibility layer, windows-specific functions.
32  */
33
34 #ifdef HAVE_CONFIG_H
35 #include <config.h>
36 #endif
37
38 #ifdef WIN32
39
40 #include <stdlib.h>
41 #include <stdio.h>
42
43 #include "MEM_guardedalloc.h"
44
45 #include "BLI_blenlib.h"
46 #include "BLI_util.h"
47 #include "BLI_winstuff.h"
48
49 #include "BKE_utildefines.h" /* FILE_MAXDIR + FILE_MAXFILE */
50
51 int BLI_getInstallationDir( char * str ) {
52         char dir[FILE_MAXDIR];
53         char file[FILE_MAXFILE];
54         int a;
55         
56         GetModuleFileName(NULL,str,FILE_MAXDIR+FILE_MAXFILE);
57         BLI_split_dirfile(str,dir,file);
58         a = strlen(dir);
59         if(dir[a-1] == '\\') dir[a-1]=0;
60         
61         strcpy(str,dir);
62         
63         return 1;
64 }
65
66
67 void RegisterBlendExtension(char * str) {
68         LONG lresult;
69         HKEY hkey = 0;
70         DWORD dwd = 0;
71         char buffer[128];
72         
73         lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\shell\\open\\command", 0,
74                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
75
76         if (lresult == ERROR_SUCCESS) {
77                 sprintf(buffer, "\"%s\" \"%%1\"", str);
78                 lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
79                 RegCloseKey(hkey);
80         }
81
82         lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\DefaultIcon", 0,
83                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
84
85         if (lresult == ERROR_SUCCESS) {
86                 sprintf(buffer, "\"%s\",1", str);
87                 lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
88                 RegCloseKey(hkey);
89         }
90
91         lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".blend", 0,
92                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
93
94         if (lresult == ERROR_SUCCESS) {
95                 sprintf(buffer, "%s", "blendfile");
96                 lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
97                 RegCloseKey(hkey);
98         }
99 }
100
101 static void strlower (char *str) {
102         while (*str) {
103                 *str= tolower(*str);
104                 str++;
105         }
106 }
107
108 static void strnlower (char *str, int n) {
109         while (n>0 && *str) {
110                 *str= tolower(*str);
111                 str++;
112                 n--;
113         }
114 }
115
116 #ifndef FREE_WINDOWS
117 int strcasecmp (char *s1, char *s2) {
118         char *st1, *st2;
119         int r;
120         
121         st1= MEM_mallocN(strlen(s1)+1, "temp string");
122         strcpy(st1, s1);
123
124         st2= MEM_mallocN(strlen(s2)+1, "temp string");
125         strcpy(st2, s2);
126
127         strlower(st1);
128         strlower(st2);
129         r= strcmp (st1, st2);
130         
131         MEM_freeN(st1);
132         MEM_freeN(st2);
133
134         return r;
135 }
136
137 int strncasecmp (char *s1, char *s2, int n) {
138         char *st1, *st2;
139         int r;
140         
141         st1= MEM_mallocN(n, "temp string");
142         memcpy(st1, s1, n);
143
144         st2= MEM_mallocN(n, "temp string");
145         memcpy(st2, s2, n);
146
147         strnlower(st1, n);
148         strnlower(st2, n);
149
150         r= strncmp (st1, st2, n);
151         
152         MEM_freeN(st1);
153         MEM_freeN(st2);
154
155         return r;       
156 }
157 #endif
158
159 DIR *opendir (const char *path) {
160         if (GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY) {
161                 DIR *newd= MEM_mallocN(sizeof(DIR), "opendir");
162
163                 newd->handle = INVALID_HANDLE_VALUE;
164                 sprintf(newd->path, "%s/*.*",path);
165                 
166                 newd->direntry.d_ino= 0;
167                 newd->direntry.d_off= 0;
168                 newd->direntry.d_reclen= 0;
169                 newd->direntry.d_name= NULL;
170                 
171                 return newd;
172         } else {
173                 return NULL;
174         }
175 }
176
177 struct dirent *readdir(DIR *dp) {
178         if (dp->direntry.d_name) {
179                 MEM_freeN(dp->direntry.d_name);
180                 dp->direntry.d_name= NULL;
181         }
182                 
183         if (dp->handle==INVALID_HANDLE_VALUE) {
184                 dp->handle= FindFirstFile(dp->path, &(dp->data));
185                 if (dp->handle==INVALID_HANDLE_VALUE)
186                         return NULL;
187                         
188                 dp->direntry.d_name= BLI_strdup(dp->data.cFileName);
189
190                 return &dp->direntry;
191         } else if (FindNextFile (dp->handle, &(dp->data))) {
192                 dp->direntry.d_name= BLI_strdup(dp->data.cFileName);
193
194                 return &dp->direntry;
195         } else {
196                 return NULL;
197         }
198 }
199
200 int closedir (DIR *dp) {
201         if (dp->direntry.d_name) MEM_freeN(dp->direntry.d_name);
202         if (dp->handle!=INVALID_HANDLE_VALUE) FindClose(dp->handle);
203
204         MEM_freeN(dp);
205         
206         return 0;
207 }
208
209 #else
210
211 void BLI_WINSTUFF_C_IS_EMPTY_FOR_UNIX(void) 
212 {
213   /*intentionally empty*/
214 }
215
216 #endif