home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / CLISP / CLISPSRC.TAR / clisp-1995-01-01 / src / msdos.d < prev    next >
Encoding:
Text File  |  1994-12-05  |  21.4 KB  |  614 lines

  1. # Include-File fⁿr MSDOS-(DJUNIX/EMUNIX/WATCOM)-Version von CLISP
  2. # Bruno Haible 5.12.1994
  3.  
  4.  
  5. # Konstanten fⁿr Steuerzeichen:
  6.  
  7. #define BEL  7              # Ton ausgeben
  8. # define NL  10             # New line, siehe LISPBIBL.D
  9. #define RUBOUT 127          # Rubout = Delete
  10. #define CRLFstring  "\r\n"  # C-String, der BS-Newline enthΣlt
  11.  
  12. #ifndef WINDOWS
  13.   #define stdin_handle  0  # File-Handle von Standard-Input
  14.   #define stdout_handle  1  # File-Handle von Standard-Output
  15. #endif
  16.  
  17. # Deklaration von Typen von Ein-/Ausgabe-Parametern von Betriebssystemfunktionen
  18.   #ifdef DJUNIX
  19.     #include <std.h>
  20.     #include <unistd.h>
  21.     #define CONST const
  22.     #define CONST1 const
  23.     #define CONST2
  24.   #endif
  25.   #ifdef EMUNIX
  26.     #include <sys/emx.h> # mu▀ als erstes kommen
  27.     #include <stdlib.h>
  28.     #define CONST const
  29.     #define CONST1
  30.     #define CONST2 const
  31.     #ifdef unix
  32.       #define EMUNIX_OLD_8d  # emx <= 0.8d
  33.     #else
  34.       #define EMUNIX_NEW_8e  # emx >= 0.8e
  35.     #endif
  36.     #ifndef _SIZE_T
  37.       #define EMUNIX_OLD_8e  # emx <= 0.8e definiert _SIZE_T_DEFINED
  38.     #else
  39.       #define EMUNIX_NEW_8f  # emx >= 0.8f definiert _SIZE_T
  40.     #endif
  41.     #ifndef _IOSPECIAL
  42.       #define EMUNIX_OLD_8f  # emx <= 0.8f definiert _IOSTRING
  43.     #else
  44.       #define EMUNIX_NEW_8g  # emx >= 0.8g definiert _IOSPECIAL
  45.     #endif
  46.     #ifndef _ARG_ENV
  47.       #define EMUNIX_OLD_8g
  48.     #else
  49.       #define EMUNIX_NEW_8h  # emx >= 0.8h definiert _ARG_ENV
  50.     #endif
  51.     #ifndef _SIGSET_T
  52.       #define EMUNIX_OLD_8h
  53.     #else
  54.       #define EMUNIX_NEW_9a  # emx >= 0.9a definiert _SIGSET_T
  55.     #endif
  56.   #endif
  57.   #ifdef WATCOM
  58.     #include <stdlib.h>
  59.     #include <unistd.h>
  60.     #include <direct.h>
  61.     #define CONST
  62.     #define CONST1
  63.     #define CONST2
  64.     #define STDC_HEADERS
  65.     #define RETSTRLENTYPE size_t
  66.     #define STRLEN_CONST const
  67.   #endif
  68.  
  69. # Hauptprogramm-Name
  70.   #if defined(EMUNIX) && defined(WINDOWS)
  71.     # main() existiert bereits in libwin.a
  72.     #define main  clisp_main
  73.   #endif
  74.  
  75. # Low-Level-Betriebssystem-Aufrufe
  76.   #ifndef EMUNIX_PORTABEL
  77.     #include <dos.h>
  78.     #ifdef WATCOM
  79.       #define int86 int386 # siehe <i86.h>
  80.       #define regB h
  81.       #define regW w
  82.       #define regL x
  83.       #define reg_flags regW.cflag
  84.     #else
  85.       #define regB h
  86.       #define regW x
  87.       #define reg_flags regW.flags
  88.     #endif
  89.     # 'union REGS' besteht aus
  90.     # Byte-Registern: regB . al,ah,bl,bh,cl,ch,dl,dh
  91.     # Word-Registern: regW . ax,bx,cx,dx,si,di,cflag
  92.     # Long-Registern: regL . eax,ebx,ecx,edx,esi,edi,cflag
  93.   #endif
  94.  
  95. # Tabelle der System-Fehlermeldungen
  96.   #include <errno.h>
  97.   #define ENOMORE  18  # Fehlercode bei findfirst/findnext, fehlt in errno.h
  98.   #ifdef EMUNIX
  99.     #define ENOTTY  EBADF  # Fehlercode bei ioctl
  100.   #endif
  101.   #ifndef errno # wg. WATCOM
  102.     extern int errno; # letzter Fehlercode
  103.   #endif
  104.   #ifndef WATCOM # Konflikt vermeiden
  105.     extern CONST2 int sys_nerr; # Anzahl der Betriebssystem-Fehlermeldungen
  106.   #endif
  107.   #if defined(EMUNIX_OLD_8d) || defined(WATCOM)
  108.     extern CONST char* sys_errlist[]; # Betriebssystem-Fehlermeldungen
  109.   #else # defined(EMUNIX_NEW_8e) || defined(DJUNIX)
  110.     extern CONST2 char* CONST2 sys_errlist[]; # Betriebssystem-Fehlermeldungen
  111.   #endif
  112.   # siehe PERROR(3)
  113. # wird verwendet von ERROR, STREAM, PATHNAME
  114.  
  115. # Bereitstellen des Arbeitsspeichers
  116.   extern void* malloc (size_t size); # siehe MALLOC(3V)
  117.   extern void free (void* ptr); # siehe MALLOC(3V)
  118.   #if defined(WATCOM) && defined(WINDOWS)
  119.     #error "malloc does not work, neither does the replacement malloc32!"
  120.   #endif
  121. # wird verwendet von SPVW
  122.  
  123. # Normales Programmende
  124.   #ifdef DJUNIX
  125.     extern volatile void _exit (int status); # siehe EXIT(2V)
  126.   #endif
  127.   #if defined(EMUNIX) || defined(WATCOM)
  128.     nonreturning_function(extern, _exit, (int status)); # siehe EXIT(2V)
  129.   #endif
  130. # wird verwendet von SPVW
  131.  
  132. # Sofortiger Programmabbruch, Sprung in den Debugger
  133.   #ifdef DJUNIX
  134.     extern volatile void abort (void); # siehe ABORT(3)
  135.   #endif
  136.   #if defined(EMUNIX) || defined(WATCOM)
  137.     extern void abort (void); # siehe ABORT(3)
  138.   #endif
  139. # wird verwendet von DEBUG, EVAL, IO
  140.  
  141. # Signalbehandlung
  142.   #ifndef WINDOWS
  143.     #ifdef EMUNIX
  144.       #include <signal.h>
  145.       # Ein Signal-Handler ist eine Funktion ohne Ergebnis.
  146.       typedef SIGTY (*signal_handler) ();
  147.       extern signal_handler signal (int sig, signal_handler handler); # siehe SIGNAL(3V)
  148.       # Ein Signal erst eine bestimmte Zeit spΣter ausliefern:
  149.       extern unsigned int alarm (unsigned int seconds); # siehe ALARM(3V)
  150.       # Die Ankunft eines Signals quittieren (aus dem Signal-Handler heraus):
  151.       #define signal_acknowledge(sig,handler)  signal(sig,SIG_ACK)
  152.       # Das Verhalten von Signalen bei System-Calls ist OK:
  153.       #define SIGNAL  signal
  154.     #endif
  155.     #ifdef WATCOM
  156.       #include <signal.h>
  157.       # Ein Signal-Handler ist eine Funktion ohne Ergebnis.
  158.       typedef void (*signal_handler) ();
  159.       extern signal_handler signal (int sig, signal_handler handler); # siehe SIGNAL(3V)
  160.       # Die Ankunft eines Signals quittieren (aus dem Signal-Handler heraus):
  161.       #define signal_acknowledge(sig,handler)  signal(sig,handler)
  162.       # Das Verhalten von Signalen bei System-Calls ist OK:
  163.       #define SIGNAL  signal
  164.     #endif
  165.     #ifdef DJUNIX
  166.       # Damit kann man nur auf Ctrl-Break abfragen:
  167.       extern void _go32_want_ctrl_break (int flag);
  168.       extern unsigned long _go32_was_ctrl_break_hit (void);
  169.     #endif
  170.   #endif
  171. # wird verwendet von SPVW
  172.  
  173. # GC-Notifikation:
  174.   #ifdef WINDOWS
  175.     extern void windows_note_gc_start (void);
  176.     extern void windows_note_gc_end (void);
  177.   #endif
  178. # wird verwendet von SPVW
  179.  
  180. # Environment-Variablen abfragen:
  181.   extern char* getenv (CONST char* name); # siehe GETENV(3V)
  182. # wird verwendet von PATHNAME, MISC
  183.  
  184. # Working Directory setzen:
  185.   extern int chdir (CONST char* path); # siehe CHDIR(2V)
  186. # wird verwendet von PATHNAME
  187.  
  188. # Working Directory abfragen:
  189.   # Maximale PfadlΣnge (incl. Nullbyte am Schlu▀), die von getwd geliefert wird:
  190.     #define MAXPATHLEN  1024  # siehe <sys/param.h>
  191.   #ifdef DJUNIX
  192.     extern char* getwd (char* pathname); # siehe GETWD(3)
  193.   #endif
  194.   #ifdef EMUNIX
  195.     extern char _getdrive (void);
  196.     extern int _chdrive (char drive);
  197.     #ifdef EMUNIX_OLD_8f
  198.       extern char* getcwd (char* buf, int bufsize);
  199.     #else # EMUNIX_NEW_8g
  200.       extern char* getcwd (char* buf, size_t bufsize);
  201.     #endif
  202.     extern int _getcwd1 (char* buf, char drive);
  203.   #endif
  204.   #ifdef WATCOM
  205.     # extern void _dos_getdrive (unsigned int * drivep);
  206.     extern char* getcwd (char* buf, unsigned int bufsize);
  207.   #endif
  208. # wird verwendet von PATHNAME
  209.  
  210. # Information zu einem File erfragen:
  211.   extern int access (CONST char* path, int amode);
  212.   #if defined(EMUNIX) || defined(WATCOM)
  213.     #include <io.h>
  214.   #endif
  215.   #include <sys/types.h>
  216.   #include <sys/stat.h>
  217.   extern int stat (CONST char* path, struct stat * buf); # siehe STAT(2V)
  218.   extern int fstat (int fd, struct stat * buf); # siehe STAT(2V)
  219.   # Test auf Directory:
  220.     #undef S_ISDIR
  221.     #define S_ISDIR(m)  (((m)&S_IFMT) == S_IFDIR)
  222.   # Test auf regulΣres File:
  223.     #undef S_ISREG # unser Macro hierfⁿr ist effizienter
  224.     #define S_ISREG(m)  (((m)&(S_IFMT&~S_IFREG)) == 0)
  225.   # Links gibt es keine:
  226.     #define S_ISLNK(m)  FALSE
  227.   # siehe auch PATHNAME:get_file_write_datetime()
  228. # wird verwendet von PATHNAME, STREAM
  229.  
  230. # File l÷schen:
  231.   extern int unlink (CONST char* path); # siehe UNLINK(2V)
  232. # wird verwendet von PATHNAME
  233.  
  234. # File umbenennen:
  235.   extern int rename (CONST char* oldpath, CONST char* newpath); # siehe RENAME(2V)
  236. # wird verwendet von PATHNAME
  237.  
  238. # Directory-Suche:
  239.   #ifdef DJUNIX
  240.     #include <dir.h>
  241.     extern int findfirst (const char* pathname, struct ffblk * ffblk, int attrib);
  242.     extern int findnext (struct ffblk * ffblk);
  243.   #endif
  244.   #ifdef EMUNIX
  245.     #include <dirent.h>
  246.     #if 0
  247.       struct ffblk # gleich aufgebaut wie struct _find in <sys/emx.h>
  248.                    { char ff_reserved[21];
  249.                      unsigned char ff_attrib;
  250.                      unsigned short ff_ftime;
  251.                      unsigned short ff_fdate;
  252.                      unsigned short ff_fsize[2]; # Vorsicht Alignment!
  253.                      char ff_name[16];
  254.                    };
  255.     #else # so ist's eleganter:
  256.       # include <sys/emx.h> # siehe oben
  257.       #define ffblk  _find
  258.       #define ff_reserved  reserved
  259.       #define ff_attrib    attr
  260.       #define ff_ftime     time
  261.       #define ff_fdate     date
  262.       #define ff_fsize     size_lo
  263.       #define ff_name      name
  264.     #endif
  265.     extern int __findfirst (const char* pathname, int attrib, struct ffblk * ffblk);
  266.     extern int __findnext (struct ffblk * ffblk);
  267.     #define findfirst(path,buf,attr)  __findfirst(path,attr,buf)
  268.     #define findnext(buf)  __findnext(buf)
  269.     #define FA_DIREC   A_DIR
  270.     #define FA_ARCH    A_ARCHIVE
  271.     #define FA_RDONLY  A_RONLY
  272.     #if 0
  273.       # Kompatibel zu UNIX:
  274.       #define SDIRENT  struct dirent
  275.       extern DIR* opendir (CONST char* dirname); # siehe DIRECTORY(3V)
  276.       extern SDIRENT* readdir (DIR* dirp); # siehe DIRECTORY(3V)
  277.       extern void closedir (DIR* dirp); # siehe DIRECTORY(3V)
  278.       #define CLOSEDIR(dirp)  (closedir(dirp),0)
  279.     #endif
  280.   #endif
  281.   #ifdef WATCOM
  282.     # include <dos.h>
  283.     #define ffblk  _find_t
  284.     #define ff_reserved  reserved
  285.     #define ff_attrib    attrib
  286.     #define ff_ftime     wr_time
  287.     #define ff_fdate     wr_date
  288.     #define ff_fsize     size
  289.     #define ff_name      name
  290.     extern unsigned int _dos_findfirst (const char* pathname, unsigned int attrib, struct ffblk * ffblk);
  291.     extern unsigned int _dos_findnext (struct ffblk * ffblk);
  292.     #define FA_DIREC   _A_SUBDIR
  293.     #define FA_ARCH    _A_ARCH
  294.     #define FA_RDONLY  _A_RDONLY
  295.     #if 0
  296.       # Kompatibel zu UNIX:
  297.       #define SDIRENT  struct dirent
  298.       extern DIR* opendir (CONST char* dirname); # siehe DIRECTORY(3V)
  299.       extern SDIRENT* readdir (DIR* dirp); # siehe DIRECTORY(3V)
  300.       extern int closedir (DIR* dirp); # siehe DIRECTORY(3V)
  301.       #define CLOSEDIR  closedir
  302.     #endif
  303.   #endif
  304. # wird verwendet von PATHNAME
  305.  
  306. # Directory anlegen:
  307.   #ifdef DJUNIX
  308.     extern int mkdir (CONST char* path, int attrib);
  309.   #endif
  310.   #if defined(EMUNIX) || defined(WATCOM)
  311.     #if defined(EMUNIX_OLD_8e) || defined(WATCOM)
  312.       extern int mkdir (CONST char* path); # siehe MKDIR(2V)
  313.       #define mkdir(path,attrib) (mkdir)(path)
  314.     #else # defined(EMUNIX_NEW_8f)
  315.       extern int mkdir (CONST char* path, long attrib);
  316.     #endif
  317.   #endif
  318. # wird verwendet von PATHNAME
  319.  
  320. # Directory l÷schen:
  321.   extern int rmdir (CONST char* path); # siehe RMDIR(2V)
  322. # wird verwendet von PATHNAME
  323.  
  324. # Arbeiten mit offenen Files:
  325.   #include <sys/types.h>
  326.   #ifdef WATCOM
  327.     #include <fcntl.h>
  328.   #else
  329.     #include <sys/file.h>
  330.   #endif
  331.   #include <io.h>
  332.   extern int open (CONST char* path, int flags, ...); # siehe OPEN(2V)
  333.   #ifdef DJUNIX
  334.     extern int creat (CONST char* path, unsigned long mode); # ignoriert das 2. Argument
  335.   #endif
  336.   #if defined(EMUNIX) || defined(WATCOM)
  337.     # definiert creat(path,mode) == open(path,O_WRONLY|O_TRUNC|O_CREAT,mode),
  338.     # was wir wegen unserer Bufferung in STREAM nicht brauchen k÷nnen.
  339.     #define creat(path,mode)  open(path,O_RDWR|O_TRUNC|O_CREAT,mode)
  340.   #endif
  341.   #define my_open_mask  0644
  342.   extern int setmode (int fd, int mode); # mode = O_TEXT oder O_BINARY
  343.   # File-Modus: i.a. unbestimmt. (Nur bei EMUNIX kann man bei open() O_TEXT
  344.   #   bzw. O_BINARY im 2. Argument angeben.) Daher ein setmode() n÷tig.
  345.   #define Handle  uintW  # Typ eines File-Deskriptors
  346.   extern off_t lseek (int fd, off_t offset, int whence); # siehe LSEEK(2V)
  347.   #define RW_BUF_T  void*
  348.   #ifdef EMUNIX
  349.     extern int read (int fd, RW_BUF_T buf, size_t nbyte); # siehe READ(2V)
  350.     extern int write (int fd, CONST RW_BUF_T buf, size_t nbyte); # siehe WRITE(2V)
  351.   #else
  352.     extern int read (int fd, RW_BUF_T buf, unsigned int nbyte); # siehe READ(2V)
  353.     extern int write (int fd, CONST RW_BUF_T buf, unsigned int nbyte); # siehe WRITE(2V)
  354.   #endif
  355.   extern int close (int fd); # siehe CLOSE(2V)
  356.   extern int dup (int fd); # siehe DUP(2V)
  357.   #if !defined(DJUNIX) && !defined(WATCOM)
  358.     extern int fsync (int fd); # siehe FSYNC(2)
  359.   #endif
  360.   #ifdef EMUNIX_PORTABEL
  361.     #include <sys/time.h>
  362.     extern int select (int width, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
  363.                        struct timeval * timeout); # siehe SELECT(2)
  364.   #endif
  365.   # Wrapper um die System-Aufrufe, die Teilergebnisse und evtl. EINTR behandeln:
  366.   #ifdef EMUNIX
  367.     extern int full_read (int fd, RW_BUF_T buf, size_t nbyte);
  368.     extern int full_write (int fd, CONST RW_BUF_T buf, size_t nbyte);
  369.     #define RW_SIZE_T size_t  # fⁿr unixaux.d
  370.   #else
  371.     #define full_read read
  372.     #define full_write write
  373.   #endif
  374.   #define OPEN open
  375.   #define CLOSE close
  376. # wird verwendet von STREAM, PATHNAME, SPVW, MISC
  377.  
  378. # Terminal-Abfragen:
  379.   extern int isatty (int fd); # siehe TTYNAME(3V)
  380.   #ifdef EMUNIX
  381.     extern int ioctl (int fd, int request, ...); # siehe IOCTL(2)
  382.     extern int __ioctl1 (int fd, int code); # fⁿhrt einen INT 21,44,code aus
  383.     #define CADDR_T  unsigned long
  384.   #endif
  385.   #ifdef EMUNIX_PORTABEL
  386.     #include <sys/ioctl.h>
  387.   #else
  388.     # get_handle_input_status(handle,status);
  389.     # > handle
  390.     # < status: INT 21,44,06
  391.     #ifdef DJUNIX
  392.       #define get_handle_input_status(handle,status)  \
  393.         __asm__ (# DOS-Funktion 44H, Code 06H                                        \
  394.                  " movw $0x4406,%%ax ; int $0x21 "                                   \
  395.                  : "=a" /* %al */ (status)                                 # OUT     \
  396.                  : "b" /* %bx */ ((uintW)(handle))                         # IN      \
  397.                  : "bx","cx","dx","si","di" /* %ebx,%ecx,%edx,%esi,%edi */ # CLOBBER \
  398.                 )
  399.     #endif
  400.     #ifdef EMUNIX
  401.       #define get_handle_input_status(handle,status)  \
  402.         __asm__ (# DOS-Funktion 44H, Code 06H                                        \
  403.                  " movw $0x4406,%%ax ; call ___syscall "                             \
  404.                  : "=a" /* %al */ (status)                                 # OUT     \
  405.                  : "b" /* %bx */ ((uintW)(handle))                         # IN      \
  406.                  : "bx","cx","dx","si","di" /* %ebx,%ecx,%edx,%esi,%edi */ # CLOBBER \
  407.                 )
  408.     #endif
  409.     #ifdef WATCOM
  410.       # include <dos.h>
  411.       #define get_handle_input_status(handle,status)  \
  412.         { var union REGS in;                        \
  413.           var union REGS out;                       \
  414.           in.regW.ax = 0x4406; in.regW.bx = handle; \
  415.           intdos(&in,&out);                         \
  416.           status = out.regB.al;                     \
  417.         }
  418.     #endif
  419.   #endif
  420.   #ifdef EMUNIX_NEW_8e
  421.     extern int eof (int fd); # meldet, ob EOF erreicht
  422.     #ifndef WINDOWS
  423.       extern void _scrsize (int* dst); # dst[0]:=columns, dst[1]:=rows
  424.     #endif
  425.   #endif
  426.   #ifdef EMUNIX
  427.     # vgl. UNIX_TERM_TERMIO
  428.     #include <sys/termio.h> # siehe TERMIO(4)
  429.     extern int tgetent (char* bp, char* name); # siehe TERMCAP(3X)
  430.     extern int tgetnum (char* id); # siehe TERMCAP(3X)
  431.     #ifdef EMUNIX_NEW_8f
  432.       # "There's a bug in ioctl (..., TCSETAF, ...), which causes the new mode
  433.       # flags to be ignored.  Use TCSETA instead.  If you have to flush the
  434.       # buffer, use TCSETAF, then TCSETA." Eberhard Mattes 9.3.1993
  435.       #undef TCSETAF
  436.       #define TCSETAF  TCSETA
  437.     #endif
  438.   #endif
  439.   #ifdef WINDOWS
  440.     # siehe winmain.d, wintext.d:
  441.     typedef struct mywindow * mywindow;
  442.     extern mywindow main_window;
  443.     extern void get_text_size (mywindow w, int* width, int* height);
  444.   #endif
  445. # wird verwendet von SPVW, STREAM, WINDOWS
  446.  
  447. # Tastatur abfragen, direkte Bildschirm-Ausgabe
  448.   #if !defined(WINDOWS)
  449.     #ifdef DJUNIX
  450.     # #include <pc.h>
  451.     # kbhit() [TP: KeyPressed] sagt, ob ein Tastendruck wartet.
  452.     # getch() [TP: ReadKey] liefert den letzten Tastendruck, wartet evtl.
  453.     # Da getch() nicht den Scan-Code liefert - wie ein Blick in libsrc\c\dos\*k*.s
  454.     # verrΣt - benutzen wir diese Funktionen aber nicht, sondern programmieren
  455.     # das N÷tige selber.
  456.     #endif
  457.     #ifdef WATCOM
  458.     # #include <conio.h>
  459.     # extern int kbhit (void);
  460.     # extern int getch (void);
  461.     #endif
  462.     #if defined(EMUNIX_PORTABEL) && defined(EMUNIX_NEW_8f)
  463.       #include <sys/video.h>
  464.       extern int v_init (void);
  465.       extern int v_hardware (void);
  466.       extern void v_dimen (int* width, int* height);
  467.       extern void v_getctype (int* start, int* end);
  468.       extern void v_ctype (int start, int end);
  469.       extern void v_attrib (int attrib);
  470.       extern void v_putc (char c);
  471.       extern void v_putn (char c, int count);
  472.       extern void v_getxy (int* x, int* y);
  473.       extern void v_gotoxy (int x, int y);
  474.       extern void v_clear (void);
  475.       extern void v_clreol (void);
  476.       extern void v_delline (int count);
  477.       extern void v_insline (int count);
  478.       extern void v_scroll (int x_left, int y_top, int x_right, int y_bottom, int count, int direction);
  479.     #endif
  480.   #else # defined(WINDOWS)
  481.     # siehe winmain.d, wintext.d:
  482.     extern boolean win_main_kbhit (void);
  483.     extern uintW win_main_getch (void);
  484.   #endif
  485. # wird verwendet von STREAM
  486.  
  487. # Datum/Uhrzeit verarbeiten:
  488.   #include <time.h>
  489.   extern struct tm * localtime (CONST time_t* clock); # siehe CTIME(3V)
  490. # wird verwendet von SPVW
  491.  
  492. # Datum/Uhrzeit abfragen:
  493.   #if defined(DJUNIX) && 0 # nicht verwendbar: geht eine Stunde nach!!
  494.     #include <sys/time.h>
  495.     extern int gettimeofday (struct timeval * tp, struct timezone * tzp); # siehe GETTIMEOFDAY(2)
  496.   #endif
  497.   #ifdef EMUNIX
  498.     #if !defined(WINDOWS)
  499.       #ifdef EMUNIX_OLD_8d
  500.         #include <sys/emx.h>
  501.         extern void __ftime (struct _dtd * date_time);
  502.       #endif
  503.       #ifdef EMUNIX_NEW_8e
  504.         #include <sys/timeb.h>
  505.         extern void __ftime (struct timeb * time); # ftime() ohne Zeitzone
  506.       #endif
  507.     #else # defined(WINDOWS)
  508.       # mu▀ intdos() verwenden
  509.       static __inline void intdos (union REGS * in_regs, union REGS * out_regs)
  510.         { __asm__ __volatile__ ( "movl 0(%%esi),%%eax ; "
  511.                                  "movl 4(%%esi),%%ebx ; "
  512.                                  "movl 8(%%esi),%%ecx ; "
  513.                                  "movl 12(%%esi),%%edx ; "
  514.                                  "pushl %%edi ; "
  515.                                  "call ___syscall ; "
  516.                                  "popl %%edi ; "
  517.                                  "movl %%eax,0(%%edi) ; "
  518.                                  "movl %%ebx,4(%%edi) ; "
  519.                                  "movl %%ecx,8(%%edi) ; "
  520.                                  "movl %%edx,12(%%edi)"
  521.                                  :                                                         # OUT
  522.                                  : "S" /* %esi */ (in_regs), "D" /* %edi */ (out_regs)     # IN
  523.                                  : "ax","bx","cx","dx","si" /* %eax,%ebx,%ecx,%edx,%esi */ # CLOBBER
  524.                                );
  525.         }
  526.     #endif
  527.   #endif
  528.   #if defined(WATCOM) && 0 # zu kompliziert
  529.     #include <sys/timeb.h>
  530.     extern int ftime (struct timeb * tp); # siehe TIME(3V)
  531.   #endif
  532.   #if defined(WATCOM) && 0 # kann genauso gut intdos() verwenden
  533.     # include <dos.h>
  534.     extern void _dos_getdate (struct dosdate_t * date);
  535.     extern void _dos_gettime (struct dostime_t * time);
  536.   #endif
  537.   # siehe auch SPVW.D:get_time() und SPVW.D:get_decoded_time()
  538. # wird verwendet von SPVW
  539.  
  540. # Programme aufrufen:
  541.   #include <process.h>
  542.   #if !(defined(WATCOM) && defined(WINDOWS))
  543.     extern int spawnv (int pmode, CONST char* path, CONST2 char* CONST argv[]);
  544.   #endif
  545.   extern int system (CONST char* command);
  546.   # system(NULL) stellt fest, ob ein Kommandoprozessor zur Verfⁿgung steht.
  547.   # system(command) ⁿbergibt dem Kommandoprozessor einen Befehl.
  548. # wird verwendet von PATHNAME
  549.  
  550. # Programme aufrufen:
  551.   #ifdef EMUNIX_PORTABEL
  552.     #include <stdio.h>
  553.     extern FILE* popen (CONST char* command, CONST char* mode);
  554.     extern int pclose (FILE* f);
  555.     extern int fileno (FILE* f);
  556.   #endif
  557. # wird verwendet von STREAM
  558.  
  559. # "Zufalls"zahlen besorgen:
  560.   #include <time.h>
  561.   extern time_t time (time_t* tloc); # siehe TIME(3V)
  562. # wird verwendet von LISPARIT
  563.  
  564.  
  565. # Versionsabfragen:
  566.   #ifdef EMUNIX # WATCOM hat diese Variablen auch, aber wir benutzen sie nicht.
  567.     #include <stdlib.h>
  568.     extern const unsigned char _osmode;
  569.     extern const unsigned char _osmajor;
  570.     extern const unsigned char _osminor;
  571.   #endif
  572. # wird verwendet von SPVW, PATHNAME, STREAM, MISC
  573.  
  574.  
  575. # Kollisionsvermeidung mit Library-Funktionen:
  576. #ifdef DJUNIX
  577.   #define kbhit  my_kbhit
  578. #endif
  579.  
  580. # Umgehen eines lΣstigen ENAMETOOLONG Errors bei Benutzung von langen
  581. # Filenamen auf FAT-Drives unter OS/2:
  582. #ifdef EMUNIX_PORTABEL
  583.   #define chdir  my_chdir
  584.   #define access  my_access
  585.   #define stat(x,y)  my_stat(x,y)
  586.   #define unlink  my_unlink
  587.   #define rename  my_rename
  588.   #define __findfirst  my___findfirst
  589.   #undef mkdir
  590.   #define mkdir  my_mkdir
  591.   #define open(x,y)  my_open(x,y)
  592.   #undef creat
  593.   #define creat  my_creat
  594.   #define spawnv  my_spawnv
  595.   extern int chdir (CONST char* path); # siehe CHDIR(2V)
  596.   extern int access (CONST char* path, int amode);
  597.   extern int stat (CONST char* path, struct stat * buf); # siehe STAT(2V)
  598.   extern int unlink (CONST char* path); # siehe UNLINK(2V)
  599.   extern int rename (CONST char* oldpath, CONST char* newpath); # siehe RENAME(2V)
  600.   extern int __findfirst (const char* pathname, int attrib, struct ffblk * ffblk);
  601.   extern int mkdir (CONST char* path, long attrib);
  602.   extern int open (CONST char* path, int flags); # siehe OPEN(2V)
  603.   extern int creat (CONST char* path, int pmode);
  604.   extern int spawnv (int pmode, CONST char* path, CONST char* CONST argv[]);
  605. #endif
  606.  
  607.  
  608. #ifdef EMUNIX
  609. # In der OS/2 - Version kann man folgendes verwenden:
  610. # - _sleep2()
  611. # - Kommando-Interpreter: cmd.exe, nicht command.com .
  612. #endif
  613. # File-Funktionen austesten!!
  614.