diff --git a/src/shared/utils.pas b/src/shared/utils.pas
index 0ac5caa00f15004d8f7901fa99eadf36f966712c..948ac697f8c948b37be295ec3db9aa1a432c2a16 100644 (file)
--- a/src/shared/utils.pas
+++ b/src/shared/utils.pas
// 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;
// ////////////////////////////////////////////////////////////////////////// //
// rewrites slashes to '/'
function fixSlashes (s: AnsiString): AnsiString;
+{$IFDEF WINDOWS}
var
f: Integer;
+{$ENDIF}
begin
result := s;
+ {$IFDEF WINDOWS}
for f := 1 to length(result) do if (result[f] = '\') then result[f] := '/';
+ {$ENDIF}
+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;
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,
function IsValid1251 (ch: Word): Boolean;
begin
- result := (ch = Ord('?')) or (wc2shitmap[ch] <> '?')
+ result := ((ch = Ord('?')) or (wc2shitmap[ch] <> '?')) and (wc2shitmap[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;