{
   Double commander
   -------------------------------------------------------------------------
   Definitions of basic types.

   Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com)

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
}

unit DCBasicTypes;

{$mode objfpc}{$H+}
{$modeswitch advancedrecords}

interface

type
  TDynamicStringArray = array of String;
  TCharSet = set of Char;

  TFileAttrs = Cardinal;     // file attributes type regardless of system

  TWinFileTime = QWord;      // NTFS time (UTC) (2 x DWORD)
  TDosFileTime = LongInt;    // MS-DOS time (local)
  TUnixFileTime = Int64;     // UNIX time (UTC)

{$IFDEF MSWINDOWS}
  TFileTime = TWinFileTime;
  TFileTimeEx = TFileTime;
{$ELSE}
  TFileTime = TUnixFileTime;

  TFileTimeEx = record
    public
      sec: int64;
      nanosec: int64;
    public
      constructor create( aSec:int64; aNanosec:int64=0 );
      class operator =(l,r : TFileTimeEx): Boolean;
  end;
{$ENDIF}

  PFileTime = ^TFileTime;
  PWinFileTime = ^TWinFileTime;

const
  TFileTimeExNull: TFileTimeEx = {$IFDEF MSWINDOWS} 0 {$ELSE} (sec:0; nanosec:-1) {$ENDIF};

implementation

{$IF not DEFINED(MSWINDOWS)}
constructor TFileTimeEx.Create(aSec: Int64; aNanosec: Int64);
begin
  Self.sec:= aSec;
  Self.nanosec:= aNanosec;

  if Self.nanosec < 0 then
    Self.nanosec := 0
  else if Self.nanosec > 999999999 then
  begin
    Self.nanosec := 999999999;
  end;
end;

class operator TFileTimeEx.=(l,r : TFileTimeEx): Boolean;
begin
  Result:= (l.sec=r.sec) and (l.nanosec=r.nanosec);
end;
{$ENDIF}

end.
