{
    This file is part of the Free Pascal run time library.
    Copyright (c) 2003 - 2004 by Olle Raab

    A selection of the MacOS API for FreePascal, written
    in the Turbo Pascal dialect.
    It is primarily for internal use in the rtl, please
    do not expect it to remain the same over time,
    it will be subject to changes.

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    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.

 **********************************************************************}

{Note: Types like Mac_XXX corresponds to the type XXX defined
in MacOS Universal Headers. The prefix is to avoid name clashes
with FPC types.}

{For a future possiblity of compiling the RTL under Carbon,
 sections containing Carbon only code should be under
 ifdef TARGET_API_MAC_CARBON, at the moment it is always undefinded: }

{$UNDEF TARGET_API_MAC_CARBON }

{$IFDEF TARGET_API_MAC_CARBON }
{$DEFINE OPAQUE_TOOLBOX_STRUCTS }
{$ENDIF}

{$PACKRECORDS 2}  {Alignment inherited from the m68k days}

{************** from Types.p ***************}
const
  noErr = 0;

type
  SignedByte = shortint;
  SignedBytePtr = ^SignedByte;

  SInt8                               = ShortInt; //-128..127;
  SInt16                              = SmallInt; // INTEGER;
  SInt32                              = LONGINT;
  // Overlapping types are now declared in the System unit (KB)
  //UInt8                               = 0..255;
  //UInt16                              = WORD;
  //UInt32                              = LONGWORD;

  IntegerPtr              = ^INTEGER;
  LongIntPtr              = ^LONGINT;

  OSErr = Integer;

  FourCharCode = Longword;

  OSType = FourCharCode;
  ResType = FourCharCode;
  Mac_Ptr = pointer;
  Mac_Handle = ^Mac_Ptr;
  Str31 = string[31];
  Str32 = string[32];
  Str63 = string[63];
  Str255 = string[255];
  StringPtr = ^Str255;
  ProcPtr = Mac_Ptr;
  UniversalProcPtr = ProcPtr;

  ScriptCode = INTEGER;

  LangCode = INTEGER;

  Point = record
    case INTEGER of
     0: (
       v: INTEGER;
       h: INTEGER;
     );
     1: (
       vh: array[0..1] of INTEGER;
     );
   end;

  PointPtr = ^Point;

  Rect = record
    case INTEGER of
     0: (
       top: INTEGER;
       left: INTEGER;
       bottom: INTEGER;
       right: INTEGER;
     );
     1: (
       topLeft: Point;
       botRight: Point;
     );
   end;

  RectPtr = ^Rect;

procedure Debugger;
external 'InterfaceLib';

procedure DebugStr(s: Str255);
external 'InterfaceLib';

{************** from Memory.p ***************}

type
  Size = Longint;

function NewHandle (byteCount: Size): Mac_Handle;
external 'InterfaceLib';

function NewPtr(logicalSize: Size): Mac_Ptr ;
external 'InterfaceLib';

procedure DisposePtr (p: Mac_Ptr);
external 'InterfaceLib';
function GetPtrSize (p: Mac_Ptr): Size;
external 'InterfaceLib';
procedure SetPtrSize (p: Mac_Ptr; newSize: Size);
external 'InterfaceLib';
procedure DisposeHandle (h: Mac_Handle);
external 'InterfaceLib';
procedure SetHandleSize (h: Mac_Handle; newSize: Size);
external 'InterfaceLib';
function GetHandleSize (h: Mac_Handle): Size;
external 'InterfaceLib';

function Mac_FreeMem: Longint;
external 'InterfaceLib' name 'FreeMem';
PROCEDURE MaxApplZone;
external 'InterfaceLib';
PROCEDURE HLock(h: Mac_Handle);
external 'InterfaceLib';
PROCEDURE HUnlock(h: Mac_Handle);
external 'InterfaceLib';
function MemError: OSErr;
external 'InterfaceLib';

{************** from GestaltEqu.p ***************}
FUNCTION Gestalt(selector: OSType; VAR response: LONGINT): OSErr;
external 'InterfaceLib' name 'Gestalt';

const
  {   Gestalt selector and values for the Appearance Manager   }
  gestaltAliasMgrAttr      = 'alis';            {  Alias Mgr Attributes  }
  gestaltAliasMgrPresent    = 0;              {  True if the Alias Mgr is present  }
  gestaltAliasMgrSupportsRemoteAppletalk = 1;          {  True if the Alias Mgr knows about Remote Appletalk  }
  gestaltAliasMgrSupportsAOCEKeychain = 2;          {  True if the Alias Mgr knows about the AOCE Keychain  }
  gestaltAliasMgrResolveAliasFileWithMountOptions = 3;    {  True if the Alias Mgr implements gestaltAliasMgrResolveAliasFileWithMountOptions() and IsAliasFile()  }
  gestaltAliasMgrFollowsAliasesWhenResolving = 4;
  gestaltAliasMgrSupportsExtendedCalls = 5;
  gestaltAliasMgrSupportsFSCalls = 6;              {  true if Alias Mgr supports HFS+ Calls  }

  gestaltAppearanceAttr    = 'appr';
  gestaltAppearanceExists    = 0;
  gestaltAppearanceCompatMode  = 1;

  {   Gestalt selector for determining Appearance Manager version     }
  {   If this selector does not exist, but gestaltAppearanceAttr      }
  {   does, it indicates that the 1.0 version is installed. This      }
  {   gestalt returns a BCD number representing the version of the    }
  {   Appearance Manager that is currently running, e.g. 0x0101 for   }
  {   version 1.0.1.                                                  }
  gestaltAppearanceVersion  = 'apvr';

  gestaltCFMAttr        = 'cfrg';            {  Selector for information about the Code Fragment Manager  }
  gestaltCFMPresent      = 0;              {  True if the Code Fragment Manager is present  }
  gestaltCFMPresentMask    = $0001;
  gestaltCFM99Present      = 2;              {  True if the CFM-99 features are present.  }
  gestaltCFM99PresentMask    = $0004;

  gestaltAppleEventsAttr    = 'evnt';            {  Apple Events attributes  }
  gestaltAppleEventsPresent  = 0;              {  True if Apple Events present  }
  gestaltScriptingSupport    = 1;
  gestaltOSLInSystem      = 2;              {  OSL is in system so donŐt use the one linked in to app  }

  gestaltFindFolderAttr    = 'fold';            {  Folder Mgr attributes  }
  gestaltFindFolderPresent  = 0;              {  True if Folder Mgr present  }
  gestaltFolderDescSupport  = 1;              {  True if Folder Mgr has FolderDesc calls  }
  gestaltFolderMgrFollowsAliasesWhenResolving = 2;      {  True if Folder Mgr follows folder aliases  }
  gestaltFolderMgrSupportsExtendedCalls = 3;          {  True if Folder Mgr supports the Extended calls  }
  gestaltFolderMgrSupportsDomains = 4;            {  True if Folder Mgr supports domains for the first parameter to FindFolder  }
  gestaltFolderMgrSupportsFSCalls = 5;            {  True if FOlder manager supports __FindFolderFSRef & __FindFolderExtendedFSRef  }

  gestaltFPUType        = 'fpu ';            {  fpu type  }
  gestaltNoFPU        = 0;              {  no FPU  }
  gestalt68881        = 1;              {  68881 FPU  }
  gestalt68882        = 2;              {  68882 FPU  }
  gestalt68040FPU        = 3;              {  68040 built-in FPU  }

  gestaltFSAttr        = 'fs  ';            {  file system attributes  }
  gestaltFullExtFSDispatching  = 0;              {  has really cool new HFSDispatch dispatcher  }
  gestaltHasFSSpecCalls    = 1;              {  has FSSpec calls  }
  gestaltHasFileSystemManager  = 2;              {  has a file system manager  }
  gestaltFSMDoesDynamicLoad  = 3;              {  file system manager supports dynamic loading  }
  gestaltFSSupports4GBVols  = 4;              {  file system supports 4 gigabyte volumes  }
  gestaltFSSupports2TBVols  = 5;              {  file system supports 2 terabyte volumes  }
  gestaltHasExtendedDiskInit  = 6;              {  has extended Disk Initialization calls  }
  gestaltDTMgrSupportsFSM    = 7;              {  Desktop Manager support FSM-based foreign file systems  }
  gestaltFSNoMFSVols      = 8;              {  file system doesn't supports MFS volumes  }
  gestaltFSSupportsHFSPlusVols = 9;              {  file system supports HFS Plus volumes  }
  gestaltFSIncompatibleDFA82  = 10;              {  VCB and FCB structures changed; DFA 8.2 is incompatible  }

  gestaltHasHFSPlusAPIs    = 12;              {  file system supports HFS Plus APIs  }
  gestaltMustUseFCBAccessors  = 13;              {  FCBSPtr and FSFCBLen are invalid - must use FSM FCB accessor functions }
  gestaltFSUsesPOSIXPathsForConversion = 14;          {  The path interchange routines operate on POSIX paths instead of HFS paths  }

  gestaltOSAttr        = 'os  ';            {  o/s attributes  }
  gestaltSysZoneGrowable    = 0;              {  system heap is growable  }
  gestaltLaunchCanReturn    = 1;              {  can return from launch  }
  gestaltLaunchFullFileSpec  = 2;              {  can launch from full file var spec  }
  gestaltLaunchControl    = 3;              {  launch control support available  }
  gestaltTempMemSupport    = 4;              {  temp memory support  }
  gestaltRealTempMemory    = 5;              {  temp memory handles are real  }
  gestaltTempMemTracked    = 6;              {  temporary memory handles are tracked  }
  gestaltIPCSupport      = 7;              {  IPC support is present  }
  gestaltSysDebuggerSupport  = 8;              {  system debugger support is present  }
  gestaltNativeProcessMgrBit  = 19;              {  the process manager itself is native  }

  gestaltQuickdrawVersion    = 'qd  ';            {  quickdraw version  }
  gestaltOriginalQD      = $0000;            {  original 1-bit QD  }
  gestalt8BitQD        = $0100;            {  8-bit color QD  }
  gestalt32BitQD        = $0200;            {  32-bit color QD  }
  gestalt32BitQD11      = $0201;            {  32-bit color QDv1.1  }
  gestalt32BitQD12      = $0220;            {  32-bit color QDv1.2  }
  gestalt32BitQD13      = $0230;            {  32-bit color QDv1.3  }
  gestaltAllegroQD      = $0250;            {  Allegro QD OS 8.5  }
  gestaltMacOSXQD        = $0300;            {  Mac OS X QD  }
  gestaltScriptMgrVersion    = 'scri';            {  Script Manager version number      }
  gestaltScriptCount      = 'scr#';            {  number of active script systems    }

  gestaltStandardFileAttr    = 'stdf';            {  Standard File attributes  }
  gestaltStandardFile58    = 0;              {  True if selectors 5-8 (StandardPutFile-CustomGetFile) are supported  }
  gestaltStandardFileTranslationAware = 1;          {  True if standard file is translation manager aware  }
  gestaltStandardFileHasColorIcons = 2;            {  True if standard file has 16x16 color icons  }
  gestaltStandardFileUseGenericIcons = 3;            {  Standard file LDEF to use only the system generic icons if true  }
  gestaltStandardFileHasDynamicVolumeAllocation = 4;      {  True if standard file supports more than 20 volumes  }

  gestaltSystemVersion    = 'sysv';            {  system version }

  gestaltThreadMgrAttr    = 'thds';            {  Thread Manager attributes  }
  gestaltThreadMgrPresent    = 0;              {  bit true if Thread Mgr is present  }
  gestaltSpecificMatchSupport  = 1;              {  bit true if Thread Mgr supports exact match creation option  }
  gestaltThreadsLibraryPresent = 2;              {  bit true if Thread Mgr shared library is present  }


{************** from OSUtils.p ***************}

type
  QElemPtr = ^QElem;

  QElem = record
    qLink: QElemPtr;
    qType: INTEGER;
    qData: array[0..0] of INTEGER;
   end;

CONST
  curSysEnvVers        = 2;              { Updated to equal latest SysEnvirons version }

TYPE
  SysEnvRecPtr = ^SysEnvRec;
  SysEnvRec = RECORD
    environsVersion:    INTEGER;
    machineType:      INTEGER;
    systemVersion:      INTEGER;
    processor:        INTEGER;
    hasFPU:          BOOLEAN;
    hasColorQD:        BOOLEAN;
    keyBoardType:      INTEGER;
    atDrvrVersNum:      INTEGER;
    sysVRefNum:        INTEGER;
  END;

FUNCTION SysEnvirons(versionRequested: INTEGER; VAR theWorld: SysEnvRec): OSErr;
external 'InterfaceLib';

{************** from Finder.p ***************}

 type
  FInfo = record
    fdType: OSType;    {the type of the file}
    fdCreator: OSType;    {file's creator}
    fdFlags: INTEGER;    {flags ex. hasbundle,invisible,locked, etc.}
    fdLocation: Point;    {file's location in folder}
    fdFldr: INTEGER;    {folder containing file}
   end;

  FXInfo = record
    fdIconID: INTEGER;    {Icon ID}
    fdUnused: array[0..2] of INTEGER;  {unused but reserved 6 bytes}
    fdScript: SInt8;    {Script flag and number}
    fdXFlags: SInt8;    {More flag bits}
    fdComment: INTEGER;    {Comment ID}
    fdPutAway: LONGINT;    {Home Dir ID}
   end;

  DInfo = record
    frRect: Rect;    {folder rect}
    frFlags: INTEGER;    {Flags}
    frLocation: Point;    {folder location}
    frView: INTEGER;    {folder view}
   end;

  DXInfo = record
    frScroll: Point;    {scroll position}
    frOpenChain: LONGINT;  {DirID chain of open folders}
    frScript: SInt8;    {Script flag and number}
    frXFlags: SInt8;    {More flag bits}
    frComment: INTEGER;    {comment}
    frPutAway: LONGINT;    {DirID}
   end;

{************** from Files.p ***************}

const
  fsAtMark = 0;
  fsCurPerm = 0;
  fsRdPerm = 1;
  fInvisible = 16384;
  fsWrPerm = 2;
  fsRdWrPerm = 3;
  fsRdWrShPerm = 4;
  fsFromStart = 1;
  fsFromLEOF = 2;
  fsFromMark = 3;
  rdVerify = 64;
  ioMapBuffer = 4;
  ioModeReserved = 8;
  ioDirFlg = 4;      { see IM IV-125 }
  ioDirMask = $10;
  fsRtParID = 1;
  fsRtDirID = 2;

type
  CatPositionRecPtr = ^CatPositionRec;
  CatPositionRec = RECORD
    initialize:        LONGINT;
    priv:          ARRAY [1..6] OF INTEGER;
  END;

  FSSpec = record
      vRefNum: Integer;
      parID: Longint;
      name: Str63;
   end;
  FSSpecPtr = ^FSSpec;

  ParmBlkPtr              = ^ParamBlockRec;

  IOCompletionUPP = UniversalProcPtr;

  ParamBlockRecPtr = ^ParamBlockRec;
  ParamBlockRec = RECORD
    qLink:          QElemPtr;                { queue link in header }
    qType:          INTEGER;                { type byte for safety check }
    ioTrap:          INTEGER;                { FS: the Trap }
    ioCmdAddr:        Mac_Ptr;                  { FS: address to dispatch to }
    ioCompletion:      IOCompletionUPP;            { completion routine addr (0 for synch calls) }
    ioResult:        OSErr;                  { result code }
    ioNamePtr:        StringPtr;                { ptr to Vol:FileName string }
    ioVRefNum:        INTEGER;                { volume refnum (DrvNum for Eject and MountVol) }
    CASE INTEGER OF
    0: (
      ioRefNum:      INTEGER;                { refNum for I/O operation }
      ioVersNum:      SInt8;                  { version number }
      ioPermssn:      SInt8;                  { Open: permissions (byte) }
      ioMisc:        Mac_Ptr;                  { Rename: new name (GetEOF,SetEOF: logical end of file) (Open: optional ptr to buffer) (SetFileType: new type) }
      ioBuffer:      Mac_Ptr;                  { data buffer Ptr }
      ioReqCount:      LONGINT;                { requested byte count; also = ioNewDirID }
      ioActCount:      LONGINT;                { actual byte count completed }
      ioPosMode:      INTEGER;                { initial file positioning }
      ioPosOffset:    LONGINT;                { file position offset }
       );
    1: (
      ioFRefNum:      INTEGER;                { reference number }
      ioFVersNum:      SInt8;                  { version number }
      filler1:      SInt8;
      ioFDirIndex:    INTEGER;                { GetFInfo directory index }
      ioFlAttrib:      SInt8;                  { GetFInfo: in-use bit=7, lock bit=0 }
      ioFlVersNum:    SInt8;                  { file version number }
      ioFlFndrInfo:    FInfo;                  { user info }
      ioFlNum:      UInt32;                  { GetFInfo: file number; TF- ioDirID }
      ioFlStBlk:      UInt16;                  { start file block (0 if none) }
      ioFlLgLen:      LONGINT;                { logical length (EOF) }
      ioFlPyLen:      LONGINT;                { physical length }
      ioFlRStBlk:      UInt16;                  { start block rsrc fork }
      ioFlRLgLen:      LONGINT;                { file logical length rsrc fork }
      ioFlRPyLen:      LONGINT;                { file physical length rsrc fork }
      ioFlCrDat:      UInt32;                  { file creation date& time (32 bits in secs) }
      ioFlMdDat:      UInt32;                  { last modified date and time }
       );
    2: (
      filler2:      LONGINT;
      ioVolIndex:      INTEGER;                { volume index number }
      ioVCrDate:      UInt32;                  { creation date and time }
      ioVLsBkUp:      UInt32;                  { last backup date and time }
      ioVAtrb:      UInt16;                  { volume attrib }
      ioVNmFls:      UInt16;                  { number of files in directory }
      ioVDirSt:      UInt16;                  { start block of file directory }
      ioVBlLn:      INTEGER;                { GetVolInfo: length of dir in blocks }
      ioVNmAlBlks:    UInt16;                  { for compatibilty ioVNmAlBlks * ioVAlBlkSiz <= 2 GB }
      ioVAlBlkSiz:    UInt32;                  { for compatibilty ioVAlBlkSiz is <= $0000FE00 (65,024) }
      ioVClpSiz:      UInt32;                  { GetVolInfo: bytes to allocate at a time }
      ioAlBlSt:      UInt16;                  { starting disk(512-byte) block in block map }
      ioVNxtFNum:      UInt32;                  { GetVolInfo: next free file number }
      ioVFrBlk:      UInt16;                  { GetVolInfo: # free alloc blks for this vol }
       );
    3: (
      ioCRefNum:      INTEGER;                { refNum for I/O operation }
      csCode:        INTEGER;                { word for control status code }
      csParam:      ARRAY [0..10] OF INTEGER;        { operation-defined parameters }
       );
    4: (
      ioSRefNum:      INTEGER;
      ioSVersNum:      SInt8;
      ioSPermssn:      SInt8;
      ioSMix:        Mac_Ptr;
      ioSFlags:      INTEGER;
      ioSlot:        SInt8;
      ioID:        SInt8;
       );
    5: (
      ioMRefNum:      INTEGER;
      ioMVersNum:      SInt8;
      ioMPermssn:      SInt8;
      ioMMix:        Mac_Ptr;
      ioMFlags:      INTEGER;
      ioSEBlkPtr:      Mac_Ptr;
       );
  END;

  CInfoPBRecPtr = ^CInfoPBRec;

  CInfoPBRec = record
    qLink: QElemPtr;
    qType: INTEGER;
    ioTrap: INTEGER;
    ioCmdAddr: Mac_Ptr;
    ioCompletion: IOCompletionUPP;
    ioResult: OSErr;
    ioNamePtr: StringPtr;
    ioVRefNum: INTEGER;
    ioFRefNum: INTEGER;
    ioFVersNum: SInt8;
    filler1: SInt8;
    ioFDirIndex: INTEGER;
    ioFlAttrib: SInt8;
    ioACUser: SInt8;
    case INTEGER of
     0: (
       ioFlFndrInfo: FInfo;
       ioDirID: LONGINT;
       ioFlStBlk: INTEGER;
       ioFlLgLen: LONGINT;
       ioFlPyLen: LONGINT;
       ioFlRStBlk: INTEGER;
       ioFlRLgLen: LONGINT;
       ioFlRPyLen: LONGINT;
       ioFlCrDat: LONGINT;
       ioFlMdDat: LONGINT;
       ioFlBkDat: LONGINT;
       ioFlXFndrInfo: FXInfo;
       ioFlParID: LONGINT;
       ioFlClpSiz: LONGINT;
     );
     1: (
       ioDrUsrWds: DInfo;
       ioDrDirID: LONGINT;
       ioDrNmFls: INTEGER;
       filler3: array[1..9] of INTEGER;
       ioDrCrDat: LONGINT;
       ioDrMdDat: LONGINT;
       ioDrBkDat: LONGINT;
       ioDrFndrInfo: DXInfo;
       ioDrParID: LONGINT;
     );
   end;

  CInfoPBPtr = ^CInfoPBRec;

  DTPBRecPtr = ^DTPBRec;
  DTPBRec = RECORD
    qLink:          QElemPtr;                { queue link in header }
    qType:          INTEGER;                { type byte for safety check }
    ioTrap:          INTEGER;                { FS: the Trap }
    ioCmdAddr:        Mac_Ptr;                  { FS: address to dispatch to }
    ioCompletion:      IOCompletionUPP;            { completion routine addr (0 for synch calls) }
    ioResult:        OSErr;                  { result code }
    ioNamePtr:        StringPtr;                { ptr to Vol:FileName string }
    ioVRefNum:        INTEGER;                { volume refnum (DrvNum for Eject and MountVol) }
    ioDTRefNum:        INTEGER;                {  desktop refnum  }
    ioIndex:        INTEGER;
    ioTagInfo:        LONGINT;
    ioDTBuffer:        Mac_Ptr;
    ioDTReqCount:      LONGINT;
    ioDTActCount:      LONGINT;
    ioFiller1:        SInt8;
    ioIconType:        SInt8;
    ioFiller2:        INTEGER;
    ioDirID:        LONGINT;
    ioFileCreator:      OSType;
    ioFileType:        OSType;
    ioFiller3:        LONGINT;
    ioDTLgLen:        LONGINT;
    ioDTPyLen:        LONGINT;
    ioFiller4:        ARRAY [1..14] OF INTEGER;
    ioAPPLParID:      LONGINT;
  END;
  DTPBPtr                = ^DTPBRec;

  HParamBlockRecPtr = ^HParamBlockRec;
  HParamBlockRec = RECORD
    qLink:          QElemPtr;                { queue link in header }
    qType:          INTEGER;                { type byte for safety check }
    ioTrap:          INTEGER;                { FS: the Trap }
    ioCmdAddr:        pointer;                  { FS: address to dispatch to }
    ioCompletion:      IOCompletionUPP;            { completion routine addr (0 for synch calls) }
    ioResult:        OSErr;                  { result code }
    ioNamePtr:        StringPtr;                { ptr to Vol:FileName string }
    ioVRefNum:        INTEGER;                { volume refnum (DrvNum for Eject and MountVol) }
    CASE INTEGER OF
    0: (
      ioRefNum:      INTEGER;
      ioVersNum:      SInt8;
      ioPermssn:      SInt8;
      ioMisc:        pointer;
      ioBuffer:      pointer;
      ioReqCount:      LONGINT;
      ioActCount:      LONGINT;
      ioPosMode:      INTEGER;
      ioPosOffset:    LONGINT;
       );
    1: (
      ioFRefNum:      INTEGER;
      ioFVersNum:      SInt8;
      filler1:      SInt8;
      ioFDirIndex:    INTEGER;
      ioFlAttrib:      SInt8;
      ioFlVersNum:    SInt8;
      ioFlFndrInfo:    FInfo;
      ioDirID:      LONGINT;
      ioFlStBlk:      UInt16;
      ioFlLgLen:      LONGINT;
      ioFlPyLen:      LONGINT;
      ioFlRStBlk:      UInt16;
      ioFlRLgLen:      LONGINT;
      ioFlRPyLen:      LONGINT;
      ioFlCrDat:      UInt32;
      ioFlMdDat:      UInt32;
       );
    2: (
      filler2:      LONGINT;
      ioVolIndex:      INTEGER;
      ioVCrDate:      UInt32;
      ioVLsMod:      UInt32;
      ioVAtrb:      INTEGER;
      ioVNmFls:      UInt16;
      ioVBitMap:      UInt16;
      ioAllocPtr:      UInt16;
      ioVNmAlBlks:    UInt16;
      ioVAlBlkSiz:    UInt32;
      ioVClpSiz:      UInt32;
      ioAlBlSt:      UInt16;
      ioVNxtCNID:      UInt32;
      ioVFrBlk:      UInt16;
      ioVSigWord:      UInt16;
      ioVDrvInfo:      INTEGER;
      ioVDRefNum:      INTEGER;
      ioVFSID:      INTEGER;
      ioVBkUp:      UInt32;
      ioVSeqNum:      UInt16;
      ioVWrCnt:      UInt32;
      ioVFilCnt:      UInt32;
      ioVDirCnt:      UInt32;
      ioVFndrInfo:    ARRAY [1..8] OF LONGINT;
       );
    3: (
      filler3:      INTEGER;
      ioDenyModes:    INTEGER;                { access rights data }
      filler4:      INTEGER;
      filler5:      SInt8;
      ioACUser:      SInt8;                  { access rights for directory only }
      filler6:      LONGINT;
      ioACOwnerID:    LONGINT;                { owner ID }
      ioACGroupID:    LONGINT;                { group ID }
      ioACAccess:      LONGINT;                { access rights }
       );
    4: (
      filler7:      INTEGER;
      ioObjType:      INTEGER;                { function code }
      ioObjNamePtr:    StringPtr;                { ptr to returned creator/group name }
      ioObjID:      LONGINT;                { creator/group ID }
       );
    5: (
      ioDstVRefNum:    INTEGER;                { destination vol identifier }
      filler8:      INTEGER;
      ioNewName:      StringPtr;                { ptr to destination pathname }
      ioCopyName:      StringPtr;                { ptr to optional name }
      ioNewDirID:      LONGINT;                { destination directory ID }
       );
    6: (
      ioWDCreated:    INTEGER;
      ioWDIndex:      INTEGER;
      ioWDProcID:      LONGINT;
      ioWDVRefNum:    INTEGER;
      filler10:      INTEGER;
      filler11:      LONGINT;
      filler12:      LONGINT;
      filler13:      LONGINT;
      ioWDDirID:      LONGINT;
       );
    7: (
      filler14:      LONGINT;
      ioDestNamePtr:    StringPtr;                {  dest file name  }
      filler15:      LONGINT;
      ioDestDirID:    LONGINT;                {  dest file's directory id  }
      filler16:      LONGINT;
      filler17:      LONGINT;
      ioSrcDirID:      LONGINT;                {  source file's directory id  }
      filler18:      INTEGER;
      ioFileID:      LONGINT;                {  file ID  }
       );
    8: (
      ioMatchPtr:      FSSpecPtr;                {  match array  }
      ioReqMatchCount:  LONGINT;                {  maximum allowable matches  }
      ioActMatchCount:  LONGINT;                {  actual match count  }
      ioSearchBits:    LONGINT;                {  search criteria selector  }
      ioSearchInfo1:    CInfoPBPtr;                {  search values and range lower bounds  }
      ioSearchInfo2:    CInfoPBPtr;                {  search values and range upper bounds  }
      ioSearchTime:    LONGINT;                {  length of time to run search  }
      ioCatPosition:    CatPositionRec;              {  current position in the catalog  }
      ioOptBuffer:    pointer;                  {  optional performance enhancement buffer  }
      ioOptBufSize:    LONGINT;                {  size of buffer pointed to by ioOptBuffer  }
       );
    9: (
      ioFiller21:      LONGINT;
      ioFiller22:      LONGINT;
      ioForeignPrivBuffer: pointer;
      ioForeignPrivActCount: LONGINT;
      ioForeignPrivReqCount: LONGINT;
      ioFiller23:      LONGINT;
      ioForeignPrivDirID:  LONGINT;
      ioForeignPrivInfo1:  LONGINT;
      ioForeignPrivInfo2:  LONGINT;
      ioForeignPrivInfo3:  LONGINT;
      ioForeignPrivInfo4:  LONGINT;
       );
  END;

  HParmBlkPtr              = ^HParamBlockRec;


  WDPBRecPtr = ^WDPBRec;
  WDPBRec = RECORD
    qLink:          QElemPtr;
    qType:          INTEGER;
    ioTrap:          INTEGER;
    ioCmdAddr:        pointer;
    ioCompletion:      IOCompletionUPP;
    ioResult:        OSErr;
    ioNamePtr:        StringPtr;
    ioVRefNum:        INTEGER;
    filler1:        INTEGER;
    ioWDIndex:        INTEGER;
    ioWDProcID:        LONGINT;
    ioWDVRefNum:      INTEGER;
    filler2:        ARRAY [1..7] OF INTEGER;
    ioWDDirID:        LONGINT;
  END;

  WDPBPtr                = ^WDPBRec;

FUNCTION PBGetVInfoSync(paramBlock: ParmBlkPtr): OSErr;
external 'InterfaceLib';

FUNCTION GetVol(volName: StringPtr; VAR vRefNum: INTEGER): OSErr;
external 'InterfaceLib';

function FSpOpenDF(var spec: FSSpec; permission: SignedByte;
  var refNum: Integer): OSErr;
external 'InterfaceLib';

function FSpCreate(var spec: FSSpec; creator, fileType: OSType;
  scriptTag: ScriptCode): OSErr;
external 'InterfaceLib';

function FSpDirCreate(var spec: FSSpec; scriptTag: ScriptCode;
  var createdDirID: Longint): OSErr;
external 'InterfaceLib';

function FSpDelete(var spec: FSSpec): OSErr;
external 'InterfaceLib';

FUNCTION FSpGetFInfo(var spec: FSSpec; VAR fndrInfo: FInfo): OSErr;
external 'InterfaceLib';

FUNCTION FSpSetFInfo(var spec: FSSpec; var fndrInfo: FInfo): OSErr;
external 'InterfaceLib';

FUNCTION FSpSetFLock(var spec: FSSpec): OSErr;
external 'InterfaceLib';

FUNCTION FSpRstFLock(var spec: FSSpec): OSErr;
external 'InterfaceLib';

function FSClose(refNum: Integer): OSErr;
external 'InterfaceLib';

function FSRead(refNum: Integer; var count: Longint; buffPtr: Mac_Ptr): OSErr;
external 'InterfaceLib';

function FSWrite(refNum: Integer; var count: Longint; buffPtr: Mac_Ptr): OSErr;
external 'InterfaceLib';

function GetEOF(refNum: Integer; var logEOF: Longint): OSErr;
external 'InterfaceLib';

function SetEOF(refNum: Integer; logEOF: Longint): OSErr;
external 'InterfaceLib';

function GetFPos(refNum: Integer; var filePos: Longint): OSErr;
external 'InterfaceLib';

function SetFPos(refNum: Integer; posMode: Integer; posOff: Longint): OSErr;
external 'InterfaceLib';

FUNCTION PBGetWDInfoSync(paramBlock: WDPBPtr): OSErr;
external 'InterfaceLib';

function PBGetCatInfoSync (paramBlock: CInfoPBPtr): OSErr;
external 'InterfaceLib';

FUNCTION PBSetCatInfoSync(paramBlock: CInfoPBPtr): OSErr;
external 'InterfaceLib';

FUNCTION PBHGetVInfoSync(paramBlock: HParmBlkPtr): OSErr;
external 'InterfaceLib';

function FSMakeFSSpec (vRefNum: Integer; dirID: LongInt;
  fileName: Str255; VAR spec: FSSpec): OSErr;
external 'InterfaceLib';

FUNCTION HGetFInfo(vRefNum: INTEGER; dirID: LONGINT; fileName: Str255;
  VAR fndrInfo: FInfo): OSErr;
external 'InterfaceLib';

FUNCTION PBDTGetPath(paramBlock: DTPBPtr): OSErr;
external 'InterfaceLib';

FUNCTION PBDTGetAPPLSync(paramBlock: DTPBPtr): OSErr;
external 'InterfaceLib';

{************** from Aliases.p ***************}

type
  AliasHandle = Mac_Handle;

function NewAliasMinimalFromFullPath(fullPathLength: Integer;
  fullPath: Mac_Ptr; zoneName: Str32; serverName: Str31;
  var alias: AliasHandle):OSErr;
external 'InterfaceLib';

function ResolveAlias(fromFile: FSSpecPtr; alias: AliasHandle;
  var target: FSSpec; var wasChanged: Boolean):OSErr;
external 'InterfaceLib';


{************** from Folders.p ***************}

CONST
  kOnSystemDisk        = -32768;            {  previously was 0x8000 but that is an unsigned value whereas vRefNum is signed }
  kOnAppropriateDisk      = -32767;            {  Generally, the same as kOnSystemDisk, but it's clearer that this isn't always the 'boot' disk. }
                                {  Folder Domains - Carbon only.  The constants above can continue to be used, but the folder/volume returned will }
                                {  be from one of the domains below. }
  kSystemDomain        = -32766;            {  Read-only system hierarchy. }
  kLocalDomain        = -32765;            {  All users of a single machine have access to these resources. }
  kNetworkDomain        = -32764;            {  All users configured to use a common network server has access to these resources. }
  kUserDomain          = -32763;            {  Read/write. Resources that are private to the user. }
  kClassicDomain        = -32762;            {  Domain referring to the currently configured Classic System Folder }

  kCreateFolder        = true;
  kDontCreateFolder      = false;

  kSystemFolderType      = 'macs';            {  the system folder  }
  kDesktopFolderType      = 'desk';            {  the desktop folder; objects in this folder show on the desk top.  }
  kSystemDesktopFolderType  = 'sdsk';            {  the desktop folder at the root of the hard drive, never the redirected user desktop folder  }
  kTrashFolderType      = 'trsh';            {  the trash folder; objects in this folder show up in the trash  }
  kSystemTrashFolderType    = 'strs';            {  the trash folder at the root of the drive, never the redirected user trash folder  }
  kWhereToEmptyTrashFolderType = 'empt';            {  the "empty trash" folder; Finder starts empty from here down  }
  kPrintMonitorDocsFolderType  = 'prnt';            {  Print Monitor documents  }
  kStartupFolderType      = 'strt';            {  Finder objects (applications, documents, DAs, aliases, to...) to open at startup go here  }
  kShutdownFolderType      = 'shdf';            {  Finder objects (applications, documents, DAs, aliases, to...) to open at shutdown go here  }
  kAppleMenuFolderType    = 'amnu';            {  Finder objects to put into the Apple menu go here  }
  kControlPanelFolderType    = 'ctrl';            {  Control Panels go here (may contain INITs)  }
  kSystemControlPanelFolderType = 'sctl';            {  System control panels folder - never the redirected one, always "Control Panels" inside the System Folder  }
  kExtensionFolderType    = 'extn';            {  System extensions go here  }
  kFontsFolderType      = 'font';            {  Fonts go here  }
  kPreferencesFolderType    = 'pref';            {  preferences for applications go here  }
  kSystemPreferencesFolderType = 'sprf';            {  System-type Preferences go here - this is always the system's preferences folder, never a logged in user's  }
  kTemporaryFolderType    = 'temp';            {  temporary files go here (deleted periodically, but don't rely on it.)  }

FUNCTION FindFolder(vRefNum: INTEGER; folderType: OSType; createFolder: BOOLEAN; VAR foundVRefNum: INTEGER; VAR foundDirID: LONGINT): OSErr;
external 'InterfaceLib';

{************** from Events.p ***************}

TYPE
  EventKind              = UInt16;
  EventMask              = UInt16;
  EventModifiers            = UInt16;

TYPE
  EventRecordPtr = ^EventRecord;
  EventRecord = RECORD
    what:          EventKind;
    message:        UInt32;
    when:          UInt32;
    where:          Point;
    modifiers:        EventModifiers;
  END;

{************** from Processes.p ***************}

type
  ProcessSerialNumberPtr = ^ProcessSerialNumber;
  ProcessSerialNumber = record
    highLongOfPSN: LONGINT;
    lowLongOfPSN: LONGINT;
   end;

const
{ Process identifier - Various reserved process serial numbers }
  kNoProcess = 0;
  kSystemProcess = 1;
  kCurrentProcess = 2;

TYPE
  LaunchFlags              = UInt16;

CONST
  launchContinue        = $4000;
  launchNoFileFlags      = $0800;
  launchUseMinimum      = $0400;
  launchDontSwitch      = $0200;
  launchAllow24Bit      = $0100;
  launchInhibitDaemon      = $0080;

  {   Format for first AppleEvent to pass to new process.  The size of the overall
    buffer variable: the message body immediately follows the messageLength   }

TYPE
  AppParametersPtr = ^AppParameters;
  AppParameters = RECORD
    theMsgEvent:      EventRecord;
    eventRefCon:      UInt32;
    messageLength:      UInt32;
  END;

  {   Parameter block to _Launch   }
  LaunchParamBlockRecPtr = ^LaunchParamBlockRec;
  LaunchParamBlockRec = RECORD
    reserved1:        UInt32;
    reserved2:        UInt16;
    launchBlockID:      UInt16;
    launchEPBLength:    UInt32;
    launchFileFlags:    UInt16;
    launchControlFlags:    LaunchFlags;
    launchAppSpec:      FSSpecPtr;
    launchProcessSN:    ProcessSerialNumber;
    launchPreferredSize:  UInt32;
    launchMinimumSize:    UInt32;
    launchAvailableSize:  UInt32;
    launchAppParameters:  AppParametersPtr;
  END;

  LaunchPBPtr              = ^LaunchParamBlockRec;

CONST
  extendedBlock        = $4C43;            {  'LC'  }
  extendedBlockLen      = 32;

TYPE
  ProcessInfoRec = record
    processInfoLength: LONGINT;
    processName: StringPtr;
    processNumber: ProcessSerialNumber;
    processType: LONGINT;
    processSignature: OSType;
    processMode: LONGINT;
    processLocation: Mac_Ptr;
    processSize: LONGINT;
    processFreeMem: LONGINT;
    processLauncher: ProcessSerialNumber;
    processLaunchDate: LONGINT;
    processActiveTime: LONGINT;
    processAppSpec: FSSpecPtr;
   end;

  ProcessInfoRecPtr = ^ProcessInfoRec;

FUNCTION LaunchApplication(LaunchParams: LaunchPBPtr): OSErr;
external 'InterfaceLib';

function GetProcessInformation ({CONST} var PSN: ProcessSerialNumber;
  var info: ProcessInfoRec): OSErr;
external 'InterfaceLib';

{************** from Script.p ***************}

const
  smSystemScript = -1;

{************** from MacErrors.p ***************}

{Contains error codes for all File Manager calls, except
for PBVolumeMount and for File ID Routines (from UI 3.4).
And also memFullErr}

const

  dirFulErr  = -33; { Directory full }
  dskFulErr  = -34; { disk full }
  nsvErr     = -35; { no such volume }
  ioErr      = -36; { I/O error (bummers) }
  bdNamErr   = -37; { there may be no bad names in the final system! }
  fnOpnErr   = -38; { File not open }
  eofErr     = -39; { End of file }
  posErr     = -40; { tried to position to before start of file (r/w) }
  mFulErr    = -41; { memory full (open) or file won't fit (load) }
  tmfoErr    = -42; { too many files open }
  fnfErr     = -43; { File not found }
  wPrErr     = -44; { diskette is write protected. }
  fLckdErr   = -45; { file is locked }

  vLckdErr   = -46; { volume is locked }
  fBsyErr    = -47; { File is busy (delete) }
  dupFNErr   = -48; { duplicate filename (rename) }
  opWrErr    = -49; { file already open with with write permission }
  rfNumErr   = -51; { refnum error }
  gfpErr     = -52; { get file position error }
  volOffLinErr=-53; { volume not on line error (was Ejected) }
  permErr    = -54; { permissions error (on file open) }
  volOnLinErr= -55; { drive volume already on-line at MountVol }
  nsDrvErr   = -56; { no such drive (tried to mount a bad drive num) }
  noMacDskErr= -57; { not a mac diskette (sig bytes are wrong) }
  extFSErr   = -58; { volume in question belongs to an external fs }
  fsRnErr    = -59; { file system internal error:during rename the old entry was deleted but could not be restored. }
  badMDBErr  = -60; { bad master directory block }
  wrPermErr  = -61; { write permissions error }
  dirNFErr   = -120; { Directory not found }
  tmwdoErr   = -121; { No free WDCB available }
  badMovErr  = -122; { Move into offspring error }
  wrgVolTypErr=-123; { Wrong volume type error [operation not supported for MFS] }
  volGoneErr = -124; { Server volume has been disconnected. }

                                { Process Manager errors }
  procNotFound        = -600;              { no eligible process with specified descriptor }
  memFragErr          = -601;              { not enough room to launch app w/special requirements }
  appModeErr          = -602;              { memory mode is 32-bit, but app not 32-bit clean }
  protocolErr          = -603;              { app made module calls in improper order }
  hardwareConfigErr      = -604;              { hardware configuration not correct for call }
  appMemFullErr        = -605;              { application SIZE not big enough for launch }
  appIsDaemon          = -606;              { app is BG-only, and launch flags disallow this }
  bufferIsSmall        = -607;              { error returns from Post and Accept  }
  noOutstandingHLE      = -608;
  connectionInvalid      = -609;
  noUserInteractionAllowed  = -610;              {  no user interaction allowed  }

  diffVolErr = -1303; { files on different volumes }
  catChangedErr= -1304; { the catalog has been modified }
  afpAccessDenied= -5000; {  Insufficient access privileges for operation  }
  afpDenyConflict= -5006; {  Specified open/deny modes conflict with current open modes  }
  afpItemNotFound  = -5012;{  Unknown UserName/UserID or missing comment/APPL entry  }
  afpNoMoreLocks= -5015; {  Maximum lock limit reached  }
  afpRangeNotLocked= -5020; {  Tried to unlock range that was not locked by user  }
  afpRangeOverlap= -5021; {  Some or all of range already locked by same user  }
  afpObjectTypeErr= -5025; {  File/Directory specified where Directory/File expected  }
  afpCatalogChanged= -5037;
  afpSameObjectErr= -5038;

  memFullErr = -108; { Not enough room in heap zone }

{************** from Resources ***************}

function GetResource(theType: ResType; theID: Integer): Mac_Handle;
external 'InterfaceLib';

function Get1Resource(theType: ResType; theID: Integer): Mac_Handle;
external 'InterfaceLib';

function GetNamedResource(theType: ResType; name: Str255): Mac_Handle;
external 'InterfaceLib';

function Get1NamedResource(theType: ResType; name: Str255): Mac_Handle;
external 'InterfaceLib';

procedure ReleaseResource(theResource: Mac_Handle);
external 'InterfaceLib';

{************** from DateTimeUtils ***************}

type
  DateTimeRecPtr = ^DateTimeRec;
  DateTimeRec = RECORD
    year:          INTEGER;
    month:          INTEGER;
    day:          INTEGER;
    hour:          INTEGER;
    minute:          INTEGER;
    second:          INTEGER;
    dayOfWeek:        INTEGER;
  END;

PROCEDURE GetTime(var d: DateTimeRec);
external 'InterfaceLib';

PROCEDURE SetTime(var d: DateTimeRec);
//PROCEDURE SetTime(const d: DateTimeRec);
external 'InterfaceLib';

PROCEDURE DateToSeconds({CONST}VAR d: DateTimeRec; VAR secs: UInt32);
external 'InterfaceLib';

PROCEDURE SecondsToDate(secs: UInt32; VAR d: DateTimeRec);
external 'InterfaceLib';

{************** from TextUtils ***************}

PROCEDURE UpperString(VAR theString: Str255; diacSensitive: BOOLEAN);
external 'InterfaceLib';

{************** from Quickdraw ***************}

TYPE
  { this was called 'Bits16', but that conflicts with softfpu internal types on m68k (KB) }
  MacBits16                = ARRAY [0..15] OF INTEGER;

  PatternPtr = ^Pattern;
  Pattern = RECORD
    pat:          PACKED ARRAY [0..7] OF UInt8;
  END;

  PatPtr                = ^Pattern;
  BitMapPtr = ^BitMap;
  BitMap = RECORD
    baseAddr:        pointer;
    rowBytes:        INTEGER;
    bounds:          Rect;
  END;
  BitMapHandle = ^BitMapPtr;

  CursorPtr = ^Cursor;
  Cursor = RECORD
    data:          MacBits16;
    mask:          MacBits16;
    hotSpot:        Point;
  END;
  CursPtr = ^Cursor;

  GrafPtr = pointer; //TODO Should actually point to a GrafPort.

  QDGlobalsPtr = ^QDGlobals;
  QDGlobals = RECORD
    privates:        PACKED ARRAY [0..75] OF CHAR;
    randSeed:        LONGINT;                {  in Carbon use GetQDGlobalsRandomSeed }
    screenBits:        BitMap;                  {  in Carbon use GetQDGlobalsScreenBits }
    arrow:          Cursor;                  {  in Carbon use GetQDGlobalsArrow }
    dkGray:          Pattern;                {  in Carbon use GetQDGlobalsDarkGray }
    ltGray:          Pattern;                {  in Carbon use GetQDGlobalsLightGray }
    gray:          Pattern;                {  in Carbon use GetQDGlobalsGray }
    black:          Pattern;                {  in Carbon use GetQDGlobalsBlack }
    white:          Pattern;                {  in Carbon use GetQDGlobalsWhite }
    thePort:        GrafPtr;                {  in Carbon use GetQDGlobalsThePort }
  END;

  QDGlobalsHdl            = ^QDGlobalsPtr;

PROCEDURE InitGraf(globalPtr: Mac_Ptr);
external 'InterfaceLib';

{************** from Fonts ***************}

PROCEDURE SetFScaleDisable(fscaleDisable: BOOLEAN);
external 'InterfaceLib';

{************** from AEDataModel ***************}

{ Apple event descriptor types }

CONST
  typeBoolean          = 'bool';
  typeChar          = 'TEXT';

  {   Preferred numeric Apple event descriptor types   }
  typeSInt16          = 'shor';
  typeSInt32          = 'long';
  typeUInt32          = 'magn';
  typeSInt64          = 'comp';
  typeIEEE32BitFloatingPoint  = 'sing';
  typeIEEE64BitFloatingPoint  = 'doub';
  type128BitFloatingPoint    = 'ldbl';
  typeDecimalStruct      = 'decm';

  {   Non-preferred Apple event descriptor types   }
  typeSMInt          = 'shor';
  typeShortInteger      = 'shor';
  typeInteger          = 'long';
  typeLongInteger        = 'long';
  typeMagnitude        = 'magn';
  typeComp          = 'comp';
  typeSMFloat          = 'sing';
  typeShortFloat        = 'sing';
  typeFloat          = 'doub';
  typeLongFloat        = 'doub';
  typeExtended        = 'exte';
  typeApplSignature      = 'sign';

  {   Constants used creating an AppleEvent   }
                                {  Constant for the returnID param of AECreateAppleEvent  }
  kAutoGenerateReturnID    = -1;              {  AECreateAppleEvent will generate a session-unique ID  }
                                {  Constant for transaction IDŐs  }
  kAnyTransactionID      = 0;              {  no transaction is in use  }

  {   Apple event manager data types   }

TYPE
  DescType              = ResType;
  AEKeyword              = FourCharCode;
{$IFDEF OPAQUE_TOOLBOX_STRUCTS }
  AEDataStorage    = ^LONGINT; { an opaque 32-bit type }
  AEDataStoragePtr = ^AEDataStorage;  { when a VAR xx:AEDataStorage parameter can be nil, it is changed to xx: AEDataStoragePtr }
{$ELSE}
  AEDataStorage            = Mac_Handle;
{$ENDIF OPAQUE_TOOLBOX_STRUCTS}

  AEDescPtr = ^AEDesc;
  AEDesc = RECORD
    descriptorType:      DescType;
    dataHandle:        AEDataStorage;
  END;

  AEKeyDescPtr = ^AEKeyDesc;
  AEKeyDesc = RECORD
    descKey:        AEKeyword;
    descContent:      AEDesc;
  END;

{   a list of AEDesc's is a special kind of AEDesc   }
  AEDescList              = AEDesc;
  AEDescListPtr             = ^AEDescList;
  {   AERecord is a list of keyworded AEDesc's   }
  AERecord              = AEDescList;
  AERecordPtr             = ^AERecord;
  {   an AEDesc which contains address data   }
  AEAddressDesc            = AEDesc;
  AEAddressDescPtr           = ^AEAddressDesc;
{   an AERecord that contains an AppleEvent, and related data types   }
  AppleEvent              = AERecord;
  AppleEventPtr             = ^AppleEvent;
  AEReturnID              = SInt16;
  AETransactionID            = SInt32;
  AEEventClass            = FourCharCode;
  AEEventID              = FourCharCode;
  AEArrayType              = SInt8;

TYPE
  AESendPriority         = SInt16;
CONST
  kAENormalPriority      = $00000000;          {  post message at the end of the event queue  }
  kAEHighPriority        = $00000001;          {  post message at the front of the event queue (same as nAttnMsg)  }

TYPE
  AESendMode           = SInt32;

CONST
  kAENoReply          = $00000001;          {  sender doesn't want a reply to event  }
  kAEQueueReply        = $00000002;          {  sender wants a reply but won't wait  }
  kAEWaitReply        = $00000003;          {  sender wants a reply and will wait  }
  kAEDontReconnect      = $00000080;          {  don't reconnect if there is a sessClosedErr from PPCToolbox  }
  kAEWantReceipt        = $00000200;          {  (nReturnReceipt) sender wants a receipt of message  }
  kAENeverInteract      = $00000010;          {  server should not interact with user  }
  kAECanInteract        = $00000020;          {  server may try to interact with user  }
  kAEAlwaysInteract      = $00000030;          {  server should always interact with user where appropriate  }
  kAECanSwitchLayer      = $00000040;          {  interaction may switch layer  }
  kAEDontRecord        = $00001000;          {  don't record this event - available only in vers 1.0.1 and greater  }
  kAEDontExecute        = $00002000;          {  don't send the event for recording - available only in vers 1.0.1 and greater  }
  kAEProcessNonReplyEvents  = $00008000;          {  allow processing of non-reply events while awaiting synchronous AppleEvent reply  }


  {   Constants for timeout durations   }
  kAEDefaultTimeout      = -1;              {  timeout value determined by AEM  }
  kNoTimeOut          = -2;              {  wait until reply comes back, however long it takes  }


FUNCTION AECreateDesc(typeCode: DescType; dataPtr: Mac_Ptr; dataSize: Size; VAR result: AEDesc): OSErr;
external 'InterfaceLib';
FUNCTION AEDisposeDesc(VAR theAEDesc: AEDesc): OSErr;
external 'InterfaceLib';
FUNCTION AEDuplicateDesc(var theAEDesc: AEDesc; VAR result: AEDesc): OSErr;
external 'InterfaceLib';

FUNCTION AECreateAppleEvent(theAEEventClass: AEEventClass; theAEEventID: AEEventID; var target: AEAddressDesc;
    returnID: AEReturnID; transactionID: AETransactionID; VAR result: AppleEvent): OSErr;
external 'InterfaceLib';
FUNCTION AEPutParamPtr(VAR theAppleEvent: AppleEvent; theAEKeyword: AEKeyword; typeCode: DescType; dataPtr: Mac_Ptr; dataSize: Size): OSErr;
external 'InterfaceLib';
FUNCTION AEGetParamDesc(var theAppleEvent: AppleEvent; theAEKeyword: AEKeyword; desiredType: DescType; VAR result: AEDesc): OSErr;
external 'InterfaceLib';

{************** from AEInteraction ***************}

type
  AEIdleUPP = ^LONGINT; { an opaque UPP }
  AEFilterUPP = ^LONGINT; { an opaque UPP }

FUNCTION AESend(var theAppleEvent: AppleEvent; VAR reply: AppleEvent; sendMode: AESendMode; sendPriority: AESendPriority;
    timeOutInTicks: LONGINT; idleProc: AEIdleUPP; filterProc: AEFilterUPP): OSErr;
external 'InterfaceLib';

{************** from others ***************}

procedure ExitToShell;
external 'InterfaceLib';

procedure SysBeep(dur: Integer);
external 'InterfaceLib';

function TickCount: Longint;
external 'InterfaceLib';

function Munger (h: Mac_Handle; offset: LONGINT; ptr1: Mac_Ptr;
  len1: LONGINT; ptr2: Mac_Ptr; len2: LONGINT): LONGINT;
external 'InterfaceLib';


{************** misc MPW support routines ***************}

FUNCTION ResolveFolderAliases (volume: INTEGER; directory: LONGINT;
                     path: StringPtr; resolveLeafName: BOOLEAN;
                     VAR theSpec: FSSpec; VAR isFolder, hadAlias,
                     leafIsAlias: BOOLEAN): OSErr;
external 'InterfaceLib'; {??}
{    ...from CIncludes:IntEnv.h }

PROCEDURE InitCursorCtl(newCursors: pointer);
external 'PPCToolLib';

PROCEDURE SpinCursor(increment: INTEGER);
external 'PPCToolLib';


{************** API to StdCLib in MacOS ***************}

{$ifdef MACOS_USE_STDCLIB}

{The prefix C_ or c_ is used where names conflicts with pascal
keywords and names. Suffix Ptr is added for pointer to a type.}

type
  size_t = Longint;
  off_t = Longint;
  C_int = Longint;
  C_short = Integer;
  C_long = Longint;
  C_unsigned_int = Cardinal;

var
  errno: C_int; external 'StdCLib' name 'errno';
  MacOSErr: C_short; external 'StdCLib' name 'MacOSErr';

const
  _IOFBF = $00;
  _IOLBF = $40;
  _IONBF = $04;


  O_RDONLY = $00;     // Open for reading only.
  O_WRONLY = $01;     // Open for writing only.
  O_RDWR   = $02;     // Open for reading & writing.
  O_APPEND = $08;     // Write to the end of the file.
  O_RSRC   = $10;     // Open the resource fork.
  O_ALIAS  = $20;     // Open alias file.
  O_CREAT  = $100;    // Open or create a file.
  O_TRUNC  = $200;    // Open and truncate to zero length.
  O_EXCL   = $400;    // Create file only; fail if exists.
  O_BINARY = $800;    // Open as a binary stream.
  O_NRESOLVE = $4000; // Don't resolve any aliases.


  SEEK_SET = 0;
  SEEK_CUR = 1;
  SEEK_END = 2;

  FIOINTERACTIVE = $00006602; // If device is interactive
  FIOBUFSIZE     = $00006603; // Return optimal buffer size
  FIOFNAME       = $00006604; // Return filename
  FIOREFNUM      = $00006605; // Return fs refnum
  FIOSETEOF      = $00006606; // Set file length

  TIOFLUSH = $00007408;       // discard unread input.  arg is ignored

function c_open(path: PChar; oflag: C_int): C_int; cdecl;
  external 'StdCLib' name 'open';

function c_close(filedes: C_int): C_int; cdecl;
  external 'StdCLib' name 'close';

function c_write(filedes: C_int; buf: pointer; nbyte: size_t): size_t; cdecl;
  external 'StdCLib' name 'write';

function c_read(filedes: C_int; buf: pointer; nbyte: size_t): size_t; cdecl;
  external 'StdCLib' name 'read';

function lseek(filedes: C_int; offset: off_t; whence: C_int): off_t; cdecl;
  external 'StdCLib' name 'lseek';

function ioctl(filedes: C_int; cmd: C_unsigned_int; arg: pointer): C_int; cdecl;
  external 'StdCLib' name 'ioctl';

function remove(filename: PChar): C_int; cdecl;
  external 'StdCLib';

function c_rename(old, c_new: PChar): C_int; cdecl;
  external 'StdCLib' name 'rename';

procedure c_exit(status: C_int); cdecl;
  external 'StdCLib' name 'exit';

  {cdecl is actually only needed for m68k}

var
  {Is set to zero for MPWTool, nonzero otherwise.}
  StandAlone: C_int; external name 'StandAlone';

CONST

Sys_EPERM       = 1;    { No permission match }
Sys_ENOENT      = 2;    { No such file or directory }
Sys_ENORSRC     = 3;    { Resource not found *}
Sys_EINTR       = 4;    { System service interrupted *}
Sys_EIO         = 5;    { I/O error }
Sys_ENXIO       = 6;    { No such device or address }
Sys_E2BIG       = 7;    { Insufficient space for return argument * }
Sys_ENOEXEC     = 8;    { File not executable * }
Sys_EBADF       = 9;    { Bad file number }
Sys_ECHILD      = 10;   { No child processes }
Sys_EAGAIN      = 11;   { Resource temporarily unavailable * }
Sys_ENOMEM      = 12;   { Not enough space * }
Sys_EACCES      = 13;   { Permission denied }
Sys_EFAULT      = 14;   { Illegal filename * }
Sys_ENOTBLK     = 15;   { Block device required }
Sys_EBUSY       = 16;   { Device or resource busy }
Sys_EEXIST      = 17;   { File exists }
Sys_EXDEV       = 18;   { Cross-device link }
Sys_ENODEV      = 19;   { No such device }
Sys_ENOTDIR     = 20;   { Not a directory }
Sys_EISDIR      = 21;   { Is a directory }
Sys_EINVAL      = 22;   { Invalid parameter * }
Sys_ENFILE      = 23;   { File table overflow }
Sys_EMFILE      = 24;   { Too many open files }
Sys_ENOTTY      = 25;   { Not a typewriter }
Sys_ETXTBSY     = 26;   { Text file busy. The new process was
                          a pure procedure (shared text) file which was
                          open for writing by another process, or file
                          which was open for writing by another process,
                          or while the pure procedure file was being
                          executed an open(2) call requested write access
                          requested write access.
              (Probably not applicable on macos)}
Sys_EFBIG       = 27;   { File too large }
Sys_ENOSPC      = 28;   { No space left on device }
Sys_ESPIPE      = 29;   { Illegal seek }
Sys_EROFS       = 30;   { Read-only file system }
Sys_EMLINK      = 31;   { Too many links }
Sys_EPIPE       = 32;   { Broken pipe }
Sys_EDOM        = 33;   { Math argument out of domain of func }
Sys_ERANGE      = 34;   { Math result not representable }

{ Note * is slightly different, compared to rtl/sunos/errno.inc}

{$endif}

{$PACKRECORDS NORMAL}

