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


							Funzioni catturate da SPY

							  by Federico Giannici




-----------------------------------------------------------------------------
This source is provided for you to see the techniques I used to write SPY.
You can, obviously, use it to make your experiments and you can take some
routines to insert in your programs. But you CANNOT modify, recompile and
distribute the modified version to anyone without my permission.
Be a programmer not a copier.
-----------------------------------------------------------------------------

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


#include	"SPY.h"

#define	TEMPLEN	60		/*   Lunghezza stringhe temporanee per i nomi   */
#define	COPYTEMP( to, from )	strncpy( to, from, TEMPLEN )

extern	struct	MenuItem	itemverbose;
extern	struct	MenuItem	itemeverytime;



/*****   Le  proto di SPY   *****/
extern void goin( void );
extern void goout( void );
extern BOOL canoutput( void );
extern void initout( UBYTE	*funname );
extern void endout( void );
extern void status( UBYTE *text );
extern void setvect( WORD v );
extern void resetvect( WORD v );
extern void fsetvect( WORD v );
extern void fresetvect( WORD v );
extern void newline( void );
extern void prints( UBYTE *testo );
extern void printname( UBYTE *name );
extern void printpname( UBYTE *name );
extern void printbuffer( UBYTE	*buffer, LONG len );
extern void printlock( BPTR lock );
extern void printfh( BPTR fh );
extern void printd( LONG numero );
extern void printpd( LONG numero );
extern void printh( ULONG numero );
extern void addfh( BPTR fh, UBYTE	*name );
extern void remfh( BPTR fh );
extern struct fhnode *findfh( BPTR fh );
extern void clearfh( void );

extern	BOOL	cannotwait;
extern	struct	Window	*window;



UBYTE	returntext[]="Return: ";
UBYTE	unknow[]="Unknow!!";

UBYTE	*openmodetext[]=
	{
	unknow,
	"MODE_READWRITE",
	"MODE_OLDFILE",
	"MODE_NEWFILE"
	};

UBYTE	*lockmodetext[]=
	{
	unknow,
	"EXCLUSIVE_LOCK",
	"SHARED_LOCK"
	};

UBYTE	*seekmodetext[]=
	{
	unknow,
	"OFFSET_BEGINNING",
	"OFFSET_CURRENT",
	"OFFSET_END"
	};


/*****   Nuova routine Open   *****/
BPTR __saveds __asm newopen( register __d1 char *name, register __d2 long accessmode )
{
	BPTR	ret;

	goin();
	fresetvect( OPENV );
	ret=Open( name, accessmode );
	fsetvect( OPENV );
	addfh( ret, name );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "Open");
		if( VERBOSE )
			prints( "FileName: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( "AccessMode: " );
			prints( openmodetext[accessmode<1004 && accessmode>1006 ? 0 : accessmode-1003] );
			printpd( accessmode );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Close   *****/
void  __saveds __asm newclose( register __d1 BPTR file )
{
	goin();
	fresetvect( CLOSEV );
	Close( file );
	fsetvect( CLOSEV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "Close");
		if( VERBOSE )
			prints( "FileHandle: " );
		printfh( file );
		endout();
		}
	remfh( file );
	goout();
	return;
}


/*****   Nuova routine Read   *****/
long __saveds __asm newread( register __d1 BPTR file, register __d2 char *buffer, register __d3 long length )
{
	long	ret;

	goin();
	fresetvect( READV );
	ret=Read( file, buffer, length );
	fsetvect( READV );
	if( canoutput() && (EVERYTIME || ret==-1) )
		{
		initout( "Read");
		if( VERBOSE )
			prints( "FileHandle: " );
		printfh( file );
		if( VERBOSE )
			{
			newline();
			prints( "Buffer: " );
			printbuffer( buffer, length );
			newline();
			prints( "Length: " );
			printd( length );
			newline();
			prints( returntext );
			printd( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Write   *****/
long __saveds __asm newwrite( register __d1 BPTR file, register __d2 char *buffer, register __d3 long length )
{
	long	ret;

	goin();
	fresetvect( WRITEV );
	ret=Write( file, buffer, length );
	fsetvect( WRITEV );
	if( canoutput() && (EVERYTIME || ret==-1) )
		{
		initout( "Write");
		if( VERBOSE )
			prints( "FileHandle: " );
		printfh( file );
		if( VERBOSE )
			{
			newline();
			prints( "Buffer: " );
			printbuffer( buffer, length );
			newline();
			prints( "Length: " );
			printd( length );
			newline();
			prints( returntext );
			printd( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Input   *****/
BPTR __saveds __asm newinput( void )
{
	BPTR	ret;

	goin();
	fresetvect( INPUTV );
	ret=Input();
	fsetvect( INPUTV );
	addfh( ret, "<Input>" );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "Input");
		if( VERBOSE )
			prints( returntext );
		printh( (ULONG)ret );
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Output   *****/
BPTR __saveds __asm newoutput( void )
{
	BPTR	ret;

	goin();
	fresetvect( OUTPUTV );
	ret=Input();
	fsetvect( OUTPUTV );
	addfh( ret, "<Output>" );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "Output");
		if( VERBOSE )
			prints( returntext );
		printh( (ULONG)ret );
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Lock   *****/
BPTR __saveds __asm newlock( register __d1 char *name, register __d2 long accessmode )
{
	BPTR	ret;

	goin();
	fresetvect( LOCKV );
	ret=Lock( name, accessmode );
	fsetvect( LOCKV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "Lock");
		if( VERBOSE )
			prints( "FileName: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( "AccessMode: " );
			prints( lockmodetext[accessmode==-1 || accessmode==-2 ? -accessmode : 0] );
			printpd( accessmode );
			newline();
			prints( returntext );
			printlock( ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine UnLock   *****/
void  __saveds __asm newunlock( register __d1 BPTR lock )
{
	goin();
		/*   Prima l'output, altrimenti lock non e` piu` valido   */
	if( canoutput() && (EVERYTIME) )
		{
		initout( "UnLock");
		if( VERBOSE )
			prints( "Lock: " );
		printlock( lock );
		endout();
		}
	fresetvect( UNLOCKV );
	UnLock( lock );
	fsetvect( UNLOCKV );
	goout();
	return;
}


/*****   Nuova routine DupLock   *****/
BPTR  __saveds __asm newduplock( register __d1 BPTR lock )
{
	BPTR	ret;

	goin();
	fresetvect( DUPLOCKV );
	ret=DupLock( lock );
	fsetvect( DUPLOCKV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "DupLock");
		if( VERBOSE )
			prints( "Lock: " );
		printlock( lock );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printlock( ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Examine   *****/
long  __saveds __asm newexamine( register __d1 BPTR lock, register __d2 struct FileInfoBlock *fib )
{
	long	ret;

	goin();
	fresetvect( EXAMINEV );
	ret=Examine( lock, fib );
	fsetvect( EXAMINEV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "Examine");
		if( VERBOSE )
			prints( "Lock: " );
		printlock( lock );
		if( VERBOSE )
			{
			newline();
			prints( "FileInfoBlock: " );
			printh( (ULONG)fib );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine ExNext   *****/
long  __saveds __asm newexnext( register __d1 BPTR lock, register __d2 struct FileInfoBlock *fib )
{
	long	ret;

	goin();
	fresetvect( EXNEXTV );
	ret=ExNext( lock, fib );
	fsetvect( EXNEXTV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "ExNext");
		if( VERBOSE )
			prints( "Lock: " );
		printlock( lock );
		if( VERBOSE )
			{
			newline();
			prints( "FileInfoBlock: " );
			printh( (ULONG)fib );
			if( ret!=DOSFALSE )
				printpname( fib->fib_FileName );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Info   *****/
long  __saveds __asm newinfo( register __d1 BPTR lock, register __d2 struct InfoData *infodata )
{
	long	ret;

	goin();
	fresetvect( INFOV );
	ret=Info( lock, infodata );
	fsetvect( INFOV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "Info");
		if( VERBOSE )
			prints( "Lock: " );
		printlock( lock );
		if( VERBOSE )
			{
			newline();
			prints( "InfoData: " );
			printh( (ULONG)infodata );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine DeleteFile   *****/
long __saveds __asm newdeletefile( register __d1 char *name )
{
	long	ret;

	goin();
	fresetvect( DELETEFILEV );
	ret=DeleteFile( name );
	fsetvect( DELETEFILEV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "DeleteFile");
		if( VERBOSE )
			prints( "File: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Rename   *****/
long __saveds __asm newrename( register __d1 char *oldname, register __d2 char *newname )
{
	long	ret;

	goin();
	fresetvect( RENAMEV );
	ret=Rename( oldname, newname );
	fsetvect( RENAMEV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "Rename");
		if( VERBOSE )
			prints( "OldName: " );
		printname( oldname );
		if( VERBOSE )
			{
			newline();
			prints( "NewName: " );
			printname( newname );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine CreateDir   *****/
BPTR __saveds __asm newcreatedir( register __d1 char *name )
{
	BPTR	ret;

	goin();
	fresetvect( CREATEDIRV );
	ret=CreateDir( name );
	fsetvect( CREATEDIRV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "CreateDir");
		if( VERBOSE )
			prints( "Directory: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine CurrentDir   *****/
BPTR  __saveds __asm newcurrentdir( register __d1 BPTR lock )
{
	BPTR	ret;

	goin();
	fresetvect( CURRENTDIRV );
	ret=CurrentDir( lock );
	fsetvect( CURRENTDIRV );
	if( canoutput() && (EVERYTIME || ret==-1) )
		{
		initout( "CurrentDir");
		if( VERBOSE )
			prints( "NewLock: " );
		printlock( lock );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printlock( ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine ParentDir   *****/
BPTR  __saveds __asm newparentdir( register __d1 BPTR lock )
{
	BPTR	ret;

	goin();
	fresetvect( PARENTDIRV );
	ret=ParentDir( lock );
	fsetvect( PARENTDIRV );
	if( canoutput() && (EVERYTIME || ret==-1) )
		{
		initout( "ParentDir");
		if( VERBOSE )
			prints( "Lock: " );
		printlock( lock );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printlock( ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Seek   *****/
long  __saveds __asm newseek( register __d1 BPTR file, register __d2 long position, register __d3 long mode )
{
	long	ret;

	goin();
	fresetvect( SEEKV );
	ret=Seek( file, position, mode );
	fsetvect( SEEKV );
	if( canoutput() && (EVERYTIME || ret==-1) )
		{
		initout( "Seek");
		if( VERBOSE )
			prints( "FileHandle: " );
		printfh( file );
		if( VERBOSE )
			{
			newline();
			prints( "Position: " );
			printd( position );
			newline();
			prints( "Mode: " );
			prints( seekmodetext[ ABS(mode)>1 ? 0 : mode+2 ] );
			printpd( mode );
			newline();
			prints( returntext );
			printd( ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Execute   *****/
long  __saveds __asm newexecute( register __d1 char *command, register __d2 BPTR input, register __d3 BPTR output )
{
	long	ret;

	goin();
	status( "Entering Execute" );
	fresetvect( EXECUTEV );
	ret=Execute( command, input, output );
	fsetvect( EXECUTEV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "Execute");
		if( VERBOSE )
			prints( "Command: " );
		printname( command );
		if( VERBOSE )
			{
			newline();
			prints( "Input: " );
			printfh( input );
			newline();
			prints( "Output: " );
			printfh( output );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine LoadSeg   *****/
BPTR __saveds __asm newloadseg( register __d1 char *name )
{
	BPTR	ret;

	goin();
	fresetvect( LOADSEGV );
	ret=LoadSeg( name );
	fsetvect( LOADSEGV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "LoadSeg");
		if( VERBOSE )
			prints( "Name: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine UnLoadSeg   *****/
void  __saveds __asm newunloadseg( register __d1 BPTR segment )
{
	goin();
	fresetvect( UNLOADSEGV );
	UnLoadSeg( segment );
	fsetvect( UNLOADSEGV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "UnLoadSeg");
		if( VERBOSE )
			prints( "Segment: " );
		printh( (ULONG)segment );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine CreateProc   *****/
struct MsgPort * __saveds __asm newcreateproc( register __d1 char *name, register __d2 long pri, register __d3 BPTR segment, register __d4 long stacksize )
{
	struct MsgPort	*ret;

	goin();
	fresetvect( CREATEPROCV );
	ret=CreateProc( name, pri, segment, stacksize);
	fsetvect( CREATEPROCV );
	if( canoutput() && (EVERYTIME || ret==DOSFALSE) )
		{
		initout( "CreateProc");
		if( VERBOSE )
			prints( "Name: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( "Priority: " );
			printd( pri );
			newline();
			prints( "Segment: " );
			printh( (ULONG)segment );
			newline();
			prints( "StackSize: " );
			printd( stacksize );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine Exit   *****/
void __saveds __asm newexit( register __d1 long returncode )
{
	struct IntuiMessage	*msg;

	goin();
	if( canoutput() && (EVERYTIME || returncode) )
		{
		initout( "Exit");
		if( VERBOSE )
			prints( "ReturnCode: " );
		printd( returncode );
		endout();
		}
	fresetvect( EXITV );
		/*   Facciamo in modo di far eseguire fsetvect( EXITV ) a SPY   */
	if( (msg=AllocMem( sizeof(struct IntuiMessage), MEMF_CLEAR | MEMF_PUBLIC ))==NULL )
		status( "INTERNAL ERROR #20" );
		/*   Class==NULL   */
	SetTaskPri( FindTask(NULL), SPYPRIORITY+1 );		/*   Assicuriamoci di non essere interrotti   */
	PutMsg( window->UserPort, (struct Message *)msg );
	goout();
	Exit( returncode );
}

/*****   Nuova routine IoErr   *****/
long __saveds __asm newioerr( void )
{
	long	ret;

	goin();
	fresetvect( IOERRV );
	ret=IoErr();
	fsetvect( IOERRV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "IoErr");
		if( VERBOSE )
			prints( returntext );
		printd( ret );
		endout();
		}
	goout();
	return( ret );
}

/*****   Inizio routines EXEC   *****/

/*****   Nuova routine AllocMem   *****/
void * __saveds __asm newallocmem( register __d0 long size, register __d1 long requirements )
{
	void	*ret;

	goin();
	fresetvect( ALLOCMEMV );
	ret=AllocMem( size, requirements );
	if( canoutput() && (ret==NULL) )		/*   Solo se fallisce!   */
		{
		initout( "AllocMem");
		if( VERBOSE )
			prints( "Size: " );
		printd( size );
		if( VERBOSE )
			{
			newline();
			prints( "Requirements: " );
			printd( requirements );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	fsetvect( ALLOCMEMV );		/*   Qui per evitare chiamate a spirale infinita   */
	goout();
	return( ret );
}


/*****   Nuova routine OpenDevice   *****/
long __saveds __asm newopendevice( register __a0 char *name, register __d0 long unit, register __a1 struct IORequest *iorequest, register __d1 long flags )
{
	long	ret;

	goin();
	fresetvect( OPENDEVICEV );
	ret=OpenDevice( name, unit, iorequest, flags );
	fsetvect( OPENDEVICEV );
	if( canoutput() && (EVERYTIME || ret!=NULL) )
		{
		initout( "OpenDevice");
		if( VERBOSE )
			prints( "Device: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( "Unit: " );
			printd( unit );
			newline();
			prints( "IORequest: " );
			printh( (ULONG)iorequest );
			newline();
			prints( "Flags: " );
			printd( flags );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine CloseDevice   *****/
void __saveds __asm newclosedevice( register __a1 struct IORequest *iorequest )
{
	UBYTE	devname[TEMPLEN];

	goin();
	COPYTEMP( devname, iorequest->io_Device->dd_Library.lib_Node.ln_Name );
	fresetvect( CLOSEDEVICEV );
	CloseDevice( iorequest );
	fsetvect( CLOSEDEVICEV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "CloseDevice");
		if( VERBOSE )
			prints( "IORequest: " );
		printh( (ULONG)iorequest );
		printpname( devname );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine AddDevice   *****/
void __saveds __asm newadddevice( register __a1 struct Device *device )
{
	goin();
	fresetvect( ADDDEVICEV );
	AddDevice( device );
	fsetvect( ADDDEVICEV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "AddDevice");
		if( VERBOSE )
			prints( "Device: " );
		printh( (ULONG)device );
		printpname( device->dd_Library.lib_Node.ln_Name );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine OpenLibrary   *****/
struct Library * __saveds __asm newopenlibrary( register __a1 char *name, register __d0 long version )
{
	struct Library	*ret;

	goin();
	fresetvect( OPENLIBRARYV );
	ret=OpenLibrary( name, version );
	fsetvect( OPENLIBRARYV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "OpenLibrary");
		if( VERBOSE )
			prints( "Library: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( "Version: " );
			printd( version );
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine OldOpenLibrary   *****/
struct Library * __saveds __asm newoldopenlibrary( register __a1 char *name )
{
	struct Library	*ret;

	goin();
	fresetvect( OLDOPENLIBRARYV );
	ret=OldOpenLibrary( name );
	fsetvect( OLDOPENLIBRARYV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "OldOpenLibrary");
		if( VERBOSE )
			prints( "Library: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine CloseLibrary   *****/
void __saveds __asm newcloselibrary( register __a1 struct Library *library )
{
	UBYTE	libname[TEMPLEN];

	goin();
	COPYTEMP( libname, library->lib_Node.ln_Name );
	fresetvect( CLOSELIBRARYV );
	CloseLibrary( library );
	fsetvect( CLOSELIBRARYV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "CloseLibrary");
		if( VERBOSE )
			prints( "Library: " );
		printh( (ULONG)library );
		printpname( libname );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine AddLibrary   *****/
void __saveds __asm newaddlibrary( register __a1 struct Library *library )
{
	goin();
	fresetvect( ADDLIBRARYV );
	AddLibrary( library );
	fsetvect( ADDLIBRARYV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "AddLibrary");
		if( VERBOSE )
			prints( "Library: " );
		printh( (ULONG)library );
		printpname( library->lib_Node.ln_Name );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine OpenResource   ****/
struct Resource * __saveds __asm newopenresource( register __a1 char *name )
{
	struct	Resource	*ret;

	goin();
	fresetvect( OPENRESOURCEV );
	ret=OpenResource( name );
	fsetvect( OPENRESOURCEV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "OpenResource");
		if( VERBOSE )
			prints( "Resource: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine AddResource   *****/
void __saveds __asm newaddresource( register __a1 struct Resource *resource )
{
	goin();
	fresetvect( ADDRESOURCEV );
	AddResource( resource );
	fsetvect( ADDRESOURCEV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "AddResource");
		if( VERBOSE )
			prints( "Resource: " );
		printh( (ULONG)resource );
		printpname( ((struct Node *)resource)->ln_Name );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine FindPort   ****/
struct MsgPort * __saveds __asm newfindport( register __a1 char *name )
{
	struct	MsgPort	*ret;

	goin();
	fresetvect( FINDPORTV );
	ret=FindPort( name );
	fsetvect( FINDPORTV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "FindPort");
		if( VERBOSE )
			prints( "PortName: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine AddPort   *****/
void __saveds __asm newaddport( register __a1 struct MsgPort *msgport )
{
	goin();
	fresetvect( ADDPORTV );
	AddPort( msgport );
	fsetvect( ADDPORTV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "AddPort");
		if( VERBOSE )
			prints( "MsgPort: " );
		printh( (ULONG)msgport );
		printpname( msgport->mp_Node.ln_Name );
		if( strcmp( msgport->mp_Node.ln_Name, "IDCMP" )==0 )
			cannotwait=TRUE;
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine FindSemaphore   ****/
struct SignalSemaphore * __saveds __asm newfindsemaphore( register __a0 char *name )
{
	struct	SignalSemaphore	*ret;

	goin();
	fresetvect( FINDSEMAPHOREV );
	ret=FindSemaphore( name );
	fsetvect( FINDSEMAPHOREV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "FindSemaphore");
		if( VERBOSE )
			prints( "SemaphoreName: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/*****   Nuova routine AddSemaphore   *****/
void __saveds __asm newaddsemaphore( register __a0 struct SignalSemaphore *ss )
{
	goin();
	fresetvect( ADDSEMAPHOREV );
	AddSemaphore( ss );
	fsetvect( ADDSEMAPHOREV );
	if( canoutput() && (EVERYTIME) )
		{
		initout( "AddSemaphore");
		if( VERBOSE )
			prints( "SignalSemaphore: " );
		printh( (ULONG)ss );
		printpname( ss->ss_Link.ln_Name );
		endout();
		}
	goout();
	return;
}


/*****   Nuova routine FindName   ****/
struct Node * __saveds __asm newfindname( register __a0 struct List *list, register __a1 char *name )
{
	struct	Node	*ret;

	goin();
	fresetvect( FINDNAMEV );
	ret=FindName( list, name );
	fsetvect( FINDNAMEV );
	if( canoutput() && (EVERYTIME || ret==NULL) )
		{
		initout( "FindName" );
		if( VERBOSE )
			prints( "Name: " );
		printname( name );
		if( VERBOSE )
			{
			newline();
			prints( "List: " );
			printh( (ULONG)list );		/*   Occorre stampare type   */
			newline();
			prints( returntext );
			printh( (ULONG)ret );
			}
		endout();
		}
	goout();
	return( ret );
}


/**********   Fine delle nuove routines  **********/
