| 4 #include "file.h" |
4 #include "file.h" |
| 5 #include "misc.h" |
5 #include "misc.h" |
| 6 #include "bbox.h" |
6 #include "bbox.h" |
| 7 #include "gui.h" |
7 #include "gui.h" |
| 8 |
8 |
| 9 vector<str> g_zaFileLoadPaths; |
9 // ============================================================================= |
| 10 |
10 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 11 // ============================================================================= |
11 // ============================================================================= |
| 12 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
12 OpenFile* findLoadedFile (str zName) { |
| 13 // ============================================================================= |
13 printf ("finding %s in files\n", zName.chars()); |
| 14 OpenFile* findLoadedFile (str name) { |
14 |
| 15 for (ulong i = 0; i < g_LoadedFiles.size(); i++) { |
15 for (ulong i = 0; i < g_LoadedFiles.size(); i++) { |
| 16 OpenFile* const file = g_LoadedFiles[i]; |
16 OpenFile* const file = g_LoadedFiles[i]; |
| 17 if (file->zFileName == name) |
17 printf ("%s <-> %s\n", file->zFileName.chars(), zName.chars()); |
| |
18 if (file->zFileName == zName) |
| 18 return file; |
19 return file; |
| 19 } |
20 } |
| 20 |
21 |
| |
22 printf ("failed to find given file\n"); |
| 21 return nullptr; |
23 return nullptr; |
| 22 } |
24 } |
| 23 |
25 |
| 24 // ============================================================================= |
26 // ============================================================================= |
| 25 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
27 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 27 OpenFile* openDATFile (str path) { |
29 OpenFile* openDATFile (str path) { |
| 28 logf ("Opening %s...\n", path.chars()); |
30 logf ("Opening %s...\n", path.chars()); |
| 29 |
31 |
| 30 FILE* fp = fopen (path.chars (), "r"); |
32 FILE* fp = fopen (path.chars (), "r"); |
| 31 |
33 |
| 32 if (!fp) { |
34 if (!fp && ~io_ldpath.value) { |
| 33 for (ushort i = 0; i < g_zaFileLoadPaths.size(); ++i) { |
35 char const* saSubdirectories[] = { |
| 34 str zFilePath = str::mkfmt ("%s/%s", g_zaFileLoadPaths[i].chars(), path.chars()); |
36 "parts", |
| |
37 "p", |
| |
38 }; |
| |
39 |
| |
40 for (ushort i = 0; i < sizeof saSubdirectories / sizeof *saSubdirectories; ++i) { |
| |
41 str zFilePath = str::mkfmt ("%s" DIRSLASH "%s" DIRSLASH "%s", |
| |
42 io_ldpath.value.chars(), saSubdirectories[i], path.chars()); |
| |
43 |
| |
44 printf ("trying %s...\n", zFilePath.chars ()); |
| 35 fp = fopen (zFilePath.chars (), "r"); |
45 fp = fopen (zFilePath.chars (), "r"); |
| 36 |
46 |
| 37 if (fp) |
47 if (fp) |
| 38 break; |
48 break; |
| 39 } |
49 } |
| 112 |
122 |
| 113 // Clear the array |
123 // Clear the array |
| 114 g_LoadedFiles.clear(); |
124 g_LoadedFiles.clear(); |
| 115 g_CurrentFile = NULL; |
125 g_CurrentFile = NULL; |
| 116 |
126 |
| 117 g_qWindow->R->hardRefresh(); |
127 g_qWindow->refresh (); |
| 118 } |
128 } |
| 119 |
129 |
| 120 // ============================================================================= |
130 // ============================================================================= |
| 121 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
131 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 122 // ============================================================================= |
132 // ============================================================================= |
| 128 f->zFileName = ""; |
138 f->zFileName = ""; |
| 129 g_LoadedFiles.push_back (f); |
139 g_LoadedFiles.push_back (f); |
| 130 g_CurrentFile = f; |
140 g_CurrentFile = f; |
| 131 |
141 |
| 132 g_BBox.calculate(); |
142 g_BBox.calculate(); |
| 133 g_qWindow->buildObjList (); |
143 g_qWindow->refresh (); |
| 134 g_qWindow->R->hardRefresh(); |
|
| 135 } |
144 } |
| 136 |
145 |
| 137 // ============================================================================= |
146 // ============================================================================= |
| 138 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
147 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 139 // ============================================================================= |
148 // ============================================================================= |
| 145 |
154 |
| 146 // Recalculate the bounding box |
155 // Recalculate the bounding box |
| 147 g_BBox.calculate(); |
156 g_BBox.calculate(); |
| 148 |
157 |
| 149 // Rebuild the object tree view now. |
158 // Rebuild the object tree view now. |
| 150 g_qWindow->buildObjList (); |
159 g_qWindow->refresh (); |
| 151 g_qWindow->setTitle (); |
|
| 152 } |
160 } |
| 153 |
161 |
| 154 // ============================================================================= |
162 // ============================================================================= |
| 155 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
163 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| 156 // ============================================================================= |
164 // ============================================================================= |
| 225 #ifndef WIN32 |
233 #ifndef WIN32 |
| 226 tokens[14].replace ("\\", "/"); |
234 tokens[14].replace ("\\", "/"); |
| 227 #endif // WIN32 |
235 #endif // WIN32 |
| 228 |
236 |
| 229 // Try open the file |
237 // Try open the file |
| 230 OpenFile* pFile = findLoadedFile (tokens[14]); |
238 OpenFile* pFile = loadSubfile (tokens[14]); |
| 231 if (!pFile) |
|
| 232 pFile = openDATFile (tokens[14]); |
|
| 233 |
239 |
| 234 // If we cannot open the file, mark it an error |
240 // If we cannot open the file, mark it an error |
| 235 if (!pFile) |
241 if (!pFile) |
| 236 return new LDGibberish (zLine, "Could not open referred file"); |
242 return new LDGibberish (zLine, "Could not open referred file"); |
| 237 |
243 |
| 309 |
315 |
| 310 default: // Strange line we couldn't parse |
316 default: // Strange line we couldn't parse |
| 311 return new LDGibberish (zLine, "Unknown line code number"); |
317 return new LDGibberish (zLine, "Unknown line code number"); |
| 312 } |
318 } |
| 313 } |
319 } |
| |
320 |
| |
321 // ============================================================================= |
| |
322 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
323 // ============================================================================= |
| |
324 OpenFile* loadSubfile (str zFile) { |
| |
325 // Try open the file |
| |
326 OpenFile* pFile = findLoadedFile (zFile); |
| |
327 if (!pFile) |
| |
328 pFile = openDATFile (zFile); |
| |
329 |
| |
330 return pFile; |
| |
331 } |
| |
332 |
| |
333 // ============================================================================= |
| |
334 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
335 // ============================================================================= |
| |
336 void reloadAllSubfiles () { |
| |
337 // First, close all but the current open file. |
| |
338 for (ushort i = 0; i < g_LoadedFiles.size(); ++i) |
| |
339 if (g_LoadedFiles[i] != g_CurrentFile) |
| |
340 g_LoadedFiles[i]->close(); |
| |
341 |
| |
342 g_LoadedFiles.clear (); |
| |
343 g_LoadedFiles.push_back (g_CurrentFile); |
| |
344 |
| |
345 // Go through all the current file and reload the subfiles |
| |
346 for (ulong i = 0; i < g_CurrentFile->objects.size(); ++i) { |
| |
347 LDObject* obj = g_CurrentFile->objects[i]; |
| |
348 |
| |
349 // Reload subfiles |
| |
350 if (obj->getType() == OBJ_Subfile) { |
| |
351 LDSubfile* ref = static_cast<LDSubfile*> (obj); |
| |
352 OpenFile* pFile = loadSubfile (ref->zFileName); |
| |
353 |
| |
354 if (pFile) |
| |
355 ref->pFile = pFile; |
| |
356 else { |
| |
357 // Couldn't load the file, mark it an error |
| |
358 ref->replace (new LDGibberish (ref->getContents (), "Could not open referred file")); |
| |
359 } |
| |
360 } |
| |
361 |
| |
362 // Reparse gibberish files. It could be that they are invalid because |
| |
363 // the file could not be opened. Circumstances may be different now. |
| |
364 if (obj->getType() == OBJ_Gibberish) |
| |
365 obj->replace (parseLine (static_cast<LDGibberish*> (obj)->zContents)); |
| |
366 } |
| |
367 } |