#REM  DataFlex standard MACROs
#REM  Copyright 1987-1992 Data Access Corporation, Miami FL, USA
#REM  All Rights reserved.
#REM  THIS IS THE FILE THAT DEFINES THE COMMANDS IN DATAFLEX VERSION 3.01
#REM  IT MUST BE PACKed INTO FLEX.CFL WITH THE COMMAND "DFPACK FMAC"

#REM  GENERAL FORMAT OF AN ICODE LINE:

#REM  !A [] $000 ARG1 ARG2
#REM  !A Generates the next line number
#REM  [] is a place holder for the indicators
#REM  $000 is a hex number that calls the appropriate 'C' routine
#REM  arg1, arg2 - two arguments of any type/class
#REM           can be passed to the routine.

#REM  THE FOLLOWING ARE THE COMPILE-TIME VARIABLES USED
#REM  UPPERCASE WILL AUTO-INCREMENT (FIRST);
#REM  LOWER CASE WILL NOT.  THEN SUBSTITUTE TO AN INTEGER VALUE.

#REM  !A - Next line number
#REM  !B - Reserved
#REM  !C - Next indicator number
#REM  !D - Next integer number
#REM  !E - Autopage, window #
#REM  !F - Autopage, page #
#REM  G,H,I,J,K,L,M - You may use these
#REM  !N - Static nesting level
#REM  !O - Reserved
#REM  !P - Used by report
#REM  !Q - Low level temporary
#REM  !R - Static structure number (Begin/End)
#REM  !S - Temporary used by end/loop/until
#REM  !T,!U - Reserved
#REM  !V - Next variable number.
#REM  !W - Reserved
#REM  !X - Temporary for enter & report - file numbers.
#REM  !Y - Temporary for keyproc
#REM  !Z - Reserved

#REM Type checking in command args use negative logic and
#REM conform to the following:

#REM C - Constant      V - Memory variable 
#REM F - File element      G - Group           
#REM W - Window
#REM S - String        E - Expression      
#REM N - Number        L - Label           
#REM D - Date          O - Group options   
#REM I - Integer       B - Group indicators
#REM # - Indicator     . - No more arguments         
#REM X - Not an indicator  R - Argument required
#REM T - Error if typed    $ - Changes window to string      
#REM U - Error if untyped  "constant" - Must be constant

#REM Example: #COMMAND EXAMPLE SND means arg1 cannot be string,number,or date

#COMMAND ABORT &.
  !A [] $040
#ENDCOMMAND

#COMMAND ACCEPT #L #L #LUC #LUWFC .
  #SET Q$ !0
  #IF !q=0
    AUTO2$ ACCEPT PAGE!f
  #ELSE
    #IF !q=1
      #IFCLASS !1 "G"
        AUTO2$ ACCEPT PAGE!f !1
      #ELSE
        #CHECK !1 _CVFG#L
        !A [] $1C1 !1 |CI0
      #ENDIF
    #ELSE
      #IF !q=2
        #IFCLASS !2 "G"
          #FORMAT !1 !2
          #CHECK !1 _CVFG#L
          !A [] $1C1 !1 |CI0
        #ELSE
          AUTO2$ ACCEPT PAGE!f TO !2
        #ENDIF
      #ELSE
        #IF !q>2
          #IFCLASS !3 "G"
            #CHECK !1 "TO"
            AUTO2$ ACCEPT PAGE!f TO !2 !3
          #ELSE
            #IFCLASS !4 "G"
              #FORMAT !1 !4
            #ENDIF
            #CHECK !1 _CVFG#L
            #CHECK !2 "TO"
            #CHECK !3 _CG#LE
            !A [] $1C1 !1 !3
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND APPEND #LGULCE$ #LGULR$
  !A [] $243 !1 !2
  #IF !0>2
    APPEND !1 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND ASCII &#GRLU "TO" #UGRLCE .
  !A [] $247 !1 !3
#ENDCOMMAND

#COMMAND ATTACH CVWR#LGE
  #IFDEF !1
    !A [] $C5 !1
  #ELSE
    #CHECK !1.RECNUM _CVWLR#GU
    !A [] $C5 !1.RECNUM
  #ENDIF
  #IF !0>1
    ATTACH !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#REM  The AUTO commands are used internally to generate the 
#REM  next AUTOPAGE window number at compile time.

#COMMAND AUTO2$
  !1 !2.!E !3 !4 !5
  #CHECK !2.!e _RUCVF#L
#ENDCOMMAND

#COMMAND AUTO3$
  !1 !2 !3.!E !4 !5
  #CHECK !3.!e _RUCVF#L
#ENDCOMMAND

#COMMAND AUTO4$
  !1 !2 !3 !4.!E !5
  #CHECK !4.!e _RUCVF#L
#ENDCOMMAND

#COMMAND AUTOPAGE &T %USNVLE# .
  #CHECK !1.N _WFVSG#LU
  #SET F$ !1.N
  #SET E$ !2
  #IF !e>0
    #SET E$ !e-1
  #ENDIF
#ENDCOMMAND

#REM BACKFIELD can only be used in a KEY PROCedure. It returns to the
#REM window (COMMAND) PRIOR to the one that called it.

#COMMAND BACKFIELD &.
  !A [] $288
#ENDCOMMAND

#COMMAND BEGIN &.
  #SET N$ !N
  #PUSH !R
  #XPUSH !n $INIT  // Init IF/ELSE stack at this nesting level.
  #IFIND //INCLUDE JUMPS IF INDICATORS ON LINE.
    // GOTO BEGIN$!r
    !A [] $041 |CI0
    #FREF BEGIN$!r !a
    #$ !A 0 0 0 $041 |CL0
    #FREF END$!r !a
  #ENDIF
  #$ BEGIN$!r:
#ENDCOMMAND

#COMMAND BLANKFORM &%CVFG#EL  "THRU""THROUGH""" %CVFG#LUE .
  #IF !0>0
    #IFDEF !1
      !A [] $1C4 !1 !3
    #ELSE
      #CHECK !1.N _#RLGVU
      !A [] $1C4 !1.N
    #ENDIF
  #ELSE
    !A [] $1C4 |CI0
  #ENDIF
#ENDCOMMAND

#COMMAND BREAK$             // does breakpoint for all
  #IF (!0>0)
    #IFCLASS !1 _F
      BREAKPOINT |CI!P !1
    #ELSE
      #CHECK !1 _LGBCVWIEOU#
    #ENDIF
  #ENDIF
  #IF (!0>1)
    BREAK$ !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND BREAK$DOWN R           // does gosub to break
  #IF !x>0                // sections from N to 0
    #IF !0>1
      // GOSUB !1!x
      !A [] $42 |CL0
      #FREF !1!x !a
    #ELSE
      //[!x] GOSUB !1!x
      !A [!x] $42 |CL0
      #FREF !1!x !a
    #ENDIF
  #ENDIF
  #SET X$ !x-1
  #IF !x>0
    BREAK$DOWN !1 !2
  #ENDIF
#ENDCOMMAND

#COMMAND BREAK$PRT          // prints all SUBHEADERs
  #IF !x<!p               // for page
    #IFDEF !1!X.N
      !A [~ !x] $202 !1!x.N  // OUTPUT
    #ENDIF
    BREAK$PRT !1 !2
  #ENDIF
#ENDCOMMAND

#COMMAND BREAK$T3
  #IF !x<!p               // makes unused sections defined
    MAKEDEF$ RPT.SUBHEADER!X RPT.SUBTOTAL!x
    BREAK$T3
  #ENDIF
#ENDCOMMAND

#COMMAND BREAK$UP           // does GOSUB to break
  #IF !x<!p               // sections from 0 to N
    #IF !0=1
      //[!X] GOSUB !1!x
      !A [!X] $42 |CL0
      #FREF !1!x !a
    #ELSE
      // GOSUB !1!X
      !A [] $42 |CL0
      #FREF !1!X !a
    #ENDIF
    BREAK$UP !1 !2
  #ENDIF
#ENDCOMMAND

#COMMAND BREAKINIT  &.  // set up breakpoints for REPORT
  !A [] $207
#ENDCOMMAND

#COMMAND BREAKPOINT &UVFW UCI   // test breakpoint and set indicators
  !A [] $204 !1 !2
#ENDCOMMAND

#COMMAND CALCULATE &#ULG "TO" #UCLGER .
  #IFTYPE !3 "R"
    !A [] $085 !1 !3 //MOVE REAL
  #ELSE
    !A [] $081 !1 !3 //MOVE NUM
  #ENDIF
#ENDCOMMAND

#COMMAND CHAIN RNDIG#L  NDG#L
  #SET Q$ 0
  #IFSAME !1 WAIT
    CHAIN$HELP !3 !4 !5 !6 !7 !8 !9
    !A [] $049 !2 |CI!q
  #ELSE
    #CHECK !1 _U
    CHAIN$HELP !2 !3 !4 !5 !6 !7 !8 !9
    !A [] $045 !1 |CI!q
  #ENDIF
#ENDCOMMAND

#COMMAND CHAIN$HELP UVNDEG#L
  #IF (!0>0)
    #SET Q$ (!q+!1)
    CHAIN$HELP !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND CHARACTER &#%GULD "TO" #GRULCE .
  !A [] $248 !1 !3
#ENDCOMMAND

#COMMAND CLEAR CVWR#LGE
  #IFDEF !1
    !A [] $C1 !1
  #ELSE
    #CHECK !1.RECNUM _CVWLR#GU
    !A [] $C1 !1.RECNUM
  #ENDIF
  #IF !0>1
    CLEAR !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND CLEAR_OPTION #LGRE . // Clears window options which
  #IFCLASS !1 _C           // have been set ON by set option
    #SET Q$ !1           // or by dfsetup.
    !A [] $04B |CI!q |CI0       // CLEAR_OPTION AUTORETURN
  #ELSE
    !A [] $04B !1 |CI0      // .
  #ENDIF
#ENDCOMMAND

#COMMAND CLEARFORM &%CVFG#LE  "THRU""THROUGH""" %CVFG#LUE .
  #IF !0>0
    #IFDEF !1
      !A [] $1C3 !1 !3 |CI0
    #ELSE
      #CHECK !1.N _R#LGVU
      !A [] $1C3 !1.N |CI0
    #ENDIF
  #ELSE
    !A [] $1C3 |CI0
  #ENDIF
#ENDCOMMAND

#COMMAND CLEARSCREEN & .
  !A [] $144 !1
#ENDCOMMAND

#COMMAND CLEARWARNING &.
  !A [] $048
#ENDCOMMAND

#COMMAND CLEARXY &%#USGL %#USGLR .
  !A [] $146 !1 !2
#ENDCOMMAND

#COMMAND CLOSE RTE
  #CHECK !1.RECNUM _CVWLR#GU
  !A [] $181 !1.RECNUM
  #IF (!0>1)
    CLOSE !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND CLOSE_INPUT 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI0 !2
  #ENDIF
  !A [] $100 |CS'CON:'
#ENDCOMMAND

#COMMAND CLOSE_OUTPUT 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
  #ENDIF
  !A [] $101 |CS'LST:'
#ENDCOMMAND

#COMMAND CMDLINE &#RLUGE .
  !A [] $24A !1 |CS''
#ENDCOMMAND

#COMMAND COPYFILE &#LGU "TO" R#LGU .
  !A [] $2C5 !1 !3
#ENDCOMMAND

#COMMAND CONSTRAINT_SET R#LG """DELETE""CLEAR"
  #IFSAME !2 DELETE
    !A [] $0DA !1    // DELETE 
  #ELSE
    #IFSAME !2 CLEAR
      !A [] $0DA !1    // DELETE FIRST
    #ENDIF
    !A [] $0D0 !1   // QUERY ID
  #ENDIF
#ENDCOMMAND

#COMMAND CONSTRAINT_SAVE_INIT .
  !A [] $0DE
#ENDCOMMAND

#COMMAND CONSTRAINT_VALIDATE .
  !A [] $0DF
#ENDCOMMAND

#COMMAND CONSTRAINT_INIT r r "BY" r // mode file by index
  #IFSAME !1 $0 $1 $2 $3 $4 $5
    #SET Q$ !1
    MOVE |CI!q TO INDEX_NUMBER
  #ELSE
    MOVE !1 TO INDEX_NUMBER
  #ENDIF
  #IFDEF !2
    !A [] $0D6 !2 !4    // VARIABLE FILE NUMBER
  #ELSE
    #SET Q$ !2.RECNUM   // FILE NAME ONLY
    !A [] $0D6 |CI!q !4
  #ENDIF
#ENDCOMMAND

#COMMAND CONSTRAINED_CLEAR
  #IF !0>0
    CONSTRAINT_INIT !1 !2 !3 !4
  #ENDIF
  !A [] $DC   // Find clear
#ENDCOMMAND

#COMMAND CONSTRAIN R
  #IFSAME !2 AS
    #CHECK !3 CFLVNSWG#
    #CHECK !1.RECNUM R#ULWVC
    #SET Q$ !1.RECNUM
    !A [] $DB |CI!q !3        // FILE AS (BOOL-EXP)
  #ELSE
    #IFSAME !2 BETWEEN      // FIELD BETWEEN A AND B
      #CHECK !4 "AND"
      CONSTRAIN !1 GE !3
      CONSTRAIN !1 LE !5
    #ELSE
      #IFSAME !2 RELATES
        #CHECK !3 "TO"
        #IFDEF !1
          #IFDEF !4
            !A [] $D9 !1 !4        // FILE RELATES TO FILE
          #ELSE
            !A [] $D9 !1 !4.FILE_NUMBER // FILE RELATES TO FILE
          #ENDIF
        #ELSE
          #IFDEF !4
            !A [] $D9 !1.FILE_NUMBER !4 
          #ELSE
            !A [] $D9 !1.FILE_NUMBER !4.FILE_NUMBER
          #ENDIF
        #ENDIF
      #ELSE
        #CHECK !1 R#LWVCEBG
        #IF !0>1
          #IFSAME !2 MATCHES
            #SET Q$ 6
          #ELSE
            #IFSAME !2 CONTAINS
              #SET Q$ 7
            #ELSE
              #CHECK !2 _U
              #SET Q$ !2
            #ENDIF
          #ENDIF
          MOVE |CI!q TO INDEX_NUMBER
          #IFCLASS !3 "F"
            !A [] $D2 !1 !3 // FILE MODE FILE
          #ELSE
            !A [] $D1 !1 !3 // FILE MODE VALUE
          #ENDIF
        #ELSE
          #CHECK !1 CVW#GRE
          !A [] $D3 !1 // FIELD ONLY
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND CONSTRAINED_FIND // MODE FILE by INDEX
  #IFSAME !1 NEXT
    #IF !0>1
      !A [] $0D0 !2   // QUERY ID
    #ENDIF
    !A [] $D8       // find NEXT
  #ELSE
    #IFSAME !1 FIRST
      CONSTRAINED_CLEAR GE !2 !3 !4
    #ELSE
      #IFSAME !1 LAST
        CONSTRAINED_CLEAR LE !2 !3 !4
      #ELSE
        #IF !0>0
          CONSTRAINT_INIT !1 !2 !3 !4
        #ENDIF
        // THIS USES RB DATA ,IT DOES NOT CLEAR THE rb.
      #ENDIF
    #ENDIF
    !A [] $D7  |CI0 // find init, sets found on status of constrained relates.
    !A [FOUND] $D8  // find NEXT (first)
  #ENDIF
#ENDCOMMAND

#COMMAND DATE TR
  #NUM V$
  #REPLACE !1 |VD!v
  #IF (!0>1)
    DATE !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND DEBUG &.
  !A [] $044
#ENDCOMMAND

#COMMAND DECREMENT &#LCNSFWGRUE .
  !A [] $087 !1 |CI0
#ENDCOMMAND

#COMMAND DELETE CVWR#LGE
  #IFDEF !1
    !A [] $C3 !1
  #ELSE
    #CHECK !1.RECNUM _CVWLR#GU
    !A [] $C3 !1.RECNUM
  #ENDIF
  #IF !0>1
    DELETE !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND DESPOOL &. // This calls the system despool command, if available.
  !A [] $2C6        // Multiuser only, and only if the OS has program-
#ENDCOMMAND     // call-able Despool (many don't!)

#COMMAND DIRECTORY &R#LGU .
  !A [] $2C4 !1
#ENDCOMMAND

#COMMAND DIRECT_INPUT 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI0 !2
    #IF !0>2
      DIRECT_INPUT !3 !4
    #ENDIF
  #ELSE
    #IFSAME !1 DBMS IMAGE
      #IFSAME !1 IMAGE
        #SET Q$ !2.N
        !A [] $100 |CS"!1:!q"
      #ELSE
        !A [] $100 |CS"!1:!2"
      #ENDIF
    #ELSE
      #CHECK !2 .
      !A [] $100 !1
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND DIRECT_OUTPUT 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
    #IF !0>2
      DIRECT_OUTPUT !3 !4
    #ENDIF
  #ELSE
    #IFSAME !1 DBMS IMAGE
      #IFSAME !1 IMAGE
        #SET Q$ !2.N
        !A [] $101 |CS"!1:!q"
      #ELSE
        !A [] $101 |CS"!1:!2"
      #ENDIF
    #ELSE
      #CHECK !2 .
      !A [] $101 !1
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND APPEND_OUTPUT 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
    #IF !0>2
      APPEND_OUTPUT !3 !4
    #ENDIF
  #ELSE
    #IFSAME !1 DBMS IMAGE
      #IFSAME !1 IMAGE
        #SET Q$ !2.N
        !A [] $101 |CS"!1:!q" |CI2
      #ELSE
        !A [] $101 |CS"!1:!2" |CI2
      #ENDIF
    #ELSE
      #CHECK !2 .
      !A [] $101 !1 |CI2
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND DISKFREE #LIDNRUG "TO" #LDRCUGE .
  !A [] $2d5 !3 !1
#ENDCOMMAND

#COMMAND DISPLAY RUG#L
  #IF !0>2
    #CHECK !2 "TO"
    #CHECK !3 _RGC#LE
    !A [] $1C2 !1 !3
    #IF !0>3
      #CHECK !4 _#LWFCV
      #FORMAT !3 !4
    #ENDIF
  #ELSE
    AUTO4$ DISPLAY !1 TO PAGE!f !2
  #ENDIF
#ENDCOMMAND

#COMMAND ELSE
  #$ !A [] $41 |CI0 //jump over else code.
  #XPOP !n S$ // GET GOTO LINE NUMBER FROM LAST IF.
  #XPUSH 1 !a // Save line number of ELSE jump.
  #XPUSH 0 !n // Save static nest level.
  #FREF (!a+1) !s // Modify goto line number with ELSE command
  !1 !2 !3 !4 !5 !6 !7 !8 !9
  #XPOP 0 Q$  // Restore static nest level to Q.
  #XPOP 1 S$  // Restore line number of else jump.
  #IF (!n>!q)
    #FREF END$!r !s // Modify ELSE jump to after BEGIN block.
  #ELSE
    #FREF (!a+1) !s // Modify ELSE jump to after the ELSE command.
  #ENDIF
#ENDCOMMAND

#COMMAND END &.
  #POP S$
  #IFDEF WHILE$!s
    !A [] $041 WHILE$!s
  #ENDIF
  END$!s:
  #SET N$ !n-1
#ENDCOMMAND

#COMMAND ENDGROUP &.
  //ENTUPDATE         // update record buffer
  !A [] $280 |CI0
  //GOTO ENT$END!x
  !A [] $41 |CL0
  #FREF ENT$END!x !a
  //RETURN            // RETURN stops entry command list
  !A [] $43 |CI0
  ENT$END!x:
#ENDCOMMAND

#COMMAND ENT$KEY
  ENT$DISP:
  IF ENTER$DISPLAY NE 0 BEGIN
    !A [FOUND] $042 ENTER$DISPLAY
  END
  ELSE BEGIN
    [FOUND] ENTDISPLAY // JUST DO AN ENTDISPLAY
  END
  //              ENTAGAIN
  !A [] $287
  //              RETURN
  !A [] $43 |CL0
  
  //<<<<<<< STANDARD KEY PROCEDURES FOR ENTER GROUP >>>>>>>>>>
  //KEYPROC KEY.FIND
  ENTER$.FIND:
  //              ENTFIND GE          // no, FIND
  !A [] $281 |CI3
  #KEYPROC 7 !a
  //              GOTO ENT$DISP
  !A [] $41 ENT$DISP
  
  //KEYPROC KEY.NEXT                  // FIND next record
  ENTER$.NEXT:
  //              ENTFIND GT
  !A [] $281 |CI4
  #KEYPROC 15 !a
  //              GOTO ENT$DISP
  !A [] $41 ENT$DISP
  
  //KEYPROC KEY.PREVIOUS              // FIND prv record
  ENTER$.PREVIOUS:
  //              ENTFIND LT
  !A [] $281 |CI0
  #KEYPROC 14 !a
  //              GOTO ENT$DISP
  !A [] $41 ENT$DISP
  //KEYPROC KEY.UP
  //KEYPROC KEY.FIELD                 // BACK FIELD
  ENTER$.FIELD:
  //              BACKFIELD
  !A [] $288
  #KEYPROC 16 !a
  #KEYPROC 6 !a
  //              RETURN
  !A [] $43 |CI0
  //KEYPROC KEY.CLEAR                 // CLEAR SCREEN
  ENTER$.CLEAR:
  //              INDICATE ERR FALSE
  !A [] $4028 |CI0 |CI0 |127
  #KEYPROC 13 !a
  !A []           $284 // ENTCLEAR
  //              RETURN
  !A [] $43 |CI0
  //KEYPROC KEY.SAVE
  ENTER$.SAVE:
  !A []           $285 // ENTSKIP
  #KEYPROC 9 !a
  //              RETURN
  !A [] $43 |CI0
  //KEYPROC KEY.HELP
  ENTER$.HELP:
  //HELP
  !A [] $1C5 |CI0
  #KEYPROC 18 !a
  //ENTAGAIN
  !A [] $287
  //RETURN
  !A [] $43 |CI0
  
  // KEYPROC KEY.PRINT
  ENTER$.PRINT:
  // output current page
  !A [] $202 |VI9
  #KEYPROC 2 !a
  //ENTAGAIN and RETURN
  !A [] $287
  !A [] $43 |CI0
#ENDCOMMAND

#REM ENTAGAIN can only be used in a KEY PROCedure. It returns to the
#REM same window (COMMAND) that called the KEY PROCedure.

#COMMAND ENTAGAIN &.
  !A [] $287
#ENDCOMMAND

#COMMAND ENTDISPLAY &TCVWG#LE .  // Display all entries for a file
  #IF (!0>0)
    //RELATE !1
    !A [] $C4 !1.RECNUM
  #ENDIF
  //display from entry section
  !A [] $283
#ENDCOMMAND

#COMMAND ENTER CVWSRL#E
  //              INDICATE CONTINUE TRUE
  #REPLACE CONTINUE |!C
  !A [] $4028 |CI0 |CI0 CONTINUE~
  //              INDICATE ENT$QUERY FALSE
  #REPLACE ENT$QUERY |9
  !A [] $4028 |CI0 |CI0 |9
  #IF !0>0            // ENT$QUERY tells us if
    #SET X$ !1.RECNUM           // we are in QUERY(SUPERFIND) mode
  #ELSE
    #SET X$ 0
  #ENDIF
  //MOVEINT |CI!x TO |VI8     // set ENTMFILE (ENTER's main file variable)
  !A [] $82 |CI!x |VI8        // to main file for ENTSFIND
  ENT$LP:             // start of enter loop
  //              GOSUB ENTRYSEC      // do ENTRY section
  !A [] $042 |CL0
  #FREF ENTRYSEC !a
  //[KEY.ESCAPE]      GOTO END_ENTER      // dropped thru
  !A [|103] $041 |CL0
  #FREF END_ENTER !a
  //              INDICATE ERR FALSE      // set error false
  !A [] $4028 |CI0 |CI0 |127
  // temp disable ON ERROR
  !A [] $82 |VI31 |VI32
  !A [] $82 |CI0 |VI31
  //              REREAD          // multiuser reread
  !A [|120] $0C9
  //[ENT$QUERY]       GOSUB ENTER.EDIT    // user procedure
  !A [|9] $042 |CL0
  #FREF ENTER.EDIT !a
  //[NOT ERR]         ENTUPDATE       // update files from ENTRY
  !A [~|127] $280 |CI0
  //[NOT ERR]         GOSUB ENTER.SAVE    // user procedure
  !A [~|127] $042 |CL0
  #FREF ENTER.SAVE !a
  [NOT ERR]       MULTIBACK$ SAVE !1 !2 !3 !4 !5 !6 !7 !8 !9  // save
  //              UNLOCK          //multiuser
  !A [|120] $0C8
  //[NOT ERR]         GOSUB ENT$CLEAR     // clear screen
  !A [~ |127] $042 |CL0
  #FREF ENT$CLEAR !a
  // RE ENABLE ON ERROR
  !A [] $82 |VI32 |VI31
  //[CONTINUE]        GOTO ENT$LP         // loop
  !A [CONTINUE] $041 ENT$LP
  //              GOTO END_ENTER      // end if NOT CONTINUE
  !A [] $041 |CL0
  #FREF END_ENTER !a
  // this clears the screen and all data files
  ENT$CLEAR:          MULTIBACK$ CLEAR !1 !2 !3 !4 !5 !6 !7 !8 !9
  //              INDICATE ENT$QUERY FALSE
  !A [] $4028 |CI0 |CI0 |9
  //              ENTCLEAR - clear ENTRY section
  !A [] $284
  //              RETURN
  !A [] $043 |CI0
  //<<<<<<< STANDARD KEY PROCEDURES FOR ENTER >>>>>>>>>>
  //KEYPROC KEY.SAVE
  ENTER$.SAVE:
  !A []           $285 //ENTSKIP (skip rest of entries)
  #KEYPROC 9 !a
  //              RETURN
  !A [] $043 |CI0
  //KEYPROC KEY.DELETE
  //              INDICATE ERR FALSE      //default
  ENTER$.DELETE:
  !A [] $4028 |CI0 |CI0 |127
  #KEYPROC 10 !a
  // DISABLE ON ERROR
  !A [] $82 |VI31 |VI32
  !A [] $82 |CI0 |VI31
  //              REREAD
  !A [|120] $C9
  //[NOT ENT$QUERY]   ERROR 71    // check for active record
  !A [~|9] $47 |CI71
  //[NOT ERR]         GOSUB ENTER.DELETE      // user procedure
  !A [~|127] $042 |CL0
  #FREF ENTER.DELETE !a
  //[NOT ERR]         GOSUB ENTER.EDIT    // user procedure
  !A [~|127] $042 |CL0
  #FREF ENTER.EDIT !a
  //[NOT ERR]         DELETE !1       // delete records
  !A [~|127] $C3 !1.RECNUM
  [NOT ERR]       MULTIBACK$ SAVE !2 !3 !4 !5 !6 !7 !8 !9 // related
  //              UNLOCK
  !A [|120] $C8
  //[NOT ERR]         GOSUB ENT$CLEAR       // clear systems
  !A [~|127] $042 ENT$CLEAR
  // enable ON ERROR
  !A [] $82 |VI32 |VI31
  //              RETURN ENTRYSEC
  !A [] $43
  #FREF ENTRYSEC !a
  // will GOSUB here for all find keys //
  //              INDICATE WAS$QUERY GROUP ANY [ENT$QUERY]
  ENTER$.FIND:
  #REPLACE WAS$QUERY |!C
  !A [] $4020 |GB[|9] |GB[0] WAS$QUERY IN$GLANY |3
  #KEYPROC 8 !a // SUPERFIND
  #KEYPROC 7 !a // FIND
  #KEYPROC 15 !a // NEXT
  #KEYPROC 14 !a // PREVIOUS
  //[KEY.SFIND]       INDICATE ENT$QUERY TRUE
  !A [|108] $4028 |CI0 |CI0 |9~
  //[NOT ENT$QUERY]   INDICATE ENT$QUERY AS |CI!x EQ |VI15    // query mode?
  !A [~ |9] $4008 |CI!x |VI15 |9 |2
  //[KEY.SFIND]         ENTSFIND GE
  !A [|108] $282 |CI3
  //[KEY.FIND][ENT$QUERY][ENT$PERMISSIVE] ENTFIND GE
  !A [|107 |9 |10] $281 |CI3
  //[KEY.FIND][ENT$QUERY][NOT ENT$PERMISSIVE] ENTSFIND GE   // yes, SUPERFIND
  !A [|107 |9 ~ |10] $282 |CI3
  //[KEY.FIND][NOT ENT$QUERY]     ENTFIND GE        // no, FIND
  !A [|107 ~ |9] $281 |CI3
  //[KEY.NEXT][ENT$QUERY]   ENTSFIND GT     // yes, SUPERFIND
  !A [|115 |9] $282 |CI4
  //[KEY.NEXT][NOT ENT$QUERY]     ENTFIND GT        // no, FIND
  !A [|115 ~ |9] $281 |CI4
  //[KEY.PREVIOUS][ENT$QUERY]     ENTSFIND LT       // yes, SUPERFIND
  !A [|114 |9] $282 |CI0
  //[KEY.PREVIOUS][NOT ENT$QUERY] ENTFIND LT        // no, FIND
  !A [|114 ~ |9] $281 |CI0
  [FINDERR]       INDCT$GROUP ENT$QUERY GROUP ANY [WAS$QUERY]
  //!A [FOUND]        $283            // display records
  !A [FOUND] $042 ENTER$DISPLAY
  //              ENTAGAIN        // same window
  !A [] $287
  //              RETURN
  !A [] $43 |CI0
  ////// define ENTER's KEY PROCedures ////////////
  // KEYPROC BACKFIELD
  //              BACKFIELD
  ENTER$.FIELD:
  !A [] $288
  #KEYPROC 16 !a
  #KEYPROC 6 !a
  ENTXRET://          RETURN
  !A [] $43 |CL0
  // KEYPROC CLEARSCREEN
  ENTER$.CLEAR:
  //              INDICATE ERR FALSE
  !A [] $4028 |CI0 |CI0 |127
  #KEYPROC 13 !a
  //              GOSUB ENTER.CLEAR
  !A [] $042 |CL0
  #FREF ENTER.CLEAR !a
  //[NOT ERR]         GOSUB ENT$CLEAR
  !A [~ |127] $042 ENT$CLEAR
  //              RETURN ENTRYSEC
  !A [] $043
  #FREF ENTRYSEC !a
  // KEYPROC ESCAPE key
  ENTER$.ESCAPE:
  //              INDICATE ERR FALSE
  !A [] $4028 |CI0 |CI0 |127
  #KEYPROC 3 !a
  //              GOSUB ENTER.EXIT
  !A [] $42 |CL0
  #FREF ENTER.EXIT !a
  //[NOT ERR]         RETURN ENTXRET
  !A [~ |127] $43 ENTXRET
  //              RETURN
  !A [] $43 |CI0
  //KEYPROC KEY.HELP
  //HELP
  ENTER$.HELP:
  !A [] $1C5 |CI0
  #KEYPROC 18 !a
  //ENTAGAIN
  !A [] $287
  //RETURN
  !A [] $43 |CI0
  //KEYPROC KEY.PRINT
  //output current page
  ENTER$.PRINT:
  !A [] $202 |VI9
  #KEYPROC 2 !a
  //ENTAGAIN and RETURN
  !A [] $287
  !A [] $43 |CI0
  
  ENTRYSEC://         ENTERMODE       // start entry section
  !A [] $82 |CI!a |VI14
  !A [] $286
#ENDCOMMAND

#COMMAND ENTEREND               // end of ENTER
  MAKEDEF$ ENTER.SAVE ENTER.EDIT ENTER.DELETE ENTER.CLEAR ENTER.EXIT
  //RETURN
  !A [] $43 |CI0
  #IFDEF ENTER.DISPLAY
  #ELSE
    ENTER.DISPLAY:
    ENTDISPLAY
    !A [] $43 |CI0
  #ENDIF
  END_ENTER:
  // CLEARSCREEN
  !A [] $144
#ENDCOMMAND

#COMMAND ENTERGROUP .   // independent entry section
  #IFDEF ENT$DISP
  #ELSE
    //INTEGER ENT$START
    INTEGER ENT$END
    //#$ GOTO ENTK$END
    #$ !A [] $41 |CL0
    #FREF ENTK$END !a
    #$ ENT$KEY
    #SET X$ 0
    ENTK$END:
  #ENDIF
  
  ENTRYSEC!X://       ENTERMODE       // start entry section
  !A [] $82 |CI!a |VI14
  !A [] $286
  //              INDICATE ENT$QUERY FALSE
  !A [] $4028 |CI0 |CI0 |9
#ENDCOMMAND

#REM ENTERMODE defines the top of the ENTRY section.

#COMMAND ENTERMODE &.
  //set start of ENTRY section
  !A [] $082 |CI!a  |VI14
  //clear SAVE key
  !A [] $286
#ENDCOMMAND

#REM ENTFIND FINDs a record based on the file/field of the last executed
#REM ENTRY command, and displays the results on a FIND. THE FIND mode
#REM is the only argument.
#REM ENTFIND also maintains the ENT$QUERY indicator.

#COMMAND ENTFIND &"$0""$1""$2""$3""$4""$5"
  !A [] $281 |CI!1
#ENDCOMMAND

#COMMAND ENTRY RWV#LUG UVC#LF UFVW#BC
  #IF !0=1
    AUTO3$ ENTRY !1 PAGE!f
  #ELSE
    #IFTYPE !2 "O"
      AUTO3$ ENTRY !1 PAGE!f !2
    #ELSE
      #CHECK !2 _RVCLE
      #IFCLASS !1 "E"
        !A [] $8000 !1 !2 {$C002,$C003 !3
      #ELSE
        !A [] $8000 !1 !2 !3
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#REM ENTSFIND (SUPERFIND) FINDs a record in the main file, based on the
#REM file/field of the last ENTRY command, and displays the results.
#REM This depends on the main file number being in SYSINT 8 (|VI8).

#COMMAND ENTSFIND &"$0""$1""$2""$3""$4""$5" .
  !A [] $282 |CI!1
#ENDCOMMAND

#REM ENTUPDATE moves all changed windows from the
#REM window buffer to the record buffer

#COMMAND ENTUPDATE &T .
  #IF !0>0
    !A [] $280 !1.RECNUM
  #ELSE
    !A [] $280 |CI0
  #ENDIF
#ENDCOMMAND

#COMMAND ERASEFILE &R#LGU .
  !A [] $2C1 !1
#ENDCOMMAND

#COMMAND ERROR &#L%RGU #LUG .
  !A [] $047 !1 !2
#ENDCOMMAND

#COMMAND ERROR_REPORT SU#LGO .
  #IF !0>0
    !A [] $04C !1
  #ELSE
    !A [] $04C |CI0
  #ENDIF
#ENDCOMMAND

#COMMAND FIELD_DEF _E U#LG "TO" #LGUCE #LGRUEC .
  #IFDEF !1
    !A [] $82 !1 FILENUMBER
  #ELSE
    #CHECK !1.RECNUM _U
    #SET Q$ !1.RECNUM
    !A [] $82 |CI!q FILENUMBER
  #ENDIF
  !A [] $82 !2 FIELDNUMBER
  !A [] $345 !4 !5
#ENDCOMMAND

#COMMAND FILELIST &R#%LG "TO""" #LUGCE #LUCGE .
  #IFSAME !1 NEXT
    !A [] $301 !3 !4
  #ELSE
    #IFSAME !1 PATHNAME
      !A [] $302 !3 !4
    #ELSE
      #CHECK !1 _U
      !A [] $82 !1 FILENUMBER
      !A [] $300 !3 !4
    #ENDIF
  #ENDIF
#ENDCOMMAND

#REM Put back into FILELIST.  The file number must be in "FILENUMBER"
#REM Three values are: ROOT NAME, DISPLAY NAME, LOGICAL NAME.

#COMMAND FILELIST$PUT &#LRU #LRU #LU
  #IF !0>2
    !A [] $309 !3
  #ENDIF
  !A [] $30A !1 !2
#ENDCOMMAND

#COMMAND FILE_MODE RT "READ_ONLY""SINGLE_USER""ALIAS""MASTER_ALIAS""DEFAULT" .
  #CHECK !1.RECNUM _CVWLR#GU
  #IFSAME !2 READ_ONLY
    !A [] $0CB !1.RECNUM |CI91
  #ELSE
    #IFSAME !2 SINGLE_USER
      !A [] $0CB !1.RECNUM |CI7
    #ELSE
      #IFSAME !2 DEFAULT
        !A [] $0CB !1.RECNUM |CI0
      #ELSE
        #IFSAME !2 ALIAS
          !A [] $0CB !1.RECNUM |CI130
        #ELSE
          #IFSAME !2 MASTER_ALIAS
            !A [] $0CB !1.RECNUM |CI128
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#REM FILE$MODE <FILE> <MODE NUMBER>
#REM    MODE VALUES (VALUES ARE ADDITIVE)
#REM    1   NO AUTOMATIC REREAD OF RECORD BUFFERS.
#REM    2   NO LOCKS (LOCK OR REREAD)
#REM    4   NO RE-READ OF BLOCK ZERO OF DATA FILE OR INDEXES
#REM    8   NO EDITS OF ACTIVE RECORDS (ERROR 66)
#REM    16  NO DELETES OF RECORDS (ERROR 63)
#REM    32  NO FINDS (ERROR 64)
#REM    64  NO CREATES OF NEW RECORDS. (ERROR 65)
#REM    128 ALWAYS RE_READ BLOCK 0
#REM Warning; Improper combinations of the above could disable
#REM multiuser checking and destroy the data base.
#REM 8 Thru 64 are non destructive and can be used in applications.
#REM FOR EXPERTS ONLY!
 
#COMMAND FILE$MODE RT #LGSU .
  #CHECK !1.RECNUM _RULG
  !A [] $0CB !1.RECNUM !2
#ENDCOMMAND

#COMMAND FILE_SIZE R#LGSD "TO" R#LGE #LUGE #LGUE .
  #IFDEF !1 // SET FILE SIZE
    #CHECK !3.RECNUM _RU
    #SET Q$ !3.RECNUM
    !A [] $343 |CI!q !1
  #ELSE
    #CHECK !1.RECNUM _U
    #SET Q$ !1.RECNUM
    !A [] $82 |CI!q FILENUMBER
    !A [] $341 !3 !4
    !A [] $82 STRMARK !5
  #ENDIF
#ENDCOMMAND

#COMMAND FIND &"$0""$1""$2""$3""$4""$5" R "BY""" % .
  #IFCLASS !2 "F"
    #CHECK !2 _U#LGWV
    #CHECK !3 .
    !A [] $0C0 !2 |CI!1
  #ELSE
    #CHECK !2.RECNUM _U#LGWV
    #CHECK !4 _RUL#GVFW
    #SET Q$ !2.RECNUM
    #SET Y$ !4
    !A [] $0C6 |FS!q.!y |CI!1
  #ENDIF
#ENDCOMMAND

#COMMAND FIND$PAGE "AT""COLORS""" #LUG U#LG .
  #IF !0>0
    #IFSAME !1 AT
      !A [] $1C8 !2 !3
    #ELSE
      #IFSAME !1 COLORS
        !A [] $1C9 !2 !3
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#REM  FLEX$INIT - STANDARD REPLACES
#REM  These are the standard symbols that are required for the compiler
#REM  This procedure will be automatically executed
#REM  when the compiler starts

#COMMAND FLEX$INIT &.
  #REPLACE CALC CALCULATE
  #REPLACE LT $0  // internal value for the find/indicate modes.
  #REPLACE LE $1
  #REPLACE EQ $2
  #REPLACE GE $3
  #REPLACE GT $4
  #REPLACE NE $5
  #REPLACE TRUE $1
  #REPLACE FALSE $0
  #REPLACE NOT ~
  #SET C$ 11
  #REPLACE LASTIF |!C
  #REPLACE ENT$PERMISSIVE |10
  #REPLACE IN$0 $4000
  #REPLACE IN$1 $4004
  #REPLACE IN$2 $4008
  #REPLACE IN$3 $400C
  #REPLACE IN$4 $4010
  #REPLACE IN$5 $4014
  #REPLACE IN$GLANY |0
  #REPLACE IN$GLALL |4
  #REPLACE IN$GRANY |0
  #REPLACE IN$GRALL |2
  #REPLACE IN$GMOR  |0
  #REPLACE IN$GMAND |1
  #REPLACE ERR |127
  #REPLACE ERRLINE |VI6
  #REPLACE LAST_CRIT_ERR |VI102
  #REPLACE EXT_CRIT_ERR |VI103
  #REPLACE FINDERR |126
  #REPLACE SEQEOF |125
  #REPLACE SEQEOL |121
  #REPLACE MULTIUSER |120
  #REPLACE FIELDINDEX |VI1
  #REPLACE WINDOWINDEX |VI2
  #REPLACE LASTERR |VI5
  #REPLACE KEYPRESS |123
  #REPLACE TERMCHAR |VI3
  #REPLACE FLEXKEY |VI4
  #REPLACE SCREENEND |VI17
  #REPLACE MEMAVAIL |VI18
  #REPLACE LASTENTRY |VI19
  #REPLACE FLX_REVISION |VI36
  #REPLACE ENTER$DISPLAY |VI38
  #REPLACE NOKEYCHECK |VI80
  #REPLACE CHAIN_DEPTH |VI81
  #REPLACE CURSOR_SET |VI82 // THESE ARE USED BY AUTOBACK
  #REPLACE CURSOR_RETURN |VI83
  #REPLACE MINIMUM_MEMORY |VI86 
  #REPLACE INDEX_NUMBER |VI90
  #REPLACE SCREEN_WIDTH |VI91
  #REPLACE KEY.ANY  |100
  #REPLACE KEY.RETURN   |101
  #REPLACE KEY.PRINT    |102
  #REPLACE KEY.ESCAPE   |103
  #REPLACE KEY.LEFT |104
  #REPLACE KEY.RIGHT    |105
  #REPLACE KEY.FIELD    |106
  #REPLACE KEY.FIND |107
  #REPLACE KEY.SFIND    |108
  #REPLACE KEY.SAVE |109
  #REPLACE KEY.DELETE   |110
  #REPLACE KEY.CALCULATE |111
  #REPLACE KEY.USER |112
  #REPLACE KEY.CLEAR    |113
  #REPLACE KEY.NEXT |115
  #REPLACE KEY.PREVIOUS |114
  #REPLACE KEY.UP   |116
  #REPLACE KEY.DOWN |117
  #REPLACE KEY.HELP |118
  #REPLACE KEY.USER2    |119
  #REPLACE NUMPAGE  |VI28
  #REPLACE NUMWINDOW    |VI29
  #REPLACE #$
  #SET F$ 1
  #REPLACE NEXT_MENU |VI127
  #REPLACE CURRENT_IMAGE |VI9
  #REPLACE CURRENT_WINDOW |VI7
  #REPLACE LAST_GOSUB |VI0
  #REPLACE FOUND |254
  #REPLACE STRMARK |VI12
  #REPLACE STRLEN |VI13
  //   ENTER & REPORT DEF'S
  #REPLACE LINECOUNT |VI10
  #REPLACE PAGECOUNT |VI11
  #REPLACE PAGEEND |VI25
  #REPLACE PAGEFEED |VI26
  #SET D$ 128   // INTEGERS NOW START HERE.
  #SET P$ 0
  #REPLACE AUTOFIND $C000
  #REPLACE AUTOFIND_GE $C000,$C008
  #REPLACE FINDREQ  $C001
  #REPLACE NOPUT    $C002
  #REPLACE NOENTER  $C003
  #REPLACE SKIPFOUND $C004
  #REPLACE RETAINALL $C005
  #REPLACE RETAIN    $C006
  #REPLACE FORCEPUT $C007
  #REPLACE DISPLAYONLY $C002,$C003
  #REPLACE CAPSLOCK $C023
  #REPLACE ZERO_SUPPRESS $C024
  #REPLACE SUPPRESS $C040=''
  #REPLACE FLOAT$ $C026
  #REPLACE UPPER $C023
  #REPLACE SIGNRT $C027
  #REPLACE CHECK $C012
  #REPLACE RANGE $C013
  #REPLACE REQUIRED $C022
  #REPLACE AUTORETURN $C028
  #REPLACE AUTOBACK   $C029
  #REPLACE NO_CALC    $C02B   // Disable Calculate (internal)
  #REPLACE MODAL_INSERT $C02A // Change insert style (internal)
  #REPLACE AUTOCLEAR $C02D
  #REPLACE WP_BACKSP $C02E
  #REPLACE PAGEBREAK |124
  #REPLACE FILL $C040
  #REPLACE POINTS $C080
  #REPLACE FILENUMBER |VI15
  #REPLACE FIELDNUMBER |VI16
  #REPLACE INDEX.1 |CI1   // the indexes are just integers.
  #REPLACE INDEX.2 |CI2
  #REPLACE INDEX.3 |CI3
  #REPLACE INDEX.4 |CI4
  #REPLACE INDEX.5 |CI5
  #REPLACE INDEX.6 |CI6
  #REPLACE INDEX.7 |CI7
  #REPLACE INDEX.8 |CI8
  #REPLACE INDEX.9 |CI9
  #REPLACE INDEX.10 |CI10
  #REPLACE INDEX.11 |CI11
  #REPLACE INDEX.12 |CI12
  #REPLACE INDEX.13 |CI13
  #REPLACE INDEX.14 |CI14
  #REPLACE INDEX.15 |CI15
  #REPLACE INDEX.BATCH |CI10
  #REPLACE RECNUM |CI0
  #REPLACE EXPORT_FILES 1
  #REPLACE EXPORT_ONLY 2
  #REPLACE SEQ_EXPORT 4
  #REPLACE INDIRECT_FILE.RECNUM |FS0,0&
  #REPLACE DESKTOP |CI2
  #REPLACE END_FUNCTION END_PROCEDURE
  #REPLACE PROCEDURE_RETURN FUNCTION_RETURN

  // These symbols are passed to the SYSCONF function to determine 
  // which OS specific item is returned.
  #REPLACE SYSCONF_TIMER_RESOLUTION     |CI0
  #REPLACE SYSCONF_DIR_SEPARATOR        |CI1
  #REPLACE SYSCONF_OS_SHORT_NAME        |CI2
  #REPLACE SYSCONF_OS_MAJOR_REV         |CI3
  #REPLACE SYSCONF_OS_MINOR_REV         |CI4
  #REPLACE SYSCONF_OS_NAME              |CI5
  #REPLACE SYSCONF_MACHINE_NAME         |CI6
  #REPLACE SYSCONF_FILE_MASK            |CI7
  #REPLACE SYSCONF_DATAFLEX_REV         |CI8

  #SET  N$ 2 // save 0,1 stacks for IF/ELSE
  #XPUSH !n $INIT
  #CHKSUB 0 1  // Verify the General Flex subsystem.
#ENDCOMMAND

#COMMAND FOR &ECFWGSNR#LU "FROM" %UGLR# "TO""" %UGL#
  #SET N$ !N
  #PUSH !R
  #XPUSH !n $INIT
  //MOVEINT !3 TO !1
  !A [] $082 !3 !1
  #IF (!0>3)
    // IF !1 LE !5 GOTO FOR$!r
    !A [] $4004 !1 !5 |11 |2
    !A [|11] $041 |CL0
    #FREF FOR$!r !a
  #ENDIF
  #$ !A 0 0 0 $041 |CL0
  #FREF END$!r !a
  #$ BEGIN$!r:
  #$ WHILE$!r:
  #IF !0=3
    #$ !A [] $083 !1
  #ELSE
    #$ !A [] $083 !1 !5
    #$ !A [|122] $041 |CL0
    #FREF END$!r !a
  #ENDIF
  FOR$!r:
#ENDCOMMAND

// FORMAT window {}
// FORMAT window THRU window {}

#COMMAND FORMAT RUVCFL#G
  #IF !0>2
    FORMAT$RANGE !1 !2 !3 !4 !5
  #ELSE
    #CHECK !2 _RVCFWL#BE
    #CHECK !3 .
    #FORMAT !1 !2
  #ENDIF
#ENDCOMMAND

#COMMAND FORMAT$RANGE ERUVCFL#G "THRU""THROUGH" ERUVCFL#G RVCFWL#B .
  #FORMAT !1 !4
  #IF (!1<!3)
    #SET Q$ !1
    FORMAT$RANGE |WS!Q THRU !3 !4
  #ENDIF
#ENDCOMMAND

#COMMAND FORMFEED &.    // just like PAGECHECK 500
  !A [] $203 |CI500 |CI0
#ENDCOMMAND

#COMMAND GET_ARGUMENT_SIZE "TO" _RUDCE#LGB .
  !A [] $24F !2
#ENDCOMMAND

#COMMAND GET_CURRENT_DIRECTORY "TO" _RUNRIDCE .
  !A [] $2D1 !2
#ENDCOMMAND

#COMMAND GET_ENVIRONMENT &RD#GOBLU "TO" _RCEUGOB# .
  !A [] $2CF !1 !3
#ENDCOMMAND

#COMMAND GOSUB &RVFWSNDE#G .
  #IFDEF !1
    !A [] $042 !1
  #ELSE
    !A [] $042 |CL0
    #FREF !1 !a
  #ENDIF
#ENDCOMMAND

#COMMAND GOTO &RVFWSNDE#G .
  #IFDEF !1
    !A [] $041 !1
  #ELSE
    !A [] $041 |CL0
    #FREF !1 !a
  #ENDIF
#ENDCOMMAND

#COMMAND GOTOXY &%#USGL %#USGLR .
  !A [] $145 !1 !2
#ENDCOMMAND

#COMMAND HELP &T .
  #IF !0>0
    #CHECK !1.N _U
    !A [] $1C5 !1.N
  #ELSE
    !A [] $1C5 |CI0
  #ENDIF
#ENDCOMMAND

#COMMAND IF LR
  #IFSAME !1 ~
    IFNOT !2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !1 STATUS
      INDCT$STATUS LASTIF STATUS !2
      IF$HELP !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
        INDCT$AS LASTIF AS !1 !2 !3
        IF$HELP  !4 !5 !6 !7 !8 !9
      #ELSE
        #IFCLASS !1 "G"
          INDCT$GROUP LASTIF GROUP ALL !1
        #ELSE
          INDCT$AS LASTIF AS !1
        #ENDIF
        IF$HELP !2 !3 !4 !5 !6 !7 !8 !9
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND IFNOT LR
  #IFSAME !1 ~
    IF !2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !1 STATUS
      INDCT$STATUS LASTIF~ STATUS !2
      IF$HELP !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
        INDCT$AS LASTIF~ AS !1 !2 !3
        IF$HELP  !4 !5 !6 !7 !8 !9
      #ELSE
        #IFCLASS !1 "G"
          INDCT$GROUP LASTIF~ GROUP ALL !1
        #ELSE
          INDCT$AS LASTIF~ AS !1
        #ENDIF
        IF$HELP !2 !3 !4 !5 !6 !7 !8    !9
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND IF_ LR // THIS IF_ WILL NOT WORK WITH ELSE!
  #IFSAME !1 ~
    IFNOT_ !2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !1 STATUS
      INDCT$STATUS LASTIF STATUS !2
      [LASTIF] !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
        INDCT$AS LASTIF AS !1 !2 !3
        [LASTIF] !4 !5 !6 !7 !8 !9
      #ELSE
        #IFCLASS !1 "G"
          INDCT$GROUP LASTIF GROUP ALL !1
        #ELSE
          INDCT$AS LASTIF AS !1
        #ENDIF
        [LASTIF] !2 !3 !4 !5 !6 !7 !8 !9
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND IFNOT_ LR // THIS IFNOT_ WILL NOT WORK WITH ELSE!
  #IFSAME !1 ~
    IF_ !2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !1 STATUS
      INDCT$STATUS LASTIF~ STATUS !2
      [LASTIF] !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
        INDCT$AS LASTIF~ AS !1 !2 !3
        [LASTIF] !4 !5 !6 !7 !8 !9
      #ELSE
        #IFCLASS !1 "G"
          INDCT$GROUP LASTIF~ GROUP ALL !1
        #ELSE
          INDCT$AS LASTIF~ AS !1
        #ENDIF
        [LASTIF] !2 !3 !4 !5 !6 !7 !8 !9
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND IF$HELP 
  !A [~LASTIF] $41 |CI0   // If LASTIF is false jump to end of IF command.
  #XPUSH 1 !a     // Save line number of jump at static nesting level.
  #XPUSH 0 !n     // Save nesting level in stack 0.
  !1 !2 !3 !4 !5 !6 !7 !8 !9
  #XPOP 0 Q$      // Restore nesting level into Q.
  #XPOP  1 S$     // Restore IF JUMP line number
  #XPUSH !q !s        // Push it back for the ELSE.
  #IF (!n>!q)     // after a begin
    #FREF END$!r !s    // Make IF JUMP goto end of begin block.
  #ELSE       // same or lower nesting level
    #FREF (!a+1) !s    // Make IF JUMP goto end of the IF.
  #ENDIF
#ENDCOMMAND

#COMMAND IFCHANGE R R
  #IFDEF !1
    #CHECK !1 _RFCVGE
    !A [] $1C6 !1
  #ELSE
    #CHECK !1.RECNUM _RWCVG
    !A [] $303 !1.RECNUM
  #ENDIF
  [|122] !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND


#COMMAND INCREMENT &#LCNSFWGRUE .
  !A [] $083 !1 |CI0
#ENDCOMMAND

#COMMAND INDCT$$0 &
  !A [] $4028 |CI0 |CI0 !1 !3
#ENDCOMMAND

#COMMAND INDCT$$1 &RX R .
  !A [] $4028 |CI0 |CI0 !1~ !3
#ENDCOMMAND

#COMMAND INDCT$AS &RX "AS" LU "$0""$1""$2""$3""$4""$5""MATCH""IN""" #LUG .
  #IF (!0<4)
    #IFCLASS !3 "G"
      #CHECK !4 ""     // INDICATE IND1 AS IND2
      #CHECK !3 _SNDI#LO
      !A [] $4020 !3 |GB[0] !1 |3
    #ELSE
      // INDICATE IND AS X          
      #CHECK !3 _U
      #IFTYPE  !3 "R"
        !A [] IN$5 !3 |CR0 !1 |3
      #ELSE
        #IFTYPE  !3 "ND"
          !A [] IN$5 !3 |CN0 !1 |1
        #ELSE
          #IFTYPE !3 "IL"
            !A [] IN$5 !3 |CI0 !1 |2
          #ELSE
            #IFTYPE !3 "S"
              !A [] IN$5 !3 |CS"" !1 |0
            #ELSE
              #CHECK !3 _O
              !A [] $4020 !3 |GB[0] !1 IN$GLALL |3
            #ENDIF
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF     
  #ELSE
    #CHECK !5 _R
    #IFSAME !4 MATCH
      !A [] $4031 !3 !5 !1 !6
    #ELSE
      #IFSAME !4 IN
        !A [] $4030 !3 !5 !1 !6
      #ELSE
        #CHECK !3 _U
        #IF2TYPE  !3 !5 "R"
          !A [] IN!4 !3 !5 !1 !6 |3
        #ELSE
          #IF2TYPE  !3 !5 "ND"
            !A [] IN!4 !3 !5 !1 !6 |1
          #ELSE
            #IF2TYPE !3 !5 "IL"
              !A [] IN!4 !3 !5 !1 !6 |2
            #ELSE
              !A [] IN!4 !3 !5 !1 !6 |0
            #ENDIF
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND INDCT$GROUP &XR "GROUP" R"ALL""ANY" CVFWSN#LRU "AND""OR""" "ANY""ALL""" CVFWSN#LU .
  #IF !0>4
    #CHECK !7 _R
    !A [] $4020 !4 !7 !1 IN$GL!3 IN$GR!6 IN$GM!5
  #ELSE
    !A [] $4020 !4 |GB[0] !1 IN$GL!3 |3
  #ENDIF
#ENDCOMMAND

#COMMAND INDCT$STATUS &R R #LWCV
  #IFDEF !3
    !A [] $4029 !3 |CI0 !1 !4
  #ELSE
    #CHECK !3.RECNUM U#LWCV
    !A [] $4029 !3.RECNUM |CI0 !1 !4
  #ENDIF
#ENDCOMMAND

#COMMAND INDEX_DEF R R#LGU "TO" #LGRNDCE #LGNDCE #LGNDCE
  #IFDEF !1
    !A [] $82 !1 FILENUMBER
  #ELSE
    #CHECK !1.RECNUM _UE
    #SET Q$ !1.RECNUM
    !A [] $82 |CI!q FILENUMBER
  #ENDIF
  !A [] $344 !2 !4 // index fields
  #IF !0>4
    !A [] $82 STRLEN !5 // number of fields
    #IF !0>5
      !A [] $349 !2 !6 // index attributes
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND INDICATE R
  #IFSAME !1 ~
    #IFDEF !2
    #ELSE
      #REPLACE !2 |!C
    #ENDIF
    INDICATE !2~ !3 !4 !5 !6 !7 !8 !9
  #ELSE
    // #CHECK !2 "AS""STATUS""$0""$1""GROUP"
    #IFDEF !1
      #CHECK !1 _X
    #ELSE
      #REPLACE !1 |!C
    #ENDIF
    INDCT$!2 !1 !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND INDICATOR RT
  #REPLACE !1 |!C
  #IF (!0>1)
    INDICATOR !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND INHERIT_SCREEN &.
  !A [] $14B
#ENDCOMMAND

#COMMAND INKEY #LUCRE &.
  !A [] $147 !1
#ENDCOMMAND

#COMMAND INKEY$ #LUCRE &.
  !A [] $149 !1
#ENDCOMMAND

#COMMAND INPUT &#ULGR #LUG #ULG .
  #IFCLASS !1 "C"
    #CHECK !2 _RCLUEG _RCLUG
    !A [] $142 !1
    // INPUT !2 !3
    !A [] $140 !2 !3 |CI79
  #ELSE
    #CHECK !1 _RCLUEG
    !A [] $140 !1 !2 |CI79
  #ENDIF
#ENDCOMMAND

#COMMAND INSERT #LGR "IN" #LGRCE "AT"""
  #IF (!0>3)
    #CHECK !5 #LGR%
    //MOVEINT !5 TO STRMARK
    !A [] $82 !5 STRMARK
  #ENDIF
  !A [] $24C !3 !1
#ENDCOMMAND

#COMMAND INTEGER TR
  // ALLOW FOR MORE INTS
  #REPLACE !1 |VI!D
  #IF (!0>1)
    INTEGER !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND IS_FILE_INCLUDED R R "TO"""
  !A [] $E0 !1 !2
  #IF !0>2
    #CHECK !4 _CUEGRL
    MOVE [FOUND] TO !4
  #ENDIF
#ENDCOMMAND

#COMMAND KEYCHECK
  !A [] $046
  #IF !0>0
    [KEYPRESS] !1 !2 !3 !4 !5 !6 !7 !8
  #ENDIF
#ENDCOMMAND

#COMMAND KEYPROC &R%WVF """GOSUB" WFVNSD# .
  #IFSAME !1 ON
    !A [] $82 |CI0 |VI33
  #ELSE
    #IFSAME !1 OFF
      !A [] $82 |CI9999 |VI33
    #ELSE
      #SET Y$ !a
      #IF (!0>1)
        // MOVEINT ADR(3) TO KEY LOC
        #SET Q$ (!1-100+40) // address in SYSINT
        #IFDEF !3
          !A [] $082 !3 |VI!q
        #ELSE
          !A [] $082 |CI0 |VI!q
          #FREF !3 !a
        #ENDIF
      #ELSE
        #SET Q$ (!1-100)
        #KEYPROC !q !Y
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND LEFT &#UGL$ "TO" #UEGRLC L#% .
  #IF !0>3
    !A [] $082 !4 STRMARK
  #ENDIF
  !A [] $241 !1 !3
#ENDCOMMAND

#COMMAND LENGTH &#LUG$ "TO" C#LREUG .
  !A [] $246 !1 !3
#ENDCOMMAND

#COMMAND LOCK &.
  !A [|120] $0C7
#ENDCOMMAND

#COMMAND LOOP &.
  #POP S$
  #CHECK BEGIN$!s _RVFWSNDEU
  !A [] $041 BEGIN$!s
  END$!s:
  #SET N$ !n-1
#ENDCOMMAND

#COMMAND MAKEDEF$   // make a list of symbols defined
  #IF !0>0
    #IFDEF !1
    #ELSE
      !1:
    #ENDIF
    #IF !0>1
      MAKEDEF$ !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND MAKE_FILE RU#LG U#LG U#LG .
  #IF !0>2
    !A [] $82 !3 FILENUMBER
  #ELSE
    !A [] $82 |CI0 FILENUMBER
  #ENDIF
  #IF !0>1
    !A [] $346 !1 !2
  #ELSE
    !A [] $346 !1 |CS''
  #ENDIF
#ENDCOMMAND

#COMMAND MEMORY #LRCUGE &.
  !A [] $2CA !1
#ENDCOMMAND

#COMMAND MID &#UGL$ "TO" #UGRLEC #L%U #L% .
  #IF !0>4
    !A [] $082 !5 STRMARK
  #ENDIF
  !A [] $082 !4 STRLEN
  !A [] $245 !1 !3
#ENDCOMMAND

#REM  The type of a move is determined at compile time, based on the 
#REM  type of the destination.  The move type refers to the intermediate
#REM  value to which the source will be converted.

#COMMAND MOVE #LU "TO" LEURC .
  #IFCLASS !1 "G"  // MOVE INDICATOR
    #CHECK !1 _VWFC
    !A [] $4020 !1 |GB[0] !3 IN$GLALL |3
  #ELSE
// Type independent move as of 2.3
    !A  [] $086 !1 !3
  #ENDIF
#ENDCOMMAND

#COMMAND MOVEDATE &%#GULI "TO" #UCIGER .
  !A [] $084 !1 !3
#ENDCOMMAND

#COMMAND MOVEINT &%#GULD "TO" #UCSDEGR .
  !A [] $082 !1 !3
#ENDCOMMAND

#COMMAND MOVENUM &#ULG "TO" #UCLGRE .
  !A [] $081 !1 !3
#ENDCOMMAND

#COMMAND MOVEREAL &#ULG "TO" #UCLGER .
  !A [] $085 !1 !3
#ENDCOMMAND

#COMMAND MOVESTR &#ULG$ "TO" #UCLGR$E .
  !A [] $080 !1 !3
#ENDCOMMAND

#COMMAND MULTI$     // repeat a command for each argument (internal)
  #IF !0>1
    !1 !2
  #ENDIF
  #IF !0>2
    MULTI$ !1 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND MULTIBACK$ // same as above, except that arguments
  #IF !0>2        // are output in reverse order
    MULTIBACK$ !1 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
  #IF !0>1
    !1 !2
  #ENDIF
#ENDCOMMAND

#COMMAND NAME R#L T
  #IFDEF !1
    #REPLACE !2 !1
    #CHECK !3 .
  #ELSE
    #IFCLASS !1.1 "W"
      AUTOPAGE !1
    #ELSE
      AUTO3$ #REPLACE !1 PAGE!f
    #ENDIF
    #IF !0>1
      NAME !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND NUMBER TR
  #NUM V$
  #REPLACE !1 |VN!v
  #IF (!0>1)
    NUMBER !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND ON R "GOTO""GOSUB""OFF" SNOBIODE
  #IFSAME !1 ERROR
    // MOVEINT ADDR to ONERROR (|VI31)
    #IFDEF !3
      !A [] $082 !3 |VI31
      #CHECK !2 "GOSUB"
    #ELSE
      !A [] $082 |CI0 |VI31
      #IFSAME !2 GOSUB
        #FREF !3 !a
      #ELSE
        #CHECK !2 "OFF"
      #ENDIF
    #ENDIF
  #ELSE
    #SET Q$ (!0-1)
    // INDICATE OK$1 AS !1 GT 0
    #IFDEF OK$1
    #ELSE
      #REPLACE OK$1 |!C
      #REPLACE OK$2 |!C
    #ENDIF
    #CHECK !1 _#ULGRS
    !A [] $4010 !1 |CI0 OK$1 |2
    // INDICATE OK$2 AS !1 LT !q
    !A [] $4000 !1 |CI!q OK$2 |2
    #SET Q$ (!a+2)
    #IFSAME !2 GOTO
      !A [OK$1 OK$2] $041 |CE(!q+!1 )
    #ELSE
      !A [OK$1 OK$2] $042 |CE(!q+!1 )
    #ENDIF
    #SET Q$ (!a+!0)
    !A [] $041 |CL!q  //ERROR jump around GOTOs
    MULTI$ GOTO !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#REM OPEN FILENAME INDEX
#REM OPEN "STRING" AS FILENAME INDEX

#COMMAND OPEN
  #IFSAME !2 AS
    #IFDEF !3.RECNUM
    #ELSE
      #INCLUDE !3.FD
      #SET Q$ !3.RECNUM
      #REPLACE !3.FILE_NUMBER |CI!q
    #ENDIF
    #CHECK !3 _TR
    #CHECK !1 _#LG
    #CHECK !5 . 
    #CHECK !3.RECNUM _URW#LG
    #IF (!0>3)
      #CHECK !4 _DGLOBU#
      MOVEINT !4 TO FIELDNUMBER
      !A [] $182 !3.RECNUM !1
    #ELSE
      MOVEINT |CI0 TO FIELDNUMBER
      !A [] $182 !3.RECNUM !1
    #ENDIF
  #ELSE
    #CHECK !3 . 
    #IFDEF !1.RECNUM
    #ELSE
      #INCLUDE !1.FD
      #SET Q$ !1.RECNUM
      #REPLACE !1.FILE_NUMBER |CI!q
    #ENDIF
    #CHECK !1.RECNUM _URW#LG
    #IF (!0>1)
      #CHECK !2 FWSNDELG#U
      !A [] $180 !1.RECNUM !2
    #ELSE
      !A [] $180 !1.RECNUM |CI0
    #ENDIF
  #ENDIF
#ENDCOMMAND

#REM OS$CALL makes a system BDOS call.  Only calls that can be passed
#REM integer (not pointer) values can be used.  Use at your own risk!
#REM Format of command:
#REM OS$CALL <FUNCTION> <ARGUMENT> {TO <RESULT>}
#REM <FUNCTION>    - BDOS function code - See O/S documentation.
#REM <ARGUMENT>    - Integer value to pass with function (optional)
#REM <RESULT>      - Result code returned by function

#REM Example to set CP/M I/O byto to "NEW_IO_BYTE (integer):
#REM OS$CALL 8 NEW_IO_BYTE

#REM Example to get console status:
#REM OS$CALL 12 0 TO CONSTAT //integer

#COMMAND OS$CALL &#LRU%DG #L%UG "TO""" #LCGUE .
  !A [] $2C8 !1 !2
  #IF !0>3
    //MOVEINT STRMARK TO !4
    !A [] $82 STRMARK !4
  #ENDIF
#ENDCOMMAND

#COMMAND OUTCLOSE &.
  // OUTFILE 'CON:'
  !A [] $200 |CS'CON:'
#ENDCOMMAND

#COMMAND OUTFILE &NDILU#G .
  !A [] $200 !1
#ENDCOMMAND

#COMMAND OUTPUT 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
    OUTPUT !3 
  #ELSE
    #CHECK !2 .
    #IF !0>0
      #CHECK !1.N _#LUGFV
      !A [] $202 !1.N
    #ELSE
      !A [] $202 |VI9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND OUTPUT_WRAP R
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
    OUTPUT_WRAP !3 
  #ELSE
    #CHECK !2 .
    #CHECK !1.N _#LUGFV
    !A [] $20A !1.N // Fill wrap fields and set |122 if empty
    OUTPUT !1
    [NOT |122] BLANKFORM !1
    !A [NOT |122] $20A !1.N
    [NOT |122] REPEAT
    #IFDEF NEWPAGE
      PAGECHECK !1.LINES
      [PAGEBREAK] GOSUB NEWPAGE
    #ENDIF
    OUTPUT !1
    !A [] $20A !1.N // get more from wrap fields
    [NOT |122] LOOP
  #ENDIF
#ENDCOMMAND

#COMMAND PAD &#ULG$ "TO" #ULGRCE L%# .
  #IF !0>3
    !A [] $082 !4 STRMARK
  #ENDIF
  !A [] $240 !1 !3
#ENDCOMMAND

#COMMAND PAGE R%
  #IFSAME !1 SET
    #IF !0>1
      //  Set attributes for future use
      #CHECK !2.N _RU#LG
      MOVE !2.N TO STRMARK
      FIND$PAGE !3 !4 !5
      FIND$PAGE !6 !7 !8
    #ELSE
      //  Page an image named SET immediately
      !A [] $1C0 !1.N
    #ENDIF
  #ELSE
    #IF !0>1
      //  Set attributes for use now
      #CHECK !1.N _RU#LG
      MOVE !1.N TO STRMARK
      FIND$PAGE !2 !3 !4
      FIND$PAGE !5 !6 !7
    #ENDIF
    //  Put image with new attributes on screen now
    //  OR, put regular image on screen now.
    !A [] $1C0 !1.N
  #ENDIF
#ENDCOMMAND

#COMMAND PAGECHECK &#LG% .
  #IFDEF !1  |CI0
    !A [] $203 !1 |CI0
  #ELSE
    #CHECK !1.LINES _VFWU#LG
    !A [] $203 !1.LINES |CI0
  #ENDIF
#ENDCOMMAND

#COMMAND POS &#UGRL$ "IN" #UGRL$ #L% #L% .
  !A [] $244 !1 !3
  #IF !0>3
    #CHECK !4 "TO"
    #CHECK !5 _RCEUL
    !A [] $082 STRMARK !5
  #ENDIF
#ENDCOMMAND

#COMMAND PRINT #L
  #IF !0>2
    #IF !0>3
      #FORMAT !3 !4
      #CHECK !4 _CVFW#L
    #ENDIF
    #CHECK !2 "TO"
    #CHECK !3 _CVF#L
    #IFTYPE !3 "IND"
      !A [] $206 !1 !3
    #ELSE
      #IFTYPE !3 "R"
        !A [] $208 !1 !3
      #ELSE
        !A [] $205 !1 !3
      #ENDIF
    #ENDIF
  #ELSE
    AUTO4$ PRINT !1 TO PAGE!f !2
  #ENDIF
#ENDCOMMAND

#COMMAND PRINT_WRAP #L
  #IF !0>2
    #IF !0>3
      #FORMAT !3 !4
      #CHECK !4 _CVFW#L
    #ENDIF
    #CHECK !2 "TO"
    #CHECK !3 _CVF#L
    #IFCLASS !1 "F"
      !A [] $209 |CS"DBMS:!1" !3 // assign seq file to wrap window.
    #ELSE
      !A [] $209 !1 !3
    #ENDIF
  #ELSE
    AUTO4$ PRINT_WRAP !1 TO PAGE!f !2
  #ENDIF
#ENDCOMMAND

#COMMAND RE$ T  // re-find all files listed by record number if multiuser
  #CHECK !1.RECNUM _RUWG
  !A [|120] $C0 !1.RECNUM |CI2    // |120 is multiuser flag.
  !A [|120 FINDERR] $047 |CI25 |CS"!1"
  #IF !0>1
    RE$ !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND READ 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI0 !2
    #IF !0>2
      #CHECK !3 _ULEC
      READ !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    !A [] $108 !1
    #IF !0>1
      #CHECK !2 _ULEC
      READ !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND READLN 
  #IFSAME !1 CHANNEL
    #CHECK !3 _ULE
    !A [] $10A |CI0 !2
    READLN !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IF !0=0
      !A [] $104 |CS''
    #ENDIF
    #IF !0=1
      !A [] $104 !1
    #ENDIF
    #IF !0>1
      #CHECK !1 _ULE
      !A [] $108 !1
      READLN !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND READ_BLOCK 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI0 !2
    #IF !0>2
      #CHECK !3 _ULE
      #CHECK !4 _RU
      !A [] $109 !3 !4
    #ENDIF
  #ELSE
    #CHECK !1 _ULEC
    #CHECK !2 _RU
    !A [] $109 !1 !2
  #ENDIF
#ENDCOMMAND

#COMMAND READ_DFINI &#LGOBDR .
  !A [] $14C !1
#ENDCOMMAND

#COMMAND REAL TR
  #REAL V$
  #REPLACE !1 |VR!v
  #IF (!0>1)
    REAL !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND REGISTRATION &#RLUGCE #LUGEC .
  !A [] $307 !1 !2
#ENDCOMMAND

#COMMAND RELATE CVWR#LGR
  #IFDEF !1
    !A [] $C4 !1
  #ELSE
    #CHECK !1.RECNUM _CVWLR#GU
    !A [] $C4 !1.RECNUM
  #ENDIF
  #IF !0>1
    RELATE !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND RENAMEFILE &#LGU "TO" R#LGU .
  !A [] $2C2 !1 !3
#ENDCOMMAND

#COMMAND REPEAT &.
  #SET N$ !N
  #PUSH !R
  #XPUSH !n $INIT
  #IFIND // INCLUDE JUMPS IF INDICATORS ON LINE
  // GOTO BEGIN$!r
  !A [] $041 |CL0
  #FREF BEGIN$!r !a
  #$ !A 0 0 0 $041 |CL0
  #FREF END$!r !a
  #ENDIF
  #$ WHILE#!r:
  #$ BEGIN$!r:
#ENDCOMMAND



#COMMAND REPLACE #LG "IN" #LGCE "WITH" #LRG
  #IFIND 
    [] BEGIN
    POS !1 IN !3 TO STRMARK
    #$ [FOUND] MOVESTR (REPLACE(!1,!3,!5)) TO !3
    END
 #ELSE
    POS !1 IN !3 TO STRMARK
    [FOUND] MOVESTR (REPLACE(!1,!3,!5)) TO !3
 #ENDIF
#ENDCOMMAND

#COMMAND REPORT T "BY""DOWN" VFW%LGR "BREAK"""
  #CHECK !1.RECNUM _UVCWGL
  INTEGER RECCOUNT
  #SET P$ 0
  //          MOVEINT 20000 TO LINECOUNT  // start with a full page
  !A [] $82 |CI20000 |VI10
  //          MOVE 0 TO RECCOUNT
  !A [] $82 |CI0 RECCOUNT
  //          BREAKINIT           // init breakpoints
  !A [] $207
  //          INDICATE FIRSTREC TRUE      // used for subtotals
  #IFDEF FIRSTREC
  #ELSE
    #REPLACE FIRSTREC |!C
  #ENDIF
  !A [] $4028 |CI0 |CI0 FIRSTREC~
  #IFSAME !2 BY
    FIND GE !1 BY !3          // FIND first record
  #ELSE
    FIND LE !1 BY !3
  #ENDIF
  [~FOUND] GOTO END$OF$REPORT
  //          CLEARSCREEN         // start with a clear screen
  !A [] $144
  RPT.LOOP://   INDICATE SELECT TRUE      // default for SELECT
  #IFDEF SELECT
  #ELSE
    #REPLACE SELECT |!C
  #ENDIF
  !A [] $4028 |CI0 |CI0 SELECT~
  //          GOSUB RPT.SELECTION     // go to user selection
  !A [] $42 |CL0
  #FREF RPT.SELECTION !a
  //[NOT SELECT] GOTO RPT.CONT        // test SELECT
  !A [~ SELECT] $41 |CL0
  #FREF RPT.CONT !a
  BREAK$ !5 !6 !7 !8 !9       // set breakpoints
  #SET X$ !p                  // set up to break down
  [NOT FIRSTREC] BREAK$DOWN RPT.SUBTOTAL  // break down for SUBTOTAL
  #SET X$ 0               // set up to break up
  //          RELATE !1           // get related records
  !A [] $C4 !1.RECNUM
  BREAK$UP RPT.SUBHEADER      // break up for SUBHEADER
  //          INCREMENT RECCOUNT
  !A [] $083 RECCOUNT |CI0
  //          GOSUB RPT.BODY          // print body
  !A [] $42 |CL0
  #FREF RPT.BODY !a
  //          INDICATE FIRSTREC FALSE     // not first any more
  !A [] $4028 |CI0 |CI0 FIRSTREC
  RPT.CONT:
  #IFSAME !2 BY
    FIND GT !1 BY !3          // FIND next record
  #ELSE
    FIND LT !1 BY !3
  #ENDIF
  //          KEYCHECK            // check keyboard
  !A [] $46
  //[FOUND NOT KEYPRESS] GOTO RPT.LOOP    // if ok, loop
  !A [FOUND ~ KEYPRESS] $41 RPT.LOOP
  //[KEYPRESS]  GOSUB RPT.KEYPRESS    // user can disable KEYPRESS
  !A [FOUND KEYPRESS]   $42 |CL0
  #FREF RPT.KEYPRESS !a
  !A [FOUND ~ KEYPRESS] $41 RPT.LOOP
  #SET X$ !p                  // set up for break down
  END.OF.REPORT:
  [~ FIRSTREC]  BREAK$DOWN RPT.SUBTOTAL $X    // break down for last subtotals
  //[FIRSTREC]  GOSUB RPT.TOTAL       // print TOTAL
  !A [~ FIRSTREC] $42 |CL0
  #FREF RPT.TOTAL !a
  //          GOTO END$OF$REPORT      // GOTO end
  !A [] $41 |CL0
  #FREF END$OF$REPORT !a
  NEWPAGE://    GOSUB RPT.HEADER      // new page, print HEADER
  !A [] $42 |CL0
  #FREF RPT.HEADER !a
  #SET X$ 0    // this will reprint the page headers if included //
  [NOT FIRSTREC] BREAK$PRT SUBHEADER      // reprint pages
  //          RETURN              // end of NEWPAGE
  !A [] $43 |CI0
  RPT.SELECTION:              // selection starts after REPORT
#ENDCOMMAND

#COMMAND REPORTEND .         // end of REPORT
  MAKEDEF$ RPT.HEADER RPT.SELECTION RPT.BODY RPT.TOTAL
  #SET X$ 0
  BREAK$T3
  // RETURN
  !A [] $43 |CI0
  #IFDEF RPT.KEYPRESS
  #ELSE
    RPT.KEYPRESS:
    // STRING AKEY$ 1
    #IFDEF AKEY$
    #ELSE
      #STR V$ 1
      #REPLACE AKEY$ |VS!v
    #ENDIF
    // SHOWLN 'A KEY HAS BEEN PRESSED.'
    !A [] $142 |CS'A KEY HAS BEEN PRESSED.'
    !A [] $143
    // SHOW   'DO YOU WANT TO STOP THE REPORT (Y or N)? '
    !A [] $142 |CS'DO YOU WANT TO STOP THE REPORT (Y or N)? '
    // INKEY AKEY$
    !A [] $147 AKEY$
    !A [] $141 AKEY$
    // IF NOT AKEY$ IN 'Yy' RETURN RPT.LOOP
    INDCT$AS SELECT AS AKEY$ IN 'Yy'
    [~ SELECT] RETURN RPT.LOOP
    RETURN END$OF$REPORT  // Necessary to pop stack
  #ENDIF
  END$OF$REPORT:
#ENDCOMMAND

#COMMAND REREAD
  #IF !0=0
    !A [|120] $0C9
  #ELSE
    !A [|120] $0C7
    RE$ !1 !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND RETURN VFWNDE#G
  #IF !0=0
    !A [] $043 |CL0
  #ELSE
    #IFSAME !1 RETURN
      #SET Q$ (!a+2)
      !A [] $043 |CL!q // RETURN RETURN
      RETURN !2 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFDEF !1
        #CHECK !1 _S
        #CHECK !2 .
        !A [] $043 !1
      #ELSE
        !A [] $043 |CL0
        #FREF !1 !a
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND RIGHT &#UGRL$ "TO" #UGRLEC L#% .
  #IF !0>3
    !A [] $082 !4 STRLEN
  #ENDIF
  !A [] $242 !1 !3
#ENDCOMMAND

#COMMAND RUNPROGRAM_PIPE #RLGU #RLGU #RLGU .
    !A [] $2D6 !3    // Specify the object to receive MSG_INSERT
                     // with the output from the pipe.
    !A [] $2D7 !1 !2 // Execute the OS command with any arguments.
#ENDCOMMAND

#COMMAND RUNPROGRAM #RLG #LGU #LGU #LGU .
    #IFSAME !1 WAIT BACKGROUND
	#IF !0>3
		#ERROR 162 TOO MANY ARGUMENTS TO RUNPROGRAM !1
	#ELSE
	    #IFSAME !1 WAIT
        	!A [] $2CC !2 !3
            #ELSE // BACKGROUND
	        !A [] $2CD !2 !3   
            #ENDIF
	#ENDIF
    #ELSE 
        // Number of args is checked by type checking of command for PIPE.
	#IFSAME !1 PIPE
	    #IF !0<4
	        RUNPROGRAM_PIPE !2 "" !3 !4 !5 !6 !7 !8 !9
	    #ELSE
	        RUNPROGRAM_PIPE !2 !3 !4 !5 !6 !7 !8 !9
	    #ENDIF 	
	#ELSE // Plain RUNPROGRAM.
	    #IF !0>2
	        #ERROR 162 TOO MANY ARGUMENTS TO RUNPROGRAM
	    #ELSE
                !A [] $2C0 !1 !2
	    #ENDIF
	#ENDIF
    #ENDIF
#ENDCOMMAND

#COMMAND SAVE CVWR#LGE
  #IFDEF !1
    !A [] $C5 !1
    !A [] $C2 !1
  #ELSE
    #CHECK !1.RECNUM _CLVWLR#GU
    !A [] $C5 !1.RECNUM
    !A [] $C2 !1.RECNUM
  #ENDIF
  #IF !0>1
    SAVE !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND SAVERECORD CVWR#LGE
  #IFDEF !1
    !A [] $C2 !1
  #ELSE
    #CHECK !1.RECNUM _CVWLR#GU
    !A [] $C2 !1.RECNUM
  #ENDIF
  #IF !0>1
    SAVERECORD !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND SCREENMODE #%LGR # .
  #IFSAME !1 ON
    !A [] $148 |CE(458752)     // SCREENMODE on 0x70000
  #ELSE
    #IFSAME !1 OFF
      !A [] $148 |CE(196608)       // SCREENMODE off 0x30000
    #ELSE
      #CHECK !1 _U
      !A [] $148 !1 
    #ENDIF
  #ENDIF
  #IF !0>1
    SCREENMODE !2
  #ENDIF
#ENDCOMMAND

#COMMAND SECTION &RT #LGU .
  #IFSAME !1 SELECTION            // SELECTION is null SECTION
  #ELSE
    // RETURN                   // RETURN from last routine
    !A [] $43 |CI0
    RPT.!1:                 // label SECTION
    #IFDEF !2       // LINES REQ SPEC
      // PAGECHECK !2
      !A [] $203 !2
      // [PAGEBREAK] GOSUB NEWPAGE
      !A [PAGEBREAK] $42 NEWPAGE
      #IFDEF !1.LINES   
        #SET F$ !1.N
        #SET E$ 0
      #ENDIF
    #ELSE
      #IFDEF !1.LINES                 // is there a page?
        // PAGECHECK !1.LINES           // check for end of page
        !A [] $203 !1.LINES |CI0
        //[PAGEBREAK] GOSUB NEWPAGE     // if end, GOSUB NEWPAGE
        !A [PAGEBREAK] $42 NEWPAGE
        // AUTOPAGE !1              // start default page
        #SET F$ !1.N
        #SET E$ 0
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND SET_ARGUMENT_SIZE &#LGRBOUSD .
  !A [] $24E !1
#ENDCOMMAND

#COMMAND SET_DFPATH "TO" &#LGRBOUD .
  !A [] $2D0 !2
#ENDCOMMAND

#COMMAND SET_CHANNEL_POSITION  &#LRUG$ "TO" &#LRUG$ .
  !A [] $10C !1 !3
#ENDCOMMAND

#COMMAND SET_OPTION #LGR . // Sets window options
  #IFCLASS !1 _C         // To stay on perminantly until
    #SET Q$ !1         // Turned off with CLEAR_OPTION.
    !A [] $04A |CI!q |CI0     // SET_OPTION NO_CALC // Turn off calculate.
  #ELSE
    !A [] $04A !1 |CI0    // .
  #ENDIF             
#ENDCOMMAND

#COMMAND SET_RELATE &#LGOBRWCV "TO" #LGOBRWCV . 
  !A [] $348 !1 !3
#ENDCOMMAND

#COMMAND SET_TERMLIST &#LGOBDR #LGOBDIN . 
  !A [] $14A !1 !2
#ENDCOMMAND

#COMMAND SETCHANGE &RCVF%G .
  !A [] $1C7 !1
#ENDCOMMAND

#COMMAND SHOW #ULRG$
  !A [] $142 !1
  #IF (!0>1)
    SHOW !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND SHOWLN #LGU$
  #IF (!0>0)
    SHOW !1 !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
  !A [] $143
#ENDCOMMAND

#COMMAND SLEEP #LGURDBO .
  !A [] $02CE !1
#ENDCOMMAND

#COMMAND STATUS$ &CVW#LG "TO" #LUGRE
  #IFDEF !1
    !A [] $304 !1 !3
  #ELSE
    #CHECK !1.RECNUM _CVWLR#GU
    !A [] $304 !1.RECNUM !3
  #ENDIF
#ENDCOMMAND

#COMMAND STOP &.
  !A [] $144
  !A [] $040
#ENDCOMMAND

#COMMAND STRING TR E#L%
  #IF (!0>1)
    #IFDEF !2
      #CHECK !2 _VSWDF
      #STR V$ !2
      #REPLACE !1 |VS!v
      #IF (!0>2)
        STRING !3 !4 !5 !6 !7 !8 !9
      #ENDIF
    #ELSE
      #STR V$ 80
      #REPLACE !1 |VS!v
      STRING !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    #STR V$ 80
    #REPLACE !1 |VS!v
  #ENDIF
#ENDCOMMAND

#COMMAND SUBTOTAL RFVC#LSD
  PRINT !1% !2 !3 !4 !5
  !A [] $082 |CI0 !1%
#ENDCOMMAND

#REM Get system date, hour, min, seconds.
#REM WILL NOT WORK UNDER CPM 2.2

#COMMAND SYSDATE &#ERCUGL #ECUGL #ECUGL #ECUGL . // SYSDATE DATE HR MIN SECOND
  !A [] $2C9 !1
  #IF !0>1
    //MOVE STRLEN TO !2
    !A [] $82 STRLEN !2
  #ENDIF
  #IF !0>2
    //MOVE STRMARK TO !3
    !A [] $82 STRMARK !3
    #IF !0>3
      //MOVE |VI37 TO !4
      !A [] $82 |VI37 !4
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND SYSTEM &.
  !A [] $2C7
#ENDCOMMAND

#COMMAND TRIM &#LUG$ "TO" C#ELRUG .  // remove pre- and trailing spaces
  !A [] $24B !1 !3
#ENDCOMMAND

#COMMAND UNLOCK &.
  !A [|120] $0C8
#ENDCOMMAND

#COMMAND UNTIL R L L L .
  #POP S$
  IFNOT_ !1 !2 !3 !4 GOTO BEGIN$!s
  END$!s:
  #SET N$ !n-1
#ENDCOMMAND

#COMMAND UPPERCASE &C#LUGRND$ "TO""" C#LUG$END .
  #IF !0>1
    !A [] $249 !1 !3
  #ELSE
    !A [] $249 !1 !1
  #ENDIF
#ENDCOMMAND

#COMMAND WHILE R L L L .
  #SET N$ !N
  #PUSH !R
  #XPUSH !n $INIT
  // GOTO WHILE$!r
  !A [] $041 |CL0
  #FREF WHILE$!r !a
  #$ !A 0 0 0 $041 |CL!a
  #FREF END$!r !a
  #$ WHILE$!r:
  #$ BEGIN$!r:
  #$ IFNOT_ !1 !2 !3 !4 GOTO END$!r
#ENDCOMMAND

#COMMAND WRITE$STR #ULRG$
    !A [] $106 !1
    #IF (!0>1)
      WRITE$STR !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
#ENDCOMMAND

#COMMAND WRITE 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
    #IF !0>2
      WRITE$STR !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    #IF (!0>0)
      WRITE$STR !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND WRITELN 
  #IFSAME !1 CHANNEL
    !A [] $10A |CI1 !2
    #IF !0>2
      WRITE$STR !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    #IF (!0>0)
      WRITE$STR !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
  !A [] $107
#ENDCOMMAND

#COMMAND ZEROFILE $RT .
  #IFDEF !1.RECNUM
    #SET Q$ !1.RECNUM
    !A [] $308 |CI!q
  #ELSE
    #CHECK !1 _SG#L
    !A [] $308 !1
  #ENDIF
#ENDCOMMAND

#COMMAND SOUND &_L#RUG .
  !A [] $395 !1  // .
#ENDCOMMAND

#COMMAND GRAPHIC "ON""OFF" GDLOB# GNDIELOB# .
  #IFSAME !1 ON
    !A [] $382 !2 !3        //cmdgraphon mode device
  #ELSE
    !A [] $383 !2 |CN0      //cmdgraphoff
  #ENDIF
#ENDCOMMAND

#COMMAND GRXY &GDLOB# RGDLOB# .
  !A [] $384 !1 !2        //cmdgraphxy row column
#ENDCOMMAND

#COMMAND GET_GRXY &#GDLOBCE R#GDLOBCE .
  !A [] $38C !1 !2        //cmdgraphgetpos row column
#ENDCOMMAND

#COMMAND GET_CHANNEL_POSITION &#LRUG$ "TO" &#LRUG$EC .
  !A [] $10B !1 !3
#ENDCOMMAND

#COMMAND CIRCLE R#GDLOB R#GDLOB R#GDLOB #GDLOB .
  #IF !0>3
    SCREENMODE !4
  #ENDIF
  !A [] $384 !1 !2        //cmdgraphxy row column
  #IF !0>3
    !A [] $388 !3           //cmdgraphfcircle radius
  #ELSE
    !A [] $390 !3           //cmdgraphcircle radius
  #ENDIF
#ENDCOMMAND

#COMMAND BOX R#GDLOB R#GDLOB R#GDLOB R#GDLOB #GDLOB .
  #IF !0>4
    SCREENMODE !5
  #ENDIF
  !A [] $381 !1 !2        //cmdgraphtmp row1 column1
  !A [] $387 !3 !4        //cmdgraphbox row2 column2
#ENDCOMMAND

#COMMAND BAR R#GDLOB R#GDLOB R#GDLOB R#GDLOB #GDLOB .
  #IF !0>4
    SCREENMODE !5
  #ENDIF
  !A [] $381 !1 !2        //cmdgraphtmp row1 column1
  !A [] $391 !3 !4        //cmdgraphbox row2 column2
#ENDCOMMAND

#COMMAND LINE R#GDLOB R#GDLOB #GDLOB .
  #IF !0>2
    SCREENMODE !3
  #ENDIF
  !A [] $385 !1 !2        //cmdgraphline end_row end_column
#ENDCOMMAND

#COMMAND PLOT R#GDLOB R#GDLOB #GDLOB .
  #IF !0>2
    SCREENMODE !3
  #ENDIF
  !A [] $386 !1 !2        //cmdgraphplot row column
#ENDCOMMAND

#COMMAND PIE R#GDLOB R#GDLOB R#GDLOB R#GDLOB #GDLOB .
  #IF !0>4
    SCREENMODE !5
  #ENDIF
  !A [] $381 !1 !2        //cmdgraphtmp radius arc1
  !A [] $389 !3 !4        //cmdgraphpie arc2 fill_color
#ENDCOMMAND

#COMMAND ARC R#GDLOB R#GDLOB R#GDLOB #GDLOB .
  #IF !0>3
    SCREENMODE !4
  #ENDIF
  !A [] $381 !1 !2        //cmdgraphtmp radius arc1
  !A [] $38A !3           //cmdgrapharc arc2 
#ENDCOMMAND

#COMMAND ELLIPSE R#GDLOB R#GDLOB #GDLOB .
  #IF !0>2
    SCREENMODE !3
  #ENDIF
  !A [] $38B !1 !2        //cmdgraphellipse RADIUS ASPECT
#ENDCOMMAND

#COMMAND FLOOD &R#GDLOB .
  !A [] $3A0 !1           //cmdgraphflood color
#ENDCOMMAND

#COMMAND PALETTE &#GDLOB R#GDLOB .
  !A [] $38E !1 !2        //cmdgraphpalette background palette
#ENDCOMMAND

#COMMAND GR_PRINT &#GDLOBI .
  !A [] $392 !1
#ENDCOMMAND

#COMMAND SET_LINE_STYLE &GDLOB# GDLOB# .
  !A [] $3A1 !1 !2            //cmdsetlnstyle STYLE WIDTH
#ENDCOMMAND

#COMMAND SET_TEXT &#GDLOB R#GDLOB .
  !A [] $394 !1 !2            //cmdsettext SIZE ROTATION
#ENDCOMMAND

#COMMAND DISPLAY_GRAPHIC &R#GDLOBI .
  !A [] $397 !1
#ENDCOMMAND

#COMMAND SAVE_GRAPHIC &R#GDLOBI .
  !A [] $396 !1
#ENDCOMMAND

#COMMAND SAVE_CUT #GDLOBNIE #GDLOB #GDLOB #GDLOB R#GDLOB
  #IFSAME !1 DBMS
    SAVE_CUT |CS"DBMS:!2" !3 !4 !5 !6
  #ELSE
    GRXY !2 !3            //Start x and y
    !A [] $381 !4 !5      //End x and y
    !A [] $3A3 !1
  #ENDIF
#ENDCOMMAND

#COMMAND DISPLAY_CUT #GDLOBNI #GDLOB R#GDLOB #GDLOB
  #IFSAME !1 DBMS
    DISPLAY_CUT |CS"DBMS:!2" !3 !4 !5 !6
  #ELSE
    !A [] $381 !2 !3      //Display at x and y
    !A [] $3A2 !1 !4      //cmdgetcut CUT_NAME MODE
  #ENDIF
#ENDCOMMAND

#COMMAND SETWORLD &#GDLOB #GDLOB #GDLOB R#GDLOB .
  !A [] $381 !1 !2        //cmdgraphtmp LOWER LEFT
  !A [] $398 !3 !4        //setworld UPPER RIGHT
#ENDCOMMAND

#COMMAND GETDRANGE &E#GDLOBC ER#GDLOBC .
  !A [] $399 !1 !2
#ENDCOMMAND

#COMMAND GRAPH_INIT &.
  !A [] $39A
#ENDCOMMAND

#COMMAND GRAPH_VALUE &#GDLOB R#GDLOB .
  !A [] $39B !1 !2
#ENDCOMMAND

#COMMAND GRAPH_SUM &#GDLOBC R#GDLOBC .
  !A [] $39C !1 !2
#ENDCOMMAND

#COMMAND GRAPH_STAT &E#GDLOBC ER#GDLOBC .
  !A [] $39D !1 !2
#ENDCOMMAND

#COMMAND GRAPH_GETFIRST #GDLOBIENC ER#GDLOBC .
  !A [] $39E !1 !2
#ENDCOMMAND

#COMMAND GRAPH_GETNEXT #GDLOBCIENC ER#GDLOBC .
  !A [] $39F !1 !2
#ENDCOMMAND

#COMMAND ASPECT R#GDLOBCE #GDLOB .
  !A [] $3A5 !1 !2
#ENDCOMMAND

#COMMAND CHART_INIT .
  #IFDEF GRAPH$NUM
  #ELSE
    string  graph$label graph$title graph$ytitle graph$xtitle
    real    total$value min$value max$value value$
    real    radius mid$radian last$radian radian value$step
    integer text$size text$center graph$num num$values bar$width bar$space
    integer lower$left$x lower$left$y upper$right$x upper$right$y axis$base
    integer last$x last$y dev$x dev$y label$color chart$color axis$color gr$tmp
    indicator bar$chart line$chart pie$chart
    move 1 to label$color
    move 1 to chart$color
    move 1 to axis$color
  #ENDIF
  graph_init
  indicate bottom$label true
#ENDCOMMAND

#COMMAND CHART "BAR""LINE""PIE" 
  #IFSAME !1 BAR
    indicate bar$chart true
  #ENDIF
  #IFSAME !1 LINE
    indicate line$chart true
  #ENDIF
  #IFSAME !1 PIE
    indicate pie$chart true
  #ENDIF
  #IF (!0>1)
    trim !2 to graph$title
  #ELSE
    move '' to graph$title
  #ENDIF
  #IFSAME !1 PIE
  #ELSE
    #IF (!0>2)
      trim !3 to graph$ytitle
    #ELSE
      move '' to graph$ytitle
    #ENDIF
  #ENDIF
  #IFSAME !1 PIE
  #ELSE
    #IF (!0>3)
      trim !4 to graph$xtitle
    #ELSE
      move '' to graph$xtitle
    #ENDIF
  #ENDIF
  move |VI34 to |VI35
  gosub do$chart
  screenmode |VI35
  #IFSAME !1 BAR
    indicate bar$chart false
  #ENDIF
  #IFSAME !1 LINE
    indicate line$chart false
  #ENDIF
  #IFSAME !1 PIE
    indicate pie$chart false
  #ENDIF

  #IFDEF DO$CHART
  #ELSE
    goto do$chart$end

    do$chart:
    graph_sum total$value num$values
    graph_stat min$value max$value
    gosub sc$init
    gosub calc$value
    gosub draw$axis
    indicate first$value true
    for graph$num from 1 to num$values
      [first$value]  graph_getfirst graph$label value$
      [~first$value] graph_getnext graph$label value$
      trim graph$label to graph$label
      [bar$chart] gosub graph$bar
      [line$chart] gosub graph$line
      [pie$chart] gosub graph$pie
      indicate first$value false
    loop
    return

    graph$bar:
    move (axis$base+((value$/(max$value-min$value))*800)) to upper$right$y
    move (lower$left$x+bar$width) to upper$right$x
    bar lower$left$x lower$left$y upper$right$x upper$right$y chart$color
    [~bottom$label] grxy lower$left$x (upper$right$y-50)
    [ bottom$label] grxy lower$left$x 50
    screenmode label$color
    show graph$label
    move (lower$left$x+bar$width+bar$space) to lower$left$x
    return

    graph$line:
    move (axis$base+((value$/(max$value-min$value))*800)) to lower$left$y
    grxy lower$left$x lower$left$y
    [~first$value] line last$x last$y chart$color
    circle lower$left$x lower$left$y 5 axis$color
    move lower$left$x to last$x
    move lower$left$y to last$y
    [~bottom$label] grxy lower$left$x (lower$left$y-50)
    [ bottom$label] grxy lower$left$x 50
    screenmode label$color
    show graph$label
    move (lower$left$x+bar$width+bar$space) to lower$left$x
    return

    graph$pie:
    move ((6.28318 * (value$/total$value)) + last$radian) to radian
    move ((radian+last$radian)/2) to mid$radian
    move (cos(mid$radian)*30+500) to last$x
    move (sin(mid$radian)*30) to last$y
    move (last$y + (last$y*dev$y/dev$x) + 500) to last$y
    grxy last$x last$y
    pie radius last$radian radian chart$color axis$color
    move radian to last$radian
    move (cos(mid$radian)*(radius+50)+500) to last$x
    move (sin(mid$radian)*(radius+50)) to last$y
    move (last$y + (last$y*dev$y/dev$x) + 500) to last$y
    if last$x lt 500 ;
      move (0 max (last$x - (length(graph$label)*8000/dev$x))) to last$x
    grxy last$x last$y
    screenmode label$color
    show graph$label
    return

    sc$init:
    setworld 0 0 1000 1000
    clearscreen
    return

    calc$value:
    move (max$value*1.05) to max$value
    move (min$value*1.05) to min$value
    if min$value gt 0 move 0 to min$value  // zero base pos ranges
    if max$value lt 0 move 0 to max$value

    real scaler$
    integer increments$
    move (10^(integer(log(max$value max -min$value)/log(10)))) to scaler$
    move (max$value/scaler$+1) to increments$
    move (scaler$*increments$) to max$value
    if min$value lt 0 begin
      move (scaler$*integer(min$value/scaler$-1)) to min$value
      move (increments$-integer(min$value/scaler$)) to increments$
    end
    if increments$ le 6 move (increments$*2) to increments$

    move ((((-min$value max min$value)/(max$value-min$value)) ;
      * 800)+100) to axis$base
    move axis$base to lower$left$y
    return

    center$title:
    move 3 to text$size
    center$title2:
    repeat
      move (text$size-1) to text$size
      move (((gr$tmp-((length(graph$label)+1)* ;
        (text$size*8)))/2)*1000/gr$tmp) to text$center
    until text$center ge 0
    return

    draw$axis:
    getdrange dev$x dev$y
    screenmode label$color
    if (length(graph$title)) gt 0 begin
      move dev$x to gr$tmp
      move graph$title to graph$label
      gosub center$title
      if (text$size*8000/dev$y) gt 50 gosub center$title2
      set_text text$size 0
      grxy text$center 950
      show graph$title
    end

    [pie$chart] begin
      indicate first$value true
      move 0 to gr$tmp
      for graph$num from 1 to num$values
        [first$value]  graph_getfirst graph$label value$
        [~first$value] graph_getnext graph$label value$
        trim graph$label to graph$label
        move (gr$tmp max length(graph$label)) to gr$tmp
        indicate first$value false
      loop
      set_text 1 0
      move 0 to last$radian
      move ((50 max ((dev$x*0.4)-(gr$tmp*8)*1000/dev$x)) min 190) to radius
      return
    end

    if (length(graph$xtitle)) gt 0 begin
      move graph$xtitle to graph$label
      gosub center$title
      set_text text$size 0
      move (text$size*8000.0/dev$y) to gr$tmp
//    move ((text$size+1)*8000.0/dev$y) to gr$tmp
      grxy text$center gr$tmp
      show graph$xtitle
      setworld 0 (-gr$tmp) 1000 1000
    end

    if (length(graph$ytitle)) gt 0 begin
      move dev$y to gr$tmp
      move graph$ytitle to graph$label
      gosub center$title
      set_text text$size 1
      grxy 0 text$center
      show graph$ytitle
    end
    else move 0 to text$size

    set_text 1 0
    screenmode label$color

    move min$value to value$
    integer indent$
    move 0 to indent$
    move ((max$value-min$value)/increments$) to value$step
    while value$ le max$value
      move (axis$base+((value$/(max$value-min$value))*800)) ;
        to upper$right$y
      grxy (((text$size*8)+2)*1000/dev$x) upper$right$y
      show value$
      move (indent$ max length(value$)) to indent$
      move (value$+value$step) to value$
    end
    move ((((indent$+text$size)*8)+12)*1000/dev$x) to indent$
    move (real(900-indent$)/num$values * 0.8) to bar$width
    move (real(900-indent$)/num$values * 0.2) to bar$space
    move (indent$+bar$space) to lower$left$x
    bar (indent$-10) 90 indent$ 900 axis$color
    bar indent$ 90 900 100 axis$color
    grxy indent$ axis$base
    line 900 axis$base
    return

    do$chart$end:
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//     INITIALIZE_INTERFACE
//
//   Parameters:
//     None.
//
//   Description:
//     INITIALIZE_INTERFACE initializes the object resource information.  
//     It should be executed before any other object related operations
//     are performed.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND INITIALIZE_INTERFACE &.
  // B$ obj_flag        bit 0 = in_object, bit 1 = in_class
  // X.AGG agg_count(class)     defined count of objects in class

  // ZA$ procedure/function label for procedures and functions
  // ZB$ current_dep        the current dependant number to assign
  // ZC$ current_message    the current flex message number
  // ZD$ group_size         size of the current item group
  // ZE$ group_id           unique id of current item group
  // ZF$ super_class_count  count of objects in superclass
  // ZG$ temp               temp counter (items, functions etc)
  // ZH$ access_method      the current access method identifyer
  // ZI$ sub_obj_count      the sub object counter
  // ZJ$ current_object     the current_object number

  #SET ZC$ $400             // begin up high, past predefinded
  #SET ZH$ $4001            // begin access methods here
  #SET ZJ$ 2                // desktop and clipboard are first

  // Define object class types.
  #REPLACE U_DESKTOP            |CI1    // a desktop class object
  #REPLACE U_MESSAGE            |CI2    // a message class object
  #REPLACE U_MENU               |CI3    // a menu class object
  #REPLACE U_EDIT               |CI4    // a edit class object
  #REPLACE U_SCROLLB            |CI5    // a scroll bar class object
  #REPLACE U_LIST               |CI6    // a list class object
  #REPLACE U_BUTTON             |CI7    // a button class object
  #REPLACE U_CHECKBOX           |CI8    // a check box class object
  #REPLACE U_CHECKLIST          |CI9    // a check box class object
  #REPLACE U_FORM               |CI10   // a form class object
  #REPLACE U_FORMLIST           |CI11   // a form class object
  #REPLACE U_CLIENT             |CI12   // a client area class object
  #REPLACE U_TITLE              |CI13   // a title bar class object
  #REPLACE U_ACTION_BAR         |CI14   // a action bar class object
  #REPLACE U_WARNING_MSG        |CI15   // a warning message class object
  #REPLACE U_CRIT_MSG           |CI16   // a critical error class object
  #REPLACE U_ERROR              |CI17   // a standard error class object
  #REPLACE U_HELP               |CI18   // a help class object
  #REPLACE U_ARRAY              |CI19   // a array class of mixed scalars
  #REPLACE U_TRACE              |CI20   // a trace class object
  #REPLACE U_ENTRY              |CI21   // a data entry class object
  #REPLACE U_ENTRYLIST          |CI22   // a data entry class object
  #REPLACE U_DIALOG             |CI23   // a DIALOG area class object
  #REPLACE U_RADIO              |CI24   // a radio button area
  #REPLACE U_RADIOLIST          |CI25   // a radio list  area
  #REPLACE U_VCONSOLE           |CI26   // a virtual console area
  #REPLACE U_CLIPBOARD          |CI27   // the clipboard handler

  // Base data structures
  #REPLACE MESSAGE_CLASS        |CI0
  #REPLACE MENU_CLASS           |CI1
  #REPLACE LIST_CLASS           |CI2
  #REPLACE EDIT_CLASS           |CI3
  #REPLACE SCROLL_CLASS         |CI4
  #REPLACE ARRAY_CLASS          |CI5


  // Define physical key names
  #REPLACE KEY_ALT              |VI$8200
  #REPLACE KEY_SHIFT            |VI$8400
  #REPLACE KEY_CTRL             |VI$8800
  
  #REPLACE KEY_ENTER            |VI$9001
  #REPLACE KEY_TAB              |VI$9002
  #REPLACE KEY_BACK_SPACE       |VI$9003
  #REPLACE KEY_ESCAPE           |VI$9004
  #REPLACE KEY_UP_ARROW         |VI$9005
  #REPLACE KEY_DOWN_ARROW       |VI$9006
  #REPLACE KEY_LEFT_ARROW       |VI$9007
  #REPLACE KEY_RIGHT_ARROW      |VI$9008
  #REPLACE KEY_HOME             |VI$9009
  #REPLACE KEY_END              |VI$900A
  #REPLACE KEY_PGUP             |VI$900B
  #REPLACE KEY_PGDN             |VI$900C
  #REPLACE KEY_INSERT           |VI$900D
  #REPLACE KEY_DELETE           |VI$900E
  #REPLACE KEY_F1               |VI$9010
  #REPLACE KEY_F2               |VI$9011
  #REPLACE KEY_F3               |VI$9012
  #REPLACE KEY_F4               |VI$9013
  #REPLACE KEY_F5               |VI$9014
  #REPLACE KEY_F6               |VI$9015
  #REPLACE KEY_F7               |VI$9016
  #REPLACE KEY_F8               |VI$9017
  #REPLACE KEY_F9               |VI$9018
  #REPLACE KEY_F10              |VI$9019
  #REPLACE KEY_F11              |VI$901A
  #REPLACE KEY_F12              |VI$901B
  #REPLACE KEY_A                |VI$8041
  #REPLACE KEY_B                |VI$8042
  #REPLACE KEY_C                |VI$8043
  #REPLACE KEY_D                |VI$8044
  #REPLACE KEY_E                |VI$8045
  #REPLACE KEY_F                |VI$8046
  #REPLACE KEY_G                |VI$8047
  #REPLACE KEY_H                |VI$8048
  #REPLACE KEY_I                |VI$8049
  #REPLACE KEY_J                |VI$804A
  #REPLACE KEY_K                |VI$804B
  #REPLACE KEY_L                |VI$804C
  #REPLACE KEY_M                |VI$804D
  #REPLACE KEY_N                |VI$804E
  #REPLACE KEY_O                |VI$804F
  #REPLACE KEY_P                |VI$8050
  #REPLACE KEY_Q                |VI$8051
  #REPLACE KEY_R                |VI$8052
  #REPLACE KEY_S                |VI$8053
  #REPLACE KEY_T                |VI$8054
  #REPLACE KEY_U                |VI$8055
  #REPLACE KEY_V                |VI$8056
  #REPLACE KEY_W                |VI$8057
  #REPLACE KEY_X                |VI$8058
  #REPLACE KEY_Y                |VI$8059
  #REPLACE KEY_Z                |VI$805A
  #REPLACE KEY_SPACE            |VI$8020
  #REPLACE KSPACE               |VI$8020
  #REPLACE KEY_0                |VI$8030
  #REPLACE KEY_1                |VI$8031
  #REPLACE KEY_2                |VI$8032
  #REPLACE KEY_3                |VI$8033
  #REPLACE KEY_4                |VI$8034
  #REPLACE KEY_5                |VI$8035
  #REPLACE KEY_6                |VI$8036
  #REPLACE KEY_7                |VI$8037
  #REPLACE KEY_8                |VI$8038
  #REPLACE KEY_9                |VI$8039
  #REPLACE KEY_PLUS             |VI$802B
  #REPLACE KEY_MINUS            |VI$802D
  #REPLACE KEY_EQUAL            |VI$803D
  #REPLACE KEY_BACK_SLASH       |VI$805C
  #REPLACE KEY_SLASH            |VI$802F
  
  // Define Accelerator key names.
  #REPLACE KHELP                |CI274
  #REPLACE KSAVE_RECORD         |CI265
  #REPLACE KDELETE_RECORD       |CI266
  #REPLACE KEXIT_FUNCTION       |CI281
  #REPLACE KEXIT_APPLICATION    |CI282
  #REPLACE KPROMPT              |CI283
  #REPLACE KPRINT_SCREEN        |CI258
  #REPLACE KCLEAR               |CI269
  #REPLACE KREFRESH_SCREEN      |CI284
  #REPLACE KSWITCH              |CI285
  #REPLACE KSWITCH_BACK         |CI286
  #REPLACE KFIND                |CI263
  #REPLACE KFIND_PREVIOUS       |CI270
  #REPLACE KFIND_NEXT           |CI271
  #REPLACE KSUPER_FIND          |CI264
  #REPLACE KSUPER_FIND_PREVIOUS |CI287
  #REPLACE KSUPER_FIND_NEXT     |CI288
  #REPLACE KACTION_BAR          |CI289
  #REPLACE KENTER               |CI257
  #REPLACE KUPARROW             |CI272
  #REPLACE KDOWNARROW           |CI273
  #REPLACE KLEFTARROW           |CI260
  #REPLACE KRIGHTARROW          |CI261
  #REPLACE KSCROLL_BACK         |CI290
  #REPLACE KSCROLL_FORWARD      |CI291
  #REPLACE KSCROLL_LEFT         |CI292
  #REPLACE KSCROLL_RIGHT        |CI293
  #REPLACE KBEGIN_OF_LINE       |CI294
  #REPLACE KEND_OF_LINE         |CI295
  #REPLACE KNEXT_ITEM           |CI296
  #REPLACE KPREVIOUS_ITEM       |CI262
  #REPLACE KDELETE_CHARACTER    |CI277
  #REPLACE KERASE_END_OF_LINE   |CI297
  #REPLACE KBACK_SPACE          |CI278
  #REPLACE KCANCEL              |CI259
  #REPLACE KBEGIN_OF_PANEL      |CI298
  #REPLACE KEND_OF_PANEL        |CI299
  #REPLACE KBEGIN_OF_DATA       |CI300
  #REPLACE KEND_OF_DATA         |CI301
  #REPLACE KWORD_LEFT           |CI302
  #REPLACE KWORD_RIGHT          |CI303
  #REPLACE KINSERT              |CI276
  #REPLACE KCLEAR_AND_RETURN    |CI279
  #REPLACE KADD_MODE            |CI304
  #REPLACE KPASTE               |CI305
  #REPLACE KCOPY                |CI306
  #REPLACE KCUT                 |CI307
  #REPLACE KCLEAR_ALL           |CI308
  #REPLACE KMOUSE               |CI309
  #REPLACE KMARK                |CI310
  #REPLACE KZOOM                |CI311
  #REPLACE KCLOSE_PANEL         |CI312

  //OLD KEY DEFINITIONS
  #REPLACE KCALCULATE           |CI267
  #REPLACE KUSER                |CI268
  #REPLACE KUSER2               |CI275
  #REPLACE KCLEOW               |CI280

  // Built in UI messages
  #REPLACE GET_ACTIVE_STATE         |CI$0001
  #REPLACE GET_PARENT               |CI$0002
  #REPLACE SET_PARENT               |CI$0003
  #REPLACE MSG_PAGE_OBJECT          |CI$0004
  #REPLACE GET_LOCATION             |CI$0005
  #REPLACE SET_LOCATION             |CI$0006
  #REPLACE GET_ENTRY_MSG            |CI$0007
  #REPLACE SET_ENTRY_MSG            |CI$0008
  #REPLACE GET_EXIT_MSG             |CI$0009
  #REPLACE SET_EXIT_MSG             |CI$000A
  #REPLACE SET_SIZE                 |CI$000B
  #REPLACE GET_SIZE                 |CI$000C
  #REPLACE GET_CURRENT_ITEM         |CI$000D
  #REPLACE SET_CURRENT_ITEM         |CI$000E
  #REPLACE GET_TOP_ITEM             |CI$000F
  #REPLACE SET_TOP_ITEM             |CI$0010
  #REPLACE GET_VALUE                |CI$0011
  #REPLACE SET_VALUE                |CI$0012
  #REPLACE GET_MESSAGE              |CI$0013
  #REPLACE SET_MESSAGE              |CI$0014
  #REPLACE GET_ITEM_COUNT           |CI$0015
  #REPLACE SET_ITEM_COUNT           |CI$0016
  #REPLACE GET_SELECT_COUNT         |CI$0017
  #REPLACE SET_SELECT_COUNT         |CI$0018
  #REPLACE GET_MULTI_SELECT_MSG     |CI$0019
  #REPLACE SET_MULTI_SELECT_MSG     |CI$001A
  #REPLACE SET_FOCUS_MODE           |CI$001B
  #REPLACE GET_FOCUS_MODE           |CI$001C
  #REPLACE SET_VISIBLE_STATE        |CI$001D
  #REPLACE GET_VISIBLE_STATE        |CI$001E
  #REPLACE SET_SELECT_MODE          |CI$001F
  #REPLACE GET_SELECT_MODE          |CI$0020
  #REPLACE SET_WRAP_STATE           |CI$0021
  #REPLACE GET_WRAP_STATE           |CI$0022
  #REPLACE SET_SHADOW_STATE         |CI$0023
  #REPLACE GET_SHADOW_STATE         |CI$0024
  #REPLACE GET_SELECT_STATE         |CI$0025
  #REPLACE SET_SELECT_STATE         |CI$0026
  #REPLACE SET_AUTOCLEAR_STATE      |CI$0027
  #REPLACE GET_AUTOCLEAR_STATE      |CI$0028
  #REPLACE SET_CENTER_STATE         |CI$0029
  #REPLACE GET_CENTER_STATE         |CI$002A
  #REPLACE SET_CHECKBOX_ITEM_STATE  |CI$002B
  #REPLACE GET_CHECKBOX_ITEM_STATE  |CI$002C
  #REPLACE MSG_STOP_UI              |CI$002D
  #REPLACE MSG_ERROR                |CI$002E
  #REPLACE MSG_HELP                 |CI$002F
  #REPLACE MSG_BELL                 |CI$0030
  #REPLACE MSG_PAINT                |CI$0031
  #REPLACE MSG_NONE                 |CI$0032
  #REPLACE MSG_EXIT                 |CI$0033
  #REPLACE MSG_NEXT                 |CI$0034
  #REPLACE MSG_PULL_RIGHT           |CI$0035
  #REPLACE MSG_PULL_LEFT            |CI$0036
  #REPLACE MSG_KEY                  |CI$0037
  #REPLACE MSG_INSERT_ITEM          |CI$0038
  #REPLACE MSG_ADD_ITEM             |CI$0039
  #REPLACE MSG_DELETE_ITEM          |CI$003A
  #REPLACE MSG_DELETE_DATA          |CI$003B
  #REPLACE MSG_SORT_ITEMS           |CI$003C
  #REPLACE GET_ITEM_MATCHING        |CI$003D
  #REPLACE GET_AUX_VALUE            |CI$003E
  #REPLACE SET_AUX_VALUE            |CI$003F
  #REPLACE GET_SEARCH_MODE          |CI$0040
  #REPLACE SET_SEARCH_MODE          |CI$0041
  #REPLACE GET_INVERSE_STATE        |CI$0042
  #REPLACE SET_INVERSE_STATE        |CI$0043
  #REPLACE MSG_SCROLL               |CI$0044
  #REPLACE SET_CLASS_COLORS         |CI$0045
  #REPLACE GET_HORIZONTAL_INCREMENT |CI$0046
  #REPLACE SET_HORIZONTAL_INCREMENT |CI$0047
  #REPLACE MSG_UP                   |CI$0048
  #REPLACE MSG_DOWN                 |CI$0049
  #REPLACE MSG_RIGHT                |CI$004A
  #REPLACE MSG_LEFT                 |CI$004B
  #REPLACE MSG_BEGINNING_OF_DATA    |CI$004C
  #REPLACE MSG_END_OF_DATA          |CI$004D
  #REPLACE MSG_BEGINNING_OF_PANEL   |CI$004E
  #REPLACE MSG_END_OF_PANEL         |CI$004F
  #REPLACE MSG_BEGINNING_OF_LINE    |CI$0050
  #REPLACE MSG_END_OF_LINE          |CI$0051
  #REPLACE MSG_PAGE_UP              |CI$0052
  #REPLACE MSG_PAGE_DOWN            |CI$0053
  #REPLACE SET_INSERT_MODE          |CI$0054
  #REPLACE MSG_GOTO_LINE            |CI$0055
  #REPLACE MSG_MOVE_ABSOLUTE        |CI$0056
  #REPLACE MSG_MOVE_RELATIVE        |CI$0057
  #REPLACE MSG_MARK_ON              |CI$0058
  #REPLACE MSG_PASTE                |CI$0059
  #REPLACE MSG_CUT                  |CI$005A
  #REPLACE MSG_COPY                 |CI$005B
  #REPLACE MSG_INSERT               |CI$005C
  #REPLACE MSG_DELETE_CHAR          |CI$005D
  #REPLACE MSG_DELETE_LINE          |CI$005E
  #REPLACE MSG_DELETE_TO_EOL        |CI$005F
  #REPLACE MSG_FIND                 |CI$0060
  #REPLACE GET_FIND                 |CI$0060 //dup
  #REPLACE MSG_REPLACE              |CI$0061
  #REPLACE GET_REPLACE              |CI$0061 //dup
  #REPLACE MSG_PRINT                |CI$0062
  #REPLACE GET_MARK                 |CI$0063
  #REPLACE GET_CHANGED_STATE        |CI$0064
  #REPLACE SET_CHANGED_STATE        |CI$0065
  #REPLACE SET_RIGHT_MARGIN         |CI$0066
  #REPLACE GET_LINE_COUNT           |CI$0067
  #REPLACE SET_STATUS_LINE_STATE    |CI$0068
  #REPLACE SET_BLOCK_MOUSE_STATE    |CI$0069
  #REPLACE GET_BLOCK_MOUSE_STATE    |CI$006A
  #REPLACE SET_COLUMN_MODE          |CI$006B
  #REPLACE GET_COLUMN_MODE          |CI$006C
  #REPLACE SET_FILE_NAME            |CI$006D
  #REPLACE GET_FILE_NAME            |CI$006E
  #REPLACE MSG_DEFAULT_KEY          |CI$006F
  #REPLACE SET_DYNAMIC_UPDATE_STATE |CI$0070
  #REPLACE GET_FOCUS                |CI$0071
  #REPLACE MSG_REFRESH_SCREEN       |CI$0072
  #REPLACE MSG_PREVIOUS             |CI$0073
  #REPLACE SET_CHECK_STRING         |CI$0074
  #REPLACE MSG_ACTIVATE             |CI$0075
  #REPLACE MSG_ACTIVATE_GROUP       |CI$0076
  #REPLACE MSG_DEACTIVATE           |CI$0077
  #REPLACE MSG_DEACTIVATE_GROUP     |CI$0078
  #REPLACE SET_LOCAL_ROTATE_STATE   |CI$0079
  #REPLACE GET_LOCAL_ROTATE_STATE   |CI$007A
  #REPLACE SET_CLIENT_AREA_STATE    |CI$007B
  #REPLACE GET_CLIENT_AREA_STATE    |CI$007C
  #REPLACE GET_READ_ONLY_STATE      |CI$007D
  #REPLACE SET_READ_ONLY_STATE      |CI$007E
  #REPLACE SET_LINE_WIDTH           |CI$007F
  #REPLACE GET_LINE_SIZE            |CI$0080
  #REPLACE GET_DISPLAY_SIZE         |CI$0081
  #REPLACE SET_SCROLL_BAR_VISIBLE_STATE |CI$0082
  #REPLACE SET_ORIGIN               |CI$0083
  #REPLACE GET_ORIGIN               |CI$0084
  #REPLACE GET_POSITION             |CI$0085
  #REPLACE MSG_TRUE                 |CI$0086
  #REPLACE MSG_FALSE                |CI$0087
  #REPLACE MSG_LAST_KEY_PRESSED     |CI$0088
  #REPLACE GET_LAST_KEY_PRESSED     |CI$0088 //dup
  #REPLACE SET_RADIO_STRING         |CI$0089
  #REPLACE SET_ENTRY_STATE          |CI$008A
  #REPLACE GET_ENTRY_STATE          |CI$008B
  #REPLACE MSG_READ                 |CI$008C
  #REPLACE MSG_WRITE                |CI$008D
  #REPLACE SET_SCROLL_BAR_OFFSET    |CI$008E
  #REPLACE GET_SCROLL_BAR_OFFSET    |CI$008F
  #REPLACE MSG_ITEM_CHANGE          |CI$0090
  #REPLACE GET_ITEM_CHANGED_STATE   |CI$0091
  #REPLACE SET_ITEM_CHANGED_STATE   |CI$0092
  #REPLACE GET_AUTO_TOP_ITEM_STATE  |CI$0093
  #REPLACE SET_AUTO_TOP_ITEM_STATE  |CI$0094
  #REPLACE SET_KBD_INPUT_MODE       |CI$0095
  #REPLACE MSG_SUPPLY_KEY           |CI$0096
  #REPLACE GET_INSERT_MODE          |CI$0097
  #REPLACE MSG_OK                   |CI$0098
  #REPLACE MSG_CANCEL               |CI$0099
  #REPLACE GET_ARRAY_VALUE          |CI$009A
  #REPLACE SET_ARRAY_VALUE          |CI$009B
  #REPLACE MSG_CONSTRUCT_OBJECT     |CI$009C
  #REPLACE MSG_ACTIVATING           |CI$009D
  #REPLACE MSG_TRACE_SWITCH         |CI$009E
  #REPLACE MSG_TRACE_MESSAGE        |CI$009F
  #REPLACE MSG_TRACE_STEP           |CI$00A0
  #REPLACE MSG_TRACE_OUTPUT         |CI$00A1
  #REPLACE MSG_DEACTIVATING         |CI$00A2
  #REPLACE GET_CLASS                |CI$00A3
  #REPLACE GET_HELP_NAME            |CI$00A4
  #REPLACE MSG_EXIT_APPLICATION     |CI$00A5
  #REPLACE MSG_PRINT_SCREEN         |CI$00A6
  #REPLACE GET_RIGHT_MARGIN         |CI$00A7
  #REPLACE GET_DELEGATION_MODE      |CI$00A8
  #REPLACE SET_DELEGATION_MODE      |CI$00A9
  #REPLACE GET_BASE_CLASS           |CI$00AA
  #REPLACE SET_ITEM_ENTRY_MSG       |CI$00AB
  #REPLACE GET_ITEM_ENTRY_MSG       |CI$00AC
  #REPLACE SET_ITEM_EXIT_MSG        |CI$00AD
  #REPLACE GET_ITEM_EXIT_MSG        |CI$00AE
  #REPLACE SET_ITEM_VALIDATE_MSG    |CI$00AF
  #REPLACE GET_ITEM_VALIDATE_MSG    |CI$00B0
  #REPLACE SET_DATA_FILE            |CI$00B1
  #REPLACE GET_DATA_FILE            |CI$00B2
  #REPLACE SET_DATA_FIELD           |CI$00B3
  #REPLACE GET_DATA_FIELD           |CI$00B4
  #REPLACE SET_DATA_WINDOW          |CI$00B5
  #REPLACE GET_DATA_WINDOW          |CI$00B6
  #REPLACE SET_ITEM_OPTIONS         |CI$00B7
  #REPLACE GET_ITEM_OPTIONS         |CI$00B8
  #REPLACE SET_ITEM_OPTION          |CI$00B9
  #REPLACE GET_ITEM_OPTION          |CI$00BA
  #REPLACE MSG_ENTRY_UPDATE         |CI$00BB
  #REPLACE MSG_ENTRY_FIND           |CI$00BC
  #REPLACE MSG_ENTRY_SUPERFIND      |CI$00BD
  #REPLACE MSG_ENTRY_DISPLAY        |CI$00BE
  #REPLACE MSG_ENTRY_CLEAR          |CI$00BF
  #REPLACE GET_VALIDATE_ITEMS       |CI$00C0
  #REPLACE GET_ITEM_WINDOW          |CI$00C1
  #REPLACE MSG_COPY_ITEMS           |CI$00C2
  #REPLACE GET_IMAGE_NUMBER         |CI$00C3
  #REPLACE MSG_ENTRY_CLEAR_ALL      |CI$00C4
  #REPLACE MSG_SELECT_TOGGLING      |CI$00C5
  #REPLACE GET_ITEM_ENTRY           |CI$00C6
  #REPLACE GET_ITEM_EXIT            |CI$00C7
  #REPLACE GET_ITEM_VALIDATE        |CI$00C8
  #REPLACE GET_READ_ONLY_ERROR      |CI$00C9
  #REPLACE GET_NAME                 |CI$00CA
  #REPLACE GET_ENTRY                |CI$00CB
  #REPLACE MSG_DESTROY_OBJECT       |CI$00CC
  #REPLACE MSG_DESTROY_ALL_OBJECTS  |CI$00CD
  #REPLACE GET_MOUSE_HIT            |CI$00CE
  #REPLACE SET_OBJECT_COLOR         |CI$00CF
  #REPLACE SET_ARROWS               |CI$00D0
  #REPLACE MSG_SWITCH               |CI$00D1
  #REPLACE MSG_SWITCH_BACK          |CI$00D2
  #REPLACE GET_WAS_FOUND            |CI$00D3
  #REPLACE GET_STATUS_LINE_STATE    |CI$00D4
  #REPLACE SET_HIGHLIGHT_STATE      |CI$00D5    // INTERNAL
  #REPLACE MSG_ROTATE_UP            |CI$00D6    // INTERNAL
  #REPLACE MSG_POP_PAGES            |CI$00D7    // INTERNAL
  #REPLACE SET_CLASS                |CI$00D8    // INTERNAL
  #REPLACE MSG_FETCH_HELP           |CI$00D9    // INTERNAL
  #REPLACE GET_OBJECT_ID            |CI$00DA    // INTERNAL
  #REPLACE MSG_INIT_INSTANCE        |CI$00DB    // INTERNAL
  #REPLACE MSG_PAGE                 |CI$00DC    // INTERNAL
  #REPLACE MSG_PAGE_DELETE          |CI$00DD    // INTERNAL
  //#REPLACE GET_COLORS             |CI$00DE    // INTERNAL
  #REPLACE GET_BAR_LOCATION         |CI$00DF    // INTERNAL
  #REPLACE RETURN_LOCATION          |CI$00E0    // INTERNAL
  #REPLACE MSG_CHANGE_LOCATION      |CI$00E1    // INTERNAL
  #REPLACE MSG_WRITE_DBMS           |CI$00E2
  #REPLACE MSG_READ_DBMS            |CI$00E3
  #REPLACE MSG_WRITE_IMAGE          |CI$00E2    // same as dbms
  #REPLACE MSG_READ_IMAGE           |CI$00E3    // same as dbms
  #REPLACE GET_STRING_VALUE         |CI$00E4
  #REPLACE GET_NUMBER_VALUE         |CI$00E5
  #REPLACE GET_DATE_VALUE           |CI$00E6
  #REPLACE GET_INTEGER_VALUE        |CI$00E7
  #REPLACE GET_REAL_VALUE           |CI$00E8
  #REPLACE SET_BASE_ITEM            |CI$00E9
  #REPLACE GET_BASE_ITEM            |CI$00EA
  #REPLACE SET_ITEM_LIMIT           |CI$00EB
  #REPLACE GET_ITEM_LIMIT           |CI$00EC
  #REPLACE MSG_MARK_OFF             |CI$00ED
  #REPLACE SET_SEARCH_CASE          |CI$00EE
  #REPLACE SET_PRIOR_FOCUS          |CI$00EF
  #REPLACE GET_PRIOR_FOCUS          |CI$00F0
  #REPLACE SET_NEXT_FOCUS           |CI$00F1
  #REPLACE GET_NEXT_FOCUS           |CI$00F2
  #REPLACE SET_SCROLLBAR            |CI$00F3
  #REPLACE GET_ASCII_STATE          |CI$00F4
  #REPLACE SET_ASCII_STATE          |CI$00F5
  #REPLACE GET_TEXT_INDENT          |CI$00F6
  #REPLACE SET_TEXT_INDENT          |CI$00F7
  #REPLACE MSG_ENTRY_AUTOFIND       |CI$00F8
  #REPLACE SET_SCOPE_STATE          |CI$00F9
  #REPLACE GET_SCOPE_STATE          |CI$00FA
  #REPLACE MSG_MOUSE_CHANGE_FOCUS   |CI$00FB
  #REPLACE GET_CHILD_COUNT          |CI$00FC
  #REPLACE MSG_MOUSE_UP             |CI$00FD
  #REPLACE MSG_MOUSE_UP2            |CI$00FE
  #REPLACE MSG_MOUSE_UP3            |CI$00FF
  #REPLACE MSG_MOUSE_CLICK          |CI$0100
  #REPLACE MSG_MOUSE_CLICK2         |CI$0101
  #REPLACE MSG_MOUSE_CLICK3         |CI$0102
  #REPLACE MSG_MOUSE_DOWN           |CI$0103
  #REPLACE MSG_MOUSE_DOWN2          |CI$0104
  #REPLACE MSG_MOUSE_DOWN3          |CI$0105
  #REPLACE MSG_MOUSE_DRAG           |CI$0106
  #REPLACE MSG_MOUSE_DRAG2          |CI$0107
  #REPLACE MSG_MOUSE_DRAG3          |CI$0108
  #REPLACE GET_ABSOLUTE_MOUSE_LOCATION |CI$0109
  #REPLACE SET_ABSOLUTE_MOUSE_LOCATION |CI$010A
  #REPLACE GET_DYNAMIC_UPDATE_STATE |CI$010B
  #REPLACE SET_MAX_LINES            |CI$010C
  #REPLACE GET_MAX_LINES            |CI$010D
  #REPLACE MSG_VIRTUAL_CONSOLE      |CI$010E
  #REPLACE GET_NEXT_ENTRY_OK        |CI$010F
  #REPLACE GET_PREVIOUS_ENTRY_OK    |CI$0110
  #REPLACE SET_DYNAMIC_COLORS       |CI$0111
  #REPLACE SET_NEW_ITEM             |CI$0112
  #REPLACE SET_BROADCAST_STATE      |CI$0113
  #REPLACE GET_BROADCAST_STATE      |CI$0114
  #REPLACE GET_WRAPPING             |CI$0115
  #REPLACE GET_ROW_CHANGING         |CI$0116
  #REPLACE MSG_ADD_FOCUS            |CI$0117
  #REPLACE MSG_REMOVE_OBJECT        |CI$0118
  #REPLACE MSG_RELEASE_FOCUS        |CI$0119
  #REPLACE MSG_ENTERING             |CI$011A
  #REPLACE MSG_EXITING              |CI$011B
  #REPLACE MSG_ENTERING_SCOPE       |CI$011C
  #REPLACE MSG_EXITING_SCOPE        |CI$011D
  #REPLACE MSG_SWITCH_NEXT_GROUP    |CI$011E
  #REPLACE MSG_SWITCH_PRIOR_GROUP   |CI$011F
  #REPLACE GET_CURRENT_SCOPE        |CI$0120
  #REPLACE SET_CURRENT_SCOPE        |CI$0121
  #REPLACE MSG_POPUP                |CI$0122
  #REPLACE MSG_POPUP_GROUP          |CI$0123
  #REPLACE SET_POPUP_STATE          |CI$0124
  #REPLACE GET_POPUP_STATE          |CI$0125
  #REPLACE SET_RING_STATE           |CI$0126
  #REPLACE GET_RING_STATE           |CI$0127
  #REPLACE MSG_MOVE_FOCUS_TREE      |CI$0128
  #REPLACE SET_PROMPT_OBJECT        |CI$0129
  #REPLACE GET_PROMPT_OBJECT        |CI$012A
  #REPLACE SET_ZOOM_OBJECT          |CI$012B
  #REPLACE GET_ZOOM_OBJECT          |CI$012C
  #REPLACE GET_PRIOR_LEVEL          |CI$012D
  #REPLACE GET_NEXT_LEVEL           |CI$012E
  #REPLACE GET_PRIOR_SCOPE          |CI$012F
  #REPLACE GET_NEXT_SCOPE           |CI$0130
  #REPLACE MSG_SWITCH_PRIOR_SCOPE   |CI$0131
  #REPLACE MSG_SWITCH_NEXT_SCOPE    |CI$0132
  #REPLACE SET_ATTACH_PARENT_STATE  |CI$0133
  #REPLACE GET_ATTACH_PARENT_STATE  |CI$0134
  #REPLACE MSG_CHILD_WRAPPING       |CI$0135
  #REPLACE SET_DISPLAY_MODE         |CI$0136
  #REPLACE GET_DISPLAY_MODE         |CI$0137
  #REPLACE MSG_COLOR_BLOCK          |CI$0138
  #REPLACE MSG_NEXT_OBJECT          |CI$0139
  #REPLACE MSG_PRIOR_OBJECT         |CI$013A
  #REPLACE SET_APPLICATION_NAME     |CI$013B
  #REPLACE GET_APPLICATION_NAME     |CI$013C
  #REPLACE SET_MODULE_NAME          |CI$013D
  #REPLACE GET_MODULE_NAME          |CI$013E
  #REPLACE GET_LAST_CHILD           |CI$013F
  #REPLACE SET_WINDOW_COLOR         |CI$0140
  #REPLACE GET_WINDOW_COLOR         |CI$0141
  #REPLACE MSG_PROCESS_KEY          |CI$0142
  #REPLACE MSG_ACTIVATE_SCOPE       |CI$0143
  #REPLACE GET_FIND_SCOPE           |CI$0144
  #REPLACE GET_SCOPE_FOCUS          |CI$0145
  #REPLACE GET_VALID_ITEM           |CI$0146
  #REPLACE MSG_UPDATE_DISPLAY       |CI$0147
  #REPLACE SET_ITEM                 |CI$0148
  #REPLACE MSG_TRACE_COMMAND        |CI$0149    // INTERNAL 
  #REPLACE GET_OBJECT_COLOR         |CI$014A
  #REPLACE SET_OBJECT_VALIDATION    |CI$014B
  #REPLACE GET_OBJECT_VALIDATION    |CI$014C
  #REPLACE GET_NEXT_OBJECT_ID       |CI$014D
  #REPLACE GET_PRIOR_OBJECT_ID      |CI$014E
  #REPLACE GET_CLASS_COLORS         |CI$014F
  #REPLACE GET_LOCATION_TYPE        |CI$0150
  #REPLACE GET_OBJECT_SIZE          |CI$0151
  #REPLACE GET_IN_USE_STATE         |CI$0152
  #REPLACE SET_IN_USE_STATE         |CI$0153
  #REPLACE MSG_ATTACH_DEO_TO_SERVER |CI$0154
  #REPLACE MSG_REQUEST_CLEAR_ALL    |CI$0155
  #REPLACE MSG_CLEAR                |CI$0156
  #REPLACE SET_CURRENT_RECORD       |CI$0157
  #REPLACE GET_CURRENT_RECORD       |CI$0158
  #REPLACE MSG_REBUILD_CONSTRAINTS  |CI$0159
  #REPLACE MSG_CONSTRAIN            |CI$015A
  #REPLACE SET_MAIN_FILE            |CI$015B
  #REPLACE GET_MAIN_FILE            |CI$015C
  #REPLACE GET_FIND_SERVER          |CI$015D
  #REPLACE GET_LOCATE_SERVER        |CI$015E
  #REPLACE MSG_MARK_AS_COMPONENT    |CI$015F
  #REPLACE MSG_DELETING             |CI$0160
  #REPLACE GET_VALIDATE_DELETE      |CI$0161
  #REPLACE MSG_REQUEST_DELETE       |CI$0162
  #REPLACE MSG_DISPLAY              |CI$0163
  #REPLACE MSG_RELATE_MAIN_FILE     |CI$0164
  #REPLACE MSG_CLEAR_UI             |CI$0165
  #REPLACE MSG_DISPLAY_UI           |CI$0166
  #REPLACE MSG_REQUEST_ASSIGN       |CI$0167
  #REPLACE GET_VALIDATE_SAVE        |CI$0168
  #REPLACE MSG_ATTACH_MAIN_FILE     |CI$0169
  #REPLACE MSG_REQUEST_CLEAR        |CI$016A
  #REPLACE MSG_BACKOUT              |CI$016B
  #REPLACE MSG_UPDATE               |CI$016C
  #REPLACE MSG_SAVE_MAIN_FILE       |CI$016D
  #REPLACE MSG_DELETE_MAIN_FILE     |CI$016E
  #REPLACE GET_ENTRY_PERMISSIVE_STATE |CI$016F
  #REPLACE SET_ENTRY_PERMISSIVE_STATE |CI$0170
  #REPLACE SET_ORDERING             |CI$0171
  #REPLACE GET_ORDERING             |CI$0172
  #REPLACE GET_COMPONENT_STATE      |CI$0173
  #REPLACE SET_COMPONENT_STATE      |CI$0174
  #REPLACE GET_HAS_COMPONENTS_STATE |CI$0175
  #REPLACE SET_HAS_COMPONENTS_STATE |CI$0176
  #REPLACE MSG_REQUEST_SAVE         |CI$0177
  #REPLACE MSG_REMOVE_FOCUS         |CI$0178
  #REPLACE MSG_ATTACH_SERVER        |CI$0179
  #REPLACE MSG_DETACH_SERVER        |CI$017A
  #REPLACE MSG_ATTACH_CLIENT        |CI$017B
  #REPLACE MSG_DETACH_CLIENT        |CI$017C
  #REPLACE MSG_ADD_USER_INTERFACE   |CI$017D
  #REPLACE MSG_REMOVE_USER_INTERFACE |CI$017E
  #REPLACE MSG_MAIN_FILE_CHANGED    |CI$017F
  #REPLACE GET_IS_SUPERFIND_REQUIRED |CI$0180
  #REPLACE MSG_REQUEST_FIND         |CI$0181
  #REPLACE MSG_ADD_PARENT_FILE      |CI$0182
  #REPLACE MSG_REMOVE_PARENT_FILE   |CI$0183
  #REPLACE MSG_REQUEST_SUPERFIND    |CI$0184
  #REPLACE MSG_REQUEST_READ         |CI$0185
  #REPLACE MSG_READ_BY_RECNUM       |CI$0186
  #REPLACE MSG_FIND_BY_RECNUM       |CI$0187
  #REPLACE MSG_ESTABLISH_FIND_DIRECTION |CI$0188
  #REPLACE MSG_LOCATE_NEXT          |CI$0189
  #REPLACE GET_RECORD_NOT_FOUND     |CI$018A
  #REPLACE MSG_INIT_CLASS           |CI$018B
  #REPLACE SET_IMAGE_NUMBER         |CI$018C
  #REPLACE GET_ROW                  |CI$018D
  #REPLACE GET_CURRENT_ROW          |CI$018E
  #REPLACE GET_TOP_ROW              |CI$018F
  #REPLACE GET_BOTTOM_ITEM          |CI$0190
  #REPLACE GET_BOTTOM_ROW           |CI$0191
  #REPLACE GET_ROW_COUNT            |CI$0192
  #REPLACE GET_DISPLAYABLE_ROWS     |CI$0193
  #REPLACE MSG_ADD_ROW              |CI$0194
  #REPLACE MSG_INSERT_ROW           |CI$0195
  #REPLACE SET_PALETTE_COLOR        |CI$0196
  #REPLACE GET_PALETTE_COLOR        |CI$0197
  #REPLACE SET_CLASS_PALETTE        |CI$0198
  #REPLACE GET_CLASS_PALETTE        |CI$0199
  #REPLACE GET_NO_DELETE_STATE      |CI$019A
  #REPLACE SET_NO_DELETE_STATE      |CI$019B
  #REPLACE MSG_REQUEST_ENTRY_UPDATE |CI$019C
  #REPLACE MSG_SCROLL_PAINT         |CI$019D
  #REPLACE MSG_SHOW_ITEM            |CI$019E
  #REPLACE SET_EXTERNAL_PAINT_STATE |CI$019F
  #REPLACE GET_EXTERNAL_PAINT_STATE |CI$01A0
  #REPLACE SET_MATRIX_SIZE          |CI$01A1
  #REPLACE GET_MATRIX_SIZE          |CI$01A2
  #REPLACE SET_SKIP_STATE           |CI$01A3
  #REPLACE GET_SKIP_STATE           |CI$01A4
  #REPLACE GET_REQUEST_VALIDATE     |CI$01A5
  #REPLACE GET_AUTO_FILL_STATE      |CI$01A6
  #REPLACE SET_AUTO_FILL_STATE      |CI$01A7
  #REPLACE GET_FIND_PERMISSIVE_STATE |CI$01A8
  #REPLACE SET_FIND_PERMISSIVE_STATE |CI$01A9
  #REPLACE MSG_TRANSACTION_ABORTED  |CI$01AA
  #REPLACE MSG_CLEAR_ALL            |CI$01AB
  #REPLACE MSG_CREATING             |CI$01AC
  #REPLACE MSG_DESTROYING           |CI$01AD
  #REPLACE GET_SHOULD_SAVE          |CI$01AE
  #REPLACE GET_WHICH_DATA_SET       |CI$01AF
  #REPLACE GET_VALIDATE_CONSTRAINTS |CI$01B0
  #REPLACE MSG_ERROR_REPORT         |CI$01B1
  #REPLACE MSG_REQUEST_RELATE       |CI$01B2
  #REPLACE GET_ERROR_TEXT           |CI$01B3
  #REPLACE GET_SUGGESTED_ORDERING   |CI$01B4
  #REPLACE SET_SUGGESTED_ORDERING   |CI$01B5
  #REPLACE GET_NO_RELATE_STATE      |CI$01B6
  #REPLACE SET_NO_RELATE_STATE      |CI$01B7
  #REPLACE GET_WINDOW_LOCATION      |CI$01B8
  #REPLACE GET_SIGNON_STATUS        |CI$01B9
//  #REPLACE MSG_ADD_WATCHER          |CI$01BA
//  #REPLACE MSG_REMOVE_WATCHER       |CI$01BB
  #REPLACE GET_SEARCH_CASE          |CI$01BC
  #REPLACE GET_SHOULD_SAVE_ROW      |CI$01BD
  #REPLACE MSG_DISPLAY_STATUS       |CI$01BE
  #REPLACE MSG_CLEAR_SET            |CI$01BF
  #REPLACE GET_AUTOFIND_ITEM        |CI$01C0
  #REPLACE SET_KEY_PATH             |CI$01C1
  #REPLACE GET_KEY_PATH             |CI$01C2
  #REPLACE GET_CAN_DELETE           |CI$01C3
  #REPLACE MSG_UPDATE_DEPENDENT_ITEMS |CI$01C4
  #REPLACE GET_SUPERFIND_FIELD      |CI$01C5
  #REPLACE MSG_REFRESH              |CI$01C6
  #REPLACE MSG_PROCESS_ACCELERATOR  |CI$01C7
  #REPLACE GET_ERROR_TEXT_AVAILABLE |CI$01C8
  #REPLACE GET_PROTOTYPE_OBJECT     |CI$01C9
  #REPLACE MSG_REFIND_RECORDS       |CI$01CA
  #REPLACE MSG_END_CONSTRUCT_OBJECT |CI$01CB
  #REPLACE MSG_CLEAR_MAIN_FILE      |CI$01CC
  #REPLACE MSG_REQUEST_CLEAR_FILE   |CI$01CD

  #REPLACE DFLT$VALUE X
  #REPLACE DFLT$MESSAGE X
  #REPLACE DFLT$AUX_VALUE X
  #REPLACE DFLT$SHADOW_STATE X
  #REPLACE DFLT$SELECT_STATE X
  #REPLACE DFLT$CHECKBOX_ITEM_STATE X
  #REPLACE DFLT$AUTOCLEAR_STATE X
  #REPLACE DFLT$CENTER_STATE X
  #REPLACE DFLT$ENTRY_STATE X
  #REPLACE DFLT$ITEM_CHANGED_STATE X
  #REPLACE DFLT$ITEM_ENTRY_MSG X
  #REPLACE DFLT$ITEM_EXIT_MSG X
  #REPLACE DFLT$ITEM_VALIDATE_MSG X
  #REPLACE DFLT$DATA_FILE X
  #REPLACE DFLT$DATA_FIELD X
  #REPLACE DFLT$DATA_WINDOW X
  #REPLACE DFLT$ITEM_OPTIONS X
  #REPLACE DFLT$ITEM_OPTION X
  #REPLACE DFLT$PROMPT_OBJECT X
  #REPLACE DFLT$ZOOM_OBJECT X

  // Object commands
  #REPLACE OBJ$INIT         $0440
  #REPLACE OBJ$CREATE       $0441
  #REPLACE OBJ$ILIST        $0442
  #REPLACE OBJ$ITEM         $0443
  #REPLACE OBJ$ENDILIST     $0444
  #REPLACE OBJ$ACCLIST      $0445 // not used
  #REPLACE OBJ$ONKEY        $0446
  #REPLACE OBJ$ENDALIST     $0447 // not used
  #REPLACE OBJ$ENDDEFINE    $0448 // not used
  #REPLACE OBJ$IODISPATCH   $0449
  #REPLACE OBJ$SET          $044A
  #REPLACE OBJ$GET          $044B
  #REPLACE OBJ$SEND         $044C
  #REPLACE OBJ$FIX          $044D  // not used
  #REPLACE OBJ$END          $044E
  #REPLACE OBJ$FWDFIX       $044F  // not used
  #REPLACE OBJ$HRET         $0450
  #REPLACE OBJ$ITEM_EXEC    $0451
  #REPLACE OBJ$ACCEPT       $0452
  #REPLACE CREATE$CLASS     $0453
  #REPLACE HANDLE$FOR       $0454
  #REPLACE OBJ$END$HANDLER  $0455
  #REPLACE LOCAL$ARGUMENT   $0456
  #REPLACE FIND$OBJECT      $0457
  #REPLACE END$CLASS        $0458
  #REPLACE CREATE$SUB$PAGE  $0459
  #REPLACE CLONE$CLASS      $045A
  #REPLACE OBJ$ENTRY$ITEM   $045B
  #REPLACE MOVE$SUB$PAGE    $045C
  #REPLACE OBJ$TIMER        $045D
  #REPLACE SCREEN$OPT       $045E
  #REPLACE CREATE$PROPERTY  $045F
  #REPLACE REDEFINE$SUB$PAGE $0464

  //Focus modes:
  #REPLACE FOCUSABLE    |CI0
  #REPLACE NONFOCUSABLE |CI1
  #REPLACE POINTER_ONLY |CI2
  #REPLACE NO_ACTIVATE  |CI3

  //Search modes:
  #REPLACE FIRST_CHARACTER  |CI0
  #REPLACE INCREMENTAL      |CI1
  #REPLACE CAPITAL          |CI2
  #REPLACE NO_SEARCH        |CI3

  //Delegation modes:
  #REPLACE DELEGATE_TO_PARENT       |CI0
  #REPLACE NO_DELEGATE_OR_ERROR     |CI1
  #REPLACE NO_DELEGATION            |CI2
  #REPLACE RETURN_INVALID_MESSAGE   |CI3
  #REPLACE DELEGATE_PRIOR_LEVEL     |CI4

  //Location modes:
  #REPLACE ABSOLUTE         |CI0
  #REPLACE RELATIVE         |CI1
  #REPLACE ITEM_RELATIVE    |CI2

  //Sort modes:
  #REPLACE ASCENDING        |CI0
  #REPLACE DESCENDING       |CI1

  //Select Modes:
  #REPLACE NO_SELECT        |CI0
  #REPLACE SINGLE_SELECT    |CI1
  #REPLACE MULTI_SELECT     |CI2
  #REPLACE AUTO_SELECT      |CI3

  //Entry item options:
  #REPLACE IWINDOW          $C0A1
  #REPLACE IENTRY           $C0A2
  #REPLACE IEXIT            $C0A3
  #REPLACE IVALIDATE        $C0A4
  #REPLACE IZOOM            $C0A5
  #REPLACE IPROMPT          $C0A6

  //Import modes
  #REPLACE INHERIT          1
  #REPLACE NO_OVERWRITE     2

  //System integers
  #REPLACE CURRENT_OBJECT     |VI85 
  #REPLACE FORWARD$MESSAGE    |VI87
  #REPLACE CURRENT_MESSAGE    |VI88 
  #REPLACE TOTAL_OBJECTS      |VI89

  // Define the desktop objects
  #REPLACE NULL_OBJECT          |CI0
  #REPLACE CLIPBOARD            |CI1
  #REPLACE CLIPBOARD.N          |CI0
  //#REPLACE DESKTOP              |CI2            // now defined in flex$init
  #REPLACE DESKTOP.N            |CI0
  //#REPLACE END_FUNCTION         END_PROCEDURE   // now defined in flex$init
  //#REPLACE PROCEDURE_RETURN     FUNCTION_RETURN // now defined in flex$init
  #REPLACE NO_IMAGE             |CI-9999

  #REPLACE CURRENT              |CI-99 //use current item#
  #REPLACE TOGGLE_STATE         |CI3   //toggle boolean state
  #REPLACE UPWARD_DIRECTION     |CI0   //scroll up
  #REPLACE DOWNWARD_DIRECTION   |CI1   //scroll down

  #REPLACE GET_SCROLLBAR        |CI$4000
  #REPLACE GET_CLIPBOARD        |CI$4001
  #FREG |CI$4000 RETURNS INTEGER
  #FREG |CI$4001 RETURNS INTEGER

  #REPLACE ERROR_OBJECT_ID      |VI100
  #REPLACE ERROR_TYPE           |VI101

  #REPLACE ERROR_CHILD_INHERITS_PARENT  |CI0
  #REPLACE ERROR_OFF_IN_CHILD           |CI1
  #REPLACE ERROR_DEFAULT_IN_CHILD       |CI2

  //deactivate search modes
  #REPLACE SCOPE_TYPE                   |CI1
  #REPLACE POPUP_TYPE                   |CI2
  #REPLACE AREA_TYPE                    |CI3
  
  //add_focus/activate/deactivate/release_focus error return codes
  #REPLACE ERROR_ENTERING               |CI1
  #REPLACE ERROR_EXITING                |CI2
  #REPLACE ERROR_ACTIVATING             |CI3
  #REPLACE ERROR_DEACTIVATING           |CI4
  #REPLACE ERROR_CANT_ACCEPT_FOCUS      |CI5
  #REPLACE ERROR_CANT_CREATE_TREE       |CI6
  #REPLACE ERROR_ADD_TO_INACTIVE_OBJECT |CI7
  #REPLACE ERROR_NO_FOCUSABLE_CHILDREN  |CI8

  #CHKSUB 1 1                   // Verify the UI subsystem.
  !A [] OBJ$INIT |CI0           // INITIALIZE_INTERFACE
  #FREF OBJ$DESK$NUM !a         // Number of desktop dependants
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//     Object ObjectName IS [A|AN] ObjectClass {ImageName} {SubImageNames...}
//
//   Parameters:
//     ObjectName is a string.
//     ObjectClass is an integer.
//     ImageName is a string.
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND OBJECT R "IS" "A""AN" RVD#I
  #IF (!0<5)                // if no image try to aquire one
    OBJECT !1 !2 !3 !4 !1
  #ELSE
    #DATA               // start up the data stream
    #PUSH !Zj               // save the unique object label
    #PUSH !b                // save current definition state
    #IF (!b = 4)            // if in procedure and not class
      #SET ZJ$ 0                // do not inc z
    #ELSE
      #SET ZJ$ !ZB          // assign the next object id
    #ENDIF
    #PUSH !Zb               // save this level on stack
    #IFDEF !4.AGG           // was this a class with sub objects?
      #SET ZB$ !4.AGG           // sub objects will begin at the
    #ELSE               // next object after superclass
      #SET ZB$ 0                // base classes start at 0
    #ENDIF
    #SET ZI$ !ZI                // count this object at the current level
    #PUSH !Zi               // and push the level
    #IF (!b > 0)            // if (in_object | in_class)
      #IF (!b & 2)              // obj_flag == in_class?
        #REPLACE !$.!1.OBJ |CI-!Zj  // object_name = -current_object
      #ENDIF
      #SET ZJ$ (32766-!a)           // a very unique label for this object
      #DPUSH |CS".!1"           // make name from parent and child
    #ELSE               // global object name
      #DPUSH |CS"!1"            // assign an absolute name to object
    #ENDIF    
    #CHECK U_!4 _U          // does class exist?
    #DPUSH U_!4             // define then class the class id
    GET$OBJ$IMAGE !5            // define the objects image
    #IF ((!b & 3) = 2)          // if in_class & !in_object
      #DPUSH !$.!1.OBJ          // pick the assigned dependant number
    #ELSE               // 
      #IF (!b = 0)          // A global object must assign #
        #IFDEF !1.OBJ           // Is the symbol defined, name_object?
          #DPUSH |CI0           // pick the next dependant number
        #ELSE
          #DPUSH |CI!Zj         // force the dependant number
          #SET ZJ$ ($1000+!Zj)       // mark as global object
          #REPLACE !1.OBJ |CI!Zj        // Assign an ID to this object
        #ENDIF
      #ELSE
        #DPUSH |CI0         // pick the next dependant number
      #ENDIF
    #ENDIF
    REGISTER_OBJECT !1
    #DPUSH GET_!1
    #SET B$ (!b | 1)            // we are in a object definition
    !A [] OBJ$CREATE |VL        // create the object now

    #IFDEF !1.OBJ
      #IFCLASS !1.OBJ V$        // does this object have a global?
        MOVE CURRENT_OBJECT TO !1.OBJ   // Move the object id to its global
      #ENDIF
    #ENDIF

    #SPUSH !$   //save the old class name
    #SET $$ !4
    #IFSUB '!$$SC' // if flex-defined class
      #IFSUB '!$$SM' // if begin-instance macro exists
        !$$SM !$ !5 !6 !7 !8 !9
      #ELSE
        FORWARD_BEGIN_CONSTRUCT !$ !5 !6 !7 !8 !9
      #ENDIF
    #ELSE
      ADD$IMAGE$ARGS MSG_CONSTRUCT_OBJECT !5 !6 !7 !8 !9  //else use default
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND GET$OBJ$IMAGE          // identify the image type
  #IFDEF !1             // is it a int (dynamic?)
    #DPUSH !1
  #ELSE
    #IFDEF !1.N             // try typical naming scheme
      #DPUSH !1.N
    #ELSE
      #DPUSH |CI0           // not found, make it dynamic
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND ADD$IMAGE$ARGS         // pass sub image args to constructor
  #IF (!0>0)                // while there are args to process
    #IFDEF !1               // image name a int?
      #IFSAME !1 MSG_CONSTRUCT_OBJECT   // a special flag to get it going
        #DATA               // start the data stream
      #ENDIF
      #DPUSH !1             // save the message or image id
    #ELSE
      #IFDEF !1.N           // typical image name
        #DPUSH !1.N
      #ELSE
        #DPUSH |CI0         // dynamic image name
      #ENDIF
    #ENDIF
    ADD$IMAGE$ARGS !2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    !A [] OBJ$SEND CURRENT_OBJECT |VL
  #ENDIF    
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Register_Object Object_Name
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND REGISTER_OBJECT R
  #IFDEF GET_!1
  #ELSE
    #REPLACE GET_!1 |CI!ZH
    #FREG GET_!1 RETURNS INTEGER
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//     ITEM_LIST
//
//   Parameters:
//     None.
//
//   Description:
//     This is the startment that markes the beginning of a list of
//     items to be attached to the current object.  A list class object
//     can not have a item list.    
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND ITEM_LIST .
  #PUSH !Zg
  #PUSH !Zj
  #SET ZJ$ !a
  #PUSH !Zj
  #SET ZG$ 0              // Set the item counter to zero.  This is used to
                         // count and assign ID's to the items.
  !A [] OBJ$ILIST |CI0   // Create the command to save the item count,
  #FREF OBJ$!Zj$INUM !a    // and tell flex to update it later.
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//    ON_Item {Value} {[SEND Message {TO Object} | BEGIN_PULL_DOWN Pull_Down_Name {Pull_Down_Image}]}
//
//   Parameters:
//     Value is a string.
//     Message is a integer.
//     Object is a integer.
//
//   Description:
//     The ITEM command adds the next item to the current object list.
//     The Message is the value which will be passed to the handler
//     if this item is selected.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND ON_ITEM NDI """SEND""BEGIN_PULL_DOWN"
  #IF (!0<2)
    #IF (!0<1)
      ON_ITEM '' SEND MSG_NONE
    #ELSE
      ON_ITEM !1 SEND MSG_NONE
    #ENDIF
  #ELSE
    #IFSAME !1 SEND
      ON_ITEM '' !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 SEND
        #SET ZG$ !ZG                   // Increment the item counter 
        #IFSAME !4 TO
          #CHECK !6 .
          #DATA
          #IFDEF !3
            #DPUSH !3           // Push the (variable) message
          #ELSE
            #IFDEF MSG_!3
              #DPUSH MSG_!3     // Push the constant message
            #ELSE
              #DPUSH |CI0
              #FREF MSG_!3 !a,0     // Forward fef the message
            #ENDIF  
          #ENDIF  
          #IFDEF !5
            #DPUSH !5           // Push the (expression, var) dest object 
          #ELSE
            #IFDEF !5.OBJ
              #DPUSH !5.OBJ     // Push the global object
            #ELSE
              #DPUSH |CI0
              #FREF !5.OBJ !a,1     // Forward ref the object
            #ENDIF
          #ENDIF
          !A [] OBJ$ITEM_EXEC !1 |VL
        #ELSE
          #IF (!0 > 3)
            #CHECK !4 "TO"
          #ENDIF
          #IFDEF MSG_!3
            !A [] OBJ$ITEM MSG_!3 !1       // Create the item passing name and value.
          #ELSE
            #IFDEF !3
              !A [] OBJ$ITEM !3 !1         // Create the item passing name and value.
            #ELSE
              !A [] OBJ$ITEM |CI0 !1       // Create the item passing name and value.
              #FREF MSG_!3 !a              // fix value later with procedure address
            #ENDIF
          #ENDIF
        #ENDIF
      #ELSE
        #IFSAME !2 BEGIN_PULL_DOWN
          #CHECK !3 R
          REGISTER_OBJECT !3
          ON_ITEM !1 SEND ACTIVATE_PULL_DOWN TO (!3(CURRENT_OBJECT))
          #IFSUB 'END_MENU'
            CREATE_MENU !3 SUB_LOCATION !4 !5 !6 !7 !8 !9
          #ELSE
            #ERROR 1000 INVALID ARGUMENT: "BEGIN_PULL_DOWN" REQUIRES MENU_SYSTEM PACKAGE
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//      Repeat_Item Count# TIMES {Item_Syntax}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND REPEAT_ITEM _RNDE "TIMES"
  ON_ITEM !3 !4 !5 !6 !7 !8 !9
  #SET Q$ (!1-1)
  #IF (!q>0)
    REPEAT_ITEM !q TIMES !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  Entry_Item File.Field {Entry_Options}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND ENTRY_ITEM R
  #SET ZG$ !ZG
  #DATA
  #IFCLASS !1 "EC"
    #ENTOPT {$C0A0=!1,$C002,$C003,!2}
  #ELSE
    #ENTOPT {$C0A0=!1,!2}
  #ENDIF
  !A [] OBJ$ENTRY$ITEM |CI0 |VL
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//     END_ITEM_LIST
//
//   Parameters:
//     None.
//
//   Description:
//     The END_ITEM_LIST command marks the end of a list of items.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND END_ITEM_LIST .
  #POP ZJ$
  #REPLACE OBJ$!Zj$INUM |CI!Zg     // Update the count in the ITEM_LIST cmd.
  !A [] OBJ$ENDILIST OBJ$!Zj$INUM         // Tell runtime this is the end of list.
  #POP ZJ$
  #POP ZG$
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  END_PULL_DOWN
//
//   Parameters:
//  None.
//
//   Description:
//      Ends the structure of an ON_ITEM ... BEGIN_PULL_DOWN ... as used by
//      Menu_System package.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND END_PULL_DOWN .
  #IFSUB 'END_MENU'
    END_ITEM_LIST
    END_OBJECT
  #ELSE
    #ERROR 1000 INVALID ARGUMENT: "BEGIN_PULL_DOWN" REQUIRES MENU_SYSTEM PACKAGE
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  On_Key KeyName SEND Message {TO Object} {PRIVATE}
//
//   Parameters:
//     KeyName is a valid hot key name.
//     Message is valid message name.
//     Object is the a valid object name.
//
//   Description:
//     The ON_KEY command tells the menu manager to pass the
//     specified Message code to the specified Object when the 
//     KeyNAme is pressed.  If no Object name is passed, the current
//     object is used.  Passing MSG_NONE for Message causes the key to do
//     nothing, passing MSG_DEFAULT_KEY will restore the default key definition.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND ON_KEY RULGBO#SDN "SEND" RLGBO#SDN """TO""PRIVATE" _DNOB """PRIVATE" .
  #IFSAME !4 PRIVATE
    ON_KEY !1 !2 !3 TO |CI-1 PRIVATE
  #ELSE      
    #DATA
    #DPUSH !1
    #IFSAME !4 TO
      #IFDEF !5
        #DPUSH !5
      #ELSE
        #IFDEF !5.OBJ
          #DPUSH !5.OBJ
        #ELSE
          #DPUSH |CI0
          #FREF !5.OBJ !a,1
        #ENDIF
      #ENDIF
    #ELSE
      #DPUSH |CI-1
    #ENDIF
    #IFSAME !6 PRIVATE
      #DPUSH |CI1
    #ENDIF
    #IFDEF !3
      !A [] OBJ$ONKEY !3 |VL
    #ELSE
      #IFDEF MSG_!3
        !A [] OBJ$ONKEY MSG_!3 |VL
      #ELSE             // else the command is defined in flex code
        !A [] OBJ$ONKEY |CI0 |VL        // get flex to fix the fwd ref
        #FREF MSG_!3 !a
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//     END_OBJECT
//
//   Parameters:
//     None required
//
//   Description:
//     END_OBJECT tells the manager we are done defining an object.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND END_OBJECT 
  //
  // The following section was added 01-08-90 by SAL to support inheritable
  // end-instance macros for classes
  //
  #IFSUB '!$$SC'  //if flex-defined class
    #IFSUB '!$$EM'  //if end-instance macro defined for class,
      !$$EM !$ !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      FORWARD_END_CONSTRUCT !$ !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    DEFAULT_END_OBJECT  //else use default
  #ENDIF
  #SPOP           //restore old class name
  //
  // end of addition 01-08-90 by SAL
  //
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//     DEFAULT_END_OBJECT
//
//   Parameters:
//     NONE
//
//   Description:
//     This command terminates an object declaration
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND DEFAULT_END_OBJECT .
  !A [] OBJ$END //Mark the end of the object list.
  #POP ZI$              //restore sub_obj_count
  #POP ZB$              //restore current_dep
  #POP B$               //restore obj_flag
  #POP ZJ$              //restore temp label
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Start_Ui {Object}
//
//   Parameters:
//     NONE
//
//   Description:
//  This command will dispatch io to the current focus.  it will
//  remain in this routine until a non-zero return code is received.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND START_UI
  #IF (!0>0)
    SEND ACTIVATE TO !1
  #ENDIF
  !A [] OBJ$IODISPATCH |CI0 |CI0
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  UI_ACCEPT Object {GROUP | OBJECT} TO ReturnValue
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND UI_ACCEPT RSDGBO#L RDGBO#L RDGBO#L _CEL#BOG .
  #IFSAME !2  GROUP OBJECT
    #CHECK !3 "TO"
    #DATA
    #IFSAME !2 GROUP
      #DPUSH |CI1
    #ELSE
      #IFSAME !2 OBJECT
        #DPUSH |CI0
      #ENDIF
    #ENDIF
    #DPUSH !4
    #IFDEF !1
      !A [] OBJ$ACCEPT !1 |VL
    #ELSE
      #IFDEF !1.OBJ
        !A [] OBJ$ACCEPT !1.OBJ |VL
      #ELSE
        !A [] OBJ$ACCEPT |CI0 |VL
        #FREF !1.OBJ !a
      #ENDIF
    #ENDIF
  #ELSE
    UI_ACCEPT !1 OBJECT !2 !3 !4 !5 !6 !7
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  SET Property {OF Object} {ITEM #} TO Value {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND SET
  GET$SET SET !1 !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  GET Property {OF Object} {ITEM #} TO Value {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND GET
  GET$SET GET !1 !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  FORWARD {GET | SET | SEND} Property {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND FORWARD "GET""SET""SEND"
  MOVE 1 TO FORWARD$MESSAGE
  !1 !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  DELEGATE {GET | SET | SEND} Property {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND DELEGATE "GET""SET""SEND"
  MOVE 8 TO FORWARD$MESSAGE
  !1 !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  BROADCAST {RECURSIVE | RECURSIVE_UP} {IGNORE_RETURN} {GET | SET | SEND} Property {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND BROADCAST "GET""SET""SEND""RECURSIVE""RECURSIVE_UP""NO_STOP"
  #IFSAME !1 RECURSIVE RECURSIVE_UP
    #CHECK !2 '"GET""SET""SEND""NO_STOP"'
    #IFSAME !1 RECURSIVE
      MOVE 20 TO FORWARD$MESSAGE    // broadcast + recursive_down
    #ELSE
      MOVE 68 TO FORWARD$MESSAGE    // broadcast + recursive_up
    #ENDIF
    #IFSAME !2 NO_STOP
      #CHECK !3 '"GET""SET""SEND"'
      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // no stop on non-0 return
      !3 !4 !5 !6 !7 !8 !9
    #ELSE
      !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    MOVE 4 TO FORWARD$MESSAGE       // broadcast
    #IFSAME !1 NO_STOP
      #CHECK !2 '"GET""SET""SEND"'
      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // + no_stop
      !2 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND BROADCAST_FOCUS "GET""SET""SEND""RECURSIVE""RECURSIVE_UP""NO_STOP"
  #IFSAME !1 RECURSIVE RECURSIVE_UP
    #CHECK !2 '"GET""SET""SEND""NO_STOP"'
    #IFSAME !1 RECURSIVE
      MOVE 52 TO FORWARD$MESSAGE    // broadcast + focus + recursive_down
    #ELSE
      MOVE 100 TO FORWARD$MESSAGE   // broadcast + focus + recursive_up
    #ENDIF
    #IFSAME !2 NO_STOP
      #CHECK !3 '"GET""SET""SEND"'
      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // no stop on non-0 return
      !3 !4 !5 !6 !7 !8 !9
    #ELSE
      !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    MOVE 36 TO FORWARD$MESSAGE      // broadcast + focus
    #IFSAME !1 NO_STOP
      #CHECK !2 '"GET""SET""SEND"'
      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // + no_stop
      !2 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND GET$SET
  #IFSAME !3 OF
    #IFSAME DFLT$!2 X       // is this a item type message?
      #IFSAME !5 ITEM       // is the item keyword used?
        OBJECT$PROPERTIES !1 !2 !4 !6 !7 !8 !9 // pass it on
      #ELSE
        OBJECT$PROPERTIES !1 !2 !4 -99 !5 !6 !7 !8 !9  // use dflt
      #ENDIF
    #ELSE
      #IFSAME !5 TO
        OBJECT$PROPERTIES !1 !2 !4 !6 !7 !8 !9  // just supply args
      #ELSE
        OBJECT$PROPERTIES !1 !2 !4 !5 !6 !7 !8 !9  // just supply args
      #ENDIF
    #ENDIF
  #ELSE
    GET$SET !1 !2 OF CURRENT_OBJECT !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND


// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: OBJECT$PROPERTIES
//
//   Parameters:
//  {GET | SET} PROPERTY OBJECT { {ITEM #} | TO } VALUE {...}
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND OBJECT$PROPERTIES "GET""SET" RD#OBLG RSND#OBLG R
  #DATA
  #IFDEF !2         // is message in a variable?
    #DPUSH !2           // yes, just push the value
  #ELSE
    #IFDEF !1_!2        // is this message defined?
      #DPUSH !1_!2      // yes, push the definition
    #ELSE
      #DPUSH |CI0       // forward reference the message
      #FREF !1_!2 !a,0      // add the reference to be defined
    #ENDIF
  #ENDIF
  #PUSH !Zg
  #SET ZG$ 0
  PROPERTY$HELP !4 !5 !6 !7 !8 !9
  #POP ZG$
  #IFDEF !3
    !A [] OBJ$!1 !3 |VL
  #ELSE
    #IFDEF !3.OBJ
      !A [] OBJ$!1 !3.OBJ |VL
    #ELSE
      !A [] OBJ$!1 |CI0 |VL
      #FREF !3.OBJ !a
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND PROPERTY$HELP
  #IF (!0>0)
    #IFSAME !1 TO
    #ELSE
      #IFSAME !1 ITEM
      #ELSE
        #SET ZG$ !ZG
        #IFDEF !1
          #DPUSH !1
        #ELSE
          #IFCLASS !1 0123456789ABCDEF
            #DPUSH !1
          #ELSE
            #IFDEF MSG_!1
              #DPUSH MSG_!1
            #ELSE
              #DPUSH |CI0
              #FREF MSG_!1 !a,!Zg
            #ENDIF
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
    PROPERTY$HELP !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Send Message {OptionalArguments...} {TO Object} {OptionalArguments...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND SEND RSD#OBLG
  #DATA
  #IFDEF !1
    #DPUSH !1
  #ELSE
    #IFDEF MSG_!1
      #DPUSH MSG_!1
    #ELSE
      #DPUSH |CI0
      #FREF MSG_!1 !a,0
    #ENDIF
  #ENDIF
  #IFSAME !2 TO
    SEND$HELP !4 !5 !6 !7 !8 !9
    SEND$CMD TO !2 !3
  #ELSE
    SEND$HELP !2 !3 !4 !5 !6 !7 !8 !9
    SEND$CMD TO TO CURRENT_OBJECT
  #ENDIF
#ENDCOMMAND 

#COMMAND SEND$HELP U
  #IF (!0>0)
    #DPUSH !1
    SEND$HELP !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

#COMMAND SEND$CMD
  #IFSAME !1 !2
    #IFDEF !3
//      !A [] OBJ$SEND !3 |VL
      !A [] $044C !3 |VL
    #ELSE
      #IFDEF !3.OBJ
        !A [] OBJ$SEND !3.OBJ |VL
      #ELSE
        !A [] OBJ$SEND |CI0 |VL
        #FREF !3.OBJ !a
      #ENDIF
    #ENDIF
  #ELSE
    !A [] OBJ$SEND CURRENT_OBJECT |VL
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Procedure {Set} Message {FOR Class} {{Type Argument} ...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND PROCEDURE R
  #IFSAME !1 SET
    HANDLE$MESSAGE SET_!2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    HANDLE$MESSAGE MSG_!1 !2 !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Function Message {FOR Class} {Type Argument} RETURNS Type
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND FUNCTION R
    HANDLE$MESSAGE GET_!1 !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND


// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: HANDLE$MESSAGE Message { FOR Class } { RETURNS Type } { Type Argument }
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND HANDLE$MESSAGE RGOBL#
  #IF (!b & 4)
    #ERROR 100 Procedures and Functions may .not. be nested.
  #ENDIF
  #CHECK NUM_ARGUMENTS _T
  #PUSH !Zg
  #PUSH !Za
  #SET ZA$ !a
  #PUSH !Zu
  #DATA
  #STKSYM               // forget all old stack symbols
  #SET B$ (!b | 4)          // set flag to in_procedure
  #REPLACE NUM_ARGUMENTS |SI0       // define the arg count
  #IFSAME !2 GLOBAL
    #DPUSH |CI0         // No message
    #DPUSH |CI0         // for no class
    #CHECK !1 T         // cant have dups of these globals
    #SET ZG$ (0-!a-2)       // make it negative to distuinguish it
    #REPLACE !1 |CI!Zg      // this will cause all fwd refs to be fixed.
    #IF (!0>1)              // do we have arguments?
      #SET ZG$ 1                    // starting argument number
      DEFINE_ARGUMENTS !3 !4 !5 !6 !7 !8 !9
    #ENDIF
    #FREG !1 !2 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !2 FOR          // are we explict about the class?
      MESSAGE$ADDRESS !1            // create id symbol for this message
      #DPUSH !1
      #IFDEF !3
        #IFSAME !3 DESKTOP
          #DPUSH U_DESKTOP      // Message for the desktop class
        #ELSE
          #DPUSH !3         // Message for the named class
        #ENDIF
      #ELSE
        #CHECK U_!3 RSDNU           // check the class for goodness
        #DPUSH U_!3         // Message for the named class
      #ENDIF
      #IF (!0>3)
        #SET ZG$ 1                  // starting argument number
        DEFINE_ARGUMENTS !4 !5 !6 !7 !8 !9
      #ENDIF
      #FREG !1 !4 !5 !6 !7 !8 !9
    #ELSE
      #IF (!b & 2)              // obj_flag == in_class?
        MESSAGE$ADDRESS !1      // yes, same as handle "for"
        #DPUSH !1               // the message
        #DPUSH U_!$         // handle msg for "current class"
      #ELSE
        #IF (!b & 1)            // in_object, instance method
          !A [] CLONE$CLASS
          MESSAGE$ADDRESS !1        // yes, same as handle "for"
          #DPUSH !1         // the message
          #DPUSH |CI0           // handle for objects class
        #ELSE               // just your simple global message
          #DPUSH |CI0           // No message
          #DPUSH |CI0           // for no class
          #CHECK !1 T           // cant have dups of these globals
          #SET ZG$ (0-!a-2)     // make it negative to distuinguish it
          #REPLACE !1 |CI!Zg        // this will cause all fwd refs to be fixed.
        #ENDIF
      #ENDIF
      #IF (!0>1)                // do we have arguments?
        #SET ZG$ 1                  // starting argument number
        DEFINE_ARGUMENTS !2 !3 !4 !5 !6 !7 !8 !9
      #ENDIF
      #FREG !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
//  !A [] HANDLE$FOR |CI0 |VL     // handle the message
  !A [] $0454 |CI0 |VL
  #FREF OBJ$!Za$ENDPROC !a      // fref the end procedure line
  #SET ZG$ 0                    // starting argument number for locals
#ENDCOMMAND

#COMMAND MESSAGE$ADDRESS
  #IFDEF !1
  #ELSE             // assign the next message number now
    #SET ZC$ !ZC
    #IF (!Zc>$0FFF)
      #ERROR 100 Maximum number of message/property definitions exceeded
    #ELSE
      #REPLACE !1 |CI!Zc      // this will cause all fwd refs to be fixed.
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Register_Procedure Message {FOR Class} {{Type Argument} ...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND REGISTER_PROCEDURE R
  #IFSAME !1 GLOBAL
    #ERROR 101 GLOBAL PROCEDURES CANNOT BE REGISTERED
  #ELSE
    #IFSAME !1 SET
      MESSAGE$ADDRESS SET_!2
    #ELSE
      MESSAGE$ADDRESS MSG_!1
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  Register_Function Message {FOR Class} {{Type Argument} ...} RETURNS Type
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND REGISTER_FUNCTION R
  #IFSAME !1 GLOBAL
    #ERROR 101 GLOBAL FUNCTIONS CANNOT BE REGISTERED
  #ELSE
    MESSAGE$ADDRESS GET_!1
    #IFSAME !2 FOR
      #FREG GET_!1 !4 !5 !6 !7 !8 !9
    #ELSE
      #FREG GET_!1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

#COMMAND DEFINE_ARGUMENTS
  #IF (!0>0)
    #IFSAME !1 STRING
      #REPLACE !2 |SS-!ZG
    #ELSE
      #IFSAME !1 NUMBER
        #REPLACE !2 |SN-!ZG
      #ELSE
        #IFSAME !1 INTEGER
          #REPLACE !2 |SI-!ZG
        #ELSE
          #IFSAME !1 DATE
            #REPLACE !2 |SD-!ZG
          #ELSE
            #IFSAME !1 REAL
              #REPLACE !2 |SR-!ZG
            #ENDIF
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
    DEFINE_ARGUMENTS !3 !4 !5 !6 !7 !8 !9
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  END_PROCEDURE
//
//   Parameters:
//  None.
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND END_PROCEDURE .
  #SET B$ (!b & 3)       // reset flag to in_procedure
  #POP U$
  #REPLACE OBJ$!Za$LNUM |CI!Zg     // Update the count in the local cmd.
//  !A [] OBJ$END$HANDLER |CI0
  !A [] $0455 |CI0
  #REPLACE OBJ$!Za$ENDPROC !a
  #POP U$
  #POP ZG$
  #STKSYM
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  FUNCTION_RETURN {OptionalReturnValue}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND FUNCTION_RETURN UGO .
  #IF (!0 > 0)
//    !A [] OBJ$HRET !1
    !A [] $0450 !1
  #ELSE
//    !A [] OBJ$HRET |CI0
    !A [] $0450 |CI0
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  LOCAL {STRING | NUMBER | DATE | INTEGER | REAL} LocalName {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND LOCAL T T
  #IF (!0>0)
    #CHECK !1 '"STRING""NUMBER""DATE""INTEGER""REAL"'
    #CHECK !2 RT
    #IFDEF NUM_ARGUMENTS
      #IF (!Zg = 0)
//        !A [] LOCAL$ARGUMENT |CI0  // Create the command to save the local count,
        !A [] $0456 |CI0
        #FREF OBJ$!Za$LNUM !a       // and tell flex to update it later.
      #ENDIF
      #IFSAME !1 STRING
        #REPLACE !2 |SS!ZG
      #ELSE
        #IFSAME !1 NUMBER
          #REPLACE !2 |SN!ZG
        #ELSE
          #IFSAME !1 DATE
            #REPLACE !2 |SD!ZG
          #ELSE
            #IFSAME !1 INTEGER
              #REPLACE !2 |SI!ZG
            #ELSE
              #IFSAME !1 REAL
                #REPLACE !2 |SR!ZG
              #ENDIF
            #ENDIF
          #ENDIF
        #ENDIF
      #ENDIF
    #ELSE
      !1 !2
    #ENDIF
    #IF (!0>2)
      LOCAL !1 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  Class New_Class IS A|AN Old_Class {STARTMAC StartMacro} {ENDMAC EndMacro}
//        {FgColor BgColor {HandlerName}}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND CLASS _RCDNSO "IS" "A""AN" _RDNO //_UGBO#L _UGBO#L _GBO#L .
  #CHECK U_!4 _U                      // does class exist?
  #REPLACE !1$SC !4                   //define superclass of new class
  #IFSAME !5 STARTMAC                 //if start macro specified,
    #REPLACE !1$SM !6                 //remember its name
    #IFSAME !7 ENDMAC                 //if end macro specified,
      #REPLACE !1$EM !8               //remember it
      BASE_CREATE_CLASS !1 !2 !3 !4 !9
    #ELSE
      BASE_CREATE_CLASS !1 !2 !3 !4 !7 !8 !9
    #ENDIF
  #ELSE
    #IFSAME !5 ENDMAC                 //no STARTMAC - if ENDMAC specified,
      #REPLACE !1$EM !6               //remember it
      BASE_CREATE_CLASS !1 !2 !3 !4 !7 !8 !9
    #ELSE
      BASE_CREATE_CLASS !1 !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
// BASE_CREATE_CLASS New_Class IS A|AN Old_Class {FgColor BgColor {HandlerName}}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND BASE_CREATE_CLASS _RCDNSO "IS" "A""AN" _RDNO _UGBO#L _UGBO#L _GBO#L .
  #PUSH !b              // save obj_flag
  #PUSH !Zb             // save current_dep
  #PUSH !Zf             // save the super_class_count
  #SET B$ (!b | 2)          // set flag to in_class
  #SET ZB$ 0                // based on atomic class object
  #IF ( (!b & 1) = 0 )          // are we NOT in a create_object?
    #IFDEF !4.AGG               // bump dep number by already
      #SET ZB$ !4.AGG           // defined sub objects
    #ENDIF
  #ENDIF
  #SET ZF$ !Zb              // save the super_class_count
  #PUSH !Zi             // save current sub object count
  #SET ZI$ 0                // and init for new class

  #PUSH !x                  // save old property index
  #SET X$ 0                 //init to first array index# (0)

  #SPUSH !$             // save the old class name
  #SET $$ !1                // retain the name of the class
  #IFDEF U_!1               // if the new class id has already
  #ELSE                 // been defined, dont bother
    INTEGER U_!1            // else put it into a int of that name
  #ENDIF
  #DATA                 // wind up the stream
  #IFDEF !4
    #DPUSH !4
  #ELSE
    #DPUSH U_!4             // based upon
  #ENDIF
  #IF (!0<5)                
    #DPUSH |CI0             // no colors defined, use default
  #ELSE
    #DPUSH !5               // else do what they say
  #ENDIF
  #IF (!0<6)
    #DPUSH |CI0             // no colors defined, use default
  #ELSE
    #DPUSH !6               // else do what they say
  #ENDIF
  #IF (!0=7)                // if parameter used, this will be
    #DPUSH |CS"!7"          // the name of a 'C' function.
  #ELSE
    #DPUSH |CS""            // else inherit one from the parent
  #ENDIF
  !A [] CREATE$CLASS U_!1 |VL       // let 'er rip
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  END_CLASS
//
//   Parameters:
//  None.
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND END_CLASS .
  #SET ZI$ (!Zi+!Zf)                //subobject count = self + superclass
  #REPLACE !$.AGG |CI!Zi        //define subobject count
  !A [] END$CLASS U_!$ |CI!Zi

  #SPOP                 // restore the old class name
  #POP X$                   // reset the property index
  #POP ZI$                      // reset old sub_object_count
  #POP ZF$                      // reset super_class_count
  #POP ZB$              // reset current_dep
  #POP B$                   // reset obj_flag
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command:
//  PROPERTY Type Name PRIVATE | PUBLIC {InitialValue}
//
//   Parameters:
//      Type is a primitive DataFlex variable type, i.e. Integer, String...
//      Name is the local name of the property
//      PRIVATE indicates that no access handlers should be built
//      PUBLIC indicates that access/set handlers should be built (default)
//  InitialValue is the value the property is to have on creation
//
//   Description:
//      PROPERTY declares an attribute of a class, and optionally provides
//      get and set handlers to manipulate its value.  The class receiving
//      the property is assumed to have defined an array-object named
//      Attributes; properties will be stored in the Attributes array in the
//      order in which they are declared.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND PROPERTY R R """PRIVATE""PUBLIC" UGO .
  #IFSAME !3 PRIVATE
    PROPERTY !1 !$.!2 PUBLIC !4
  #ELSE
    #IF (!b & 1)        // in_object, instance method
      !A [] CLONE$CLASS     // Create a new class
    #ENDIF
    #DATA           // Start the property
    MESSAGE$ADDRESS GET_!2
    #DPUSH GET_!2       // Push the get property id
    #FREG GET_!2 RETURNS !1
    MESSAGE$ADDRESS SET_!2
    #DPUSH SET_!2       // Push the set property id
    #DTYPE Q$ !1        // get the property type in q
    #DPUSH |CI!q        // push the type
    #IF (!0 > 3)
      #DPUSH !4
    #ENDIF
    !A [] CREATE$PROPERTY |CI0 |VL
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  CALL RoutineName {Parameters ...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND CALL RGBO#L
  SEND !1 TO DESKTOP !2 !3 !4 !5 !6 !7 !8 !9
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  SUB_PAGE NewPage FROM FromPage ;
//      { (WindowNumber) | ;
//      ({VERTICAL|HORIZONTAL} FromWindow ForWindows) | ;
//      (RECTANGULAR FromWindow NumColumns NumRows) } {...}
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND SUB_PAGE RT "FROM" RGBO#L
  #PUSH !Zg             // h is the number of windows on
  #SET ZG$ 0                // the sub page.
  #DATA                 // start up the arguments
  #IFDEF !3
    #DPUSH !3               // based on variable page number
  #ELSE
    #CHECK !3.N U
    #DPUSH !3.N             // based on absolute page number
  #ENDIF
  SUB$IMAGE$DEFINE !4 !5 !6 !7 !8 !9    // loop thru the passed arguments
  #DPUSH |CI!Zg             // store the number of windows
  #IFDEF !1.N
    #IFCLASS !1.N "C"
      #ERROR 102 SUB_PAGE !1 ALREADY DEFINED AS A PHYSICAL IMAGE
    #ELSE
      !A [] REDEFINE$SUB$PAGE !1.N |VL    // create the sub image
    #ENDIF
  #ELSE
    INTEGER !1.N            // create a int to place page # into
    !A [] CREATE$SUB$PAGE !1.N |VL  // create the sub image
  #ENDIF
  #POP ZG$              // restore our general counter
#ENDCOMMAND

#COMMAND SUB$IMAGE$DEFINE
  #IF (!0>0)
    #IFSAME !1 VERTICAL         // define a vertical set of windows
        #DPUSH |CI-1          // vertical flag
        #DPUSH !2             // push the start window number
        #DPUSH !3             // and the number of windows
        #SET ZG$ (!Zg+!3)         // how many was that?
        SUB$IMAGE$DEFINE !4 !5 !6 !7 !8 !9    // one more time
    #ENDIF
    #IFSAME !1 HORIZONTAL     // horzontal (contiguous) windows
        #DPUSH |CI-2            // horizontal flag
        #DPUSH !2           // push the start window number
        #DPUSH !3           // and the number of windows
        #SET ZG$ (!Zg+!3)           // how many was that?
        SUB$IMAGE$DEFINE !4 !5 !6 !7 !8 !9  // one more time
    #ENDIF
    #IFSAME !1 RECTANGULAR      // a rectangular array of windows
        #DPUSH |CI-3          // the rect. flag
        #DPUSH !2         // push the start window number
        #DPUSH !3         // number of windows per row
        #DPUSH !4         // number of rows
        #SET ZG$ (!Zg+(!3*!4))        // not bad huh
        SUB$IMAGE$DEFINE !5 !6 !7 !8 !9   // and again
    #ENDIF
    #IFSAME !1 VERTICAL RECTANGULAR HORIZONTAL // May look strange, but reduces
    #ELSE                                      // use of #if stack levels.
        #DPUSH !1         // its just a single window def
        #SET ZG$ !ZG          // just add one
        SUB$IMAGE$DEFINE !2 !3 !4 !5 !6 !7 !8 !9  // recurse
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND MOVE_SUB_PAGE _RDOBR "TO" _RDOBRU
  #IFDEF !1
    !A [] MOVE$SUB$PAGE !1 !3
  #ELSE
    #CHECK !1.N U
    !A [] MOVE$SUB$PAGE !1.N !3
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  USE PackageName | UI
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND USE R
  #IFSUB '!1.EXISTS'
  #ELSE
    #REPLACE !1.EXISTS |CI!a
    #IFSAME !1 UI
      INITIALIZE_INTERFACE
    #ELSE
      #USE !1
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND VFIND R R R .
  MOVE !2 TO INDEX_NUMBER
  #IFSAME !3 $0 $1 $2 $3 $4
    #SET Q$ !3
    !A [] $CC !1 |CI!q
  #ELSE
    !A [] $CC !1 !3
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//
//   Parameters:
//
//   Description:
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND SCREEN_OPTIMIZE RL .
  #IFSAME !1 $0 $1
    #PUSH !Zg
    #SET ZG$ !1
    !A [] SCREEN$OPT |CI!Zg
    #POP ZG$
  #ELSE
    !A [] SCREEN$OPT !1
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//     FORWARD_BEGIN_CONSTRUCT ClassName { <argument> ... }
//
//   Parameters:
//     ClassName is the name of the class which owns the macro that is
//         forwarding.
//     <argument> is any argument required
//
//   Description:
//     This command allows the instance-creation macros defined for classes
//     to 'inherit' the instance-creation macro(s) defined by their
//     superclass(es).
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND FORWARD_BEGIN_CONSTRUCT R //<currentClassName> { <arg> ... }
  #IFSUB '!1$SC' // if flex-defined class
    #SPUSH !$
    #SET $$ !1$SC  //get superclass name
    #IFSUB '!$$SM' //if class defines start macro
      !$$SM !$ !2 !3 !4 !5 !6 !7 !8 !9   //invoke it
    #ELSE          //else not defined
      FORWARD_BEGIN_CONSTRUCT !$ !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
    #SPOP
  #ELSE
    ADD$IMAGE$ARGS MSG_CONSTRUCT_OBJECT !2 !3 !4 !5 !6 !7 !8 !9  //use default
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//     FORWARD_END_CONSTRUCT ClassName { <argument> ... }
//
//   Parameters:
//     ClassName is the name of the class which owns the macro that is
//       forwarding.
//     <argument> is any argument required
//
//   Description:
//     This command allows the instance-ending macros defined for classes
//     to 'inherit' the instance-ending macro(s) defined by their
//     superclass(es).
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND FORWARD_END_CONSTRUCT R //<currentClassName> { <arg> ... }
  #IFSUB '!1$SC' // if flex-defined class
    #SPUSH !$
    #SET $$ !1$SC  //get superclass name
    #IFSUB '!$$EM' //if end-instance macro defined,
      !$$EM !$ !2 !3 !4 !5 !6 !7 !8 !9  //use it
    #ELSE
      FORWARD_END_CONSTRUCT !$ !2 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
    #SPOP
  #ELSE
    DEFAULT_END_OBJECT  //else use default
  #ENDIF
#ENDCOMMAND

#COMMAND SET_DEFERRED &R .
  !A [] $460 !1
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//     NAME_ITEM <object_name> item names...
//
//   Description:
//      Gives names to items of objects in the form: object.item
//      Assumes item number has already been set.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#COMMAND NAME_ITEM RT#L R
  #IFDEF !2
    #CHECK !2 #LUVFEWNSG
    #SET Q$ !2
    NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !2 ITEM
      NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 COLUMN
        NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
      #ELSE
        #IFSAME !2 PROPERTY
          NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
        #ELSE
          #REPLACE !1.!2 !1.OBJ ITEM !q
          #SET Q$ (!q+1)
          #IF !0>2
              NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//     NAME_COLUMN <object_name> item names...
//
//   Description:
//      Gives names to items of objects in the form: object.item
//      Just like name_item except item numbers are relative to
//      base_item.    
//      Assumes item number has already been set.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#COMMAND NAME_COLUMN RT#L R
  #IFDEF !2
    #CHECK !2 #LUVFEWNSG
    #SET Q$ !2
    NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !2 ITEM
      NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 COLUMN
        NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
      #ELSE
        #IFSAME !2 PROPERTY
          NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
        #ELSE
          #REPLACE !1.!2 !1.OBJ ITEM (BASE_ITEM(!1.OBJ)+!q)
          #SET Q$ (!q+1)
          #IF !0>2
            NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
          #ENDIF
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//     NAME_PROPERTY <object_name> property names...
//
//   Description:
//      Gives names to property of objects in the form: object.item
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#COMMAND NAME_PROPERTY RT#L RT
  #IFSAME !2 ITEM
    NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  #ELSE
    #IFSAME !2 COLUMN
      NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
    #ELSE
      #IFSAME !2 PROPERTY
        NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
      #ELSE
        #REPLACE !1.!2 (!2(!1.OBJ))
        #IF !0>2
          NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
        #ENDIF
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//     NAME_OBJECT <object_name> ACCESS item names...
//          ACCESS = CHILD, GLOBAL, COLUMN, PROPERTY, ITEM or ACCESS METHOD.
//
//   Description:
//      Gives names to objects in the form: object.obj
//      and allows items, properties and COLUMNs to be defined.
//      Inits item number to zero and assumes item names follow.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND NAME_OBJECT RT#L R
  #SET Q$ 0
  #IFDEF !2
    #CHECK !2 R#LSD
    #REPLACE !1.OBJ !2
    #IF !0>2
      NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
//    #CHECK !2 "CHILD""ITEM""GLOBAL""COLUMN""PROPERTY"
    #IFSAME !2 CHILD
      REGISTER_OBJECT !1
      #IFDEF !3
        NAME_OBJECT !1 (!1(!3))  !4 !5 !6 !7 !8 !9
      #ELSE
        #CHECK !3.OBJ #LU
        NAME_OBJECT !1 (!1(!3.OBJ))  !4 !5 !6 !7 !8 !9
      #ENDIF
    #ELSE
      #IFSAME !2 GLOBAL
        #IFDEF !1.OBJ
          #CHECK !1.OBJ NSDFW#L
        #ELSE
          INTEGER !1.OBJ
        #ENDIF
        #IFCLASS !1.OBJ V$
          #IF (!b & 1)
            MOVE CURRENT_OBJECT TO !1.OBJ
          #ELSE
            #IF (!b)
              #ERROR 100 NAME_OBJECT MUST PRECEDE CLASS OR PROCEDURE
            #ELSE
              MOVE 1023 TO !1.OBJ
            #ENDIF
          #ENDIF
        #ENDIF
        #IF !0>2
          NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
        #ENDIF
      #ELSE
        NAME_!2 !1 !3 !4 !5 !6 !7 !8 !9
      #ENDIF
    #ENDIF
  #ENDIF
#ENDCOMMAND
    
#COMMAND ITEM_GROUP .
  #PUSH !Zd
  #PUSH !Ze
  #SET ZD$ 0
  !A [] $462 |CI0        //create new item group; size is fwd-ref'd
  #SET ZE$ !a
  #FREF ITEM$GROUP!Ze !a
#ENDCOMMAND

#COMMAND END_ITEM_GROUP .
  #REPLACE ITEM$GROUP!Ze |CI!Zd  //define size of item group
  #POP ZE$
  #POP ZD$
#ENDCOMMAND

#COMMAND DEPENDENT_ITEM R
  #IFSAME !2 ITEM    //if ITEM is second arg, item name replacement was used
    #IFDEF !1
      !A [] $463 !1 !3 //add obj#,item# pair to current item group
    #ELSE
      !A [] $463 !1.OBJ !3 //add obj#,item# pair to current item group
    #ENDIF
    #SET ZD$ !ZD         //increment element counter
    #IF (!0>3)
      DEPENDENT_ITEM !4 !5 !6 !7 !8 !9
    #ENDIF
  #ELSE
    #IFDEF !1
      !A [] $463 !1 !2 //add obj#,item# pair to current item group
    #ELSE
      !A [] $463 !1.OBJ !2 //add obj#,item# pair to current item group
    #ENDIF
    #SET ZD$ !ZD         //increment element counter
    #IF (!0>2)
      DEPENDENT_ITEM !3 !4 !5 !6 !7 !8 !9
    #ENDIF
  #ENDIF
#ENDCOMMAND

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//
//   Command: 
//  IMPORT_CLASS_PROTOCOL Source Dest {Msg | ALL} {Flag}
//
//   Description:
//  This command will copy the message definitions of the Source
//  class to the Dest class.  The program may choose to copy ALL
//  of the messages or only one of the messages from the Source.
//  The program has the option to stop any message that would overwrite
//  and to stop the copying of messages not directly defined in the
//  Source class.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#COMMAND IMPORT_CLASS_PROTOCOL _RSNDLOB# _SNDLOB# 
  #IF (!0<2)
    IMPORT_CLASS_PROTOCOL !1 CURRENT_CLASS
  #ELSE
    #DATA       // Begining of data
    #IFDEF !1       // class is variable (integer) or constant
      #DPUSH !1     // defined_in
    #ELSE
      #DPUSH U_!1   // class is normal symbol type (integer)
    #ENDIF
    #IFDEF !2       // is the destination defined?
      #DPUSH !2     // add to class
    #ELSE
      #IFSAME !2 CURRENT_CLASS  // use this symbol for "current class"
        #DPUSH U_!$     // cc is in this symbol (set by class)
      #ELSE
        #DPUSH U_!2     // another standard class id
      #ENDIF
    #ENDIF
    #IF (!0>2)      // message or all specified
      #IFSAME !3 ALL    // copy all messages
        #DPUSH |CI0 // 0 is all
      #ELSE
        #IFDEF !3
          #DPUSH !3 // message name, note full name required
        #ELSE
          #IFDEF MSG_!3
            #DPUSH MSG_!3
          #ELSE
            #IFDEF SET_!3
              #DPUSH SET_!3
            #ELSE
              #IFDEF GET_!3
                #DPUSH GET_!3
              #ENDIF
            #ENDIF
          #ENDIF
        #ENDIF
      #ENDIF
      #IF (!0>3)
        #SET Q$ 0
        CHAIN$HELP !4 !5    // NO_INHERIT and NO_OVERWRITE
        #DPUSH |CI!q    // flags
      #ELSE
        #DPUSH |CI0 // no flags
      #ENDIF
    #ELSE
      #DPUSH |CI0   // all messages
      #DPUSH |CI0   // overwrite and superclasses
    #ENDIF
    !A [] $0465 |CI0 |VL
  #ENDIF
#ENDCOMMAND
