[comp.sys.mac] SFGetFile problem. Help!

earleh@dartvax.UUCP (Sparafucile) (05/04/87)

The following code example works fine with 128k ROMs in my 512KE, but
causes a 64k ROM 512 at work to die.  I am calling SFGetFile with the
usual parameters, including a file filter which I have written in 68000
assembly language (MDS).  The calling language is C, but I have had the
same problem when calling SFGetFile from MDS.  On the 128k ROM machine,
the filter does exactly what I want, in fact I have used this filter for
months in various programs with no ill effect.  On the 64k ROM machine I
get a bomb box with ID #02 indicated every time.  Why?  This is the only
64k ROM machine I have access to.  Is it perhaps broken?

All of my globals used in the filter routine are aligned on long
boundaries, as are all of my stack frame offsets.  "#filtervars" is 240.
Just what is going on here?

xgetfile (reply)
char reply[];
{
	Point where;
	SFReply frommac;
	extern setthebutton();

	where.v = 80;
	where.h = 80;
	buttonset = 1;
	SFGetFile (where, 0L, setthebutton, 1, mytypelist, 0L, &frommac);
	if (frommac.good) {
		_iovrefnum = frommac.vRefNum;
		PtoCstr(frommac.fName);
	  	strcpy(reply,frommac.fName);
 	  return (TRUE);
	}
	else return (FALSE);
}

	xdef	setthebutton
	.ALIGN 4
setthebutton:	;This is not a file filter.  It is just a procedure to
		;change the title of the SFGetFile box's open button.
		;Why do I want to do it this way?  Simple, I don't want to use
		;a special dialog box or template, but I would like the title
		;in the open button to reflect the consequences of pressing it.
		;Calling sequence is to set the global variable message
		;to point to some meaningful Pascal string, such as "View",
		;then call SFGetFile with setthebutton as the filterproc.
	tst.w	buttonset(a5)		;do we need to do this?
					;buttonset is a word "ds.w 1" elsewhere
	beq	filterdone		;no, done
	link	a6,#filtervars		;yes, get a stack frame
	pea	saveport(a6)		;push saveport address
	_GetPort			;get a handle to SFGetFile box port
	push.l	saveport(a6)		;push the port
	push.w	#1			;item #1, the Open button
	pea	thetype(a6)		;address of item type
	pea	itemhandle(a6)		;address of item handle (I want this)
	pea	thebox(a6)		;address of item's rect
	_GetDItem			;get the item
	push.l	itemhandle(a6)		;push the item handle
	move.l	message(a5),-(sp)	;slip in our message
					;message points to a Pascal string
	_SetCTitle			;set it
	clr.w	buttonset(a5)		;don't need to do it again
	unlk	a6
filterdone:
	move.w	#0,8(sp)		;display OK
	move.l	(sp)+,(sp)		;move return -> parameter
	rts				;exit