uae-wii/src/include/sysdeps.h

348 lines
8.2 KiB
C

/*
* UAE - The Un*x Amiga Emulator
*
* Try to include the right system headers and get other system-specific
* stuff right & other collected kludges.
*
* If you think about modifying this, think twice. Some systems rely on
* the exact order of the #include statements. That's also the reason
* why everything gets included unconditionally regardless of whether
* it's actually needed by the .c file.
*
* Copyright 1996, 1997 Bernd Schmidt
*/
#if defined __AMIGA__ || defined __amiga__
#include <devices/timer.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <limits.h>
#ifndef __STDC__
#ifndef _MSC_VER
#error "Your compiler is not ANSI. Get a real one."
#endif
#endif
#include <stdarg.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_VALUES_H
#include <values.h>
#endif
#include "uae_string.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef HAVE_UTIME_H
#include <utime.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#if HAVE_DIRENT_H
# include <dirent.h>
#else
# define dirent direct
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
# if HAVE_NDIR_H
# include <ndir.h>
# endif
#endif
#ifdef HAVE_SYS_UTIME_H
# include <sys/utime.h>
#endif
#include <errno.h>
#include <assert.h>
#if EEXIST == ENOTEMPTY
#define BROKEN_OS_PROBABLY_AIX
#endif
#ifdef __NeXT__
#define S_IRUSR S_IREAD
#define S_IWUSR S_IWRITE
#define S_IXUSR S_IEXEC
#define S_ISDIR(val) (S_IFDIR & val)
struct utimbuf
{
time_t actime;
time_t modtime;
};
#endif
#include "uae_types.h"
#include "uae_malloc.h"
#include "writelog.h"
#ifdef __GNUC__
/* While we're here, make abort more useful. */
#ifndef __MORPHOS__
/* This fails to compile on Morphos - not sure why yet */
#define abort() \
do { \
write_log ("Internal error; file %s, line %d\n", __FILE__, __LINE__); \
exit (0); \
} while (0)
#else
#define abort() exit(0)
#endif
#endif
/*
* Porters to weird systems, look! This is the preferred way to get
* filesys.c (and other stuff) running on your system. Define the
* appropriate macros and implement wrappers in a machine-specific file.
*
* I guess the Mac port could use this (Ernesto?)
*/
#undef DONT_HAVE_POSIX
#undef DONT_HAVE_REAL_POSIX /* define if open+delete doesn't do what it should */
#undef DONT_HAVE_STDIO
#undef DONT_HAVE_MALLOC
#if defined _WIN32
#if defined __WATCOMC__
#define O_NDELAY 0
#include <direct.h>
#define dirent direct
#define mkdir(a,b) mkdir(a)
#elif defined __MINGW32__
#define FILEFLAG_DIR 0x1
#define FILEFLAG_ARCHIVE 0x2
#define FILEFLAG_WRITE 0x4
#define FILEFLAG_READ 0x8
#define FILEFLAG_EXECUTE 0x10
#define FILEFLAG_SCRIPT 0x20
#define FILEFLAG_PURE 0x40
#define O_NDELAY 0
#define mkdir(a,b) mkdir(a)
#elif defined _MSC_VER
#ifdef HAVE_GETTIMEOFDAY
#include <winsock.h> // for 'struct timeval' definition
extern void gettimeofday( struct timeval *tv, void *blah );
#endif
#define O_NDELAY 0
#define FILEFLAG_DIR 0x1
#define FILEFLAG_ARCHIVE 0x2
#define FILEFLAG_WRITE 0x4
#define FILEFLAG_READ 0x8
#define FILEFLAG_EXECUTE 0x10
#define FILEFLAG_SCRIPT 0x20
#define FILEFLAG_PURE 0x40
#include <io.h>
#define O_BINARY _O_BINARY
#define O_WRONLY _O_WRONLY
#define O_RDONLY _O_RDONLY
#define O_RDWR _O_RDWR
#define O_CREAT _O_CREAT
#define O_TRUNC _O_TRUNC
#define W_OK 0x2
#define R_OK 0x4
#define STAT struct stat
#define DIR struct DIR
struct direct
{
char d_name[1];
};
#include <sys/utime.h>
#define utimbuf _utimbuf
#define USE_ZFILE
#undef S_ISDIR
#undef S_IWUSR
#undef S_IRUSR
#undef S_IXUSR
#define S_ISDIR(a) (a&FILEFLAG_DIR)
#define S_ISARC(a) (a&FILEFLAG_ARCHIVE)
#define S_IWUSR FILEFLAG_WRITE
#define S_IRUSR FILEFLAG_READ
#define S_IXUSR FILEFLAG_EXECUTE
/* These are prototypes for functions from the Win32 posixemu file */
extern void get_time(time_t t, long* days, long* mins, long* ticks);
extern time_t put_time (long days, long mins, long ticks);
extern DWORD getattr(const char *name, LPFILETIME lpft, size_t *size);
/* #define DONT_HAVE_POSIX - don't need all of Mathias' posixemu_functions, just a subset (below) */
#define chmod(a,b) posixemu_chmod ((a), (b))
extern int posixemu_chmod (const char *, int);
#define stat(a,b) posixemu_stat ((a), (b))
extern int posixemu_stat (const char *, struct stat *);
#define mkdir(x,y) mkdir(x)
#define truncate posixemu_truncate
extern int posixemu_truncate (const char *, long int);
#define utime posixemu_utime
extern int posixemu_utime (const char *, struct utimbuf *);
#define opendir posixemu_opendir
extern DIR * posixemu_opendir (const char *);
#define readdir posixemu_readdir
extern struct dirent* posixemu_readdir (DIR *);
#define closedir posixemu_closedir
extern void posixemu_closedir (DIR *);
#endif
#endif /* _WIN32 */
#ifdef DONT_HAVE_POSIX
#define access posixemu_access
extern int posixemu_access (const char *, int);
#define open posixemu_open
extern int posixemu_open (const char *, int, int);
#define close posixemu_close
extern void posixemu_close (int);
#define read posixemu_read
extern int posixemu_read (int, char *, int);
#define write posixemu_write
extern int posixemu_write (int, const char *, int);
#undef lseek
#define lseek posixemu_seek
extern int posixemu_seek (int, int, int);
#define stat(a,b) posixemu_stat ((a), (b))
extern int posixemu_stat (const char *, STAT *);
#define mkdir posixemu_mkdir
extern int mkdir (const char *, int);
#define rmdir posixemu_rmdir
extern int posixemu_rmdir (const char *);
#define unlink posixemu_unlink
extern int posixemu_unlink (const char *);
#define truncate posixemu_truncate
extern int posixemu_truncate (const char *, long int);
#define rename posixemu_rename
extern int posixemu_rename (const char *, const char *);
#define chmod posixemu_chmod
extern int posixemu_chmod (const char *, int);
#define tmpnam posixemu_tmpnam
extern void posixemu_tmpnam (char *);
#define utime posixemu_utime
extern int posixemu_utime (const char *, struct utimbuf *);
#define opendir posixemu_opendir
extern DIR * posixemu_opendir (const char *);
#define readdir posixemu_readdir
extern struct dirent* readdir (DIR *);
#define closedir posixemu_closedir
extern void closedir (DIR *);
/* This isn't the best place for this, but it fits reasonably well. The logic
* is that you probably don't have POSIX errnos if you don't have the above
* functions. */
extern long dos_errno (void);
#endif
#ifdef DONT_HAVE_STDIO
extern FILE *stdioemu_fopen (const char *, const char *);
#define fopen(a,b) stdioemu_fopen(a, b)
extern int stdioemu_fseek (FILE *, int, int);
#define fseek(a,b,c) stdioemu_fseek(a, b, c)
extern int stdioemu_fread (char *, int, int, FILE *);
#define fread(a,b,c,d) stdioemu_fread(a, b, c, d)
extern int stdioemu_fwrite (const char *, int, int, FILE *);
#define fwrite(a,b,c,d) stdioemu_fwrite(a, b, c, d)
extern int stdioemu_ftell (FILE *);
#define ftell(a) stdioemu_ftell(a)
extern int stdioemu_fclose (FILE *);
#define fclose(a) stdioemu_fclose(a)
#endif
#ifdef DONT_HAVE_MALLOC
#define malloc(a) mallocemu_malloc(a)
extern void *mallocemu_malloc (int size);
#define free(a) mallocemu_free(a)
extern void mallocemu_free (void *ptr);
#endif
#ifdef X86_ASSEMBLY
#define ASM_SYM_FOR_FUNC(a) __asm__(a)
#else
#define ASM_SYM_FOR_FUNC(a)
#endif
#include "target.h"
#include "machdep/machdep.h"
#include "gfxdep/gfx.h"
extern void console_out (const char *, ...);
extern void console_flush (void);
extern int console_get (char *, int);
extern void f_out (void *, const char *, ...);
extern void gui_message (const char *,...);
extern int gui_message_multibutton (int flags, const char *format,...);
#define write_log_err write_log
#ifndef O_BINARY
#define O_BINARY 0
#endif
#ifndef MAX_PATH
# define MAX_PATH 512
#endif
#ifndef MAX_DPATH
# define MAX_DPATH 512
#endif
#ifdef GEKKO
/* Technically not true, but looking at libfat, it seems like
* unlink can remove directories as well */
# define rmdir unlink
/* Definately problems! */
# define chmod(a,b)
# define dup(fd) fd
# define utime(filename, buf) 0
#endif