/* Copyright (C) 1986-2001 by Digital Mars. $Revision: 1.1.1.2 $ */ #if __SC__ || __RCC__ #pragma once #endif #ifndef __DOS_H #define __DOS_H 1 #if __cplusplus extern "C" { #endif /* Define _CRTAPI1 (for compatibility with the NT SDK) */ #ifndef _CRTAPI1 #define _CRTAPI1 __cdecl #endif /* Define _CRTAPI2 (for compatibility with the NT SDK) */ #ifndef _CRTAPI2 #define _CRTAPI2 __cdecl #endif /* Define CRTIMP */ #ifndef _CRTIMP #if defined(_WIN32) && defined(_DLL) #define _CRTIMP __declspec(dllimport) #else #define _CRTIMP #endif #endif #if __OS2__ && __INTSIZE == 4 #define __CLIB __stdcall #else #define __CLIB __cdecl #endif #if !(M_XENIX || M_UNIX) #pragma pack(1) #endif #if !defined(_WCHAR_T_DEFINED) typedef unsigned short wchar_t; #define _WCHAR_T_DEFINED 1 #endif #if _M_AMD64 typedef unsigned long long size_t; #else typedef unsigned size_t; #endif extern unsigned __cdecl _stack; #if defined(DOS386) extern unsigned short _x386_zero_base_selector; extern void *_x386_zero_base_ptr; extern void __far *(*_x386_mk_protected_ptr)(unsigned long abs_address); extern int (*_x386_free_protected_ptr)(void __far *); extern unsigned long(*_x386_get_abs_address)(void __far *ptr); extern unsigned int (_x386_coreleft)(void); extern void* (_x386_map_physical_address)(void* abs_addr, unsigned size); extern int (_x386_memlock)(void __far *pointer, unsigned int length); extern int (_x386_memunlock)(void __far *pointer, unsigned int length); #endif #ifndef __REGS_DEFINED #define __REGS_DEFINED #if __INTSIZE == 4 #pragma pack(1) struct _DWORDREGS {unsigned eax,ebx,ecx,edx,esi,edi,cflag,flags;}; #define DWORDREGS _DWORDREGS struct _WORDREGS { unsigned short ax,eaxmsw,bx,ebxmsw,cx,ecxmsw,dx,edxmsw, si,esimsw,di,edimsw; unsigned cflag,flags; }; #define WORDREGS _WORDREGS struct _BYTEREGS { unsigned char al,ah,ax2,ax3,bl,bh,bx2,bx3, cl,ch,cx2,cx3,dl,dh,dx2,dx3; }; #define BYTEREGS _BYTEREGS union _REGS { struct _DWORDREGS e; struct _WORDREGS x; struct _BYTEREGS h; }; #define REGS _REGS struct _SREGS { unsigned short es,cs,ss,ds,fs,gs; }; #define SREGS _SREGS #pragma pack() #else /* __INTSIZE == 4 */ #pragma pack(1) struct WORDREGS { unsigned ax,bx,cx,dx,si,di,cflag,flags; }; struct BYTEREGS {unsigned char al,ah,bl,bh,cl,ch,dl,dh; }; union REGS { struct WORDREGS x; struct BYTEREGS h; }; struct SREGS { unsigned es,cs,ss,ds; }; #pragma pack() #define _REGS REGS #define _SREGS SREGS #define _WORDREGS WORDREGS #define _BYTEREGS BYTEREGS #endif /* __INTSIZE==4 */ #endif /* __REGS_DEFINED */ #ifndef __NT__ #define disable() __emit__((char)(0xFA)) #define _disable() __emit__((char)(0xFA)) #define enable() __emit__((char)(0xFB)) #define _enable() __emit__((char)(0xFB)) #define geninterrupt(intr) __emit__(0xCD,(intr)) int __cdecl int86(int,union REGS *,union REGS *); int __cdecl int86x(int,union REGS *,union REGS *,struct SREGS *); int __cdecl intdos(union REGS *,union REGS *); int __cdecl intdosx(union REGS *,union REGS *,struct SREGS *); void __CLIB segread(struct SREGS *); #define _int86 int86 #define _int86x int86x #define _intdos intdos #define _intdosx intdosx #define _segread segread #if DOS386 int __cdecl int86_real(int,union REGS *,union REGS *); int __cdecl int86x_real(int,union REGS *,union REGS *,struct SREGS *); #endif #endif #if (M_UNIX || M_XENIX) #define VTIOC ('v' << 8) #define VT_OPENQRY (VTIOC | 1) #define VT_SETMODE (VTIOC | 2) #define VT_GETMODE (VTIOC | 3) #define VT_RELDISP (VTIOC | 4) #define VT_ACTIVATE (VTIOC | 5) #define VT_FALSE 0 #define VT_TRUE 1 #define VT_ACKACQ 2 #define VT_AUTO 0 #define VT_PROCESS 1 struct vt_mode {char mode, waitv; short relsig, acqsig, frsig;}; typedef int (*_vt_sig_func_t)(int); void _vt_get_mode(struct vt_mode *p); int _vt_set_mode(struct vt_mode *p); int _vt_get_num(void); int _vt_activate(int vt_num); int _vt_add(_vt_sig_func_t func); int _vt_remove(_vt_sig_func_t func); #include #ifdef __NT__ struct FINDW { struct stat stat; unsigned short attribute; unsigned short time,date; unsigned long size; wchar_t name[16]; }; struct FINDA #else struct FIND #endif { struct stat stat; unsigned short attribute; unsigned short time,date; unsigned long size; char name[16]; }; #define FA_NORMAL 0x00 #define FA_DIREC S_IFDIR #else /* !M_UNIX */ #pragma pack(1) #ifdef __NT__ struct FINDW /* struct used by wfindfirst() and wfindnext() */ { char reserved[21]; /* reserved by DOS */ char attribute; /* attribute found (FA_XXXX) */ unsigned short time,date; /* file's time and date */ unsigned long size; /* file's size */ #if !defined(_WIN32) wchar_t name[13]; /* filename followed by 0 byte */ #else wchar_t name[260]; #endif }; struct FINDA /* struct used by findfirst() and findnext() */ #else struct FIND /* struct used by findfirst() and findnext() */ #endif { char reserved[21]; /* reserved by DOS */ char attribute; /* attribute found (FA_XXXX) */ unsigned short time,date; /* file's time and date */ unsigned long size; /* file's size */ #if !defined(_WIN32) char name[13]; /* filename followed by 0 byte */ #else char name[260]; #endif }; struct find_t /* used by _dos_findfirst() and _dos_findnext() */ { char reserved[21]; /* reserved by DOS */ char attrib; /* attribute found (FA_XXXX) */ unsigned short wr_time,wr_date; /* file's last write */ unsigned long size; /* file's size */ #if !defined(_WIN32) char name[13]; /* filename followed by 0 byte */ #else char name[260]; #endif }; #define _find_t find_t #pragma pack() #define FA_NORMAL 0x00 #define FA_RDONLY 0x01 #define FA_HIDDEN 0x02 #define FA_SYSTEM 0x04 #define FA_LABEL 0x08 #define FA_DIREC 0x10 #define FA_ARCH 0x20 #define _A_NORMAL 0x00 #define _A_RDONLY 0x01 #define _A_HIDDEN 0x02 #define _A_SYSTEM 0x04 #define _A_VOLID 0x08 #define _A_SUBDIR 0x10 #define _A_ARCH 0x20 #endif #ifdef __NT__ #ifdef _UNICODE #define FIND FINDW #else #define FIND FINDA #endif struct FINDA * __CLIB findfirst(const char *,int); struct FINDA * __CLIB findnext(void); struct FINDW * __CLIB _wfindfirst (const wchar_t *, int); struct FINDW * __CLIB _wfindnext (void); #else struct FIND * __CLIB findfirst(const char *,int),* __CLIB findnext(void); #endif #if defined(MSDOS) || (defined(_WINDOWS) && !defined(__NT__)) unsigned __CLIB _dos_findfirst(const char *, unsigned, struct find_t *); unsigned __CLIB _dos_findnext(struct find_t *); #endif #if defined(MSDOS) void __CLIB _dos_keep(unsigned, unsigned); #endif #ifndef __NT__ #define _FP_OFF(fp) (*((unsigned __far *)&(fp))) #define FP_OFF _FP_OFF #if __INTSIZE == 4 extern unsigned __CLIB FP_SEG(void __far *); #define _FP_SEG FP_SEG #else #define _FP_SEG(fp) (*((unsigned __far *)&(fp)+1)) #define FP_SEG _FP_SEG #endif #if __INTSIZE == 4 extern void __far * __CLIB MK_FP(unsigned short,unsigned); #define MK_FP(seg,offset) MK_FP((seg),(unsigned)(offset)) #else #define MK_FP(seg,offset) \ ((void __far *)(((unsigned long)(seg)<<16) | (unsigned)(offset))) #endif #endif #define _MK_FP MK_FP #if __INTSIZE == 2 void __far * __cdecl farmalloc(unsigned long size); void __far * __cdecl farcalloc(unsigned long numelems,unsigned long elemsize); void __far * __cdecl farrealloc(void __far *oldptr,unsigned long newsize); int __cdecl farfree(void __far *ptr); unsigned long __cdecl farcoreleft(void); #endif #pragma pack(1) struct DOSERROR { int exterror; /* extended error code */ char eclass; /* error class */ char action; /* recommended action */ char locus; /* error locus */ }; #define _DOSERROR DOSERROR #define errclass eclass struct COUNTRY { short co_date; char co_curr[5]; char co_thsep[2]; char co_desep[2]; char co_dtsep[2]; char co_tmsep[2]; char co_currstyle; char co_digits; char co_time; long co_case; char co_dasep[2]; char co_fill[10]; }; struct diskfree_t { unsigned total_clusters; unsigned avail_clusters; unsigned sectors_per_cluster; unsigned bytes_per_sector; }; #define _diskfree_t diskfree_t struct dos_date_t { unsigned char day; unsigned char month; unsigned short year; unsigned char dayofweek; }; #define _dosdate_t dos_date_t struct _fatinfo { char fi_sclus; char fi_fatid; unsigned fi_nclus; int fi_bysec; }; #define fatinfo _fatinfo struct dos_time_t { unsigned char hour; unsigned char minute; unsigned char second; unsigned char hsecond; }; #define _dostime_t dos_time_t struct time { unsigned char ti_min; unsigned char ti_hour; unsigned char ti_hund; unsigned char ti_sec; }; struct date { int da_year; char da_day; char da_mon; }; struct fcb { char fcb_drive; char fcb_name[8]; char fcb_ext[3]; short fcb_curblk; short fcb_filesize; short fcb_date; char fcb_resv[10]; char fcb_crrec; long fcb_random; }; #pragma pack() #ifndef __NT__ struct COUNTRY *__CLIB country( int , struct COUNTRY *); extern unsigned int __CLIB _osversion; #ifndef DOS386 int __CLIB getcbrk(void); void __CLIB ctrlbrk(int (*FarPtr)()); int __CLIB setcbrk(int value); void __CLIB getfat(unsigned char disk, struct fatinfo *fat); void __CLIB getfatd(struct fatinfo *fat); int __CLIB getverify(void); void __CLIB setverify(int value); char __far * __CLIB getdta(void); void __CLIB setdta(char __far *dta); unsigned __CLIB getpsp(void); int __CLIB setblock(unsigned segment, unsigned size); char * __CLIB parsfnm(const char *cmdline, struct fcb *fcb, int opt); #endif /* DOS386 */ #endif /* __NT__ */ #ifndef DOS386 void __CLIB getdate(struct date *datePtr); void __CLIB gettime(struct time *timePtr); #endif unsigned __CLIB _dos_lock(int, int, unsigned long, unsigned long); unsigned long __CLIB _dos_seek(int, unsigned long, int); int __CLIB dos_creat(char *,int); int __CLIB _dos_creat(const char *,unsigned, int *); int __CLIB _dos_creatnew(const char *,unsigned , int *); unsigned __CLIB _dos_open(const char *, unsigned,int *); int __CLIB dos_close(int); unsigned __CLIB _dos_read(int, void __far *,unsigned,unsigned *); unsigned __CLIB _dos_write(int, const void __far *,unsigned,unsigned *); int __CLIB dos_get_ctrl_break(void); #ifndef DOS386 int __CLIB dos_abs_disk_read(int,int,long,char *); int __CLIB dos_abs_disk_write(int,int,long,const char *); #endif void __CLIB dos_set_verify(int); void __CLIB dos_set_ctrl_break(int); int __CLIB dos_get_verify(void); int __CLIB getcurdir(int drive,char *dir); char * __CLIB _getdcwd(int drive,char *Pbuf,int PbufLen); unsigned __CLIB _dos_commit(int); int __CLIB dos_exterr(struct DOSERROR *); int __CLIB dosexterr(struct DOSERROR *); int __CLIB setdisk(int); int __CLIB getdisk(void); long __CLIB dos_getdiskfreespace(int); unsigned __CLIB _dos_getdiskfree(unsigned, struct diskfree_t *); void __CLIB dos_setdrive(unsigned, unsigned *); void __CLIB dos_getdrive(unsigned *); unsigned __CLIB dos_setftime(int, unsigned, unsigned); unsigned __CLIB dos_getftime(int, unsigned *, unsigned *); unsigned __CLIB dos_setfileattr(const char *, unsigned); unsigned __CLIB dos_getfileattr(const char *, unsigned *); unsigned __CLIB dos_setdate(struct dos_date_t *); void __CLIB dos_getdate(struct dos_date_t *); int __CLIB _dos_sethandlecount(unsigned); unsigned __CLIB dos_settime(struct dos_time_t *); void __CLIB dos_gettime(struct dos_time_t *); #define absread(drive,nsects,lsects,buffer) dos_abs_disk_read(drive,nsects,lsects,buffer) #define abswrite(drive,nsects,lsects,buffer) dos_abs_disk_write(drive,nsects,lsects,buffer) #define _dosexterr(dosstruct) dos_exterr(dosstruct) #define _dos_close dos_close #if __INTSIZE == 2 unsigned _dos_allocmem(unsigned int,unsigned int *); int allocmem(unsigned int,unsigned int *); unsigned _dos_freemem(unsigned); int freemem(unsigned); #endif #define _dos_getdate dos_getdate #define _dos_getdrive dos_getdrive #define _dos_getfileattr dos_getfileattr #define _dos_getftime dos_getftime #define _dos_gettime dos_gettime #define _dos_setdate dos_setdate #define _dos_setdrive dos_setdrive #define _dos_setfileattr dos_setfileattr #define _dos_setftime dos_setftime #define _dos_settime dos_settime unsigned char __CLIB _inp(unsigned); unsigned short __CLIB _inpw(unsigned); unsigned long __CLIB _inpl(unsigned); unsigned char __CLIB _outp(unsigned,unsigned char); unsigned short __CLIB _outpw(unsigned,unsigned short); unsigned long __CLIB _outpl(unsigned,unsigned long); unsigned char __CLIB _inline_inp(unsigned); unsigned short __CLIB _inline_inpw(unsigned); unsigned long __CLIB _inline_inpl(unsigned); unsigned char __CLIB _inline_outp(unsigned,unsigned char); unsigned short __CLIB _inline_outpw(unsigned,unsigned short); unsigned long __CLIB _inline_outpl(unsigned,unsigned long); #define _inp(x) _inline_inp(x) #define _inpw(x) _inline_inpw(x) #define _outp(x,y) _inline_outp(x,y) #define _outpw(x,y) _inline_outpw(x,y) #if __INTSIZE == 4 #define _inpl(x) _inline_inpl(x) #define _outpl(x,y) _inline_outpl(x,y) #endif // Obsolete, use the _ prefixed versions #define inp(x) _inline_inp(x) #define inpw(x) _inline_inpw(x) #define outp(x,y) _inline_outp(x,y) #define outpw(x,y) _inline_outpw(x,y) #if !(defined (_WINDOWS) || defined (__NT__)) #define _HARDERR_IGNORE 0 #define _HARDERR_RETRY 1 #define _HARDERR_ABORT 2 #define _HARDERR_FAIL 3 void __cdecl _harderr (void (__far __cdecl *) (unsigned, unsigned, unsigned __far *)); void __cdecl _hardresume (int); void __cdecl _hardretn (int); #endif /*!(defined (_WINDOWS) || defined (__NT__))*/ size_t __CLIB _chkstack(void); #ifndef __NT__ #define interrupt __interrupt void __cdecl peekbytes(unsigned,unsigned,void *,size_t); void __cdecl pokebytes(unsigned,unsigned,const void *,size_t); #if __cplusplus void inline poke(unsigned segm, unsigned offs, int value) { *((int __far *) MK_FP(segm, offs)) = value; } int inline peek(unsigned segm, unsigned offs) { return *((int __far *) MK_FP(segm, offs)); } void inline pokeb(unsigned segm, unsigned offs, char value) { *((char __far *) MK_FP(segm, offs)) = value; } char inline peekb(unsigned segm, unsigned offs) { return *((char __far *) MK_FP(segm, offs)); } #else #define peek(segm, offs) (*((int __far *) MK_FP((segm), (offs)))) #define peekb(segm, offs) (*((char __far *) MK_FP((segm), (offs)))) #define poke(segm, offs, value) (*((int __far *) MK_FP((segm), (offs))) = (int)(value)) #define pokeb(segm, offs, value) (*((char __far *) MK_FP((segm), (offs))) = (char)(value)) #endif #ifndef _WINDOWS #ifndef DOS386 void __CLIB _chain_intr (void (__interrupt __far * funcptr)()); void (__interrupt __far * __CLIB _dos_getvect(unsigned vector))(); void __CLIB _dos_setvect (unsigned vector, void (__interrupt __far * funcptr)()); #if __cplusplus void inline (__interrupt __far * getvect(int vector))() { return _dos_getvect (vector); } void inline setvect(int vector, void (__interrupt __far * funcptr)()) { _dos_setvect(vector, funcptr); } #else #define getvect _dos_getvect #define setvect _dos_setvect #endif #endif /* DOS386 */ #endif int __cdecl bdos(int dosfunc, unsigned int dosdx, unsigned int dosal); #define _bdos bdos int __cdecl bdosptr(int, void *, unsigned); int __cdecl bdosx(char,void *,char); #ifndef DOS386 unsigned __CLIB dos_alloc(unsigned); unsigned __CLIB dos_calloc(unsigned); int __CLIB dos_free(unsigned); #endif /* DOS386 */ void __CLIB _copy(unsigned,unsigned,unsigned); unsigned long __CLIB dos_avail(void); #ifndef DOS386 unsigned __CLIB dos_setblock(unsigned,unsigned); unsigned __CLIB _dos_setblock(unsigned,unsigned,unsigned *); #endif /* DOS386 */ #endif int __pascal response_expand(int *,char ***); int __CLIB cputype(void); #ifndef _WIN32 # if defined(ZTC_COMPAT) # if !(M_UNIX || M_XENIX) # if !__cplusplus #define WILDCARDS extern int __cdecl __wildcard; int *__wild = &__wildcard; # else #define WILDCARDS extern "C" { extern int __cdecl __wildcard; int *__wild = &__wildcard; } # endif # else #define WILDCARDS # endif # else # if !(M_UNIX || M_XENIX) # if !__cplusplus #define EXPAND_WILDCARDS extern int __cdecl __wildcard; int *__wild = &__wildcard; # else #define EXPAND_WILDCARDS extern "C" { extern int __cdecl __wildcard; int *__wild = &__wildcard; } # endif # else #define EXPAND_WILDCARDS # endif # endif #else # if !(M_UNIX || M_XENIX) # if !__cplusplus #define WILDCARDS int __cdecl __wildcard = 1; #define EXPAND_WILDCARDS int __cdecl __wildcard = 1; # else #define WILDCARDS extern "C" { int __cdecl __wildcard = 1; } #define EXPAND_WILDCARDS extern "C" { int __cdecl __wildcard=1; } # endif # else #define WILDCARDS #define EXPAND_WILDCARDS # endif #endif #define EXE_DOS 1 #define EXE_DOS16RM 2 #define EXE_ZPM 4 #define EXE_PHAR386 8 #define EXE_DOSX 0x10 #define EXE_WINDOWS 0x20 #define EXE_OS2 0x40 #define EXE_SCOUNIX 0x80 #define EXE_OS2_2 0x100 #define EXE_WINDOWSNT 0x200 extern unsigned short __cdecl _exe_type; #if !(M_UNIX || M_XENIX) #pragma pack() #endif #ifdef _WINDOWS extern void __far __pascal DOS3CALL(void); #define int21h __asm call DOS3CALL #else #define int21h __asm int 21h #endif #if __cplusplus inline unsigned _getdiskfree(unsigned driveno, struct _diskfree_t *diskspace) { return _dos_getdiskfree(driveno, diskspace); /*needed for MSVCNT compatibility*/ } #else #define _getdiskfree _dos_getdiskfree /*needed for MSVCNT compatibility*/ #endif #if __cplusplus } #endif #endif