diorand:
	proc options(main);
	/* random access tests for 2.0 and 2.2 */

%include 'diomod.dcl';

	dcl
		1 database,
%include 'fcb.dcl';

	dcl
		lower char(26) static initial
		('abcdefghijklmnopqrstuvwxyz'),
		upper char(26) static initial
		('ABCDEFGHIJKLMNOPQRSTUVWXYZ');

	dcl
		/* simple variables */
		i        fixed,
		fn       char(20),
		c        char(1),
		code     fixed(7),
		mode     fixed(2),
		zerofill bit(1),
		version  bit(16);

	dcl
		/* overlays on default buffer */
		bitbuf (128) bit(8)  based(dbuff()),
		buffer char(127) var based(dbuff());

	put skip list('Random Access Test');
	/* check version number for 2.0 */
	version = vers();
	if substr(version,9,8) < '20'b4 then
		do;
		put skip list('You Need Version 2');
		stop;
		end;
	put skip list('Zero Record Fill?');
	get list(c);
	zerofill = (c = 'Y' ! c = 'y') &
		substr(version,9,8) >= '22'b4;

	/* read and process file name */
	put skip list('Data Base Name: ');
	get list(fn);
	fn = translate(fn,upper,lower);

	/* process optional drive prefix */
	i = index(fn,':');
	if i = 0 then
		drive = 0;
	else
	if i = 2 then
		do;
		/* convert character to drive code */
		drive = index(upper,substr(fn,1,1));
		if drive = 0 ! drive > 16 then
			do;
			put skip list('Bad Drive Name');
			stop;
			end;
		fn = substr(fn,i+1);
		end;

	/* get file name and optional type */
	i = index(fn,'.');
	if i = 0 then
		do;
		/* no file type specified, use .DAT */
		fname = fn;
		ftype = 'DAT';
		end;
	else
		do;
		fname = substr(fn,1,i-1);
		ftype = substr(fn,i+1);
		end;

	/* clear the extent field */
	fext = 0;

	if open(addr(database)) = -1 then
		do;
		put skip list('Creating New Database');
		if make(addr(database)) = -1 then
			do;
			put skip list('No Directory Space');
			stop;
			end;
		end;
	else
		do;
		call filsiz(addr(database));
		put skip list('File Size:',rrec,' Records');
		end;

	/* main processing loop */
		do while('1'b);
		call setrec(addr(database));
		put skip list('Current Record',rrec);
		put skip list('Read(0),Write(1),Quit(2)? ');
		get list(mode);
		if mode < 2 then
			do;
			put skip list('Record Number? ');
			get list(rrec);
			rovf = 0;
			end;
		if mode = 0 then
			do;
			code = rdran(addr(database));
			if code = 0 then
				do;
				if bitbuf(1) = '00'b4 then
					put skip list('Zero Record');
				else
					put skip list(buffer);
				end;
			else
				put skip list('Return Code',code);
			end;
		else
		if mode = 1 then
			do;
			put skip list('Data: ');
			get list(buffer);
			if zerofill then
				code = wrranz(addr(database));
			else
				code = wrran (addr(database));
			if code ^= 0 then
				put skip list('Return Code',code);
			end;
		else
		if mode = 2 then
			do;
			if close(addr(database)) = -1 then
				put skip list('Read/Only');
			stop;
			end;
		end;
	end diorand;
