/* emx/syscalls.h (emx+gcc) -- Copyright (c) 1992-1993 by Eberhard Mattes */

#if !defined (NULL)
#define NULL ((void *)0)
#endif

#if !defined (INIT)
#define EXTERN extern
#define INIT(x)
#endif

#define BEGIN do {
#define END   } while (0)

EXTERN void *_sys_heap_base INIT (NULL);
EXTERN void *_sys_heap_brk INIT (NULL);
EXTERN unsigned _sys_heap_size INIT (0);
EXTERN int _sys_umask INIT (0022);
EXTERN unsigned long _sys_clock0_ms INIT (0);
EXTERN long _sys_ino INIT (0x100000);


#if defined (_OS2EMX_H)

#define FTIMEZEROP(x) (*(USHORT *)&(x) == 0)
#define FDATEZEROP(x) (*(USHORT *)&(x) == 0)

#if !defined (NSIG)
#define NSIG 22
#elif NSIG != 22
Change definition of NSIG in syscalls.h!
#endif

struct find_data
{
  HDIR find_handle;
  ULONG find_count;
  FILEFINDBUF3 find_buf;
};

typedef struct
{
  struct find_data fd;
  void (*sig_handlers[NSIG])(int sig);
  char sig_ack_req[NSIG];
  char sig_pending[NSIG];
} thread_data;

#if defined (INCL_DOSEXCEPTIONS)
EXTERN PEXCEPTIONREGISTRATIONRECORD _sys_xreg INIT (NULL);
ULONG _sys_exception (PEXCEPTIONREPORTRECORD report,
    PEXCEPTIONREGISTRATIONRECORD registration, PCONTEXTRECORD context,
    PVOID whatever);
#endif /* defined (INCL_DOSEXCEPTIONS) */

extern char const _sys_sig_valid[NSIG];

long _sys_p2t (FTIME t, FDATE d);
void _sys_init_thread (thread_data *tp);
ULONG _sys_signal (int sig, int os_exc);

#if defined (__MT__)

#define MAX_THREADS 1024

/* This mutex semaphore protects the heap for __sbrk(). */
EXTERN HMTX _sbrk_mutex INIT (0);
EXTERN void *_sys_private_heap INIT (NULL);
EXTERN thread_data *_sys_thread_table[MAX_THREADS];

thread_data *_sys_thread (void);
#define SYS_THREAD (_sys_thread ())

#else /* !defined (_OS2EMX_H) */

EXTERN thread_data _sys_thread_one;
#define SYS_THREAD (&_sys_thread_one)

#endif /* !defined (_OS2EMX_H) */

#endif /* _OS2EMX_H */

void _sys_set_errno (unsigned long rc);
void _sys_get_clock (unsigned long *ms);
