DEADSOFTWARE

fix question char
[d2df-sdl.git] / src / shared / utils.pas
index 5c3c7ba57a48fec14645c3e74b1d88f769f1bb45..14fa53b94eecb7425bbb1d8b8746eb4e412a5826 100644 (file)
@@ -71,6 +71,12 @@ function getFilenameExt (const fn: AnsiString): AnsiString;
 function setFilenameExt (const fn, ext: AnsiString): AnsiString;
 function forceFilenameExt (const fn, ext: AnsiString): AnsiString;
 
+// rewrites slashes to '/'
+function fixSlashes (s: AnsiString): AnsiString;
+
+function isAbsolutePath (const s: AnsiString): Boolean;
+function isRootPath (const s: AnsiString): Boolean;
+
 // strips out name from `fn`, leaving trailing slash
 function getFilenamePath (const fn: AnsiString): AnsiString;
 
@@ -333,6 +339,43 @@ begin
 end;
 
 
+// ////////////////////////////////////////////////////////////////////////// //
+// rewrites slashes to '/'
+function fixSlashes (s: AnsiString): AnsiString;
+var
+  f: Integer;
+begin
+  result := s;
+  for f := 1 to length(result) do if (result[f] = '\') then result[f] := '/';
+end;
+
+
+function isAbsolutePath (const s: AnsiString): Boolean;
+begin
+  result := false;
+  if (length(s) = 0) then exit;
+  {$IFDEF WINDOWS}
+  if (s[1] = '/') or (s[1] = '\') then begin result := true; exit; end;
+  if (length(s) > 2) and (s[2] = ':') and ((s[3] = '/') or (s[3] = '\')) then begin result := true; exit; end;
+  {$ELSE}
+  result := (s[1] = '/');
+  {$ENDIF}
+end;
+
+
+function isRootPath (const s: AnsiString): Boolean;
+begin
+  result := false;
+  if (length(s) = 0) then exit;
+  {$IFDEF WINDOWS}
+  if (s = '/') or (s = '\') then begin result := true; exit; end;
+  if (length(s) = 3) and (s[2] = ':') and ((s[3] = '/') or (s[3] = '\')) then begin result := true; exit; end;
+  {$ELSE}
+  result := (s = '/');
+  {$ENDIF}
+end;
+
+
 // ////////////////////////////////////////////////////////////////////////// //
 constructor TSimpleList.TEnumerator.Create (const aitems: TItemArr; acount: Integer);
 begin
@@ -465,7 +508,7 @@ var
 const
   cp1251: array[0..127] of Word = (
     $0402,$0403,$201A,$0453,$201E,$2026,$2020,$2021,$20AC,$2030,$0409,$2039,$040A,$040C,$040B,$040F,
-    $0452,$2018,$2019,$201C,$201D,$2022,$2013,$2014,$003F,$2122,$0459,$203A,$045A,$045C,$045B,$045F,
+    $0452,$2018,$2019,$201C,$201D,$2022,$2013,$2014,$FFFD,$2122,$0459,$203A,$045A,$045C,$045B,$045F,
     $00A0,$040E,$045E,$0408,$00A4,$0490,$00A6,$00A7,$0401,$00A9,$0404,$00AB,$00AC,$00AD,$00AE,$0407,
     $00B0,$00B1,$0406,$0456,$0491,$00B5,$00B6,$00B7,$0451,$2116,$0454,$00BB,$0458,$0405,$0455,$0457,
     $0410,$0411,$0412,$0413,$0414,$0415,$0416,$0417,$0418,$0419,$041A,$041B,$041C,$041D,$041E,$041F,
@@ -974,12 +1017,12 @@ end;
 
 function IsValid1251 (ch: Word): Boolean;
 begin
-  result := (ch = Ord('?')) or (wc2shitmap[ch] <> '?')
+  result := ((ch = Ord('?')) or (wc2shitmap[ch] <> '?')) and (ch <> $98)
 end;
 
 function IsPrintable1251 (ch: AnsiChar): Boolean;
 begin
-  result := (ch >= #32) and (ch <> #127)
+  result := (ch >= #32) and (ch <> #127) and (ch <> #$98)
 end;