ALP Systems LLC
     SUBROUTINE USER.ACTION(ACTIONS,VALIDACTS,OPT,PROGRAM,PARAMETER)
      * Program: 
      * Copyright ALP Systems LLC
      *
      *    ACTIONS     - Opened File Name
      *    VALIDACTS   - Available options to user
      *    OPT         - Return value of User Choice
      *    PROGRAM     - Calling Program
      *    PARAMETER<1>- spacing of action words
      *    PARAMETER<2>- y coordinate
      *
      *-----
      PROMPT ''
      CLR=@(-1)
      EOP=@(-3)
      EOL=@(-4)
      BON=@(-7)
      BOF=@(-8)
      BELL=CHAR(7)
      AM=CHAR(254)
      VM=CHAR(253)
      SVM=CHAR(252)
      PR=@(0,22):EOL:@(0,22)
      ER=@(0,23):EOL:@(0,23)
      ABORT=0
      TODAY=OCONV(DATE(),'D2-')
      BADS=''
      FOR M=0 TO 31
         BADS:=CHAR(M)
      NEXT M
      *-----
      SPACING=PARAMETER<1> ; YCORD=PARAMETER<2>
      IF SPACING='' THEN SPACING=10
      IF YCORD='' THEN YCORD=22
      ********************
      * Validate Options *
      ********************
      Z=VALIDACTS ; DESC=''
      VALIDACTS=''
      LOOP
      UNTIL Z='' DO
         ZID=Z<1>
         READ DACTIONS FROM ACTIONS, ZID ELSE DACTIONS=''
         Z=DELETE(Z,1,0,0)
         IF DACTIONS#'' THEN
            DESC<-1>=DACTIONS<2>
            VALIDACTS<-1>=ZID
         END
      REPEAT
      IF DESC='' THEN
         OPT='' ; * Abort, no valid options
         RETURN
      END
      XVAL=0 ; CURRENT=VALIDACTS<1>
      MAX=DCOUNT(VALIDACTS,AM) ; * Number of valid actions
      **************
      * User Input *
      **************
10    LOCATE CURRENT IN VALIDACTS SETTING PPP ELSE PPP=0
      GOSUB 20
      IF PPP THEN CRT @(0,YCORD+1):SPACE(40):@(0):DESC:
      CRT @(0,YCORD):EOL:@(0,YCORD):LN:@(XVAL,YCORD):
      INPUT OPT,0:
      OPT=OCONV(OPT,'MCU')
      SEQVAL=SEQ(OPT)
      BEGIN CASE
         CASE SEQVAL=6 OR SEQVAL=32 OR SEQVAL=10 ;*6=right,10=down,32=space
            IF MAX>PPP THEN OPT=VALIDACTS
            IF MAX=PPP THEN OPT=VALIDACTS<1>
         CASE SEQVAL=21 OR SEQVAL=26 ; * left arrow & up arrow
            IF PPP>1 THEN OPT=VALIDACTS
            IF PPP=1 THEN OPT=VALIDACTS
         CASE SEQVAL=13 OR SEQVAL=255 ; * Enter
            OPT=CURRENT
            CRT @(0,YCORD):EOL:@(0,YCORD+1):SPACE(40):
            RETURN
      END CASE
      LOCATE OPT IN VALIDACTS SETTING PPP ELSE PPP=0
      IF NOT(PPP) THEN GO 10
      XVAL=(PPP*SPACING)-SPACING ; CURRENT=VALIDACTS
      GO 10
      ************
      * Build LN *
      ************
20    Z=VALIDACTS ; LN='' ; X=0 ; CNT=0
      LOOP
      UNTIL Z='' DO
         ZID=Z<1> ; CNT+=1
         READV D1 FROM ACTIONS, ZID, 1 ELSE D1=''
         Z=DELETE(Z,1,0,0)
         X+=SPACING
         DMY1='' ; DMY2=''
         IF CNT=PPP THEN DMY1=@(-7) ; DMY2=@(-8)
         LN:=@(X-SPACING,YCORD):DMY1:D1:DMY2
      REPEAT
      RETURN