sys7.1-doc-wip/Interfaces/CIncludes/FragLoad.h
2019-07-27 22:37:48 +08:00

321 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
File: FragLoad.h
Contains: CFM Public API
Written by: Erik Eidt, Alan Lillich, Jeff Cobb
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<15> 6/16/93 ELE (with AWL) Added new error code for UserInitProcFailure.
<14> 6/9/93 jrc (with SP) In the CFMTrap macro, remove the cast of (arg) to
signed short. This was confusing the interfacer.
<13> 6/9/93 EPT Changes for Universal Headers. Synched up with Reality.
<12> 6/5/93 BT (With JRG) "#ifndef interface_glue" should only be bracketing
the prototypes, not the type information. This was causing a
problem for ProcessesPriv.h where Eric was expecting some type
information to be available.
<11> 5/10/93 jrc Make C++ Happy.
<10> 4/7/93 jrc Use symbolic names for the MixedMode and CFM A-traps.
<9> 3/17/93 JRG Change how procinfos are constructed
<8> 3/4/93 AWL Change to "pascal" routines for Dagon.
<7> 3/2/93 jrc Fix Erik's fixes. "FourBytes" not "FourByte".
<6> 3/2/93 ELE Fixed two typo's in proc infos.
<5> 2/18/93 ELE Moved a bunch of stuff into here
from CodeFragments.h
<4> 2/15/93 ELE Added kAnyArchType.
<3> 1/28/93 jrc Rev for d4 MixedMode.
*/
/*******************************************************************************
FILENAME
FragLoad.h
COPYRIGHT
Copyright © Apple Computer, Inc. 1992
All rights reserved.
*******************************************************************************/
#ifndef __FRAGLOAD__
#define __FRAGLOAD__ 1
#include <Types.h>
#include <Files.h>
#include <Traps.h>
typedef long ConnectionID;
typedef unsigned long Mask;
typedef unsigned char SymClass;
#define kPowerPC 'pwpc' // use as the architecture type
#define kAnyArchType 0x3f3f3f3f // '????'
#define kNoLibName ((unsigned char *) 0)
#define kNoConnectionID ((ConnectionID) 0)
#define kUnresolvedSymbolAddress ((Ptr) 0x0)
enum { // use for findFlags mask
kLoadLib = 1, // use existing connection if possible
kFindLib = 2, // just see if library is already loaded
kLoadNewCopy = 5, // load a new instance no matter what
kUseInPlace = 0x80 // use container's sections in place
};
enum {
kCodeSym = 0,
kDataSym = 1,
kTVectSym = 2,
kTOCSym = 3,
kGlueSym = 4
};
/************************************************************************/
/* for fragment initialization routines */
/************************************************************************/
struct MemFragment {
Ptr address;
long length;
Boolean inPlace;
};
typedef struct MemFragment MemFragment;
struct DiskFragment {
FSSpecPtr fileSpec;
long offset;
long length;
};
typedef struct DiskFragment DiskFragment;
struct SegmentedFragment {
FSSpecPtr fileSpec;
OSType rsrcType;
short rsrcID;
};
typedef struct SegmentedFragment SegmentedFragment;
struct FragmentLocator {
long where;
union {
MemFragment inMem;
DiskFragment onDisk;
SegmentedFragment inSegs;
} u;
};
typedef struct FragmentLocator FragmentLocator, *FragmentLocatorPtr;
// NOTE: when fragLocator. where == kOnDisk, then
// fragLocator. u. onDisk. fileSpec is a pointer
// to the file that the library belonged to.
// the pointer is valid only for the duration
// of the init routine's invocation, so make
// a copy of the filespec if it is important
struct InitBlock {
long contextID;
long closureID;
long connectionID;
FragmentLocator fragLocator;
Ptr libName;
long reserved4a;
long reserved4b;
long reserved4c;
long reserved4d;
};
typedef struct InitBlock InitBlock, *InitBlockPtr;
// prototype for initialization routines
// Pascal calling conventions
// NOTE: initialization routines may comfortably ignore
// their parameters, however, they must return
// an error status (ie: noErr) in order to succeed
// with the load of the library
typedef pascal OSErr ConnectionInitializationRoutine ( InitBlockPtr initBlkPtr );
// termination routines get no parameters / return value
// Pascal calling conventions
typedef pascal void ConnectionTerminationRoutine ( void );
/************************************************************************/
/* for building shared libraries */
/************************************************************************/
#define kCFMRsrcType 'cfrg'
#define kSHLBFileType 'shlb'
/************************************************************************/
/* error codes */
/************************************************************************/
enum {
fragNoErr = 0,
fragContextNotFound = -2800, // contextID was not valid
fragConnectionIDNotFound = -2801, // connecionID was not valid
fragSymbolNotFound = -2802, // symbol was not found in connection
fragSectionNotFound = -2803, // section was not found
fragLibNotFound = -2804, // library name not found in Frag registry
fragDupRegLibName = -2805, // registered name already in use
fragFormatUnknown = -2806, // fragment container format unknown
fragHadUnresolveds = -2807, // loaded fragment had unacceptable unresolveds
fragHadSoftUnresolveds = -2808, // loaded fragment has acceptable unresolveds
fragNoMem = -2809, // out of memory for interal bookkeeping
fragNoAddrSpace = -2810, // out of memory in user's address space for loadable section
fragNoContextIDs = -2811, // no more context ids
fragObjectInitSeqErr = -2812, // order error during user initialization function invocation
fragImportTooOld = -2813, // import library was too old and therefore incompatible
fragImportTooNew = -2814, // import library was too new and therefore incompatible
fragInitLoop = -2815, // circularity detected in mandatory initialization order
fragInitRtnUsageErr = -2816, // boot library has initialization routine
fragLibConnErr = -2817, // error connecting to library (error occured in sub prepare)
fragMgrInitErr = -2818, // error in initailization of this manager
fragConstErr = -2819, // internal inconstistancy
fragCorruptErr = -2820, // fragment container corrupted (known format)
fragUserInitProcErr = -2821, // user intialization routine did not return noErr
fragLastErrCode = -2899 // last reserved error code number
};
#if TurnOff68KCFMTraps || __powerc || powerc
#define CFMTrap(arg) /* don't want trap: 68k-code to link directly */
#else
#define CFMTrap(arg) = { 0x3F3C, arg, _CodeFragmentDispatch }
#endif
#ifdef __cplusplus
extern "C" {
#endif
pascal OSErr GetSharedLibrary ( Str63 libName,
OSType archType,
Mask findFlags,
ConnectionID *connID,
Ptr *mainAddr,
Str255 errName )
CFMTrap ( 1 );
#define GetSharedLibraryProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode) | \
STACK_PARAM_FIELD(6, kFourByteCode))
pascal OSErr GetDiskFragment ( FSSpecPtr fileSpec,
long offset,
long length,
Str63 fragName,
Mask findFlags,
ConnectionID *connID,
Ptr *mainAddr,
Str255 errName )
CFMTrap ( 2 );
#define GetDiskFragmentProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode) | \
STACK_PARAM_FIELD(6, kFourByteCode) | \
STACK_PARAM_FIELD(7, kFourByteCode) | \
STACK_PARAM_FIELD(8, kFourByteCode))
pascal OSErr GetMemFragment ( Ptr memAddr,
long length,
Str63 fragName,
Mask findFlags,
ConnectionID *connID,
Ptr *mainAddr,
Str255 errName )
CFMTrap ( 3 );
#define GetMemFragmentProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode) | \
STACK_PARAM_FIELD(6, kFourByteCode) | \
STACK_PARAM_FIELD(7, kFourByteCode))
pascal OSErr CloseConnection ( ConnectionID *connID )
CFMTrap ( 4 );
#define CloseConnectionProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode))
pascal OSErr FindSymbol ( ConnectionID connID,
Str255 symName,
Ptr *symAddr,
SymClass *symClass )
CFMTrap ( 5 );
#define FindSymbolProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode))
pascal OSErr CountSymbols ( ConnectionID connID,
long *symCount )
CFMTrap ( 6 );
#define CountSymbolsProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode))
pascal OSErr GetIndSymbol ( ConnectionID connID,
long symIndex,
Str255 symName,
Ptr *symAddr,
SymClass *symClass )
CFMTrap ( 7 );
#define GetIndSymbolProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode))
#ifdef __cplusplus
}
#endif
#endif