Data Entry Routines #

General Information

Author: Paul B. Loux
Language: ACTION!
Compiler/Interpreter: ACTION!
Published: 1986

Description: Universal string input routine, offering full control over keyboard input and screen display. Allows program to limit responses to acceptable parameters.

Calling parameters:

FIELD The field buffer.
MIN Minimum number of characters for valid response, 0-MAX.
MAX Maximum number of characters, 1-36.
TYPEC Type Code (see below)
XIT Exit record if the first character in FIELD is ESC.
COL Screen display horizontal position for input echo, 2-37.
ROW Screen display vertical position for input echo, 1-22.
ERRPTR Pointer variable to pass error code on record aborts (Ctrl-Z) or XIT's (above).

Note: User entry of ESC will restart field entry, or exit (see above). Entry of Ctrl-Z aborts record. The routine uses the BYTE FUNC Fetch() to obtain the keystokes, allowing timeout control.

(Note: no range check is provided on the numeric response)

Type Codes

code type
1 Alphanumeric
2 Force Upper Case
3 Signed integer
4 Signed real (float)
5 Unsigned integer
6 Unsigned real
7 Yes/No check

EntryS#

;************************************
;*											 *
;*(C)Copyright 1986 by Paul B. Loux *
;*											 *
;* These routines are in the public *
;* domain,  and  are not to be sold *
;* for a profit. They may be freely *
;* distributed, provided  that this *
;* header remains in place. Use and *
;* enjoy! PBL, CIS 72337,2073.		*
;*											 *
;************************************
;*											 *
;*  File "ENTRYS.LIB"					*
;*											 *
;*  Description: Universal string	*
;*	 input routine, offering full  *
;*	 control over keyboard input	*
;*	 and screen display.  Allows	*
;*	 program to limit responses	 *
;*	 to acceptable parameters.	  *
;*											 *
;*  Calling parameters:				 *
;*											 *
;*	 FIELD	The field buffer.	  *
;*											 *
;*	 MIN	  Minimum number of	  *
;*				characters for		  *
;*				valid response, 0-MAX.*
;*											 *
;*	 MAX	  Maximum number of	  *
;*				characters, 1-36.	  *
;*											 *
;*	 TYPEC	Type Code:				*
;*				1 Alphanumeric		  *
;*				2 Force Upper Case	 *
;*				3 Signed integer		*
;*				4 Signed real (float) *
;*				5 Unsigned integer	 *
;*				6 Unsigned real		 *
;*				7 Yes/No check		  *
;*				(Note: no range check *
;*				is provided on the	 *
;*				numeric response)	  *
;*											 *
;*	 XIT	  Exit record if the	 *
;*				first character in	 *
;*				FIELD is ESC.			*
;*											 *
;*	 COL	  Screen display		  *
;*				horizontal position	*
;*				for input echo, 2-37. *
;*											 *
;*	 ROW	  Screen display		  *
;*				vertical position	  *
;*				for input echo, 1-22. *
;*											 *
;*	 ERRPTR  Pointer variable to	*
;*				pass error code on	 *
;*				record aborts (Ctrl-Z)*
;*				or XIT's (above).	  *
;*											 *
;*	 Note:	User entry of ESC will*
;*				restart field entry,  *
;*				or exit (see above).  *
;*				Entry of Ctrl-Z aborts*
;*				record. The routine	*
;*				uses the BYTE FUNC	 *
;*				Fetch() to obtain the *
;*				keystokes, allowing	*
;*				timeout control.		*
;*											 *
;************************************
;
;	Atari OS Variables for sound
;	control and PROC Sound_reset.
;
MODULE

BYTE AudCtl=$D208, SKCtl=$D20F,
	  AudC1 =$D201, AudC2=$D203,
	  AudC3 =$D205, AudC4=$D207

PROC Sound_reset()


AudCtl=0 SKCtl=3
AudC1 =0 AudC2=0 AudC3=0 AudC4=0

RETURN
;
;************************************
;
;	BYTE FUNC FetchD
;	  (BYTE ioch,Time_out)
;					
;	This function is an enhancement
;	to the library  routine GetD().
;	Basically it is a GetD() with a
;	timeout spec.  The routine uses
;	the Atari System Timer 4, whose
;	counter is located at $21E,$21F
;	and  whose zero-flag is located
;	at $22C. Normally, the function
;	RETURNs the  same ATASCII  code
;	that a  GetD() would.  However,
;	if no key is pressed  prior  to
;	time-out, the function RETURNs
;	an ATASCII value of 255. Should
;	a user actually try to  enter a
;	character-255, the key sequence
;	is ignored.
;
;	Through use of the  OS variable 
;	POKMSK, FetchD()  disables  the
;	Break key upon each call.
;
;	The value in the  BYTE Time_Out
;	represents  the  time limit  in
;	seconds. A value of zero  means
;	that there  is  no time  limit. 
;	The maximum value for Time_out,
;	255,  represents 4 minutes  and
;	fifteen seconds.  If  more time
;	is required,  try using a short
;	Time_out but use a loop to make
;	the call to FetchD(), or modify
;	the routine to use a CARD.
;
;	The  BYTE ioch  represents  the
;	IOCB  channel from  which input 
;	is to be obtained. The  routine
;	assumes the channel has already
;	been opened for input from K:. 
;	
;

BYTE FUNC FetchD(BYTE ioch,Time_Out)

BYTE POKMSK=$10		 ; IRQ nabl bits
CARD CDTMV3=$21E		; timer 4 value
BYTE CDTMF3=$22C		; timer 4 flag
BYTE CH=$2FC			 ; key pressed
BYTE IRQEN=$D20E		; Pokey IRQ

CARD jiffies
BYTE response

POKMSK==&127			 ; disable Break
IRQEN==&127			  

jiffies=Time_Out*60
CH=255
CDTMF3=255
CDTMV3=jiffies

DO
 IF CH#255 THEN
  response=GETD(ioch)
  IF response#255 THEN
	RETURN(response)
  FI
 FI
UNTIL CDTMF3=0
OD

;POKMSK==%128			; uncomment to
;IRQEN==%128			 ; restore BRKKEY

RETURN(255)
;
;************************************
;
;	This routine places a message
;	at the bottom  of the screen.
;

PROC MSG(BYTE code)

BYTE ARRAY mesag
CARD ARRAY index(10)
CARD ctr
 
BYTE ROWCRS=$54,row
CARD COLCRS=$55,col

index(0)="											  "
index(1)="Too short-- continue"
index(2)="Too long-- press RETURN or Edit"
index(3)="Record aborted-- press ESC to clear"
index(4)="Numeric input only-- continue"
index(5)="Positive numbers only-- continue"
index(6)="Integers only-- continue"
index(7)="Value out of range-- press ESC"		
index(8)="Invalid date-- press ESC"
index(9)="PROGRAM ERROR-- press ESC to bypass"


IF code>9 THEN code=9 FI
mesag=index(code)

IF code>0 THEN Sound_reset()
					SOUND(0,20,10,10)
					FOR ctr=1 TO 2000
					  DO
						;
					  OD
					Sound_reset()
FI

row=ROWCRS
col=COLCRS

POSITION(1,23)
PUT(156)		 ; delete line
PRINT(mesag)

IF code=9 THEN
  PUT(253)
FI

IF code=3 OR code=7 OR
	code=8 OR code=9 THEN
  DO
	ctr=FETCHD(7,10)		 ; 10 second
  UNTIL ctr=27 OR ctr=255 ; timeout
  OD
FI

COLCRS=col+1
ROWCRS=row
PUT(30)

RETURN

;************************************
;
;  This is the actual Entry routine.
;

PROC ENTRYS (BYTE ARRAY field
				 BYTE min,max,typec,xit,
				 col,row
				 BYTE POINTER errptr)

BYTE dotflg,code,ctr,chr,intrpt,accept

BYTE ROWCRS=$54
CARD COLCRS=$55

DEFINE FILLCHR="46"	  ; "."

BYTE INVFLG=$2B6
BYTE SHFLOK=$2BE
BYTE SHFTMP

IF col+max> 38 OR row>22 OR col<2
  OR max<min OR max<1 THEN
  MSG(9)
  RETURN
FI

SHFTMP=SHFLOK
SHFLOK=0
INVFLG=0
dotflg=0

MSG(0)
			
COLCRS=col
ROWCRS=row
FOR ctr=1 TO max DO PUT(FILLCHR)
						  field(ctr)=32
					  OD
field(0)=max				; needed?
col==+1
ctr=0

DO
	 accept=0
	 intrpt=0
	 COLCRS=col+ctr
	 ROWCRS=row
	 PUT(30)
	 ctr==+1

 DO
	 chr=FETCHD(7,30)	 ; 30 second
								; timeout

	 IF chr=255 THEN	  ; timeout
			errptr^=3
			intrpt=1
			EXIT

	 ELSEIF chr=155 THEN ; RETURN
			IF ctr<=min THEN
				  MSG(1)
			ELSE intrpt=1
				  EXIT
			FI

	 ELSEIF chr=126 THEN ; BS
			IF ctr>1 THEN
			  ctr==-1
			  IF (typec=5 OR typec=6) 
				AND field(ctr)=46
				THEN dotflg=0
			  FI
			  field(ctr)=32
			  PUT(30)
			  PUT(FILLCHR)
			  PUT(30)
			  MSG(0)
			FI

	 ELSEIF chr=26 THEN  ; Ctrl-Z
			FOR ctr=1 TO max
			 DO
			  field(ctr)=32
			 OD
			ctr=0
			MSG(3)
			errptr^=2
			intrpt=1
			EXIT

	 ELSEIF chr=27 THEN  ; ESC
			IF ctr>1 THEN
			 COLCRS=col-1
			 ROWCRS=row
			 FOR ctr=1 TO max
			  DO
				PUT(FILLCHR)
				field(ctr)=32
			  OD
			 ctr=1
			 dotflg=0
			 COLCRS=col
			 ROWCRS=row
			 PUT(30)
			ELSE
			 IF xit=1 THEN
			  errptr^=1
			  intrpt=1
			  EXIT
			 FI
			FI

	 ELSEIF ctr>max THEN
			MSG(2)

	 ELSEIF (chr<32
			OR chr>122
			OR chr=96)	  ; Goofy Keys
			THEN SHFLOK=0
				  INVFLG=0

	 ELSEIF typec=7 THEN ;yes/no
			IF chr=110 OR  ;'n
				chr=121 THEN;'y
			 chr==-32
			FI
			IF chr=89  OR  ;'Y
				chr=78  THEN;'N
			 accept=1
			FI
	 
	 ELSEIF typec=2 THEN ; FORCE UC
			IF chr>96 AND chr<123 THEN
			 chr==-32
			FI
			accept=1

	 ELSEIF chr=45 THEN  ; "-"
			code=4
			IF ctr=1 THEN code=5 FI
			IF typec>4 THEN
			 MSG(code)
			ELSEIF typec>2 THEN
			 IF ctr>1 THEN
			  MSG(4)
			 ELSE accept=1
			 FI
			ELSE accept=1
			FI

	 ELSEIF chr=46 THEN  ; "."
			IF typec=4 OR typec=6 THEN
			 IF dotflg=0 THEN
			  dotflg=1
			  accept=1
			 ELSE MSG(4)
			 FI
			ELSEIF typec=3
			 OR typec=5 THEN
			 MSG(6)
			ELSE accept=1
			FI

	 ELSEIF typec>2 THEN ; digits only
			IF chr<48 OR chr>57 THEN
			 MSG(4)
			ELSE accept=1
			FI

	 ELSE accept=1

	 FI

  UNTIL accept

 OD

 IF intrpt=1 THEN
	IF chr=155 THEN	  ; RTN
	 MSG(0)
	 COLCRS=col-1
	 ROWCRS=row
	 field(0)=ctr-1
	 PRINT(field)
	 errptr^=0
	FI
	EXIT					 ; ESC,^Z,time
 ELSE PUT(chr)			; accept chr
		field(ctr)=chr
		MSG(0)
 FI

OD

SHFLOK=SHFTMP

RETURN

MODULE					  ; continue

;
;************************************
;
; END OF FILE.
;
;************************************

;************************************
; 
; Example of usage of EntryS().

PROC Test()

BYTE x,y,min,max,typec,xit

BYTE ARRAY  name="xxxxxxxxxxxxxxx",
			  id_no="xxxx",	
			  state="xx",
			  price="xxxxxxxx"

BYTE errcde
BYTE POINTER errptr 

errcde=0
errptr=@errcde

PUT(125)
POSITION(5,5)
PRINT("Enter Full Name: ")
x=22  y=5  min=0  max=15 
typec=1 xit=1

EntryS(name,min,max,typec,
		 xit,x,y,errptr)

POSITION(5,7)
PRINT("Enter I.D. Number: ")
x=24  y=7  min=4  max=4 
typec=5 xit=0

EntryS(id_no,min,max,typec,
		 xit,x,y,errptr)

POSITION(5,9)
PRINT("Enter State: ")
x=18  y=9  min=2  max=2
typec=2	  

EntryS(state,min,max,typec,
		 xit,x,y,errptr)

POSITION(5,11)
PRINT("Enter Price: ")
x=18  y=11  min=0  max=8
typec=6	  

EntryS(price,min,max,typec,
		 xit,x,y,errptr)

POSITION(5,14)
PUTE()
PRINTE(name)
PRINTE(id_no)
PRINTE(state)
PRINTE(price)
 
PUTE()
PRINTE("Done...") 

RETURN


EntryYN#

;************************************
;*											 *
;*(C)Copyright 1986 by Paul B. Loux *
;*											 *
;* These routines are in the public *
;* domain,  and  are not to be sold *
;* for a profit. They may be freely *
;* distributed, provided  that this *
;* header remains in place. Use and *
;* enjoy! PBL, CIS 72337,2073.		*
;*											 *
;************************************
;
;	  File ENTRYYN.ACT
;
;	  BYTE FUNC EntryYN()
;
;	  Returns  either  one or zero
;	  (true/false), representing a
;	  one-character (Y or N)  user
;	  response to yes/no questions
;	  (uses EntryS(),the universal
;	  string entry utility, to get
;	  the keystroke).	
;
;	  The routine supports typical
;	  EntryS() features, including
;	  screen  coordinates supplied
;	  by the calling routine; pass
;	  through  of error codes, for
;	  ESC and Ctrl-Z handling; and
;	  timeouts. This  routine also
;	  allows a default value for a
;	  null-response (if desired).
;
;  Parameters:
;
;	  col=screen echo horiz column
;	  row=screen echo vert column
;
;	  default= 0 for null="N"
;				  1 for null="Y"
;				  2 to disallow null
;
;	  err_ptr= pointer to pass err
;				  to calling routine.
;
;************************************
;			 
	INCLUDE "ENTRYS.ACT"
;			 
;************************************
;			 
;
BYTE FUNC Ask_YN(BYTE col,row,default
					 BYTE POINTER err_ptr)

DEFINE max  ="1",
		 typec="7",
		 xit  ="0"

BYTE response,min		 
BYTE ARRAY field="x"

IF default=2 THEN 
 min=1
ELSE
 min=0
FI

DO

ENTRYS(field,min,max,typec,xit,	 
		 col,row,err_ptr)

IF err_ptr^#0 THEN RETURN(0) FI

IF field(0)=0 THEN		 ; null entry
  IF default=0 THEN
	 PUT('N)
  ELSE
	 PUT('Y)
  FI
  RETURN(default)
FI

response=field(1)

IF response=89 THEN		; 'Y
 RETURN(1)
ELSEIF response=78 THEN  ; 'N
 RETURN(0)
FI

OD

RETURN(0)
;
;
;************************************
;
; Example of usage:

PROC Test8()

BYTE answer
BYTE x,y,default
BYTE errcde
BYTE POINTER err_ptr

errcde=0
err_ptr=@errcde

x=33  y=5
default=0

PUT(125)
POSITION(1,5)
PRINT("Do you own a computer (Y/[N]): ")
answer=Ask_YN(x,y,default,err_ptr)
POSITION(1,7)

IF answer THEN
  x=26  y=7
  default=1
  PRINT("Is it an Atari ([Y]/N): ")
  answer=Ask_YN(x,y,default,err_ptr)
  POSITION(1,9)

  IF answer THEN
	 x=17 y=9
	 default=2
	 PRINT("Is it an 8-bit?	  (Y/N)")
	 answer=Ask_YN(x,y,default,err_ptr)
	 POSITION(1,11)
 
	 IF answer THEN
		PRINT("Congratulations.")		
	 ELSE
		x=9  y=11
		default=0
		PRINT("520 ST?	(Y/[N])")
		answer=Ask_YN(x,y,default,err_ptr)
		POSITION(1,13)
 
		IF answer THEN 
		  PRINT("Congratulations.")
		ELSE
		  PRINTE("Must be a 1040 ST then.")
		FI
	 FI
  ELSE
	 PRINTE("Too bad.")
  FI

ElSE
  x=32  y=7
  default=1

  POSITION(1,7)
  PRINTE("Too bad.")
FI 

RETURN

EntryI#

;************************************
;*											 *
;*(C)Copyright 1986 by Paul B. Loux *
;*											 *
;* These routines are in the public *
;* domain,  and  are not to be sold *
;* for a profit. They may be freely *
;* distributed, provided  that this *
;* header remains in place. Use and *
;* enjoy! PBL, CIS 72337,2073.		*
;*											 *
;************************************
;
;  CARD FUNC EntryI()
;
;  Universal integer-entry routine,
;  requires PROC EntryS(), the
;  universal string entry routine.
;  Includes range check, a null-
;  entry ok flag, and uses the
;  the same XIT flag as ENTRYS.
;
;  This routine takes input from
;  K: in string form (through
;  EntryS) and checks for legal
;  value (<=65535) and other useful
;  features before converting to
;  an actual INT value.
;
;  Use of EntryS allows the same
;  user interface (ESC and ^-Z
;  handling, timeouts, etc.)
;
;  Parameters are self-explanatory;
;  minval and maxval are the range
;  limits for acceptable response
;  (limted to +/-32767 of course);
;  the XIT and nullok flags are 1
;  for yes and 0 for no.
;
;************************************
;
 INCLUDE "ENTRYS.ACT"
;
;************************************

INT FUNC EntryI(BYTE col,row
					 INT minval,maxval
					 BYTE nullok,
					 xeq,xit
					 BYTE POINTER err_ptr)

BYTE ARRAY u_limit(0)="32767",
			  l_limit(0)="-32767",
			  field(0)="......" 
BYTE fldlen=field

BYTE accept,min,max,typec
INT chk,tmp
INT value,tmpval

CARD temp,minchk,maxchk,offset

min=0 
IF nullok=0 THEN
 IF minval<0 THEN
  temp=-minval
  min==+1
 ELSE
  temp=minval
 FI
 IF temp>0 THEN min==+1 FI
 IF temp>10 THEN min==+1 FI
 IF temp>100 THEN min==+1 FI
 IF temp>1000 THEN min==+1 FI
 IF temp>10000 THEN min==+1 FI
FI

max=1
IF maxval<0 THEN
 temp=-maxval
 max==+1
ELSE
 temp=maxval
FI
IF temp>0 THEN max==+1 FI
IF temp>10 THEN max==+1 FI
IF temp>100 THEN max==+1 FI
IF temp>1000 THEN max==+1 FI
IF temp>10000 THEN max==+1 FI

IF max<min THEN
 tmp=max
 max=min
 min=tmp
FI

typec=3					; signed int
accept=0
chk=0

DO
 ENTRYS(field,min,max,typec,xit,
		  col,row,err_ptr)
		 
 IF err_ptr^#0 THEN RETURN(0) FI
;calling routine does error handling

 IF fldlen=0 THEN
  field(1)='0
  field(0)=1
 FI

 IF fldlen=6 THEN
  chk=SCOMPARE(field,l_limit)
 ELSEIF fldlen=5 THEN
  IF field(1)#45 THEN  ;'-
	chk=SCOMPARE(field,u_limit)
  FI
 FI

 IF chk>0 THEN
  MSG(7)
 ELSE
  value=VALI(field)
  IF minval<0 THEN
	 offset=-minval
	 minchk=0
	 maxval==+offset
	 maxchk=maxval
	 tmpval=value
	 tmpval==+offset
	 IF tmpval<0 THEN
	  tmpval=maxval+1
	 FI
	 temp=tmpval
  ELSE
	 temp=value
	 maxchk=maxval
	 minchk=minval
  FI
  IF temp<minchk or temp>maxchk
	THEN MSG(7)
  ELSE accept=1
  FI
 FI

UNTIL accept
OD

RETURN(value)

;************************************
;
; Example of use of EntryC()

PROC Test4()

BYTE x,y,nullflg
INT min,max,value
BYTE errcde
BYTE POINTER err_ptr

errcde=0
err_ptr=@errcde

min=-20000
max=-1000

nullflg=0
x=19  y=7

PUT(125)
POSITION(5,5)
PUTE()
PRINTE("Enter a number between ")
PRINTI(min)
PRINT(" and ")
PRINTI(max)
PRINT(": ")

value=EntryI(x,y,min,max,nullflg,
				 0,0,err_ptr)

POSITION(5,17)
PUTE()
PRINTIE(value)
PRINTE("Done...")

RETURN

EntryC#

;************************************
;*											 *
;*(C)Copyright 1986 by Paul B. Loux *
;*											 *
;* These routines are in the public *
;* domain,  and  are not to be sold *
;* for a profit. They may be freely *
;* distributed, provided  that this *
;* header remains in place. Use and *
;* enjoy! PBL, CIS 72337,2073.		*
;*											 *
;************************************
;
;  CARD FUNC EntryC()
;
;  Universal card-entry routine,
;  requires PROC EntryS(), the
;  universal string entry routine.
;  Includes range check, execute
;  on first digit flag, a null-
;  entry ok flag, and uses the
;  the same XIT flag as ENTRYS.
;
;  This routine takes input from
;  K: in string form (through
;  EntryS) and checks for legal
;  value (<=65535) and other useful
;  features before converting to
;  an actual CARD value.
;
;  Includes range check, execute
;  on single digit flag, a null-
;  entry ok flag, and uses the
;  the same xit flag as EntryS.
;  Use of EntryS allows the same
;  user interface (ESC and ^-Z
;  handling, timeouts, etc.)
;
;  Parameters are self-explanatory;
;  minval and maxval are the range
;  limits for acceptable response
;  (limted to 0-65535 of course);
;  the XEQ, XIT and nullok flags
;  are 1 or yes and 0 for no.
;
;************************************
;
 INCLUDE "ENTRYS.ACT"
;
;************************************

CARD FUNC EntryC(BYTE col,row
					  CARD minval,maxval
					  BYTE nullok,
					  xeq,xit
					  BYTE POINTER err_ptr)

BYTE ARRAY limit(0)="65535",
			  field(0)="....." 
BYTE fldlen=field

BYTE accept,min,max,typec
CARD value
INT chk

min=1
IF minval>10 THEN min==+1 FI
IF minval>100 THEN min==+1 FI
IF minval>1000 THEN min==+1 FI
IF minval>10000 THEN min==+1 FI
IF nullok THEN
 min=0 
FI

IF maxval=0 THEN
 maxval=65535
 max=5
ELSE
 max=1
 IF maxval>10 THEN max==+1 FI
 IF maxval>100 THEN max==+1 FI
 IF maxval>1000 THEN max==+1 FI
 IF maxval>10000 THEN max==+1 FI
FI

typec=5					; pos int
accept=0
chk=0

DO
 ENTRYS(field,min,max,typec,xit,
		  col,row,err_ptr)
		 
 IF err_ptr^#0 THEN RETURN(0) FI
;Calling routine does error handling

 IF fldlen=0 THEN
  field(1)='0
  field(0)=1
 FI

 IF fldlen=5 THEN
  chk=SCOMPARE(field,limit)
 FI
 IF chk>0 THEN
  chk=0
  MSG(7)
 ELSE
  value=VALC(field)
  IF value<minval OR value>maxval
	THEN MSG(7)
  ELSE accept=1
  FI
 FI

UNTIL accept
OD

RETURN(value)

;************************************
;
; Example of use of EntryC()

PROC Test3()

BYTE x,y,nullflg
CARD min,max,value
BYTE errcde
BYTE POINTER err_ptr

errcde=0
err_ptr=@errcde

min=1000
max=2000

nullflg=0
x=17  y=7

PUT(125)
POSITION(5,5)
PUTE()
PRINTE("Enter a number between ")
PRINTC(min)
PRINT(" and ")
PRINTC(max)
PRINT(": ")

value=EntryC(x,y,min,max,nullflg,
				 0,0,err_ptr)

POSITION(5,10)
PUTE()
PRINTCE(value)
PRINTE("Done...")

RETURN


EntryB#

;************************************
;*											 *
;*(C)Copyright 1986 by Paul B. Loux *
;*											 *
;* These routines are in the public *
;* domain,  and  are not to be sold *
;* for a profit. They may be freely *
;* distributed, provided  that this *
;* header remains in place. Use and *
;* enjoy! PBL, CIS 72337,2073.		*
;*											 *
;************************************
;
;  FILE BYTE FUNC EntryB()
;
;  Universal byte-entry routine,
;  requires PROC EntryS, the
;  universal string entry routine.
;  This routine takes input from
;  K: in string form (through
;  EntryS) and checks for legal
;  value (<=255) and other useful
;  features before converting to
;  an actual BYTE value.
;
;  Includes range check, execute
;  on single digit flag, a null-
;  entry ok flag, and uses the
;  the same xit flag as EntryS.
;  Use of EntryS allows the same
;  user interface (ESC and ^-Z
;  handling, timeouts, etc.)
;
;  Parameters are self-explanatory;
;  minval and maxval are the range
;  limits for acceptable response
;  (limted to 0-255 of course); the
;  XEQ, XIT and nullok flags are
;  1 or yes and 0 for no.
;
;************************************
;
 INCLUDE "ENTRYS.ACT"
;
;************************************

BYTE FUNC EntryB(BYTE col,row,minval,
					 maxval,nullok,xeq,xit
					 BYTE POINTER err_ptr)

BYTE ARRAY limit(0)="255",
			  field(0)="..."
BYTE fldlen=field

BYTE accept,min,max,
	  typec,value

INT chk

min=0
IF minval>0 THEN min==+1 FI
IF minval>10 THEN min==+1 FI
IF minval>100 THEN min==+1 FI
IF nullok THEN
 min=0 
FI

IF maxval=0 THEN
 maxval=255
 max=3
ELSE
 max=0
IF maxval>0 THEN max==+1 FI
IF maxval>10 THEN max==+1 FI
IF maxval>100 THEN max==+1 FI
FI

typec=5					; pos int
accept=0
chk=0

DO
 ENTRYS(field,min,max,typec,xit,
		  col,row,err_ptr)
		 
 IF err_ptr^#0 THEN RETURN(0) FI
;(calling routine does error handling)

 IF fldlen=0 THEN
  field(1)='0
  field(0)=1
 FI

 IF fldlen=3 THEN			 ; overflow
  chk=SCOMPARE(field,limit)
 FI
 IF chk>0 THEN
  chk=0
  MSG(7)
 ELSE
  value=VALB(field)
  IF value<minval OR value>maxval
	THEN MSG(7)
  ELSE accept=1
  FI
 FI

UNTIL accept
OD

RETURN(value)

;************************************
;
; Example of use of EntryB()

PROC Test2()

BYTE x,y,min,max,nullflg,value
BYTE errcde
BYTE POINTER err_ptr

errcde=0
err_ptr=@errcde

min=100
max=200

nullflg=0
x=15  y=7

PUT(125)
POSITION(5,5)
PUTE()
PRINTE("Enter a number between ")
PRINTB(min)
PRINT(" and ")
PRINTB(max)
PRINT(": ")

value=EntryB(X,Y,min,max,nullflg,
				 0,0,err_ptr)

POSITION(5,10)
PUTE()
PRINTBE(value)
PRINTE("Done...")

RETURN