! ISMBG2.BAS --- demonstrate bizarre bug in ISAM function 1
! This problem occurs on AMOS 2.2C(452)-9 using ISAM.LIT
! This program compiles with /M.  Use in conjunction with ISMBG2.CMD
! Bob Fowler, Applied Systems Research, 1994-Oct-19

! THE PROBLEM:
! AlphaBASIC ISAM calls using X format variables generally work ok.
! The ISAM routines in SYSSTD,ISMSYM,ISMSBR,ERRSBR operate this way.
! If a string variable is passed, however, the calls will often fail.
! In particular, "ISAM #chan,1,string" (find key) may return an ERF
! error code 33 (key not found) when in fact the key actually exists.

! The program below demonstrates circumstances in which this occurs.
! The size of a displayed string effects the fate of the ISAM call,
! even though the display has absolutely nothing to do with the call.
! If a string of 6 characters is displayed, no problem occurs.
! If a string of 7 characters is displayed, the problem occurs, but
! a subsequent call with 6 characters displayed will cure the problem.
! If a string of 8 characters is displayed, the problem occurs, and
! will not go away until the program is exited and rerun.

! To demonstrate problem:
!   (1) execute ISMBG2.CMD first
!   (2) RUN ISMBG2.RUN to add new key and exit
!   (3) RUN ISMBG2.RUN again to demonstrate problem

	MAP1 KeyX,X,15
	MAP1 KeyS,S,15		! increasing to 16 or 64 does not help
	MAP1 KeyS1,@KeyS
		MAP2 KeyS2,X,15
	MAP1 Option,S,1
	MAP1 I,F,6
	MAP1 Length,F,6
	MAP1 RELKEY,F,6
	MAP1 Buffer,S,100

	OPEN #1000, "ISMBG2", INDEXED, 256, RELKEY

GetOpt:
	Option = "E"
	INPUT "Enter E(nd) A(dd) S(tring) X(unformatted): ", Option
	IF Option = "E" THEN END
	IF Option = "A" THEN GOTO Add
	IF Option = "S" THEN GOTO Try
	IF Option = "X" THEN GOTO Try
	GOTO GetOpt

Add:
	KeyS = "ABCDE" : Buffer = KeyS
	KeyX = KeyS			! make sure that add works
	ISAM #1000, 1, KeyX
	IF ERF(1000) = 0 THEN PRINT "Record exists" : GOTO AddEnd
	IF ERF(1000) # 33 THEN PRINT "ERF"; ERF(1000) : END
	PRINT "ADDING KEY"
	ISAM #1000, 5, KeyX
	WRITEL #1000, Buffer
	ISAM #1000, 3, KeyX
AddEnd:
	UNLOKR #1000
! adding record causes problem to occur permanently
	GOTO GetOpt

Try:
	INPUT "Length of dummy string  (6,7,8): ", Length
! printing 6/7/8 x's causes no/temporary/permanent problem - bizarre!!!
	IF Length = 6 THEN PRINT "xxxxxx"
	IF Length = 7 THEN PRINT "xxxxxxx"
	IF Length = 8 THEN PRINT "xxxxxxxx"
NxtTry:
!	KeyS = ""			! does NOT fix problem
	KeyS = "ABCDE"			! key exists in file
	KeyX = KeyS			! doesn't cause problem
	IF Option = "S" THEN ISAM #1000, 1, KeyS	! gets
	IF Option = "X" THEN ISAM #1000, 1, KeyX	! always ok
! printing following causes problem to occur permanently
!	FOR I = 1 TO 15 : PRINT ASC(KeyS2[I,I]); : NEXT I : PRINT
! the problem: following prints a phoney error 33 (record not found)
	PRINT "Error"; ERF(1000)
	UNLOKR #1000
	GOTO GetOpt