Admin Panel
/*
* Copyright (C) 2002 Hyperion Entertainment
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __DLL_INTERN_H
#define __DLL_INTERN_H
/************************************************************
* Internal structures
************************************************************/
/*
** The stack type the application using the DLL prefers.
** If there is no support for this type in your DLL, return
** DLLERR_StackNotSupported.
**
** Implementation note: In the startup code, return different
** function pointers depending on the stack frame. This is
** the preferred method. Some of the stack frames might be
** identical, for example, since there is not UBYTE passing
** on the stack for the different DLL interface functions,
** using the same stack from for all 68k stack types is safe.
*/
typedef enum
{
DLLSTACK_STORM = 0x01, // 68k, StormC
DLLSTACK_EGCS = 0x02, // 68k, GCC or egcs
DLLSTACK_SAS = 0x04, // 68k, SAS/C
DLLSTACK_VBCC = 0x08, // 68k, vbcc
DLLSTACK_POWEROPEN = 0x10, // PPC, StormC or vbcc
DLLSTACK_SYSV = 0x20 // PPC, egcs
//..
} dll_tStackType;
#ifdef __STORM__
#ifdef __PPC__
#define DLLSTACK_DEFAULT DLLSTACK_POWEROPEN
#else
#define DLLSTACK_DEFAULT DLLSTACK_STORM
#endif
#else //not Storm
#ifdef __VBCC__
#ifdef __PPC__
#define DLLSTACK_DEFAULT DLLSTACK_POWEROPEN
#else
#define DLLSTACK_DEFAULT DLLSTACK_VBCC
#endif
#else //not VBCC
#ifdef __GNUC__
#ifdef __PPC
#define DLLSTACK_DEFAULT DLLSTACK_SYSV
#else
#define DLLSTACK_DEFAULT DLLSTACK_EGCS
#endif
#else //not GCC
#ifdef __SASC__
#define DLLSTACK_DEFAULT DLLSTACK_SAS
#endif
#endif //GCC
#endif //VBCC
#endif //STORMC
typedef enum
{
DLLERR_NoError = 0, // No error occured
DLLERR_StackNotSupported = 1, // Illegal stack frame
DLLERR_OutOfMemory = 2 // Init failed due to memory shortage
} dll_tErrorCode;
typedef enum
{
DLLMTYPE_Open = 0,
DLLMTYPE_Close = 1,
DLLMTYPE_SymbolQuery = 2,
DLLMTYPE_Kill = 3
} dll_tMessageType;
typedef struct dll_sSymbolQuery
{
// Preferred stack type of the main program
dll_tStackType StackType;
// Name of the Symbol
char *SymbolName;
// Where to put the Symbol Address
void **SymbolPointer;
} dll_tSymbolQuery;
typedef struct dll_sMessage
{
// Message for sending
struct Message Message;
dll_tMessageType dllMessageType;
union
{
struct
{
// Preferred stack type of the main program
dll_tStackType StackType;
// Initialization error code
dll_tErrorCode ErrorCode;
} dllOpen;
struct
{
//Empty for now
} dllClose;
dll_tSymbolQuery dllSymbolQuery;
} dllMessageData;
} dll_tMessage;
/*
** This structure is returned by the LoadLibrary() call. It is strictly
** Off-Limits for both the caller and the DLL but rather used internally
** to for tracking resources and other stuff for the DLL. This structure
** may change at any time.
*/
typedef struct dll_sInstance
{
struct Node node;
struct MsgPort *dllPort;
char name[1];
} dll_tInstance;
void *dllInternalLoadLibrary(const char *filename, const char *portname, int raiseusecount);
int dllInternalFreeLibrary(dll_tInstance *n);
#endif