DEADSOFTWARE

Engine: Fix e_UpperDir() leaving a trailing backslash
[d2df-sdl.git] / src / engine / e_res.pas
index a6d4bd5349806af849ef63eb4bcb27015e4dc808..69adb6e6eb5faa6b5e4fd98c0d919b270cb50501 100644 (file)
@@ -63,6 +63,8 @@ interface
   {--- creates all necessary subdirs, if it can ---}
   function e_GetWriteableDir (dirs: SSArray; required: Boolean=true): AnsiString;
 
+  function e_CanCreateFilesAt (dir: AnsiString): Boolean;
+
 implementation
 
   uses WadReader, e_log, hashtable;
@@ -77,9 +79,9 @@ implementation
   function e_UpperDir (path: AnsiString): AnsiString;
     var i: Integer;
   begin
-    i := High(path);
+    i := High(path);  // consider possible cases: '\a\', '\a', '\abc\'
     while (i >= 1) and (path[i] <> '/') and (path[i] <> '\') do Dec(i);
-    result := Copy(path, 1, i)
+    result := Copy(path, 1, i-1)  // exclude the trailing separator
   end;
 
   function HasRelativeDirs (name: AnsiString): Boolean;
@@ -280,7 +282,7 @@ implementation
   end;
 
   // k8: sorry. i know that this sux, but checking directory access rights is unreliable (unportable).
-  function canCreateFiles (dir: AnsiString): Boolean;
+  function e_CanCreateFilesAt (dir: AnsiString): Boolean;
   var
     f: Integer;
     st: TStream = nil;
@@ -337,7 +339,7 @@ implementation
           result := dirs[f];
           if (findFileCI(result, true)) then
           begin
-            if canCreateFiles(result) then
+            if e_CanCreateFilesAt(result) then
             begin
               if not assigned(writeableDirs) then writeableDirs := THashStrCIStr.Create();
               writeableDirs.put(dirs[f], result);