*char DOSNAME = "dos.library";

ulong
    MODE_READWRITE	= 1004,
    MODE_READONLY	= 1005,
    MODE_OLDFILE	= 1005,
    MODE_NEWFILE	= 1006;

long
    OFFSET_BEGINNING	= -1,
    OFFSET_BEGINING	= OFFSET_BEGINNING,
    OFFSET_CURRENT	= 0,
    OFFSET_END		= 1,

    SHARED_LOCK 	= -2,
    ACCESS_READ 	= -2,
    EXCLUSIVE_LOCK	= -1,
    ACCESS_WRITE	= -1;

type
    BPTR = ulong,
    Handle_t = BPTR,
    Lock_t = BPTR,
    Segment_t = BPTR,

    DateStamp_t = struct {
	ulong ds_Days;
	ulong ds_Minute;
	ulong ds_Tick;
    };

ulong
    TICKS_PER_SECOND	= 50;

type
    FileInfoBlock_t = struct {
	ulong fib_DiskKey;
	ulong fib_DirEntryType;
	[108]char fib_FileName;
	ulong fib_Protection;
	ulong fib_EntryType;
	ulong fib_Size;
	ulong fib_NumBlocks;
	DateStamp_t fib_Date;
	[116]char fib_Comment;
    };

ulong
    FIBB_ARCHIVE	= 4,
    FIBB_READ		= 3,
    FIBB_WRITE		= 2,
    FIBB_EXECUTE	= 1,
    FIBB_DELETE 	= 0,
    FIBF_ARCHIVE	= 1 << FIBB_ARCHIVE,
    FIBF_READ		= 1 << FIBB_READ,
    FIBF_WRITE		= 1 << FIBB_WRITE,
    FIBF_EXECUTE	= 1 << FIBB_EXECUTE,
    FIBF_DELETE 	= 1 << FIBB_DELETE;

type
    InfoData_t = struct {
	ulong id_NumSoftErrors;
	ulong id_UnitNumber;
	ulong id_DiskState;
	ulong id_NumBlocks;
	ulong id_NumBlocksUsed;
	ulong id_BytesPerBlock;
	ulong id_DiskType;
	BPTR id_VolumeNode;
	ulong id_InUse;
    };

ulong
    ID_WRITE_PROTECTED	= 80,
    ID_VALIDATING	= 81,
    ID_VALIDATED	= 82,

    ID_NO_DISK_PRESENT	= 0xffffffff,
    ID_UNREADABLE_DISK	= ('B' - '\e') << 24 | ('A' - '\e') << 16 |
			  ('D' - '\e') <<  8,
    ID_DOS_DISK 	= ('D' - '\e') << 24 | ('O' - '\e') << 16 |
			  ('S' - '\e') <<  8,
    ID_NOT_REALLY_DOS	= ('N' - '\e') << 24 | ('D' - '\e') << 16 |
			  ('O' - '\e') <<  8 | ('S' - '\e'),
    ID_KICKSTART_DISK	= ('K' - '\e') << 24 | ('I' - '\e') << 16 |
			  ('C' - '\e') <<  8 | ('K' - '\e'),

    ERROR_NO_FREE_STORE 		= 103,
    ERROR_TASK_TABLE_FULL		= 105,
    ERROR_LINE_TOO_LONG 		= 120,
    ERROR_FILE_NOT_OBJECT		= 121,
    ERROR_INVALID_RESIDENT_LIBRARY	= 122,
    ERROR_NO_DEFAULT_DIR		= 201,
    ERROR_OBJECT_IN_USE 		= 202,
    ERROR_OBJECT_EXISTS 		= 203,
    ERROR_DIR_NOT_FOUND 		= 204,
    ERROR_OBJECT_NOT_FOUND		= 205,
    ERROR_BAD_STREAM_NAME		= 206,
    ERROR_OBJECT_TOO_LARGE		= 207,
    ERROR_ACTION_NOT_KNOWN		= 209,
    ERROR_INVALID_COMPONENT_NAME	= 210,
    ERROR_INVALID_LOCK			= 211,
    ERROR_OBJECT_WRONG_TYPE		= 212,
    ERROR_DISK_NOT_VALIDATED		= 213,
    ERROR_DISK_WRITE_PROTECTED		= 214,
    ERROR_RENAME_ACROSS_DEVICES 	= 215,
    ERROR_DIRECTORY_NOT_EMPTY		= 216,
    ERROR_TOO_MANY_LEVELS		= 217,
    ERROR_DEVICE_NOT_MOUNTED		= 218,
    ERROR_SEEK_ERROR			= 219,
    ERROR_COMMENT_TOO_BIG		= 220,
    ERROR_DISK_FULL			= 221,
    ERROR_DELETE_PROTECTED		= 222,
    ERROR_WRITE_PROTECTED		= 223,
    ERROR_READ_PROTECTED		= 224,
    ERROR_NOT_A_DOS_DISK		= 225,
    ERROR_NO_DISK			= 226,
    ERROR_NO_MORE_ENTRIES		= 232,

    RETURN_OK				= 0,
    RETURN_WARN 			= 5,
    RETURN_ERROR			= 10,
    RETURN_FAIL 			= 20,

    SIGBREAKB_CTRL_C	= 12,
    SIGBREAKB_CTRL_D	= 13,
    SIGBREAKB_CTRL_E	= 14,
    SIGBREAKB_CTRL_F	= 15,

    SIGBREAKF_CTRL_C	= 1 << SIGBREAKB_CTRL_C,
    SIGBREAKF_CTRL_D	= 1 << SIGBREAKB_CTRL_D,
    SIGBREAKF_CTRL_E	= 1 << SIGBREAKB_CTRL_E,
    SIGBREAKF_CTRL_F	= 1 << SIGBREAKB_CTRL_F;

extern
    OpenDosLibrary(ulong version)*DosLibrary_t,
    CloseDosLibrary()void,

    Close(Handle_t fd)void,
    CreateDir(*char name)Lock_t,
    CurrentDir(Lock_t lock)Lock_t,
    DeleteFile(*char name)bool,
    DupLock(Lock_t lock)Lock_t,
    Examine(Lock_t lock; *FileInfoBlock_t fib)bool,
    ExNext(Lock_t lock; *FileInfoBlock_t fib)bool,
    Info(Lock_t lock; *InfoData_t id)bool,
    Input()Handle_t,
    IoErr()ulong,
    IsInteractive(Handle_t fd)bool,
    Lock(*char name; long accessMode)Lock_t,
    Open(*char name; ulong accessMode)Handle_t,
    Output()Handle_t,
    ParentDir(Lock_t lock)Lock_t,
    Read(Handle_t fd; *byte buffer; ulong length)ulong,
    Rename(*char oldName, newName)bool,
    Seek(Handle_t fd; long position, seekMode)long,
    SetComment(*char name, comment)bool,
    SetProtection(*char name; ulong mask)bool,
    UnLock(Lock_t lock)void,
    WaitForChar(Handle_t fd; ulong timeout)bool,
    Write(Handle_t fd; *byte buffer; ulong length)ulong,

    CreateProc(*char name; long pri; Segment_t seg; ulong stackSize)*MsgPort_t,
    DateStamp(*DateStamp_t ds)void,
    Delay(ulong timeout)void,
    DeviceProc(*char name)*MsgPort_t,
    Exit(ulong returnCode)void,

    Execute(*char commandString; Handle_t inputFd, outputFd)bool,
    LoadSeg(*char name)Segment_t,
    UnLoadSeg(Segment_t segment)bool;
