;
;	File:		DataAccessResultsHandlers.a
;
;	Contains:	Entry point for 'proc' resource containing default system result handlers.
;				Dispatches to appropriate routine based on dataType.  Stored in a 'proc'
;				resource so it is never unlocked or purged.
;
;	Written by:	Jeff Miller
;
;	Copyright:	© 1990-1992 by Apple Computer, Inc., all rights reserved.
;
;	Change History (most recent first):
;
;		<12>	 3/13/92	JSM		Renamed this file DataAccessResultsHandlers.a from
;									SnarfResultsHandlers.a, keeping all the old revisions.
;		<11>	  3/4/91	dba		dty: get rid of extraneous forROM and SysVers stuff and turn off
;									debugging symbols
;		<10>	12/12/90	VL		(jsm) Put in a check for NULL data item and nil data pointer.
;		 <9>	 8/27/90	VL		Check typeDecimal and typeMoney before zero length test (since a
;									zero length in Packed Decimal String is identically equal to 0).
;		 <8>	 7/22/90	JSM		Call zeroLengthHandler for null data (except row breaks, column
;									breaks, and unknown data types).
;		 <7>	 6/10/90	JSM		Just touch this file so SnarfMan.a.rsrc is rebuilt correctly.
;		 <6>	 4/12/90	JSM		Combined some routines, thus eliminating more JMP instructions.
;		 <5>	 4/12/90	JSM		Reduce code size:  eliminated two JMP instructions.
;		 <4>	  4/9/90	VL		Added 5 new ResultHandlers.
;		 <3>	 3/13/90	JSM		Update for new result handler interface to include places and
;									flags.
;		 <2>	 3/12/90	JSM		Update header comment to reflect reality.
;		 <1>	 2/23/90	JSM		First checked in.
;

				TITLE		'DataAccessResultsHandlers.a'
				STRING		ASIS
				CASE		OBJ

;
; Define DataAccessDebug to get MacsBug labels
;

;	IF &TYPE('DataAccessDebug')='UNDEFINED' THEN
DataAccessDebug		EQU			0
;	ENDIF

; Includes

				PRINT		OFF

				LOAD		'StandardEqu.d'
				INCLUDE 	'DatabaseAccess.a'

				PRINT		ON

;
; Macro to put in debug symbols for MacsBug
;
				IF DataAccessDebug THEN
				MACRO
				DoDebugSymbols &name
				DC.B	$80 + &LEN(&name), '&name'
				DC.W	$0000
				ENDM
				ENDIF

;===============================================================================
;
;	FUNCTION	DataAccessHandler(dataType : DBType; theLen : INTEGER; thePlaces :
;								INTEGER; theFlags : INTEGER; theData : Ptr;
;								theText : Handle) : OSErr;
;
;	Common entry point for all default system result handlers.  Branches to
;	appropriate routine.
;
;===============================================================================

DataAccessHandler	PROC	EXPORT

;
; record corresponding to the stack on entry
;
myStack			RECORD		0
ReturnAddr		DS.L		1
theText			DS.L		1
theData			DS.L		1
theFlags		DS.W		1
thePlaces		DS.W		1
theLen			DS.W		1
dataType		DS.L		1
theOSErr		DS.W		1
				ENDR

				CASE		OFF						; following are Pascal routines

				IMPORT		typeBooleanHandler
				IMPORT		typeIntegerHandler
				IMPORT		typeFloatHandler
				IMPORT		typeCharHandler
				IMPORT		typeUnknownHandler
				IMPORT		typeColBreakHandler
				IMPORT		typeRowBreakHandler
				IMPORT		typeTimeHandler
				IMPORT		typeDateHandler
				IMPORT		typeTimeStampHandler
				IMPORT		typeMoneyDecimalHandler
				IMPORT		zeroLengthHandler
				IMPORT		nilPtrHandler			;											<10>

				WITH		myStack
				MOVE.L		dataType(A7),D0			; D0 = dataType
				ENDWITH

				; check for the most common data types first

				CMP.L		#typeColBreak,D0		; column break?
				BNE.S		@1						; no
				JMP			typeColBreakHandler		; yes
@1
				CMP.L		#typeRowBreak,D0		; row break?
				BNE.S		@2						; no
				JMP			typeRowBreakHandler		; yes
@2
				CMP.L		#typeUnknown,D0			; unknown type?
				BNE.S		@3						; no
				JMP			typeUnknownHandler		; yes
@3
				WITH		myStack					;											<10>
				MOVE.W		theFlags(A7),D1			; get flags									<10>
				AND.W		#kDBNullFlag,D1			; is it a null item?						<10>
				BEQ.S		@notNull				;											<10>
				JMP			zeroLengthHandler		; yes => return noErr						<10>
@notNull											; no => get the data type and continue on	<10>
				TST.L		theData(A7)				; is it a nil pointer?						<10>
				ENDWITH								;											<10>
				BNE.S		@notNilPtr				;											<10>
				JMP			nilPtrHandler			; yes => return an error					<10>
@notNilPtr											; no => continue on							<10>
				CMP.L		#typeDecimal,D0			; decimal?
				BEQ.S		@4						; yes
				CMP.L		#typeMoney,D0			; money?
				BNE.S		@checkZero				; no
@4
				JMP			typeMoneyDecimalHandler	; used for both typeDecimal and typeMoney

				; check for zero length
@checkZero
				WITH		myStack
				TST.W		theLen(A7)				; is length 0?
				BNE.S		@5						; no, try rest of data types
				JMP			zeroLengthHandler		; yes, just return noErr
				ENDWITH

				; now try other data types
@5
				CMP.L		#typeVChar,D0			; variable length character string?
				BEQ.S		@6						; yes
				CMP.L		#typeChar,D0			; character?
				BNE.S		@7						; no
@6
				JMP			typeCharHandler			; used for both typeVChar and typeChar
@7
				CMP.L		#typeBoolean,D0			; Boolean?
				BNE.S		@8						; no
				JMP			typeBooleanHandler		; yes
@8
				CMP.L		#typeSMInt,D0			; small integer?
				BEQ.S		@9						; yes
				CMP.L		#typeInteger,D0			; integer?
				BNE.S		@10						; no
@9
				JMP			typeIntegerHandler		; used for both typeSMInt and typeInteger
@10
				CMP.L		#typeSMFloat,D0			; small float?
				BEQ.S		@11						; yes
				CMP.L		#typeFloat,D0			; float?
				BNE.S		@12						; no
@11
				JMP			typeFloatHandler		; used for both typeSMFloat and typeFloat
@12
				CMP.L		#typeTime,D0			; time?
				BNE.S		@13						; no
				JMP			typeTimeHandler			; yes
@13
				CMP.L		#typeDate,D0			; date?
				BNE.S		@14						; no
				JMP			typeDateHandler			; yes
@14
				CMP.L		#typeTimeStamp,D0		; TimeStamp?
				BNE.S		@15						; no
				JMP			typeTimeStampHandler	; yes
@15
				JMP			typeUnknownHandler		; default is unknown

				IF DataAccessDebug THEN
				DoDebugSymbols	DataAccessHandler	; label for MacsBug
				ENDIF

				ENDPROC								; end of DataAccessHandler

				END