e66dfb86f78fd0229b0f657e5e752250e153b46b
[rocksndiamonds.git] / src / game_sp / PathTools.c
1 // ----------------------------------------------------------------------------
2 // PathTools.c
3 // ----------------------------------------------------------------------------
4
5 #include "PathTools.h"
6
7 // static char *VB_Name = "PathTools_Module";
8
9 // --- Option Explicit
10 // --- Option Compare Text
11
12 // ###########  Quote & UnQuote ##################################################
13
14 void UnQuote(char *ST)
15 {
16   long L;
17
18   L = strlen(ST);
19   while (STRING_IS_LIKE(ST, "\"*"))
20   {
21     ST = Right(ST, L - 1);
22     L = L - 1;
23   }
24
25   while (STRING_IS_LIKE(ST, "*\""))
26   {
27     ST = Left(ST, L - 1);
28   }
29 }
30
31 void Quote(char *ST)
32 {
33   if (! STRING_IS_LIKE(ST, "\"*"))
34     ST = CAT("\"", ST);
35
36   if (! STRING_IS_LIKE(ST, "*\""))
37     ST = CAT(ST, "\"");
38 }
39
40 char *UnQuoted(char *STRG)
41 {
42   char *UnQuoted;
43
44   long L;
45   char *ST;
46
47   ST = STRG;
48   L = strlen(ST);
49   while (STRING_IS_LIKE(ST, "\"*"))
50   {
51     ST = Right(ST, L - 1);
52     L = L - 1;
53   }
54
55   while (STRING_IS_LIKE(ST, "*\""))
56   {
57     ST = Left(ST, L - 1);
58   }
59
60   UnQuoted = ST;
61
62   return UnQuoted;
63 }
64
65 char *Quoted(char *STRG)
66 {
67   char *Quoted;
68
69   char *ST;
70
71   ST = STRG;
72   if (! STRING_IS_LIKE(ST, "\"*"))
73     ST = CAT("\"", ST);
74
75   if (! STRING_IS_LIKE(ST, "*\""))
76     ST = CAT(ST, "\"");
77
78   Quoted = ST;
79
80   return Quoted;
81 }
82
83 // ############ Path-/FileName-Extraction and concatanation ######################
84
85 char *StripDir(char *Path)
86 {
87   char *StripDir;
88
89   char *T;
90   long i;
91
92   T = StrReverse(Path);
93   i = InStr(1, T, "/");
94   if (i == 0)
95     StripDir = "";
96   else
97     StripDir = StrReverse(Right(T, strlen(T) - i));
98
99   return StripDir;
100 }
101
102 char *StripFileName(char *Path)
103 {
104   char *StripFileName;
105
106   char *T;
107   long i;
108
109   T = StrReverse(Path);
110   if (STRING_IS_LIKE(T, "/*"))
111     T = Right(T, strlen(T) - 1);
112
113   i = InStr(1, T, "/");
114   if (i == 0)
115     i = strlen(T) + 1;
116
117   if (i < 2)
118     StripFileName = "";
119   else
120     StripFileName = StrReverse(Left(T, i - 1));
121
122   return StripFileName;
123 }
124
125 char *StripExtension(char *Path)
126 {
127   char *StripExtension;
128
129   char *T;
130   long i, iSlash;
131
132   T = StrReverse(Path);
133   iSlash = InStr(1, T, "/");
134   i = InStr(1, T, ".");
135   if ((i < 2) || (iSlash < i))
136     StripExtension = "";
137   else
138     StripExtension = StrReverse(Left(T, i - 1));
139
140   return StripExtension;
141 }
142
143 char *NewExtension(char *Path, char *NewExt)
144 {
145   char *NewExtension;
146
147   // NewExtension("C:\MyPath\MyFile.Old","New") returns "C:\MyPath\MyFile.New"
148   // NewExtension("C:\MyPath.dir\MyFile","New") returns "C:\MyPath\MyFile.New"
149   char *T;
150   long i, iSlash, ELen;
151
152   T = StrReverse(Path);
153   iSlash = InStr(1, T, "/");
154   i = InStr(1, T, ".");
155   if ((i < 1) || (iSlash < i))
156     ELen = 0;
157   else
158     ELen = i;
159
160   NewExtension = CAT(Left(StrReverse(T), strlen(T) - i), ".", NewExt);
161
162   return NewExtension;
163 }
164
165 char *StripExtensionlessFileName(char *Path)
166 {
167   char *StripExtensionlessFileName;
168
169   char *T, *T2;
170   // long i, iSlash;
171
172   T = StripFileName(Path);
173   T2 = StripExtension(Path);
174   StripExtensionlessFileName = Left(T, strlen(T) - strlen(T2) - (0 < strlen(T2) ? 1 : 0));
175
176   return StripExtensionlessFileName;
177 }
178
179 char *WithSlash(char *Path)
180 {
181   char *WithSlash;
182
183   if (STRING_IS_LIKE(Path, "*/"))
184   {
185     WithSlash = Path;
186   }
187   else
188   {
189     WithSlash = CAT(Path, "/");
190   }
191
192   return WithSlash;
193 }
194
195 char *SlashLess(char *Path)
196 {
197   char *SlashLess;
198
199   SlashLess = Path;
200   while (STRING_IS_LIKE(SlashLess, "*/"))
201   {
202     SlashLess = Left(Path, strlen(Path) - 1);
203   }
204
205   return SlashLess;
206 }
207
208 // ############ File-/Diresctory-Operations ######################################
209
210 boolean FileExists(char *Path)
211 {
212   boolean FileExists;
213
214   if ((STRING_IS_LIKE(Dir(Path), "")) || (STRING_IS_LIKE(Path, "")))
215     FileExists = False;
216   else
217     FileExists = True;
218
219   return FileExists;
220 }
221
222 void MayKill(char *Path)
223 {
224
225   // --- On Error GoTo MayKillEH
226   Kill(Path);
227   // MayKillEH:
228 }
229
230 boolean IsDir(char *Path)
231 {
232   boolean IsDir;
233
234
235   // --- On Error Resume Next
236   IsDir = (vbDirectory == (GetAttr(Path) & vbDirectory));
237   if (Err.Number != 0)
238     IsDir = False;
239
240   return IsDir;
241 }
242
243 // ######### binary comparison of files ##########################################
244
245 boolean FilesEqual(char *Path1, char *Path2)
246 {
247   boolean FilesEqual;
248
249   FILE *FNum1, *FNum2;
250   long nSize, i;
251   boolean b1Open, b2Open;
252   byte *bin1, *bin2;
253
254   FilesEqual = False;
255   // Debug.Assert(FileExists(Path1));
256   // Debug.Assert(FileExists(Path2));
257   if (! (FileExists(Path1) && FileExists(Path2)))
258     return FilesEqual;
259
260   nSize = FileLen(Path1);
261   if (nSize != FileLen(Path2))
262     return FilesEqual;
263
264   bin1 = REDIM_1D(sizeof(byte), 0, nSize + 1 - 1);
265   bin2 = REDIM_1D(sizeof(byte), 0, nSize + 1 - 1);
266   b1Open = False;
267   b2Open = False;
268
269   // --- On Error GoTo FilesEqualEH
270   // FNum1 = FreeFile();
271   FNum1 = fopen(Path1, "rb");
272   b1Open = True;
273   FILE_GET(FNum1, -1, &bin1, sizeof(bin1));
274   fclose(FNum1);
275   b1Open = False;
276   // FNum2 = FreeFile();
277   FNum2 = fopen(Path2, "rb");
278   b2Open = True;
279   FILE_GET(FNum2, -1, &bin2, sizeof(bin2));
280   fclose(FNum2);
281   b2Open = False;
282   // --- On Error GoTo 0
283
284   for (i = 1; i <= nSize; i++)
285   {
286     if (bin1[i] != bin2[i]) // return false
287       return FilesEqual;
288   }
289
290   FilesEqual = True;
291   return FilesEqual;
292
293 #if 0
294 FilesEqualEH:
295   if (b1Open)
296     fclose(FNum1);
297
298   if (b2Open)
299     fclose(FNum2);
300
301   return FilesEqual;
302 #endif
303
304 }