/***********************************************************
Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

/*
** Shared library initialization code.
**
** This code calls the MetroWerks shared-library initialization code
** and performs one extra step: it remembers the FSSpec of the file
** we are loaded from, so we can later call PyMac_AddLibResources to
** add the file to our resource file chain.
**
** This file is needed for PythonCore and for any dynamically loaded
** module that has interesting resources in its .slb file.
** Use by replacing __initialize in the "CFM preferences" init field
** by __initialize_with_resources.
*/

#include <Types.h>
#include <Quickdraw.h>
#include <SegLoad.h>
#include <CodeFragments.h>
#include <Files.h>
#include <Resources.h>

/* Defined in the MSL runtime: */
extern void __initialize(void);

/* Defined either in macglue.c or in a MPW library: */
extern pascal int PLstrcmp(unsigned char *, unsigned char *);

/*
** Variables passed from shared lib initialization to PyMac_AddLibResources.
*/
static int library_fss_valid;
static FSSpec library_fss;

/*
** Routine called upon fragment load. We attempt to save the FSSpec from which we're
** loaded. We always return noErr (we just continue without the resources).
*/
OSErr pascal
__initialize_with_resources(CFragInitBlockPtr data)
{
	/* Call the MW runtime's initialization routine */
	__initialize();
	
	if ( data == nil ) return noErr;
	if ( data->fragLocator.where == kDataForkCFragLocator ) {
		library_fss = *data->fragLocator.u.onDisk.fileSpec;
		library_fss_valid = 1;
	} else if ( data->fragLocator.where == kResourceCFragLocator ) {
		library_fss = *data->fragLocator.u.inSegs.fileSpec;
		library_fss_valid = 1;
	}
	return noErr;
}

/*
** compare two FSSpecs, return true if equal, false if different
** XXX where could this function live? (jvr)
*/

static int
FSpCompare(FSSpec *fss1, FSSpec *fss2) {
	if (fss1->vRefNum != fss2->vRefNum)
		return 0;
	if (fss1->parID != fss2->parID)
		return 0;
	return !PLstrcmp(fss1->name, fss2->name);
}

/* XXX can't include "macglue.h" somehow (jvr) */
extern FSSpec PyMac_ApplicationFSSpec;		/* Application location (from macargv.c) */

/*
** Insert the library resources into the search path. Put them after
** the resources from the application (which we assume is the current
** resource file). Again, we ignore errors.
*/
void
PyMac_AddLibResources()
{
	if ( !library_fss_valid || FSpCompare(&library_fss, &PyMac_ApplicationFSSpec))
		return;
	(void)FSpOpenResFile(&library_fss, fsRdPerm);
}

/*
** Dummy main() program to keep linker happy: we want to
** use the MW AppRuntime in our shared library (better than building
** custom runtime libraries as we did before) but AppRuntime
** expects a main program. Note that it 
*/

#pragma export off
int
main(int argc, char **argv) {
	DebugStr("\pCannot happen: PythonCore dummy main called!");
}
#pragma export reset
