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