Milán Major

netscape-revival

1 branch
Code

nspr/include/prmacos.h

#ifndef prmacos_h___
#define prmacos_h___

//
// This file contains all changes and additions which need to be made to the NSPR runtime 
// for the Macintosh platform (specifically the Metrowerks environment).  This file should 
// only be incluced in Macintosh builds.
//

#include "prmacros.h"
#include "prtypes.h"
#include "prsystem.h"

NSPR_BEGIN_EXTERN_C

#include <stddef.h>
#include <setjmp.h>

#if _NSPR
	#ifndef TRUE					// Mac standard is lower case true
		#define TRUE 1
	#endif
	#ifndef FALSE					// Mac standard is lower case true
		#define FALSE 0
	#endif
#endif

#define GCPTR
#define CALLBACK
typedef int (*FARPROC)();
#define gcmemcpy(a,b,c) memcpy(a,b,c)

#define PR_CONTEXT_TYPE 								\
struct {												\
	jmp_buf		 		registers;						\
}

#if defined(powerc) || defined(__powerc)
	#define PR_GetSP(_t) (*((uint32 *)((_t)->context.registers) + 2))
	#define INIT_STACKPTR(stackTop) ((unsigned char*)stackTop - 128)
	#define PR_NUM_GCREGS 70
#else
	#define PR_GetSP(_t) (*((uint32 *)((_t)->context.registers) + 12))
	#define INIT_STACKPTR(stackTop) ((unsigned char*)stackTop - 4)
	#define PR_NUM_GCREGS 13
#endif

#define PR_NO_PREEMPT	1
#define MAX_NON_PRIMARY_TIME_SLICES 	6

extern long gTimeSlicesOnNonPrimaryThread;
extern PRThread *gPrimaryThread;

#define _MD_INIT_CONTEXT(_thread, e, o, a)							\
{																	\
 	unsigned char *sp;												\
 	if(setjmp(_thread->context.registers)) HopToadNoArgs();   		\
    (_thread)->asyncCall = e;										\
    (_thread)->asyncArg0 = o;										\
    (_thread)->asyncArg1 = a;										\
    sp = INIT_STACKPTR((_thread)->stack->stackTop);					\
    (PR_GetSP(_thread)) = (long) sp;   								\
}

#define _MD_SWITCH_CONTEXT(_thread)	 				\
{													\
    if (!setjmp(_thread->context.registers)) { 															\
		_PR_Schedule();			 					\
    }												\
}


/*
** Restore a thread context, saved by _MD_SWITCH_CONTEXT
*/
#define _MD_RESTORE_CONTEXT(_thread)   	\
{				       					\
    _pr_current_thread = _thread;       \
    PR_LOG(SCHED, warn, ("Scheduled")); \
    longjmp(_thread->context.registers, 1);																\
}

PRThread *PR_GetPrimaryThread();

typedef short PROSFD;

// Errors not found in the Mac StdCLib
#define EACCES  		13      	// Permission denied
#define ENOENT			-43			// No such file or directory
//#define EAGAIN			10		// No more processes
#define EINTR			11			// interrupted system call
#define EBADF			-1			// Bad file number
//#define EWOULDBLOCK		12		// Operation would block
#define _OS_INVALID_FD_VALUE -1

#define	STDERR_FILENO	2

#define MAC_PATH_SEPARATOR 				':'
#define PATH_SEPARATOR 					':'
#define DIRECTORY_SEPARATOR				'/'
#define DIRECTORY_SEPARATOR_STR			"/"
#define UNIX_THIS_DIRECTORY_STR			"./"
#define UNIX_PARENT_DIRECTORY_STR		"../"

#define MAX_PATH 			512
#define MAX_MAC_FILENAME	31


// Alias a few names
#define putenv	PR_PutEnv
#define getenv	PR_GetEnv

typedef unsigned char (*MemoryCacheFlusherProc)(size_t size);
typedef void (*PreAllocationHookProc)(void);

extern char *strdup(const char *source);

extern void InstallPreAllocationHook(PreAllocationHookProc newHook);
extern void InstallMemoryCacheFlusher(MemoryCacheFlusherProc newFlusher);

extern char *PR_GetDLLSearchPath(void);

extern int strcmp(const char *str1, const char *str2);
extern int strcasecmp(const char *str1, const char *str2);

extern void MapFullToPartialMacFile(char *);
extern char *MapPartialToFullMacFile(const char *);

extern void ResetTimer(void);
extern void PR_PeriodicIdle(void);
extern void ActivateTimer(void);
extern void DeactivateTimer(void);
extern void PR_InitMemory(void);

#define gethostbyaddr		macsock_gethostbyaddr
#define getsockname 		macsock_getsockname
#define socket 				macsock_socket
#define listen				macsock_listen
#define accept				macsock_accept
#define bind				macsock_bind
#define connect				macsock_connect
#define send				macsock_send
#define sendto				macsock_sendto
#define socketavailable		macsock_socketavailable


extern struct hostent *gethostbyaddr(const void *addr, int addrlen, int type);

extern short GetVolumeRefNumFromName(const char *);


//
//	Macintosh only private parts.
//
#define	dprintTrace			";dprintf;doTrace"
#define	dprintNoTrace		";dprintf"
extern void dprintf(const char *format, ...);


// Entry into the memory systemÕs cache flushing
extern uint8 CallCacheFlushers(size_t blockSize);

enum {
	kPrivateNSPREventType = 13
};

extern void* reallocSmaller(void* block, size_t newSize);


NSPR_END_EXTERN_C

#endif /* prmacos_h___ */