Browse Source

--- Merging r17272 into '.':
U rtl/linux/system.pp
--- Merging r17303 into '.':
U rtl/inc/systemh.inc
--- Merging r17369 into '.':
U rtl/win/wininc/func.inc
U packages/winunits-base/src/shellapi.pp
--- Merging r17412 into '.':
U packages/fcl-base/src/libtar.pp

# revisions: 17272,17303,17369,17412
------------------------------------------------------------------------
r17272 | marco | 2011-04-08 16:41:36 +0200 (Fri, 08 Apr 2011) | 2 lines
Changed paths:
M /trunk/rtl/linux/system.pp

* fix for 19114. Deal with empty arguments more graciously by quoting them.

------------------------------------------------------------------------
------------------------------------------------------------------------
r17303 | marco | 2011-04-11 11:48:51 +0200 (Mon, 11 Apr 2011) | 2 lines
Changed paths:
M /trunk/rtl/inc/systemh.inc

* support for Delphi/64 NativeInt and NativeUint as shown in several promotions on the web. (aliases for ptrint/ptruint)

------------------------------------------------------------------------
------------------------------------------------------------------------
r17369 | marco | 2011-04-25 17:43:07 +0200 (Mon, 25 Apr 2011) | 2 lines
Changed paths:
M /trunk/packages/winunits-base/src/shellapi.pp
M /trunk/rtl/win/wininc/func.inc

* patch from Cobines, Mantis 19227 fixing return type of shgetfileinfo*

------------------------------------------------------------------------
------------------------------------------------------------------------
r17412 | marco | 2011-05-08 15:31:32 +0200 (Sun, 08 May 2011) | 1 line
Changed paths:
M /trunk/packages/fcl-base/src/libtar.pp

* Updated to 2.1.0 mostly. Expands support for "mode" in tarheaders.
------------------------------------------------------------------------

git-svn-id: branches/fixes_2_4@17454 -

marco 14 years ago
parent
commit
04d4e7212f

+ 81 - 70
packages/fcl-base/src/libtar.pp

@@ -1,5 +1,5 @@
 (**
- Copyright (c) 2000-2006 by Stefan Heymann
+ Copyright (c) 2000-2010 by Stefan Heymann
 
  See the file COPYING.FPC, included in this distribution,
  for details about the copyright. 
@@ -75,6 +75,12 @@ Date        Author Changes
 2006-09-20  MvdV   2.0.7.1 Small fixes for FPC.
 2007-05-16  HeySt  2.0.8 Bugfix in TTarWriter.AddFile (Convertfilename in the ELSE branch)
                          Bug Reported by Chris Rorden
+2010-11-29  HeySt  2.1.0 WriteTarHeader: Mode values for ftNormal/ftLink/ftSymbolicLink/ftDirectory
+                         Thanks to Iouri Kharon for the fix.
+                         Still no support for filenames > 100 bytes. Sorry.
+                         Support for Unicode Delphi versions (2009, 2010, XE, etc.)
+                   MvdV 2.1.0 notes : not all of the Unicode changes have been made, decisions on this subject still pending on the FPC side.
+									Mostly rawbytestring and a couple of more hary typecasts.
 *)
 
 UNIT libtar;
@@ -130,19 +136,19 @@ TYPE
   // --- Record for a Directory Entry
   //     Adjust the ClearDirRec procedure when this record changes!
   TTarDirRec  = RECORD
-                  Name        : STRING;            // File path and name
+                  Name        : AnsiString;            // File path and name
                   Size        : INT64;             // File size in Bytes
                   DateTime    : TDateTime;         // Last modification date and time
                   Permissions : TTarPermissions;   // Access permissions
                   FileType    : TFileType;         // Type of file
-                  LinkName    : STRING;            // Name of linked file (for ftLink, ftSymbolicLink)
+                  LinkName    : AnsiString;            // Name of linked file (for ftLink, ftSymbolicLink)
                   UID         : INTEGER;           // User ID
                   GID         : INTEGER;           // Group ID
-                  UserName    : STRING;            // User name
-                  GroupName   : STRING;            // Group name
+                  UserName    : AnsiString;            // User name
+                  GroupName   : AnsiString;            // Group name
                   ChecksumOK  : BOOLEAN;           // Checksum was OK
                   Mode        : TTarModes;         // Mode
-                  Magic       : STRING;            // Contents of the "Magic" field
+                  Magic       : AnsiString;            // Contents of the "Magic" field
                   MajorDevNo  : INTEGER;           // Major Device No. for ftCharacter and ftBlock
                   MinorDevNo  : INTEGER;           // Minor Device No. for ftCharacter and ftBlock
                   FilePos     : INT64;             // Position in TAR file
@@ -164,7 +170,7 @@ TYPE
                   PROCEDURE ReadFile (Buffer   : POINTER); OVERLOAD;       // Reads file data for last Directory Record
                   PROCEDURE ReadFile (Stream   : TStream); OVERLOAD;       // -;-
                   PROCEDURE ReadFile (Filename : STRING);  OVERLOAD;       // -;-
-                  FUNCTION  ReadFile : STRING;           OVERLOAD;         // -;-
+                  FUNCTION  ReadFile : STRING;           OVERLOAD;         // -;-  RawByteString in D2009+. Not active due to FPC unicode architecture not being finalized
 
                   PROCEDURE GetFilePos (VAR Current, Size : INT64);        // Current File Position
                   PROCEDURE SetFilePos (NewPos : INT64);                   // Set new Current File Position
@@ -180,30 +186,30 @@ TYPE
                  FPermissions : TTarPermissions;   // Access permissions
                  FUID         : INTEGER;           // User ID
                  FGID         : INTEGER;           // Group ID
-                 FUserName    : STRING;            // User name
-                 FGroupName   : STRING;            // Group name
+                 FUserName    : AnsiString;            // User name
+                 FGroupName   : AnsiString;            // Group name
                  FMode        : TTarModes;         // Mode
-                 FMagic       : STRING;            // Contents of the "Magic" field
+                 FMagic       : AnsiString;            // Contents of the "Magic" field
                  CONSTRUCTOR CreateEmpty;
                PUBLIC
                  CONSTRUCTOR Create (TargetStream   : TStream);                            OVERLOAD;
                  CONSTRUCTOR Create (TargetFilename : STRING; Mode : INTEGER = fmCreate);  OVERLOAD;
                  DESTRUCTOR Destroy; OVERRIDE;                   // Writes End-Of-File Tag
-                 PROCEDURE AddFile   (Filename : STRING;  TarFilename : STRING = '');
-                 PROCEDURE AddStream (Stream   : TStream; TarFilename : STRING; FileDateGmt : TDateTime);
-                 PROCEDURE AddString (Contents : STRING;  TarFilename : STRING; FileDateGmt : TDateTime);
-                 PROCEDURE AddDir          (Dirname            : STRING; DateGmt : TDateTime; MaxDirSize : INT64 = 0);
-                 PROCEDURE AddSymbolicLink (Filename, Linkname : STRING; DateGmt : TDateTime);
-                 PROCEDURE AddLink         (Filename, Linkname : STRING; DateGmt : TDateTime);
-                 PROCEDURE AddVolumeHeader (VolumeId           : STRING; DateGmt : TDateTime);
+                 PROCEDURE AddFile   (Filename : STRING;  TarFilename : AnsiString = '');
+                 PROCEDURE AddStream (Stream   : TStream; TarFilename : AnsiString; FileDateGmt : TDateTime);
+                 PROCEDURE AddString (Contents : Ansistring;  TarFilename : AnsiString; FileDateGmt : TDateTime);  // RawByteString
+                 PROCEDURE AddDir          (Dirname            : AnsiString; DateGmt : TDateTime; MaxDirSize : INT64 = 0);
+                 PROCEDURE AddSymbolicLink (Filename, Linkname : AnsiString; DateGmt : TDateTime);
+                 PROCEDURE AddLink         (Filename, Linkname : AnsiString; DateGmt : TDateTime);
+                 PROCEDURE AddVolumeHeader (VolumeId           : AnsiString; DateGmt : TDateTime);
                  PROCEDURE Finalize;
                  PROPERTY Permissions : TTarPermissions READ FPermissions WRITE FPermissions;   // Access permissions
                  PROPERTY UID         : INTEGER         READ FUID         WRITE FUID;           // User ID
                  PROPERTY GID         : INTEGER         READ FGID         WRITE FGID;           // Group ID
-                 PROPERTY UserName    : STRING          READ FUserName    WRITE FUserName;      // User name
-                 PROPERTY GroupName   : STRING          READ FGroupName   WRITE FGroupName;     // Group name
+                 PROPERTY UserName    : AnsiString          READ FUserName    WRITE FUserName;      // User name
+                 PROPERTY GroupName   : AnsiString          READ FGroupName   WRITE FGroupName;     // Group name
                  PROPERTY Mode        : TTarModes       READ FMode        WRITE FMode;          // Mode
-                 PROPERTY Magic       : STRING          READ FMagic       WRITE FMagic;         // Contents of the "Magic" field
+                 PROPERTY Magic       : AnsiString          READ FMagic       WRITE FMagic;         // Contents of the "Magic" field
                END;
 
 // --- Some useful constants
@@ -347,34 +353,34 @@ CONST
 
 TYPE
   TTarHeader = PACKED RECORD
-                 Name     : ARRAY [0..NAMSIZ-1] OF CHAR;
-                 Mode     : ARRAY [0..7] OF CHAR;
-                 UID      : ARRAY [0..7] OF CHAR;
-                 GID      : ARRAY [0..7] OF CHAR;
-                 Size     : ARRAY [0..11] OF CHAR;
-                 MTime    : ARRAY [0..11] OF CHAR;
-                 ChkSum   : ARRAY [0..7] OF CHAR;
-                 LinkFlag : CHAR;
-                 LinkName : ARRAY [0..NAMSIZ-1] OF CHAR;
-                 Magic    : ARRAY [0..7] OF CHAR;
-                 UName    : ARRAY [0..TUNMLEN-1] OF CHAR;
-                 GName    : ARRAY [0..TGNMLEN-1] OF CHAR;
-                 DevMajor : ARRAY [0..7] OF CHAR;
-                 DevMinor : ARRAY [0..7] OF CHAR;
+                 Name     : ARRAY [0..NAMSIZ-1] OF AnsiChar;
+                 Mode     : ARRAY [0..7] OF AnsiChar;
+                 UID      : ARRAY [0..7] OF AnsiChar;
+                 GID      : ARRAY [0..7] OF AnsiChar;
+                 Size     : ARRAY [0..11] OF AnsiChar;
+                 MTime    : ARRAY [0..11] OF AnsiChar;
+                 ChkSum   : ARRAY [0..7] OF AnsiChar;
+                 LinkFlag : AnsiChar;
+                 LinkName : ARRAY [0..NAMSIZ-1] OF AnsiChar;
+                 Magic    : ARRAY [0..7] OF AnsiChar;
+                 UName    : ARRAY [0..TUNMLEN-1] OF AnsiChar;
+                 GName    : ARRAY [0..TGNMLEN-1] OF AnsiChar;
+                 DevMajor : ARRAY [0..7] OF AnsiChar;
+                 DevMinor : ARRAY [0..7] OF AnsiChar;
                END;
 
-FUNCTION ExtractText (P : PChar) : STRING;
+FUNCTION ExtractText (P : PAnsiChar) : AnsiString;
 BEGIN
-  Result := STRING (P);
+  Result := AnsiString(P);
 END;
 
 
-FUNCTION ExtractNumber (P : PChar) : INTEGER; OVERLOAD;
+FUNCTION ExtractNumber (P : PAnsiChar) : INTEGER; OVERLOAD;
 VAR
-  Strg : STRING;
+  Strg : AnsiString;
 BEGIN
   Strg := Trim (StrPas (P));
-  P := PChar (Strg);
+  P := PAnsiChar (Strg);
   Result := 0;
   WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN
     Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3);
@@ -382,12 +388,12 @@ BEGIN
     END;
 END;
 
-FUNCTION ExtractNumber64 (P : PChar) : INT64; OVERLOAD;
+FUNCTION ExtractNumber64 (P : PAnsiChar) : INT64; OVERLOAD;
 VAR
-  Strg : STRING;
+  Strg : AnsiString;
 BEGIN
   Strg := Trim (StrPas (P));
-  P := PChar (Strg);
+  P := PAnsiChar (Strg);
   Result := 0;
   WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN
     Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3);
@@ -396,14 +402,14 @@ BEGIN
 END;
 
 
-FUNCTION ExtractNumber (P : PChar; MaxLen : INTEGER) : INTEGER; OVERLOAD;
+FUNCTION ExtractNumber (P : PAnsiChar; MaxLen : INTEGER) : INTEGER; OVERLOAD;
 VAR
-  S0   : ARRAY [0..255] OF CHAR;
-  Strg : STRING;
+  S0   : ARRAY [0..255] OF AnsiChar;
+  Strg : AnsiString;
 BEGIN
   StrLCopy (S0, P, MaxLen);
   Strg := Trim (StrPas (S0));
-  P := PChar (Strg);
+  P := PAnsiChar (Strg);
   Result := 0;
   WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN
     Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3);
@@ -412,14 +418,14 @@ BEGIN
 END;
 
 
-FUNCTION ExtractNumber64 (P : PChar; MaxLen : INTEGER) : INT64; OVERLOAD;
+FUNCTION ExtractNumber64 (P : PAnsiChar; MaxLen : INTEGER) : INT64; OVERLOAD;
 VAR
-  S0   : ARRAY [0..255] OF CHAR;
-  Strg : STRING;
+  S0   : ARRAY [0..255] OF AnsiChar;
+  Strg : AnsiString;
 BEGIN
   StrLCopy (S0, P, MaxLen);
   Strg := Trim (StrPas (S0));
-  P := PChar (Strg);
+  P := PAnsiChar (Strg);
   Result := 0;
   WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN
     Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3);
@@ -436,14 +442,14 @@ BEGIN
 END;
 
 
-PROCEDURE Octal (N : INTEGER; P : PChar; Len : INTEGER);
+PROCEDURE Octal (N : INTEGER; P : PAnsiChar; Len : INTEGER);
          // Makes a string of octal digits
          // The string will always be "Len" characters long
 VAR
   I     : INTEGER;
 BEGIN
   FOR I := Len-2 DOWNTO 0 DO BEGIN
-    (P+I)^ := CHR (ORD ('0') + ORD (N AND $07));
+    (P+I)^ := AnsiChar (ORD ('0') + ORD (N AND $07));
     N := N SHR 3;
     END;
   FOR I := 0 TO Len-3 DO
@@ -454,14 +460,14 @@ BEGIN
 END;
 
 
-PROCEDURE Octal64 (N : INT64; P : PChar; Len : INTEGER);
+PROCEDURE Octal64 (N : INT64; P : PAnsiChar; Len : INTEGER);
          // Makes a string of octal digits
          // The string will always be "Len" characters long
 VAR
   I     : INTEGER;
 BEGIN
   FOR I := Len-2 DOWNTO 0 DO BEGIN
-    (P+I)^ := CHR (ORD ('0') + ORD (N AND $07));
+    (P+I)^ := AnsiChar (ORD ('0') + ORD (N AND $07));
     N := N SHR 3;
     END;
   FOR I := 0 TO Len-3 DO
@@ -472,7 +478,7 @@ BEGIN
 END;
 
 
-PROCEDURE OctalN (N : INTEGER; P : PChar; Len : INTEGER);
+PROCEDURE OctalN (N : INTEGER; P : PAnsiChar; Len : INTEGER);
 BEGIN
   Octal (N, P, Len-1);
   (P+Len-1)^ := #0;
@@ -481,7 +487,7 @@ END;
 
 PROCEDURE WriteTarHeader (Dest : TStream; DirRec : TTarDirRec);
 VAR
-  Rec      : ARRAY [0..RECORDSIZE-1] OF CHAR;
+  Rec      : ARRAY [0..RECORDSIZE-1] OF AnsiChar;
   TH       : TTarHeader ABSOLUTE Rec;
   Mode     : INTEGER;
   NullDate : TDateTime;
@@ -489,8 +495,13 @@ VAR
   I        : INTEGER;
 BEGIN
   FillChar (Rec, RECORDSIZE, 0);
-  StrLCopy (TH.Name, PChar (DirRec.Name), NAMSIZ);
-  Mode := 0;
+  StrLCopy (TH.Name, PAnsiChar (DirRec.Name), NAMSIZ);
+  CASE DirRec.FileType OF
+    ftNormal, ftLink  : Mode := $08000;
+    ftSymbolicLink    : Mode := $0A000;
+    ftDirectory         : Mode := $04000;
+    ELSE                  Mode := 0;
+    END;
   IF tmSaveText IN DirRec.Mode THEN Mode := Mode OR $0200;
   IF tmSetGid   IN DirRec.Mode THEN Mode := Mode OR $0400;
   IF tmSetUid   IN DirRec.Mode THEN Mode := Mode OR $0800;
@@ -524,10 +535,10 @@ BEGIN
     ftMultiVolume  : TH.LinkFlag := 'M';
     ftVolumeHeader : TH.LinkFlag := 'V';
     END;
-  StrLCopy (TH.LinkName, PChar (DirRec.LinkName), NAMSIZ);
-  StrLCopy (TH.Magic, PChar (DirRec.Magic + #32#32#32#32#32#32#32#32), 8);
-  StrLCopy (TH.UName, PChar (DirRec.UserName), TUNMLEN);
-  StrLCopy (TH.GName, PChar (DirRec.GroupName), TGNMLEN);
+  StrLCopy (TH.LinkName, PAnsiChar (DirRec.LinkName), NAMSIZ);
+  StrLCopy (TH.Magic, PAnsiChar (DirRec.Magic + #32#32#32#32#32#32#32#32), 8);
+  StrLCopy (TH.UName, PAnsiChar (DirRec.UserName), TUNMLEN);
+  StrLCopy (TH.GName, PAnsiChar (DirRec.GroupName), TGNMLEN);
   OctalN (DirRec.MajorDevNo, @TH.DevMajor, 8);
   OctalN (DirRec.MinorDevNo, @TH.DevMinor, 8);
   StrMove (TH.ChkSum, CHKBLANKS, 8);
@@ -715,7 +726,7 @@ BEGIN
   IF FBytesToGo = 0 THEN EXIT;
   RestBytes := Records (FBytesToGo) * RECORDSIZE - FBytesToGo;
   SetLength (Result, FBytesToGo);
-  FStream.ReadBuffer (PChar (Result)^, FBytesToGo);
+  FStream.ReadBuffer (PAnsiChar (Result)^, FBytesToGo);
   FStream.Seek (RestBytes, soFromCurrent);
   FBytesToGo := 0;
 END;
@@ -789,7 +800,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddFile   (Filename : STRING;  TarFilename : STRING = '');
+PROCEDURE TTarWriter.AddFile   (Filename : STRING;  TarFilename : AnsiString = '');
 VAR
   S    : TFileStream;
   Date : TDateTime;
@@ -807,7 +818,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddStream (Stream : TStream; TarFilename : STRING; FileDateGmt : TDateTime);
+PROCEDURE TTarWriter.AddStream (Stream : TStream; TarFilename : AnsiString; FileDateGmt : TDateTime);
 VAR
   DirRec      : TTarDirRec;
   Rec         : ARRAY [0..RECORDSIZE-1] OF CHAR;
@@ -844,7 +855,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddString (Contents : STRING; TarFilename : STRING; FileDateGmt : TDateTime);
+PROCEDURE TTarWriter.AddString (Contents : AnsiString; TarFilename : AnsiString; FileDateGmt : TDateTime); // rawbytestring
 VAR
   S : TStringStream;
 BEGIN
@@ -857,7 +868,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddDir (Dirname : STRING; DateGmt : TDateTime; MaxDirSize : INT64 = 0);
+PROCEDURE TTarWriter.AddDir (Dirname : AnsiString; DateGmt : TDateTime; MaxDirSize : INT64 = 0);
 VAR
   DirRec      : TTarDirRec;
 BEGIN
@@ -882,7 +893,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddSymbolicLink (Filename, Linkname : STRING; DateGmt : TDateTime);
+PROCEDURE TTarWriter.AddSymbolicLink (Filename, Linkname : AnsiString; DateGmt : TDateTime);
 VAR
   DirRec : TTarDirRec;
 BEGIN
@@ -907,7 +918,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddLink (Filename, Linkname : STRING; DateGmt : TDateTime);
+PROCEDURE TTarWriter.AddLink (Filename, Linkname : AnsiString; DateGmt : TDateTime);
 VAR
   DirRec : TTarDirRec;
 BEGIN
@@ -932,7 +943,7 @@ BEGIN
 END;
 
 
-PROCEDURE TTarWriter.AddVolumeHeader (VolumeId           : STRING; DateGmt : TDateTime);
+PROCEDURE TTarWriter.AddVolumeHeader (VolumeId           : AnsiString; DateGmt : TDateTime);
 VAR
   DirRec : TTarDirRec;
 BEGIN

+ 8 - 8
packages/winunits-base/src/shellapi.pp

@@ -1781,14 +1781,14 @@ Function Shell_NotifyIcon( dwMessage: Dword;lpData: PNOTIFYICONDATAW):Bool;exter
        SHGFI_ADDOVERLAYS        = $000000020;    { apply the appropriate overlays }
        SHGFI_OVERLAYINDEX       = $000000040;    { Get the index of the overlay }
                                                  { in the upper 8 bits of the iIcon  }
-Function SHGetFileInfoA(pszPath: LPCSTR; dwFileAttributes : DWORD; psfi: pSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoA';
-Function SHGetFileInfoW(pszPath: LPCWSTR; dwFileAttributes : DWORD; psfi: pSHFILEINFOW; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoW';
-Function SHGetFileInfo(pszPath: LPCSTR; dwFileAttributes : DWORD; psfi: pSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoA';
-
-Function SHGetFileInfoA(pszPath: LPCSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoA';
-Function SHGetFileInfoW(pszPath: LPCWSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOW; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoW';
-Function SHGetFileInfo(pszPath: LPCSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoA';
-Function SHGetFileInfo(pszPath: LPCWSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOW; cbFileInfo,UFlags: UINT):DWORD;external shell32 name 'SHGetFileInfoW';
+Function SHGetFileInfoA(pszPath: LPCSTR; dwFileAttributes : DWORD; psfi: pSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoA';
+Function SHGetFileInfoW(pszPath: LPCWSTR; dwFileAttributes : DWORD; psfi: pSHFILEINFOW; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoW';
+Function SHGetFileInfo(pszPath: LPCSTR; dwFileAttributes : DWORD; psfi: pSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoA';
+
+Function SHGetFileInfoA(pszPath: LPCSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoA';
+Function SHGetFileInfoW(pszPath: LPCWSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOW; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoW';
+Function SHGetFileInfo(pszPath: LPCSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOA; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoA';
+Function SHGetFileInfo(pszPath: LPCWSTR; dwFileAttributes : DWORD; var psfi: TSHFILEINFOW; cbFileInfo,UFlags: UINT):DWORD_PTR;external shell32 name 'SHGetFileInfoW';
 
 Function SHGetDiskFreeSpaceExA( pszDirectoryName : LPCSTR; pulFreeBytesAvailableToCaller : pULARGE_INTEGER; pulTotalNumberOfBytes : pULARGE_INTEGER;pulTotalNumberOfFreeBytes: pULARGE_INTEGER):Bool;external shell32 name 'SHGetDiskFreeSpaceExA';
 Function SHGetDiskFreeSpaceExW( pszDirectoryName : LPCWSTR; pulFreeBytesAvailableToCaller : pULARGE_INTEGER; pulTotalNumberOfBytes : pULARGE_INTEGER;pulTotalNumberOfFreeBytes: pULARGE_INTEGER):Bool;external shell32 name 'SHGetDiskFreeSpaceExW';

+ 3 - 0
rtl/inc/systemh.inc

@@ -271,6 +271,9 @@ Type
   ValUInt = Word;
 {$endif CPU16}
 
+  NativeInt  = PtrInt;
+  NativeUint = PtrUint;
+
 { Zero - terminated strings }
   PChar               = ^Char;
   PPChar              = ^PChar;

+ 7 - 3
rtl/linux/system.pp

@@ -33,7 +33,7 @@ Unit System;
 
 {$I sysunixh.inc}
 
-function get_cmdline:Pchar;
+function get_cmdline:Pchar; 
 property cmdline:Pchar read get_cmdline;
 
 {$if defined(CPUARM) or defined(CPUM68K)}
@@ -179,6 +179,7 @@ begin
          found:=true;
          break;
        end;
+     found:=found or (len=0); // also quote if len=0, bug 19114
      if bufsize+len>=ARG_MAX-2 then
       AddBuf;
      if found then
@@ -186,8 +187,11 @@ begin
         buf[bufsize]:='"';
         inc(bufsize);
       end;
-     move(argv[i]^,buf[bufsize],len);
-     inc(bufsize,len);
+     if len>0 then
+       begin
+         move(argv[i]^,buf[bufsize],len);
+         inc(bufsize,len);
+       end;
      if found then
       begin
         buf[bufsize]:='"';

+ 1 - 1
rtl/win/wininc/func.inc

@@ -1041,7 +1041,7 @@ function SHBrowseForFolder(_para1:LPBROWSEINFO):LPITEMIDLIST; external 'shell32'
 procedure SHChangeNotify(_para1:LONG; _para2:UINT; _para3:LPCVOID; _para4:LPCVOID); external 'shell32' name 'SHChangeNotify';
 function SHFileOperation(_para1:LPSHFILEOPSTRUCT):longint; external 'shell32' name 'SHFileOperation';
 procedure SHFreeNameMappings(_para1:HANDLE); external 'shell32' name 'SHFreeNameMappings';
-function SHGetFileInfo(_para1:LPCTSTR; _para2:DWORD; var _para3:SHFILEINFO; _para4:UINT; _para5:UINT):DWORD; external 'shell32' name 'SHGetFileInfo';
+function SHGetFileInfo(_para1:LPCTSTR; _para2:DWORD; var _para3:SHFILEINFO; _para4:UINT; _para5:UINT):DWORD_PTR; external 'shell32' name 'SHGetFileInfo';
 function SHGetPathFromIDList(_para1:LPCITEMIDLIST; _para2:LPTSTR):WINBOOL; external 'shell32' name 'SHGetPathFromIDList';
 function SHGetSpecialFolderLocation(_para1:HWND; _para2:longint; var _para3:LPITEMIDLIST):HRESULT; external 'shell32' name 'SHGetSpecialFolderLocation';