Module FMAC

     1#REM  DataFlex standard MACROs
     2#REM  Copyright 1987-2001 Data Access Corporation, Miami FL, USA
     3#REM  All Rights reserved.
     4#REM  THIS IS THE FILE THAT DEFINES THE COMMANDS IN DATAFLEX VERSION 3.1
     5#REM  IT MUST BE PACKed INTO FLEX.CFL WITH THE COMMAND "DFPACK FMAC"
     6#REM  THIS SUPPORTS FMACS FOR BOTH 3.1 AND 4.0 (WINDOWS). THE COMPILER
     7#REM  VARIABLE IS$WINDOWS DETERMINES IF THIS IS CHARACTER MODE OR GUI.
     8
     9#REM 3/10/2001 mg - Using VDF7 service pack 1 fmac. Converted to allow character mode.
    10#REM  To set for windows define IS$WINDOWS.Separated messages by purpose (VDF, WAS, XML)
    11#REM so that they can be turned on or off depending on a compiler variable. This has
    12#REM not yet been implemented, so everything is on.
    13#REM This FMAC needs to be checked against the FMAC that John sent in Feb 2001 for
    14#REM changes.
    15
    16#REM Changes 5/20/98 -JJT
    17#REM    Changes in many commands to make this friendlier for VDF5.1
    18#REM       Changed syntax/Better error checking. Most commands are
    19#REM       added to the end. Note we now use !Zk, !Zl, !Zm, !Zn, !Zo
    20#REM       1. All changes marked JJT-5.1
    21
    22
    23#REM  GENERAL FORMAT OF AN ICODE LINE:
    24
    25#REM  !A [] $000 ARG1 ARG2
    26#REM  !A Generates the next line number
    27#REM  [] is a place holder for the indicators
    28#REM  $000 is a hex number that calls the appropriate 'C' routine
    29#REM  arg1, arg2 - two arguments of any type/class
    30#REM           can be passed to the routine.
    31
    32#REM  THE FOLLOWING ARE THE COMPILE-TIME VARIABLES USED
    33#REM  UPPERCASE WILL AUTO-INCREMENT (FIRST);
    34#REM  LOWER CASE WILL NOT.  THEN SUBSTITUTE TO AN INTEGER VALUE.
    35
    36#REM  !A - Next line number
    37#REM  !B - Reserved
    38#REM  !C - Next indicator number
    39#REM  !D - Next integer number
    40#REM  !E - Autopage, window #
    41#REM  !F - Autopage, page #
    42#REM  G,H,I,J,K,L,M - You may use these
    43#REM  !N - Static nesting level
    44#REM  !O - Used by ?ET*ATTRIBUTE
    45#REM  !P - Used by report
    46#REM  !Q - Low level temporary
    47#REM  !R - Static structure number (Begin/End)
    48#REM  !S - Temporary used by end/loop/until
    49#REM  !T,!U - Reserved
    50#REM  !V - Next variable number.
    51#REM  !W - Reserved
    52#REM  !X - Temporary for enter & report - file numbers.
    53#REM  !Y - Temporary for keyproc
    54#REM  !Z - Reserved
    55
    56#REM Type checking in command args use negative logic and
    57#REM conform to the following:
    58
    59#REM C - Constant          V - Memory variable
    60#REM F - File element      G - Group
    61#REM W - Window
    62#REM S - String            E - Expression
    63#REM N - Number            L - Label
    64#REM D - Date              O - Group options
    65#REM I - Integer           B - Group indicators
    66#REM # - Indicator         . - No more arguments
    67#REM X - Not an indicator  R - Argument required
    68#REM T - Error if typed    $ - Changes window to string
    69#REM U - Error if untyped  "constant" - Must be constant
    70
    71#REM
    72#REM  Types from Runtime.           Command
    73#REM   ARGSTR = 0,           S      String
    74#REM   ARGNUM = 1,           N      Number
    75#REM   ARGDATE = 2,          D      Date
    76#REM   ARGINT = 3,           I      Integer
    77#REM   ARGBIGINT = 4,        H      BigInt
    78#REM   ARGREAL = 5,          R      Real
    79#REM   ARGBOOL = 6,          B      Logical - this is actually only used for indicators
    80#REM   ARGMEM = 7,           X      Binary
    81#REM   ARGTIME = 8,          T      Time
    82#REM   ARGTIMESTAMP = 9,     M      DateTime
    83#REM   ARGFLOAT = 10,        F      Float
    84#REM   ARGBYTE = 11,         Y      Char
    85#REM   ARGUBYTE = 12         C      UChar
    86#REM   ARGSHORT = 13,        W      Short
    87#REM   ARGUSHORT = 14,       U      UShort
    88#REM   ARGULONG = 15,        V      UInteger
    89#REM   ARGBIT = 16,          Z      Boolean (This is what you use for boolean)
    90#REM   ARGBIGUINT = 17,      G      UBigInt
    91#REM   ARGSQLNUMERIC =  18,  O      Currency  (Visual Basic Decimal)
    92#REM   ARGCSTRING = 19,      K      Struct
    93#REM   ARGTIMESPAN = 20,     P      Timepsan (PERIOD)
    94#REM   ARGUNICODE = 21,      A      Array
    95#REM   ARGSUPERBCD = 22,     Q      Decimal (Very large decimal)
    96#REM                         J      Variant
    97#REM   ARG_UNUSED
    98#REM
    99#REM Classes from Runtime.
   100#REM   ARGNOTHING,
   101#REM   ARGFLDSTR,   Field (string)                F
   102#REM   ARGFLDNUM,   Field (BCD, Integer or Date)  F
   103#REM   ARGWNDSTR,   Window (string)               W
   104#REM   ARGWNDNUM,   Window (BCD, Integer or Date) W
   105#REM   ARGDATSTR,   String or Expression          CV
   106#REM   ARGDATNUM,   BCD or Numeric                CV
   107#REM   ARGCONINT,   Int or Long                   CV
   108#REM   ARGSYSINT,   System Integers
   109#REM   ARGSYSDATE,  System Date
   110#REM   ARGSYSTIME,  System Time
   111#REM   ARGDATREAL,  Reals                         CV
   112#REM   ARGEXP,      Expression                    E
   113#REM   ARGWNDRL,    Window Real                   W
   114#REM   ARGSTACK,    Stack                         S
   115#REM   ARGHEAP,     Global Heap Address           H
   116#REM   ARGPROC      Pointer into shared memory    P (for process)
   117#REM
   118
   119#REM Method Overloading
   120#REM NOTE: As of 15.0 we are deprecating the use of Overloaded messages. The existing technology will
   121#REM       continue to be supported as-is and it will not be extended
   122#REM
   123#REM         Function Foo Overloaded Integer i Integer j Returns Integer
   124#REM         Function Foo Overloaded Integer i
   125#REM
   126#REM         Set Entry_Msg To (Get_Foo(Integer, Integer))
   127#REM         Move (Foo(self,10)) To windowindex
   128#REM
   129#REM Overloaded types create mangled symbol:
   130#REM
   131#REM         Get_Foo@2
   132#REM         Get_Foo@1
   133#REM         Also defines symbol Get_Foo_Overloaded
   134#REM
   135#REM Non-Overloaded types create non-mangled symbol:
   136#REM
   137#REM         Get_Foo
   138#REM
   139#REM Rules
   140#REM 1. Overloaded and non-overloaded messages may not have the same name (compiler error)
   141#REM 2. Global procedures and functions cannot be overloaded (compiler error)...only class methods
   142#REM 3. Class methods (regular and overloaded), global proc/funcs, and object name (when function) cannot
   143#REM    have the same name. The first "type" to use the name locks it for that type.
   144#REM
   145#REM Fixups:
   146#REM
   147#REM         When compiling, FREFs are created for code fixups. At that point, it
   148#REM is unclear how the method name will be declared (overloaded or non-overloaded),
   149#REM so a mangled name is created. When fixups are processed, method identifiers
   150#REM are resolved in this order:
   151#REM
   152#REM         1. Non-overloaded method (class or global)
   153#REM         2. Object overloaded Method
   154#REM    Since there can be no overlap of naming across types, the order or resolution does not matter
   155#REM
   156#REM
   157#REM Object names:
   158#REM
   159#REM         Object access methods are not overloaded.
   160#REM
   161#REM Properties:
   162#REM
   163#REM         Properties are not overloaded.
   164#REM
   165
   166#REM Example: #COMMAND EXAMPLE SND means arg1 cannot be string,number,or date
   167
   168#COMMAND ABORT &.
   169  !A [] $040
   170#ENDCOMMAND
   171
   172#COMMAND ACCEPT #L #L #LUC #LUWFC .
   173  #SET Q$ !0
   174  #IF !q=0
   175    AUTO2$ ACCEPT PAGE!f
   176  #ELSE
   177    #IF !q=1
   178      #IFCLASS !1 "G"
   179        AUTO2$ ACCEPT PAGE!f !1
   180      #ELSE
   181        #CHECK !1 _CVFG#L
   182        !A [] $1C1 !1 |CI0
   183      #ENDIF
   184    #ELSE
   185      #IF !q=2
   186        #IFCLASS !2 "G"
   187          #FORMAT !1 !2
   188          #CHECK !1 _CVFG#L
   189          !A [] $1C1 !1 |CI0
   190        #ELSE
   191          AUTO2$ ACCEPT PAGE!f TO !2
   192        #ENDIF
   193      #ELSE
   194        #IF !q>2
   195          #IFCLASS !3 "G"
   196            #CHECK !1 "TO"
   197            AUTO2$ ACCEPT PAGE!f TO !2 !3
   198          #ELSE
   199            #IFCLASS !4 "G"
   200              #FORMAT !1 !4
   201            #ENDIF
   202            #CHECK !1 _CVFG#L
   203            #CHECK !2 "TO"
   204            #CHECK !3 _CG#LE
   205            !A [] $1C1 !1 !3
   206          #ENDIF
   207        #ENDIF
   208      #ENDIF
   209    #ENDIF
   210  #ENDIF
   211#ENDCOMMAND
   212
   213#COMMAND APPEND #LGULCE$ #LGULR$
   214  !A [] $243 !1 !2
   215  #IF !0>2
   216    APPEND !1 !3 !4 !5 !6 !7 !8 !9
   217  #ENDIF
   218#ENDCOMMAND
   219
   220#COMMAND ASCII &#GRLU "TO" #UGRLCE .
   221  !A [] $247 !1 !3
   222#ENDCOMMAND
   223
   224#REM  The AUTO commands are used internally to generate the
   225#REM  next AUTOPAGE window number at compile time.
   226
   227#COMMAND AUTO2$
   228  !1 !2.!E !3 !4 !5
   229  #CHECK !2.!e _RUCVF#L
   230#ENDCOMMAND
   231
   232#COMMAND AUTO3$
   233  !1 !2 !3.!E !4 !5
   234  #CHECK !3.!e _RUCVF#L
   235#ENDCOMMAND
   236
   237#COMMAND AUTO4$
   238  !1 !2 !3 !4.!E !5
   239  #CHECK !4.!e _RUCVF#L
   240#ENDCOMMAND
   241
   242#COMMAND AUTOPAGE &T %USNVLE# .
   243  #CHECK !1.N _WFVSG#LU
   244  #SET F$ !1.N
   245  #SET E$ !2
   246  #IF !e>0
   247    #SET E$ !e-1
   248  #ENDIF
   249#ENDCOMMAND
   250
   251#REM BACKFIELD can only be used in a KEY PROCedure. It returns to the
   252#REM window (COMMAND) PRIOR to the one that called it.
   253
   254#COMMAND BACKFIELD &.
   255  !A [] $288
   256#ENDCOMMAND
   257
   258#COMMAND BEGIN &.
   259  #SET N$ !N
   260  #PUSH !R
   261  #XPUSH !n $INIT  // Init IF/ELSE stack at this nesting level.
   262  #IFIND //INCLUDE JUMPS IF INDICATORS ON LINE.
   263    // GOTO BEGIN$!r
   264    !A [] $041 |CI0
   265    #FREF BEGIN$!r !a
   266    #$ !A 0 0 0 $041 |CL0
   267    #FREF END$!r !a
   268  #ENDIF
   269  #$ BEGIN$!r:
   270#ENDCOMMAND
   271
   272#COMMAND BLANKFORM &%CVFG#EL  "THRU""THROUGH""" %CVFG#LUE .
   273  #IF !0>0
   274    #IFDEF !1
   275      !A [] $1C4 !1 !3
   276    #ELSE
   277      #CHECK !1.N _#RLGVU
   278      !A [] $1C4 !1.N
   279    #ENDIF
   280  #ELSE
   281    !A [] $1C4 |CI0
   282  #ENDIF
   283#ENDCOMMAND
   284
   285#COMMAND BREAK$             // does breakpoint for all
   286  #IF (!0>0)
   287    #IFCLASS !1 _F
   288      BREAKPOINT |CI!P !1
   289    #ELSE
   290      #CHECK !1 _LGBCVWIEOU#
   291    #ENDIF
   292  #ENDIF
   293  #IF (!0>1)
   294    BREAK$ !2 !3 !4 !5 !6 !7 !8 !9
   295  #ENDIF
   296#ENDCOMMAND
   297
   298#COMMAND BREAK$DOWN R           // does gosub to break
   299  #IF !x>0                // sections from N to 0
   300    #IF !0>1
   301      // GOSUB !1!x
   302      !A [] $42 |CL0
   303      #FREF !1!x !a
   304    #ELSE
   305      //[!x] GOSUB !1!x
   306      !A [!x] $42 |CL0
   307      #FREF !1!x !a
   308    #ENDIF
   309  #ENDIF
   310  #SET X$ !x-1
   311  #IF !x>0
   312    BREAK$DOWN !1 !2
   313  #ENDIF
   314#ENDCOMMAND
   315
   316#COMMAND BREAK$PRT          // prints all SUBHEADERs
   317  #IF !x<!p               // for page
   318    #IFDEF !1!X.N
   319      !A [~ !x] $202 !1!x.N  // OUTPUT
   320    #ENDIF
   321    BREAK$PRT !1 !2
   322  #ENDIF
   323#ENDCOMMAND
   324
   325#COMMAND BREAK$T3
   326  #IF !x<!p               // makes unused sections defined
   327    MAKEDEF$ RPT.SUBHEADER!X RPT.SUBTOTAL!x
   328    BREAK$T3
   329  #ENDIF
   330#ENDCOMMAND
   331
   332#COMMAND BREAK$UP           // does GOSUB to break
   333  #IF !x<!p               // sections from 0 to N
   334    #IF !0=1
   335      //[!X] GOSUB !1!x
   336      !A [!X] $42 |CL0
   337      #FREF !1!x !a
   338    #ELSE
   339      // GOSUB !1!X
   340      !A [] $42 |CL0
   341      #FREF !1!X !a
   342    #ENDIF
   343    BREAK$UP !1 !2
   344  #ENDIF
   345#ENDCOMMAND
   346
   347#COMMAND BREAKINIT  &.  // set up breakpoints for REPORT
   348  !A [] $207
   349#ENDCOMMAND
   350
   351#COMMAND BREAKPOINT &UVFW UCI   // test breakpoint and set indicators
   352  !A [] $204 !1 !2
   353#ENDCOMMAND
   354
   355#COMMAND CALCULATE &#ULG "TO" #UCLGER .
   356  #IFTYPE !3 "R"
   357    !A [] $085 !1 !3 //MOVE REAL
   358  #ELSE
   359    !A [] $081 !1 !3 //MOVE NUM
   360  #ENDIF
   361#ENDCOMMAND
   362
   363#COMMAND CHAIN RNDIG#L  NDG#L
   364  #SET Q$ 0
   365  #IFSAME !1 WAIT
   366    CHAIN$HELP !3 !4 !5 !6 !7 !8 !9
   367    !A [] $049 !2 |CI!q
   368  #ELSE
   369    #CHECK !1 _U
   370    CHAIN$HELP !2 !3 !4 !5 !6 !7 !8 !9
   371    !A [] $045 !1 |CI!q
   372  #ENDIF
   373#ENDCOMMAND
   374
   375#COMMAND CHAIN$HELP UVNDEG#L
   376  #IF (!0>0)
   377    #SET Q$ (!q+!1)
   378    CHAIN$HELP !2 !3 !4 !5 !6 !7 !8 !9
   379  #ENDIF
   380#ENDCOMMAND
   381
   382#COMMAND CHARACTER &#%GULD "TO" #GRULCE .
   383  !A [] $248 !1 !3
   384#ENDCOMMAND
   385
   386#COMMAND CLEAR_OPTION #LGRE . // Clears window options which
   387  #IFCLASS !1 _C           // have been set ON by set option
   388    #SET Q$ !1           // or by dfsetup.
   389    !A [] $04B |CI!q |CI0       // CLEAR_OPTION AUTORETURN
   390  #ELSE
   391    !A [] $04B !1 |CI0      // THIS COMMAND IS FOR INTERNAL USE.
   392  #ENDIF
   393#ENDCOMMAND
   394
   395#COMMAND CLEARFORM &%CVFG#LE  "THRU""THROUGH""" %CVFG#LUE .
   396  #IF !0>0
   397    #IFDEF !1
   398      !A [] $1C3 !1 !3 |CI0
   399    #ELSE
   400      #CHECK !1.N _R#LGVU
   401      !A [] $1C3 !1.N |CI0
   402    #ENDIF
   403  #ELSE
   404    !A [] $1C3 |CI0
   405  #ENDIF
   406#ENDCOMMAND
   407
   408#COMMAND CLEARSCREEN & .
   409  !A [] $144 !1
   410#ENDCOMMAND
   411
   412#COMMAND CLEARWARNING &.
   413  !A [] $048
   414#ENDCOMMAND
   415
   416#COMMAND CLEARXY &%#USGL %#USGLR .
   417  !A [] $146 !1 !2
   418#ENDCOMMAND
   419
   420#COMMAND CLOSE_INPUT
   421  #IFSAME !1 CHANNEL
   422    !A [] $10A |CI0 !2
   423  #ENDIF
   424  !A [] $100 |CS'CON:'
   425#ENDCOMMAND
   426
   427#COMMAND CLOSE_OUTPUT
   428  #IFSAME !1 CHANNEL
   429    !A [] $10A |CI1 !2
   430  #ENDIF
   431  !A [] $101 |CS'LST:'
   432#ENDCOMMAND
   433
   434#COMMAND CMDLINE &#RLUGE .
   435  !A [] $24A !1 |CS''
   436#ENDCOMMAND
   437
   438// With the name mangling code, we need a way to define external C messages.
   439// The CMSG command does just that. It uses the #FGEN command to parse over a special syntax
   440// that defines a prototype in this form:
   441//
   442// Example:  CMSG I GET_AUX_VALUE |CI$31 I
   443//
   444//      This generates in !? a name GET_AUX_VALUE@I if we mangle on the parameter list types
   445//      This generates in !? a name GET_AUX_VALUE@I@I if we mangle on the parameter list and return type
   446//      This generates in !? a name GET_AUX_VALUE@1 if we mangle on the number of the parameters
   447//
   448//           CMSG V GET_FOO       |CI$099   V
   449//
   450//      Returns GET_FOO_# and receives a variable argument list.
   451//
   452
   453//#IFDEF MANGLE_NAMES
   454  #COMMAND CMSG RIND RIND RSND
   455    #IFNDEF !2
   456      #REPLACE !2 !3
   457    #ENDIF
   458  #ENDCOMMAND
   459//#ENDIF
   460
   461#COMMAND COPYFILE &#LGU "TO" R#LGU .
   462  !A [] $2C5 !1 !3
   463#ENDCOMMAND
   464
   465#COMMAND CONSTRAINT_SAVE_INIT .
   466  !A [] $0DE
   467#ENDCOMMAND
   468
   469#COMMAND CONSTRAINT_SET R#LG """DELETE""CLEAR"
   470  #IFSAME !2 DELETE
   471    !A [] $0DA !1    // DELETE
   472  #ELSE
   473    #IFSAME !2 CLEAR
   474      !A [] $0DA !1    // DELETE FIRST
   475    #ENDIF
   476    !A [] $0D0 !1   // QUERY ID
   477  #ENDIF
   478#ENDCOMMAND
   479
   480#COMMAND CONSTRAINT_VALIDATE .
   481  !A [] $0DF
   482#ENDCOMMAND
   483
   484#COMMAND CONSTRAINT_INIT r r "BY" r // mode file by index
   485  #IFSAME !1 $0 $1 $2 $3 $4 $5
   486    #SET Q$ !1
   487    MOVE |CI!q TO INDEX_NUMBER
   488  #ELSE
   489    MOVE !1 TO INDEX_NUMBER
   490  #ENDIF
   491  #IFDEF !2
   492    !A [] $0D6 !2 !4    // VARIABLE FILE NUMBER
   493  #ELSE
   494    #SET Q$ !2.FILE_NUMBER   // FILE NAME ONLY
   495    !A [] $0D6 |CI!q !4
   496  #ENDIF
   497#ENDCOMMAND
   498
   499#COMMAND CONSTRAINED_CLEAR
   500  #IF !0>0
   501    CONSTRAINT_INIT !1 !2 !3 !4
   502  #ENDIF
   503  !A [] $DC   // Find clear
   504#ENDCOMMAND
   505
   506#COMMAND CONSTRAINED_FIND // MODE FILE by INDEX
   507  #IFSAME !1 NEXT
   508    #IF !0>1
   509      !A [] $0D0 !2   // QUERY ID
   510    #ENDIF
   511    !A [] $D8       // find NEXT
   512  #ELSE
   513    #IFSAME !1 FIRST
   514      CONSTRAINED_CLEAR GE !2 !3 !4
   515    #ELSE
   516      #IFSAME !1 LAST
   517        CONSTRAINED_CLEAR LE !2 !3 !4
   518      #ELSE
   519        #IF !0>0
   520          CONSTRAINT_INIT !1 !2 !3 !4
   521        #ENDIF
   522        // THIS USES RB DATA ,IT DOES NOT CLEAR THE rb.
   523      #ENDIF
   524    #ENDIF
   525    !A [] $D7  |CI0 // find init, sets found on status of constrained relates.
   526    !A [FOUND] $D8  // find NEXT (first)
   527  #ENDIF
   528#ENDCOMMAND
   529
   530// JJT-5.1
   531//#COMMAND DATE TR
   532//  #NUM V$
   533//  #REPLACE !1 |VD!v
   534//  #IF (!0>1)
   535//    DATE !2 !3 !4 !5 !6 !7 !8 !9
   536//  #ENDIF
   537//#ENDCOMMAND
   538
   539#COMMAND DEBUG &.
   540  !A [] $044
   541#ENDCOMMAND
   542
   543#COMMAND DECREMENT #ELCRUG .
   544  #IFTYPE !1 "IV"
   545     !A [] $087 !1 |CI0
   546  #ELSE
   547     Move (!1 - 1) to !1
   548   #ENDIF
   549#ENDCOMMAND
   550
   551#COMMAND DESPOOL &.  // O/S dependent function
   552  !A [] $2C6
   553#ENDCOMMAND
   554
   555#COMMAND DIRECTORY &R#LGU .
   556  !A [] $2C4 !1
   557#ENDCOMMAND
   558
   559#COMMAND DIRECT_INPUT
   560  #IFSAME !1 CHANNEL
   561    !A [] $10A |CI0 !2
   562    #IF !0>2
   563      DIRECT_INPUT !3 !4
   564    #ENDIF
   565  #ELSE
   566    #IFSAME !1 RESOURCE
   567      #IFDEF !2 // allow variable string for resource name/id
   568        DIRECT_INPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   569      #ELSE
   570        #SET Q$ !2.RSC
   571        !A [] $100 |CS"!1:!q"
   572      #ENDIF
   573    #ELSE
   574      #IFSAME !1 DBMS IMAGE
   575        #IFSAME !1 IMAGE
   576          #IFDEF !2 // allow variable for image number
   577            DIRECT_INPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   578          #ELSE
   579            #SET Q$ !2.N
   580            !A [] $100 |CS"!1:!q"
   581          #ENDIF
   582        #ELSE
   583          #IFCLASS !2 "F" // if field ref, use as is
   584            !A [] $100 |CS"!1:!2"
   585          #ELSE
   586            #IFDEF !2 // for all classes/types, assume variable string for field ref
   587              DIRECT_INPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   588            #ELSE
   589              #CHECK !2 _U // force cannot be untyped error.
   590            #ENDIF
   591          #ENDIF
   592        #ENDIF
   593      #ELSE
   594        #CHECK !2 .
   595        !A [] $100 !1
   596      #ENDIF
   597    #ENDIF
   598  #ENDIF
   599#ENDCOMMAND
   600
   601#COMMAND DIRECT_OUTPUT
   602  #IFSAME !1 CHANNEL
   603    !A [] $10A |CI1 !2
   604    #IF !0>2
   605      DIRECT_OUTPUT !3 !4
   606    #ENDIF
   607  #ELSE
   608    #IFSAME !1 DBMS IMAGE
   609      #IFSAME !1 IMAGE
   610        #IFDEF !2 // allow variable for image number
   611          DIRECT_OUTPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   612        #ELSE
   613          #SET Q$ !2.N
   614          !A [] $101 |CS"!1:!q"
   615        #ENDIF
   616      #ELSE
   617        #IFCLASS !2 "F" // if field ref, use as is
   618          !A [] $101 |CS"!1:!2"
   619        #ELSE
   620          #IFDEF !2 // for all classes/types, assume variable string for field ref
   621            DIRECT_OUTPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   622          #ELSE
   623            #CHECK !2 _U // force cannot be untyped error.
   624          #ENDIF
   625        #ENDIF
   626      #ENDIF
   627    #ELSE
   628      #CHECK !2 .
   629      !A [] $101 !1
   630    #ENDIF
   631  #ENDIF
   632#ENDCOMMAND
   633
   634#COMMAND APPEND_OUTPUT
   635  #IFSAME !1 CHANNEL
   636    !A [] $10A |CI1 !2
   637    #IF !0>2
   638      APPEND_OUTPUT !3 !4
   639    #ENDIF
   640  #ELSE
   641    #IFSAME !1 DBMS IMAGE
   642      #IFSAME !1 IMAGE
   643        #IFDEF !2 // allow variable for image number
   644          APPEND_OUTPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   645        #ELSE
   646          #SET Q$ !2.N
   647          !A [] $101 |CS"!1:!q" |CI2
   648        #ENDIF
   649      #ELSE
   650        #IFCLASS !2 "F" // if field ref, use as is
   651          !A [] $101 |CS"!1:!2" |CI2
   652        #ELSE
   653          #IFDEF !2 // for all classes/types, assume variable string for field ref
   654            APPEND_OUTPUT ('!1:' + string(!2)) !3 !4 !5 !6 !7 !8 !9
   655          #ELSE
   656            #CHECK !2 _U // force cannot be untyped error.
   657          #ENDIF
   658        #ENDIF
   659      #ENDIF
   660    #ELSE
   661      #CHECK !2 .
   662      !A [] $101 !1 |CI2
   663    #ENDIF
   664  #ENDIF
   665#ENDCOMMAND
   666
   667#COMMAND DISKFREE #LIDNRUG "TO" #LDRCUGE .
   668  !A [] $2d5 !3 !1
   669#ENDCOMMAND
   670
   671#COMMAND DISPLAY RUG#L
   672  #IF !0>2
   673    #CHECK !2 "TO"
   674    #CHECK !3 _RGC#LE
   675    !A [] $1C2 !1 !3
   676    #IF !0>3
   677      #CHECK !4 _#LWFCV
   678      #FORMAT !3 !4
   679    #ENDIF
   680  #ELSE
   681    AUTO4$ DISPLAY !1 TO PAGE!f !2
   682  #ENDIF
   683#ENDCOMMAND
   684
   685#COMMAND ELSE
   686  #$ !A [] $41 |CI0 //jump over else code.
   687  #XPOP !n S$ // GET GOTO LINE NUMBER FROM LAST IF.
   688  #XPUSH 1 !a // Save line number of ELSE jump.
   689  #XPUSH 0 !n // Save static nest level.
   690  #FREF (!a+1) !s // Modify goto line number with ELSE command
   691  !1 !2 !3 !4 !5 !6 !7 !8 !9
   692  #XPOP 0 Q$  // Restore static nest level to Q.
   693  #XPOP 1 S$  // Restore line number of else jump.
   694  #IF (!n>!q)
   695    #FREF END$!r !s // Modify ELSE jump to after BEGIN block.
   696  #ELSE
   697    #FREF (!a+1) !s // Modify ELSE jump to after the ELSE command.
   698  #ENDIF
   699#ENDCOMMAND
   700
   701#COMMAND END &.
   702  #POP S$
   703  #IFDEF WHILE$!s
   704    !A [] $041 WHILE$!s
   705  #ENDIF
   706  END$!s:
   707  #SET N$ !n-1
   708#ENDCOMMAND
   709
   710#COMMAND ENDGROUP &.
   711  //ENTUPDATE         // update record buffer
   712  !A [] $280 |CI0
   713  //GOTO ENT$END!x
   714  !A [] $41 |CL0
   715  #FREF ENT$END!x !a
   716  //RETURN            // RETURN stops entry command list
   717  !A [] $43 |CI0
   718  ENT$END!x:
   719#ENDCOMMAND
   720
   721#COMMAND ENT$KEY
   722  ENT$DISP:
   723  IF ENTER$DISPLAY NE 0 BEGIN
   724    !A [FOUND] $042 ENTER$DISPLAY
   725  END
   726  ELSE BEGIN
   727    [FOUND] ENTDISPLAY // JUST DO AN ENTDISPLAY
   728  END
   729  //              ENTAGAIN
   730  !A [] $287
   731  //              RETURN
   732  !A [] $43 |CL0
   733
   734  //<<<<<<< STANDARD KEY PROCEDURES FOR ENTER GROUP >>>>>>>>>>
   735  //KEYPROC KEY.FIND
   736  ENTER$.FIND:
   737  //              ENTFIND GE          // no, FIND
   738  !A [] $281 |CI3
   739  #KEYPROC 7 !a
   740  //              GOTO ENT$DISP
   741  !A [] $41 ENT$DISP
   742
   743  //KEYPROC KEY.NEXT                  // FIND next record
   744  ENTER$.NEXT:
   745  //              ENTFIND GT
   746  !A [] $281 |CI4
   747  #KEYPROC 15 !a
   748  //              GOTO ENT$DISP
   749  !A [] $41 ENT$DISP
   750
   751  //KEYPROC KEY.PREVIOUS              // FIND prv record
   752  ENTER$.PREVIOUS:
   753  //              ENTFIND LT
   754  !A [] $281 |CI0
   755  #KEYPROC 14 !a
   756  //              GOTO ENT$DISP
   757  !A [] $41 ENT$DISP
   758  //KEYPROC KEY.UP
   759  //KEYPROC KEY.FIELD                 // BACK FIELD
   760  ENTER$.FIELD:
   761  //              BACKFIELD
   762  !A [] $288
   763  #KEYPROC 16 !a
   764  #KEYPROC 6 !a
   765  //              RETURN
   766  !A [] $43 |CI0
   767  //KEYPROC KEY.CLEAR                 // CLEAR SCREEN
   768  ENTER$.CLEAR:
   769  //              INDICATE ERR FALSE
   770  !A [] $4028 |CI0 |CI0 |127
   771  #KEYPROC 13 !a
   772  !A []           $284 // ENTCLEAR
   773  //              RETURN
   774  !A [] $43 |CI0
   775  //KEYPROC KEY.SAVE
   776  ENTER$.SAVE:
   777  !A []           $285 // ENTSKIP
   778  #KEYPROC 9 !a
   779  //              RETURN
   780  !A [] $43 |CI0
   781  //KEYPROC KEY.HELP
   782  ENTER$.HELP:
   783  //HELP
   784  !A [] $1C5 |CI0
   785  #KEYPROC 18 !a
   786  //ENTAGAIN
   787  !A [] $287
   788  //RETURN
   789  !A [] $43 |CI0
   790
   791  // KEYPROC KEY.PRINT
   792  ENTER$.PRINT:
   793  // output current page
   794  !A [] $202 |VI9
   795  #KEYPROC 2 !a
   796  //ENTAGAIN and RETURN
   797  !A [] $287
   798  !A [] $43 |CI0
   799#ENDCOMMAND
   800
   801#REM ENTAGAIN can only be used in a KEY PROCedure. It returns to the
   802#REM same window (COMMAND) that called the KEY PROCedure.
   803
   804#COMMAND ENTAGAIN &.
   805  !A [] $287
   806#ENDCOMMAND
   807
   808// only works with recnum tables. Command not used in VDF
   809#COMMAND ENTDISPLAY &TVWG#LE .  // Display all entries for a file
   810  #IF (!0>0)
   811    //RELATE !1
   812    !A [] $C4 !1.RECNUM   // only works with recnum (obsolete)
   813  #ENDIF
   814  //display from entry section
   815  !A [] $283
   816#ENDCOMMAND
   817
   818// This command has Not been changed to support file_number instead of recnum. This is not a VDF command and I
   819// cannot imagine how it could be used. However, if someone is using this, they can only use recnum tables. Updating this
   820// command would somehow imply that this command is supported in vdf -- it's not.
   821#COMMAND ENTER CVWSRL#E
   822  //              INDICATE CONTINUE TRUE
   823  #REPLACE CONTINUE |!C
   824  !A [] $4028 |CI0 |CI0 CONTINUE~
   825  //              INDICATE ENT$QUERY FALSE
   826  #REPLACE ENT$QUERY |9
   827  !A [] $4028 |CI0 |CI0 |9
   828  #IF !0>0            // ENT$QUERY tells us if
   829    #SET X$ !1.RECNUM           // we are in QUERY(SUPERFIND) mode
   830  #ELSE
   831    #SET X$ 0
   832  #ENDIF
   833  //MOVEINT |CI!x TO |VI8     // set ENTMFILE (ENTER's main file variable)
   834  !A [] $82 |CI!x |VI8        // to main file for ENTSFIND
   835  ENT$LP:             // start of enter loop
   836  //              GOSUB ENTRYSEC      // do ENTRY section
   837  !A [] $042 |CL0
   838  #FREF ENTRYSEC !a
   839  //[KEY.ESCAPE]      GOTO END_ENTER      // dropped thru
   840  !A [|103] $041 |CL0
   841  #FREF END_ENTER !a
   842  //              INDICATE ERR FALSE      // set error false
   843  !A [] $4028 |CI0 |CI0 |127
   844  // temp disable ON ERROR
   845  !A [] $82 |VI31 |VI32
   846  !A [] $82 |CI0 |VI31
   847  // REREAD command
   848  !A [] $0C9
   849  //[ENT$QUERY]       GOSUB ENTER.EDIT    // user procedure
   850  !A [|9] $042 |CL0
   851  #FREF ENTER.EDIT !a
   852  //[NOT ERR]         ENTUPDATE       // update files from ENTRY
   853  !A [~|127] $280 |CI0
   854  //[NOT ERR]         GOSUB ENTER.SAVE    // user procedure
   855  !A [~|127] $042 |CL0
   856  #FREF ENTER.SAVE !a
   857  [NOT ERR]       MULTIBACK$ SAVE !1 !2 !3 !4 !5 !6 !7 !8 !9  // save
   858  // UNLOCK command
   859  !A [] $0C8
   860  //[NOT ERR]         GOSUB ENT$CLEAR     // clear screen
   861  !A [~ |127] $042 |CL0
   862  #FREF ENT$CLEAR !a
   863  // RE ENABLE ON ERROR
   864  !A [] $82 |VI32 |VI31
   865  //[CONTINUE]        GOTO ENT$LP         // loop
   866  !A [CONTINUE] $041 ENT$LP
   867  //              GOTO END_ENTER      // end if NOT CONTINUE
   868  !A [] $041 |CL0
   869  #FREF END_ENTER !a
   870  // this clears the screen and all data files
   871  ENT$CLEAR:          MULTIBACK$ CLEAR !1 !2 !3 !4 !5 !6 !7 !8 !9
   872  //              INDICATE ENT$QUERY FALSE
   873  !A [] $4028 |CI0 |CI0 |9
   874  //              ENTCLEAR - clear ENTRY section
   875  !A [] $284
   876  //              RETURN
   877  !A [] $043 |CI0
   878  //<<<<<<< STANDARD KEY PROCEDURES FOR ENTER >>>>>>>>>>
   879  //KEYPROC KEY.SAVE
   880  ENTER$.SAVE:
   881  !A []           $285 //ENTSKIP (skip rest of entries)
   882  #KEYPROC 9 !a
   883  //              RETURN
   884  !A [] $043 |CI0
   885  //KEYPROC KEY.DELETE
   886  //              INDICATE ERR FALSE      //default
   887  ENTER$.DELETE:
   888  !A [] $4028 |CI0 |CI0 |127
   889  #KEYPROC 10 !a
   890  // DISABLE ON ERROR
   891  !A [] $82 |VI31 |VI32
   892  !A [] $82 |CI0 |VI31
   893  //              REREAD
   894  !A [] $C9
   895  //[NOT ENT$QUERY]   ERROR 71    // check for active record
   896  !A [~|9] $47 |CI71
   897  //[NOT ERR]         GOSUB ENTER.DELETE      // user procedure
   898  !A [~|127] $042 |CL0
   899  #FREF ENTER.DELETE !a
   900  //[NOT ERR]         GOSUB ENTER.EDIT    // user procedure
   901  !A [~|127] $042 |CL0
   902  #FREF ENTER.EDIT !a
   903  //[NOT ERR]         DELETE !1       // delete records
   904  !A [~|127] $C3 !1.RECNUM
   905  [NOT ERR]       MULTIBACK$ SAVE !2 !3 !4 !5 !6 !7 !8 !9 // related
   906  //              UNLOCK
   907  !A [] $C8
   908  //[NOT ERR]         GOSUB ENT$CLEAR       // clear systems
   909  !A [~|127] $042 ENT$CLEAR
   910  // enable ON ERROR
   911  !A [] $82 |VI32 |VI31
   912  //              RETURN ENTRYSEC
   913  !A [] $43
   914  #FREF ENTRYSEC !a
   915  // will GOSUB here for all find keys //
   916  //              INDICATE WAS$QUERY GROUP ANY [ENT$QUERY]
   917  ENTER$.FIND:
   918  #REPLACE WAS$QUERY |!C
   919  !A [] $4020 |GB[|9] |GB[0] WAS$QUERY IN$GLANY |3
   920  #KEYPROC 8 !a // SUPERFIND
   921  #KEYPROC 7 !a // FIND
   922  #KEYPROC 15 !a // NEXT
   923  #KEYPROC 14 !a // PREVIOUS
   924  //[KEY.SFIND]       INDICATE ENT$QUERY TRUE
   925  !A [|108] $4028 |CI0 |CI0 |9~
   926  //[NOT ENT$QUERY]   INDICATE ENT$QUERY AS |CI!x EQ |VI15    // query mode?
   927  !A [~ |9] $4008 |CI!x |VI15 |9 |2
   928  //[KEY.SFIND]         ENTSFIND GE
   929  !A [|108] $282 |CI3
   930  //[KEY.FIND][ENT$QUERY][ENT$PERMISSIVE] ENTFIND GE
   931  !A [|107 |9 |10] $281 |CI3
   932  //[KEY.FIND][ENT$QUERY][NOT ENT$PERMISSIVE] ENTSFIND GE   // yes, SUPERFIND
   933  !A [|107 |9 ~ |10] $282 |CI3
   934  //[KEY.FIND][NOT ENT$QUERY]     ENTFIND GE        // no, FIND
   935  !A [|107 ~ |9] $281 |CI3
   936  //[KEY.NEXT][ENT$QUERY]   ENTSFIND GT     // yes, SUPERFIND
   937  !A [|115 |9] $282 |CI4
   938  //[KEY.NEXT][NOT ENT$QUERY]     ENTFIND GT        // no, FIND
   939  !A [|115 ~ |9] $281 |CI4
   940  //[KEY.PREVIOUS][ENT$QUERY]     ENTSFIND LT       // yes, SUPERFIND
   941  !A [|114 |9] $282 |CI0
   942  //[KEY.PREVIOUS][NOT ENT$QUERY] ENTFIND LT        // no, FIND
   943  !A [|114 ~ |9] $281 |CI0
   944  [FINDERR]       INDCT$GROUP ENT$QUERY GROUP ANY [WAS$QUERY]
   945  //!A [FOUND]        $283            // display records
   946  !A [FOUND] $042 ENTER$DISPLAY
   947  //              ENTAGAIN        // same window
   948  !A [] $287
   949  //              RETURN
   950  !A [] $43 |CI0
   951  ////// define ENTER's KEY PROCedures ////////////
   952  // KEYPROC BACKFIELD
   953  //              BACKFIELD
   954  ENTER$.FIELD:
   955  !A [] $288
   956  #KEYPROC 16 !a
   957  #KEYPROC 6 !a
   958  ENTXRET://          RETURN
   959  !A [] $43 |CL0
   960  // KEYPROC CLEARSCREEN
   961  ENTER$.CLEAR:
   962  //              INDICATE ERR FALSE
   963  !A [] $4028 |CI0 |CI0 |127
   964  #KEYPROC 13 !a
   965  //              GOSUB ENTER.CLEAR
   966  !A [] $042 |CL0
   967  #FREF ENTER.CLEAR !a
   968  //[NOT ERR]         GOSUB ENT$CLEAR
   969  !A [~ |127] $042 ENT$CLEAR
   970  //              RETURN ENTRYSEC
   971  !A [] $043
   972  #FREF ENTRYSEC !a
   973  // KEYPROC ESCAPE key
   974  ENTER$.ESCAPE:
   975  //              INDICATE ERR FALSE
   976  !A [] $4028 |CI0 |CI0 |127
   977  #KEYPROC 3 !a
   978  //              GOSUB ENTER.EXIT
   979  !A [] $42 |CL0
   980  #FREF ENTER.EXIT !a
   981  //[NOT ERR]         RETURN ENTXRET
   982  !A [~ |127] $43 ENTXRET
   983  //              RETURN
   984  !A [] $43 |CI0
   985  //KEYPROC KEY.HELP
   986  //HELP
   987  ENTER$.HELP:
   988  !A [] $1C5 |CI0
   989  #KEYPROC 18 !a
   990  //ENTAGAIN
   991  !A [] $287
   992  //RETURN
   993  !A [] $43 |CI0
   994  //KEYPROC KEY.PRINT
   995  //output current page
   996  ENTER$.PRINT:
   997  !A [] $202 |VI9
   998  #KEYPROC 2 !a
   999  //ENTAGAIN and RETURN
  1000  !A [] $287
  1001  !A [] $43 |CI0
  1002
  1003  ENTRYSEC://         ENTERMODE       // start entry section
  1004  !A [] $82 |CI!a |VI14
  1005  !A [] $286
  1006#ENDCOMMAND
  1007
  1008#COMMAND ENTEREND               // end of ENTER
  1009  MAKEDEF$ ENTER.SAVE ENTER.EDIT ENTER.DELETE ENTER.CLEAR ENTER.EXIT
  1010  //RETURN
  1011  !A [] $43 |CI0
  1012  #IFDEF ENTER.DISPLAY
  1013  #ELSE
  1014    ENTER.DISPLAY:
  1015    ENTDISPLAY
  1016    !A [] $43 |CI0
  1017  #ENDIF
  1018  END_ENTER:
  1019  // CLEARSCREEN
  1020  !A [] $144
  1021#ENDCOMMAND
  1022
  1023#COMMAND ENTERGROUP .   // independent entry section
  1024  #IFDEF ENT$DISP
  1025  #ELSE
  1026    //INTEGER ENT$START
  1027    INTEGER ENT$END
  1028    //#$ GOTO ENTK$END
  1029    #$ !A [] $41 |CL0
  1030    #FREF ENTK$END !a
  1031    #$ ENT$KEY
  1032    #SET X$ 0
  1033    ENTK$END:
  1034  #ENDIF
  1035
  1036  ENTRYSEC!X://       ENTERMODE       // start entry section
  1037  !A [] $82 |CI!a |VI14
  1038  !A [] $286
  1039  //              INDICATE ENT$QUERY FALSE
  1040  !A [] $4028 |CI0 |CI0 |9
  1041#ENDCOMMAND
  1042
  1043#REM ENTERMODE defines the top of the ENTRY section.
  1044
  1045#COMMAND ENTERMODE &.
  1046  //set start of ENTRY section
  1047  !A [] $082 |CI!a  |VI14
  1048  //clear SAVE key
  1049  !A [] $286
  1050#ENDCOMMAND
  1051
  1052#REM ENTFIND FINDs a record based on the file/field of the last executed
  1053#REM ENTRY command, and displays the results on a FIND. THE FIND mode
  1054#REM is the only argument.
  1055#REM ENTFIND also maintains the ENT$QUERY indicator.
  1056
  1057#COMMAND ENTFIND &"$0""$1""$2""$3""$4""$5"
  1058  !A [] $281 |CI!1
  1059#ENDCOMMAND
  1060
  1061#COMMAND ENTRY RWV#LUG UVC#LF UFVW#BC
  1062  #IF !0=1
  1063    AUTO3$ ENTRY !1 PAGE!f
  1064  #ELSE
  1065    #IFTYPE !2 "O"
  1066      AUTO3$ ENTRY !1 PAGE!f !2
  1067    #ELSE
  1068      #CHECK !2 _RVCLE
  1069      #IFCLASS !1 "E"
  1070        !A [] $8000 !1 !2 {$C002,$C003 !3
  1071      #ELSE
  1072        !A [] $8000 !1 !2 !3
  1073      #ENDIF
  1074    #ENDIF
  1075  #ENDIF
  1076#ENDCOMMAND
  1077
  1078#REM ENTSFIND (SUPERFIND) FINDs a record in the main file, based on the
  1079#REM file/field of the last ENTRY command, and displays the results.
  1080#REM This depends on the main file number being in SYSINT 8 (|VI8).
  1081
  1082#COMMAND ENTSFIND &"$0""$1""$2""$3""$4""$5" .
  1083  !A [] $282 |CI!1
  1084#ENDCOMMAND
  1085
  1086#REM ENTUPDATE moves all changed windows from the
  1087#REM window buffer to the record buffer
  1088
  1089// only works with recnum tables. Command not used in VDF
  1090#COMMAND ENTUPDATE &T .
  1091  #IF !0>0
  1092    !A [] $280 !1.RECNUM  // only works with recnum tables (obsolete command)
  1093  #ELSE
  1094    !A [] $280 |CI0
  1095  #ENDIF
  1096#ENDCOMMAND
  1097
  1098#COMMAND ERASEFILE &R#LGU .
  1099  !A [] $2C1 !1
  1100#ENDCOMMAND
  1101
  1102#COMMAND ERROR &#L%RGU #LUG .
  1103  !A [] $047 !1 !2
  1104#ENDCOMMAND
  1105
  1106#COMMAND ERROR_REPORT SU#LGO .
  1107  #IF !0>0
  1108    !A [] $04C !1
  1109  #ELSE
  1110    !A [] $04C |CI0
  1111  #ENDIF
  1112#ENDCOMMAND
  1113
  1114#COMMAND FIELD_DEF _E U#LG "TO" #LGUCE #LGRUEC .
  1115  #IFDEF !1
  1116    !A [] $82 !1 FILENUMBER
  1117  #ELSE
  1118    #CHECK !1.FILE_NUMBER _U
  1119    #SET Q$ !1.FILE_NUMBER
  1120    !A [] $82 |CI!q FILENUMBER
  1121  #ENDIF
  1122  !A [] $82 !2 FIELDNUMBER
  1123  !A [] $345 !4 !5
  1124#ENDCOMMAND
  1125
  1126#COMMAND FILELIST &R#%LG "TO""" #LUGCE #LUCGE .
  1127  #IFSAME !1 NEXT
  1128    !A [] $301 !3 !4
  1129  #ELSE
  1130    #IFSAME !1 PATHNAME
  1131      !A [] $302 !3 !4
  1132    #ELSE
  1133      #CHECK !1 _U
  1134      !A [] $82 !1 FILENUMBER
  1135      !A [] $300 !3 !4
  1136    #ENDIF
  1137  #ENDIF
  1138#ENDCOMMAND
  1139
  1140#REM Put back into FILELIST.  The file number must be in "FILENUMBER"
  1141#REM Three values are: ROOT NAME, DISPLAY NAME, LOGICAL NAME.
  1142
  1143#COMMAND FILELIST$PUT &#LRU #LRU #LU
  1144  #IF !0>2
  1145    !A [] $309 !3
  1146  #ENDIF
  1147  !A [] $30A !1 !2
  1148#ENDCOMMAND
  1149
  1150#COMMAND FILE$MODE$HELP R "READ_ONLY""SINGLE_USER""ALIAS""MASTER_ALIAS""DEFAULT" .
  1151//  #CHECK !1.RECNUM _CVWLR#GU
  1152  #IFSAME !2 READ_ONLY
  1153        SET_ATTRIBUTE DF_FILE_ALIAS OF FILENUMBER TO DF_FILE_ALIAS_DEFAULT
  1154        !A [] $0CB INDIRECT_FILE.RECNUM |CI91
  1155  #ELSE
  1156    #IFSAME !2 SINGLE_USER
  1157      SET_ATTRIBUTE DF_FILE_ALIAS OF FILENUMBER TO DF_FILE_ALIAS_DEFAULT
  1158      !A [] $0CB INDIRECT_FILE.RECNUM |CI7
  1159  #ELSE
  1160      #IFSAME !2 DEFAULT
  1161        !A [] $0CB INDIRECT_FILE.RECNUM |CI0
  1162        SET_ATTRIBUTE DF_FILE_ALIAS OF FILENUMBER TO DF_FILE_ALIAS_DEFAULT
  1163      #ELSE
  1164        #IFSAME !2 ALIAS
  1165          !A [] $0CB INDIRECT_FILE.RECNUM |CI130
  1166          SET_ATTRIBUTE DF_FILE_ALIAS OF FILENUMBER TO DF_FILE_IS_ALIAS
  1167        #ELSE
  1168          #IFSAME !2 MASTER_ALIAS
  1169            !A [] $0CB INDIRECT_FILE.RECNUM |CI128
  1170            SET_ATTRIBUTE DF_FILE_ALIAS OF FILENUMBER TO DF_FILE_IS_MASTER
  1171          #ENDIF
  1172        #ENDIF
  1173      #ENDIF
  1174    #ENDIF
  1175  #ENDIF
  1176#ENDCOMMAND
  1177
  1178#COMMAND FILE_MODE
  1179  //#IFSAME !1 |FS0,0& |FN0,0& |FD0,0&
  1180  // This supports both Indirect_file and Indirect_file.Recnum -JJT
  1181  #IFSAME !1.FILE_NUMBER |FS0,0& |FN0,0& |FD0,0& |FS0,0&.RECNUM
  1182  #ELSE
  1183    #SET Q$ !1.FILE_NUMBER
  1184    !A [] $82 |CI!q FILENUMBER
  1185  #ENDIF
  1186  FILE$MODE$HELP !1 !2 !3 !4 !5 !6 !7 !8 !9
  1187#ENDCOMMAND
  1188
  1189#REM FILE$MODE <FILE> <MODE NUMBER>
  1190#REM    MODE VALUES (VALUES ARE ADDITIVE)
  1191#REM    1   NO AUTOMATIC REREAD OF RECORD BUFFERS.
  1192#REM    2   NO LOCKS (LOCK OR REREAD)
  1193#REM    4   NO RE-READ OF BLOCK ZERO OF DATA FILE OR INDEXES
  1194#REM    8   NO EDITS OF ACTIVE RECORDS (ERROR 66)
  1195#REM    16  NO DELETES OF RECORDS (ERROR 63)
  1196#REM    32  NO FINDS (ERROR 64)
  1197#REM    64  NO CREATES OF NEW RECORDS. (ERROR 65)
  1198#REM    128 ALWAYS RE_READ BLOCK 0
  1199#REM Warning; Improper combinations of the above could disable
  1200#REM multiuser checking and destroy the data base.
  1201#REM 8 Thru 64 are non destructive and can be used in applications.
  1202#REM FOR EXPERTS ONLY!
  1203
  1204// see Old_open command for notes on this removal
  1205//#COMMAND FILE$MODE RT #LGSU .
  1206//  #CHECK !1.RECNUM _RULG
  1207//  !A [] $0CB !1.RECNUM !2
  1208//#ENDCOMMAND
  1209
  1210#COMMAND FILE_SIZE R#LGSD "TO" R#LGE #LUGE #LGUE .
  1211  #IFDEF !1 // SET FILE SIZE
  1212    #CHECK !3.FILE_NUMBER _RU
  1213    #SET Q$ !3.FILE_NUMBER
  1214    !A [] $343 |CI!q !1
  1215  #ELSE
  1216    #CHECK !1.FILE_NUMBER _U
  1217    #SET Q$ !1.FILE_NUMBER
  1218    !A [] $82 |CI!q FILENUMBER
  1219    !A [] $341 !3 !4
  1220    !A [] $82 STRMARK !5
  1221  #ENDIF
  1222#ENDCOMMAND
  1223
  1224#COMMAND FIND &"$0""$1""$2""$3""$4""$5" R "BY""" % .
  1225  #IFCLASS !2 "F"
  1226    #CHECK !2 _U#LGWV
  1227    #CHECK !3 .
  1228    !A [] $0C0 !2 |CI!1
  1229  #ELSE
  1230    #CHECK !2.FILE_NUMBER _U#LGWV
  1231    #CHECK !4 _RUL#GVFW
  1232    #SET Q$ !2.FILE_NUMBER
  1233    #SET Y$ !4
  1234    !A [] $0C6 |FS!q.!y |CI!1
  1235  #ENDIF
  1236#ENDCOMMAND
  1237
  1238#COMMAND FIND$PAGE "AT""COLORS""" #LUG U#LG .
  1239  #IF !0>0
  1240    #IFSAME !1 AT
  1241      !A [] $1C8 !2 !3
  1242    #ELSE
  1243      #IFSAME !1 COLORS
  1244        !A [] $1C9 !2 !3
  1245      #ENDIF
  1246    #ENDIF
  1247  #ENDIF
  1248#ENDCOMMAND
  1249
  1250#REM  FLEX$INIT - STANDARD REPLACES
  1251#REM  These are the standard symbols that are required for the compiler
  1252#REM  This procedure will be automatically executed
  1253#REM  when the compiler starts
  1254
  1255#COMMAND FLEX$INIT &.
  1256  #REPLACE CALC CALCULATE
  1257  #REPLACE LT $0  // internal value for the find/indicate modes.
  1258  #REPLACE LE $1
  1259  #REPLACE EQ $2
  1260  #REPLACE GE $3
  1261  #REPLACE GT $4
  1262  #REPLACE NE $5
  1263//  #REPLACE TRUE $1
  1264//  #REPLACE FALSE $0
  1265  #REPLACE TRUE  |CZ1   // changed to bit constants so we can use true or false in
  1266  #REPLACE FALSE |CZ0   // any command (e.g. move true to bStat). Also required change in indicate
  1267  #REPLACE NOT ~
  1268  #SET C$ 11
  1269  #REPLACE LASTIF |!C
  1270  #REPLACE ENT$PERMISSIVE |10
  1271  #REPLACE IN$0 $4000
  1272  #REPLACE IN$1 $4004
  1273  #REPLACE IN$2 $4008
  1274  #REPLACE IN$3 $400C
  1275  #REPLACE IN$4 $4010
  1276  #REPLACE IN$5 $4014
  1277  #REPLACE IN$GLANY |0
  1278  #REPLACE IN$GLALL |4
  1279  #REPLACE IN$GRANY |0
  1280  #REPLACE IN$GRALL |2
  1281  #REPLACE IN$GMOR  |0
  1282  #REPLACE IN$GMAND |1
  1283  #REPLACE ERR |127
  1284  #REPLACE ERRLINE |VI6
  1285  #REPLACE LAST_CRIT_ERR |VI102
  1286  #REPLACE EXT_CRIT_ERR |VI103
  1287  #REPLACE CONSTRAIN_TESTS_COUNT |VI106
  1288  #REPLACE CONSTRAIN_FOUND_COUNT |VI107
  1289  #REPLACE FINDERR |126
  1290  #REPLACE SEQEOF |125
  1291  #REPLACE SEQEOL |121
  1292  #REPLACE MULTIUSER |120
  1293  #REPLACE FIELDINDEX |VI1
  1294  #REPLACE WINDOWINDEX |VI2
  1295  #REPLACE LASTERR |VI5
  1296  #REPLACE KEYPRESS |123
  1297  #REPLACE TERMCHAR |VI3
  1298  #REPLACE FLEXKEY |VI4
  1299  #REPLACE SCREENEND |VI17
  1300  #REPLACE MEMAVAIL |VI18
  1301  #REPLACE LASTENTRY |VI19
  1302  #REPLACE FLX_REVISION |VI36
  1303  #REPLACE ENTER$DISPLAY |VI38
  1304  #REPLACE NOKEYCHECK |VI80
  1305  #REPLACE CHAIN_DEPTH |VI81
  1306  #REPLACE CURSOR_SET |VI82 // THESE ARE USED BY AUTOBACK
  1307  #REPLACE CURSOR_RETURN |VI83
  1308  #REPLACE MINIMUM_MEMORY |VI86
  1309  #REPLACE INDEX_NUMBER |VI90
  1310  #REPLACE SCREEN_WIDTH |VI91
  1311  #REPLACE KEY.ANY  |100
  1312  #REPLACE KEY.RETURN   |101
  1313  #REPLACE KEY.PRINT    |102
  1314  #REPLACE KEY.ESCAPE   |103
  1315  #REPLACE KEY.LEFT |104
  1316  #REPLACE KEY.RIGHT    |105
  1317  #REPLACE KEY.FIELD    |106
  1318  #REPLACE KEY.FIND |107
  1319  #REPLACE KEY.SFIND    |108
  1320  #REPLACE KEY.SAVE |109
  1321  #REPLACE KEY.DELETE   |110
  1322  #REPLACE KEY.CALCULATE |111
  1323  #REPLACE KEY.USER |112
  1324  #REPLACE KEY.CLEAR    |113
  1325  #REPLACE KEY.NEXT |115
  1326  #REPLACE KEY.PREVIOUS |114
  1327  #REPLACE KEY.UP   |116
  1328  #REPLACE KEY.DOWN |117
  1329  #REPLACE KEY.HELP |118
  1330  #REPLACE KEY.USER2    |119
  1331  #REPLACE NUMPAGE  |VI28
  1332  #REPLACE NUMWINDOW    |VI29
  1333  #REPLACE #$
  1334  #SET F$ 1
  1335  #REPLACE NEXT_MENU |VI127
  1336  #REPLACE CURRENT_IMAGE |VI9
  1337  #REPLACE CURRENT_WINDOW |VI7
  1338  #REPLACE LAST_GOSUB |VI0
  1339  #REPLACE FOUND |254
  1340  #REPLACE STRMARK |VI12
  1341  #REPLACE STRLEN |VI13
  1342  //   ENTER & REPORT DEF'S
  1343  #REPLACE LINECOUNT |VI10
  1344  #REPLACE PAGECOUNT |VI11
  1345  #REPLACE PAGEEND |VI25
  1346  #REPLACE PAGEFEED |VI26
  1347  #SET D$ 128   // INTEGERS NOW START HERE.
  1348  #SET P$ 0
  1349  #REPLACE AUTOFIND $C000
  1350  #REPLACE AUTOFIND_GE $C000,$C008
  1351  #REPLACE FINDREQ  $C001
  1352  #REPLACE NOPUT    $C002
  1353  #REPLACE NOENTER  $C003
  1354  #REPLACE SKIPFOUND $C004
  1355  #REPLACE RETAINALL $C005
  1356  #REPLACE RETAIN    $C006
  1357  #REPLACE FORCEPUT $C007
  1358  #REPLACE DISPLAYONLY $C002,$C003
  1359  #REPLACE CAPSLOCK $C023
  1360  #REPLACE ZERO_SUPPRESS $C024
  1361  #REPLACE THOUSANDS $C025
  1362  #REPLACE SUPPRESS $C040=''
  1363  #REPLACE FLOAT$ $C026
  1364  #REPLACE UPPER $C023
  1365  #REPLACE SIGNRT $C027
  1366  #REPLACE CHECK $C012
  1367  #REPLACE RANGE $C013
  1368  #REPLACE REQUIRED $C022
  1369  #REPLACE AUTORETURN $C028
  1370  #REPLACE AUTOBACK   $C029
  1371  #REPLACE NO_CALC    $C02B   // Disable Calculate (internal)
  1372  #REPLACE MODAL_INSERT $C02A // Change insert style (internal)
  1373  #REPLACE AUTOCLEAR $C02D
  1374  #REPLACE WP_BACKSP $C02E
  1375  #REPLACE PAGEBREAK |124
  1376  #REPLACE FILL $C040
  1377  #REPLACE POINTS $C080
  1378  #REPLACE FILENUMBER |VI15
  1379  #REPLACE FIELDNUMBER |VI16
  1380  #REPLACE INDEX.1 |CI1   // the indexes are just integers.
  1381  #REPLACE INDEX.2 |CI2
  1382  #REPLACE INDEX.3 |CI3
  1383  #REPLACE INDEX.4 |CI4
  1384  #REPLACE INDEX.5 |CI5
  1385  #REPLACE INDEX.6 |CI6
  1386  #REPLACE INDEX.7 |CI7
  1387  #REPLACE INDEX.8 |CI8
  1388  #REPLACE INDEX.9 |CI9
  1389  #REPLACE INDEX.10 |CI10
  1390  #REPLACE INDEX.11 |CI11
  1391  #REPLACE INDEX.12 |CI12
  1392  #REPLACE INDEX.13 |CI13
  1393  #REPLACE INDEX.14 |CI14
  1394  #REPLACE INDEX.15 |CI15
  1395  #REPLACE INDEX.BATCH |CI10
  1396  #REPLACE RECNUM |CI0
  1397  #REPLACE EXPORT_FILES 1
  1398  #REPLACE EXPORT_ONLY 2
  1399  #REPLACE SEQ_EXPORT 4
  1400  #REPLACE INDIRECT_FILE.RECNUM |FS0,0&
  1401  // note we are defining indirect_file.file_number so one can use indirect_file directly. Note that this
  1402  // technique (any use of indirect_file in any form) is not a recommended technique because there are API commands
  1403  // to do anything it does. Therefore, we will not create yet another way to use indirect_file.
  1404  #REPLACE INDIRECT_FILE.FILE_NUMBER |FS0,0&
  1405  #REPLACE DESKTOP |CI2
  1406  #REPLACE END_FUNCTION END_PROCEDURE
  1407  #REPLACE PROCEDURE_RETURN FUNCTION_RETURN
  1408
  1409  #REPLACE TOTAL_RESOURCES |VI104
  1410
  1411    // video related replaces
  1412  #REPLACE BW40 0
  1413  #REPLACE C40  1
  1414  #REPLACE BW80 2
  1415  #REPLACE C80  3
  1416  #REPLACE MONO 7
  1417  #REPLACE EXTENDED_EGAVGA 64
  1418  #REPLACE EXTENDED_VGA    128
  1419
  1420  // API Constants
  1421  #REPLACE DFERR_ERROR   |CI-1
  1422  #REPLACE DF_SUCCESS    |CI0
  1423  #REPLACE DFFALSE       |CI0
  1424  #REPLACE DFTRUE        |CI1
  1425
  1426  // DataFlex driver specific constants
  1427  #REPLACE FLEX_SET_MAX_SORT_BUFFER             |CI1
  1428  #REPLACE FLEX_GET_MAX_SORT_BUFFER             |CI2
  1429  #REPLACE FLEX_REPAIR_FILE                     |CI3
  1430  #REPLACE FLEX_GET_REPAIRS_NEEDED              |CI4
  1431  #REPLACE FLEX_SET_INDEX_OPT                   |CI5
  1432  #REPLACE FLEX_GET_INDEX_OPT                   |CI6
  1433  #REPLACE FLEX_GET_STRICT_TRANSACTIONS         |CI7
  1434  #REPLACE FLEX_SET_STRICT_TRANSACTIONS         |CI8
  1435
  1436    // DataFlex specific file damage types
  1437  #REPLACE FLEX_HEADER_OK             |CI0
  1438  #REPLACE FLEX_BLOCK0_BAD            |CI1
  1439  #REPLACE FLEX_HEADER_BAD            |CI2
  1440  #REPLACE FLEX_HEADER_INTEGRITY_OFF  |CI4
  1441  #REPLACE FLEX_HEADER_UNREADABLE     |CI8
  1442
  1443  // Index optimization modes
  1444  #REPLACE FLEX_INDEX_OPT_ON          |CI1
  1445  #REPLACE FLEX_INDEX_OPT_PERMISSIVE  |CI2
  1446  #REPLACE FLEX_INDEX_OPT_OFF         |CI3
  1447
  1448  // Flex revision codes (for use with DF_FILE_REVISION)
  1449  #REPLACE FLEX_REVISION_23   |CS"2.3B"
  1450  #REPLACE FLEX_REVISION_30   |CS"3.0"
  1451
  1452
  1453  // Attributes: Runtime
  1454  #REPLACE DF_RUNTIME_PROGRESS_FREQUENCY |CI4097
  1455
  1456  // Attributes: Global
  1457  #REPLACE DF_LOCK_DELAY                        |CI1
  1458  #REPLACE DF_LOCK_TIMEOUT                      |CI2
  1459  #REPLACE DF_OPEN_PATH                         |CI3
  1460  #REPLACE DF_DATE_FORMAT                       |CI4
  1461  #REPLACE DF_DATE_SEPARATOR                    |CI5
  1462  #REPLACE DF_DECIMAL_SEPARATOR                 |CI6
  1463  #REPLACE DF_THOUSANDS_SEPARATOR               |CI7
  1464  #REPLACE DF_ALL_FILES_TOUCHED                 |CI8
  1465  #REPLACE DF_HIGH_DATA_INTEGRITY               |CI9
  1466  #REPLACE DF_TRAN_COUNT                        |CI10
  1467  #REPLACE DF_TRANSACTION_ABORT                 |CI11
  1468  #REPLACE DF_REREAD_REQUIRED                   |CI12
  1469  #REPLACE DF_FILELIST_NAME                     |CI13
  1470  #REPLACE DF_REPORT_UNSUPPORTED_ATTRIBUTES     |CI14
  1471  #REPLACE DF_STRICT_ATTRIBUTES                 |CI15
  1472  #REPLACE DF_NUMBER_DRIVERS                    |CI16
  1473  #REPLACE DF_DRIVER_NAME                       |CI17
  1474  #REPLACE DF_DRIVER_NUMBER_SERVERS             |CI18
  1475  #REPLACE DF_DRIVER_SERVER_NAME                |CI19
  1476  #REPLACE DF_API_DISABLED                      |CI20
  1477  #REPLACE DF_API_DISABLED_ERROR                |CI21
  1478  #REPLACE DF_TRANABORT_ONERROR                 |CI22
  1479  #REPLACE DF_OPEN_FILE_COUNT                   |CI23
  1480  #REPLACE DF_DATE_4_STATE                      |CI24
  1481  #REPLACE DF_EPOCH_VALUE                       |CI25
  1482  #REPLACE DF_SYSDATE_4_STATE                   |CI26
  1483  #REPLACE DF_NUMBER_FILES_SUPPORTED            |CI27
  1484
  1485
  1486
  1487  // Attributes: File
  1488  #REPLACE DF_FILE_STATUS	      |CI101
  1489  #REPLACE DF_FILE_MODE               |CI102
  1490  #REPLACE DF_FILE_MAX_RECORDS	      |CI103
  1491  #REPLACE DF_FILE_RECORDS_USED	      |CI104
  1492  #REPLACE DF_FILE_TYPE               |CI105
  1493  #REPLACE DF_FILE_MULTIUSER	      |CI106
  1494  #REPLACE DF_FILE_REUSE_DELETED      |CI107
  1495  #REPLACE DF_FILE_NUMBER             |CI108
  1496  #REPLACE DF_FILE_COMPRESSION	      |CI109
  1497  #REPLACE DF_FILE_LAST_INDEX_NUMBER  |CI110
  1498  #REPLACE DF_FILE_NUMBER_FIELDS      |CI111
  1499  #REPLACE DF_FILE_LOGICAL_NAME	      |CI112
  1500  #REPLACE DF_FILE_ROOT_NAME	      |CI113
  1501  #REPLACE DF_FILE_CHANGED            |CI114
  1502  #REPLACE DF_FILE_ALIAS              |CI115
  1503  #REPLACE DF_FILE_TOUCHED            |CI116
  1504  #REPLACE DF_FILE_TRANSACTION	      |CI117
  1505  #REPLACE DF_FILE_OPENED             |CI118
  1506  #REPLACE DF_FILE_DISPLAY_NAME       |CI119
  1507  #REPLACE DF_FILE_PHYSICAL_NAME      |CI120
  1508  #REPLACE DF_FILE_NEXT_OPENED	      |CI121
  1509  #REPLACE DF_FILE_NEXT_USED	      |CI122
  1510  #REPLACE DF_FILE_NEXT_EMPTY	      |CI123
  1511  #REPLACE DF_FILE_RECORD_LENGTH      |CI124
  1512  #REPLACE DF_FILE_RESTRUCTURE	      |CI125
  1513  #REPLACE DF_FILE_OPEN_MODE	      |CI126
  1514  #REPLACE DF_FILE_INTEGRITY_CHECK    |CI127
  1515  #REPLACE DF_FILE_OWNER              |CI128
  1516  #REPLACE DF_FILE_IS_SYSTEM_FILE     |CI129
  1517  #REPLACE DF_FILE_LOCK_TYPE          |CI130
  1518  #REPLACE DF_FILE_COMMITTED          |CI131
  1519  #REPLACE DF_FILE_DRIVER             |CI132
  1520  #REPLACE DF_FILE_RECORD_LENGTH_USED |CI133
  1521  #REPLACE DF_FILE_HANDLE_TYPE        |CI134
  1522  #REPLACE DF_FILE_RECORD_IDENTITY    |CI135
  1523  #REPLACE DF_FILE_LOGIN              |CI136
  1524  #REPLACE DF_FILE_RECORD_PRIVILEGE   |CI137 // PRIVATE, DO NOT USE
  1525  #REPLACE DF_FILE_PRIVILEGE          |CI138 // PRIVATE, DO NOT USE
  1526  #REPLACE DF_FILE_CREATION_SERIAL    |CI139 // PRIVATE, DO NOT USE
  1527  #REPLACE DF_FILE_REVISION           |CI140
  1528  #REPLACE DF_FILE_RELATED_COUNT      |CI141 // PRIVATE, DO NOT USE
  1529  #REPLACE DF_FILE_RELATED_FIELDS     |CI142 // PRIVATE, DO NOT USE
  1530  #REPLACE DF_FILE_SYSTEM_FILE        |CI143
  1531  #REPLACE DF_FILE_SYSTEM_FIELD       |CI144
  1532  #REPLACE DF_FILE_RECORD_REREAD      |CI145
  1533  #REPLACE DF_FILE_RECNUM_TABLE       |CI1401
  1534  #REPLACE DF_FILE_PRIMARY_INDEX      |CI1402
  1535
  1536
  1537  // Attributes: Fields
  1538
  1539  #REPLACE DF_FIELD_NUMBER	      |CI201
  1540  #REPLACE DF_FIELD_TYPE	      |CI202
  1541  #REPLACE DF_FIELD_LENGTH	      |CI203
  1542  #REPLACE DF_FIELD_PRECISION	      |CI204
  1543  #REPLACE DF_FIELD_RELATED_FILE      |CI205
  1544  #REPLACE DF_FIELD_RELATED_FIELD     |CI206
  1545  #REPLACE DF_FIELD_NAME	      |CI207
  1546  #REPLACE DF_FIELD_INDEX	      |CI208
  1547  #REPLACE DF_FIELD_OFFSET	      |CI209
  1548  #REPLACE DF_FIELD_OLD_NUMBER	      |CI210
  1549  #REPLACE DF_FIELD_OVERLAP           |CI211
  1550  #REPLACE DF_FIELD_NATIVE_LENGTH     |CI212
  1551
  1552  // Attributes: Index
  1553  #REPLACE DF_INDEX_NUMBER_SEGMENTS     |CI301
  1554  #REPLACE DF_INDEX_NUMBER_BUFFERS      |CI302
  1555  #REPLACE DF_INDEX_TYPE                |CI303
  1556  #REPLACE DF_INDEX_LEVELS              |CI304
  1557  #REPLACE DF_INDEX_KEY_LENGTH          |CI305
  1558
  1559  // Attributes: Index Segments
  1560  #REPLACE DF_INDEX_SEGMENT_DIRECTION   |CI401
  1561  #REPLACE DF_INDEX_SEGMENT_CASE        |CI402
  1562  #REPLACE DF_INDEX_SEGMENT_FIELD       |CI403
  1563  // Attributes: Driver
  1564  #REPLACE DF_DRIVER_CONFORMANCE        |CI1201
  1565
  1566
  1567  // Date types
  1568  #REPLACE DF_DATE_USA           |CI0
  1569  #REPLACE DF_DATE_EUROPEAN      |CI1
  1570  #REPLACE DF_DATE_MILITARY      |CI2
  1571
  1572  // Callback Types
  1573  #REPLACE DF_MESSAGE_TEXT            |CI0
  1574  #REPLACE DF_MESSAGE_HEADING_1       |CI1
  1575  #REPLACE DF_MESSAGE_HEADING_2       |CI2
  1576  #REPLACE DF_MESSAGE_HEADING_3       |CI3
  1577  #REPLACE DF_MESSAGE_HEADING_4       |CI4
  1578  #REPLACE DF_MESSAGE_HEADING_5       |CI5
  1579  #REPLACE DF_MESSAGE_WARNING         |CI6
  1580  #REPLACE DF_MESSAGE_PROGRESS_TITLE  |CI7
  1581  #REPLACE DF_MESSAGE_PROGRESS_VALUE  |CI8
  1582
  1583  // Aux file types
  1584  #REPLACE DF_AUX_FILE_FD      |CI0
  1585  #REPLACE DF_AUX_FILE_DEF     |CI1
  1586
  1587  // File status values
  1588  #REPLACE DF_FILE_INACTIVE       |CI0
  1589  #REPLACE DF_FILE_ACTIVE         |CI1
  1590  #REPLACE DF_FILE_ACTIVE_CHANGED |CI2
  1591
  1592  // File user values
  1593  #REPLACE DF_FILE_USER_SINGLE  |CI0
  1594  #REPLACE DF_FILE_USER_MULTI   |CI1
  1595
  1596  // File deleted values
  1597  #REPLACE DF_FILE_DELETED_NOREUSE  |CI0
  1598  #REPLACE DF_FILE_DELETED_REUSE    |CI1
  1599
  1600  // Compressions types
  1601  #REPLACE DF_FILE_COMPRESS_NONE        |CI0
  1602  #REPLACE DF_FILE_COMPRESS_FAST        |CI1
  1603  #REPLACE DF_FILE_COMPRESS_STANDARD    |CI2
  1604  #REPLACE DF_FILE_COMPRESS_CUSTOM      |CI3
  1605
  1606  // File alias
  1607  #REPLACE DF_FILE_ALIAS_DEFAULT        |CI0
  1608  #REPLACE DF_FILE_IS_MASTER            |CI1
  1609  #REPLACE DF_FILE_IS_ALIAS             |CI2
  1610
  1611  // File handle types
  1612  #REPLACE DF_FILE_HANDLE_BAD                   |CI0
  1613  #REPLACE DF_FILE_HANDLE_CLOSED                |CI1
  1614  #REPLACE DF_FILE_HANDLE_OPENED                |CI2
  1615  #REPLACE DF_FILE_HANDLE_EXISTING_RESTRUCTURE  |CI3
  1616  #REPLACE DF_FILE_HANDLE_NEW_RESTRUCTURE       |CI4
  1617
  1618  // File transaction types
  1619  #REPLACE DF_FILE_TRANSACTION_NONE             |CI0
  1620  #REPLACE DF_FILE_TRANSACTION_CLIENT_ATOMIC    |CI1
  1621  #REPLACE DF_FILE_TRANSACTION_SERVER_ATOMIC    |CI2
  1622  #REPLACE DF_FILE_TRANSACTION_SERVER_LOGGED    |CI3
  1623
  1624  // Types of restructure required
  1625  #REPLACE DF_NO_RESTRUCTURE            |CI0
  1626  #REPLACE DF_RESTRUCTURE_FILE          |CI1
  1627  #REPLACE DF_RESTRUCTURE_INDEX         |CI2
  1628  #REPLACE DF_RESTRUCTURE_BOTH          |CI3
  1629
  1630  // File touched attribute
  1631  #REPLACE DF_FILE_NOT_TOUCHED         |CI48
  1632  #REPLACE DF_FILE_TOUCHED_INACTIVE    |CI49
  1633  #REPLACE DF_FILE_TOUCHED_ACTIVE      |CI50
  1634
  1635  #REPLACE DF_FILEMODE_ORIGINAL    -1 // only valid for smart_filemode in data sets
  1636  #REPLACE DF_FILEMODE_DEFAULT     0
  1637  #REPLACE DF_FILEMODE_NO_REREAD   1
  1638  #REPLACE DF_FILEMODE_NO_LOCKS    2
  1639  #REPLACE DF_FILEMODE_NO_EDITS    8
  1640  #REPLACE DF_FILEMODE_NO_DELETES  16
  1641  #REPLACE DF_FILEMODE_NO_FINDS    32
  1642  #REPLACE DF_FILEMODE_NO_CREATES  64
  1643  #REPLACE DF_FILEMODE_READONLY    91
  1644  #REPLACE DF_FILEMODE_SINGLE_USER 3
  1645
  1646  // File closing type
  1647  #REPLACE DF_PERMANENT 0
  1648  #REPLACE DF_TEMPORARY 1
  1649
  1650  // File locking types
  1651  #REPLACE DF_LOCK_TYPE_NONE     |CI0
  1652  #REPLACE DF_LOCK_TYPE_FILE     |CI1
  1653  #REPLACE DF_LOCK_TYPE_RECORD   |CI2
  1654
  1655  // Modes for openning a file.
  1656  #REPLACE DF_SHARE               |CI0
  1657  #REPLACE DF_EXCLUSIVE           |CI1
  1658
  1659  // Index types
  1660  #REPLACE DF_INDEX_TYPE_ONLINE   |CI0
  1661  #REPLACE DF_INDEX_TYPE_BATCH    |CI1
  1662
  1663  // Segment case used?
  1664  #REPLACE DF_CASE_USED     |CI0
  1665  #REPLACE DF_CASE_IGNORED  |CI1
  1666
  1667  // Segment direction
  1668  #REPLACE DF_ASCENDING     |CI0
  1669  #REPLACE DF_DESCENDING    |CI1
  1670
  1671  // Field Types
  1672  #REPLACE DF_ASCII      |CI0
  1673  #REPLACE DF_BCD        |CI1
  1674  #REPLACE DF_DATE       |CI2
  1675  #REPLACE DF_OVERLAP    |CI3
  1676  #REPLACE DF_TEXT       |CI5
  1677  #REPLACE DF_BINARY     |CI6
  1678  #REPLACE DF_DATETIME   |CI7
  1679
  1680  // dfStructureEnd Option bits
  1681  #REPLACE DF_STRUCTEND_OPT_NONE       |CI0
  1682  #REPLACE DF_STRUCTEND_OPT_FORCE      |CI1
  1683  #REPLACE DF_STRUCTEND_OPT_RECOMPRESS |CI2
  1684  #REPLACE DF_STRUCTEND_OPT_IN_PLACE   |CI4
  1685
  1686  #REPLACE DF_SORT_OPTION_NONE             |CI0
  1687  #REPLACE DF_SORT_OPTION_NO_DATA_CHECK    |CI8
  1688  #REPLACE DF_SORT_OPTION_BAD_DATA_FIXUP   |CI16
  1689  #REPLACE DF_SORT_OPTION_BAD_DATA_FILE    |CI32
  1690  #REPLACE DF_SORT_OPTION_BAD_DATA_ABORT   |CI64
  1691  #REPLACE DF_SORT_OPTION_DUP_DATA_FILE    |CI128
  1692  #REPLACE DF_SORT_OPTION_DUP_DATA_ABORT   |CI256
  1693
  1694  // Field fill types
  1695  #REPLACE DF_HIGH     |CI0
  1696  #REPLACE DF_LOW      |CI1
  1697
  1698  // Resource Types
  1699  // DAC reservers the negative values, you may use the positive values,
  1700  // 0 means uninitialized or error.
  1701  #REPLACE DF_RESOURCE_TYPE_ERROR     |CI0  // if resource is invalid
  1702                                            // or uninitialized.
  1703  #REPLACE DF_RESOURCE_TYPE_BINARY    |CI-1 // use this with include_resource for
  1704                                            // bitmaps and other binary files.
  1705  #REPLACE DF_RESOURCE_TYPE_LINE      |CI-2 // default type for resources.
  1706
  1707  // These symbols are passed to the SYSCONF function to determine
  1708  // which OS specific item is returned.
  1709  #REPLACE SYSCONF_TIMER_RESOLUTION     |CI0
  1710  #REPLACE SYSCONF_DIR_SEPARATOR        |CI1
  1711  #REPLACE SYSCONF_OS_SHORT_NAME        |CI2
  1712  #REPLACE SYSCONF_OS_MAJOR_REV         |CI3
  1713  #REPLACE SYSCONF_OS_MINOR_REV         |CI4
  1714  #REPLACE SYSCONF_OS_NAME              |CI5
  1715  #REPLACE SYSCONF_MACHINE_NAME         |CI6
  1716  #REPLACE SYSCONF_FILE_MASK            |CI7
  1717  #REPLACE SYSCONF_DATAFLEX_REV         |CI8
  1718  #REPLACE SYSCONF_SYSTEM_NAME          |CI9
  1719  #REPLACE SYSCONF_PATH_SEPARATOR       |CI10
  1720  #REPLACE SYSCONF_RUNTIME_NAME         |CI11
  1721  #REPLACE SYSCONF_UTC_TIME_OFFSET      |CI12
  1722
  1723  // Subsystem numbers
  1724  #REPLACE DF_CMD_SUBSYSTEM_REV    |CI5
  1725  #REPLACE DF_UI_SUBSYSTEM_REV     |CI1
  1726  #REPLACE DF_DS_SUBSYSTEM_REV     |CI1
  1727
  1728  #REPLACE DF_CMD_SUBSYSTEM    |CI0
  1729  #REPLACE DF_UI_SUBSYSTEM     |CI1
  1730  #REPLACE DF_DS_SUBSYSTEM     |CI2
  1731
  1732  #REPLACE DF_NUMBER_SUBSYSTEMS |CI3
  1733
  1734  #REPLACE ENUM_LIST ENUMERATION_LIST
  1735  #REPLACE END_ENUM_LIST END_ENUMERATION_LIST
  1736
  1737  //
  1738  // Date Constants
  1739  //
  1740  #REPLACE DATE4_STATE    |CI0
  1741  #REPLACE EPOCH_VALUE    |CI1
  1742  #REPLACE SYSDATE4_STATE |CI2
  1743
  1744  // These are values to be used by the raw file commands
  1745  // representing different file permission bits
  1746  #REPLACE DF_FLEX_UID_EXECUTE   |CI1024  //04000
  1747  #REPLACE DF_FLEX_GID_EXECUTE   |CI512   //02000
  1748  #REPLACE DF_FLEX_OWNER_READ    |CI256   //00400
  1749  #REPLACE DF_FLEX_OWNER_WRITE   |CI128   //00200
  1750  #REPLACE DF_FLEX_OWNER_EXECUTE |CI64    //00100
  1751  #REPLACE DF_FLEX_GROUP_READ    |CI32    //00040
  1752  #REPLACE DF_FLEX_GROUP_WRITE   |CI16    //00020
  1753  #REPLACE DF_FLEX_GROUP_EXECUTE |CI8     //00010
  1754  #REPLACE DF_FLEX_WORLD_READ    |CI4     //00004
  1755  #REPLACE DF_FLEX_WORLD_WRITE   |CI2     //00002
  1756  #REPLACE DF_FLEX_WORLD_EXECUTE |CI1     //00001
  1757  #REPLACE DF_FLEX_ALL_RIGHTS    |CI20471
  1758
  1759  // Error Codes used by the Compiler
  1760  #REPLACE DFERR_COMP_BAD_IMAGE_NAME                 |CI4293
  1761  #REPLACE DFERR_COMP_CONSTANT_EXPECTED              |CI4299
  1762  #REPLACE DFERR_COMP_ILLEGAL_RETURN_TYPE            |CI4310
  1763  #REPLACE DFERR_COMP_IMAGE_NOT_FOUND                |CI4311
  1764  #REPLACE DFERR_COMP_INVALID_DATATYPE               |CI4315
  1765  #REPLACE DFERR_COMP_INVALID_TYPE                   |CI4317
  1766  #REPLACE DFERR_COMP_MISSING_ARGUMENT               |CI4320
  1767  #REPLACE DFERR_COMP_MISSING_END_OBJECT             |CI4323
  1768  #REPLACE DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT   |CI4328
  1769  #REPLACE DFERR_COMP_SYMBOL_ALREADY_DEFINED         |CI4332
  1770  #REPLACE DFERR_COMP_TOO_MANY_MESSAGES              |CI4339
  1771  #REPLACE DFERR_COMP_UNRESOVLED_CONTROL_BLOCK       |CI4348
  1772
  1773  #REPLACE DFERR_COMP_ILLEGAL_OBJECT_DEFINTION       |CI4388 // object name used is not valid
  1774  #REPLACE DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION     |CI4389 // property name cannot be used
  1775  #REPLACE DFERR_COMP_ILLEGAL_METHOD_DEFINTION       |CI4390 // method name cannot be used
  1776  #REPLACE DFERR_COMP_ILLEGAL_CODE_PLACEMENT         |CI4391 // Location of code, nesting, is wrong
  1777  #REPLACE DFERR_COMP_INVALID_METHOD_SYNTAX          |CI4392 // syntax is incorrect for method definition
  1778  #REPLACE DFERR_COMP_INVALID_MESSAGE_SYNTAX         |CI4393 // sysntax is incorrect for sending message
  1779  #REPLACE DFERR_COMP_INVALID_OBJECT_REFERENCE       |CI4394 // object named in message is invalid
  1780  #REPLACE DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE   |CI4395 // Obsolete - was 101 (Moveused by fmac)
  1781  #REPLACE DFERR_COMP_INVALID_ARGUMENT               |CI4396 // Agument in line is incorrect
  1782  #REPLACE DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINITION |CI4397 // name cannot be used
  1783  //
  1784  #REPLACE DFERR_COMP_MISSING_DEBUG_INFORMATION      |CI4500 // debug information is not provided
  1785  #REPLACE DFERR_COMP_INCOMPATIBLE_DEBUG_INFORMATION |CI4501 // debug inforamtion is is not correct
  1786  #REPLACE DFERR_COMP_RECURSIVE_STRUCT_DECLARATION   |CI4513 // recursive struct definition
  1787  #REPLACE DFERR_COMP_AMBIGUOUS_SYNTAX.              |CI4514 // either Left of "'[' is not array, use '(' if indicator" or "Left of '.' is not of type struct or table"
  1788
  1789  // constants used by rich edit class
  1790  #REPLACE FR_WHOLEWORD 2
  1791  #REPLACE FR_MATCHCASE 4
  1792
  1793  #REPLACE SCF_ALL       4
  1794  #REPLACE SCF_SELECTION 1
  1795  #REPLACE SCF_WORD      2
  1796  #REPLACE SCF_DEFAULT   0
  1797
  1798  #REPLACE ERR_RE_ATTR_INCONSISTENT_THROUGH_SELECTION |CI40001
  1799  #REPLACE ERR_RE_SUCCESS                             |CI0
  1800  #REPLACE ERR_RE_CANNOT_SETTEXT                      |CI40002
  1801  #REPLACE ERR_RE_CONVERSION_CODEPAGE                 |CI40003
  1802  #REPLACE ERR_RE_FNAME_TOO_LONG                      |CI40004
  1803  #REPLACE ERR_RE_CANNOT_OPEN_FILE                    |CI40005
  1804
  1805
  1806
  1807
  1808  // Error handler may return source information as "Source = module.function". This is the
  1809  // text that returned from the runtime that contains this information.
  1810  #REPLACE C_ErrorContextSourceText |CS"Source ="
  1811
  1812  #SET  N$ 2 // save 0,1 stacks for IF/ELSE
  1813  #SET ZR$ 0 // for compile-time-assigned resource_ids
  1814  #SET ZS$ 0 // for enumerated lists
  1815  #SET ZT$ 0 //  "       "       "
  1816  #XPUSH !n $INIT
  1817
  1818// Note that for this build of FMAC the subsystems are the same for character mode
  1819// and windows.
  1820
  1821  #CHKSUB 0 6  // Verify the General Flex subsystem. Version 0 of command system. Revision 4.
  1822               // This was changed from 0 3 to 0 4 to force recompilation of programs from 3.1 to 3.2.
  1823               // And changed from 0 5 to force recompilation when we changed the size of the argument and command line.
  1824               // And changed from 0 6 to force recompilation on 7.1.13 build.
  1825#ENDCOMMAND
  1826
  1827#COMMAND FOR &ECFWGSNR#LU "FROM" %UGLR# "TO""" %UGL# .
  1828  // we do iftype checks because the command checking does not understand A and K 
  1829  #IFTYPE !1 "K"
  1830    #ERROR 4345 "!1, Struct not allowed"
  1831  #ELSE   
  1832    #IFTYPE !1 "A"
  1833      #ERROR 4345 "!1, Array not allowed"
  1834    #ELSE
  1835      #SET N$ !N
  1836      #PUSH !R
  1837      #XPUSH !n $INIT
  1838      //MOVEINT !3 TO !1
  1839      !A [] $082 !3 !1
  1840      #IF (!0>3)
  1841        // IF !1 LE !5 GOTO FOR$!r
  1842        !A [] $4004 !1 !5 |11 |2
  1843        !A [|11] $041 |CL0
  1844        #FREF FOR$!r !a
  1845      #ENDIF
  1846      #$ !A 0 0 0 $041 |CL0
  1847      #FREF END$!r !a
  1848      #$ BEGIN$!r:
  1849      #$ WHILE$!r:
  1850      #IF !0=3
  1851        #$ !A [] $083 !1
  1852      #ELSE
  1853        #$ !A [] $083 !1 !5
  1854        #$ !A [|122] $041 |CL0
  1855        #FREF END$!r !a
  1856      #ENDIF
  1857      FOR$!r:
  1858    #ENDIF   
  1859  #ENDIF  
  1860#ENDCOMMAND
  1861
  1862// FORMAT window {}
  1863// FORMAT window THRU window {}
  1864
  1865#COMMAND FORMAT RUVCFL#G
  1866  #IF !0>2
  1867    FORMAT$RANGE !1 !2 !3 !4 !5
  1868  #ELSE
  1869    #CHECK !2 _RVCFWL#BE
  1870    #CHECK !3 .
  1871    #FORMAT !1 !2
  1872  #ENDIF
  1873#ENDCOMMAND
  1874
  1875#COMMAND FORMAT$RANGE ERUVCFL#G "THRU""THROUGH" ERUVCFL#G RVCFWL#B .
  1876  #FORMAT !1 !4
  1877  #IF (!1<!3)
  1878    #SET Q$ !1
  1879    FORMAT$RANGE |WS!Q THRU !3 !4
  1880  #ENDIF
  1881#ENDCOMMAND
  1882
  1883#COMMAND FORMFEED &.    // just like PAGECHECK 500
  1884  !A [] $203 |CI500 |CI0
  1885#ENDCOMMAND
  1886
  1887#COMMAND GET_ARGUMENT_SIZE "TO" _RUDCE#LGB .
  1888  !A [] $24F !2
  1889#ENDCOMMAND
  1890
  1891//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1892//
  1893//  Command:
  1894//      GET_CHANNEL_SIZE channelNumber TO integerVariable
  1895//
  1896//   Descrtiption:
  1897//      A command to retrieve the "size" of a sequential device (opened with
  1898//      direct_input). Warning, devices that do not support the concept of
  1899//      "size" (such as LST:) report an error.
  1900//
  1901//   Parmeters:
  1902//       channelNumber
  1903//            Number of a valid (open) channel.
  1904//       integerVariable
  1905//            Variable to return the channel size to. If the channel is not
  1906//            open, 0 is returned.
  1907//
  1908//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1909
  1910#COMMAND GET_CHANNEL_SIZE #LRUG$ "TO" #LRUG$EC .
  1911  !A [] $111 !1 !3
  1912#ENDCOMMAND
  1913
  1914//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1915//
  1916//  Command:
  1917//      GET_RESOURCE_TYPE resourceName|resourceId TO integerVariable
  1918//
  1919//   Descrtiption:
  1920//      A command to retrieve the type of a resource at runtime. (Note: the
  1921//      resource type is set a compile-time.) For the first parameter, you may
  1922//      pass either the resource name (not in quotes) or the integer value of
  1923//      the resource id.
  1924//
  1925//   Parmeters:
  1926//       resourceName
  1927//            Name of a resource.
  1928//       resourceId
  1929//            Integer value of a resource id. (The resource name is just a
  1930//            symbolic replacement (with a .RSC suffix) of a constant integer
  1931//            equal to the resource id.)
  1932//       integerVariable
  1933//            Variable to return the resource type to.
  1934//
  1935//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1936
  1937#COMMAND GET_RESOURCE_TYPE _R TO %#USGLR
  1938  #IFDEF !1
  1939    !A [] $112 !1 !3
  1940  #ELSE
  1941    !A [] $112 !1.RSC !3
  1942  #ENDIF
  1943#ENDCOMMAND
  1944
  1945#COMMAND GET_CURRENT_COLORS "TO" _RUDCE#LGB _RUDCE#LGB .
  1946  !A [] $14E !2 !3
  1947#ENDCOMMAND
  1948
  1949#COMMAND GET_CURRENT_DIRECTORY "TO" _RUDCE#LGB .
  1950  !A [] $2D1 !2
  1951#ENDCOMMAND
  1952
  1953#COMMAND GET_CURRENT_INPUT_CHANNEL "TO" _RUDCE#LGB .
  1954  !A [] $10D !2
  1955#ENDCOMMAND
  1956
  1957#COMMAND GET_CURRENT_LOCKCOUNT "TO" _RUDCE#LGB .
  1958  !A [] $0E6 !2
  1959#ENDCOMMAND
  1960
  1961#COMMAND GET_CURRENT_OUTPUT_CHANNEL "TO" _RUDCE#LGB .
  1962  !A [] $10E !2
  1963#ENDCOMMAND
  1964
  1965#COMMAND GET_CURRENT_USER_COUNT "TO" _RUDCE#LGB .
  1966  !A [] $2DB !2
  1967#ENDCOMMAND
  1968
  1969#COMMAND GET_DATE_FORMAT "TO" _RUDCE#LGB .
  1970  !A [] $2D8 !2
  1971#ENDCOMMAND
  1972
  1973#COMMAND GET_ENVIRONMENT &RD#GOBLU "TO" _RCEUGOB# .
  1974  !A [] $2CF !1 !3
  1975#ENDCOMMAND
  1976
  1977#COMMAND GET_LICENSED_MAX_USERS "TO" _RUDCE#LGB .
  1978  !A [] $2DA !2
  1979#ENDCOMMAND
  1980
  1981#COMMAND GET_NUMBER_FORMAT "TO" _RUDCE#LGB .
  1982  !A [] $2D9 !2
  1983#ENDCOMMAND
  1984
  1985#COMMAND GETXY #USGLR #USGLR .
  1986  !A [] $14D !1 !2
  1987#ENDCOMMAND
  1988
  1989#COMMAND GOSUB &RVFWSNDE#G .
  1990  #IFDEF !1
  1991    !A [] $042 !1
  1992  #ELSE
  1993    !A [] $042 |CL0
  1994    #FREF !1 !a
  1995  #ENDIF
  1996#ENDCOMMAND
  1997
  1998#COMMAND GOTO &RVFWSNDE#G .
  1999  #IFDEF !1
  2000    !A [] $041 !1
  2001  #ELSE
  2002    !A [] $041 |CL0
  2003    #FREF !1 !a
  2004  #ENDIF
  2005#ENDCOMMAND
  2006
  2007#COMMAND GOTOXY &%#USGL %#USGLR .
  2008  !A [] $145 !1 !2
  2009#ENDCOMMAND
  2010
  2011#COMMAND HELP &T .
  2012  #IF !0>0
  2013    #CHECK !1.N _U
  2014    !A [] $1C5 !1.N
  2015  #ELSE
  2016    !A [] $1C5 |CI0
  2017  #ENDIF
  2018#ENDCOMMAND
  2019
  2020#COMMAND IF LR
  2021  #IFSAME !1 ~
  2022    IFNOT !2 !3 !4 !5 !6 !7 !8 !9
  2023  #ELSE
  2024    #IFLOGICAL !1 // added to 12.0 to support indicators outside of expressions
  2025      IF (!1) !2 !3 !4 !5 !6 !7 !8 !9  // if indicator, place it within an expression
  2026    #ELSE
  2027      #IFSAME !1 STATUS
  2028        INDCT$STATUS LASTIF STATUS !2
  2029        IF$HELP !3 !4 !5 !6 !7 !8 !9
  2030      #ELSE
  2031        #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
  2032          INDCT$AS LASTIF AS !1 !2 !3
  2033          IF$HELP  !4 !5 !6 !7 !8 !9
  2034        #ELSE
  2035          #IFCLASS !1 "G"
  2036            INDCT$GROUP LASTIF GROUP ALL !1
  2037          #ELSE
  2038            INDCT$AS LASTIF AS !1
  2039          #ENDIF
  2040          IF$HELP !2 !3 !4 !5 !6 !7 !8 !9
  2041        #ENDIF
  2042      #ENDIF
  2043    #ENDIF
  2044  #ENDIF
  2045#ENDCOMMAND
  2046
  2047#COMMAND IFNOT LR
  2048  #IFSAME !1 ~
  2049    IF !2 !3 !4 !5 !6 !7 !8 !9
  2050  #ELSE
  2051    #IFLOGICAL !1 // added to 12.0 to support indicators outside of expressions
  2052      IFNOT (!1) !2 !3 !4 !5 !6 !7 !8 !9  // if indicator, place it within an expression
  2053    #ELSE
  2054      #IFSAME !1 STATUS
  2055        INDCT$STATUS LASTIF~ STATUS !2
  2056        IF$HELP !3 !4 !5 !6 !7 !8 !9
  2057      #ELSE
  2058        #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
  2059          INDCT$AS LASTIF~ AS !1 !2 !3
  2060          IF$HELP  !4 !5 !6 !7 !8 !9
  2061        #ELSE
  2062          #IFCLASS !1 "G"
  2063            INDCT$GROUP LASTIF~ GROUP ALL !1
  2064          #ELSE
  2065            INDCT$AS LASTIF~ AS !1
  2066          #ENDIF
  2067          IF$HELP !2 !3 !4 !5 !6 !7 !8    !9
  2068        #ENDIF
  2069      #ENDIF
  2070    #ENDIF
  2071  #ENDIF
  2072#ENDCOMMAND
  2073
  2074// note that IF_ and IFNOT_ are private and old. They do not work in all
  2075// cases. For example, "If_ Indicator" will not work. Use IF
  2076#COMMAND IF_ LR // THIS IF_ WILL NOT WORK WITH ELSE!
  2077  #IFSAME !1 ~
  2078    IFNOT_ !2 !3 !4 !5 !6 !7 !8 !9
  2079  #ELSE
  2080    #IFSAME !1 STATUS
  2081      INDCT$STATUS LASTIF STATUS !2
  2082      [LASTIF] !3 !4 !5 !6 !7 !8 !9
  2083    #ELSE
  2084      #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
  2085        INDCT$AS LASTIF AS !1 !2 !3
  2086        [LASTIF] !4 !5 !6 !7 !8 !9
  2087      #ELSE
  2088        #IFCLASS !1 "G"
  2089          INDCT$GROUP LASTIF GROUP ALL !1
  2090        #ELSE
  2091          INDCT$AS LASTIF AS !1
  2092        #ENDIF
  2093        [LASTIF] !2 !3 !4 !5 !6 !7 !8 !9
  2094      #ENDIF
  2095    #ENDIF
  2096  #ENDIF
  2097#ENDCOMMAND
  2098
  2099#COMMAND IFNOT_ LR // THIS IFNOT_ WILL NOT WORK WITH ELSE!
  2100  #IFSAME !1 ~
  2101    IF_ !2 !3 !4 !5 !6 !7 !8 !9
  2102  #ELSE
  2103    #IFSAME !1 STATUS
  2104      INDCT$STATUS LASTIF~ STATUS !2
  2105      [LASTIF] !3 !4 !5 !6 !7 !8 !9
  2106    #ELSE
  2107      #IFSAME !2 $0 $1 $2 $3 $4 $5 MATCH IN
  2108        INDCT$AS LASTIF~ AS !1 !2 !3
  2109        [LASTIF] !4 !5 !6 !7 !8 !9
  2110      #ELSE
  2111        #IFCLASS !1 "G"
  2112          INDCT$GROUP LASTIF~ GROUP ALL !1
  2113        #ELSE
  2114          INDCT$AS LASTIF~ AS !1
  2115        #ENDIF
  2116        [LASTIF] !2 !3 !4 !5 !6 !7 !8 !9
  2117      #ENDIF
  2118    #ENDIF
  2119  #ENDIF
  2120#ENDCOMMAND
  2121
  2122#COMMAND IF$HELP
  2123  !A [~LASTIF] $41 |CI0   // If LASTIF is false jump to end of IF command.
  2124  #XPUSH 1 !a     // Save line number of jump at static nesting level.
  2125  #XPUSH 0 !n     // Save nesting level in stack 0.
  2126  !1 !2 !3 !4 !5 !6 !7 !8 !9
  2127  #XPOP 0 Q$      // Restore nesting level into Q.
  2128  #XPOP  1 S$     // Restore IF JUMP line number
  2129  #XPUSH !q !s        // Push it back for the ELSE.
  2130  #IF (!n>!q)     // after a begin
  2131    #FREF END$!r !s    // Make IF JUMP goto end of begin block.
  2132  #ELSE       // same or lower nesting level
  2133    #FREF (!a+1) !s    // Make IF JUMP goto end of the IF.
  2134  #ENDIF
  2135#ENDCOMMAND
  2136
  2137#COMMAND IFCHANGE R R
  2138  #IFDEF !1
  2139    #CHECK !1 _RFCVGE
  2140    !A [] $1C6 !1
  2141  #ELSE
  2142    #CHECK !1.FILE_NUMBER _URWGV
  2143    !A [] $303 !1.FILE_NUMBER // should work with filename or indirect_file (which is obsolete)
  2144  #ENDIF
  2145  [|122] !2 !3 !4 !5 !6 !7 !8 !9
  2146#ENDCOMMAND
  2147
  2148//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  2149//
  2150//  Command:
  2151//      INCLUDE_RESOURCE fileName AS resourceName {TYPE resourceType}
  2152//
  2153//   Descrtiption:
  2154//      A command to include (embed) a file as a resource.
  2155//
  2156//   Parmeters:
  2157//       fileName
  2158//            Name of a file (NOT in quotes) to include. May include a path.
  2159//       resourceName
  2160//            Name of the resource (NOT in quotes).
  2161//       resourceType
  2162//            A constant integer (or a symbolic replacement for a constant
  2163//            integer) that is recorded in the .flx to indicate the type of
  2164//            resource. If omitted, DF_RESOURCE_TYPE_LINE is assumed. You
  2165//            uase any positive value for user-defined types. Do NOT use
  2166//            0. 0 means the resource is uninitialized (registered, but not
  2167//            included.) DAC reserves the negative values.
  2168//
  2169//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  2170
  2171#COMMAND INCLUDE_RESOURCE _TR "AS" _R """TYPE" _%USNVLE#
  2172  #IF (!0>3)
  2173    #SET Q$ !5 // specified type.
  2174  #ELSE
  2175    #SET Q$ DF_RESOURCE_TYPE_LINE // default to line.
  2176  #ENDIF
  2177  #IFDEF !3.RSC
  2178    #RESOURCE !1 !3.RSC !q $0  // re-register resource; $0 = already named (just
  2179  #ELSE                    // setting resource filename and type).
  2180    #REPLACE !3.RSC |CI!ZR // create unique resource id.
  2181    #RESOURCE !1 !Zr !q !3 // register new resource.
  2182  #ENDIF
  2183#ENDCOMMAND
  2184
  2185#COMMAND INCREMENT #ELCRUG .
  2186  #IFTYPE !1 "IV"
  2187     !A [] $083 !1 |CI0
  2188  #ELSE
  2189     Move (!1 + 1) to !1
  2190   #ENDIF
  2191#ENDCOMMAND
  2192
  2193#COMMAND INDCT$$0 &
  2194  !A [] $4028 |CI0 |CI0 !1 !3
  2195#ENDCOMMAND
  2196
  2197#COMMAND INDCT$$1 &RX R .
  2198  !A [] $4028 |CI0 |CI0 !1~ !3
  2199#ENDCOMMAND
  2200
  2201#COMMAND INDCT$AS //&RX "AS" LU "$0""$1""$2""$3""$4""$5""MATCH""IN""" #LUG .
  2202  #IF (!0<4)
  2203    #IFCLASS !3 "G"
  2204      #CHECK !4 ""     // INDICATE IND1 AS IND2
  2205      #CHECK !3 _SNDI#LO
  2206      !A [] $4020 !3 |GB[0] !1 |3
  2207    #ELSE
  2208
  2209      // If here we've got either a single variable if
  2210      //    If Var .... <or>
  2211      //    If (Var)
  2212      //
  2213      // Not all data types are supported in this format and the compiler will create an error if
  2214      // you pick the wrong one.
  2215      //
  2216      // Those Allowed are: Real, Number, Date, String, Integer, Boolean, Short, UShort, Char, UChar, Address
  2217      //
  2218      // Those not Allowed are: Float, Decimal, Currency, Time, DateTime, TimeSpan, Variant, BigInt, UBigInt, UInteger
  2219      //
  2220      // This was changed for 8.3. Prior to 8.3 types which were not supported (e.g. float) compiled but did not work.
  2221      // Now you get an error message at compile time. Also, address types which did not work now are allowed and work properly.
  2222      //
  2223      // Struct and arrays can only be used if they are members (e.g. not MyIntArray, but MyIntArray[1]; not MyStruct, but MyStruct.bMem)
  2224      // and if the member is within an expression (e.g. not MyIntArray[1], but (MyIntArray[1]) ).
  2225      // In addition you cannot use deprecated "If X[1] EQ Y[1]" syntax with structs and arrays. You must use expressions "if (x[1]=y[1])"
  2226
  2227      // INDICATE IND AS X
  2228      #CHECK !3 _U
  2229      // compare real 0 against real
  2230      #IFTYPE  !3 "R"
  2231        !A [] IN$5 !3 |CR0 !1 |3
  2232      #ELSE
  2233        // compar number 0 for date and number
  2234        #IFTYPE  !3 "ND"
  2235          !A [] IN$5 !3 |CN0 !1 |1
  2236        #ELSE
  2237          // compare integer 0 for integer, Long(?), Boolean, UBigint, UInteger, UShort, BigInt, Short, Char, UChar, Address
  2238          // prior to 8.3 this was "ILZOQGVUWCYH". In 8.3 we removed currency (O) and decimal (Q), BigInt (H), UBigInt (G), UInteger (V), added address (X)
  2239          #IFTYPE !3 "ILZUWCYX"
  2240            !A [] IN$5 !3 |CI0 !1 |2
  2241          #ELSE
  2242            // compare string "" against string
  2243            #IFTYPE !3 "S"
  2244              !A [] IN$5 !3 |CS"" !1 |0
  2245            #ELSE
  2246              // if type is a struct or array, we cannot use this. One of two types of errors
  2247              #IFTYPE !3 "KA"
  2248                #IFCLASS !3 "E"
  2249                  // if within an expression, it must be returning the entire struct or array which cannot be evaludated
  2250                  #ERROR DFERR_COMP_INVALID_TYPE "The expression returns a struct or array. This cannot used for logical evaluation."
  2251                #ELSE
  2252                  // if not an expression. This could be a non-member which is never allowed.
  2253                  // or it might be a member which requires parenthesis. eg: "if Var.bMem" should be "if (Var.bMem)"
  2254                  #ERROR DFERR_COMP_INVALID_TYPE "Structs and Arrays must be members and can only be evaluated within an expression. Use (bVars[x]) or (Var.bMem)"
  2255                #ENDIF
  2256              #ELSE
  2257                // types of BigInt, UBingInt, UInteger, time, timedate, float, currency, decimal, variant and timespan cannot be used directly in expression or as variables.
  2258                // They can be used inside of a boolean expression. So you can not do "If fFloatVar" or "If (fFloatVar)" but you can do
  2259                // "If (fFloatVar<>0)" instead. We don't support variant types because at compile time we just don't know what kind of data they
  2260                // will contain.
  2261                #IFTYPE !3 "TMFOPQJHGV"
  2262                  #ERROR DFERR_COMP_INVALID_TYPE "The variable data-type is not valid for logical evaluation. Use (var<>0)"
  2263                #ELSE
  2264                  #CHECK !3 _O
  2265                  !A [] $4020 !3 |GB[0] !1 IN$GLALL |3
  2266                #ENDIF
  2267              #ENDIF
  2268            #ENDIF
  2269          #ENDIF
  2270        #ENDIF
  2271      #ENDIF
  2272    #ENDIF
  2273  #ELSE
  2274    #CHECK !5 _R
  2275    #IFSAME !4 MATCH
  2276      !A [] $4031 !3 !5 !1 !6
  2277    #ELSE
  2278      #IFSAME !4 IN
  2279        !A [] $4030 !3 !5 !1 !6
  2280      #ELSE
  2281        #CHECK !3 _U
  2282
  2283        // If here we've got either a old style if statement
  2284        //    If Var NE Xxxx <or>
  2285        //    If Var EQ Var
  2286        //
  2287        // First of all note that this is a deprecated style and not all of the newer types are supported. If we
  2288        // find an invalid type in either side of the comparison, we will generate a compiler error
  2289        //
  2290        // Those Allowed are: Real, Number, Date, String, Integer, Boolean, Short, UShort, Char, UChar, Address
  2291        //
  2292        // Those not Allowed are: Float, Decimal, Currency, Time, DateTime, TimeSpan, Variant, BigInt, UBigInt, UInteger
  2293        //                        Struct or Arrays (even members of a valid data-type)
  2294        //
  2295        // This was changed for 8.3 and this may generate new compiler errors. That's good as it is catching errors.
  2296
  2297        // note that the order of these are important.
  2298        #IF2TYPE !3 !5 "TMFOPQJHGVAK"  // bad guys are: time, datetime, timespan, float, currency, decimal, variant, BigInt, UBigInit, UInteger, Struct, Array
  2299          #ERROR DFERR_COMP_INVALID_TYPE "One or both comparision variable datatypes are not valid for logical evaluation. Use (var<>xx)"
  2300        #ELSE
  2301          #IF2TYPE  !3 !5 "R"  // real
  2302            !A [] IN!4 !3 !5 !1 !6 |3
  2303          #ELSE
  2304            #IF2TYPE  !3 !5 "ND" // number, date
  2305              #IF2TYPE !3 !5 "X" // cannot compare address to number/date.
  2306                #ERROR DFERR_COMP_INVALID_TYPE "You cannot compare an address to a number or a date"
  2307              #ELSE
  2308                !A [] IN!4 !3 !5 !1 !6 |1
  2309              #ENDIF
  2310            #ELSE
  2311              // #IF2TYPE !3 !5 "IL" // pre-8.3 it was this (we let just about everything act as string, which did not work)
  2312              #IF2TYPE !3 !5 "ILZUWCYX" // integer, (long), boolean, Short, uShort, Char, UChar, Address
  2313                !A [] IN!4 !3 !5 !1 !6 |2
  2314              #ELSE
  2315                !A [] IN!4 !3 !5 !1 !6 |0  // if nothing else, string
  2316              #ENDIF
  2317            #ENDIF
  2318          #ENDIF
  2319        #ENDIF
  2320      #ENDIF
  2321    #ENDIF
  2322  #ENDIF
  2323#ENDCOMMAND
  2324
  2325#COMMAND INDCT$GROUP &XR "GROUP" R"ALL""ANY" CVFWSN#LRU "AND""OR""" "ANY""ALL""" CVFWSN#LU .
  2326  #IF !0>4
  2327    #CHECK !7 _R
  2328    !A [] $4020 !4 !7 !1 IN$GL!3 IN$GR!6 IN$GM!5
  2329  #ELSE
  2330    !A [] $4020 !4 |GB[0] !1 IN$GL!3 |3
  2331  #ENDIF
  2332#ENDCOMMAND
  2333
  2334#COMMAND INDCT$STATUS &R R #LWV
  2335  #IFDEF !3
  2336    !A [] $4029 !3 |CI0 !1 !4
  2337  #ELSE
  2338    #CHECK !3.FILE_NUMBER _U#LWV
  2339    #SET Q$ !3.FILE_NUMBER
  2340    !A [] $4029 |CI!q |CI0 !1 !4
  2341  #ENDIF
  2342#ENDCOMMAND
  2343
  2344#COMMAND INDEX_DEF R R#LGU "TO" #LGRNDCE #LGNDCE #LGNDCE
  2345  #IFDEF !1
  2346    !A [] $82 !1 FILENUMBER
  2347  #ELSE
  2348    #CHECK !1.FILE_NUMBER _UE
  2349    #SET Q$ !1.FILE_NUMBER
  2350    !A [] $82 |CI!q FILENUMBER
  2351  #ENDIF
  2352  !A [] $344 !2 !4 // index fields
  2353  #IF !0>4
  2354    !A [] $82 STRLEN !5 // number of fields
  2355    #IF !0>5
  2356      !A [] $349 !2 !6 // index attributes
  2357    #ENDIF
  2358  #ENDIF
  2359#ENDCOMMAND
  2360
  2361#COMMAND INDICATE R
  2362  #IFSAME !1 ~
  2363    #IFDEF !2
  2364    #ELSE
  2365      #REPLACE !2 |!C
  2366    #ENDIF
  2367    INDICATE !2~ !3 !4 !5 !6 !7 !8 !9
  2368  #ELSE
  2369    // #CHECK !2 "AS""STATUS""$0""$1""GROUP"
  2370    #IFDEF !1
  2371      #CHECK !1 _X
  2372    #ELSE
  2373      #REPLACE !1 |!C
  2374    #ENDIF
  2375    // INDCT$!2 !1 !2 !3 !4 !5 !6 !7 !8 !9 // old logic
  2376
  2377    // Logic changed to handle true/false defined as constants instead of $0 $1
  2378    // False is |CZ0, dfFalse is |CI0. If either, use $0.
  2379    // True  is |CZ1, dfTrue  is |CI1 If either, use $1.
  2380    #IFSAME !2 false dfFalse
  2381      INDCT$$0 !1 $0 !3 !4 !5 !6 !7 !8 !9 // special command for Indicate !1 False
  2382    #ELSE
  2383      #IFSAME !2 true dftrue
  2384         INDCT$$1 !1 $1 !3 !4 !5 !6 !7 !8 !9  // special command for Indicate !1 True
  2385      #ELSE
  2386         INDCT$!2 !1 !2 !3 !4 !5 !6 !7 !8 !9  // old fashion command uses !2 to assemble the command
  2387      #ENDIF
  2388    #ENDIF
  2389  #ENDIF
  2390#ENDCOMMAND
  2391
  2392#COMMAND INDICATOR RT
  2393  #REPLACE !1 |!C
  2394  #IF (!0>1)
  2395    INDICATOR !2 !3 !4 !5 !6 !7 !8 !9
  2396  #ENDIF
  2397#ENDCOMMAND
  2398
  2399#COMMAND INHERIT_SCREEN &.
  2400  !A [] $14B
  2401#ENDCOMMAND
  2402
  2403#COMMAND INKEY #LUCRE &.
  2404  !A [] $147 !1
  2405#ENDCOMMAND
  2406
  2407#COMMAND INKEY$ #LUCRE &.
  2408  !A [] $149 !1
  2409#ENDCOMMAND
  2410
  2411#COMMAND INPUT &#ULGR #LUG #ULG .
  2412  #IFCLASS !1 "C"
  2413    #CHECK !2 _RCLUEG _RCLUG
  2414    //move 0 to strmark
  2415    !A  [] $086 |CI0 |VI12
  2416    !A [] $142 !1
  2417    // INPUT !2 !3
  2418    !A [] $140 !2 !3 |CI79
  2419  #ELSE
  2420    #CHECK !1 _RCLUEG
  2421    !A [] $140 !1 !2 |CI79
  2422  #ENDIF
  2423#ENDCOMMAND
  2424
  2425#COMMAND INSERT #LGR "IN" #LGRCE "AT"""
  2426  #IF (!0>3)
  2427    #CHECK !5 _#LGR%
  2428    //MOVEINT !5 TO STRMARK
  2429    !A [] $82 !5 STRMARK
  2430  #ENDIF
  2431  !A [] $24C !3 !1
  2432#ENDCOMMAND
  2433
  2434//JJT-5.1
  2435//#COMMAND INTEGER TR
  2436//  // ALLOW FOR MORE INTS
  2437//  #REPLACE !1 |VI!D
  2438//  #IF (!0>1)
  2439//    INTEGER !2 !3 !4 !5 !6 !7 !8 !9
  2440//  #ENDIF
  2441//#ENDCOMMAND
  2442
  2443#COMMAND IS_FILE_INCLUDED R R "TO"""
  2444  !A [] $E0 !1 !2
  2445  #IF !0>2
  2446    #CHECK !4 _CUEGRL
  2447    MOVE (FOUND) TO !4
  2448  #ENDIF
  2449#ENDCOMMAND
  2450
  2451#COMMAND KEYCHECK
  2452  !A [] $046
  2453  #IF !0>0
  2454    [KEYPRESS] !1 !2 !3 !4 !5 !6 !7 !8
  2455  #ENDIF
  2456#ENDCOMMAND
  2457
  2458#COMMAND KEYPROC &R%WVF """GOSUB" WFVNSD# .
  2459  #IFSAME !1 ON
  2460    !A [] $82 |CI0 |VI33
  2461  #ELSE
  2462    #IFSAME !1 OFF
  2463      !A [] $82 |CI9999 |VI33
  2464    #ELSE
  2465      #SET Y$ !a
  2466      #IF (!0>1)
  2467        // MOVEINT ADR(3) TO KEY LOC
  2468        #SET Q$ (!1-100+40) // address in SYSINT
  2469        #IFDEF !3
  2470          !A [] $082 !3 |VI!q
  2471        #ELSE
  2472          !A [] $082 |CI0 |VI!q
  2473          #FREF !3 !a
  2474        #ENDIF
  2475      #ELSE
  2476        #SET Q$ (!1-100)
  2477        #KEYPROC !q !Y
  2478      #ENDIF
  2479    #ENDIF
  2480  #ENDIF
  2481#ENDCOMMAND
  2482
  2483#COMMAND LEFT &#UGL$ "TO" #UEGRLC L#% .
  2484  #IF !0>3
  2485    !A [] $082 !4 STRMARK
  2486  #ENDIF
  2487  !A [] $241 !1 !3
  2488#ENDCOMMAND
  2489
  2490#COMMAND LENGTH &#LUG$ "TO" C#LREUG .
  2491  !A [] $246 !1 !3
  2492#ENDCOMMAND
  2493
  2494#COMMAND LOCK &.
  2495  !A [] $0C7
  2496#ENDCOMMAND
  2497
  2498#COMMAND LOOP &.
  2499  #POP S$
  2500  #CHECK BEGIN$!s _RVFWSNDEU
  2501  !A [] $041 BEGIN$!s
  2502  END$!s:
  2503  #SET N$ !n-1
  2504#ENDCOMMAND
  2505
  2506#COMMAND MAKEDEF$   // make a list of symbols defined
  2507  #IF !0>0
  2508    #IFDEF !1
  2509    #ELSE
  2510      !1:
  2511    #ENDIF
  2512    #IF !0>1
  2513      MAKEDEF$ !2 !3 !4 !5 !6 !7 !8 !9
  2514    #ENDIF
  2515  #ENDIF
  2516#ENDCOMMAND
  2517
  2518#COMMAND MAKE_FILE RU#LG U#LG U#LG U#LG .
  2519  !A [] $34A !4
  2520  #IF !0>2
  2521    !A [] $82 !3 FILENUMBER
  2522  #ELSE
  2523    !A [] $82 |CI0 FILENUMBER
  2524  #ENDIF
  2525  #IF !0>1
  2526    !A [] $346 !1 !2
  2527  #ELSE
  2528    !A [] $346 !1 |CS''
  2529  #ENDIF
  2530#ENDCOMMAND
  2531
  2532#COMMAND MEMORY #LRCUGE &.
  2533  !A [] $2CA !1
  2534#ENDCOMMAND
  2535
  2536#COMMAND MID &#UGL$ "TO" #UGRLEC #L%U #L% .
  2537  #IF !0>4
  2538    !A [] $082 !5 STRMARK
  2539  #ENDIF
  2540  !A [] $082 !4 STRLEN
  2541  !A [] $245 !1 !3
  2542#ENDCOMMAND
  2543
  2544#REM  The type of a move is determined at compile time, based on the
  2545#REM  type of the destination.  The move type refers to the intermediate
  2546#REM  value to which the source will be converted.
  2547
  2548//JJT-5.1
  2549//#COMMAND MOVE #LU "TO" #GLEURC .
  2550//  #IFCLASS !1 "G"  // MOVE INDICATOR
  2551//    #CHECK !1 _VWFC
  2552//    !A [] $4020 !1 |GB[0] !3 IN$GLALL |3
  2553//  #ELSE
  2554//// Type independent move as of 2.3
  2555//    !A  [] $086 !1 !3
  2556//  #ENDIF
  2557//#ENDCOMMAND
  2558
  2559#COMMAND MOVEDATE &%#GULI "TO" #UCIGERL .
  2560  !A [] $084 !1 !3
  2561#ENDCOMMAND
  2562
  2563#COMMAND MOVEINT &%#GULD "TO" #UCSDEGRL .
  2564  !A [] $082 !1 !3
  2565#ENDCOMMAND
  2566
  2567#COMMAND MOVENUM &#ULG "TO" #UCLGREL .
  2568  !A [] $081 !1 !3
  2569#ENDCOMMAND
  2570
  2571#COMMAND MOVEREAL &#ULG "TO" #UCLGER .
  2572  !A [] $085 !1 !3
  2573#ENDCOMMAND
  2574
  2575#COMMAND MOVESTR &#ULG$ "TO" #UCLGR$E .
  2576  !A [] $080 !1 !3
  2577#ENDCOMMAND
  2578
  2579#COMMAND MULTI$     // repeat a command for each argument (internal)
  2580  #IF !0>1
  2581    !1 !2
  2582  #ENDIF
  2583  #IF !0>2
  2584    MULTI$ !1 !3 !4 !5 !6 !7 !8 !9
  2585  #ENDIF
  2586#ENDCOMMAND
  2587
  2588#COMMAND MULTIBACK$ // same as above, except that arguments
  2589  #IF !0>2        // are output in reverse order
  2590    MULTIBACK$ !1 !3 !4 !5 !6 !7 !8 !9
  2591  #ENDIF
  2592  #IF !0>1
  2593    !1 !2
  2594  #ENDIF
  2595#ENDCOMMAND
  2596
  2597#COMMAND NAME R#L T
  2598  #IFDEF !1
  2599    #REPLACE !2 !1
  2600    #CHECK !3 .
  2601  #ELSE
  2602    #IFCLASS !1.1 "W"
  2603      AUTOPAGE !1
  2604    #ELSE
  2605      AUTO3$ #REPLACE !1 PAGE!f
  2606    #ENDIF
  2607    #IF !0>1
  2608      NAME !2 !3 !4 !5 !6 !7 !8 !9
  2609    #ENDIF
  2610  #ENDIF
  2611#ENDCOMMAND
  2612
  2613// JJT-5.1
  2614//#COMMAND NUMBER TR
  2615//  #NUM V$
  2616//  #REPLACE !1 |VN!v
  2617//  #IF (!0>1)
  2618//    NUMBER !2 !3 !4 !5 !6 !7 !8 !9
  2619//  #ENDIF
  2620//#ENDCOMMAND
  2621
  2622#COMMAND ON R "GOTO""GOSUB""OFF" SNOBIODE
  2623  #IFSAME !1 ERROR
  2624    // MOVEINT ADDR to ONERROR (|VI31)
  2625    #IFDEF !3
  2626      !A [] $082 !3 |VI31
  2627      #CHECK !2 "GOSUB"
  2628    #ELSE
  2629      !A [] $082 |CI0 |VI31
  2630      #IFSAME !2 GOSUB
  2631        #FREF !3 !a
  2632      #ELSE
  2633        #CHECK !2 "OFF"
  2634      #ENDIF
  2635    #ENDIF
  2636  #ELSE
  2637    #SET Q$ (!0-1)
  2638    // INDICATE OK$1 AS !1 GT 0
  2639    #IFDEF OK$1
  2640    #ELSE
  2641    #REPLACE OK$1 |!C
  2642    #REPLACE OK$2 |!C
  2643    #ENDIF
  2644    #CHECK !1 _#ULGRS
  2645    !A [] $4010 !1 |CI0 OK$1 |2
  2646    // INDICATE OK$2 AS !1 LT !q
  2647    !A [] $4000 !1 |CI!q OK$2 |2
  2648    #SET Q$ (!a+2)
  2649    #IFSAME !2 GOTO
  2650    !A [OK$1 OK$2] $041 |CE(!q+!1 )
  2651    #ELSE
  2652    !A [OK$1 OK$2] $042 |CE(!q+!1 )
  2653    #ENDIF
  2654    #SET Q$ (!a+!0)
  2655    !A [] $041 |CL!q  //ERROR jump around GOTOs
  2656    MULTI$ GOTO !3 !4 !5 !6 !7 !8 !9
  2657  #ENDIF
  2658#ENDCOMMAND
  2659
  2660
  2661#REM OS$CALL makes a system BDOS call.  Only calls that can be passed
  2662#REM integer (not pointer) values can be used.  Use at your own risk!
  2663#REM Format of command:
  2664#REM OS$CALL <FUNCTION> <ARGUMENT> {TO <RESULT>}
  2665#REM <FUNCTION>    - BDOS function code - See O/S documentation.
  2666#REM <ARGUMENT>    - Integer value to pass with function (optional)
  2667#REM <RESULT>      - Result code returned by function
  2668
  2669#REM Example to set CP/M I/O byto to "NEW_IO_BYTE (integer):
  2670#REM OS$CALL 8 NEW_IO_BYTE
  2671
  2672#REM Example to get console status:
  2673#REM OS$CALL 12 0 TO CONSTAT //integer
  2674
  2675#COMMAND OS$CALL &#LRU%DG #L%UG "TO""" #LCGUE .
  2676  !A [] $2C8 !1 !2
  2677  #IF !0>3
  2678    //MOVEINT STRMARK TO !4
  2679    !A [] $82 STRMARK !4
  2680  #ENDIF
  2681#ENDCOMMAND
  2682
  2683#COMMAND OUTCLOSE &.
  2684  // OUTFILE 'CON:'
  2685  !A [] $200 |CS'CON:'
  2686#ENDCOMMAND
  2687
  2688#COMMAND OUTFILE &NDILU#G .
  2689  !A [] $200 !1
  2690#ENDCOMMAND
  2691
  2692#COMMAND OUTPUT
  2693  #IFSAME !1 CHANNEL
  2694    !A [] $10A |CI1 !2
  2695    OUTPUT !3
  2696  #ELSE
  2697    #CHECK !2 .
  2698    #IF !0>0
  2699      #CHECK !1.N _#LUGFV
  2700      !A [] $202 !1.N
  2701    #ELSE
  2702      !A [] $202 |VI9
  2703    #ENDIF
  2704  #ENDIF
  2705#ENDCOMMAND
  2706
  2707#COMMAND OUTPUT_WRAP R
  2708  #IFSAME !1 CHANNEL
  2709    !A [] $10A |CI1 !2
  2710    OUTPUT_WRAP !3
  2711  #ELSE
  2712    #CHECK !2 .
  2713    #CHECK !1.N _#LUGFV
  2714    !A [] $20A !1.N // Fill wrap fields and set |122 if empty
  2715    OUTPUT !1
  2716    [NOT |122] BLANKFORM !1
  2717    !A [NOT |122] $20A !1.N
  2718    [NOT |122] REPEAT
  2719    #IFDEF NEWPAGE
  2720      PAGECHECK !1.LINES
  2721      [PAGEBREAK] GOSUB NEWPAGE
  2722    #ENDIF
  2723    OUTPUT !1
  2724    !A [] $20A !1.N // get more from wrap fields
  2725    [NOT |122] LOOP
  2726  #ENDIF
  2727#ENDCOMMAND
  2728
  2729#COMMAND PAD &#ULG$ "TO" #ULGRCE L%# .
  2730  #IF !0>3
  2731    !A [] $082 !4 STRMARK
  2732  #ENDIF
  2733  !A [] $240 !1 !3
  2734#ENDCOMMAND
  2735
  2736#COMMAND PAGE R%
  2737  #IFSAME !1 SET
  2738    #IF !0>1
  2739      //  Set attributes for future use
  2740      #CHECK !2.N _RU#LG
  2741      MOVE !2.N TO STRMARK
  2742      FIND$PAGE !3 !4 !5
  2743      FIND$PAGE !6 !7 !8
  2744    #ELSE
  2745      //  Page an image named SET immediately
  2746      !A [] $1C0 !1.N
  2747    #ENDIF
  2748  #ELSE
  2749    #IF !0>1
  2750      //  Set attributes for use now
  2751      #CHECK !1.N _RU#LG
  2752      MOVE !1.N TO STRMARK
  2753      FIND$PAGE !2 !3 !4
  2754      FIND$PAGE !5 !6 !7
  2755    #ENDIF
  2756    //  Put image with new attributes on screen now
  2757    //  OR, put regular image on screen now.
  2758    !A [] $1C0 !1.N
  2759  #ENDIF
  2760#ENDCOMMAND
  2761
  2762#COMMAND PAGECHECK &#LG% .
  2763  #IFDEF !1  |CI0
  2764    !A [] $203 !1 |CI0
  2765  #ELSE
  2766    #CHECK !1.LINES _VFWU#LG
  2767    !A [] $203 !1.LINES |CI0
  2768  #ENDIF
  2769#ENDCOMMAND
  2770
  2771#COMMAND POS &#UGRL$ "IN" #UGRL$ #L% #L% .
  2772  !A [] $244 !1 !3
  2773  #IF !0>3
  2774    #CHECK !4 "TO"
  2775    #CHECK !5 _RCEUL
  2776    !A [] $082 STRMARK !5
  2777  #ENDIF
  2778#ENDCOMMAND
  2779
  2780#COMMAND PRINT #L
  2781  #IF !0>2
  2782    #IF !0>3
  2783      #FORMAT !3 !4
  2784      #CHECK !4 _CVFW#L
  2785    #ENDIF
  2786    #CHECK !2 "TO"
  2787    #CHECK !3 _CVF#L
  2788    #IFTYPE !3 "IND"
  2789      !A [] $206 !1 !3
  2790    #ELSE
  2791      #IFTYPE !3 "R"
  2792        !A [] $208 !1 !3
  2793      #ELSE
  2794        !A [] $205 !1 !3
  2795      #ENDIF
  2796    #ENDIF
  2797  #ELSE
  2798    AUTO4$ PRINT !1 TO PAGE!f !2
  2799  #ENDIF
  2800#ENDCOMMAND
  2801
  2802#COMMAND PRINT_WRAP #L
  2803  #IF !0>2
  2804    #IF !0>3
  2805      #FORMAT !3 !4
  2806      #CHECK !4 _CVFW#L
  2807    #ENDIF
  2808    #CHECK !2 "TO"
  2809    #CHECK !3 _CVF#L
  2810    #IFCLASS !1 "F"
  2811      !A [] $209 |CS"DBMS:!1" !3 // assign seq file to wrap window.
  2812    #ELSE
  2813      !A [] $209 !1 !3
  2814    #ENDIF
  2815  #ELSE
  2816    AUTO4$ PRINT_WRAP !1 TO PAGE!f !2
  2817  #ENDIF
  2818#ENDCOMMAND
  2819
  2820#COMMAND READ
  2821  #IFSAME !1 CHANNEL
  2822    !A [] $10A |CI0 !2
  2823    #IF !0>2
  2824      #CHECK !3 _ULEC
  2825      READ !3 !4 !5 !6 !7 !8 !9
  2826    #ENDIF
  2827  #ELSE
  2828    !A [] $108 !1
  2829    #IF !0>1
  2830      #CHECK !2 _ULEC
  2831      READ !2 !3 !4 !5 !6 !7 !8 !9
  2832    #ENDIF
  2833  #ENDIF
  2834#ENDCOMMAND
  2835
  2836#COMMAND READLN
  2837  #IFSAME !1 CHANNEL
  2838    #CHECK !3 _ULE
  2839    !A [] $10A |CI0 !2
  2840    READLN !3 !4 !5 !6 !7 !8 !9
  2841  #ELSE
  2842    #IF !0=0
  2843      !A [] $104 |CS''
  2844    #ENDIF
  2845    #IF !0=1
  2846      !A [] $104 !1
  2847    #ENDIF
  2848    #IF !0>1
  2849      #CHECK !1 _ULE
  2850      !A [] $108 !1
  2851      READLN !2 !3 !4 !5 !6 !7 !8 !9
  2852    #ENDIF
  2853  #ENDIF
  2854#ENDCOMMAND
  2855
  2856#COMMAND READ_BLOCK
  2857  #IFSAME !1 CHANNEL
  2858    !A [] $10A |CI0 !2
  2859    #IF !0>2
  2860      #CHECK !3 _ULE
  2861      #CHECK !4 _RU
  2862      !A [] $109 !3 !4
  2863    #ENDIF
  2864  #ELSE
  2865    #CHECK !1 _ULEC
  2866    #CHECK !2 _RU
  2867    !A [] $109 !1 !2
  2868  #ENDIF
  2869#ENDCOMMAND
  2870
  2871#COMMAND READ_DFINI &#LGOBDR .
  2872  !A [] $14C !1
  2873#ENDCOMMAND
  2874
  2875//#COMMAND REAL TR
  2876//  #REAL V$
  2877//  #REPLACE !1 |VR!v
  2878//  #IF (!0>1)
  2879//    REAL !2 !3 !4 !5 !6 !7 !8 !9
  2880//  #ENDIF
  2881//#ENDCOMMAND
  2882
  2883//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  2884//
  2885//  Command:
  2886//      REGISTER_RESOURCE resourceName
  2887//
  2888//   Descrtiption:
  2889//      A command to register a resource for use prior to its inclusion.
  2890//
  2891//   Parmeters:
  2892//       resourceName
  2893//            Name of the resource (NOT in quotes).
  2894//
  2895//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  2896
  2897#COMMAND REGISTER_RESOURCE _R
  2898  #IFDEF !1.RSC
  2899  #ELSE
  2900    #REPLACE !1.RSC |CI!ZR // create unique resource symbol.
  2901    #RESOURCE $0 !Zr 0 !1  // register resource; $0 = no filename; 0 = no type.
  2902  #ENDIF
  2903#ENDCOMMAND
  2904
  2905#COMMAND REGISTRATION &#RLUGCE #LUGEC .
  2906  !A [] $307 !1 !2
  2907#ENDCOMMAND
  2908
  2909#COMMAND RENAMEFILE &#LGU "TO" R#LGU .
  2910  !A [] $2C2 !1 !3
  2911#ENDCOMMAND
  2912
  2913#COMMAND REPEAT &.
  2914  #SET N$ !N
  2915  #PUSH !R
  2916  #XPUSH !n $INIT
  2917  #IFIND // INCLUDE JUMPS IF INDICATORS ON LINE
  2918  // GOTO BEGIN$!r
  2919  !A [] $041 |CL0
  2920  #FREF BEGIN$!r !a
  2921  #$ !A 0 0 0 $041 |CL0
  2922  #FREF END$!r !a
  2923  #ENDIF
  2924  #$ WHILE#!r:
  2925  #$ BEGIN$!r:
  2926#ENDCOMMAND
  2927
  2928
  2929
  2930#COMMAND REPLACE #LG "IN" #LGCE "WITH" #LRG
  2931  #IFIND
  2932    [] BEGIN
  2933    POS !1 IN !3
  2934    #$ [FOUND] MOVESTR (REPLACE(!1,!3,!5)) TO !3
  2935    END
  2936 #ELSE
  2937    POS !1 IN !3
  2938    [FOUND] MOVESTR (REPLACE(!1,!3,!5)) TO !3
  2939 #ENDIF
  2940#ENDCOMMAND
  2941
  2942// not updated for File_number vs recnum support. This should not be used with VDF. See Enter command for notes
  2943#COMMAND REPORT T "BY""DOWN" VFW%LGR "BREAK"""
  2944  #CHECK !1.RECNUM _UVCWGL
  2945  INTEGER RECCOUNT
  2946  #SET P$ 0
  2947  //          MOVEINT 20000 TO LINECOUNT  // start with a full page
  2948  !A [] $82 |CI20000 |VI10
  2949  //          MOVE 0 TO RECCOUNT
  2950  !A [] $82 |CI0 RECCOUNT
  2951  //          BREAKINIT           // init breakpoints
  2952  !A [] $207
  2953  //          INDICATE FIRSTREC TRUE      // used for subtotals
  2954  #IFDEF FIRSTREC
  2955  #ELSE
  2956    #REPLACE FIRSTREC |!C
  2957  #ENDIF
  2958  !A [] $4028 |CI0 |CI0 FIRSTREC~
  2959  #IFSAME !2 BY
  2960    FIND GE !1 BY !3          // FIND first record
  2961  #ELSE
  2962    FIND LE !1 BY !3
  2963  #ENDIF
  2964  [~FOUND] GOTO END$OF$REPORT
  2965  //          CLEARSCREEN         // start with a clear screen
  2966  !A [] $144
  2967  RPT.LOOP://   INDICATE SELECT TRUE      // default for SELECT
  2968  #IFDEF SELECT
  2969  #ELSE
  2970    #REPLACE SELECT |!C
  2971  #ENDIF
  2972  !A [] $4028 |CI0 |CI0 SELECT~
  2973  //          GOSUB RPT.SELECTION     // go to user selection
  2974  !A [] $42 |CL0
  2975  #FREF RPT.SELECTION !a
  2976  //[NOT SELECT] GOTO RPT.CONT        // test SELECT
  2977  !A [~ SELECT] $41 |CL0
  2978  #FREF RPT.CONT !a
  2979  BREAK$ !5 !6 !7 !8 !9       // set breakpoints
  2980  #SET X$ !p                  // set up to break down
  2981  [NOT FIRSTREC] BREAK$DOWN RPT.SUBTOTAL  // break down for SUBTOTAL
  2982  #SET X$ 0               // set up to break up
  2983  //          RELATE !1           // get related records
  2984  !A [] $C4 !1.RECNUM
  2985  BREAK$UP RPT.SUBHEADER      // break up for SUBHEADER
  2986  //          INCREMENT RECCOUNT
  2987  !A [] $083 RECCOUNT |CI0
  2988  //          GOSUB RPT.BODY          // print body
  2989  !A [] $42 |CL0
  2990  #FREF RPT.BODY !a
  2991  //          INDICATE FIRSTREC FALSE     // not first any more
  2992  !A [] $4028 |CI0 |CI0 FIRSTREC
  2993  RPT.CONT:
  2994  #IFSAME !2 BY
  2995    FIND GT !1 BY !3          // FIND next record
  2996  #ELSE
  2997    FIND LT !1 BY !3
  2998  #ENDIF
  2999  //          KEYCHECK            // check keyboard
  3000  !A [] $46
  3001  //[FOUND NOT KEYPRESS] GOTO RPT.LOOP    // if ok, loop
  3002  !A [FOUND ~ KEYPRESS] $41 RPT.LOOP
  3003  //[KEYPRESS]  GOSUB RPT.KEYPRESS    // user can disable KEYPRESS
  3004  !A [FOUND KEYPRESS]   $42 |CL0
  3005  #FREF RPT.KEYPRESS !a
  3006  !A [FOUND ~ KEYPRESS] $41 RPT.LOOP
  3007  #SET X$ !p                  // set up for break down
  3008  END.OF.REPORT:
  3009  [~ FIRSTREC]  BREAK$DOWN RPT.SUBTOTAL $X    // break down for last subtotals
  3010  //[FIRSTREC]  GOSUB RPT.TOTAL       // print TOTAL
  3011  !A [~ FIRSTREC] $42 |CL0
  3012  #FREF RPT.TOTAL !a
  3013  //          GOTO END$OF$REPORT      // GOTO end
  3014  !A [] $41 |CL0
  3015  #FREF END$OF$REPORT !a
  3016  NEWPAGE://    GOSUB RPT.HEADER      // new page, print HEADER
  3017  !A [] $42 |CL0
  3018  #FREF RPT.HEADER !a
  3019  #SET X$ 0    // this will reprint the page headers if included //
  3020  [NOT FIRSTREC] BREAK$PRT SUBHEADER      // reprint pages
  3021  //          RETURN              // end of NEWPAGE
  3022  !A [] $43 |CI0
  3023  RPT.SELECTION:              // selection starts after REPORT
  3024#ENDCOMMAND
  3025
  3026#COMMAND REPORTEND .         // end of REPORT
  3027  MAKEDEF$ RPT.HEADER RPT.SELECTION RPT.BODY RPT.TOTAL
  3028  #SET X$ 0
  3029  BREAK$T3
  3030  // RETURN
  3031  !A [] $43 |CI0
  3032  #IFDEF RPT.KEYPRESS
  3033  #ELSE
  3034    RPT.KEYPRESS:
  3035    // STRING AKEY$ 1
  3036    #IFDEF AKEY$
  3037    #ELSE
  3038      #STR V$ 1
  3039      #REPLACE AKEY$ |VS!v
  3040    #ENDIF
  3041    // SHOWLN 'A KEY HAS BEEN PRESSED.'
  3042    !A [] $142 |CS'A KEY HAS BEEN PRESSED.'
  3043    !A [] $143
  3044    // SHOW   'DO YOU WANT TO STOP THE REPORT (Y or N)? '
  3045    !A [] $142 |CS'DO YOU WANT TO STOP THE REPORT (Y or N)? '
  3046    // INKEY AKEY$
  3047    !A [] $147 AKEY$
  3048    !A [] $141 AKEY$
  3049    // IF NOT AKEY$ IN 'Yy' RETURN RPT.LOOP
  3050    INDCT$AS SELECT AS AKEY$ IN 'Yy'
  3051    //JJT-5.1
  3052    //[~ SELECT] RETURN RPT.LOOP
  3053    [~ SELECT] Gosub_RETURN RPT.LOOP
  3054    //JJT-5.1
  3055    //RETURN END$OF$REPORT  // Necessary to pop stack
  3056    Gosub_RETURN END$OF$REPORT  // Necessary to pop stack
  3057  #ENDIF
  3058  END$OF$REPORT:
  3059#ENDCOMMAND
  3060
  3061// JJT-5.1
  3062//#COMMAND RETURN VFWNDE#G
  3063//  #IF !0=0
  3064//    !A [] $043 |CL0
  3065//  #ELSE
  3066//    #IFSAME !1 RETURN
  3067//      #SET Q$ (!a+2)
  3068//      !A [] $043 |CL!q // RETURN RETURN
  3069//      RETURN !2 !3 !4 !5 !6 !7 !8 !9
  3070//    #ELSE
  3071//      #IFDEF !1
  3072//        #CHECK !1 _S
  3073//        #CHECK !2 .
  3074//        !A [] $043 !1
  3075//      #ELSE
  3076//        !A [] $043 |CL0
  3077//        #FREF !1 !a
  3078//      #ENDIF
  3079//    #ENDIF
  3080//  #ENDIF
  3081//#ENDCOMMAND
  3082
  3083#COMMAND RIGHT &#UGRL$ "TO" #UGRLEC L#% .
  3084  #IF !0>3
  3085    !A [] $082 !4 STRLEN
  3086  #ENDIF
  3087  !A [] $242 !1 !3
  3088#ENDCOMMAND
  3089
  3090#COMMAND RUNPROGRAM_PIPE #RLGU #RLGU #RLGU .
  3091    !A [] $2D6 !3    // Specify the object to receive MSG_INSERT
  3092                     // with the output from the pipe.
  3093    !A [] $2D7 !1 !2 // Execute the OS command with any arguments.
  3094#ENDCOMMAND
  3095
  3096#COMMAND RUNPROGRAM #RLG #LG #LGU #LGU .
  3097    // 14.0 SHELL option does a ShellExecute. Can be:
  3098    // SHELL must be the first parameter
  3099    #IFSAME !1 SHELL
  3100        Runprogram$Shell !2 !3 !4
  3101    #ELSE
  3102      #IFSAME !1 WAIT BACKGROUND
  3103        #IF !0>3
  3104          #ERROR DFERR_COMP_INVALID_ARGUMENT TOO MANY ARGUMENTS TO RUNPROGRAM !1
  3105        #ELSE
  3106            #IFSAME !1 WAIT
  3107                !A [] $2CC !2 !3
  3108              #ELSE // BACKGROUND
  3109                !A [] $2CD !2 !3
  3110              #ENDIF
  3111        #ENDIF
  3112      #ELSE
  3113          // Number of args is checked by type checking of command for PIPE.
  3114        #IFSAME !1 PIPE
  3115            #IF !0<4
  3116                RUNPROGRAM_PIPE !2 "" !3 !4 !5 !6 !7 !8 !9
  3117            #ELSE
  3118                RUNPROGRAM_PIPE !2 !3 !4 !5 !6 !7 !8 !9
  3119            #ENDIF
  3120        #ELSE // Plain RUNPROGRAM.
  3121            #IF !0>2
  3122                #ERROR DFERR_COMP_INVALID_ARGUMENT TOO MANY ARGUMENTS TO RUNPROGRAM
  3123            #ELSE
  3124                  !A [] $2C0 !1 !2
  3125            #ENDIF
  3126        #ENDIF
  3127      #ENDIF
  3128    #ENDIF
  3129#ENDCOMMAND
  3130
  3131#COMMAND Runprogram$Shell "WAIT""BACKGROUND" #LGU #LGU .
  3132  #IFSAME !1 Wait
  3133    !A [] $2f2 !2 !3
  3134  #ELSE
  3135    !A [] $2f1 !2 !3
  3136  #ENDIF
  3137#ENDCOMMAND
  3138
  3139
  3140#COMMAND SCREENMODE #%LGR # .
  3141  #IFSAME !1 ON
  3142    !A [] $148 |CE(458752)     // SCREENMODE on 0x70000
  3143  #ELSE
  3144    #IFSAME !1 OFF
  3145      !A [] $148 |CE(196608)       // SCREENMODE off 0x30000
  3146    #ELSE
  3147      #CHECK !1 _U
  3148      !A [] $148 !1
  3149    #ENDIF
  3150  #ENDIF
  3151  #IF !0>1
  3152    SCREENMODE !2
  3153  #ENDIF
  3154#ENDCOMMAND
  3155
  3156#COMMAND SECTION &RT #LGU .
  3157  #IFSAME !1 SELECTION            // SELECTION is null SECTION
  3158  #ELSE
  3159    // RETURN                   // RETURN from last routine
  3160    !A [] $43 |CI0
  3161    RPT.!1:                 // label SECTION
  3162    #IFDEF !2       // LINES REQ SPEC
  3163      // PAGECHECK !2
  3164      !A [] $203 !2
  3165      // [PAGEBREAK] GOSUB NEWPAGE
  3166      !A [PAGEBREAK] $42 NEWPAGE
  3167      #IFDEF !1.LINES
  3168        #SET F$ !1.N
  3169        #SET E$ 0
  3170      #ENDIF
  3171    #ELSE
  3172      #IFDEF !1.LINES                 // is there a page?
  3173        // PAGECHECK !1.LINES           // check for end of page
  3174        !A [] $203 !1.LINES |CI0
  3175        //[PAGEBREAK] GOSUB NEWPAGE     // if end, GOSUB NEWPAGE
  3176        !A [PAGEBREAK] $42 NEWPAGE
  3177        // AUTOPAGE !1              // start default page
  3178        #SET F$ !1.N
  3179        #SET E$ 0
  3180      #ENDIF
  3181    #ENDIF
  3182  #ENDIF
  3183#ENDCOMMAND
  3184
  3185#COMMAND SET_ARGUMENT_SIZE &#LGRBOUSD .
  3186  !A [] $24E !1
  3187#ENDCOMMAND
  3188
  3189#COMMAND SET_DFPATH "TO" &#LGRBOUD .
  3190  !A [] $2D0 !2
  3191#ENDCOMMAND
  3192
  3193#COMMAND SET_CHANNEL_POSITION  &#LRUG$ "TO" &#LRUG$ .
  3194  !A [] $10C !1 !3
  3195#ENDCOMMAND
  3196
  3197#COMMAND SET_OPTION #LGR . // Sets window options
  3198  #IFCLASS !1 _C         // To stay on perminantly until
  3199    #SET Q$ !1         // Turned off with CLEAR_OPTION.
  3200    !A [] $04A |CI!q |CI0     // SET_OPTION NO_CALC // Turn off calculate.
  3201  #ELSE
  3202    !A [] $04A !1 |CI0    // THIS COMMAND IS FOR INTERNAL USE.
  3203  #ENDIF
  3204#ENDCOMMAND
  3205
  3206#COMMAND SET_RELATE &#LGOBRWCV "TO" #LGOBRWCV .
  3207  !A [] $348 !1 !3
  3208#ENDCOMMAND
  3209
  3210#COMMAND SET_TERMLIST &#LGOBDR #LGOBDIN .
  3211  !A [] $14A !1 !2
  3212#ENDCOMMAND
  3213
  3214#COMMAND SETCHANGE &RCVF%G .
  3215  !A [] $1C7 !1
  3216#ENDCOMMAND
  3217
  3218#COMMAND SHOW #ULRG$
  3219  !A [] $142 !1
  3220  #IF (!0>1)
  3221    SHOW !2 !3 !4 !5 !6 !7 !8 !9
  3222  #ENDIF
  3223#ENDCOMMAND
  3224
  3225#COMMAND SHOWLN #LGU$
  3226  #IF (!0>0)
  3227    SHOW !1 !2 !3 !4 !5 !6 !7 !8 !9
  3228  #ENDIF
  3229  !A [] $143
  3230#ENDCOMMAND
  3231
  3232#COMMAND SLEEP #LGURDBO .
  3233  !A [] $02CE !1
  3234#ENDCOMMAND
  3235
  3236// removed along with the other Old_Xxxxx commands. Note that there is no current status command.
  3237//#COMMAND STATUS$ &CVW#LG "TO" #LUGRE
  3238//  #IFDEF !1
  3239//    !A [] $304 !1 !3
  3240//  #ELSE
  3241//    #CHECK !1.RECNUM _CVWLR#GU
  3242//    !A [] $304 !1.RECNUM !3
  3243//  #ENDIF
  3244//#ENDCOMMAND
  3245
  3246#COMMAND STOP &.
  3247  !A [] $144
  3248  !A [] $040
  3249#ENDCOMMAND
  3250
  3251#COMMAND STOP_HERE
  3252    !A [] $4d !1
  3253#ENDCOMMAND
  3254
  3255// JJT-5.1
  3256//#COMMAND STRING TR E#L%
  3257//  #IF (!0>1)
  3258//    #IFDEF !2
  3259//      #CHECK !2 _VSWDF
  3260//      #STR V$ !2
  3261//      #REPLACE !1 |VS!v
  3262//      #IF (!0>2)
  3263//        STRING !3 !4 !5 !6 !7 !8 !9
  3264//      #ENDIF
  3265//    #ELSE
  3266//      #STR V$ 80
  3267//      #REPLACE !1 |VS!v
  3268//      STRING !2 !3 !4 !5 !6 !7 !8 !9
  3269//    #ENDIF
  3270//  #ELSE
  3271//    #STR V$ 80
  3272//    #REPLACE !1 |VS!v
  3273//  #ENDIF
  3274//#ENDCOMMAND
  3275
  3276#COMMAND SUBTOTAL RFVC#LSD
  3277  PRINT !1% !2 !3 !4 !5
  3278  !A [] $082 |CI0 !1%
  3279#ENDCOMMAND
  3280
  3281#REM Get system date, hour, min, seconds.
  3282#REM WILL NOT WORK UNDER CPM 2.2
  3283
  3284#COMMAND SYSDATE$HELP
  3285//  #IFDEF IS$WINDOWS     // This code is no longer required in VDF5. KCR
  3286//      !A [] $2E2 |CI2 !2
  3287//  #ENDIF
  3288  !A [] $2C9 !1 !2
  3289  #IF !0>2
  3290    //MOVE STRLEN TO !3
  3291    !A [] $82 STRLEN !3
  3292  #ENDIF
  3293  #IF !0>3
  3294    //MOVE STRMARK TO !4
  3295    !A [] $82 STRMARK !4
  3296     #IF !0>4
  3297      //MOVE |VI37 TO !5
  3298      !A [] $82 |VI37 !5
  3299    #ENDIF
  3300  #ENDIF
  3301#ENDCOMMAND
  3302
  3303#COMMAND SYSDATE #ERCUGL #ECUGL #ECUGL #ECUGL . // SYSDATE DATE HR MIN SECOND
  3304    SYSDATE$HELP !1 DFFALSE !2 !3 !4 !5 !6 !7 !8 !9
  3305#ENDCOMMAND
  3306
  3307#COMMAND SYSDATE4 #ERCUGL #ECUGL #ECUGL #ECUGL . // SYSDATE DATE HR MIN SECOND
  3308    SYSDATE$HELP !1 DFTRUE !2 !3 !4 !5 !6 !7 !8 !9
  3309#ENDCOMMAND
  3310
  3311#COMMAND SYSTEM &.
  3312  !A [] $2C7
  3313#ENDCOMMAND
  3314
  3315#COMMAND TRIM &#LUG$ "TO" C#ELRUG .  // remove pre- and trailing spaces
  3316  !A [] $24B !1 !3
  3317#ENDCOMMAND
  3318
  3319#COMMAND UNLOCK &.
  3320  !A [] $0C8
  3321#ENDCOMMAND
  3322
  3323#COMMAND UNTIL R L L L .
  3324  #POP S$
  3325  IFNOT_ !1 !2 !3 !4 GOTO BEGIN$!s
  3326  END$!s:
  3327  #SET N$ !n-1
  3328#ENDCOMMAND
  3329
  3330#COMMAND UPPERCASE &C#LUGRND$ "TO""" C#LUG$END .
  3331  #IF !0>1
  3332    !A [] $249 !1 !3
  3333  #ELSE
  3334    !A [] $249 !1 !1
  3335  #ENDIF
  3336#ENDCOMMAND
  3337
  3338#COMMAND WHILE R L L L .
  3339  #SET N$ !N
  3340  #PUSH !R
  3341  #XPUSH !n $INIT
  3342  // GOTO WHILE$!r
  3343  !A [] $041 |CL0
  3344  #FREF WHILE$!r !a
  3345  #$ !A 0 0 0 $041 |CL!a
  3346  #FREF END$!r !a
  3347  #$ WHILE$!r:
  3348  #$ BEGIN$!r:
  3349  #$ IFNOT_ !1 !2 !3 !4 GOTO END$!r
  3350#ENDCOMMAND
  3351
  3352#COMMAND WRITE$STR #ULRG$
  3353    !A [] $106 !1
  3354    #IF (!0>1)
  3355      WRITE$STR !2 !3 !4 !5 !6 !7 !8 !9
  3356    #ENDIF
  3357#ENDCOMMAND
  3358
  3359#COMMAND WRITE
  3360  #IFSAME !1 CHANNEL
  3361    !A [] $10A |CI1 !2
  3362    #IF !0>2
  3363      WRITE$STR !3 !4 !5 !6 !7 !8 !9
  3364    #ENDIF
  3365  #ELSE
  3366    #IF (!0>0)
  3367      WRITE$STR !1 !2 !3 !4 !5 !6 !7 !8 !9
  3368    #ENDIF
  3369  #ENDIF
  3370#ENDCOMMAND
  3371
  3372#COMMAND WRITELN
  3373  #IFSAME !1 CHANNEL
  3374    !A [] $10A |CI1 !2
  3375    #IF !0>2
  3376      WRITE$STR !3 !4 !5 !6 !7 !8 !9
  3377    #ENDIF
  3378  #ELSE
  3379    #IF (!0>0)
  3380      WRITE$STR !1 !2 !3 !4 !5 !6 !7 !8 !9
  3381    #ENDIF
  3382  #ENDIF
  3383  !A [] $107
  3384#ENDCOMMAND
  3385
  3386#COMMAND GET_CHANNEL_POSITION &#LRUG$ "TO" &#LRUG$EC .
  3387  !A [] $10B !1 !3
  3388#ENDCOMMAND
  3389
  3390
  3391
  3392// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  3393//
  3394//   Command:
  3395//     INITIALIZE_INTERFACE
  3396//
  3397//   Parameters:
  3398//     None.
  3399//
  3400//   Description:
  3401//     INITIALIZE_INTERFACE initializes the object resource information.
  3402//     It should be executed before any other object related operations
  3403//     are performed.
  3404//
  3405// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  3406
  3407#COMMAND INITIALIZE_INTERFACE .&
  3408  // B$ obj_flag        bit 0 = in_object, bit 1 = in_class, bit 2 = in proc/func
  3409  // X.AGG agg_count(class)     defined count of objects in class
  3410
  3411  // ZA$ procedure/function label for procedures and functions
  3412  // ZB$ current_dep        the current dependant number to assign
  3413  // ZC$ current_message    the current flex message number
  3414  // ZD$ group_size         size of the current item group
  3415  // ZE$ group_id           unique id of current item group
  3416  // ZF$ super_class_count  count of objects in superclass
  3417  // ZG$ temp               temp counter (items, functions etc)
  3418  // ZH$ access_method      the current access method identifyer
  3419  // ZI$ sub_obj_count      the sub object counter
  3420  // ZJ$ current_object     the current_object number
  3421
  3422//  #SET ZC$ $400             // begin up high, past predefinded
  3423  #SET ZC$ $1000            // now reserving 4K for predefined msgs
  3424
  3425//  #SET ZH$ $4001          // begin access methods here
  3426  #SET ZH$ $40000001        // now using 32-bit msg ids; allows for 256M objs
  3427
  3428  #SET ZJ$ 2                // desktop and clipboard are first
  3429
  3430  #REPLACE IS$NEW$FMAC |CI1 // indicates that this is the new fmac
  3431//  #REPLACE IS$WINDOWS |CI1  // comment this to create character mode version
  3432
  3433  #REPLACE MANGLE_NAMES              |CI1   // Adds name mangling.
  3434  #REPLACE EXTENDED_DATA_TYPES       |CI1   // Adds extended data types.
  3435  #IFNDEF SUPPORT$ADDRESS
  3436    #IFDEF EXTENDED_DATA_TYPES
  3437      #REPLACE SUPPORT$ADDRESS           |CI1
  3438    #ENDIF
  3439  #ENDIF
  3440  //#REPLACE WINBASE_CONSOLIDATION     |CI1   // Moves messages into dfmsg.pkg
  3441
  3442
  3443// Informational output to screen/printer/file.
  3444// This information is essential to know whether things are right at compile time.
  3445
  3446  #IFDEF IS$WINDOWS
  3447    #REM FMAC FOR VISUAL DATAFLEX AND WEB APP STUDIO.
  3448  #ELSE
  3449    #REM FMAC FOR DATAFLEX CHARACTER MODE.
  3450  #ENDIF
  3451
  3452  #IFDEF MANGLE_NAMES
  3453    #REM NAME MANGLING ENABLED!
  3454  #ENDIF
  3455
  3456  #IFDEF EXTENDED_DATA_TYPES
  3457    #REM EXTENDED DATA TYPES ENABLED!
  3458  #ENDIF
  3459
  3460  // Current FMAC Version, Revision and Build
  3461  #REPLACE FMAC_VERSION  |CI16
  3462  #REPLACE FMAC_REVISION |CI1
  3463  #REPLACE FMAC_BUILD    |CI81
  3464
  3465
  3466#IFDEF IS$WINDOWS
  3467
  3468  // Define object class types.
  3469  #REPLACE U_cObject            |CI1    // Basic object support.
  3470  #REPLACE U_cUIObject          |CI2    // UI Object
  3471
  3472  // removed in 8.3 --- might have #replaces defined in dfbase.pkg
  3473  //#REPLACE U_DESKTOP            |CI1    // a desktop class object - obsolete
  3474  //#REPLACE U_BaseClass          |CI1    // a desktop class object - obsolete
  3475  //#REPLACE U_MESSAGE            |CI2    // a message class object -obsolete
  3476
  3477  #REPLACE U_cm_MENU            |CI3    // a menu class object
  3478  #REPLACE U_cm_EDIT            |CI4    // a edit class object
  3479  #REPLACE U_SCROLLB            |CI5    // a scroll bar class object
  3480  #REPLACE U_cm_LIST            |CI6    // a list class object
  3481  #REPLACE U_cm_BUTTON          |CI7    // a button class object
  3482  #REPLACE U_cm_CHECKBOX        |CI8    // a check box class object
  3483  #REPLACE U_cm_CHECKLIST       |CI9    // a check box class object
  3484  #REPLACE U_cm_FORM            |CI10   // a form class object
  3485  #REPLACE U_cm_FORMLIST        |CI11   // a form class object
  3486  #REPLACE U_CLIENT             |CI12   // a client area class object
  3487  #REPLACE U_cm_TITLE           |CI13   // a title bar class object
  3488  #REPLACE U_cm_ACTION_BAR      |CI14   // a action bar class object
  3489  #REPLACE U_cm_WARNING_MSG     |CI15   // a warning message class object
  3490  #REPLACE U_cm_CRIT_MSG        |CI16   // a critical error class object
  3491  #REPLACE U_cm_ERROR           |CI17   // a standard error class object
  3492  #REPLACE U_cm_HELP            |CI18   // a help class object
  3493  #REPLACE U_ARRAY              |CI19   // a array class of mixed scalars
  3494  #REPLACE U_TRACE              |CI20   // a trace class object
  3495  #REPLACE U_cm_ENTRY           |CI21   // a data entry class object
  3496  #REPLACE U_cm_ENTRYLIST       |CI22   // a data entry class object
  3497  #REPLACE U_cm_DIALOG          |CI23   // a DIALOG area class object
  3498  #REPLACE U_cm_RADIO           |CI24   // a radio button area
  3499  #REPLACE U_cm_RADIOLIST       |CI25   // a radio list  area
  3500  #REPLACE U_cm_VCONSOLE        |CI26   // a virtual console area
  3501  #REPLACE U_CLIPBOARD          |CI27   // the clipboard handler
  3502
  3503  #REPLACE U_DFBaseObject                 |CI28
  3504  #REPLACE U_DFBaseWindow                 |CI29
  3505  #REPLACE U_DFBaseUIWindow               |CI30
  3506  #REPLACE U_DFBaseContainer              |CI31
  3507  #REPLACE U_DFBaseDialog                 |CI32
  3508  #REPLACE U_DFBasePanel                  |CI33
  3509  #REPLACE U_cDesktop                     |CI34  // prior to 8.3 this was dfBaseDesktop
  3510  #REPLACE U_DFBaseControl                |CI35
  3511  #REPLACE U_DFBaseMenu                   |CI36
  3512  #REPLACE U_DFBaseButton                 |CI37
  3513  #REPLACE U_DFBasePushButton             |CI38
  3514  //#REPLACE U_DFComboButton                |CI39  // no longer exists
  3515  #REPLACE U_DFBaseCheckBox               |CI40
  3516  #REPLACE U_DFBaseRadioButton            |CI41
  3517  #REPLACE U_DFBaseTriState               |CI42    // not supported at highlevel
  3518  #REPLACE U_DFBaseForm                   |CI43
  3519  #REPLACE U_DFBaseEntry                  |CI44
  3520  //#REPLACE U_DFComboForm                  |CI45  // no longer exists
  3521  #REPLACE U_DFBaseList                   |CI46
  3522  #REPLACE U_DFBaseFormList               |CI47
  3523  #REPLACE U_DFBaseCheckList              |CI48    // not used
  3524  #REPLACE U_DFBaseRadioList              |CI49    // not used
  3525  #REPLACE U_DFBaseEntryList              |CI50    // not used
  3526  #REPLACE U_DFBaseComboBox               |CI51
  3527  #REPLACE U_DFBaseTriStateList           |CI52
  3528  #REPLACE U_DFBasePushButtonList         |CI53
  3529  #REPLACE U_DFBaseActionBar              |CI54
  3530  #REPLACE U_DFBasePullDown               |CI55
  3531  #REPLACE U_DFBaseSysMenu                |CI56
  3532  #REPLACE U_DFBaseGroup                  |CI57
  3533  #REPLACE U_DFBaseScrollBar              |CI58
  3534  #REPLACE U_DFBaseHorzScrollBar          |CI59
  3535  #REPLACE U_DFRubberBand                 |CI60   // no longer exists
  3536  #REPLACE U_DFBaseTextBox                |CI61
  3537  #REPLACE U_DFBaseEdit                   |CI62
  3538  #REPLACE U_DFBaseSession                |CI63
  3539  #REPLACE U_DFBaseDllSession             |CI64
  3540  #REPLACE U_DFBaseSerial                 |CI65
  3541  #REPLACE U_DFBaseLineForm               |CI66
  3542  //#REPLACE U_DFVconsole                   |CI67  // no longer exists
  3543  #REPLACE U_DFBaseToolPanel              |CI68
  3544  #REPLACE U_DFBaseMapiSession            |CI69
  3545  #REPLACE U_DFBaseImageList              |CI70
  3546  #REPLACE U_DFBaseTabDialog              |CI71
  3547  #REPLACE U_DFBaseToolBar                |CI72 // was dfbuttonbar
  3548  #REPLACE U_DFBaseComboBoxEntry          |CI73
  3549  #REPLACE U_DFBaseMdiClient              |CI74
  3550  #REPLACE U_DFBaseListBox                |CI75
  3551  #REPLACE U_DFBaseEditPulldown           |CI76
  3552  #REPLACE U_DFBaseLineControl            |CI77
  3553
  3554  // inet classes
  3555  #REPLACE U_INETTRANSFER                 |CI78
  3556  #REPLACE U_CFTPTRANSFER                 |CI79
  3557  #REPLACE U_CBASEHTTPTRANSFER            |CI80
  3558
  3559
  3560  // XML Classes
  3561  #REPLACE U_BaseXMLDOMNODE               |CI81
  3562  #REPLACE U_BaseXMLDOMNODELIST           |CI82
  3563  #REPLACE U_BaseXMLDOMNAMEDNODEMAP       |CI83
  3564  #REPLACE U_BaseXMLDOMPARSEERROR         |CI84
  3565  #REPLACE U_BaseXMLDOMIMPLEMENTATION     |CI85
  3566  #REPLACE U_BaseXMLDOMDOCUMENTFRAGMENT   |CI86
  3567  #REPLACE U_BaseXMLDOMDOCUMENT           |CI87
  3568  #REPLACE U_BaseXMLDOMCHARACTERDATA      |CI88
  3569  #REPLACE U_BaseXMLDOMTEXTNODE           |CI89
  3570  #REPLACE U_BaseXMLDOMCDATASECTION       |CI90
  3571  #REPLACE U_BaseXMLDOMCOMMENT            |CI91
  3572  #REPLACE U_BaseXMLDOMATTRIBUTE          |CI92
  3573  #REPLACE U_BaseXMLDOMELEMENT            |CI93
  3574  #REPLACE U_BaseXMLDOMPROCESSINGINSTRUCTION    |CI94
  3575  #REPLACE U_BaseXMLDOMDOCUMENTTYPE       |CI95
  3576  #REPLACE U_BaseXMLDOMNOTATION           |CI96
  3577  #REPLACE U_BaseXMLDOMENTITY             |CI97
  3578  #REPLACE U_BaseXMLDOMENTITYREFERENCE    |CI98
  3579
  3580  #REPLACE U_CBASEWEBSERVICE              |CI00105
  3581
  3582  // flexcom2 runtime classes
  3583
  3584  #REPLACE U_DFCOMAUTOMATIONOBJECT        |CI107
  3585  #REPLACE U_DFCOMDOCUMENTOBJECT          |CI108
  3586  #REPLACE U_DFCOMACTIVEXCONTROL          |CI109
  3587  #REPLACE U_DFCOMDESIGNCONTROL           |CI110
  3588  #REPLACE U_DFCOMIDISPATCHDRIVER         |CI111
  3589
  3590  #REPLACE U_DFBaseRichEdit               |CI112 // added 11.0
  3591  #REPLACE U_DFBaseTextEdit               |CI113 // added 11.0
  3592
  3593  #Replace U_cIdleHandler                 |CI128  // added 12.1
  3594
  3595
  3596#ELSE
  3597
  3598  // character mode class defintions
  3599
  3600  // Define object class types.
  3601  #REPLACE U_DESKTOP            |CI1    // a desktop class object
  3602  #REPLACE U_MESSAGE            |CI2    // a message class object
  3603  #REPLACE U_MENU               |CI3    // a menu class object
  3604  #REPLACE U_EDIT               |CI4    // a edit class object
  3605  #REPLACE U_SCROLLB            |CI5    // a scroll bar class object
  3606  #REPLACE U_LIST               |CI6    // a list class object
  3607  #REPLACE U_BUTTON             |CI7    // a button class object
  3608  #REPLACE U_CHECKBOX           |CI8    // a check box class object
  3609  #REPLACE U_CHECKLIST          |CI9    // a check box class object
  3610  #REPLACE U_FORM               |CI10   // a form class object
  3611  #REPLACE U_FORMLIST           |CI11   // a form class object
  3612  #REPLACE U_CLIENT             |CI12   // a client area class object
  3613  #REPLACE U_TITLE              |CI13   // a title bar class object
  3614  #REPLACE U_ACTION_BAR         |CI14   // a action bar class object
  3615  #REPLACE U_WARNING_MSG        |CI15   // a warning message class object
  3616  #REPLACE U_CRIT_MSG           |CI16   // a critical error class object
  3617  #REPLACE U_ERROR              |CI17   // a standard error class object
  3618  #REPLACE U_HELP               |CI18   // a help class object
  3619  #REPLACE U_ARRAY              |CI19   // a array class of mixed scalars
  3620  #REPLACE U_TRACE              |CI20   // a trace class object
  3621  #REPLACE U_ENTRY              |CI21   // a data entry class object
  3622  #REPLACE U_ENTRYLIST          |CI22   // a data entry class object
  3623  #REPLACE U_DIALOG             |CI23   // a DIALOG area class object
  3624  #REPLACE U_RADIO              |CI24   // a radio button area
  3625  #REPLACE U_RADIOLIST          |CI25   // a radio list  area
  3626  #REPLACE U_VCONSOLE           |CI26   // a virtual console area
  3627  #REPLACE U_CLIPBOARD          |CI27   // the clipboard handler
  3628#ENDIF
  3629
  3630  // Base data structures
  3631  #REPLACE MESSAGE_CLASS        |CI0
  3632  #REPLACE MENU_CLASS           |CI1
  3633  #REPLACE LIST_CLASS           |CI2
  3634  #REPLACE EDIT_CLASS           |CI3
  3635  #REPLACE SCROLL_CLASS         |CI4
  3636  #REPLACE ARRAY_CLASS          |CI5
  3637
  3638
  3639  // Define physical key names
  3640  #REPLACE KEY_ALT              |VI$8200
  3641  #REPLACE KEY_SHIFT            |VI$8400
  3642  #REPLACE KEY_CTRL             |VI$8800
  3643
  3644  #REPLACE KEY_ENTER            |VI$9001
  3645  #REPLACE KEY_TAB              |VI$9002
  3646  #REPLACE KEY_BACK_SPACE       |VI$9003
  3647  #REPLACE KEY_ESCAPE           |VI$9004
  3648  #REPLACE KEY_UP_ARROW         |VI$9005
  3649  #REPLACE KEY_DOWN_ARROW       |VI$9006
  3650  #REPLACE KEY_LEFT_ARROW       |VI$9007
  3651  #REPLACE KEY_RIGHT_ARROW      |VI$9008
  3652  #REPLACE KEY_HOME             |VI$9009
  3653  #REPLACE KEY_END              |VI$900A
  3654  #REPLACE KEY_PGUP             |VI$900B
  3655  #REPLACE KEY_PGDN             |VI$900C
  3656  #REPLACE KEY_INSERT           |VI$900D
  3657  #REPLACE KEY_DELETE           |VI$900E
  3658  #REPLACE KEY_F1               |VI$9010
  3659  #REPLACE KEY_F2               |VI$9011
  3660  #REPLACE KEY_F3               |VI$9012
  3661  #REPLACE KEY_F4               |VI$9013
  3662  #REPLACE KEY_F5               |VI$9014
  3663  #REPLACE KEY_F6               |VI$9015
  3664  #REPLACE KEY_F7               |VI$9016
  3665  #REPLACE KEY_F8               |VI$9017
  3666  #REPLACE KEY_F9               |VI$9018
  3667  #REPLACE KEY_F10              |VI$9019
  3668  #REPLACE KEY_F11              |VI$901A
  3669  #REPLACE KEY_F12              |VI$901B
  3670  #REPLACE KEY_A                |VI$8041
  3671  #REPLACE KEY_B                |VI$8042
  3672  #REPLACE KEY_C                |VI$8043
  3673  #REPLACE KEY_D                |VI$8044
  3674  #REPLACE KEY_E                |VI$8045
  3675  #REPLACE KEY_F                |VI$8046
  3676  #REPLACE KEY_G                |VI$8047
  3677  #REPLACE KEY_H                |VI$8048
  3678  #REPLACE KEY_I                |VI$8049
  3679  #REPLACE KEY_J                |VI$804A
  3680  #REPLACE KEY_K                |VI$804B
  3681  #REPLACE KEY_L                |VI$804C
  3682  #REPLACE KEY_M                |VI$804D
  3683  #REPLACE KEY_N                |VI$804E
  3684  #REPLACE KEY_O                |VI$804F
  3685  #REPLACE KEY_P                |VI$8050
  3686  #REPLACE KEY_Q                |VI$8051
  3687  #REPLACE KEY_R                |VI$8052
  3688  #REPLACE KEY_S                |VI$8053
  3689  #REPLACE KEY_T                |VI$8054
  3690  #REPLACE KEY_U                |VI$8055
  3691  #REPLACE KEY_V                |VI$8056
  3692  #REPLACE KEY_W                |VI$8057
  3693  #REPLACE KEY_X                |VI$8058
  3694  #REPLACE KEY_Y                |VI$8059
  3695  #REPLACE KEY_Z                |VI$805A
  3696  #REPLACE KEY_SPACE            |VI$8020
  3697  #REPLACE KSPACE               |VI$8020
  3698  #REPLACE KEY_0                |VI$8030
  3699  #REPLACE KEY_1                |VI$8031
  3700  #REPLACE KEY_2                |VI$8032
  3701  #REPLACE KEY_3                |VI$8033
  3702  #REPLACE KEY_4                |VI$8034
  3703  #REPLACE KEY_5                |VI$8035
  3704  #REPLACE KEY_6                |VI$8036
  3705  #REPLACE KEY_7                |VI$8037
  3706  #REPLACE KEY_8                |VI$8038
  3707  #REPLACE KEY_9                |VI$8039
  3708  #REPLACE KEY_PLUS             |VI$802B
  3709  #REPLACE KEY_MINUS            |VI$802D
  3710  #REPLACE KEY_EQUAL            |VI$803D
  3711  #REPLACE KEY_BACK_SLASH       |VI$805C
  3712  #REPLACE KEY_SLASH            |VI$802F
  3713
  3714  // Define Accelerator key names.
  3715  #REPLACE KHELP                |CI274
  3716  #REPLACE KSAVE_RECORD         |CI265
  3717  #REPLACE KDELETE_RECORD       |CI266
  3718  #REPLACE KEXIT_FUNCTION       |CI281
  3719  #REPLACE KEXIT_APPLICATION    |CI282
  3720  #REPLACE KPROMPT              |CI283
  3721  #REPLACE KPRINT_SCREEN        |CI258
  3722  #REPLACE KCLEAR               |CI269
  3723  #REPLACE KREFRESH_SCREEN      |CI284
  3724  #REPLACE KSWITCH              |CI285
  3725  #REPLACE KSWITCH_BACK         |CI286
  3726  #REPLACE KFIND                |CI263
  3727  #REPLACE KFIND_PREVIOUS       |CI270
  3728  #REPLACE KFIND_NEXT           |CI271
  3729  #REPLACE KSUPER_FIND          |CI264
  3730  #REPLACE KSUPER_FIND_PREVIOUS |CI287
  3731  #REPLACE KSUPER_FIND_NEXT     |CI288
  3732  #REPLACE KACTION_BAR          |CI289
  3733  #REPLACE KENTER               |CI257
  3734  #REPLACE KUPARROW             |CI272
  3735  #REPLACE KDOWNARROW           |CI273
  3736  #REPLACE KLEFTARROW           |CI260
  3737  #REPLACE KRIGHTARROW          |CI261
  3738  #REPLACE KSCROLL_BACK         |CI290
  3739  #REPLACE KSCROLL_FORWARD      |CI291
  3740  #REPLACE KSCROLL_LEFT         |CI292
  3741  #REPLACE KSCROLL_RIGHT        |CI293
  3742  #REPLACE KBEGIN_OF_LINE       |CI294
  3743  #REPLACE KEND_OF_LINE         |CI295
  3744  #REPLACE KNEXT_ITEM           |CI296
  3745  #REPLACE KPREVIOUS_ITEM       |CI262
  3746  #REPLACE KDELETE_CHARACTER    |CI277
  3747  #REPLACE KERASE_END_OF_LINE   |CI297
  3748  #REPLACE KBACK_SPACE          |CI278
  3749  #REPLACE KCANCEL              |CI259
  3750  #REPLACE KBEGIN_OF_PANEL      |CI298
  3751  #REPLACE KEND_OF_PANEL        |CI299
  3752  #REPLACE KBEGIN_OF_DATA       |CI300
  3753  #REPLACE KEND_OF_DATA         |CI301
  3754  #REPLACE KWORD_LEFT           |CI302
  3755  #REPLACE KWORD_RIGHT          |CI303
  3756  #REPLACE KINSERT              |CI276
  3757  #REPLACE KCLEAR_AND_RETURN    |CI279
  3758  #REPLACE KADD_MODE            |CI304
  3759  #REPLACE KPASTE               |CI305
  3760  #REPLACE KCOPY                |CI306
  3761  #REPLACE KCUT                 |CI307
  3762  #REPLACE KCLEAR_ALL           |CI308
  3763  #REPLACE KMOUSE               |CI309
  3764  #REPLACE KMARK                |CI310
  3765  #REPLACE KZOOM                |CI311
  3766  #REPLACE KCLOSE_PANEL         |CI312
  3767
  3768  //OLD KEY DEFINITIONS
  3769  #REPLACE KCALCULATE           |CI267
  3770  #REPLACE KUSER                |CI268
  3771  #REPLACE KUSER2               |CI275
  3772  #REPLACE KCLEOW               |CI280
  3773
  3774
  3775  //#FREG |CI$01CE STRING PERCENTAGE RETURNS INTEGER
  3776
  3777  #REPLACE DFLT$VALUE               __X__
  3778  #REPLACE DFLT$MESSAGE             __X__
  3779  #REPLACE DFLT$AUX_VALUE           __X__
  3780  #REPLACE DFLT$SHADOW_STATE        __X__
  3781  #REPLACE DFLT$SELECT_STATE        __X__
  3782  #REPLACE DFLT$CHECKBOX_ITEM_STATE __X__
  3783  #REPLACE DFLT$AUTOCLEAR_STATE     __X__
  3784  #REPLACE DFLT$CENTER_STATE        __X__
  3785  #REPLACE DFLT$ENTRY_STATE         __X__
  3786  #REPLACE DFLT$ITEM_CHANGED_STATE  __X__
  3787  #REPLACE DFLT$ITEM_ENTRY_MSG      __X__
  3788  #REPLACE DFLT$ITEM_EXIT_MSG       __X__
  3789  #REPLACE DFLT$ITEM_VALIDATE_MSG   __X__
  3790  #REPLACE DFLT$DATA_FILE           __X__
  3791  #REPLACE DFLT$DATA_FIELD          __X__
  3792  #REPLACE DFLT$DATA_WINDOW         __X__
  3793  #REPLACE DFLT$ITEM_OPTIONS        __X__
  3794  #REPLACE DFLT$ITEM_OPTION         __X__
  3795  #REPLACE DFLT$PROMPT_OBJECT       __X__
  3796  #REPLACE DFLT$ZOOM_OBJECT         __X__
  3797
  3798#IFDEF IS$WINDOWS
  3799
  3800  // Define all Form properties that require an index (item). If the item parameter
  3801  // is omitted item 0 is used as a default. This allows single item objects (e.g. Form)
  3802  // to omit the item number. (e.g. Set Password_State to True).
  3803
  3804  #REPLACE DFLT$FORM_WIDTH                 __F__
  3805  #REPLACE DFLT$FORM_COLOR                 __F__
  3806  #REPLACE DFLT$FORM_DATATYPE              __F__
  3807  #REPLACE DFLT$FORM_OPTIONS               __F__
  3808  #REPLACE DFLT$FORM_FONT                  __F__
  3809  #REPLACE DFLT$FORM_ROW                   __F__
  3810  #REPLACE DFLT$FORM_COLUMN                __F__
  3811  #REPLACE DFLT$FORM_TYPEFACE              __F__
  3812  #REPLACE DFLT$FORM_FONTHEIGHT            __F__
  3813  #REPLACE DFLT$FORM_FONTWEIGHT            __F__
  3814  #REPLACE DFLT$FORM_FONTITALICS           __F__
  3815  #REPLACE DFLT$FORM_FONTUNDERLINE         __F__
  3816  #REPLACE DFLT$BUTTON_ASPECT              __F__
  3817  #REPLACE DFLT$FORM_HEIGHT                __F__
  3818  #REPLACE DFLT$FORM_GUIWIDTH              __F__
  3819  #REPLACE DFLT$FORM_GUIHEIGHT             __F__
  3820  #REPLACE DFLT$FORM_GUIROW                __F__
  3821  #REPLACE DFLT$FORM_GUICOLUMN             __F__
  3822  #REPLACE DFLT$FORM_MARGIN                __F__
  3823  #REPLACE DFLT$FORM_OPTION                __F__
  3824  #REPLACE DFLT$FORM_STYLE                 __F__
  3825  #REPLACE DFLT$FORM_EXTENDED_STYLE        __F__
  3826  #REPLACE DFLT$FORM_BORDER                __F__
  3827  #REPLACE DFLT$PASSWORD_STATE             __F__
  3828  #REPLACE DFLT$FORM_MASK                  __F__
  3829  #REPLACE DFLT$FORM_BUTTON                __F__
  3830  #REPLACE DFLT$FORM_BUTTON_VALUE          __F__
  3831  #REPLACE DFLT$FORM_WINDOW_HANDLE         __F__
  3832  #REPLACE DFLT$FORM_BUTTON_WINDOW_HANDLE  __F__
  3833  #REPLACE DFLT$MASKED_VALUE               __F__  // these are really form properties
  3834  #REPLACE DFLT$UNMASKED_VALUE             __F__  // so if no param use 0
  3835  #REPLACE DFLT$FORM_JUSTIFICATION_MODE    __F__
  3836
  3837  // These are index (item or form) tem based properties that require two
  3838  // parameters in the set statement following the "to". Please do not
  3839  // create any more of these kinds of messages
  3840  #REPLACE DFLT$2$ITEM_OPTION              __2__
  3841  #REPLACE DFLT$2$FORM_COLOR               __2__
  3842  #REPLACE DFLT$2$FORM_STYLE               __2__
  3843  #REPLACE DFLT$2$FORM_EXTENDED_STYLE      __2__
  3844
  3845#ENDIF
  3846
  3847
  3848
  3849  //Reserve$Internal$Functions // this disallows these names to be used in
  3850                             // in functions, properties or cts.
  3851  #REPLACE FN$Abs                          __F__
  3852  #REPLACE FN$Acos                         __F__
  3853  #REPLACE FN$Append                       __F__
  3854  #REPLACE FN$Ascii                        __F__
  3855  #REPLACE FN$Asin                         __F__
  3856  #REPLACE FN$Atan                         __F__
  3857  #REPLACE FN$Center                       __F__
  3858  #REPLACE FN$Character                    __F__
  3859  #REPLACE FN$Cos                          __F__
  3860  #REPLACE FN$Date                         __F__
  3861  #REPLACE FN$Eval                         __F__
  3862  #REPLACE FN$Exp                          __F__
  3863  #REPLACE FN$Hi                           __F__
  3864  #REPLACE FN$If                           __F__
  3865  #REPLACE FN$Insert                       __F__
  3866  #REPLACE FN$Integer                      __F__
  3867  #REPLACE FN$Left                         __F__
  3868  #REPLACE FN$Length                       __F__
  3869  #REPLACE FN$Log                          __F__
  3870  #REPLACE FN$Low                          __F__
  3871  #REPLACE FN$Lowercase                    __F__
  3872  #REPLACE FN$Ltrim                        __F__
  3873  #REPLACE FN$Mid                          __F__
  3874  #REPLACE FN$Mod                          __F__
  3875  #REPLACE FN$Not                          __F__
  3876  #REPLACE FN$Number                       __F__
  3877  #REPLACE FN$Overstrike                   __F__
  3878  #REPLACE FN$Pad                          __F__
  3879  #REPLACE FN$Pos                          __F__
  3880  #REPLACE FN$Random                       __F__
  3881  #REPLACE FN$Real                         __F__
  3882  #REPLACE FN$Remove                       __F__
  3883  #REPLACE FN$Repeat                       __F__
  3884  #REPLACE FN$Replace                      __F__
  3885  #REPLACE FN$Replaces                     __F__
  3886  #REPLACE FN$Right                        __F__
  3887  #REPLACE FN$Round                        __F__
  3888  #REPLACE FN$Rtrim                        __F__
  3889  #REPLACE FN$Sin                          __F__
  3890  #REPLACE FN$Sqrt                         __F__
  3891  #REPLACE FN$String                       __F__
  3892  #REPLACE FN$Tan                          __F__
  3893  #REPLACE FN$Trim                         __F__
  3894  #REPLACE FN$Uppercase                    __F__
  3895
  3896  #IFDEF EXTENDED_DATA_TYPES
  3897    #REPLACE FN$CurrentDateTime              __F__
  3898    #REPLACE FN$DateGetDay                   __F__
  3899    #REPLACE FN$DateGetDayofWeek             __F__
  3900    #REPLACE FN$DateGetDayofYear             __F__
  3901    #REPLACE FN$DateGetHour                  __F__
  3902    #REPLACE FN$DateGetMinute                __F__
  3903    #REPLACE FN$DateGetMonth                 __F__
  3904    #REPLACE FN$DateGetSecond                __F__
  3905    #REPLACE FN$DateGetYear                  __F__
  3906    #REPLACE FN$DateSetDay                   __F__
  3907    #REPLACE FN$DateSetHour                  __F__
  3908    #REPLACE FN$DateSetMinute                __F__
  3909    #REPLACE FN$DateSetMonth                 __F__
  3910    #REPLACE FN$DateSetSecond                __F__
  3911    #REPLACE FN$DateSetYear                  __F__
  3912    #REPLACE FN$IsDateValid                  __F__
  3913    #REPLACE FN$SpanDays                     __F__
  3914    #REPLACE FN$SpanHours                    __F__
  3915    #REPLACE FN$SpanMinutes                  __F__
  3916    #REPLACE FN$SpanSeconds                  __F__
  3917    #REPLACE FN$SpanTotalDays                __F__
  3918    #REPLACE FN$SpanTotalHours               __F__
  3919    #REPLACE FN$SpanTotalMinutes             __F__
  3920    #REPLACE FN$SpanTotalSeconds             __F__
  3921    #REPLACE FN$Addressof                    __F__
  3922    #REPLACE FN$Cast                         __F__
  3923    #REPLACE FN$Convert                      __F__
  3924    #REPLACE FN$InvokeXML                    __F__
  3925    //
  3926    #REPLACE FN$Storec                       __F__
  3927    #REPLACE FN$Storew                       __F__
  3928    #REPLACE FN$Storedw                      __F__
  3929    #REPLACE FN$Derefc                       __F__
  3930    #REPLACE FN$Derefw                       __F__
  3931    #REPLACE FN$Derefdw                      __F__
  3932    #REPLACE FN$MemCopy                      __F__
  3933    #REPLACE FN$MemSet                       __F__
  3934
  3935    #REPLACE FN$IsSameCOMObject              __F__
  3936    #REPLACE FN$IsNullCOMObject              __F__
  3937    #REPLACE FN$NullCOMObject                __F__
  3938
  3939
  3940    // 11.0 changes
  3941    #REPLACE FN$FindByRowId                  __F__
  3942    #REPLACE FN$GetRowId                     __F__
  3943    #REPLACE FN$NullRowId                    __F__
  3944    #REPLACE FN$IsNullRowId                  __F__
  3945    #REPLACE FN$IsSameRowId                  __F__
  3946    #REPLACE FN$SerializeRowId               __F__
  3947    #REPLACE FN$DeSerializeRowId             __F__
  3948    #REPLACE FN$SizeOfArray                  __F__
  3949    #REPLACE FN$ResizeArray                  __F__
  3950    #REPLACE FN$CStringLength                __F__
  3951    #REPLACE FN$SizeOfType                   __F__ // size of any data type including structs
  3952
  3953    // 11.1 changes
  3954    #REPLACE FN$BinarySearchArray            __F__
  3955    #REPLACE FN$CopyArray                    __F__
  3956    #REPLACE FN$CountArray                   __F__
  3957    #REPLACE FN$FillArray                    __F__
  3958    #REPLACE FN$MinArray                     __F__
  3959    #REPLACE FN$MaxArray                     __F__
  3960    #REPLACE FN$ReverseArray                 __F__
  3961    #REPLACE FN$SearchArray                  __F__
  3962    #REPLACE FN$ShuffleArray                 __F__
  3963    #REPLACE FN$SortArray                    __F__
  3964    // 15.0 changes added post 15.0
  3965    #REPLACE FN$RemoveFromArray              __F__
  3966    #REPLACE FN$InsertInArray                __F__
  3967    #REPLACE FN$RightPos                     __F__
  3968
  3969  #ENDIF // is windows
  3970
  3971    // Object commands
  3972  #REPLACE OBJ$INIT         $0440
  3973  #REPLACE OBJ$CREATE       $0441
  3974  #REPLACE OBJ$ILIST        $0442
  3975  #REPLACE OBJ$ITEM         $0443
  3976  #REPLACE OBJ$ENDILIST     $0444
  3977  #REPLACE OBJ$ACCLIST      $0445 // not used
  3978  #REPLACE OBJ$ONKEY        $0446
  3979  #REPLACE OBJ$ENDALIST     $0447 // not used
  3980  #REPLACE OBJ$ENDDEFINE    $0448 // not used
  3981  #REPLACE OBJ$IODISPATCH   $0449
  3982  #REPLACE OBJ$SET          $044A
  3983  #REPLACE OBJ$GET          $044B
  3984  #REPLACE OBJ$SEND         $044C
  3985  #REPLACE OBJ$FIX          $044D  // not used
  3986  #REPLACE OBJ$END          $044E
  3987  #REPLACE OBJ$FWDFIX       $044F  // not used
  3988  #REPLACE OBJ$HRET         $0450
  3989  #REPLACE OBJ$ITEM_EXEC    $0451
  3990  #REPLACE OBJ$ACCEPT       $0452
  3991  #REPLACE CREATE$CLASS     $0453
  3992  #REPLACE HANDLE$FOR       $0454
  3993  #REPLACE OBJ$END$HANDLER  $0455
  3994  #REPLACE LOCAL$ARGUMENT   $0456
  3995  #REPLACE FIND$OBJECT      $0457
  3996  #REPLACE END$CLASS        $0458
  3997  #REPLACE CREATE$SUB$PAGE  $0459
  3998  #REPLACE CLONE$CLASS      $045A
  3999  #REPLACE OBJ$ENTRY$ITEM   $045B
  4000  #REPLACE MOVE$SUB$PAGE    $045C
  4001  #REPLACE OBJ$TIMER        $045D
  4002  #REPLACE SCREEN$OPT       $045E
  4003  #REPLACE CREATE$PROPERTY  $045F
  4004  #REPLACE REDEFINE$SUB$PAGE $0464
  4005
  4006  //Focus modes:
  4007  #REPLACE FOCUSABLE    |CI0
  4008  #REPLACE NONFOCUSABLE |CI1
  4009  #REPLACE POINTER_ONLY |CI2
  4010  #REPLACE NO_ACTIVATE  |CI3
  4011
  4012  //Search modes:
  4013  #REPLACE FIRST_CHARACTER  |CI0
  4014  #REPLACE INCREMENTAL      |CI1
  4015  #REPLACE CAPITAL          |CI2
  4016  #REPLACE NO_SEARCH        |CI3
  4017
  4018  //Delegation modes:
  4019  #REPLACE DELEGATE_TO_PARENT       |CI0
  4020  #REPLACE NO_DELEGATE_OR_ERROR     |CI1
  4021  #REPLACE NO_DELEGATION            |CI2
  4022  #REPLACE RETURN_INVALID_MESSAGE   |CI3
  4023  #REPLACE DELEGATE_PRIOR_LEVEL     |CI4
  4024
  4025  //Location modes:
  4026  #REPLACE ABSOLUTE         |CI0
  4027  #REPLACE RELATIVE         |CI1
  4028  #REPLACE ITEM_RELATIVE    |CI2
  4029
  4030  //Sort modes:
  4031  #REPLACE ASCENDING        |CI0
  4032  #REPLACE DESCENDING       |CI1
  4033
  4034  //Select Modes:
  4035  #REPLACE NO_SELECT        |CI0
  4036  #REPLACE SINGLE_SELECT    |CI1
  4037  #REPLACE MULTI_SELECT     |CI2
  4038  #REPLACE AUTO_SELECT      |CI3
  4039
  4040  //Entry item options:
  4041  #REPLACE IWINDOW          $C0A1
  4042  #REPLACE IENTRY           $C0A2
  4043  #REPLACE IEXIT            $C0A3
  4044  #REPLACE IVALIDATE        $C0A4
  4045  #REPLACE IZOOM            $C0A5
  4046  #REPLACE IPROMPT          $C0A6
  4047
  4048  //Import modes
  4049  #REPLACE INHERIT          1
  4050  #REPLACE NO_OVERWRITE     2
  4051
  4052  //System integers
  4053  #REPLACE CURRENT_OBJECT     |VI85
  4054  #REPLACE SELF               |VI85  // as of 12.0 this is now part of fmac
  4055  #REPLACE FORWARD$MESSAGE    |VI87
  4056  #REPLACE CURRENT_MESSAGE    |VI88
  4057  #REPLACE TOTAL_OBJECTS      |VI89
  4058
  4059  // Define the desktop objects
  4060  #REPLACE NULL_OBJECT          |CI0
  4061  #REPLACE CLIPBOARD            |CI1
  4062  #REPLACE CLIPBOARD.N          |CI0
  4063  //#REPLACE DESKTOP              |CI2            // now defined in flex$init
  4064  #REPLACE DESKTOP.N            |CI0
  4065  //#REPLACE END_FUNCTION         END_PROCEDURE   // now defined in flex$init
  4066  //#REPLACE PROCEDURE_RETURN     FUNCTION_RETURN // now defined in flex$init
  4067  #REPLACE NO_IMAGE             |CI-9999
  4068
  4069  #REPLACE CURRENT              |CI-99 //use current item#
  4070  #REPLACE TOGGLE_STATE         |CI3   //toggle boolean state
  4071  #REPLACE UPWARD_DIRECTION     |CI0   //scroll up
  4072  #REPLACE DOWNWARD_DIRECTION   |CI1   //scroll down
  4073
  4074//  #REPLACE GET_SCROLLBAR        |CI$4000
  4075//  #REPLACE GET_CLIPBOARD        |CI$4001
  4076//  #FREG |CI$4000 RETURNS INTEGER
  4077//  #FREG |CI$4001 RETURNS INTEGER
  4078
  4079// bumped up for 32-bit msg ids
  4080  #REPLACE GET_SCROLLBAR        |CI$40000000
  4081  #REPLACE GET_CLIPBOARD        |CI$40000001
  4082  #FREG |CI$40000000 RETURNS INTEGER
  4083  #FREG |CI$40000001 RETURNS INTEGER
  4084
  4085  #REPLACE ERROR_OBJECT_ID      |VI100
  4086  #REPLACE ERROR_TYPE           |VI101
  4087
  4088  #REPLACE ERROR_CHILD_INHERITS_PARENT  |CI0
  4089  #REPLACE ERROR_OFF_IN_CHILD           |CI1
  4090  #REPLACE ERROR_DEFAULT_IN_CHILD       |CI2
  4091
  4092  //deactivate search modes
  4093  #REPLACE SCOPE_TYPE                   |CI1
  4094  #REPLACE POPUP_TYPE                   |CI2
  4095  #REPLACE AREA_TYPE                    |CI3
  4096
  4097  //add_focus/activate/deactivate/release_focus error return codes
  4098  #REPLACE ERROR_ENTERING               |CI1
  4099  #REPLACE ERROR_EXITING                |CI2
  4100  #REPLACE ERROR_ACTIVATING             |CI3
  4101  #REPLACE ERROR_DEACTIVATING           |CI4
  4102  #REPLACE ERROR_CANT_ACCEPT_FOCUS      |CI5
  4103  #REPLACE ERROR_CANT_CREATE_TREE       |CI6
  4104  #REPLACE ERROR_ADD_TO_INACTIVE_OBJECT |CI7
  4105  #REPLACE ERROR_NO_FOCUSABLE_CHILDREN  |CI8
  4106
  4107  // modes for peInNeighborHood
  4108  #REPLACE nhNo         |CI0   // not a neighbor, check to see if parent is neighbor
  4109  #REPLACE nhPublic     |CI1   // Is a neighbor hood, All descendant objects may address each other
  4110  #REPLACE nhPrivate    |CI2   // Is a private neighborhood. descendants can not addres each other
  4111
  4112  // alias data-types. These used to be in dll.pkg but are best defined here.
  4113  #REPLACE Pointer Integer     // Parameter is a POINTER
  4114  #REPLACE DWord Integer       // Parameter is a DWORD (32 bits)
  4115  #REPLACE Handle DWord        // Parameter is a HANDLE (32 bits)
  4116  #REPLACE Void_Type Integer   // Return type is  VOID
  4117
  4118  // The following set of replacements define the type of load for the
  4119  // DLL.  Each load type has the standard set of trade offs, speed
  4120  // vs memory.  A lib that is loaded each time is probable the most memory
  4121  // efficient, but suffers from load speed overhead.  However, large DLLs
  4122  // that are retained in memory are not using system resources as
  4123  // efficientry as possible.  Note that some DLLs are already in memory.
  4124  // The Windows Kernel and USER libs are already loaded by Windows, and
  4125  // do not take up more memory.
  4126  // These are used by command SET_DEFAULT_CALLTYPE (which is actually rarely if ever used)
  4127
  4128  #REPLACE LOAD_ON_EACH_USE |CI0     // Load and free on each call (slow)
  4129  #REPLACE LOAD_LIBRARY     |CI1     // Load Lib on definition
  4130  #REPLACE DELETE_ENTRY     |CI2     // Delete lib entry in reg DataBase
  4131  #REPLACE FREE_LIBRARY     |CI4     // Free lib in Reg DataBase
  4132  #REPLACE LOAD_ON_USE      |CI8     // Load lib on first use (call)
  4133
  4134
  4135
  4136
  4137  #CHKSUB 1 1                   // Verify the UI subsystem.
  4138  !A [] OBJ$INIT |CI0           // INITIALIZE_INTERFACE
  4139  #FREF OBJ$DESK$NUM !a         // Number of desktop dependants
  4140#ENDCOMMAND
  4141
  4142// define all messages used by object system.  This is new to VDF7. All messages
  4143// are now defined here.
  4144
  4145// define all runtime messages common to VDF and CM DF
  4146
  4147// Note: make sure number of lines in command is less than 1024
  4148
  4149#COMMAND Define$BuiltIn$DF$Messages
  4150  CMSG I GET_ACTIVE_STATE                  |CI$001
  4151  CMSG I GET_PARENT                        |CI$002
  4152  CMSG V SET_PARENT                        |CI$003     I
  4153  CMSG I MSG_PAGE_OBJECT                   |CI$004     I
  4154  CMSG I GET_LOCATION                      |CI$005
  4155  CMSG V SET_LOCATION                      |CI$006     I  I
  4156  CMSG I GET_ENTRY_MSG                     |CI$007
  4157  CMSG V SET_ENTRY_MSG                     |CI$008     I
  4158  CMSG I GET_EXIT_MSG                      |CI$009
  4159  CMSG V SET_EXIT_MSG                      |CI$00A     I
  4160  CMSG V SET_SIZE                          |CI$00B     I  I
  4161  CMSG I GET_SIZE                          |CI$00C
  4162  CMSG I GET_CURRENT_ITEM                  |CI$00D
  4163  CMSG V SET_CURRENT_ITEM                  |CI$00E     I
  4164  CMSG I GET_TOP_ITEM                      |CI$00F
  4165  CMSG V SET_TOP_ITEM                      |CI$010     I
  4166  CMSG S GET_VALUE                         |CI$011     I
  4167  CMSG V SET_VALUE                         |CI$012     I  S
  4168  CMSG I GET_MESSAGE                       |CI$013     I
  4169  CMSG V SET_MESSAGE                       |CI$014     I  I
  4170  CMSG I GET_ITEM_COUNT                    |CI$015
  4171  CMSG V SET_ITEM_COUNT                    |CI$016     I
  4172  CMSG I GET_SELECT_COUNT                  |CI$017
  4173  CMSG V SET_SELECT_COUNT                  |CI$018     I
  4174  CMSG I GET_MULTI_SELECT_MSG              |CI$019
  4175  CMSG V SET_MULTI_SELECT_MSG              |CI$01A     I
  4176  CMSG V SET_FOCUS_MODE                    |CI$01B     I
  4177  CMSG I GET_FOCUS_MODE                    |CI$01C
  4178  CMSG V SET_VISIBLE_STATE                 |CI$01D     I
  4179  CMSG I GET_VISIBLE_STATE                 |CI$01E
  4180  CMSG V SET_SELECT_MODE                   |CI$01F     I
  4181  CMSG I GET_SELECT_MODE                   |CI$020
  4182  CMSG V SET_WRAP_STATE                    |CI$021     I
  4183  CMSG I GET_WRAP_STATE                    |CI$022
  4184  CMSG V SET_SHADOW_STATE                  |CI$023     I  I
  4185  CMSG I GET_SHADOW_STATE                  |CI$024     I
  4186  CMSG I GET_SELECT_STATE                  |CI$025     I
  4187  CMSG V SET_SELECT_STATE                  |CI$026     I  I
  4188  CMSG V SET_AUTOCLEAR_STATE               |CI$027     I  I
  4189  CMSG I GET_AUTOCLEAR_STATE               |CI$028     I
  4190  CMSG V SET_CENTER_STATE                  |CI$029     I  I
  4191  CMSG I GET_CENTER_STATE                  |CI$02A     I
  4192  CMSG V SET_CHECKBOX_ITEM_STATE           |CI$02B     I  I
  4193  CMSG I GET_CHECKBOX_ITEM_STATE           |CI$02C     I
  4194  CMSG I MSG_STOP_UI                       |CI$02D
  4195  CMSG S MSG_ERROR                         |CI$02E     I
  4196  CMSG V MSG_HELP                          |CI$02F
  4197  CMSG V MSG_BELL                          |CI$030
  4198  CMSG V MSG_PAINT                         |CI$031
  4199  CMSG V MSG_NONE                          |CI$032
  4200  CMSG V MSG_EXIT                          |CI$033
  4201  CMSG V MSG_NEXT                          |CI$034
  4202  CMSG V MSG_PULL_RIGHT                    |CI$035
  4203  CMSG V MSG_PULL_LEFT                     |CI$036
  4204  CMSG I MSG_KEY                           |CI$037     I
  4205  CMSG I MSG_INSERT_ITEM                   |CI$038     I  S
  4206  CMSG I MSG_ADD_ITEM                      |CI$039     I  S
  4207  CMSG V MSG_DELETE_ITEM                   |CI$03A     I
  4208  CMSG V MSG_DELETE_DATA                   |CI$03B
  4209  CMSG V MSG_SORT_ITEMS                    |CI$03C     I
  4210  CMSG I GET_ITEM_MATCHING                 |CI$03D     S
  4211  CMSG I GET_AUX_VALUE                     |CI$03E     I
  4212  CMSG V SET_AUX_VALUE                     |CI$03F     I  I
  4213  CMSG I GET_SEARCH_MODE                   |CI$040
  4214  CMSG V SET_SEARCH_MODE                   |CI$041     I
  4215  CMSG I GET_INVERSE_STATE                 |CI$042
  4216  CMSG V SET_INVERSE_STATE                 |CI$043     I
  4217  CMSG V MSG_SCROLL                        |CI$044     I  I
  4218  CMSG V SET_CLASS_COLORS                  |CI$045     I  I  I
  4219  CMSG I GET_HORIZONTAL_INCREMENT          |CI$046
  4220  CMSG V SET_HORIZONTAL_INCREMENT          |CI$047     I
  4221  CMSG V MSG_UP                            |CI$048
  4222  CMSG V MSG_DOWN                          |CI$049
  4223  CMSG V MSG_RIGHT                         |CI$04A
  4224  CMSG V MSG_LEFT                          |CI$04B
  4225  CMSG V MSG_BEGINNING_OF_DATA             |CI$04C
  4226  CMSG V MSG_END_OF_DATA                   |CI$04D
  4227  CMSG V MSG_BEGINNING_OF_PANEL            |CI$04E
  4228  CMSG V MSG_END_OF_PANEL                  |CI$04F
  4229  CMSG V MSG_BEGINNING_OF_LINE             |CI$050
  4230  CMSG V MSG_END_OF_LINE                   |CI$051
  4231  CMSG V MSG_PAGE_UP                       |CI$052
  4232  CMSG V MSG_PAGE_DOWN                     |CI$053
  4233  CMSG V SET_INSERT_MODE                   |CI$054     I
  4234  CMSG V MSG_GOTO_LINE                     |CI$055     I
  4235  CMSG V MSG_MOVE_ABSOLUTE                 |CI$056     I  I
  4236  CMSG V MSG_MOVE_RELATIVE                 |CI$057     I  I
  4237  CMSG V MSG_MARK_ON                       |CI$058
  4238  CMSG V MSG_PASTE                         |CI$059     I  I  I
  4239  CMSG V MSG_CUT                           |CI$05A     I  I  I
  4240  CMSG V MSG_COPY                          |CI$05B     I  I  I
  4241  CMSG V MSG_INSERT                        |CI$05C     S
  4242  CMSG V MSG_DELETE_CHAR                   |CI$05D
  4243  CMSG V MSG_DELETE_LINE                   |CI$05E
  4244  CMSG V MSG_DELETE_TO_EOL                 |CI$05F
  4245  CMSG I MSG_FIND                          |CI$060     S
  4246  CMSG I MSG_REPLACE                       |CI$061     S  S
  4247  CMSG V MSG_PRINT                         |CI$062
  4248  CMSG I GET_MARK                          |CI$063
  4249  CMSG I GET_CHANGED_STATE                 |CI$064
  4250  CMSG V SET_CHANGED_STATE                 |CI$065     I
  4251  CMSG V SET_RIGHT_MARGIN                  |CI$066     I
  4252  CMSG I GET_LINE_COUNT                    |CI$067
  4253  CMSG V SET_STATUS_LINE_STATE             |CI$068     I
  4254  CMSG V SET_BLOCK_MOUSE_STATE             |CI$069     I
  4255  CMSG I GET_BLOCK_MOUSE_STATE             |CI$06A
  4256  CMSG V SET_COLUMN_MODE                   |CI$06B     I
  4257  CMSG I GET_COLUMN_MODE                   |CI$06C
  4258  CMSG V SET_FILE_NAME                     |CI$06D     S
  4259  CMSG S GET_FILE_NAME                     |CI$06E
  4260  CMSG V MSG_DEFAULT_KEY                   |CI$06F
  4261  CMSG V SET_DYNAMIC_UPDATE_STATE          |CI$070     I
  4262  CMSG I GET_FOCUS                         |CI$071
  4263  CMSG V MSG_REFRESH_SCREEN                |CI$072     I
  4264  CMSG V MSG_PREVIOUS                      |CI$073
  4265  CMSG V SET_CHECK_STRING                  |CI$074     S  S
  4266  CMSG I MSG_ACTIVATE                      |CI$075    V
  4267  CMSG I MSG_ACTIVATE_GROUP                |CI$076
  4268  CMSG I GET_MSG_DEACTIVATE                |CI$077     I        // <<< Awful hack!
  4269  CMSG I MSG_DEACTIVATE                    |CI$077     I        // <<< Awful hack!
  4270  CMSG I MSG_DEACTIVATE_GROUP              |CI$078
  4271  CMSG V SET_LOCAL_ROTATE_STATE            |CI$079     I
  4272  CMSG I GET_LOCAL_ROTATE_STATE            |CI$07A
  4273  CMSG V SET_CLIENT_AREA_STATE             |CI$07B     I
  4274  CMSG I GET_CLIENT_AREA_STATE             |CI$07C
  4275  CMSG I GET_READ_ONLY_STATE               |CI$07D
  4276  CMSG V SET_READ_ONLY_STATE               |CI$07E     I
  4277  CMSG V SET_LINE_WIDTH                    |CI$07F     I  I
  4278  CMSG I GET_LINE_SIZE                     |CI$080
  4279  CMSG I GET_DISPLAY_SIZE                  |CI$081
  4280  CMSG V SET_SCROLL_BAR_VISIBLE_STATE      |CI$082     I
  4281  CMSG V SET_ORIGIN                        |CI$083     I  I
  4282  CMSG I GET_ORIGIN                        |CI$084
  4283  CMSG I GET_POSITION                      |CI$085
  4284  CMSG I MSG_TRUE                          |CI$086
  4285  CMSG I MSG_FALSE                         |CI$087
  4286  CMSG I MSG_LAST_KEY_PRESSED              |CI$088
  4287  CMSG V SET_RADIO_STRING                  |CI$089     S  S
  4288  CMSG V SET_ENTRY_STATE                   |CI$08A     I  I
  4289  CMSG I GET_ENTRY_STATE                   |CI$08B     I
  4290  CMSG V MSG_READ                          |CI$08C
  4291  CMSG V MSG_WRITE                         |CI$08D
  4292  CMSG V SET_SCROLL_BAR_OFFSET             |CI$08E     I
  4293  CMSG I GET_SCROLL_BAR_OFFSET             |CI$08F
  4294  CMSG I MSG_ITEM_CHANGE                   |CI$090     I  I
  4295  CMSG I GET_ITEM_CHANGED_STATE            |CI$091     I
  4296  CMSG V SET_ITEM_CHANGED_STATE            |CI$092     I  I
  4297  CMSG I GET_AUTO_TOP_ITEM_STATE           |CI$093
  4298  CMSG V SET_AUTO_TOP_ITEM_STATE           |CI$094     I
  4299  CMSG V SET_KBD_INPUT_MODE                |CI$095     I
  4300  CMSG I MSG_SUPPLY_KEY                    |CI$096     I
  4301  CMSG I GET_INSERT_MODE                   |CI$097
  4302  CMSG I MSG_OK                            |CI$098
  4303  CMSG I MSG_CANCEL                        |CI$099
  4304  CMSG Q GET_ARRAY_VALUE                   |CI$09A     I      // This has a ghost untyped parameter
  4305  CMSG V SET_ARRAY_VALUE                   |CI$09B     I  Q   // This has a ghost untyped parameter
  4306  CMSG V MSG_CONSTRUCT_OBJECT              |CI$09C
  4307  CMSG I MSG_ACTIVATING                    |CI$09D
  4308  CMSG V MSG_TRACE_SWITCH                  |CI$09E     I  I
  4309  CMSG V MSG_TRACE_MESSAGE                 |CI$09F
  4310  CMSG V MSG_TRACE_STEP                    |CI$0A0     I
  4311  CMSG V MSG_TRACE_OUTPUT                  |CI$0A1     S
  4312  CMSG I MSG_DEACTIVATING                  |CI$0A2
  4313  CMSG I GET_CLASS                         |CI$0A3
  4314  CMSG S GET_HELP_NAME                     |CI$0A4
  4315  CMSG V MSG_EXIT_APPLICATION              |CI$0A5
  4316  CMSG V MSG_PRINT_SCREEN                  |CI$0A6     S
  4317  CMSG I GET_RIGHT_MARGIN                  |CI$0A7
  4318  CMSG I GET_DELEGATION_MODE               |CI$0A8
  4319  CMSG V SET_DELEGATION_MODE               |CI$0A9     I
  4320  CMSG I GET_BASE_CLASS                    |CI$0AA
  4321  CMSG V SET_ITEM_ENTRY_MSG                |CI$0AB     I  I
  4322  CMSG I GET_ITEM_ENTRY_MSG                |CI$0AC     I
  4323  CMSG V SET_ITEM_EXIT_MSG                 |CI$0AD     I  I
  4324  CMSG I GET_ITEM_EXIT_MSG                 |CI$0AE     I
  4325  CMSG V SET_ITEM_VALIDATE_MSG             |CI$0AF     I  I
  4326  CMSG I GET_ITEM_VALIDATE_MSG             |CI$0B0     I
  4327  CMSG V SET_DATA_FILE                     |CI$0B1     I  I
  4328  CMSG I GET_DATA_FILE                     |CI$0B2     I
  4329  CMSG V SET_DATA_FIELD                    |CI$0B3     I  I
  4330  CMSG I GET_DATA_FIELD                    |CI$0B4     I
  4331  CMSG V SET_DATA_WINDOW                   |CI$0B5     I  I
  4332  CMSG I GET_DATA_WINDOW                   |CI$0B6     I
  4333  CMSG V SET_ITEM_OPTIONS                  |CI$0B7     I  I
  4334  CMSG I GET_ITEM_OPTIONS                  |CI$0B8     I
  4335  CMSG V SET_ITEM_OPTION                   |CI$0B9     I  I  I
  4336  CMSG I GET_ITEM_OPTION                   |CI$0BA     I  I
  4337  CMSG V MSG_ENTRY_UPDATE                  |CI$0BB     I  I
  4338  CMSG V MSG_ENTRY_FIND                    |CI$0BC     I
  4339  CMSG V MSG_ENTRY_SUPERFIND               |CI$0BD     I  I
  4340  CMSG V MSG_ENTRY_DISPLAY                 |CI$0BE     I  I
  4341  CMSG V MSG_ENTRY_CLEAR                   |CI$0BF     I
  4342  CMSG I GET_VALIDATE_ITEMS                |CI$0C0     I
  4343  CMSG I GET_ITEM_WINDOW                   |CI$0C1           // takes no params?
  4344  CMSG V MSG_COPY_ITEMS                    |CI$0C2     *     // sav_cur_obj - params on the flex stack
  4345  CMSG I GET_IMAGE_NUMBER                  |CI$0C3           // 6/2/98 5:39
  4346  CMSG V MSG_ENTRY_CLEAR_ALL               |CI$0C4     I
  4347  CMSG V MSG_SELECT_TOGGLING               |CI$0C5     I  I
  4348  CMSG I GET_ITEM_ENTRY                    |CI$0C6     I
  4349  CMSG I GET_ITEM_EXIT                     |CI$0C7     I
  4350  CMSG I GET_ITEM_VALIDATE                 |CI$0C8     I
  4351  CMSG I GET_READ_ONLY_ERROR               |CI$0C9     I  I
  4352  CMSG S GET_NAME                          |CI$0CA
  4353  CMSG I GET_ENTRY                         |CI$0CB
  4354  CMSG V MSG_DESTROY_OBJECT                |CI$0CC     V
  4355  CMSG V MSG_DESTROY_ALL_OBJECTS           |CI$0CD
  4356  CMSG I GET_MOUSE_HIT                     |CI$0CE
  4357  CMSG V SET_OBJECT_COLOR                  |CI$0CF     I  I
  4358  CMSG V SET_ARROWS                        |CI$0D0     I  I  I
  4359  CMSG V MSG_SWITCH                        |CI$0D1
  4360  CMSG V MSG_SWITCH_BACK                   |CI$0D2
  4361  CMSG I GET_WAS_FOUND                     |CI$0D3     I    // Invalid coding.
  4362  CMSG I GET_STATUS_LINE_STATE             |CI$0D4
  4363  CMSG V SET_HIGHLIGHT_STATE               |CI$0D5     I
  4364  CMSG V MSG_ROTATE_UP                     |CI$0D6
  4365  CMSG V MSG_POP_PAGES                     |CI$0D7
  4366  CMSG V SET_CLASS                         |CI$0D8     I
  4367  CMSG V MSG_FETCH_HELP                    |CI$0D9
  4368  CMSG I GET_OBJECT_ID                     |CI$0DA
  4369  CMSG V MSG_INIT_INSTANCE                 |CI$0DB
  4370  CMSG I MSG_PAGE                          |CI$0DC     I
  4371  CMSG I MSG_PAGE_DELETE                   |CI$0DD
  4372  CMSG I GET_COLORS                        |CI$0DE
  4373  CMSG I GET_BAR_LOCATION                  |CI$0DF
  4374  CMSG V RETURN_LOCATION                   |CI$0E0     // called from "C" only. 2 pointer to ints.
  4375  CMSG V CHANGE_LOCATION                   |CI$0E1     // called from "C" only. 2 pointer to ints.
  4376  CMSG V MSG_WRITE_DBMS                    |CI$0E2     *   // variable params, pushed on to flex stack
  4377  CMSG V MSG_READ_DBMS                     |CI$0E3     *   // variable params, pushed on to flex stack.
  4378  CMSG S GET_STRING_VALUE                  |CI$0E4     I
  4379  CMSG N GET_NUMBER_VALUE                  |CI$0E5     I
  4380  CMSG D GET_DATE_VALUE                    |CI$0E6     I
  4381  CMSG I GET_INTEGER_VALUE                 |CI$0E7     I
  4382  CMSG R GET_REAL_VALUE                    |CI$0E8     I
  4383  CMSG V SET_BASE_ITEM                     |CI$0E9     I
  4384  CMSG I GET_BASE_ITEM                     |CI$0EA
  4385  CMSG V SET_ITEM_LIMIT                    |CI$0EB     I
  4386  CMSG I GET_ITEM_LIMIT                    |CI$0EC
  4387  CMSG V MSG_MARK_OFF                      |CI$0ED
  4388  CMSG V SET_SEARCH_CASE                   |CI$0EE     I
  4389  CMSG V SET_PRIOR_FOCUS                   |CI$0EF     I
  4390  CMSG I GET_PRIOR_FOCUS                   |CI$0F0
  4391  CMSG V SET_NEXT_FOCUS                    |CI$0F1     I
  4392  CMSG I GET_NEXT_FOCUS                    |CI$0F2
  4393  CMSG V SET_SCROLLBAR                     |CI$0F3     I
  4394  CMSG I GET_ASCII_STATE                   |CI$0F4
  4395  CMSG V SET_ASCII_STATE                   |CI$0F5     I
  4396  CMSG I GET_TEXT_INDENT                   |CI$0F6
  4397  CMSG V SET_TEXT_INDENT                   |CI$0F7     I
  4398  CMSG V MSG_ENTRY_AUTOFIND                |CI$0F8     I
  4399  CMSG V SET_SCOPE_STATE                   |CI$0F9     I
  4400  CMSG I GET_SCOPE_STATE                   |CI$0FA
  4401  CMSG V MSG_MOUSE_CHANGE_FOCUS            |CI$0FB     I
  4402  CMSG I GET_CHILD_COUNT                   |CI$0FC
  4403  CMSG V MSG_MOUSE_UP                      |CI$0FD     I  I
  4404  CMSG V MSG_MOUSE_UP2                     |CI$0FE     I  I
  4405  CMSG V MSG_MOUSE_UP3                     |CI$0FF     I  I
  4406  CMSG V MSG_MOUSE_CLICK                   |CI$100     I  I
  4407  CMSG V MSG_MOUSE_CLICK2                  |CI$101     I  I
  4408  CMSG V MSG_MOUSE_CLICK3                  |CI$102     I  I
  4409  CMSG V MSG_MOUSE_DOWN                    |CI$103     I  I
  4410  CMSG V MSG_MOUSE_DOWN2                   |CI$104     I  I
  4411  CMSG V MSG_MOUSE_DOWN3                   |CI$105     I  I
  4412  CMSG V MSG_MOUSE_DRAG                    |CI$106     I  I
  4413  CMSG V MSG_MOUSE_DRAG2                   |CI$107     I  I
  4414  CMSG V MSG_MOUSE_DRAG3                   |CI$108     I  I
  4415  CMSG I GET_ABSOLUTE_MOUSE_LOCATION       |CI$109
  4416  CMSG V SET_ABSOLUTE_MOUSE_LOCATION       |CI$10A     I  I  I
  4417  CMSG I GET_DYNAMIC_UPDATE_STATE          |CI$10B
  4418  CMSG V SET_MAX_LINES                     |CI$10C     I
  4419  CMSG I GET_MAX_LINES                     |CI$10D
  4420  CMSG V MSG_VIRTUAL_CONSOLE               |CI$10E
  4421  CMSG I GET_NEXT_ENTRY_OK                 |CI$10F
  4422  CMSG I GET_PREVIOUS_ENTRY_OK             |CI$110
  4423  CMSG V SET_DYNAMIC_COLORS                |CI$111     I  I
  4424  CMSG V SET_NEW_ITEM                      |CI$112     I
  4425  CMSG V SET_BROADCAST_STATE               |CI$113     I
  4426  CMSG I GET_BROADCAST_STATE               |CI$114
  4427  CMSG I GET_WRAPPING                      |CI$115
  4428  CMSG I GET_ROW_CHANGING                  |CI$116     I  I
  4429  CMSG V MSG_ADD_FOCUS                     |CI$117     I
  4430  CMSG V MSG_REMOVE_OBJECT                 |CI$118
  4431  CMSG V MSG_RELEASE_FOCUS                 |CI$119
  4432  CMSG I MSG_ENTERING                      |CI$11A
  4433  CMSG I MSG_EXITING                       |CI$11B     I
  4434  CMSG I MSG_ENTERING_SCOPE                |CI$11C
  4435  CMSG I MSG_EXITING_SCOPE                 |CI$11D     I
  4436  CMSG V MSG_SWITCH_NEXT_GROUP             |CI$11E
  4437  CMSG V MSG_SWITCH_PRIOR_GROUP            |CI$11F
  4438  CMSG I GET_CURRENT_SCOPE                 |CI$120
  4439  CMSG V SET_CURRENT_SCOPE                 |CI$121     I
  4440  CMSG V MSG_POPUP                         |CI$122
  4441  CMSG V MSG_POPUP_GROUP                   |CI$123
  4442  CMSG V SET_POPUP_STATE                   |CI$124     I
  4443  CMSG I GET_POPUP_STATE                   |CI$125
  4444  CMSG V SET_RING_STATE                    |CI$126     I
  4445  CMSG I GET_RING_STATE                    |CI$127
  4446  CMSG V MSG_MOVE_FOCUS_TREE               |CI$128     I
  4447  CMSG V SET_PROMPT_OBJECT                 |CI$129     I  I
  4448  CMSG I GET_PROMPT_OBJECT                 |CI$12A     I
  4449  CMSG V SET_ZOOM_OBJECT                   |CI$12B     I  I
  4450  CMSG I GET_ZOOM_OBJECT                   |CI$12C     I
  4451  CMSG I GET_PRIOR_LEVEL                   |CI$12D
  4452  CMSG I GET_NEXT_LEVEL                    |CI$12E
  4453  CMSG I GET_PRIOR_SCOPE                   |CI$12F
  4454  CMSG I GET_NEXT_SCOPE                    |CI$130
  4455  CMSG V MSG_SWITCH_PRIOR_SCOPE            |CI$131
  4456  CMSG V MSG_SWITCH_NEXT_SCOPE             |CI$132
  4457  CMSG V SET_ATTACH_PARENT_STATE           |CI$133     I
  4458  CMSG I GET_ATTACH_PARENT_STATE           |CI$134
  4459  CMSG V MSG_CHILD_WRAPPING                |CI$135     I
  4460  CMSG V SET_DISPLAY_MODE                  |CI$136     I  I
  4461  CMSG I GET_DISPLAY_MODE                  |CI$137     I
  4462  CMSG V MSG_COLOR_BLOCK                   |CI$138     I  I
  4463  CMSG V MSG_NEXT_OBJECT                   |CI$139
  4464  CMSG V MSG_PRIOR_OBJECT                  |CI$13A
  4465  CMSG V SET_APPLICATION_NAME              |CI$13B     S
  4466  CMSG S GET_APPLICATION_NAME              |CI$13C
  4467  CMSG V SET_MODULE_NAME                   |CI$13D     S
  4468  CMSG S GET_MODULE_NAME                   |CI$13E
  4469  CMSG I GET_LAST_CHILD                    |CI$13F
  4470  CMSG V SET_WINDOW_COLOR                  |CI$140     I  I
  4471  CMSG I GET_WINDOW_COLOR                  |CI$141     I
  4472  CMSG I MSG_PROCESS_KEY                   |CI$142     I
  4473  CMSG V MSG_ACTIVATE_SCOPE                |CI$143
  4474  CMSG I GET_FIND_SCOPE                    |CI$144
  4475  CMSG I GET_SCOPE_FOCUS                   |CI$145
  4476  CMSG I GET_VALID_ITEM                    |CI$146     I
  4477  CMSG V MSG_UPDATE_DISPLAY                |CI$147
  4478  CMSG V SET_ITEM                          |CI$148     I
  4479  CMSG V MSG_TRACE_COMMAND                 |CI$149
  4480  CMSG I GET_OBJECT_COLOR                  |CI$14A
  4481  CMSG V SET_OBJECT_VALIDATION             |CI$14B     I
  4482  CMSG I GET_OBJECT_VALIDATION             |CI$14C
  4483  CMSG I GET_NEXT_OBJECT_ID                |CI$14D     I
  4484  CMSG I GET_PRIOR_OBJECT_ID               |CI$14E     I
  4485  CMSG I GET_CLASS_COLORS                  |CI$14F     I
  4486  CMSG I GET_LOCATION_TYPE                 |CI$150
  4487  CMSG I GET_OBJECT_SIZE                   |CI$151
  4488  CMSG I GET_IN_USE_STATE                  |CI$152
  4489  CMSG V SET_IN_USE_STATE                  |CI$153     I
  4490  CMSG V MSG_ATTACH_DEO_TO_SERVER          |CI$154
  4491  CMSG V MSG_REQUEST_CLEAR_ALL             |CI$155
  4492  CMSG V MSG_CLEAR                         |CI$156
  4493  CMSG V SET_CURRENT_RECORD                |CI$157     I
  4494  CMSG I GET_CURRENT_RECORD                |CI$158
  4495  CMSG V MSG_REBUILD_CONSTRAINTS           |CI$159
  4496  CMSG V MSG_CONSTRAIN                     |CI$15A
  4497  CMSG V SET_MAIN_FILE                     |CI$15B     I
  4498  CMSG I GET_MAIN_FILE                     |CI$15C
  4499  CMSG I GET_FIND_SERVER                   |CI$15D
  4500  CMSG I GET_LOCATE_SERVER                 |CI$15E
  4501  CMSG V MSG_MARK_AS_COMPONENT             |CI$15F
  4502  CMSG V MSG_DELETING                      |CI$160
  4503  CMSG I GET_VALIDATE_DELETE               |CI$161
  4504  CMSG V MSG_REQUEST_DELETE                |CI$162
  4505  CMSG V MSG_DISPLAY                       |CI$163
  4506  CMSG V MSG_RELATE_MAIN_FILE              |CI$164
  4507  CMSG V MSG_CLEAR_UI                      |CI$165
  4508  CMSG V MSG_DISPLAY_UI                    |CI$166
  4509  CMSG V MSG_REQUEST_ASSIGN                |CI$167     I
  4510  CMSG I GET_VALIDATE_SAVE                 |CI$168
  4511  CMSG V MSG_ATTACH_MAIN_FILE              |CI$169
  4512  CMSG V MSG_REQUEST_CLEAR                 |CI$16A
  4513  CMSG V MSG_BACKOUT                       |CI$16B
  4514  CMSG V MSG_UPDATE                        |CI$16C
  4515  CMSG V MSG_SAVE_MAIN_FILE                |CI$16D
  4516  CMSG V MSG_DELETE_MAIN_FILE              |CI$16E
  4517  CMSG I GET_ENTRY_PERMISSIVE_STATE        |CI$16F
  4518  CMSG V SET_ENTRY_PERMISSIVE_STATE        |CI$170     I
  4519  CMSG V SET_ORDERING                      |CI$171     I
  4520  CMSG I GET_ORDERING                      |CI$172
  4521  CMSG I GET_COMPONENT_STATE               |CI$173
  4522  CMSG V SET_COMPONENT_STATE               |CI$174     I
  4523  CMSG I GET_HAS_COMPONENTS_STATE          |CI$175
  4524  CMSG V SET_HAS_COMPONENTS_STATE          |CI$176     I
  4525  CMSG V MSG_REQUEST_SAVE                  |CI$177
  4526  CMSG V MSG_REMOVE_FOCUS                  |CI$178
  4527  CMSG V MSG_ATTACH_SERVER                 |CI$179     I
  4528  CMSG V MSG_DETACH_SERVER                 |CI$17A     I
  4529  CMSG V MSG_ATTACH_CLIENT                 |CI$17B     I
  4530  CMSG V MSG_DETACH_CLIENT                 |CI$17C     I
  4531  CMSG V MSG_ADD_USER_INTERFACE            |CI$17D     V
  4532  CMSG V MSG_REMOVE_USER_INTERFACE         |CI$17E     V
  4533  CMSG V MSG_MAIN_FILE_CHANGED             |CI$17F     I
  4534  CMSG I GET_IS_SUPERFIND_REQUIRED         |CI$180     I
  4535  CMSG V MSG_REQUEST_FIND                  |CI$181     I  I  I
  4536  CMSG V MSG_ADD_PARENT_FILE               |CI$182     I
  4537  CMSG V MSG_REMOVE_PARENT_FILE            |CI$183     I
  4538  CMSG V MSG_REQUEST_SUPERFIND             |CI$184     I  I  I
  4539  CMSG V MSG_REQUEST_READ                  |CI$185     I  I  I
  4540  CMSG V MSG_READ_BY_RECNUM                |CI$186     I  I
  4541  CMSG V MSG_FIND_BY_RECNUM                |CI$187     I  I
  4542  CMSG V MSG_ESTABLISH_FIND_DIRECTION      |CI$188     I  I  I
  4543  CMSG V MSG_LOCATE_NEXT                   |CI$189
  4544  CMSG I GET_RECORD_NOT_FOUND              |CI$18A     I
  4545  CMSG V MSG_INIT_CLASS                    |CI$18B
  4546  CMSG V SET_IMAGE_NUMBER                  |CI$18C     I
  4547  CMSG I GET_ROW                           |CI$18D     I
  4548  CMSG I GET_CURRENT_ROW                   |CI$18E
  4549  CMSG I GET_TOP_ROW                       |CI$18F
  4550  CMSG I GET_BOTTOM_ITEM                   |CI$190
  4551  CMSG I GET_BOTTOM_ROW                    |CI$191
  4552  CMSG I GET_ROW_COUNT                     |CI$192
  4553  CMSG I GET_DISPLAYABLE_ROWS              |CI$193
  4554  CMSG V MSG_ADD_ROW                       |CI$194     I
  4555  CMSG V MSG_INSERT_ROW                    |CI$195     I  I
  4556  CMSG V SET_PALETTE_COLOR                 |CI$196     I  I  I
  4557  CMSG I GET_PALETTE_COLOR                 |CI$197     I  I
  4558  CMSG V SET_CLASS_PALETTE                 |CI$198     I  I
  4559  CMSG I GET_CLASS_PALETTE                 |CI$199     I
  4560  CMSG I GET_NO_DELETE_STATE               |CI$19A
  4561  CMSG V SET_NO_DELETE_STATE               |CI$19B     I
  4562  CMSG V MSG_REQUEST_ENTRY_UPDATE          |CI$19C     I  I
  4563  CMSG V MSG_SCROLL_PAINT                  |CI$19D
  4564  CMSG V MSG_SHOW_ITEM                     |CI$19E     I
  4565  CMSG V SET_EXTERNAL_PAINT_STATE          |CI$19F     I
  4566  CMSG I GET_EXTERNAL_PAINT_STATE          |CI$1A0
  4567  CMSG V SET_MATRIX_SIZE                   |CI$1A1     I  I
  4568  CMSG I GET_MATRIX_SIZE                   |CI$1A2
  4569  CMSG V SET_SKIP_STATE                    |CI$1A3     I
  4570  CMSG I GET_SKIP_STATE                    |CI$1A4
  4571  CMSG I GET_REQUEST_VALIDATE              |CI$1A5
  4572  CMSG I GET_AUTO_FILL_STATE               |CI$1A6
  4573  CMSG V SET_AUTO_FILL_STATE               |CI$1A7     I
  4574  CMSG I GET_FIND_PERMISSIVE_STATE         |CI$1A8
  4575  CMSG V SET_FIND_PERMISSIVE_STATE         |CI$1A9     I
  4576  CMSG V MSG_TRANSACTION_ABORTED           |CI$1AA     I
  4577  CMSG V MSG_CLEAR_ALL                     |CI$1AB
  4578  CMSG V MSG_CREATING                      |CI$1AC
  4579  CMSG V MSG_DESTROYING                    |CI$1AD
  4580  CMSG I GET_SHOULD_SAVE                   |CI$1AE
  4581  CMSG I GET_WHICH_DATA_SET                |CI$1AF     I
  4582  CMSG I GET_VALIDATE_CONSTRAINTS          |CI$1B0
  4583  CMSG V MSG_ERROR_REPORT                  |CI$1B1     V
  4584  CMSG V MSG_REQUEST_RELATE                |CI$1B2     I
  4585  CMSG S GET_ERROR_TEXT                    |CI$1B3     I
  4586  CMSG I GET_SUGGESTED_ORDERING            |CI$1B4
  4587  CMSG V SET_SUGGESTED_ORDERING            |CI$1B5     I
  4588  CMSG I GET_NO_RELATE_STATE               |CI$1B6
  4589  CMSG V SET_NO_RELATE_STATE               |CI$1B7     I
  4590  CMSG I GET_WINDOW_LOCATION               |CI$1B8     I
  4591  CMSG I GET_SIGNON_STATUS                 |CI$1B9
  4592  CMSG V MSG_ADD_WATCHER                   |CI$1BA     I
  4593  CMSG V MSG_REMOVE_WATCHER                |CI$1BB     I
  4594  CMSG I GET_SEARCH_CASE                   |CI$1BC
  4595  CMSG I GET_SHOULD_SAVE_ROW               |CI$1BD
  4596  CMSG V MSG_DISPLAY_STATUS                |CI$1BE     S
  4597  CMSG V MSG_CLEAR_SET                     |CI$1BF
  4598  CMSG I GET_AUTOFIND_ITEM                 |CI$1C0
  4599  CMSG V SET_KEY_PATH                      |CI$1C1     I
  4600  CMSG I GET_KEY_PATH                      |CI$1C2
  4601  CMSG I GET_CAN_DELETE                    |CI$1C3
  4602  CMSG V MSG_UPDATE_DEPENDENT_ITEMS        |CI$1C4
  4603  CMSG I GET_SUPERFIND_FIELD               |CI$1C5     I  I
  4604  CMSG V MSG_REFRESH                       |CI$1C6     I
  4605  CMSG V MSG_PROCESS_ACCELERATOR           |CI$1C7     I  I
  4606  CMSG I GET_ERROR_TEXT_AVAILABLE          |CI$1C8     I
  4607  CMSG I GET_PROTOTYPE_OBJECT              |CI$1C9
  4608  CMSG V MSG_REFIND_RECORDS                |CI$1CA
  4609  CMSG V MSG_END_CONSTRUCT_OBJECT          |CI$1CB
  4610  CMSG V MSG_CLEAR_MAIN_FILE               |CI$1CC
  4611  CMSG V MSG_REQUEST_CLEAR_FILE            |CI$1CD     I
  4612  CMSG I GET_CALLBACK                      |CI$1CE     S  I
  4613  CMSG I GET_IS_CRITICAL                   |CI$1CF     I
  4614  CMSG I GET_VIRTUAL_CONSOLE               |CI$1D0
  4615  CMSG V SET_VIRTUAL_CONSOLE               |CI$1D1     I
  4616  CMSG I GET_KBD_INPUT_MODE                |CI$1D2
  4617  CMSG I GET_VERIFY_RETRY                  |CI$1D3
  4618
  4619  // added to VDF 8.2
  4620  CMSG I GET_PENEIGHBORHOOD                |CI$0539    // get peNeighborHood to eHood
  4621  CMSG I SET_PENEIGHBORHOOD                |CI$053A    // set peNeighborHood to nhPrivate|nhPublic|nhNo
  4622  CMSG I GET_ONCHILDWRAPPING               |CI$053B    // get onChildWrapping hoDest bDown to hoNewDest
  4623  CMSG I GET_CONTAINSFOCUS                 |CI$053C    // get ContainsFocus to bHasFocus
  4624  CMSG I GET_RINGPARENT                    |CI$053D    // get RingParent to hoRingOwner
  4625  CMSG I GET_ISCOLUMNVISIBLE               |CI$053e    // get IsColumnVisible iColumn to bIsVisible
  4626  CMSG I MSG_DOMAKECOLUMNVISIBLE           |CI$053f    // Send DoMakeColumnVisible iColumn
  4627  CMSG I GET_PBAUTOFILLFROMFIRST           |CI$0540    // Get/Set pbAutoFillFromFirst to bFirst (true=dflt)
  4628  CMSG I SET_PBAUTOFILLFROMFIRST           |CI$0541
  4629  CMSG I GET_PBINHERITCONSTRAINTS          |CI$057A    // should DSO/DDO inherit constraints from servers (dflt=true)
  4630  CMSG I SET_PBINHERITCONSTRAINTS          |CI$057B
  4631
  4632#ENDCOMMAND
  4633
  4634// define all runtime messages used just by VDF
  4635// Note: make sure number of lines in command is less than 1024
  4636#COMMAND Define$BuiltIn$VDF$Messages
  4637
  4638  CMSG I GET_FONT                          |CI$1D4
  4639  CMSG V SET_MAP_MODE                      |CI$1D5     I
  4640  CMSG I GET_MAP_MODE                      |CI$1D6
  4641  CMSG V SET_TYPEFACE                      |CI$1D7     S
  4642  CMSG S GET_TYPEFACE                      |CI$1D8
  4643  CMSG V SET_FONTSIZE                      |CI$1D9     I  I
  4644  CMSG I GET_FONTSIZE                      |CI$1DA
  4645  CMSG V SET_FONTWEIGHT                    |CI$1DB     I
  4646  CMSG I GET_FONTWEIGHT                    |CI$1DC
  4647  CMSG V SET_FONTITALICS                   |CI$1DD     I
  4648  CMSG I GET_FONTITALICS                   |CI$1DE
  4649  CMSG V SET_FONTUNDERLINE                 |CI$1DF     I
  4650  CMSG I GET_FONTUNDERLINE                 |CI$1E0
  4651  CMSG I GET_FOREIGNLINK                   |CI$1E1
  4652  CMSG V SET_FOREIGNLINK                   |CI$1E2     I
  4653  CMSG I GET_ACKSTATE                      |CI$1E3
  4654  CMSG V SET_ACKSTATE                      |CI$1E4     I
  4655  CMSG I GET_LINKTEMPERATURE               |CI$1E5
  4656  CMSG V SET_LINKTEMPERATURE               |CI$1E6     I
  4657  CMSG I GET_RETRYCOUNT                    |CI$1E7
  4658  CMSG V SET_RETRYCOUNT                    |CI$1E8     I
  4659  CMSG I GET_DDE_INITIATE                  |CI$1E9     I  S
  4660  CMSG S GET_SESS_REQUEST                  |CI$1EA     S
  4661  CMSG I GET_SESS_RECEIVE                  |CI$1EB     S  S
  4662  CMSG I GET_SESS_TERMINATE                |CI$1EC
  4663  CMSG I GET_SESS_EXECUTE                  |CI$1ED     S
  4664  CMSG I GET_SESS_CONNECT                  |CI$1EE     S  S
  4665  CMSG S GET_SESS_READ                     |CI$1EF     S
  4666  CMSG I GET_SESS_WRITE                    |CI$1F0     S  S
  4667  CMSG I GET_SESS_DISCONNECT               |CI$1F1
  4668  CMSG I GET_SESS_PERFORM                  |CI$1F2     S
  4669  CMSG I GET_PRIVATEFOREIGNLINK            |CI$1F3
  4670  CMSG V SET_PRIVATEFOREIGNLINK            |CI$1F4     I
  4671  CMSG I GET_GUILOCATION                   |CI$1F5
  4672  CMSG V SET_GUILOCATION                   |CI$1F6     I  I
  4673  CMSG I GET_MAP_RATIOS                    |CI$1F7
  4674  CMSG V SET_MAP_RATIOS                    |CI$1F8     I  I
  4675  CMSG I GET_BORDER_STYLE                  |CI$1F9
  4676  CMSG V SET_BORDER_STYLE                  |CI$1FA     I
  4677  CMSG I GET_CLIPPING_MODE                 |CI$1FB
  4678  CMSG V SET_CLIPPING_MODE                 |CI$1FC     I
  4679  CMSG I GET_CAPTION_BAR                   |CI$1FD
  4680  CMSG V SET_CAPTION_BAR                   |CI$1FE     I
  4681  CMSG I GET_MINIMIZE_ICON                 |CI$1FF
  4682  CMSG V SET_MINIMIZE_ICON                 |CI$200     I
  4683  CMSG I GET_MAXIMIZE_ICON                 |CI$201
  4684  CMSG V SET_MAXIMIZE_ICON                 |CI$202     I
  4685  CMSG I GET_SYSMENU_ICON                  |CI$203
  4686  CMSG V SET_SYSMENU_ICON                  |CI$204     I
  4687  CMSG I GET_VIEW_MODE                     |CI$205
  4688  CMSG V SET_VIEW_MODE                     |CI$206     I
  4689  CMSG I GET_BORDER_WIDTH                  |CI$207
  4690  CMSG V SET_BORDER_WIDTH                  |CI$208     I
  4691  CMSG I GET_SCROLL_RANGE                  |CI$209
  4692  CMSG V SET_SCROLL_RANGE                  |CI$20A     I  I
  4693  CMSG I GET_PAGESIZE                      |CI$20B
  4694  CMSG V SET_PAGESIZE                      |CI$20C     I
  4695  CMSG I GET_LINESIZE                      |CI$20D
  4696  CMSG V SET_LINESIZE                      |CI$20E     I
  4697  CMSG I GET_COLUMN_WIDTH                  |CI$20F
  4698  CMSG V SET_COLUMN_WIDTH                  |CI$210     I
  4699  CMSG I GET_SORTED_STATE                  |CI$211
  4700  CMSG V SET_SORTED_STATE                  |CI$212     I
  4701  CMSG I GET_UNDO                          |CI$213
  4702  CMSG I GET_ITEM_TYPE                     |CI$214     I
  4703  CMSG V SET_ITEM_TYPE                     |CI$215     I  I
  4704  CMSG I GET_SELECTED_OBJECTID             |CI$216
  4705  CMSG V SET_FORM_WIDTH                    |CI$217     I  I
  4706  CMSG I GET_FORM_WIDTH                    |CI$218     I
  4707  // This message isn't really used anymore, except once in the IDE.
  4708  CMSG V SET_FORM_COLOR                    |CI$219     I  I  I
  4709  CMSG I GET_FORM_COLOR                    |CI$21A     I
  4710  CMSG V SET_FORM_DATATYPE                 |CI$21B     I  I
  4711  CMSG I GET_FORM_DATATYPE                 |CI$21C     I
  4712  CMSG V SET_FORM_OPTIONS                  |CI$21D     I  I
  4713  CMSG I GET_FORM_OPTIONS                  |CI$21E     I
  4714  CMSG V SET_FORM_FONT                     |CI$21F     I  I
  4715  CMSG I GET_FORM_FONT                     |CI$220     I
  4716  CMSG V SET_FORM_ROW                      |CI$221     I  I
  4717  CMSG I GET_FORM_ROW                      |CI$222     I
  4718  CMSG V SET_FORM_COLUMN                   |CI$223     I  I
  4719  CMSG I GET_FORM_COLUMN                   |CI$224     I
  4720  CMSG V SET_JUSTIFICATION_MODE            |CI$225     I
  4721  CMSG I GET_JUSTIFICATION_MODE            |CI$226
  4722  CMSG V SET_FORM_TYPEFACE                  |CI$227     I  S
  4723  CMSG S GET_FORM_TYPEFACE                  |CI$228     I
  4724  CMSG V SET_FORM_FONTHEIGHT                |CI$229     I  I
  4725  CMSG I GET_FORM_FONTHEIGHT                |CI$22A     I
  4726  CMSG V SET_FORM_FONTWEIGHT                |CI$22B     I  I
  4727  CMSG I GET_FORM_FONTWEIGHT                |CI$22C     I
  4728  CMSG V SET_FORM_FONTITALICS               |CI$22D     I  I
  4729  CMSG I GET_FORM_FONTITALICS               |CI$22E     I
  4730  CMSG V SET_FORM_FONTUNDERLINE             |CI$22F     I  I
  4731  CMSG I GET_FORM_FONTUNDERLINE             |CI$230     I
  4732  CMSG V SET_NAME                          |CI$231     S
  4733  CMSG V SET_BITMAP                        |CI$232     S
  4734  CMSG V SET_BUTTON_ASPECT                 |CI$233     I  I
  4735  CMSG I GET_BUTTON_ASPECT                 |CI$234     I
  4736  CMSG V SET_BUTTON_POSITION               |CI$235     I
  4737  CMSG I GET_BUTTON_POSITION               |CI$236
  4738  CMSG I GET_ITEM_COLOR                    |CI$237     I
  4739  CMSG I GET_BANDED_OBJECT                 |CI$238
  4740  CMSG V SET_FORM_HEIGHT                   |CI$239     I  I
  4741  CMSG I GET_FORM_HEIGHT                   |CI$23A     I
  4742  CMSG V SET_AUTO_ALIGN                    |CI$23B     I
  4743  CMSG I GET_AUTO_ALIGN                    |CI$23C
  4744  CMSG V SET_COMBO_DATA_OBJECT             |CI$23D     I
  4745  CMSG I GET_COMBO_DATA_OBJECT             |CI$23E
  4746  CMSG V SET_LINE_THICKNESS                |CI$23F     I
  4747  CMSG I GET_LINE_THICKNESS                |CI$240
  4748  CMSG V SET_LINE_OFFSET                   |CI$241     I
  4749  CMSG I GET_LINE_OFFSET                   |CI$242
  4750  CMSG V SET_WINDOW_HANDLE                 |CI$243     I
  4751  CMSG I GET_CONTAINER_HANDLE              |CI$244
  4752  CMSG V SET_HORIZONTAL_STATE              |CI$245     I
  4753  CMSG I GET_HORIZONTAL_STATE              |CI$246
  4754  CMSG V MSG_LOAD_FORM_FROM_PAGE           |CI$247     I                 // 6:36 6/2/98
  4755  CMSG V SET_FORM_GUIWIDTH                 |CI$248     I  I
  4756  CMSG I GET_FORM_GUIWIDTH                 |CI$249     I
  4757  CMSG V SET_FORM_GUIHEIGHT                |CI$24A     I  I
  4758  CMSG I GET_FORM_GUIHEIGHT                |CI$24B     I
  4759  CMSG V SET_FORM_GUIROW                   |CI$24C     I  I
  4760  CMSG I GET_FORM_GUIROW                   |CI$24D     I
  4761  CMSG V SET_FORM_GUICOLUMN                |CI$24E     I  I
  4762  CMSG I GET_FORM_GUICOLUMN                |CI$24F     I
  4763  CMSG V MSG_HSCROLL                       |CI$250     I  I
  4764  CMSG V MSG_EXPORT_CLIPBOARD_DATA         |CI$251
  4765  CMSG V MSG_IMPORT_CLIPBOARD_DATA         |CI$252
  4766  CMSG V SET_FORM_MARGIN                   |CI$253     I  I
  4767  CMSG I GET_FORM_MARGIN                   |CI$254     I
  4768  CMSG V MSG_ENUMERATE_FONTS               |CI$255     S
  4769  CMSG I GET_USER_FONTNAME                 |CI$256     S  I
  4770  CMSG V SET_ICON                          |CI$257     S
  4771  CMSG I GET_PARENT_RATIOS                 |CI$258
  4772  CMSG V SET_BANDING_OBJECT                |CI$259     I
  4773  CMSG I GET_BANDING_OBJECT                |CI$25A
  4774  CMSG V MSG_MAKE_PROPORTIONAL             |CI$25B     I  I
  4775  CMSG I GET_PHYSICAL_FONTSIZE             |CI$25C
  4776  CMSG V MSG_SYSTEM_HELP                   |CI$25D     S  S
  4777  CMSG S GET_DLL_NAME                      |CI$25E
  4778  CMSG V SET_LINE_STYLE                    |CI$25F     I
  4779  CMSG I GET_LINE_STYLE                    |CI$260
  4780  CMSG V MSG_CHOOSE                        |CI$261
  4781  CMSG V SET_TOP_LINE_COLOR                |CI$262     I
  4782  CMSG I GET_TOP_LINE_COLOR                |CI$263
  4783  CMSG V SET_BOTTOM_LINE_COLOR             |CI$264     I
  4784  CMSG I GET_BOTTOM_LINE_COLOR             |CI$265
  4785  CMSG V SET_FOREGROUND_COLOR              |CI$266     I
  4786  CMSG I GET_FOREGROUND_COLOR              |CI$267
  4787  CMSG V SET_BKGRND_COLOR                  |CI$268     I
  4788  CMSG I GET_BKGRND_COLOR                  |CI$269
  4789  CMSG I GET_BRUSH                         |CI$26A
  4790  CMSG V MSG_EXIT_CASCADE                  |CI$26B
  4791  CMSG V MSG_REDIRECT_MESSAGE              |CI$26C
  4792  CMSG V MSG_ACTIVATE_PULL_DOWN            |CI$26D
  4793  CMSG V SET_ACTION_BAR_LOCATION           |CI$26E     I
  4794  CMSG I GET_ACTION_BAR_KEYS_MSG           |CI$26F
  4795  CMSG V SET_ACTION_BAR_KEYS_MSG           |CI$270     I
  4796  CMSG V SET_AUTO_SCALE_FONT_STATE         |CI$271     I
  4797  CMSG I GET_AUTO_SCALE_FONT_STATE         |CI$272
  4798  CMSG V MSG_SCALE_FONTS                   |CI$273
  4799  CMSG V SET_FORM_OPTION                   |CI$274     I  I  I
  4800  CMSG I GET_FORM_OPTION                   |CI$275     I  I
  4801  CMSG V MSG_ADJUST_LOGICALS               |CI$276
  4802  CMSG V SET_PHYSICAL_FONTSIZE             |CI$277     I  I
  4803  CMSG I GET_EXIT_SYSTEM_CONFIRMATION      |CI$278
  4804  CMSG V SET_CAPTION_BAR_HIGHLIGHT         |CI$279     I
  4805  CMSG V MSG_ACTIVATE_SYSMENU              |CI$27A     I
  4806  CMSG V SET_HIGHLIGHT_ROW_TEXT_COLOR      |CI$27b     I
  4807  CMSG I GET_HIGHLIGHT_ROW_TEXT_COLOR      |CI$27c
  4808  CMSG V SET_CURRENT_ITEM_TEXT_COLOR       |CI$27d     I
  4809  CMSG I GET_CURRENT_ITEM_TEXT_COLOR       |CI$27e
  4810  CMSG V SET_ITEM_TEXT_COLOR               |CI$27f     I  I
  4811  CMSG I GET_ITEM_TEXT_COLOR               |CI$280     I
  4812  CMSG I GET_TEXT_EXTENT                   |CI$281     S
  4813  CMSG V MSG_SYSTEM_CONTEXT_HELP           |CI$282     S  I
  4814  CMSG V SET_MOUSE_CAPTURE                 |CI$283
  4815  CMSG I GET_MOUSE_CAPTURE                 |CI$284
  4816  CMSG V MSG_RELEASE_MOUSE_CAPTURE         |CI$285
  4817  CMSG V SET_WINDOW_STYLE                  |CI$286     I  I
  4818  CMSG I GET_WINDOW_STYLE                  |CI$287     I
  4819  CMSG V MSG_COMMAND                       |CI$288     I  I
  4820  CMSG I GET_GUISIZE                       |CI$289
  4821  CMSG V SET_GUISIZE                       |CI$28A     I  I
  4822  CMSG I GET_ABSOLUTE_GUIORIGIN            |CI$28B
  4823  CMSG I GET_WINDOW_HANDLE                 |CI$28C
  4824  CMSG V SET_FONT                          |CI$28D     I
  4825  CMSG V MSG_NOTIFY_FOCUS_CHANGE           |CI$28E     I
  4826  CMSG V MSG_EXIT_MENU                     |CI$28F
  4827  CMSG I GET_CURSOR                        |CI$290
  4828  CMSG V SET_CURSOR                        |CI$291     I
  4829  CMSG I GET_DATA_SET_SERVER               |CI$292     I
  4830  CMSG I GET_DATA_SET_CLIENT               |CI$293     I
  4831  CMSG I GET_DATA_SET_USER_INTERFACE       |CI$294     I
  4832  CMSG I GET_DATA_SET_SERVER_COUNT         |CI$295
  4833  CMSG I GET_DATA_SET_CLIENT_COUNT         |CI$296
  4834  CMSG I GET_DATA_SET_USER_INTERFACE_COUNT |CI$297
  4835  CMSG V SET_ALWAYS_REFRESH_STATE          |CI$298     I
  4836  CMSG I GET_ALWAYS_REFRESH_STATE          |CI$299
  4837  CMSG V MSG_RESET_FILEMODES_FOR_LOCK      |CI$29A
  4838  CMSG V SET_SMART_FILEMODE_STATE          |CI$29B     I
  4839  CMSG I GET_SMART_FILEMODE_STATE          |CI$29C
  4840  CMSG V SET_SMART_FILEMODE_FOR_LOCK       |CI$29D     I
  4841  CMSG I GET_SMART_FILEMODE_FOR_LOCK       |CI$29E
  4842  CMSG V SET_SMART_FILEMODE_FOR_NO_LOCK    |CI$29F     I
  4843  CMSG I GET_SMART_FILEMODE_FOR_NO_LOCK    |CI$2A0
  4844  CMSG V SET_CASCADE_DELETE_STATE          |CI$2A1     I
  4845  CMSG I GET_CASCADE_DELETE_STATE          |CI$2A2
  4846  CMSG I GET_VALIDATE_DELETE_NO_CASCADE    |CI$2A3
  4847  CMSG V MSG_ADD_CLIENT_FILE               |CI$2A4     I
  4848  CMSG V MSG_REMOVE_CLIENT_FILE            |CI$2A5     I
  4849  CMSG I GET_CLIENT_FILE                   |CI$2A6     I
  4850  CMSG I GET_CLIENT_FILE_COUNT             |CI$2A7
  4851  CMSG V MSG_ADD_SERVER_FILE               |CI$2A8     I
  4852  CMSG V MSG_REMOVE_SERVER_FILE            |CI$2A9     I
  4853  CMSG I GET_SERVER_FILE                   |CI$2AA     I
  4854  CMSG I GET_SERVER_FILE_COUNT             |CI$2AB
  4855  CMSG I GET_PARENT_FILE                   |CI$2AC     I
  4856  CMSG I GET_PARENT_FILE_COUNT             |CI$2AD
  4857  CMSG V MSG_OPERATION_NOT_ALLOWED         |CI$2AE     I
  4858  CMSG V MSG_NEW_CURRENT_RECORD            |CI$2AF     I  I
  4859  CMSG V SET_EXTERNAL_CLASS_NAME           |CI$2B0     S  S
  4860  CMSG V SET_EXTERNAL_MESSAGE              |CI$2B1     I  I
  4861  CMSG V MSG_WINDOWS_MESSAGE               |CI$2B2     I  I  I
  4862  CMSG V SET_HEADER_LABEL                  |CI$2B3     I  S
  4863  CMSG S GET_HEADER_LABEL                  |CI$2B4     I
  4864  CMSG V SET_FORM_BITMAP                   |CI$2B5     I  S
  4865  CMSG V SET_HIGHLIGHT_ROW_STATE           |CI$2B6     I
  4866  CMSG I GET_HIGHLIGHT_ROW_STATE           |CI$2B7
  4867  CMSG V SET_HIGHLIGHT_ROW_COLOR           |CI$2B8     I
  4868  CMSG I GET_HIGHLIGHT_ROW_COLOR           |CI$2B9
  4869  CMSG V SET_HEADER_VISIBLE_STATE          |CI$2BA     I
  4870  CMSG I GET_HEADER_VISIBLE_STATE          |CI$2BB
  4871  CMSG V MSG_BEGIN_EVENT                   |CI$2BC     I
  4872  CMSG V MSG_END_EVENT                     |CI$2BD     I
  4873  CMSG V SET_FOCUS                         |CI$2BE     I  I
  4874  CMSG V SET_FORM_STYLE                    |CI$2BF     I  I
  4875  CMSG I GET_FORM_STYLE                    |CI$2C0     I
  4876  CMSG V SET_FORM_EXTENDED_STYLE           |CI$2C1     I  I
  4877  CMSG I GET_FORM_EXTENDED_STYLE           |CI$2C2     I
  4878  CMSG V SET_FORM_BORDER                   |CI$2C3     I  I
  4879  CMSG I GET_FORM_BORDER                   |CI$2C4     I
  4880  CMSG V SET_GRIDLINE_MODE                 |CI$2C5     I
  4881  CMSG I GET_GRIDLINE_MODE                 |CI$2C6
  4882  CMSG V MSG_CREATE_DIALOG                 |CI$2C7     I  I
  4883  CMSG I GET_MAPI_SEND_DOCUMENTS           |CI$2C8     S  S
  4884  CMSG I GET_MAPI_INITMESSAGE              |CI$2C9     S  S
  4885  CMSG I GET_MAPI_SEND_MAIL                |CI$2CA     I
  4886  CMSG I GET_MAPI_ADDRESS_BOOK              |CI$2CB     S  I
  4887  CMSG S GET_MAPI_FIND_NEXT                 |CI$2CC     S  I
  4888  CMSG S GET_MAPI_MESSAGE_SUBJECT          |CI$2CD
  4889  CMSG I GET_MAPI_READMAIL                 |CI$2CE     S  I
  4890  CMSG S GET_MAPI_MESSAGE_SENDERNAME       |CI$2CF
  4891  CMSG S GET_MAPI_MESSAGE_DATERECEIVED     |CI$2D0
  4892  CMSG V MSG_EDIT_TO_MAIL                  |CI$2D1     I
  4893  CMSG V MSG_MAIL_TO_EDIT                  |CI$2D2     I
  4894  CMSG I MSG_NOTIFY                        |CI$2D3     I  I
  4895  CMSG S GET_MAPI_MESSAGE_RECEIVERNAME     |CI$2D4     I
  4896  CMSG V SET_BITMAP_SIZE                   |CI$2D5     I  I
  4897  CMSG V SET_IMAGELIST_SIZE                |CI$2D6     I  I
  4898  CMSG V SET_IMAGELIST_TYPE                |CI$2D7     I
  4899  CMSG V MSG_IMAGELIST_CREATE              |CI$2D8
  4900  CMSG V MSG_IMAGELIST_DESTROY             |CI$2D9
  4901  CMSG V MSG_IMAGELIST_ADD                 |CI$2DA     S
  4902  CMSG V MSG_IMAGELIST_BEGINDRAG           |CI$2DB     I
  4903  CMSG V SET_IMAGELIST_DRAGOBJECT          |CI$2DC     I
  4904  CMSG V MSG_IMAGELIST_DRAGENTER           |CI$2DD     I  I
  4905  CMSG V MSG_IMAGELIST_DRAGMOVE            |CI$2DE     I  I
  4906  CMSG V MSG_IMAGELIST_DRAGLEAVE           |CI$2DF     I
  4907  CMSG V MSG_IMAGELIST_ENDDRAG             |CI$2E0
  4908  CMSG I GET_IMAGELIST_DRAGOBJECT          |CI$2E1
  4909  CMSG V SET_TOOLTIP_STATE                 |CI$2E2     I
  4910  CMSG I GET_TOOLTIP_STATE                 |CI$2E3
  4911  CMSG V SET_TOOLTIP_VALUE                 |CI$2E4     I  S
  4912  CMSG S GET_TOOLTIP_VALUE                 |CI$2E5     I
  4913  CMSG V SET_IMAGELIST                     |CI$2E6     I
  4914  CMSG V SET_FORM_IMAGE_INDEX              |CI$2E7     I  I
  4915  CMSG I GET_FORM_IMAGE_INDEX              |CI$2E8     I
  4916  CMSG V SET_BUTTON_STYLE                  |CI$2E9     I  I
  4917  CMSG I GET_BUTTON_STYLE                  |CI$2EA     I
  4918  CMSG V MSG_AUTO_SIZE                     |CI$2EB     I  I
  4919  CMSG V MSG_AUTO_PAGE                     |CI$2EC     I
  4920  CMSG V SET_TIMEOUT_VALUE                 |CI$2ED     I
  4921  CMSG I GET_TIMEOUT_VALUE                 |CI$2EE
  4922  CMSG V SET_LEFT_MARGIN                   |CI$2EF     I
  4923  CMSG I GET_LEFT_MARGIN                   |CI$2F0
  4924  CMSG V SET_STATUS_LINE_OBJECT            |CI$2F1     I
  4925  CMSG I GET_STATUS_LINE_OBJECT            |CI$2F2
  4926  CMSG V SET_WINDOWS_OVERRIDE_STATE        |CI$2F3     I
  4927  CMSG I GET_WINDOWS_OVERRIDE_STATE        |CI$2F4
  4928  CMSG I GET_MENU_HANDLE                   |CI$2F5
  4929  CMSG V MSG_INITIALIZE_MENU               |CI$2F6     I
  4930  CMSG V MSG_CHANGE_MENU                   |CI$2F7     I  I  I
  4931  CMSG V MSG_UNDO                          |CI$2F8
  4932  CMSG V MSG_DELETE                        |CI$2F9
  4933  CMSG V SET_HEADER_JUSTIFICATION_MODE     |CI$2FA     I  I
  4934  CMSG I GET_HEADER_JUSTIFICATION_MODE     |CI$2FB     I
  4935  CMSG V SET_BITMAP_FORMAT                 |CI$2FC     I
  4936  CMSG I GET_BITMAP_FORMAT                 |CI$2FD
  4937  CMSG V SET_PASSWORD_STATE                |CI$2FE     I  I
  4938  CMSG I GET_PASSWORD_STATE                |CI$2FF     I
  4939  CMSG V SET_MDI_STATE                     |CI$300     I
  4940  CMSG I GET_MDI_STATE                     |CI$301
  4941  CMSG V SET_MDI_LEFT_MARGIN               |CI$302     I
  4942  CMSG I GET_MDI_LEFT_MARGIN               |CI$303
  4943  CMSG V SET_MDI_TOP_MARGIN                |CI$304     I
  4944  CMSG I GET_MDI_TOP_MARGIN                |CI$305
  4945  CMSG V SET_MDI_RIGHT_MARGIN              |CI$306     I
  4946  CMSG I GET_MDI_RIGHT_MARGIN              |CI$307
  4947  CMSG V SET_MDI_BOTTOM_MARGIN             |CI$308     I
  4948  CMSG I GET_MDI_BOTTOM_MARGIN             |CI$309
  4949  CMSG V SET_MDI_WINDOW_PULLDOWN           |CI$30A     I
  4950  CMSG I GET_MDI_WINDOW_PULLDOWN           |CI$30B
  4951  CMSG V MSG_ARRANGE_ICONS                 |CI$30C
  4952  CMSG V MSG_CASCADE_WINDOWS               |CI$30D
  4953  CMSG V MSG_TILE_WINDOWS_HORIZONTAL       |CI$30E
  4954  CMSG V MSG_TILE_WINDOWS_VERTICAL         |CI$30F
  4955  CMSG V MSG_SWITCH_NEXT_VIEW              |CI$310
  4956  CMSG V MSG_SWITCH_PRIOR_VIEW             |CI$311
  4957  CMSG I GET_FORM_WINDOW_HANDLE            |CI$312     I
  4958  CMSG V MSG_NOTIFY_APPLICATION_ACTIVATION |CI$313     I
  4959  CMSG V SET_RESIZE_COLUMN_STATE           |CI$314     I
  4960  CMSG I GET_RESIZE_COLUMN_STATE           |CI$315
  4961  CMSG V SET_AUTOSIZE_HEIGHT_STATE         |CI$316     I
  4962  CMSG I GET_AUTOSIZE_HEIGHT_STATE         |CI$317
  4963  CMSG V SET_CURRENT_ITEM_COLOR            |CI$318     I
  4964  CMSG I GET_CURRENT_ITEM_COLOR            |CI$319
  4965  CMSG V MSG_INITIALIZE_SYSMENU            |CI$31A     I
  4966  CMSG V SET_UNDO_STATE                    |CI$31B     I
  4967  CMSG I GET_UNDO_STATE                    |CI$31C
  4968  CMSG V MSG_RESET_FIND                    |CI$31D
  4969  CMSG V MSG_RESET_REPLACE                 |CI$31E
  4970  CMSG V MSG_APPEND_TEXT                   |CI$31F     S
  4971  CMSG V MSG_SELECT                        |CI$320     I  I
  4972  CMSG I GET_EDIT_BUFFER_COUNT             |CI$321
  4973  CMSG V SET_EDIT_BUFFER_SIZE              |CI$322     I
  4974  CMSG I GET_EDIT_BUFFER_SIZE              |CI$323
  4975  CMSG V SET_TEXT_LIMIT                    |CI$324     I
  4976  CMSG I GET_TEXT_LIMIT                    |CI$325
  4977  CMSG V SET_EDIT_ERRSPACE_MESSAGE         |CI$326     I
  4978  CMSG I GET_EDIT_ERRSPACE_MESSAGE         |CI$327
  4979  CMSG V SET_TABSTOP                       |CI$328     I  I
  4980  CMSG I GET_TABSTOP                       |CI$329     I
  4981  CMSG V SET_FORMAT_ORIGIN                 |CI$32A     I  I  I
  4982  CMSG I GET_FORMAT_ORIGIN                 |CI$32B     I
  4983  CMSG V SET_FORMAT_SIZE                   |CI$32C     I  I  I
  4984  CMSG I GET_FORMAT_SIZE                   |CI$32D     I
  4985  CMSG V SET_HORZ_SCROLL_BAR_VISIBLE_STATE |CI$32E     I
  4986  CMSG I GET_HORZ_SCROLL_BAR_VISIBLE_STATE |CI$32F
  4987  CMSG V MSG_HEADER_NOTIFICATION           |CI$330     I  I
  4988  CMSG I GET_TIMEOUT_REQUEST               |CI$331     I  I
  4989  CMSG V SET_TIMEOUT_MESSAGE               |CI$332     I
  4990  CMSG I GET_TIMEOUT_MESSAGE               |CI$333
  4991  CMSG V MSG_MAPI_ADD_RECEIVER             |CI$334     I  S
  4992  CMSG I GET_CLIENT_SIZE                   |CI$335
  4993  CMSG V SET_EXTENDED_WINDOW_STYLE         |CI$336     I  I
  4994  CMSG I GET_EXTENDED_WINDOW_STYLE         |CI$337     I
  4995  CMSG V SET_DDE_TIMEOUT_VALUE             |CI$338     I
  4996  CMSG I GET_DDE_TIMEOUT_VALUE             |CI$339
  4997  CMSG V SET_DDE_TIMEOUT_OBJECT            |CI$33A     I
  4998  CMSG I GET_DDE_TIMEOUT_OBJECT            |CI$33B
  4999  CMSG V SET_ITEM_COLOR                    |CI$33C     I  I
  5000  CMSG V SET_FORM_MASK                     |CI$33D     I  S
  5001  CMSG S GET_FORM_MASK                     |CI$33E     I
  5002  CMSG V SET_FORM_BUTTON                   |CI$33F     I  I
  5003  CMSG V SET_FORM_BUTTON_VALUE             |CI$340     I  S
  5004  CMSG V SET_OEM_TRANSLATE_STATE           |CI$341     I
  5005  CMSG I GET_OEM_TRANSLATE_STATE           |CI$342
  5006  CMSG S GET_MASKED_VALUE                  |CI$343     I
  5007  CMSG V MSG_MOUSE_NCCHANGE_FOCUS          |CI$344     I
  5008  CMSG V MSG_MOUSE_NCUP                    |CI$345     I  I
  5009  CMSG V MSG_MOUSE_NCUP2                   |CI$346     I  I
  5010  CMSG V MSG_MOUSE_NCUP3                   |CI$347     I  I
  5011  CMSG V MSG_MOUSE_NCCLICK                 |CI$348     I  I
  5012  CMSG V MSG_MOUSE_NCCLICK2                |CI$349     I  I
  5013  CMSG V MSG_MOUSE_NCCLICK3                |CI$34A     I  I
  5014  CMSG V MSG_MOUSE_NCDOWN                  |CI$34B     I  I
  5015  CMSG V MSG_MOUSE_NCDOWN2                 |CI$34C     I  I
  5016  CMSG V MSG_MOUSE_NCDOWN3                 |CI$34D     I  I
  5017  CMSG V MSG_MOUSE_NCDRAG                  |CI$34E     I  I
  5018  CMSG V MSG_MOUSE_NCDRAG2                 |CI$34F     I  I
  5019  CMSG V MSG_MOUSE_NCDRAG3                 |CI$350     I  I
  5020  CMSG V SET_SENTINEL_PROGRAM              |CI$351     S
  5021  CMSG S GET_SENTINEL_PROGRAM              |CI$352
  5022  CMSG I GET_START_SENTINEL_PROGRAM        |CI$353
  5023  CMSG I GET_STOP_SENTINEL_PROGRAM         |CI$354
  5024  CMSG V SET_SENTINEL_RETURN_VALUE         |CI$355     I
  5025  CMSG I GET_SENTINEL_RETURN_VALUE         |CI$356
  5026  CMSG V MSG_NOTIFY_SELECT_STATE           |CI$357     I  I
  5027  CMSG V MSG_SELECT_ALL                    |CI$358
  5028  CMSG V SET_SENTINELDATA                  |CI$359     I  I  I
  5029  CMSG S GET_SENTINELDATA                  |CI$35A     I  I
  5030  CMSG V SET_HOSTDATA                      |CI$35B     I  I  I
  5031  CMSG S GET_HOSTDATA                      |CI$35C     I  I
  5032  CMSG V MSG_ONSENTINELDATACHANGE          |CI$35D     I  I
  5033  CMSG V SET_SENTINELWINDOW                |CI$35E     I
  5034  CMSG I GET_SENTINELWINDOW                |CI$35F
  5035  CMSG V MSG_FORM_BUTTON_NOTIFICATION      |CI$360     I  I
  5036  CMSG I GET_FORM_BUTTON_WINDOW_HANDLE     |CI$361     I
  5037  CMSG V SET_FORM_JUSTIFICATION_MODE       |CI$362     I  I
  5038  CMSG I GET_FORM_JUSTIFICATION_MODE       |CI$363     I
  5039  CMSG V MSG_FORM_BUTTON_MOUSE_DOWN        |CI$364     I
  5040  CMSG V SET_FORM_BUTTON_BITMAP            |CI$365     I  S
  5041  CMSG I MSG_ONDELTAPOS                    |CI$366     I  I
  5042  CMSG V SET_DEFAULT_ICONS                 |CI$367     I  I
  5043  CMSG I GET_DEFAULT_ICONS                 |CI$368
  5044  CMSG V SET_FORM_MASK_VALUE_STATE         |CI$369     I  I
  5045  CMSG I GET_FORM_MASK_VALUE_STATE         |CI$36A     I
  5046  CMSG V SET_MASKED_VALUE                  |CI$36B     I  S
  5047  CMSG V SET_UNMASKED_VALUE                |CI$36C     I  S
  5048  CMSG S GET_UNMASKED_VALUE                |CI$36D     I
  5049  CMSG V SET_MAIN_WINDOW                   |CI$36E     I
  5050  CMSG I GET_MAIN_WINDOW                   |CI$36F
  5051  CMSG V SET_BITMAP_STYLE                  |CI$370     I
  5052  CMSG I GET_BITMAP_STYLE                  |CI$371
  5053  CMSG I GET_BITMAP_WIDTH                  |CI$372
  5054  CMSG I GET_BITMAP_HEIGHT                 |CI$373
  5055  CMSG V SET_TRANSPARENT_STATE             |CI$374     I
  5056  CMSG I GET_TRANSPARENT_STATE             |CI$375
  5057  CMSG I GET_MAPI_RECEIVER_COUNT           |CI$376
  5058  CMSG V SET_MAPI_MESSAGE_RECEIVERNAME     |CI$377     I  S
  5059  CMSG V SET_MAPI_MESSAGE_RECEIVERADRESS   |CI$378     I  S
  5060  CMSG S GET_MAPI_MESSAGE_RECEIVERADRESS   |CI$379     I
  5061  CMSG V SET_MAPI_MESSAGE_RECEIVERTYPE     |CI$37A     I  I
  5062  CMSG I GET_MAPI_MESSAGE_RECEIVERTYPE     |CI$37B     I
  5063  CMSG V SET_MAPI_MESSAGE_SUBJECT          |CI$37C     S
  5064  CMSG V MSG_MAPI_REPLY                    |CI$37D
  5065  CMSG V MSG_MAPI_REMOVE_RECEIVERS         |CI$37E
  5066  CMSG V MSG_MAPI_REMOVE_ATTACHMENTS       |CI$37F
  5067  CMSG V MSG_MAPI_ADD_ATTACHMENT           |CI$380     S  S
  5068  CMSG I GET_MAPI_ATTACHMENT_COUNT         |CI$381
  5069  CMSG S GET_MAPI_ATTACHMENT_PATH          |CI$382     I
  5070  CMSG S GET_MAPI_ATTACHMENT_FILE          |CI$383     I
  5071  CMSG V SET_COMM_DCB                      |CI$384     I
  5072  CMSG V MSG_FILL_DCB                      |CI$385     I
  5073  CMSG V MSG_FILL_COMM_TIMEOUTS            |CI$386     I    // This is really a pointer to a COMMTIMEOUT struct
  5074  CMSG V SET_COMM_TIMEOUTS                 |CI$387     I    // same
  5075  CMSG V MSG_FILL_COMM_PROPERTIES          |CI$388     I    // same
  5076  CMSG V SET_COMM_MASK                     |CI$389     I
  5077  CMSG I GET_COMM_MASK                     |CI$38A
  5078  CMSG I GET_COMM_MODEM_STATUS             |CI$38B
  5079  CMSG V MSG_GENERATE_VIRTUAL_KEY          |CI$38C     I  I
  5080  CMSG V MSG_GENERATE_DF_KEY               |CI$38D     I  I
  5081  CMSG I GET_CURRENT_OFFSET                |CI$38E
  5082  CMSG I GET_CURRENT_SELECTION_RANGE       |CI$38F
  5083  CMSG V MSG_ONKEYUP                       |CI$390     I  I
  5084  CMSG V MSG_ONSYSKEYUP                    |CI$391     I  I
  5085  CMSG V MSG_ADD_POPUP_MENU                |CI$392     I  S
  5086  CMSG I GET_REG_KEY_ENUM                  |CI$393     I  S
  5087  CMSG I GET_REG_INTEGER_VALUE_ENUM        |CI$394     S  I
  5088  CMSG I GET_REG_STRING_VALUE_ENUM         |CI$395     S  S
  5089  CMSG V SET_DDE_SERVER_LINK               |CI$396     I
  5090  // Old internet client and NetMeeting removed...
  5091  CMSG V SET_PSUSERNAME                    |CI$3D7     S
  5092  CMSG S GET_PSUSERNAME                    |CI$3D8
  5093  CMSG V SET_PSPASSWORD                    |CI$3D9     S
  5094  CMSG S GET_PSPASSWORD                    |CI$3DA
  5095  CMSG V SET_PSACCEPTTYPES                 |CI$3DB     S
  5096  CMSG S GET_PSACCEPTTYPES                 |CI$3DC
  5097  CMSG I GET_DESTROY_RUBBER_BAND           |CI$3DD     I
  5098  CMSG I GET_CREATE_RUBBER_BAND            |CI$3DE     I
  5099  CMSG I GET_CREATE_RUBBER_BAND_MANUAL     |CI$3DF     I
  5100  CMSG I GET_TRACK_DF_WINDOW               |CI$3E0     I
  5101  CMSG I GET_TRACK_CURRENT_WINDOW          |CI$3E1
  5102  CMSG I GET_TRACK_NUMBER_OF_BANDS         |CI$3E2
  5103  CMSG I GET_TRACK_GET_RECTANGLE           |CI$3E3     I  I   // second param is actually a pointer
  5104  CMSG I GET_TRACK_SET_POSITION            |CI$3E4     I
  5105  CMSG V SET_BAND_POSITION                 |CI$3E5     I  I
  5106  CMSG V SET_BAND_SIZE                     |CI$3E6     I  I
  5107  CMSG V SET_BAND_TRANSPARENT_FLAG         |CI$3E7     I
  5108  CMSG V SET_BAND_SIZE_MOVE_FLAG           |CI$3E8     I
  5109  CMSG V SET_BAND_SIZE_MOVE_MIN            |CI$3E9     I  I
  5110  CMSG V SET_BAND_MULTISELECT_FLAG         |CI$3EA     I
  5111  CMSG I GET_VIRTUAL_KEY                   |CI$3EB
  5112  CMSG I GET_SHIFT_STATE                   |CI$3EC
  5113  CMSG S GET_OBJECT_LABEL                  |CI$3ED
  5114  CMSG I GET_OBJECT_ACCESS                 |CI$3EE
  5115  CMSG V MSG_HEADER_ENDTRACK               |CI$3EF
  5116
  5117
  5118  // Message number replacements without parameters.
  5119
  5120  //#REPLACE GET_ITEM_OPTIONS                GET_ITEM_OPTIONS@1
  5121  //#REPLACE GET_ITEM_ENTRY_MSG              GET_ITEM_ENTRY_MSG@1
  5122  //#REPLACE GET_ITEM_EXIT_MSG               GET_ITEM_EXIT_MSG@1
  5123  //#REPLACE GET_ITEM_VALIDATE_MSG           GET_ITEM_VALIDATE_MSG@1
  5124  //#REPLACE GET_CHECKBOX_ITEM_STATE         GET_CHECKBOX_ITEM_STATE@1
  5125  //#REPLACE MSG_PASTE                       MSG_PASTE@3
  5126  //#REPLACE MSG_CUT                         MSG_CUT@3
  5127  //#REPLACE MSG_COPY                        MSG_COPY@3
  5128
  5129
  5130  Define USE_RGB_COLORS // this determines if RGB support is being used
  5131
  5132  #IFDEF USE_RGB_COLORS
  5133
  5134  CMSG V SET_TextColor                     |CI$0266    I
  5135  CMSG I GET_TextColor                     |CI$0267
  5136  CMSG V SET_Color                         |CI$0268    I
  5137  CMSG I GET_Color                         |CI$0269
  5138  CMSG V SET_CURRENTCELLCOLOR              |CI$0318    I
  5139  CMSG I GET_CURRENTCELLCOLOR              |CI$0319
  5140  CMSG V SET_CURRENTCELLTEXTCOLOR          |CI$027D    I
  5141  CMSG I GET_CURRENTCELLTEXTCOLOR          |CI$027E
  5142  CMSG V SET_ITEMCOLOR                     |CI$033C    I  I
  5143  CMSG I GET_ITEMCOLOR                     |CI$0237    I
  5144  CMSG V SET_ITEMTEXTCOLOR                 |CI$027F    I  I
  5145  CMSG I GET_ITEMTEXTCOLOR                 |CI$0280    I
  5146  CMSG V SET_CURRENTROWCOLOR               |CI$02B8    I
  5147  CMSG I GET_CURRENTROWCOLOR               |CI$02B9
  5148  CMSG V SET_CURRENTROWTEXTCOLOR           |CI$027B    I
  5149  CMSG I GET_CURRENTROWTEXTCOLOR           |CI$027C
  5150
  5151  #ENDIF
  5152
  5153  CMSG  V  MSG_SETVSCROLLINFO                |CI$04A6    I I I //sav_cur_obj,
  5154  CMSG  V  MSG_SETVSCROLLPOS                 |CI$04A7    I
  5155  CMSG  V  MSG_SETVSCROLLBOX                 |CI$04A8    I I
  5156
  5157  // anchor logic added with VDFX
  5158  CMSG  V  SET_PEANCHORS                     |CI$51A
  5159  CMSG  I  GET_PEANCHORS                     |CI$51B
  5160  CMSG  V  SET_PBANCHORCREATED               |CI$51C
  5161  CMSG  I  GET_PBANCHORCREATED               |CI$51D
  5162  CMSG  V  SET_PBANCHORSTATE                 |CI$51E
  5163  CMSG  I  GET_PBANCHORSTATE                 |CI$51F
  5164  CMSG  V  SET_PIANCHORLEFT                  |CI$520
  5165  CMSG  I  GET_PIANCHORLEFT                  |CI$521
  5166  CMSG  V  SET_PIANCHORTOP                   |CI$522
  5167  CMSG  I  GET_PIANCHORTOP                   |CI$523
  5168  CMSG  V  SET_PIANCHORRIGHT                 |CI$524
  5169  CMSG  I  GET_PIANCHORRIGHT                 |CI$525
  5170  CMSG  V  SET_PIANCHORBOTTOM                |CI$526
  5171  CMSG  I  GET_PIANCHORBOTTOM                |CI$527
  5172  CMSG  V  SET_PIMINSIZE                     |CI$528
  5173  CMSG  I  GET_PIMINSIZE                     |CI$529
  5174  CMSG  V  SET_PIMAXSIZE                     |CI$52A
  5175  CMSG  I  GET_PIMAXSIZE                     |CI$52B
  5176  CMSG  I  MSG_DOCREATEANCHORS               |CI$518
  5177  CMSG  I  MSG_DOAPPLYANCHORS                |CI$519
  5178  CMSG  I  GET_GETCONTAINERCLIENTSIZE        |CI$538
  5179  // form button get values exposed
  5180  CMSG  I  GET_FORM_BUTTON                   |CI$052C
  5181  CMSG  I  GET_FORM_BUTTON_VALUE             |CI$052D
  5182  CMSG  I  GET_FORM_BUTTON_BITMAP            |CI$052E
  5183
  5184  // added to VDF 8.2
  5185  CMSG  I  GET_PEGRIDLINECOLOR               |CI$0545    // get/sets color of grid lines
  5186  CMSG  I  SET_PEGRIDLINECOLOR               |CI$0546
  5187  CMSG  I  GET_PEDISABLEDTEXTCOLOR           |CI$0547    // get/sets disabled (shadowed) text color
  5188  CMSG  I  SET_PEDISABLEDTEXTCOLOR           |CI$0548
  5189  CMSG  I  GET_PEDISABLEDCOLOR               |CI$0549    // get/sets disabled (shadowed) background color
  5190  CMSG  I  SET_PEDISABLEDCOLOR               |CI$054a
  5191  CMSG  I  GET_PBUSEDISABLEDCOLOR            |CI$054b
  5192  CMSG  I  SET_PBUSEDISABLEDCOLOR            |CI$054c
  5193  CMSG  I  MSG_ONWMMOUSEWHEEL                |CI$054d    // lowlevel mouse event for grids
  5194  // added 10.0
  5195  CMSG  X  MSG_SUSPENDGUI                    |CI$0587
  5196  CMSG  X  MSG_PUMPMSGQUEUE                  |CI$0588
  5197  // added 10.1
  5198  CMSG  X  GET_SELECTCLIENTCERTIFICATE       |CI$058c // http
  5199  CMSG  X  GET_PBSHOWERRORDIALOG             |CI$058d // http
  5200  CMSG  X  SET_PBSHOWERRORDIALOG             |CI$058e // http
  5201
  5202//  // Added 11.0 to support combos in grids and rich edit
  5203  CMSG X  SET_COLUMN_COMBO_STATE             |CI$05eb
  5204  CMSG X  GET_COLUMN_COMBO_STATE             |CI$05ec
  5205  CMSG X  MSG_COLUMN_COMBO_ADD_ITEM          |CI$05ed
  5206  CMSG X  MSG_COLUMN_COMBO_DELETE_ITEM       |CI$05ee
  5207  CMSG X  SET_COLUMN_COMBO_SORT_STATE        |CI$05ef
  5208  CMSG X  GET_COLUMN_COMBO_SORT_STATE        |CI$05f0
  5209  CMSG X  SET_COLUMN_COMBO_LISTROWCOUNT      |CI$05f1
  5210  CMSG X  GET_COLUMN_COMBO_LISTROWCOUNT      |CI$05f2
  5211  CMSG X  MSG_COLUMN_COMBO_DELETE_DATA       |CI$05f3
  5212  CMSG X  GET_COLUMN_COMBO_ITEM_COUNT        |CI$05f4
  5213  CMSG X  GET_COLUMN_COMBO_VALUE             |CI$05f5
  5214  CMSG X  GET_COLUMN_COMBO_FIND              |CI$05f6
  5215  CMSG X  MSG_COLUMN_COMBO_REFRESH           |CI$05f7
  5216  CMSG X  SET_COLUMN_COMBO_ENTRY_STATE       |CI$05f8
  5217  CMSG X  GET_COLUMN_COMBO_ENTRY_STATE       |CI$05f9
  5218  CMSG X  SET_PBCOMBONAVIGATION              |CI$05fa
  5219  CMSG X  GET_PBCOMBONAVIGATION              |CI$05fb
  5220
  5221  // rich edit messages
  5222  CMSG X   SET_PBBOLD					    |CI$058f
  5223  CMSG X   SET_PBSTRIKEOUT                  |CI$0590
  5224  CMSG X   SET_PBSUPERSCRIPT                |CI$0591
  5225  CMSG X   SET_PBSUBSCRIPT                  |CI$0592
  5226  CMSG X   SET_PBLINK                       |CI$0593
  5227  CMSG X   SET_PBPROTECT                    |CI$0594
  5228  CMSG X   SET_PEPITCHANDFAMILY  		    |CI$0595
  5229  CMSG X   SET_PECHARSET                    |CI$0596
  5230  CMSG X   GET_PBBOLD	    				|CI$0597
  5231  CMSG X   GET_PBSTRIKEOUT                  |CI$0598
  5232  CMSG X   GET_PBSUPERSCRIPT                |CI$0599
  5233  CMSG X   GET_PBSUBSCRIPT                  |CI$059a
  5234  CMSG X   GET_PBLINK                       |CI$059b
  5235  CMSG X   GET_PBPROTECT                    |CI$059c
  5236  CMSG X   GET_PEPITCHANDFAMILY  		    |CI$059d
  5237  CMSG X   GET_PECHARSET                    |CI$059e
  5238  CMSG X   SET_TEXTBACKCOLOR                |CI$059f
  5239  CMSG X   GET_TEXTBACKCOLOR                |CI$05a0
  5240
  5241  CMSG X   SET_PEBULLETS			    |CI$05a1
  5242  CMSG X   SET_PIPARAGRAPHINDENT        |CI$05a2
  5243  CMSG X   SET_PIRIGHTMARGIN            |CI$05a3
  5244  CMSG X   SET_PIOFFSETINDENT           |CI$05a4
  5245  CMSG X   SET_PEALIGNMENT              |CI$05a5
  5246  CMSG X   SET_PISPACINGBEFORE          |CI$05a6
  5247  CMSG X   SET_PISPACINGAFTER           |CI$05a7
  5248  CMSG X   SET_PILINESPACING      	    |CI$05a8
  5249  CMSG X   SET_PELINESPACINGTYPE        |CI$05a9
  5250  CMSG X   SET_PIBULLETSTART            |CI$05aa
  5251  CMSG X   SET_PEBULLETSTYLE            |CI$05ab
  5252  CMSG X   SET_PIBULLETTAB              |CI$05ac
  5253  CMSG X   GET_PEBULLETS			    |CI$05ad
  5254  CMSG X   GET_PIPARAGRAPHINDENT        |CI$05ae
  5255  CMSG X   GET_PIRIGHTMARGIN            |CI$05af
  5256  CMSG X   GET_PIOFFSETINDENT           |CI$05b0
  5257  CMSG X   GET_PEALIGNMENT              |CI$05b1
  5258  CMSG X   GET_PISPACINGBEFORE          |CI$05b2
  5259  CMSG X   GET_PISPACINGAFTER           |CI$05b3
  5260  CMSG X   GET_PILINESPACING            |CI$05b4
  5261  CMSG X   GET_PELINESPACINGTYPE        |CI$05b5
  5262  CMSG X   GET_PIBULLETSTART            |CI$05b6
  5263  CMSG X   GET_PEBULLETSTYLE            |CI$05b7
  5264  CMSG X   GET_PIBULLETTAB              |CI$05b8
  5265
  5266  CMSG X   GET_PBAUTOURL               |CI$05b9
  5267  CMSG X   SET_PBAUTOURL               |CI$05ba
  5268  CMSG X   SET_PBWRAP                  |CI$05bb
  5269  CMSG X   GET_PBWRAP                  |CI$05bc
  5270  CMSG X   GET_FINDTEXT                |CI$05bd
  5271  CMSG X   GET_REPLACEALL              |CI$05be
  5272  CMSG X   MSG_REPLACESEL              |CI$05bf
  5273  CMSG X   MSG_SETSEL                  |CI$05c0
  5274  CMSG X   GET_SELSTART                |CI$05c1
  5275  CMSG X   GET_SELEND                  |CI$05c2
  5276
  5277  CMSG X   GET_PBCANUNDO               |CI$05c3
  5278  CMSG X   MSG_CLEARUNDOBUFFER         |CI$05c4
  5279  CMSG X   GET_FIRSTVISIBLELINE        |CI$05c5
  5280  CMSG X   GET_LINE                    |CI$05c6
  5281  CMSG X   GET_LINEFROMCHAR            |CI$05c7
  5282  CMSG X   GET_FIRSTCHARINLINEPOS      |CI$05c8
  5283  CMSG X   GET_LINELENGTH              |CI$05c9
  5284  CMSG X   MSG_SCROLLLINES             |CI$05ca
  5285  CMSG X   MSG_SCROLLCARET             |CI$05cb
  5286  CMSG X   GET_PBCANPASTE              |CI$05cc
  5287  CMSG X   GET_PBCANREDO               |CI$05cd
  5288  CMSG X   GET_UNDOTYPE                |CI$05ce
  5289  CMSG X   GET_REDOTYPE                |CI$05cf
  5290  CMSG X   GET_SELTEXT                 |CI$05d0
  5291  CMSG X   GET_TEXTRANGE               |CI$05d1
  5292  CMSG X   MSG_HIDESELECTION           |CI$05d2
  5293  CMSG X   MSG_REDO                    |CI$05d3
  5294  CMSG X   MSG_STOPGROUPTYPING         |CI$05d4
  5295  CMSG X   GET_PAVALUE                 |CI$05d5
  5296  CMSG X   SET_PAVALUE                 |CI$05d6
  5297
  5298  CMSG X   MSG_ONLINKCLICKED           |CI$05d7
  5299
  5300  CMSG X   SET_PBITALICS               |CI$05dd
  5301  CMSG X   GET_PBITALICS               |CI$05de
  5302  CMSG X   SET_PBUNDERLINE             |CI$05df
  5303  CMSG X   GET_PBUNDERLINE             |CI$05e0
  5304  CMSG X   SET_PSTYPEFACE              |CI$05e1
  5305  CMSG X   GET_PSTYPEFACE              |CI$05e2
  5306  CMSG X   SET_PIFONTSIZE              |CI$05e3
  5307  CMSG X   GET_PIFONTSIZE              |CI$05e4
  5308  CMSG X   SET_PIFONTWEIGHT            |CI$05e5
  5309  CMSG X   GET_PIFONTWEIGHT            |CI$05e6
  5310
  5311  CMSG X   GET_CHARCOUNT               |CI$05e7
  5312  CMSG X   SET_PIMAXCHARS              |CI$05e8
  5313  CMSG X   GET_PIMAXCHARS              |CI$05e9
  5314  CMSG X   MSG_APPENDTEXT              |CI$05ea
  5315  CMSG X   MSG_ONSELECTIONCHANGED      |CI$05fd
  5316
  5317#ENDCOMMAND
  5318
  5319
  5320#COMMAND Define$BuiltIn$XML$Messages
  5321
  5322  CMSG  V SET_XMLINTERFACE                |CI$03F0  I
  5323  CMSG  I GET_XMLINTERFACE                |CI$03F1
  5324
  5325
  5326  // NODE Properties
  5327
  5328  CMSG  I  GET_PHATTRIBUTES                |CI$03F2
  5329  CMSG  S  GET_PSBASENAME                  |CI$03F3
  5330  CMSG  I  GET_PHCHILDNODES                |CI$03F4
  5331  CMSG  I  GET_PHDEFINITION                |CI$03F5
  5332  CMSG  I  GET_PHFIRSTCHILD                |CI$03F6
  5333  CMSG  I  GET_PHLASTCHILD                 |CI$03F7
  5334  CMSG  I  GET_PHNEXTSIBLING               |CI$03F8
  5335  CMSG  S  GET_PSNAMESPACEURI              |CI$03F9
  5336  CMSG  S  GET_PSNODENAME                  |CI$03FA
  5337  CMSG  I  GET_PINODETYPE                  |CI$03FB
  5338  CMSG  S  GET_PSNODETYPESTRING            |CI$03FC
  5339  CMSG  I  GET_PHOWNERDOCUMENT             |CI$03FD
  5340  CMSG  I  GET_PHPARENTNODE                |CI$03FE
  5341  CMSG  I  GET_PBPARSED                    |CI$03FF
  5342  CMSG  S  GET_PSPREFIX                    |CI$0400
  5343  CMSG  I  GET_PHPREVIOUSSIBLING           |CI$0401
  5344  CMSG  I  GET_PBSPECIFIED                 |CI$0402
  5345  CMSG  S  GET_PSTEXT                      |CI$0403
  5346  CMSG  S  GET_PSXML                       |CI$0404
  5347
  5348  // Node Read write properties
  5349
  5350  CMSG  V  SET_PSDATATYPE                  |CI$0405  S
  5351  CMSG  S  GET_PSDATATYPE                  |CI$0406
  5352  CMSG  V  SET_PVNODETYPEDVALUE            |CI$0407  I  I
  5353  CMSG  I  GET_PVNODETYPEDVALUE            |CI$0408  I
  5354  CMSG  V  SET_PSNODEVALUE                 |CI$0409  S
  5355  CMSG  S  GET_PSNODEVALUE                 |CI$040A
  5356
  5357  // Node Methods
  5358
  5359  CMSG  I   GET_APPENDCHILD                   |CI$040B  I
  5360  CMSG  I   GET_CLONEINFCNODE                 |CI$040C  I
  5361  CMSG  I   GET_HASCHILDNODES                 |CI$040D
  5362  CMSG  I   GET_INSERTBEFORE                  |CI$040E  I  I
  5363  CMSG  I   GET_REMOVECHILD                   |CI$040F  I
  5364  CMSG  I   GET_REPLACECHILD                  |CI$0410  I  I
  5365  CMSG  I   GET_SELECTNODES                   |CI$0411  S
  5366  CMSG  I   GET_SELECTSINGLENODE              |CI$0412  S
  5367
  5368  // Node Collections
  5369  // READONLY PROPERTIES
  5370
  5371  CMSG  I   GET_PHITEM                        |CI$0413  I
  5372  CMSG  I   GET_PILENGTH                      |CI$0414
  5373
  5374  CMSG  I   GET_ENUMNODELIST                  |CI$0415  I
  5375  CMSG  I   GET_RESET                         |CI$0416
  5376
  5377  // Named Node Map
  5378
  5379  CMSG  I   GET_NAMEDITEM                     |CI$0417  S
  5380  CMSG  I   GET_QUALIFIEDITEM                 |CI$0418  S  S
  5381  CMSG  I   GET_REMOVENAMEDITEM               |CI$0419  S
  5382  CMSG  I   GET_REMOVEQUALIFIEDITEM           |CI$041A  S  S
  5383  CMSG  I   GET_SETNAMEDITEM                  |CI$041B  I
  5384
  5385  // XML DOM Document
  5386  // Read only properties
  5387
  5388  CMSG  I   GET_PHDOCTYPE                     |CI$041C
  5389  CMSG  I   GET_PHIMPLEMENTATION              |CI$041D
  5390  CMSG  I   GET_PHPARSEERROR                  |CI$041E
  5391  CMSG  I   GET_PBREADYSTATE                  |CI$041F
  5392  CMSG  S   GET_PSURL                         |CI$0420
  5393
  5394  // Read Write Properties
  5395
  5396  CMSG  V   SET_PBASYNC                       |CI$0421  I
  5397  CMSG  I   GET_PBASYNC                       |CI$0422
  5398  CMSG  V   SET_PHDOCUMENTELEMENT             |CI$0423  I
  5399  CMSG  I   GET_PHDOCUMENTELEMENT             |CI$0424
  5400  CMSG  V   SET_PBPRESERVEWHITESPACE          |CI$0425  I
  5401  CMSG  I   GET_PBPRESERVEWHITESPACE          |CI$0426
  5402  CMSG  V   SET_PBRESOLVEEXTERNALS            |CI$0427  I
  5403  CMSG  I   GET_PBRESOLVEEXTERNALS            |CI$0428
  5404  CMSG  V   SET_PBVALIDATEONPARSE             |CI$0429  I
  5405  CMSG  I   GET_PBVALIDATEONPARSE             |CI$042A
  5406
  5407  // Events
  5408
  5409  CMSG  I   MSG_ONDATAAVAILABLE               |CI$042B
  5410  CMSG  I   MSG_ONREADYSTATECHANGE            |CI$042C
  5411
  5412  // Methods
  5413
  5414  CMSG  I   GET_ABORT                         |CI$042D
  5415  CMSG  I   GET_ELEMENTSBYTAGNAME             |CI$042E  S
  5416  CMSG  I   GET_LOADDOCUMENT                  |CI$042F  S
  5417  CMSG  I   GET_LOADXML                       |CI$0430  S
  5418  CMSG  I   GET_NODEFROMID                    |CI$0431  S
  5419  CMSG  I   GET_SAVEDOCUMENT                  |CI$0432  S
  5420
  5421  // Parse Error
  5422  // Read Only Properties
  5423
  5424  CMSG  I   GET_PIERRORCODE                   |CI$0433
  5425  CMSG  I   GET_PIFILEPOS                     |CI$0434
  5426  CMSG  I   GET_PILINE                        |CI$0435
  5427  CMSG  I   GET_PILINEPOS                     |CI$0436
  5428  CMSG  S   GET_PSREASON                      |CI$0437
  5429  CMSG  S   GET_PSSRCTEXT                     |CI$0438
  5430  CMSG  S   GET_PSERRORURL                    |CI$0439
  5431
  5432  // DOM Implementation
  5433  // Method
  5434
  5435  CMSG  I   GET_HASFEATURE                    |CI$043A  S S
  5436
  5437  // Methods
  5438
  5439  CMSG  S   GET_SUBSTRINGDATA                 |CI$043B  I I
  5440  CMSG  I   GET_APPENDDATA                    |CI$043C  S
  5441  CMSG  I   GET_INSERTDATA                    |CI$043D  I S
  5442  CMSG  I   GET_DELETEDATA                    |CI$043E  I I
  5443  CMSG  I   GET_REPLACEDATA                   |CI$043F  I I S
  5444
  5445  // Attributes
  5446
  5447  CMSG  S   GET_PSNAME                        |CI$0440
  5448
  5449  // Elements
  5450  // Read Only properties
  5451
  5452  CMSG  S   GET_PSTAGNAME                     |CI$0441
  5453
  5454  // Methods
  5455
  5456  CMSG  V   SET_ATTRIBUTEVALUE                |CI$0442  S S
  5457  CMSG  S   GET_ATTRIBUTEVALUE                |CI$0443  S
  5458  CMSG  I   GET_REMOVEATTRIBUTE               |CI$0444  S
  5459  CMSG  I   GET_ATTRIBUTENODE                 |CI$0445  S
  5460  CMSG  V   SET_ATTRIBUTENODE                 |CI$0446  I
  5461  CMSG  I   GET_REMOVEATTRIBUTENODE           |CI$0447  I
  5462  //CMSG  I   GET_ELEMENTSBYTAGNAME             |CI$0448  S
  5463
  5464  // DOM Text
  5465  // Methods
  5466
  5467  CMSG  I   GET_SPLITTEXT                     |CI$0449  I
  5468
  5469  // DOM Processing Instruction
  5470  // Read Only Properties
  5471  CMSG  S   GET_PSTARGET                      |CI$044A
  5472
  5473  // DOM Document Type
  5474  CMSG  I   GET_PHENTITIES                    |CI$044B
  5475  CMSG  I   GET_PHNOTATIONS                   |CI$044C
  5476
  5477  // DOM Notations
  5478
  5479  CMSG  S   GET_PSPUBLICID                    |CI$044D
  5480  CMSG  S   GET_PSSYSTEMID                    |CI$044E
  5481  CMSG  S   GET_PSNOTATIONNAME                |CI$044F
  5482
  5483  // added to document
  5484
  5485  CMSG  I   GET_CREATEATTRIBUTE               |CI$0450   S
  5486  CMSG  I   GET_CREATECDATASECTION            |CI$0451   S
  5487  CMSG  I   GET_CREATECOMMENT                 |CI$0452   S
  5488  CMSG  I   GET_CREATEDOCUMENTFRAGMENT        |CI$0453
  5489  CMSG  I   GET_CREATEELEMENT                 |CI$0454   S
  5490  CMSG  I   GET_CREATEENTITYREFERENCE         |CI$0455   S
  5491  CMSG  I   GET_CREATENODE                    |CI$0456   I  S  S
  5492  CMSG  I   GET_CREATEPROCESSINGINSTRUCTION   |CI$0457   S  S
  5493  CMSG  I   GET_CREATETEXTNODE                |CI$0458   S
  5494
  5495  // added to element (r/w property)
  5496
  5497  CMSG  V  SET_PSTEXT                        |CI$0459   S
  5498  CMSG  I  GET_CHANGENODETYPE              |CI$045A   I  I
  5499  CMSG  I  GET_PHELEMENTITEM                 |CI$045B   I
  5500
  5501  CMSG  S GET_TRANSFORMNODE                  |CI$04A9    I
  5502  CMSG  A GET_PAXML                          |CI$0502
  5503  CMSG  I GET_LOADXMLFROMADDRESS             |CI$0503    A
  5504  CMSG  I GET_TRANSFORMNODETOADDRESS         |CI$0517
  5505#ENDCOMMAND
  5506
  5507#COMMAND Define$BuiltIn$FlexCom2$Messages
  5508
  5509  CMSG  S   GET_PSPROGID                |CI$0554
  5510  CMSG  S   SET_PSPROGID                |CI$0555
  5511  CMSG  S   GET_pvComObject             |CI$0556
  5512  CMSG  S   SET_pvComObject             |CI$0557
  5513  CMSG  S   MSG_CREATECOMOBJECT         |CI$0558
  5514  CMSG  S   MSG_RELEASECOMOBJECT        |CI$0559
  5515  CMSG  S   MSG_COMADDREF               |CI$055a
  5516  CMSG  S   GET_COMQUERYINTERFACE       |CI$055b
  5517  CMSG  S   MSG_PREPAREPARAMS           |CI$055c
  5518  CMSG  S   MSG_DEFINEPARAM             |CI$055d
  5519  CMSG  S   GET_INVOKECOMMETHOD         |CI$055e
  5520  CMSG  S   MSG_INVOKECOMMETHOD         |CI$055e
  5521  CMSG  S   GET_COMPROPERTY             |CI$055f
  5522  CMSG  S   SET_COMPROPERTY             |CI$0560
  5523  CMSG  S   MSG_REGISTERCOMEVENT        |CI$0561
  5524  CMSG  S   GET_OLECONTAINER            |CI$0562
  5525  CMSG  S   GET_OLEFRAMECONTAINER       |CI$0563
  5526  CMSG  S   MSG_ONDFFOCUS               |CI$0564
  5527  CMSG  S   MSG_DISPLAYPROPERTYSHEET    |CI$0565
  5528  CMSG  S   MSG_CREATECOMOBJECTFROMFILE |CI$0566
  5529  CMSG  S   MSG_SAVETOFILE              |CI$0567
  5530  CMSG  S   MSG_SAVETORESOURCEFILE      |CI$0568
  5531  CMSG  S   GET_PSRESOURCEFILE          |CI$0569
  5532  CMSG  S   SET_PSRESOURCEFILE          |CI$056a
  5533  CMSG  S   GET_PSRESOURCENAME          |CI$056b
  5534  CMSG  S   SET_PSRESOURCENAME          |CI$056c
  5535  CMSG  S   SET_PSRESOURCEDATA          |CI$056d
  5536  CMSG  S   GET_PEAUTOCREATE            |CI$056e
  5537  CMSG  S   SET_PEAUTOCREATE            |CI$056f
  5538  CMSG  S   GET_PSLICENSEKEY            |CI$0570
  5539  CMSG  S   SET_PSLICENSEKEY            |CI$0571
  5540  CMSG  S   MSG_REGISTERPROPERTYCHANGEEVENT |CI$0572
  5541  CMSG  S   GET_PHDISPATCHDRIVER        |CI$0573
  5542  CMSG  S   MSG_CLEARDISPATCHDRIVER     |CI$0574
  5543  CMSG  S   MSG_ONCREATE                |CI$0575
  5544  CMSG  S   MSG_ONINPLACEACTIVATE       |CI$0576
  5545  CMSG  S   GET_COMLOADPICTURE          |CI$0577
  5546  CMSG  S   GET_COMACTIVEOBJECT         |CI$0578
  5547  CMSG  S   GET_PSEVENTID               |CI$057C
  5548  CMSG  S   SET_PSEVENTID               |CI$057D
  5549  CMSG  S   GET_PABASE64RESOURCEFROMFILE |CI$0644 // internal - added for 12.0 migration
  5550
  5551#ENDCOMMAND
  5552
  5553#COMMAND Define$BuiltIn$Transfer$Messages
  5554  // ftp and http transfer
  5555
  5556  CMSG  S   GET_PSREMOTEHOST                  |CI$045C
  5557  CMSG  V   SET_PSREMOTEHOST                  |CI$045D   S
  5558  CMSG  S   GET_PSAGENT                       |CI$045E
  5559  CMSG  V   SET_PSAGENT                       |CI$045F   S
  5560  CMSG  S   GET_PSPROXY                       |CI$0460
  5561  CMSG  V   SET_PSPROXY                       |CI$0461   S
  5562  CMSG  I   GET_PIREMOTEPORT                  |CI$0462
  5563  CMSG  V   SET_PIREMOTEPORT                  |CI$0463   I
  5564  CMSG  I   GET_PETRANSFERFLAGS               |CI$0464
  5565  CMSG  V   SET_PETRANSFERFLAGS               |CI$0465   I
  5566  CMSG  I   GET_PIBUFFERSIZE                  |CI$0466
  5567  CMSG  V   SET_PIBUFFERSIZE                  |CI$0467   I
  5568  CMSG  I   GET_ROOTHANDLE                    |CI$0468
  5569  CMSG  I   GET_LASTERRORCODE                 |CI$0469
  5570
  5571  CMSG  I   GET_FILESIZE                      |CI$046A   S
  5572  CMSG  I   GET_FILEATTRIBUTES                |CI$046B   S
  5573  CMSG  I   GET_PETRANSFERTYPE                |CI$046C
  5574  CMSG  V   SET_PETRANSFERTYPE                |CI$046D   I
  5575  CMSG  I   GET_PBPASSIVEMODE                 |CI$046E
  5576  CMSG  V   SET_PBPASSIVEMODE                 |CI$046F   I
  5577  CMSG  I   GET_CONNECTIONHANDLE              |CI$0470
  5578  CMSG  I   GET_CONNECT                       |CI$0471
  5579  CMSG  I   GET_DISCONNECT                    |CI$0472
  5580  CMSG  S   GET_CURRENTDIRECTORY              |CI$0473
  5581  CMSG  I   GET_CHANGEDIRECTORY               |CI$0474   S
  5582  CMSG  I   GET_UPLOADFILE                    |CI$0475   S  S
  5583  CMSG  I   GET_DOWNLOADFILE                  |CI$0476   S  S
  5584  CMSG  I   GET_CREATEFTPDIRECTORY            |CI$0477   S
  5585  CMSG  I   GET_REMOVEFTPDIRECTORY            |CI$0478   S
  5586  CMSG  I   GET_RENAMEFTPFILE                 |CI$0479   S  S
  5587  CMSG  I   GET_DELETEFTPFILE                 |CI$047A   S
  5588  CMSG  S   GET_FINDFIRSTFTPFILE              |CI$047B   S
  5589  CMSG  S   GET_FINDNEXTFTPFILE               |CI$047C
  5590  CMSG  V   MSG_ENDFTPFILEFIND                |CI$047D
  5591  CMSG  I   GET_FTPFILEEXIST                  |CI$047E   S
  5592  CMSG  V   MSG_DIRECTORYLIST                 |CI$047F   S
  5593  CMSG  V   MSG_CANCELTRANSFER                |CI$0480
  5594  CMSG  V   MSG_ONTRANSFERSTATUS              |CI$0481   I  I
  5595  CMSG  V   MSG_ONDIRECTORYLIST               |CI$0482   S  I
  5596
  5597  CMSG  S   GET_PSPROTOCOLVERSION             |CI$0483
  5598  CMSG  V   SET_PSPROTOCOLVERSION             |CI$0484   S
  5599  CMSG  S   GET_PSSAVEASFILE                  |CI$0485
  5600  CMSG  V   SET_PSSAVEASFILE                  |CI$0486   S
  5601  CMSG  I   GET_ADDHEADER                     |CI$0487   S S
  5602  CMSG  V   MSG_CLEARHEADERS                  |CI$0488
  5603  CMSG  I   GET_HTTPGETREQUEST                |CI$0489   S
  5604  //SF - The arguments are not used, see command cmsg for definition,
  5605  //nowadays it just makes a replace, so we simply supply bogus arguments
  5606  CMSG  X   GET_HTTPPOSTADDRREQUEST           |CI$048A
  5607  CMSG  X   GET_HTTPPUTADDRREQUEST            |CI$048B
  5608  CMSG  X   MSG_ONDATARECEIVED                |CI$048C
  5609  // added to 10.0
  5610  CMSG  X   GET_RESPONSEHEADER                |CI$0589
  5611  CMSG  X   GET_RESPONSESTATUSCODE            |CI$058a
  5612
  5613
  5614#ENDCOMMAND
  5615
  5616
  5617#COMMAND Define$BuiltIn$WAS$Messages
  5618  CMSG  V  MSG_START_WEBAPP_SESSION          |CI$048D
  5619  CMSG  V  MSG_OUTPUTHTML                    |CI$048E  S
  5620  CMSG  V  MSG_OUTPUTPLAINTEXT               |CI$048F  S
  5621  CMSG  V  MSG_LOGEVENT                      |CI$0490  I S
  5622  CMSG  S  GET_HTMLFORMVALUE                 |CI$0491  S
  5623  CMSG  S  GET_HTMLQUERYSTRING               |CI$0492  S
  5624  CMSG  V  MSG_OUTPUTIMAGE                   |CI$0493  S
  5625  CMSG  V  MSG_OUTPUTTEXTFILE                |CI$0494  S
  5626  CMSG  V  MSG_REQUESTFILERECORDS            |CI$0495  I
  5627  CMSG  V  MSG_REQUESTFILEFIELDVALUES        |CI$0496  I
  5628  CMSG  S  GET_HTTPCOOKIE                    |CI$0497  S S
  5629  CMSG  V  SET_HTTPCOOKIE                    |CI$0498   V
  5630  CMSG  V  SET_HTTPCOOKIEATTRIB              |CI$0499   V
  5631  CMSG  S  GET_HTTPSERVERVARIABLE            |CI$049A   S
  5632  CMSG  V  MSG_ONSETFILERECORDID             |CI$049B   V
  5633  CMSG  V  MSG_ONSETFILEFIELDVALUE           |CI$049C   V
  5634  CMSG  S  GET_ONDDVALUE                     |CI$049D   V
  5635  CMSG  I  GET_ONREQUESTDELETE               |CI$049E   S S
  5636  CMSG  I  GET_ONREQUESTFIND                 |CI$049F   V
  5637  CMSG  I  GET_ONREQUESTSAVE                 |CI$04A0   S S
  5638  CMSG  I  GET_ONDOPROCESS                   |CI$04A1   V
  5639  CMSG  I  GET_ONREQUESTCLEAR                |CI$04A2   V
  5640  CMSG  I  GET_ONDFFUNC                      |CI$04A3   S S
  5641  CMSG  I  GET_ONREQUESTFINDBYRECID          |CI$04A4   V
  5642  CMSG  I  GET_ONREQUESTDDUPDATE             |CI$04A5   V
  5643
  5644
  5645
  5646  CMSG  V MSG_ONATTACHSESSION                |CI$0500
  5647  CMSG  V MSG_ONDETACHSESSION                |CI$0501
  5648  CMSG  I GET_DOCALL                         |CI$0504    A
  5649  CMSG  S GET_INTERFACEMESSAGENAME           |CI$0505    S
  5650  CMSG  I GET_INTERFACEMESSAGEID             |CI$0506    I
  5651  CMSG  S GET_INTERFACEMESSAGEPARAMS         |CI$0507    S
  5652  CMSG  S GET_INTERFACEMESSAGECOMMENT        |CI$0508    S
  5653  CMSG  I GET_FINDSERVICEINDEX               |CI$0509    S
  5654  CMSG  I GET_FINDMESSAGEID                  |CI$050A    S
  5655  CMSG  V MSG_REGISTERSIMPLEINTERFACE        |CI$050B    V
  5656  CMSG  V MSG_REMOVEINTERFACE                |CI$050C    I
  5657  CMSG  V MSG_REMOVEALLINTERFACES            |CI$050D
  5658  CMSG  V SET_PHOWEBSERVICEIMPLEMENTOR       |CI$050E    I
  5659  CMSG  I GET_PHOWEBSERVICEIMPLEMENTOR       |CI$050F
  5660  CMSG  V MSG_REGISTERINTERFACE              |CI$0510    V
  5661  CMSG  I GET_MIMICCALL                      |CI$0511    V
  5662  CMSG  I GET_INTERFACEMESSAGECOUNT          |CI$0512
  5663  CMSG  I GET_WEBREQUESTARGUMENTCOUNT        |CI$0513
  5664  CMSG  S GET_WEBREQUESTSERVICENAME          |CI$0514
  5665  CMSG  S GET_WEBREQUESTARGUMENT             |CI$0515    I
  5666  CMSG  I GET_INTERFACEMESSAGEISEXTENDED     |CI$0516    I
  5667  // added to 10.0 for Webservice support
  5668  CMSG  X GET_DESERIALIZEXML                 |CI$057e
  5669  CMSG  X GET_SERIALIZEXML                   |CI$057f
  5670  CMSG  X MSG_DISPOSEOBJECT                  |CI$0580
  5671  CMSG  X MSG_WEBSERVICEEXCEPTION            |CI$058B
  5672
  5673  CMSG  X GET_INTERFACEMESSAGEPARAMCOUNT     |CI$0581
  5674  CMSG  X GET_INTERFACEMESSAGEPARAMTYPE      |CI$0582
  5675  CMSG  X GET_INTERFACEMESSAGEPARAMTYPENAME  |CI$0583
  5676  CMSG  X GET_INTERFACEMESSAGEPARAMDIMCOUNT  |CI$0584
  5677  CMSG  X GET_INTERFACEMESSAGEPARAMNAME      |CI$0585
  5678  CMSG  X GET_INTERFACETYPEDEFINITIONS       |CI$0586
  5679  CMSG  X GET_INTERFACEMESSAGEPARAMBYREF     |CI$05fc
  5680
  5681
  5682
  5683  CMSG  X GET_CURRENTROWID                   |CI$05d8
  5684  CMSG  X GET_HASRECORD                      |CI$05d9
  5685  CMSG  X MSG_ONNEWCURRENTRECORD             |CI$05da
  5686  CMSG  X MSG_FINDBYROWID                    |CI$05db
  5687  CMSG  X MSG_READBYROWID                    |CI$05dc
  5688
  5689  CMSG  X GET_DFSTRICMP                      |CI$05fe
  5690
  5691  // File Drag&Drop Support: added to 12.0
  5692  CMSG  X  GET_PBACCEPTDROPFILES             |CI$0648
  5693  CMSG  X  SET_PBACCEPTDROPFILES             |CI$0649
  5694  CMSG  X  MSG_ONFILEDROPPED                 |CI$064a
  5695  CMSG  X  MSG_ONFILEDROPPEDINTERNAL         |CI$064b
  5696
  5697  // Send EnableNewModalityLogic turns on and off the new modality logic which determines if
  5698  // disabling the main_window also disables windows in other ownerless top level windows. By default this
  5699  // is True and it should only be changed with the greatest of care and reset ASAP. This is used to make
  5700  // the old winprint viewer work.
  5701  CMSG  X  MSG_ENABLENEWMODALITYLOGIC        |CI$64e
  5702  
  5703  // Support for cIdleHandler added 12.1
  5704  CMSG  X  SET_PBENABLED                     |CI$601
  5705  CMSG  X  GET_PBENABLED                     |CI$61f
  5706  CMSG  X  MSG_ONIDLE                        |CI$61c 
  5707  // added to all UI objects to better support menus 
  5708  CMSG  X  GET_CANUNDO                       |CI$67a
  5709  CMSG  X  GET_CANCOPY                       |CI$67b
  5710  CMSG  X  GET_CANDELETE                     |CI$67c
  5711  CMSG  X  GET_CANCUT                        |CI$67d
  5712  CMSG  X  GET_CANPASTE                      |CI$67e
  5713  CMSG  X  GET_CANSELECT                     |CI$67f
  5714  CMSG  X  GET_CANREDO                       |CI$680
  5715 
  5716  // added 14.0
  5717  
  5718  CMSG  X  MSG_SETHSCROLLBOX                 |CI$0685
  5719  CMSG  X  Get_pbSizeToClientArea            |CI$68E
  5720  CMSG  X  Set_pbSizeToClientArea            |CI$68F
  5721  CMSG  X  Get_GuiWindowSize                 |CI$690
  5722  CMSG  X  Get_DialogToGui                   |CI$691
  5723  CMSG  X  Get_GuiToDialog                   |CI$692
  5724  // this is the same as get_client_size. We added another name
  5725  // and will be considering the old name to be obsolete. This one
  5726  // is clearer
  5727  CMSG  X  Get_GuiClientSize                 |CI$335
  5728
  5729  // added in 15.1 for MSXML6 support 
  5730  CMSG X Get_psDomSecondLevelProperty       |CI$06a1
  5731  CMSG X Set_psDomSecondLevelProperty       |CI$06a2
  5732  CMSG X Get_pbDomSecondLevelProperty       |CI$06a3
  5733  CMSG X Set_pbDomSecondLevelProperty       |CI$06a4
  5734  CMSG X Get_piDomSecondLevelProperty       |CI$06a5
  5735  CMSG X Set_piDomSecondLevelProperty       |CI$06a6
  5736  CMSG X Get_AddExternalSchemaFile          |CI$06a7
  5737  CMSG X Get_AddExternalSchemaDocument      |CI$06a8
  5738  CMSG X Get_ValidateDocument               |CI$06a9
  5739  CMSG X Get_piErrorCount                   |CI$06aa
  5740  CMSG X Get_ErrorItem                      |CI$06ab
  5741  CMSG X Get_psErrorXPath                   |CI$06ac
  5742
  5743  // added 16.1 
  5744  CMSG X Get_PARENT_CHANGED_STATE           |CI$06b5
  5745
  5746#ENDCOMMAND
  5747
  5748
  5749// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5750//
  5751//   Command:
  5752//     Object ObjectName IS [A|AN] ObjectClass {ImageName} {SubImageNames...}
  5753//
  5754//   Parameters:
  5755//     ObjectName is a string.
  5756//     ObjectClass is an integer.
  5757//     ImageName is a string.
  5758//
  5759//   Description:
  5760//
  5761// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5762
  5763// JJT-5.1
  5764//#COMMAND OBJECT R "IS" "A""AN" RVD#I
  5765//  #IF (!0<5)                // if no image try to aquire one
  5766//    OBJECT !1 !2 !3 !4 !1
  5767//  #ELSE
  5768//    #DATA               // start up the data stream
  5769//    #PUSH !Zj               // save the unique object label
  5770//    #PUSH !b                // save current definition state
  5771//    #IF (!b = 4)            // if in procedure and not class
  5772//      #SET ZJ$ 0                // do not inc z
  5773//    #ELSE
  5774//      #SET ZJ$ !ZB          // assign the next object id
  5775//    #ENDIF
  5776//    #PUSH !Zb               // save this level on stack
  5777//    #IFDEF !4.AGG           // was this a class with sub objects?
  5778//      #SET ZB$ !4.AGG           // sub objects will begin at the
  5779//    #ELSE               // next object after superclass
  5780//      #SET ZB$ 0                // base classes start at 0
  5781//    #ENDIF
  5782//    #SET ZI$ !ZI                // count this object at the current level
  5783//    #PUSH !Zi               // and push the level
  5784//    #IF (!b > 0)            // if (in_object | in_class)
  5785//      #IF (!b & 2)              // obj_flag == in_class?
  5786//        #IF (!b & 1)              // obj_flag == in_Object?
  5787//        #ELSE           // No Name for Subobject in constructor
  5788//          #REPLACE !$.!1.OBJ |CI-!Zj  // object_name = -current_object
  5789//        #ENDIF
  5790//      #ENDIF
  5791//// (LS) removed setting of ZJ; it is NOT being used.
  5792//// (Removed when max lines increased > 32k)
  5793////      #SET ZJ$ (32766-!a)           // a very unique label for this object
  5794//      #DPUSH |CS".!1"           // make name from parent and child
  5795//    #ELSE               // global object name
  5796//      #DPUSH |CS"!1"            // assign an absolute name to object
  5797//    #ENDIF
  5798//    #CHECK U_!4 _U          // does class exist?
  5799//    #DPUSH U_!4             // define then class the class id
  5800//    GET$OBJ$IMAGE !5            // define the objects image
  5801//    #IF ((!b & 3) = 2)          // if in_class & !in_object
  5802//      #DPUSH !$.!1.OBJ          // pick the assigned dependant number
  5803//    #ELSE               //
  5804//      #IF (!b = 0)          // A global object must assign #
  5805//        #IFDEF !1.OBJ           // Is the symbol defined, name_object?
  5806//          #DPUSH |CI0           // pick the next dependant number
  5807//        #ELSE
  5808//          #DPUSH |CI!Zj         // force the dependant number
  5809////          #SET ZJ$ ($1000+!Zj)       // mark as global object
  5810//          #SET ZJ$ ($10000000+!Zj)   // using 32-bit ids now
  5811//          #REPLACE !1.OBJ |CI!Zj        // Assign an ID to this object
  5812//        #ENDIF
  5813//      #ELSE
  5814//        #DPUSH |CI0         // pick the next dependant number
  5815//      #ENDIF
  5816//    #ENDIF
  5817//    REGISTER_OBJECT !1
  5818//    #DPUSH GET_!1
  5819//    #SET B$ (!b | 1)            // we are in a object definition
  5820//    !A [] OBJ$CREATE |VL        // create the object now
  5821
  5822//    #IFDEF !1.OBJ
  5823//      #IFCLASS !1.OBJ V$        // does this object have a global?
  5824//        MOVE CURRENT_OBJECT TO !1.OBJ   // Move the object id to its global
  5825//      #ENDIF
  5826//    #ENDIF
  5827
  5828//    #SPUSH   //save the old class name
  5829//    #SET $$ !4
  5830//    #IFSUB '!$$SC' // if flex-defined class
  5831//      #IFSUB '!$$SM' // if begin-instance macro exists
  5832//        !$$SM !$ !5 !6 !7 !8 !9
  5833//      #ELSE
  5834//        FORWARD_BEGIN_CONSTRUCT !$ !5 !6 !7 !8 !9
  5835//      #ENDIF
  5836//    #ELSE
  5837//      ADD$IMAGE$ARGS MSG_CONSTRUCT_OBJECT !5 !6 !7 !8 !9  //else use default
  5838//    #ENDIF
  5839//  #ENDIF
  5840//#ENDCOMMAND
  5841
  5842#COMMAND GET$OBJ$IMAGE          // identify the image type
  5843  #IFDEF !1             // is it a int (dynamic?)
  5844    #DPUSH !1
  5845  #ELSE
  5846    #IFDEF !1.N             // try typical naming scheme
  5847      #DPUSH !1.N
  5848    #ELSE
  5849      #DPUSH |CI0           // not found, make it dynamic
  5850    #ENDIF
  5851  #ENDIF
  5852#ENDCOMMAND
  5853
  5854#COMMAND ADD$IMAGE$ARGS         // pass sub image args to constructor
  5855  #IF (!0>0)                // while there are args to process
  5856    #IFDEF !1               // image name a int?
  5857      #IFSAME !1 MSG_CONSTRUCT_OBJECT   // a special flag to get it going
  5858        #DATA               // start the data stream
  5859      #ENDIF
  5860      #DPUSH !1             // save the message or image id
  5861    #ELSE
  5862      #IFDEF !1.N           // typical image name
  5863        #DPUSH !1.N
  5864      #ELSE
  5865        #DPUSH |CI0         // dynamic image name
  5866      #ENDIF
  5867    #ENDIF
  5868    ADD$IMAGE$ARGS !2 !3 !4 !5 !6 !7 !8 !9
  5869  #ELSE
  5870    !A [] OBJ$SEND CURRENT_OBJECT |VL
  5871  #ENDIF
  5872#ENDCOMMAND
  5873
  5874// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5875//
  5876//   Command:
  5877//  Register_Object Object_Name
  5878//
  5879//   Parameters:
  5880//
  5881//   Description:
  5882//
  5883// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5884
  5885// JJT-5.1
  5886//#COMMAND REGISTER_OBJECT R
  5887//  #IFDEF UI.EXISTS
  5888//  #ELSE
  5889//    USE UI
  5890//  #ENDIF
  5891//  #IFDEF GET_!1
  5892//  #ELSE
  5893//    #REPLACE GET_!1 |CI!ZH
  5894//    #FREG GET_!1 RETURNS INTEGER
  5895//  #ENDIF
  5896//#ENDCOMMAND
  5897
  5898// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5899//
  5900//   Command:
  5901//     ITEM_LIST
  5902//
  5903//   Parameters:
  5904//     None.
  5905//
  5906//   Description:
  5907//     This is the startment that markes the beginning of a list of
  5908//     items to be attached to the current object.  A list class object
  5909//     can not have a item list.
  5910//
  5911// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5912
  5913// JJT-5.1
  5914//#COMMAND ITEM_LIST .
  5915//  #PUSH !Zg
  5916//  #PUSH !Zj
  5917//  #SET ZJ$ !a
  5918//  #PUSH !Zj
  5919//  #SET ZG$ 0              // Set the item counter to zero.  This is used to
  5920//                         // count and assign ID's to the items.
  5921//  !A [] OBJ$ILIST |CI0   // Create the command to save the item count,
  5922//  #FREF OBJ$!Zj$INUM !a    // and tell flex to update it later.
  5923//#ENDCOMMAND
  5924
  5925// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5926//
  5927//   Command:
  5928//    ON_Item {Value} {[SEND Message {TO Object} | BEGIN_PULL_DOWN Pull_Down_Name {Pull_Down_Image}]}
  5929//
  5930//   Parameters:
  5931//     Value is a string.
  5932//     Message is a integer.
  5933//     Object is a integer.
  5934//
  5935//   Description:
  5936//     The ITEM command adds the next item to the current object list.
  5937//     The Message is the value which will be passed to the handler
  5938//     if this item is selected.
  5939//
  5940// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  5941
  5942//#COMMAND ON_ITEM NDI """SEND""BEGIN_PULL_DOWN"
  5943//  #IF (!0<2)
  5944//    #IF (!0<1)
  5945//      ON_ITEM '' SEND MSG_NONE
  5946//    #ELSE
  5947//      ON_ITEM !1 SEND MSG_NONE
  5948//    #ENDIF
  5949//  #ELSE
  5950//    #IFSAME !1 SEND
  5951//      ON_ITEM '' !1 !2 !3 !4 !5 !6 !7 !8 !9
  5952//    #ELSE
  5953//      #IFSAME !2 SEND
  5954//        #SET ZG$ !ZG                   // Increment the item counter
  5955//        #IFSAME !4 TO
  5956//          #CHECK !6 .
  5957//          #DATA
  5958//          #IFDEF !3
  5959//            #DPUSH !3           // Push the (variable) message
  5960//          #ELSE
  5961//            #IFDEF MSG_!3
  5962//              #DPUSH MSG_!3     // Push the constant message
  5963//            #ELSE
  5964//              #DPUSH |CI0
  5965//              #FREF MSG_!3 !a,0     // Forward fef the message
  5966//            #ENDIF
  5967//          #ENDIF
  5968//          #IFDEF !5
  5969//            #DPUSH !5           // Push the (expression, var) dest object
  5970//          #ELSE
  5971//            #IFDEF !5.OBJ
  5972//              #DPUSH !5.OBJ     // Push the global object
  5973//            #ELSE
  5974//              #DPUSH |CI0
  5975//              #FREF !5.OBJ !a,1     // Forward ref the object
  5976//            #ENDIF
  5977//          #ENDIF
  5978//          !A [] OBJ$ITEM_EXEC !1 |VL
  5979//        #ELSE
  5980//          #IF (!0 > 3)
  5981//            #CHECK !4 "TO"
  5982//          #ENDIF
  5983//          #IFDEF MSG_!3
  5984//            !A [] OBJ$ITEM MSG_!3 !1       // Create the item passing name and value.
  5985//          #ELSE
  5986//            #IFDEF !3
  5987//              !A [] OBJ$ITEM !3 !1         // Create the item passing name and value.
  5988//            #ELSE
  5989//              !A [] OBJ$ITEM |CI0 !1       // Create the item passing name and value.
  5990//              #FREF MSG_!3 !a              // fix value later with procedure address
  5991//            #ENDIF
  5992//          #ENDIF
  5993//        #ENDIF
  5994//      #ELSE
  5995//        #IFSAME !2 BEGIN_PULL_DOWN
  5996//          #CHECK !3 _R
  5997//          REGISTER_OBJECT !3
  5998//          ON_ITEM !1 SEND ACTIVATE_PULL_DOWN TO (!3(CURRENT_OBJECT))
  5999//          #IFSUB 'END_MENU'
  6000//            CREATE_MENU !3 SUB_LOCATION !4 !5 !6 !7 !8 !9
  6001//          #ELSE
  6002//            #ERROR DFERR_COMP_INVALID_ARGUMENT "BEGIN_PULL_DOWN" REQUIRES MENU_SYSTEM PACKAGE
  6003//          #ENDIF
  6004//        #ENDIF
  6005//      #ENDIF
  6006//    #ENDIF
  6007//  #ENDIF
  6008//#ENDCOMMAND
  6009
  6010// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6011//
  6012//   Command:
  6013//      Repeat_Item Count# TIMES {Item_Syntax}
  6014//
  6015//   Parameters:
  6016//
  6017//   Description:
  6018//
  6019// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6020
  6021#COMMAND REPEAT_ITEM _RNDE "TIMES"
  6022  ON_ITEM !3 !4 !5 !6 !7 !8 !9
  6023  #SET Q$ (!1-1)
  6024  #IF (!q>0)
  6025    REPEAT_ITEM !q TIMES !3 !4 !5 !6 !7 !8 !9
  6026  #ENDIF
  6027#ENDCOMMAND
  6028
  6029// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6030//
  6031//   Command:
  6032//  Entry_Item File.Field {Entry_Options}
  6033//
  6034//   Parameters:
  6035//
  6036//   Description:
  6037//
  6038// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6039
  6040// JJT-5.1
  6041//#COMMAND ENTRY_ITEM R
  6042//  #SET ZG$ !ZG
  6043//  #DATA
  6044//  #IFCLASS !1 "EC"
  6045//    #ENTOPT {$C0A0=!1,$C002,$C003,!2}
  6046//  #ELSE
  6047//    #ENTOPT {$C0A0=!1,!2}
  6048//  #ENDIF
  6049//  !A [] OBJ$ENTRY$ITEM |CI0 |VL
  6050//#ENDCOMMAND
  6051
  6052// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6053//
  6054//   Command:
  6055//     END_ITEM_LIST
  6056//
  6057//   Parameters:
  6058//     None.
  6059//
  6060//   Description:
  6061//     The END_ITEM_LIST command marks the end of a list of items.
  6062//
  6063// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6064
  6065// JJT-5.1
  6066//#COMMAND END_ITEM_LIST .
  6067//  #POP ZJ$
  6068//  #REPLACE OBJ$!Zj$INUM |CI!Zg     // Update the count in the ITEM_LIST cmd.
  6069//  !A [] OBJ$ENDILIST OBJ$!Zj$INUM         // Tell runtime this is the end of list.
  6070//  #POP ZJ$
  6071//  #POP ZG$
  6072//#ENDCOMMAND
  6073
  6074// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6075//
  6076//   Command:
  6077//  END_PULL_DOWN
  6078//
  6079//   Parameters:
  6080//  None.
  6081//
  6082//   Description:
  6083//      Ends the structure of an ON_ITEM ... BEGIN_PULL_DOWN ... as used by
  6084//      Menu_System package.
  6085//
  6086// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6087
  6088#COMMAND END_PULL_DOWN .
  6089  #IFSUB 'END_MENU'
  6090    END_ITEM_LIST
  6091    END_OBJECT
  6092  #ELSE
  6093    #ERROR DFERR_COMP_INVALID_ARGUMENT "BEGIN_PULL_DOWN" REQUIRES MENU_SYSTEM PACKAGE
  6094  #ENDIF
  6095#ENDCOMMAND
  6096
  6097// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6098//
  6099//   Command:
  6100//  On_Key KeyName SEND Message {TO Object} {PRIVATE}
  6101//
  6102//   Parameters:
  6103//     KeyName is a valid hot key name.
  6104//     Message is valid message name.
  6105//     Object is the a valid object name.
  6106//
  6107//   Description:
  6108//     The ON_KEY command tells the menu manager to pass the
  6109//     specified Message code to the specified Object when the
  6110//     KeyNAme is pressed.  If no Object name is passed, the current
  6111//     object is used.  Passing MSG_NONE for Message causes the key to do
  6112//     nothing, passing MSG_DEFAULT_KEY will restore the default key definition.
  6113//
  6114// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6115
  6116//#COMMAND ON_KEY RULGBO#SDN "SEND" RLGBO#SDN """TO""PRIVATE" _DNOB """PRIVATE" .
  6117//  #IFSAME !4 PRIVATE
  6118//    ON_KEY !1 !2 !3 TO |CI-1 PRIVATE
  6119//  #ELSE
  6120//    #DATA
  6121//    #DPUSH !1
  6122//    #IFSAME !4 TO
  6123//      #IFDEF !5
  6124//        #DPUSH !5
  6125//      #ELSE
  6126//        #IFDEF !5.OBJ
  6127//          #DPUSH !5.OBJ
  6128//        #ELSE
  6129//          #DPUSH |CI0
  6130//          #FREF !5.OBJ !a,1
  6131//        #ENDIF
  6132//      #ENDIF
  6133//    #ELSE
  6134//      #DPUSH |CI-1
  6135//    #ENDIF
  6136//    #IFSAME !6 PRIVATE
  6137//      #DPUSH |CI1
  6138//    #ENDIF
  6139//    #IFDEF !3
  6140//      !A [] OBJ$ONKEY !3 |VL
  6141//    #ELSE
  6142//      #IFDEF MSG_!3
  6143//        !A [] OBJ$ONKEY MSG_!3 |VL
  6144//      #ELSE             // else the command is defined in flex code
  6145//        !A [] OBJ$ONKEY |CI0 |VL        // get flex to fix the fwd ref
  6146//        #FREF MSG_!3 !a
  6147//      #ENDIF
  6148//    #ENDIF
  6149//  #ENDIF
  6150//#ENDCOMMAND
  6151
  6152// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6153//
  6154//   Command:
  6155//     END_OBJECT
  6156//
  6157//   Parameters:
  6158//     None required
  6159//
  6160//   Description:
  6161//     END_OBJECT tells the manager we are done defining an object.
  6162//
  6163// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6164
  6165// JJT-5.1
  6166//#COMMAND END_OBJECT
  6167//  //
  6168//  // The following section was added 01-08-90 by SAL to support inheritable
  6169//  // end-instance macros for classes
  6170//  //
  6171//  #IFSUB '!$$SC'  //if flex-defined class
  6172//    #IFSUB '!$$EM'  //if end-instance macro defined for class,
  6173//      !$$EM !$ !1 !2 !3 !4 !5 !6 !7 !8 !9
  6174//    #ELSE
  6175//      FORWARD_END_CONSTRUCT !$ !1 !2 !3 !4 !5 !6 !7 !8 !9
  6176//    #ENDIF
  6177//  #ELSE
  6178//    DEFAULT_END_OBJECT  //else use default
  6179//  #ENDIF
  6180//  #SPOP           //restore old class name
  6181//  //
  6182//  // end of addition 01-08-90 by SAL
  6183//  //
  6184//#ENDCOMMAND
  6185
  6186// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6187//
  6188//   Command:
  6189//     DEFAULT_END_OBJECT
  6190//
  6191//   Parameters:
  6192//     NONE
  6193//
  6194//   Description:
  6195//     This command terminates an object declaration
  6196//
  6197// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6198
  6199#COMMAND DEFAULT_END_OBJECT .
  6200  !A [] OBJ$END //Mark the end of the object list.
  6201  #POP ZI$              //restore sub_obj_count
  6202  #POP ZB$              //restore current_dep
  6203  #POP B$               //restore obj_flag
  6204  #POP ZJ$              //restore temp label
  6205#ENDCOMMAND
  6206
  6207// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6208//
  6209//   Command:
  6210//  Start_Ui {Object}
  6211//
  6212//   Parameters:
  6213//     NONE
  6214//
  6215//   Description:
  6216//  This command will dispatch io to the current focus.  it will
  6217//  remain in this routine until a non-zero return code is received.
  6218//
  6219// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6220
  6221#COMMAND START_UI
  6222  #IF (!0>0)
  6223    SEND ACTIVATE TO !1
  6224  #ENDIF
  6225  !A [] OBJ$IODISPATCH |CI0 |CI0
  6226#ENDCOMMAND
  6227
  6228// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6229//
  6230//   Command:
  6231//  UI_ACCEPT Object {GROUP | OBJECT} TO ReturnValue
  6232//
  6233//   Parameters:
  6234//
  6235//   Description:
  6236//
  6237// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6238
  6239#COMMAND UI_ACCEPT RSDGBO#L RDGBO#L RDGBO#L _CEL#BOG .
  6240  #IFSAME !2  GROUP OBJECT
  6241    #CHECK !3 "TO"
  6242    #DATA
  6243    #IFSAME !2 GROUP
  6244      #DPUSH |CI1
  6245    #ELSE
  6246      #IFSAME !2 OBJECT
  6247        #DPUSH |CI0
  6248      #ENDIF
  6249    #ENDIF
  6250    #DPUSH !4
  6251    #IFDEF !1
  6252      !A [] OBJ$ACCEPT !1 |VL
  6253    #ELSE
  6254      #IFDEF !1.OBJ
  6255        !A [] OBJ$ACCEPT !1.OBJ |VL
  6256      #ELSE
  6257        !A [] OBJ$ACCEPT |CI0 |VL
  6258        #FREF !1.OBJ !a
  6259      #ENDIF
  6260    #ENDIF
  6261  #ELSE
  6262    UI_ACCEPT !1 OBJECT !2 !3 !4 !5 !6 !7
  6263  #ENDIF
  6264#ENDCOMMAND
  6265
  6266// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6267//
  6268//   Command:
  6269//  SET Property {OF Object} {ITEM #} TO Value {...}
  6270//
  6271//   Parameters:
  6272//
  6273//   Description:
  6274//
  6275// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6276
  6277#COMMAND SET
  6278  GET$SET SET !1 !2 !3 !4 !5 !6 !7 !8 !9
  6279#ENDCOMMAND
  6280
  6281// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6282//
  6283//   Command:
  6284//  GET Property {OF Object} {ITEM #} TO Value {...}
  6285//
  6286//   Parameters:
  6287//
  6288//   Description:
  6289//
  6290// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6291
  6292#COMMAND GET
  6293  GET$SET GET !1 !2 !3 !4 !5 !6 !7 !8 !9
  6294#ENDCOMMAND
  6295
  6296// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6297//
  6298//   Command:
  6299//  FORWARD {GET | SET | SEND} Property {...}
  6300//
  6301//   Parameters:
  6302//
  6303//   Description:
  6304//
  6305// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6306
  6307#COMMAND FORWARD "GET""SET""SEND"
  6308//  #REPLACE __@INSIDE_FORWARD@__
  6309  MOVE 1 TO FORWARD$MESSAGE
  6310  !1 !2 !3 !4 !5 !6 !7 !8 !9
  6311//  #UNDEF __@INSIDE_FORWARD@__     // Leaving function/proc.
  6312#ENDCOMMAND
  6313
  6314// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6315//
  6316//   Command:
  6317//  DELEGATE {GET | SET | SEND} Property {...}
  6318//
  6319//   Parameters:
  6320//
  6321//   Description:
  6322//
  6323// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6324
  6325#COMMAND DELEGATE "GET""SET""SEND"
  6326//  #REPLACE __@INSIDE_DELEGATE@__
  6327  MOVE 8 TO FORWARD$MESSAGE
  6328  !1 !2 !3 !4 !5 !6 !7 !8 !9
  6329//  #UNDEF __@INSIDE_DELEGATE@__     // Leaving function/proc.
  6330#ENDCOMMAND
  6331
  6332// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6333//
  6334//   Command:
  6335//  BROADCAST {RECURSIVE | RECURSIVE_UP} {IGNORE_RETURN} {GET | SET | SEND} Property {...}
  6336//
  6337//   Parameters:
  6338//
  6339//   Description:
  6340//
  6341// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6342
  6343#COMMAND BROADCAST "GET""SET""SEND""RECURSIVE""RECURSIVE_UP""NO_STOP"
  6344  #IFSAME !1 RECURSIVE RECURSIVE_UP
  6345    #CHECK !2 '"GET""SET""SEND""NO_STOP"'
  6346    #IFSAME !1 RECURSIVE
  6347      MOVE 20 TO FORWARD$MESSAGE    // broadcast + recursive_down
  6348    #ELSE
  6349      MOVE 68 TO FORWARD$MESSAGE    // broadcast + recursive_up
  6350    #ENDIF
  6351    #IFSAME !2 NO_STOP
  6352      #CHECK !3 '"GET""SET""SEND"'
  6353      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // no stop on non-0 return
  6354      !3 !4 !5 !6 !7 !8 !9
  6355    #ELSE
  6356      !2 !3 !4 !5 !6 !7 !8 !9
  6357    #ENDIF
  6358  #ELSE
  6359    MOVE 4 TO FORWARD$MESSAGE       // broadcast
  6360    #IFSAME !1 NO_STOP
  6361      #CHECK !2 '"GET""SET""SEND"'
  6362      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // + no_stop
  6363      !2 !3 !4 !5 !6 !7 !8 !9
  6364    #ELSE
  6365      !1 !2 !3 !4 !5 !6 !7 !8 !9
  6366    #ENDIF
  6367  #ENDIF
  6368#ENDCOMMAND
  6369
  6370#COMMAND BROADCAST_FOCUS "GET""SET""SEND""RECURSIVE""RECURSIVE_UP""NO_STOP"
  6371  #IFSAME !1 RECURSIVE RECURSIVE_UP
  6372    #CHECK !2 '"GET""SET""SEND""NO_STOP"'
  6373    #IFSAME !1 RECURSIVE
  6374      MOVE 52 TO FORWARD$MESSAGE    // broadcast + focus + recursive_down
  6375    #ELSE
  6376      MOVE 100 TO FORWARD$MESSAGE   // broadcast + focus + recursive_up
  6377    #ENDIF
  6378    #IFSAME !2 NO_STOP
  6379      #CHECK !3 '"GET""SET""SEND"'
  6380      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // no stop on non-0 return
  6381      !3 !4 !5 !6 !7 !8 !9
  6382    #ELSE
  6383      !2 !3 !4 !5 !6 !7 !8 !9
  6384    #ENDIF
  6385  #ELSE
  6386    MOVE 36 TO FORWARD$MESSAGE      // broadcast + focus
  6387    #IFSAME !1 NO_STOP
  6388      #CHECK !2 '"GET""SET""SEND"'
  6389      MOVE (FORWARD$MESSAGE+128) TO FORWARD$MESSAGE // + no_stop
  6390      !2 !3 !4 !5 !6 !7 !8 !9
  6391    #ELSE
  6392      !1 !2 !3 !4 !5 !6 !7 !8 !9
  6393    #ENDIF
  6394  #ENDIF
  6395#ENDCOMMAND
  6396
  6397
  6398// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6399//
  6400//   Command:
  6401//  Procedure {Set} Message {FOR Class} {{Type Argument} ...}
  6402//
  6403//   Parameters:
  6404//
  6405//   Description:
  6406//
  6407// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6408
  6409#COMMAND PROCEDURE R
  6410  // The interface to handle$message is slightly different in the mangling system.
  6411  // The set is not concatenated with the symbol, because the mangling will generate its own symbol later.
  6412  #IFSAME !1 SET
  6413    #IFDEF MANGLE_NAMES
  6414       HANDLE$MESSAGE SET !2 !3 !4 !5 !6 !7 !8 !9
  6415    #ELSE
  6416       HANDLE$MESSAGE SET_!2 !3 !4 !5 !6 !7 !8 !9
  6417    #ENDIF
  6418  #ELSE
  6419    #IFDEF MANGLE_NAMES
  6420       HANDLE$MESSAGE MSG !1 !2 !3 !4 !5 !6 !7 !8 !9
  6421    #ELSE
  6422      HANDLE$MESSAGE MSG_!1 !2 !3 !4 !5 !6 !7 !8 !9
  6423    #ENDIF
  6424  #ENDIF
  6425#ENDCOMMAND
  6426
  6427
  6428#COMMAND MESSAGE$ADDRESS
  6429  #IFDEF !1
  6430  #ELSE             // assign the next message number now
  6431    #SET ZC$ !ZC
  6432    #IF (!Zc>$0FFFFFFF) // using 32-bit msg ids now (256M total allowed)
  6433      #ERROR DFERR_COMP_TOO_MANY_MESSAGES Maximum number of message/property definitions exceeded
  6434    #ELSE
  6435//      #XREF Message !1 as |CI!Zc was defined on line !a
  6436      #REPLACE !1 |CI!Zc      // this will cause all fwd refs to be fixed.
  6437    #ENDIF
  6438  #ENDIF
  6439#ENDCOMMAND
  6440
  6441// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6442//
  6443//   Command:
  6444//  Register_Procedure Message {FOR Class} {{Type Argument} ...}
  6445//
  6446//   Parameters:
  6447//
  6448//   Description:
  6449//
  6450// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6451
  6452
  6453#COMMAND REGISTER_PROCEDURE R
  6454  #IFDEF UI.EXISTS
  6455  #ELSE
  6456    USE UI
  6457  #ENDIF
  6458  #IFSAME GLOBAL !2 !3 // procedure or procedure set
  6459    #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION GLOBAL PROCEDURES CANNOT BE REGISTERED
  6460  #ELSE
  6461    #IFSAME !1 SET
  6462      // Error if already defined as global
  6463      #IFDEF SET_!2
  6464        #IF (SET_!2<0)
  6465          #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION Set !2 is already defined as a global message
  6466        #ENDIF
  6467      #ENDIF
  6468
  6469      // Make sure the argument list is correct
  6470      CHECK$METHOD$ARGUMENT$LIST !3 !4 !5 !6 !7 !8 !9
  6471      // Even if there were errors parsing the argument list, try to make the symbol so that we resolve fwd refs correctly.
  6472      #IFDEF MANGLE_NAMES
  6473        // For mangling, #MARG is used to read the line and parse the argument list.
  6474        #IFSAME OVERLOADED !3 !4 !5 !6 !7 !8 !9
  6475          #IFDEF SET_!2
  6476            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Non-Overloaded
  6477          #ENDIF
  6478          // #MARG returns the mangled name in !? which gets new message number.
  6479          // we don't support Byref with overloading
  6480          #IFSAME BYREF !3 !4 !5 !6 !7 !8 !9
  6481            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "BYREF not allowed in overloaded methods"
  6482          #ENDIF
  6483          #MARG SET_!2 !3 !4 !5 !6 !7 !8 !9
  6484          MESSAGE$ADDRESS !?
  6485          // only create overloaded symbol if first time
  6486          #IFNDEF SET_!2_OVERLOADED
  6487            #REPLACE SET_!2_OVERLOADED   |CI1
  6488          #ENDIF
  6489        #ELSE
  6490          #IFDEF SET_!2_OVERLOADED
  6491            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Overloaded
  6492          #ENDIF
  6493          MESSAGE$ADDRESS SET_!2
  6494        #ENDIF
  6495      #ELSE
  6496        MESSAGE$ADDRESS SET_!2
  6497      #ENDIF
  6498    #ELSE
  6499      // check for already defined as global
  6500      #IFDEF MSG_!1
  6501        #IF (MSG_!1<0)
  6502          #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION MSG !1 is already defined as a global message
  6503        #ENDIF
  6504      #ENDIF
  6505      // Check the argument list first
  6506      CHECK$METHOD$ARGUMENT$LIST !2 !3 !4 !5 !6 !7 !8 !9
  6507      // Likewise for messages with MSG prefix. #MARG is again used to parse the register_procedure line.
  6508      #IFDEF MANGLE_NAMES
  6509        #IFSAME OVERLOADED !2 !3 !4 !5 !6 !7 !8 !9
  6510          #IFDEF MSG_!1
  6511            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Non-Overloaded
  6512          #ENDIF
  6513          // #MARG returns the mangled name in !? which gets new message number.
  6514          // we don't support Byref with overloading
  6515          #IFSAME BYREF !2 !3 !4 !5 !6 !7 !8 !9
  6516            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "BYREF not allowed in overloaded methods"
  6517          #ENDIF
  6518          #MARG MSG_!1 !2 !3 !4 !5 !6 !7 !8 !9
  6519          MESSAGE$ADDRESS !?
  6520          // only create overloaded symbol if first time
  6521          #IFNDEF MSG_!1_OVERLOADED
  6522            #REPLACE MSG_!1_OVERLOADED   |CI1
  6523          #ENDIF
  6524        #ELSE
  6525          #IFDEF MSG_!1_OVERLOADED
  6526            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Overloaded
  6527          #ENDIF
  6528          MESSAGE$ADDRESS MSG_!1
  6529        #ENDIF
  6530      #ELSE
  6531        MESSAGE$ADDRESS MSG_!1
  6532      #ENDIF
  6533    #ENDIF
  6534  #ENDIF
  6535#ENDCOMMAND
  6536
  6537
  6538// Argument list validation rules:
  6539//
  6540// The expected format is
  6541//
  6542//    type1 id1 type2 id2 ... typen idn
  6543//
  6544//    Functions have "Returns TypeReturn" at the end of the line.
  6545//    The keyword OVERLOADED cannot be placed between the ids or types.
  6546//    The keyword Global can proceed the list of parameters
  6547//
  6548
  6549//    Here are a list of the possible parsing errors.
  6550
  6551#COMMAND CHECK$ARGUMENT$LIST$ERROR1
  6552  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX TYPE FOLLOWS TYPE IN DECLARATION
  6553#ENDCOMMAND
  6554
  6555#COMMAND CHECK$ARGUMENT$LIST$ERROR2
  6556  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX MISSING TYPE IN METHOD DECLARATION
  6557#ENDCOMMAND
  6558
  6559#COMMAND CHECK$ARGUMENT$LIST$ERROR3
  6560  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX KEYWORD OVERLOADED CANNOT BE BETWEEN A TYPE AND AN IDENTIFIER
  6561#ENDCOMMAND
  6562
  6563#COMMAND CHECK$ARGUMENT$LIST$ERROR4
  6564  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX RETURNS MUST BE FOLLOWED BY A RETURN TYPE
  6565#ENDCOMMAND
  6566
  6567#COMMAND CHECK$ARGUMENT$LIST$ERROR5
  6568  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX MISSING IDENTIFIER BEFORE RETURNS KEYWORD
  6569#ENDCOMMAND
  6570
  6571#COMMAND CHECK$ARGUMENT$LIST$ERROR6
  6572  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX MISSING TYPE IN METHOD DECLARATION
  6573#ENDCOMMAND
  6574
  6575#COMMAND CHECK$ARGUMENT$LIST$ERROR7
  6576  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX MISSING RETURN TYPE AFTER KEYWORD RETURNS IN METHOD DECLARATION
  6577#ENDCOMMAND
  6578
  6579#COMMAND CHECK$ARGUMENT$LIST$ERROR8
  6580  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX UNEXPECTED SYMBOL ENCOUNTERED AFTER RETURN TYPE IN METHOD DECLARATION
  6581#ENDCOMMAND
  6582
  6583#COMMAND CHECK$ARGUMENT$LIST$ERROR9
  6584  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX EXPECTING IDENTIFIER AFTER TYPE IN METHOD DECLARATION
  6585#ENDCOMMAND
  6586
  6587#COMMAND CHECK$ARGUMENT$LIST$ERROR10
  6588  #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX UNEXPECTED DIMENSION SIZE SPECIFIER IN ARRAY TYPE DECLARATION
  6589#ENDCOMMAND
  6590
  6591// Validation code is like this:
  6592//
  6593// CHECK$METHOD$ARGUMENT$LIST is called in register_function, register_procedure, and external$function
  6594//
  6595
  6596#COMMAND CHECK$METHOD$ARGUMENT$LIST$FOR$ID   // This is called after a type is read.
  6597  #IFADIM !1
  6598    //Make sure it has no specified dimension size
  6599    #SPUSH
  6600    #DIMSTRIP !1
  6601    #IFSAME !$ 0 |CI0
  6602      CHECK$METHOD$ARGUMENT$LIST$FOR$ID !2 !3 !4 !5 !6 !7 !8 !9
  6603    #ELSE
  6604      CHECK$ARGUMENT$LIST$ERROR10
  6605    #ENDIF
  6606    #SPOP
  6607  #ELSE
  6608    #IFSAME !1 BYREF
  6609      CHECK$METHOD$ARGUMENT$LIST$FOR$ID2 !2 !3 !4 !5 !6 !7 !8 !9
  6610    #ELSE
  6611      CHECK$METHOD$ARGUMENT$LIST$FOR$ID2 !1 !2 !3 !4 !5 !6 !7 !8 !9
  6612    #ENDIF
  6613  #ENDIF
  6614#ENDCOMMAND
  6615
  6616
  6617#COMMAND CHECK$METHOD$ARGUMENT$LIST$FOR$ID2   // This is called after a type is read.
  6618  #IF (!0>0)
  6619    #IFSAME !1 OVERLOADED                       // Check for Overloaded between type and variable name
  6620      CHECK$ARGUMENT$LIST$ERROR3
  6621    #ELSE
  6622      #IFSAME !1 RETURNS                 // Check if missing identifier before returns
  6623        CHECK$ARGUMENT$LIST$ERROR5
  6624      #ELSE
  6625        #IFSAME !1 BYREF                 // Check for additional byref before identifier
  6626          CHECK$ARGUMENT$LIST$ERROR9
  6627        #ELSE
  6628          // Parse now for the next type.
  6629          CHECK$METHOD$ARGUMENT$LIST !2 !3 !4 !5 !6 !7 !8 !9
  6630        #ENDIF
  6631      #ENDIF
  6632    #ENDIF
  6633  #ELSE
  6634    CHECK$ARGUMENT$LIST$ERROR9  // Missing identifier after type.
  6635  #ENDIF
  6636#ENDCOMMAND
  6637
  6638
  6639#COMMAND CHECK$FOR$BOGUS$TRAILING$STUFF
  6640  #IF (!0>0)
  6641    #IFADIM !1
  6642      //Array type
  6643      //Make sure it has no specified dimension size
  6644      #SPUSH
  6645      #DIMSTRIP !1
  6646      #IFSAME !$ 0 |CI0
  6647        CHECK$FOR$BOGUS$TRAILING$STUFF !2
  6648      #ELSE
  6649        CHECK$ARGUMENT$LIST$ERROR10
  6650      #ENDIF
  6651      #SPOP
  6652    #ELSE
  6653      CHECK$ARGUMENT$LIST$ERROR8  // Garbage trailing on line
  6654    #ENDIF
  6655  #ENDIF
  6656#ENDCOMMAND
  6657
  6658// Return type must follow Returns Keyword
  6659#COMMAND CHECK$FOR$RETURN$TYPE
  6660  #IF (!0=0)
  6661     CHECK$ARGUMENT$LIST$ERROR7  // Error: Missing return type after keyword RETURNS
  6662  #ELSE
  6663    #DTYPE Q$ !1 // only check if there is a valid data type
  6664    #If (!q=-1) // Check for the various types. If we find them, parse for an identifier with CHECK$METHOD$ARGUMENT$LIST$FOR$ID
  6665      #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
  6666    #ELSE
  6667      CHECK$FOR$BOGUS$TRAILING$STUFF !2                 // Ok, look for garbage at end of line.
  6668    #ENDIF
  6669  #ENDIF
  6670#ENDCOMMAND
  6671
  6672// Check list of arguments.
  6673//
  6674// Expected line could start with OVERLOADED or RETURNS.
  6675// Otherwise it will start with a list of type, identifier ordered pairs.
  6676
  6677#COMMAND CHECK$METHOD$ARGUMENT$LIST
  6678  #PUSH !q
  6679  #IF (!0>0)
  6680    #IFSAME !1 OVERLOADED
  6681      // Start parse from the beginning (just ignores OVERLOADED)
  6682      CHECK$METHOD$ARGUMENT$LIST !2 !3 !4 !5 !6 !7 !8 !9
  6683    #ElSE
  6684      #IFSAME !1 RETURNS
  6685        // Look for return type that must follow it.
  6686        CHECK$FOR$RETURN$TYPE !2 !3 !4 !5 !6 !7 !8 !9
  6687      #ELSE
  6688        #DTYPE Q$ !1 // only check if there is a valid data type
  6689        #If (!q>-1) // Check for the various types. If we find them, parse for an identifier with CHECK$METHOD$ARGUMENT$LIST$FOR$ID
  6690            CHECK$METHOD$ARGUMENT$LIST$FOR$ID !2 !3 !4 !5 !6 !7 !8 !9
  6691        #ENDIF
  6692      #ENDIF
  6693    #ENDIF
  6694  #ENDIF
  6695  #POP Q$
  6696#ENDCOMMAND
  6697
  6698
  6699// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6700//
  6701//   Command:
  6702//  CALL RoutineName {Parameters ...}
  6703//
  6704//   Parameters:
  6705//
  6706//   Description:
  6707//
  6708// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6709
  6710#COMMAND CALL RGBO#L
  6711  SEND !1 TO DESKTOP !2 !3 !4 !5 !6 !7 !8 !9
  6712#ENDCOMMAND
  6713
  6714// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6715//
  6716//   Command:
  6717//  SUB_PAGE NewPage FROM FromPage ;
  6718//      { (WindowNumber) | ;
  6719//      ({VERTICAL|HORIZONTAL} FromWindow ForWindows) | ;
  6720//      (RECTANGULAR FromWindow NumColumns NumRows) } {...}
  6721//
  6722//   Parameters:
  6723//
  6724//   Description:
  6725//
  6726// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6727
  6728#COMMAND SUB_PAGE RT "FROM" RGBO#L
  6729  #PUSH !Zg             // h is the number of windows on
  6730  #SET ZG$ 0                // the sub page.
  6731  #DATA                 // start up the arguments
  6732  #IFDEF !3
  6733    #DPUSH !3               // based on variable page number
  6734  #ELSE
  6735    #CHECK !3.N _U
  6736    #DPUSH !3.N             // based on absolute page number
  6737  #ENDIF
  6738  SUB$IMAGE$DEFINE !4 !5 !6 !7 !8 !9    // loop thru the passed arguments
  6739  #DPUSH |CI!Zg             // store the number of windows
  6740  #IFDEF !1.N
  6741    #IFCLASS !1.N "C"
  6742      #ERROR DFERR_COMP_DUPLICATE_PAGE_NAME SUB_PAGE !1 ALREADY DEFINED AS A PHYSICAL IMAGE
  6743    #ELSE
  6744      !A [] REDEFINE$SUB$PAGE !1.N |VL    // create the sub image
  6745    #ENDIF
  6746  #ELSE
  6747    INTEGER !1.N            // create a int to place page # into
  6748    !A [] CREATE$SUB$PAGE !1.N |VL  // create the sub image
  6749  #ENDIF
  6750  #POP ZG$              // restore our general counter
  6751#ENDCOMMAND
  6752
  6753#COMMAND SUB$IMAGE$DEFINE
  6754  #IF (!0>0)
  6755    #IFSAME !1 VERTICAL         // define a vertical set of windows
  6756        #DPUSH |CI-1          // vertical flag
  6757        #DPUSH !2             // push the start window number
  6758        #DPUSH !3             // and the number of windows
  6759        #SET ZG$ (!Zg+!3)         // how many was that?
  6760        SUB$IMAGE$DEFINE !4 !5 !6 !7 !8 !9    // one more time
  6761    #ENDIF
  6762    #IFSAME !1 HORIZONTAL     // horzontal (contiguous) windows
  6763        #DPUSH |CI-2            // horizontal flag
  6764        #DPUSH !2           // push the start window number
  6765        #DPUSH !3           // and the number of windows
  6766        #SET ZG$ (!Zg+!3)           // how many was that?
  6767        SUB$IMAGE$DEFINE !4 !5 !6 !7 !8 !9  // one more time
  6768    #ENDIF
  6769    #IFSAME !1 RECTANGULAR      // a rectangular array of windows
  6770        #DPUSH |CI-3          // the rect. flag
  6771        #DPUSH !2         // push the start window number
  6772        #DPUSH !3         // number of windows per row
  6773        #DPUSH !4         // number of rows
  6774        #SET ZG$ (!Zg+(!3*!4))        // not bad huh
  6775        SUB$IMAGE$DEFINE !5 !6 !7 !8 !9   // and again
  6776    #ENDIF
  6777    #IFSAME !1 VERTICAL RECTANGULAR HORIZONTAL // May look strange, but reduces
  6778    #ELSE                                      // use of #if stack levels.
  6779        #DPUSH !1         // its just a single window def
  6780        #SET ZG$ !ZG          // just add one
  6781        SUB$IMAGE$DEFINE !2 !3 !4 !5 !6 !7 !8 !9  // recurse
  6782    #ENDIF
  6783  #ENDIF
  6784#ENDCOMMAND
  6785
  6786// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6787//
  6788//   Command:
  6789//
  6790//   Parameters:
  6791//
  6792//   Description:
  6793//
  6794// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6795
  6796#COMMAND MOVE_SUB_PAGE _RDOBR "TO" _RDOBRU
  6797  #IFDEF !1
  6798    !A [] MOVE$SUB$PAGE !1 !3
  6799  #ELSE
  6800    #CHECK !1.N _U
  6801    !A [] MOVE$SUB$PAGE !1.N !3
  6802  #ENDIF
  6803#ENDCOMMAND
  6804
  6805// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6806//
  6807//   Command:
  6808//  USE PackageName | UI
  6809//
  6810//   Parameters:
  6811//
  6812//   Description:
  6813//
  6814// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6815#COMMAND USE R
  6816  #IFSAME !1 UI
  6817    #IFSUB '!1.EXISTS'
  6818    #ELSE
  6819      #REPLACE !1.EXISTS |CI!a
  6820      INITIALIZE_INTERFACE
  6821       Define$BuiltIn$DF$Messages   // Define built in DF messages
  6822       Define$BuiltIn$VDF$Messages  // Define built in VDF messages
  6823       Define$BuiltIn$WAS$Messages  // Define built in Web App messages
  6824       Define$BuiltIn$XML$Messages  // Define built in XML messages
  6825       Define$BuiltIn$Transfer$Messages  // For FTP and HTTP classes
  6826       Define$BuiltIn$Flexcom2$Messages  // flexcom2
  6827    #ENDIF
  6828  #ELSE
  6829    #USE !1
  6830  #ENDIF
  6831#ENDCOMMAND
  6832
  6833// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6834//
  6835//   Command:
  6836//
  6837//   Parameters:
  6838//
  6839//   Description:
  6840//
  6841// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6842
  6843#COMMAND VFIND R R R .
  6844  MOVE !2 TO INDEX_NUMBER
  6845  #IFSAME !3 $0 $1 $2 $3 $4
  6846    #SET Q$ !3
  6847    !A [] $CC !1 |CI!q
  6848  #ELSE
  6849    !A [] $CC !1 !3
  6850  #ENDIF
  6851#ENDCOMMAND
  6852
  6853// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6854//
  6855//   Command:
  6856//
  6857//   Parameters:
  6858//
  6859//   Description:
  6860//
  6861// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6862
  6863#COMMAND SCREEN_OPTIMIZE RL .
  6864  #IFSAME !1 $0 $1
  6865    #PUSH !Zg
  6866    #SET ZG$ !1
  6867    !A [] SCREEN$OPT |CI!Zg
  6868    #POP ZG$
  6869  #ELSE
  6870    !A [] SCREEN$OPT !1
  6871  #ENDIF
  6872#ENDCOMMAND
  6873
  6874// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6875//
  6876//   Command:
  6877//     FORWARD_BEGIN_CONSTRUCT ClassName { <argument> ... }
  6878//
  6879//   Parameters:
  6880//     ClassName is the name of the class which owns the macro that is
  6881//         forwarding.
  6882//     <argument> is any argument required
  6883//
  6884//   Description:
  6885//     This command allows the instance-creation macros defined for classes
  6886//     to 'inherit' the instance-creation macro(s) defined by their
  6887//     superclass(es).
  6888//
  6889// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6890
  6891#COMMAND FORWARD_BEGIN_CONSTRUCT R //<currentClassName> { <arg> ... }
  6892  #IFSUB '!1$SC' // if flex-defined class
  6893    #SPUSH
  6894    #SET $$ !1$SC  //get superclass name
  6895    #IFSUB '!$$SM' //if class defines start macro
  6896      !$$SM !$ !2 !3 !4 !5 !6 !7 !8 !9   //invoke it
  6897    #ELSE          //else not defined
  6898      FORWARD_BEGIN_CONSTRUCT !$ !2 !3 !4 !5 !6 !7 !8 !9
  6899    #ENDIF
  6900    #SPOP
  6901  #ELSE
  6902    ADD$IMAGE$ARGS MSG_CONSTRUCT_OBJECT !2 !3 !4 !5 !6 !7 !8 !9  //use default
  6903  #ENDIF
  6904#ENDCOMMAND
  6905
  6906// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6907//
  6908//   Command:
  6909//     FORWARD_END_CONSTRUCT ClassName { <argument> ... }
  6910//
  6911//   Parameters:
  6912//     ClassName is the name of the class which owns the macro that is
  6913//       forwarding.
  6914//     <argument> is any argument required
  6915//
  6916//   Description:
  6917//     This command allows the instance-ending macros defined for classes
  6918//     to 'inherit' the instance-ending macro(s) defined by their
  6919//     superclass(es).
  6920//
  6921// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6922
  6923#COMMAND FORWARD_END_CONSTRUCT R //<currentClassName> { <arg> ... }
  6924  #IFSUB '!1$SC' // if flex-defined class
  6925    #SPUSH       // note: #SPUSH with no arg it pushes !$ (with no replacement). Don't pass arguments (obsolete technique as of 11.1)
  6926    #SET $$ !1$SC  //get superclass name
  6927    #IFSUB '!$$EM' //if end-instance macro defined,
  6928      !$$EM !$ !2 !3 !4 !5 !6 !7 !8 !9  //use it
  6929    #ELSE
  6930      FORWARD_END_CONSTRUCT !$ !2 !3 !4 !5 !6 !7 !8 !9
  6931    #ENDIF
  6932    #SPOP       // note: #SPOP always pops to $$ - it never takes an argument
  6933  #ELSE
  6934    DEFAULT_END_OBJECT  //else use default
  6935  #ENDIF
  6936#ENDCOMMAND
  6937
  6938#COMMAND SET_DEFERRED &R .
  6939  !A [] $460 !1
  6940#ENDCOMMAND
  6941
  6942// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6943//
  6944//   Command:
  6945//     NAME_ITEM <object_name> item names...
  6946//
  6947//   Description:
  6948//      Gives names to items of objects in the form: object.item
  6949//      Assumes item number has already been set.
  6950//
  6951// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6952#COMMAND NAME_ITEM RT#L R
  6953  #IFDEF !2
  6954    #CHECK !2 _#LUVFEWNSG
  6955    #SET Q$ !2
  6956    NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  6957  #ELSE
  6958    #IFSAME !2 ITEM
  6959      NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  6960    #ELSE
  6961      #IFSAME !2 COLUMN
  6962        NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
  6963      #ELSE
  6964        #IFSAME !2 PROPERTY
  6965          NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
  6966        #ELSE
  6967          #REPLACE !1.!2 !1.OBJ ITEM !q
  6968          #SET Q$ (!q+1)
  6969          #IF !0>2
  6970              NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  6971          #ENDIF
  6972        #ENDIF
  6973      #ENDIF
  6974    #ENDIF
  6975  #ENDIF
  6976#ENDCOMMAND
  6977
  6978// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6979//
  6980//   Command:
  6981//     NAME_COLUMN <object_name> item names...
  6982//
  6983//   Description:
  6984//      Gives names to items of objects in the form: object.item
  6985//      Just like name_item except item numbers are relative to
  6986//      base_item.
  6987//      Assumes item number has already been set.
  6988//
  6989// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  6990#COMMAND NAME_COLUMN RT#L R
  6991  #IFDEF !2
  6992    #CHECK !2 _#LUVFEWNSG
  6993    #SET Q$ !2
  6994    NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
  6995  #ELSE
  6996    #IFSAME !2 ITEM
  6997      NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  6998    #ELSE
  6999      #IFSAME !2 COLUMN
  7000        NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
  7001      #ELSE
  7002        #IFSAME !2 PROPERTY
  7003          NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
  7004        #ELSE
  7005          #REPLACE !1.!2 !1.OBJ ITEM (BASE_ITEM(!1.OBJ)+!q)
  7006          #SET Q$ (!q+1)
  7007          #IF !0>2
  7008            NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
  7009          #ENDIF
  7010        #ENDIF
  7011      #ENDIF
  7012    #ENDIF
  7013  #ENDIF
  7014#ENDCOMMAND
  7015
  7016
  7017// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7018//
  7019//   Command:
  7020//     NAME_PROPERTY <object_name> property names...
  7021//
  7022//   Description:
  7023//      Gives names to property of objects in the form: object.item
  7024//
  7025// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7026
  7027#COMMAND NAME_PROPERTY RT#L RT
  7028  #IFSAME !2 ITEM
  7029    NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  7030  #ELSE
  7031    #IFSAME !2 COLUMN
  7032      NAME_COLUMN !1 !3 !4 !5 !6 !7 !8 !9
  7033    #ELSE
  7034      #IFSAME !2 PROPERTY
  7035        NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
  7036      #ELSE
  7037        #REPLACE !1.!2 (!2(!1.OBJ))
  7038        #IF !0>2
  7039          NAME_PROPERTY !1 !3 !4 !5 !6 !7 !8 !9
  7040        #ENDIF
  7041      #ENDIF
  7042    #ENDIF
  7043  #ENDIF
  7044#ENDCOMMAND
  7045
  7046
  7047// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7048//
  7049//   Command:
  7050//     NAME_OBJECT <object_name> ACCESS item names...
  7051//          ACCESS = CHILD, GLOBAL, COLUMN, PROPERTY, ITEM or ACCESS METHOD.
  7052//
  7053//   Description:
  7054//      Gives names to objects in the form: object.obj
  7055//      and allows items, properties and COLUMNs to be defined.
  7056//      Inits item number to zero and assumes item names follow.
  7057//
  7058// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7059
  7060#COMMAND NAME_OBJECT RT#L R
  7061  #SET Q$ 0
  7062  #IFDEF !2
  7063    #CHECK !2 _R#LSD
  7064    #REPLACE !1.OBJ !2
  7065    #IF !0>2
  7066      NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  7067    #ENDIF
  7068  #ELSE
  7069//    #CHECK !2 "CHILD""ITEM""GLOBAL""COLUMN""PROPERTY"
  7070    #IFSAME !2 CHILD
  7071      REGISTER_OBJECT !1
  7072      #IFDEF !3
  7073        NAME_OBJECT !1 (!1(!3))  !4 !5 !6 !7 !8 !9
  7074      #ELSE
  7075        #CHECK !3.OBJ _#LU
  7076        NAME_OBJECT !1 (!1(!3.OBJ))  !4 !5 !6 !7 !8 !9
  7077      #ENDIF
  7078    #ELSE
  7079      #IFSAME !2 GLOBAL
  7080        #IFDEF !1.OBJ
  7081          #CHECK !1.OBJ _NSDFW#L
  7082        #ELSE
  7083          INTEGER !1.OBJ
  7084        #ENDIF
  7085        #IFCLASS !1.OBJ V$
  7086          #IF (!b & 1)
  7087            MOVE CURRENT_OBJECT TO !1.OBJ
  7088          #ELSE
  7089            #IF (!b)
  7090              #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT NAME_OBJECT MUST PRECEDE CLASS OR PROCEDURE
  7091            #ELSE
  7092              MOVE 1023 TO !1.OBJ
  7093            #ENDIF
  7094          #ENDIF
  7095        #ENDIF
  7096        #IF !0>2
  7097          NAME_ITEM !1 !3 !4 !5 !6 !7 !8 !9
  7098        #ENDIF
  7099      #ELSE
  7100        NAME_!2 !1 !3 !4 !5 !6 !7 !8 !9
  7101      #ENDIF
  7102    #ENDIF
  7103  #ENDIF
  7104#ENDCOMMAND
  7105
  7106#COMMAND ITEM_GROUP .
  7107  #PUSH !Zd
  7108  #PUSH !Ze
  7109  #SET ZD$ 0
  7110  !A [] $462 |CI0        //create new item group; size is fwd-ref'd
  7111  #SET ZE$ !a
  7112  #FREF ITEM$GROUP!Ze !a
  7113#ENDCOMMAND
  7114
  7115#COMMAND END_ITEM_GROUP .
  7116  #REPLACE ITEM$GROUP!Ze |CI!Zd  //define size of item group
  7117  #POP ZE$
  7118  #POP ZD$
  7119#ENDCOMMAND
  7120
  7121#COMMAND DEPENDENT_ITEM R
  7122  #IFSAME !2 ITEM    //if ITEM is second arg, item name replacement was used
  7123    #IFDEF !1
  7124      !A [] $463 !1 !3 //add obj#,item# pair to current item group
  7125    #ELSE
  7126      !A [] $463 !1.OBJ !3 //add obj#,item# pair to current item group
  7127    #ENDIF
  7128    #SET ZD$ !ZD         //increment element counter
  7129    #IF (!0>3)
  7130      DEPENDENT_ITEM !4 !5 !6 !7 !8 !9
  7131    #ENDIF
  7132  #ELSE
  7133    #IFDEF !1
  7134      !A [] $463 !1 !2 //add obj#,item# pair to current item group
  7135    #ELSE
  7136      !A [] $463 !1.OBJ !2 //add obj#,item# pair to current item group
  7137    #ENDIF
  7138    #SET ZD$ !ZD         //increment element counter
  7139    #IF (!0>2)
  7140      DEPENDENT_ITEM !3 !4 !5 !6 !7 !8 !9
  7141    #ENDIF
  7142  #ENDIF
  7143#ENDCOMMAND
  7144
  7145
  7146// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7147//
  7148//   Command:
  7149//  IMPORT_CLASS_PROTOCOL Source Dest {Msg | ALL} {Flag}
  7150//
  7151//   Description:
  7152//  This command will copy the message definitions of the Source
  7153//  class to the Dest class.  The program may choose to copy ALL
  7154//  of the messages or only one of the messages from the Source.
  7155//  The program has the option to stop any message that would overwrite
  7156//  and to stop the copying of messages not directly defined in the
  7157//  Source class.
  7158//
  7159// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7160
  7161#COMMAND IMPORT_CLASS_PROTOCOL _RSNDLOB# _SNDLOB#
  7162  #IF (!0<2)
  7163    IMPORT_CLASS_PROTOCOL !1 CURRENT_CLASS
  7164  #ELSE
  7165    #DATA       // Begining of data
  7166    #IFDEF !1       // class is variable (integer) or constant
  7167      #DPUSH !1     // defined_in
  7168    #ELSE
  7169      #IFDEF U_!1
  7170        #DPUSH U_!1   // class is normal symbol type (integer)
  7171      #ELSE
  7172        #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNDEFINED CLASS U_!1
  7173      #ENDIF
  7174    #ENDIF
  7175    #IFDEF !2       // is the destination defined?
  7176      #DPUSH !2     // add to class
  7177    #ELSE
  7178      #IFSAME !2 CURRENT_CLASS  // use this symbol for "current class"
  7179        #DPUSH U_!$     // cc is in this symbol (set by class)
  7180      #ELSE
  7181        #IFDEF U_!2
  7182          #DPUSH U_!2     // another standard class id
  7183        #ELSE
  7184          #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNDEFINED CLASS U_!2
  7185        #ENDIF
  7186      #ENDIF
  7187    #ENDIF
  7188    #IF (!0>2)      // message or all specified
  7189      #IFSAME !3 ALL    // copy all messages
  7190        #DPUSH |CI0 // 0 is all
  7191      #ELSE
  7192        #IFDEF !3
  7193          #DPUSH !3 // message name, note full name required
  7194        #ELSE
  7195          #IFDEF MSG_!3
  7196            #DPUSH MSG_!3
  7197          #ELSE
  7198            #IFDEF SET_!3
  7199              #DPUSH SET_!3
  7200            #ELSE
  7201              #IFDEF GET_!3
  7202                #DPUSH GET_!3
  7203              #ELSE
  7204                #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNDEFINED MESSAGE NAME !3
  7205              #ENDIF
  7206            #ENDIF
  7207          #ENDIF
  7208        #ENDIF
  7209      #ENDIF
  7210      #IF (!0>3)
  7211        #SET Q$ 0
  7212        CHAIN$HELP !4 !5    // NO_INHERIT and NO_OVERWRITE
  7213        #DPUSH |CI!q    // flags
  7214      #ELSE
  7215        #DPUSH |CI0 // no flags
  7216      #ENDIF
  7217    #ELSE
  7218      #DPUSH |CI0   // all messages
  7219      #DPUSH |CI0   // overwrite and superclasses
  7220    #ENDIF
  7221    !A [] $0465 |CI0 |VL
  7222  #ENDIF
  7223#ENDCOMMAND
  7224
  7225
  7226// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7227//
  7228//  Command:
  7229//      LOGOUT {Driver Name {Server Name}}
  7230//
  7231//  Description:
  7232//
  7233// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7234
  7235#COMMAND LOGOUT
  7236  !A [] $4c6 !1 !2
  7237#ENDCOMMAND
  7238
  7239// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7240//
  7241//  Command:
  7242//      SET_TRANSACTION_RETRY
  7243//
  7244//  Description:
  7245//
  7246// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7247
  7248#COMMAND SET_TRANSACTION_RETRY "TO" &#LGRBOUSD .
  7249  !A [] $4c8 !2
  7250#ENDCOMMAND
  7251
  7252
  7253// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7254//
  7255//  Command:
  7256//      GET_TRANSACTION_RETRY
  7257//
  7258//  Description:
  7259//
  7260// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7261
  7262#COMMAND GET_TRANSACTION_RETRY "TO" R .
  7263  !A [] $4c9 !2
  7264#ENDCOMMAND
  7265
  7266
  7267// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7268//
  7269//  Command:
  7270//      COPY_DB
  7271//
  7272//  Description:
  7273//
  7274// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7275
  7276#COMMAND COPY_DB RNDI#G_ "TO" RN_DI#G
  7277  COPY$DB$CALLBACK 0
  7278  COPY$DB$COMPRESSION DF_FILE_COMPRESS_NONE DFFALSE
  7279  #IF ( !0 > 3 )
  7280    #IF ( !0 > 5 )
  7281      #IFSAME !4 !6
  7282        #ERROR DFERR_COMP_INVALID_ARGUMENT PARAMETER DUPLICATION !4 !6
  7283      #ELSE
  7284        #IFSAME !6 COMPRESSION
  7285          COPY$DB$COMPRESSION !7 DFTRUE
  7286        #ELSE
  7287          #IFSAME !6 CALLBACK
  7288            COPY$DB$CALLBACK !7
  7289          #ELSE
  7290            #ERROR DFERR_COMP_INVALID_ARGUMENT INVALID PARAMETER !6
  7291          #ENDIF
  7292        #ENDIF
  7293      #ENDIF
  7294    #ENDIF
  7295    #IFSAME !4 COMPRESSION
  7296      COPY$DB$COMPRESSION !5 DFTRUE
  7297    #ELSE
  7298      #IFSAME !4 CALLBACK
  7299        COPY$DB$CALLBACK !5
  7300      #ELSE
  7301        #ERROR DFERR_COMP_INVALID_ARGUMENT INVALID PARAMETER !4
  7302      #ENDIF
  7303    #ENDIF
  7304  #ENDIF
  7305  !A [] $0e3 !1 !3
  7306#ENDCOMMAND
  7307
  7308#COMMAND COPY$DB$CALLBACK R .
  7309  !A [] $0e4 !1
  7310#ENDCOMMAND
  7311
  7312#COMMAND COPY$DB$COMPRESSION R R .
  7313  !A [] $0e5 !1 !2
  7314#ENDCOMMAND
  7315
  7316
  7317// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7318//
  7319//  Command:
  7320//      DECLARE_DATAFILE logicalFileName*n
  7321//
  7322//  Description:
  7323//      Include the .FD for the named file and define any related symbols,
  7324//      e.g., FILE.FILE_NUMBER
  7325//
  7326//  Parameter
  7327//      logicalFileName
  7328//          Base name of the .FD file, e.g., for PERSON.FD, it would be
  7329//          PERSON.
  7330//
  7331// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7332
  7333//#COMMAND DECLARE_DATAFILE L#GT
  7334//  #IF (!0>0)
  7335//    #IFDEF !1.RECNUM
  7336//      #IFDEF !1.FILE_NUMBER
  7337//      #ELSE
  7338//        #SET Q$ !1.RECNUM
  7339//        #REPLACE !1.FILE_NUMBER |CI!q
  7340//      #ENDIF
  7341//    #ELSE
  7342//      #INCLUDE !1.FD
  7343//      #SET Q$ !1.RECNUM
  7344//      #REPLACE !1.FILE_NUMBER |CI!q
  7345//    #ENDIF
  7346//    DECLARE_DATAFILE !2 !3 !4 !5 !6 !7 !8 !9
  7347//  #ENDIF
  7348//#ENDCOMMAND
  7349
  7350// Newer files may include the file_number symbol within the fd file. The rules should be:
  7351// 1. If file has a recnum, it must define recnum in the file and it must NOT define file_number
  7352//    (we don't define file_number so these fd files will be compatible with older DFs). In this case, file_number
  7353//    will be defined in this command.
  7354// 2. If file is new and does not support recnum, we define File_number but not recnum. Recnum will not
  7355//    be defined at all.
  7356// Therefore, by the end of this command, file_number is always defined and recnum is defined only if it exists
  7357
  7358#COMMAND DECLARE_DATAFILE L#GT
  7359  #IF (!0>0)
  7360    #IFNDEF !1.RECNUM
  7361      #IFNDEF !1.FILE_NUMBER
  7362          // if neither file_number or recnum is defined, we must include the fd file
  7363          #INCLUDE !1.FD
  7364      #ENDIF
  7365    #ENDIF
  7366    // if file_number does not exist at this point we have an FD that does not
  7367    // directly define it (i.e., pre rowID FD or table that suports recnum). Create the symbol
  7368    #IFNDEF !1.FILE_NUMBER
  7369      #SET Q$ !1.RECNUM
  7370      #REPLACE !1.FILE_NUMBER |CI!q
  7371    #ENDIF
  7372    DECLARE_DATAFILE !2 !3 !4 !5 !6 !7 !8 !9
  7373  #ENDIF
  7374#ENDCOMMAND
  7375
  7376// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7377//
  7378//  Command:
  7379//      SET_FILE_FIELD fileNum fieldNum
  7380//      SET_FILE_INDEX fileNum indexNum
  7381//
  7382//  Description:
  7383//      Used by API commands requiring more than 2 parameters. Assigns
  7384//      the fileNum and field or index number. Two commands were provided
  7385//      to allow improve readability of code.
  7386//
  7387//  Parameters:
  7388//      fileNum:
  7389//          The number of the file.
  7390//      fieldNum:
  7391//      indexNum:
  7392//          The number of the field or index ( depending on the command.
  7393//
  7394// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7395
  7396#COMMAND SET_FILE_FIELD ULG# ULG# .
  7397    !A [] $502 !1 !2
  7398#ENDCOMMAND
  7399
  7400#COMMAND SET_FILE_INDEX ULG# ULG# .
  7401    !A [] $502 !1 !2
  7402#ENDCOMMAND
  7403
  7404
  7405// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7406//
  7407//  Command:
  7408//      SET_SEGMENT_MISC segmentNum miscNum
  7409//
  7410//  Description:
  7411//      Used by API commands requiring more than 2 parameters. Assigns
  7412//      the segmentNum and miscNum.
  7413//
  7414//  Parameters:
  7415//      segmentNum:
  7416//          The number of the segment of an index
  7417//      miscNum:
  7418//          A command dependent numeric value.
  7419//
  7420// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7421
  7422#COMMAND SET_SEGMENT_MISC ULG# ULG# .
  7423    !A [] $503 !1 !2
  7424#ENDCOMMAND
  7425
  7426
  7427// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7428//
  7429//  Command:
  7430//      SET_LENGTH_OFFSET length offset
  7431//
  7432//  Description:
  7433//      Used by API commands requiring additional length and offset
  7434//      parameters.
  7435//
  7436//  Parameters:
  7437//      length:
  7438//          Typically in bytes.
  7439//      offset:
  7440//          Typically in bytes.
  7441//
  7442// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7443
  7444#COMMAND SET_LENGTH_OFFSET ULG# ULG# .
  7445    !A [] $52E !1 !2
  7446#ENDCOMMAND
  7447
  7448
  7449// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7450//
  7451//  Command:
  7452//     GET_ATTRIBUTE attribute;
  7453//         {OF fileNum {fieldNum|(indexNum {segmentNum})} "TO" VARIABLE
  7454//
  7455//  Description:
  7456//     Get a global, file, field, or index attribute.
  7457//
  7458//  Parameters
  7459//      attribute
  7460//          Attribute id (as defined by API) to be set
  7461//      fileNum
  7462//          Optional handle for either a file or a structure
  7463//      fieldNum
  7464//          Optional field to be interrogated
  7465//      indexNum
  7466//          Optional index to be interrogated
  7467//      segmentNum
  7468//          Num of segment in index to be interrogated
  7469//
  7470// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7471
  7472#COMMAND GET_ATTRIBUTE RLGU#
  7473  #IFSAME !2 TO
  7474    #CHECK !3 _RLGUC#
  7475    #CHECK !4 .
  7476    SET_FILE_FIELD |CI0 |CI0
  7477    SET_SEGMENT_MISC |CI0 |CI0
  7478    !A [] $501 !1 !3
  7479  #ELSE
  7480    #IFSAME !2 OF
  7481    #ELSE
  7482      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX Missing keyword "OF"
  7483    #ENDIF
  7484    #IFSAME !4 TO
  7485      #CHECK !3 _RLGU#
  7486      #CHECK !5 _RLGU#
  7487      #CHECK !6 .
  7488      SET_FILE_FIELD !3 |CI0
  7489      SET_SEGMENT_MISC |CI0 |CI0
  7490      !A [] $501 !1 !5
  7491    #ELSE
  7492      #IFSAME !5 TO
  7493        #CHECK !3 _RLGU#
  7494        #CHECK !4 _RLGU#
  7495        #CHECK !6 _RCLGU#
  7496        #CHECK !7 .
  7497        SET_FILE_FIELD !3 !4
  7498        SET_SEGMENT_MISC |CI0 |CI0
  7499        !A [] $501 !1 !6
  7500      #ELSE
  7501        #IFSAME !6 TO
  7502          #CHECK !3 _RLGU#
  7503          #CHECK !4 _RLGU#
  7504          #CHECK !5 _RLGU#
  7505          #CHECK !7 _RCLGU#
  7506          #CHECK !8 .
  7507          SET_FILE_FIELD !3 !4
  7508          SET_SEGMENT_MISC !5 |CI0
  7509          !A [] $501 !1 !7
  7510        #ELSE
  7511          #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX Missing keyword "TO"
  7512        #ENDIF
  7513      #ENDIF
  7514    #ENDIF
  7515  #ENDIF
  7516#ENDCOMMAND
  7517
  7518
  7519//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7520//
  7521//  Command:
  7522//     SET_ATTRIBUTE attribute;
  7523//         {OF fileNum {fieldNum|(indexNum {segmentNum})} "TO" VARIABLE
  7524//
  7525//  Description:
  7526//     Get a global, file, field, or index attribute.
  7527//
  7528//  Parameters
  7529//      attribute
  7530//          Attribute id (as defined by API) to be set
  7531//      fileNum
  7532//          Optional handle for either a file or a structure
  7533//      fieldNum
  7534//          Optional field to be modified
  7535//      indexNum
  7536//          Optional index to be modified
  7537//      segmentNum
  7538//          Num of segment in index to be modified
  7539//
  7540//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7541
  7542#COMMAND SET_ATTRIBUTE RLG#
  7543  #IFSAME !2 TO
  7544    #CHECK !3 _RLGU#
  7545    #CHECK !4 .
  7546    SET_FILE_FIELD |CI0 |CI0
  7547    SET_SEGMENT_MISC |CI0 |CI0
  7548    !A [] $504 !1 !3
  7549  #ELSE
  7550    #IFSAME !2 OF
  7551    #ELSE
  7552      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX Missing keyword "OF"
  7553    #ENDIF
  7554    #IFSAME !4 TO
  7555      #CHECK !3 _RLGU#
  7556      #CHECK !5 _RLGU#
  7557      #CHECK !6 .
  7558      SET_FILE_FIELD !3 |CI0
  7559      SET_SEGMENT_MISC |CI0 |CI0
  7560      !A [] $504 !1 !5
  7561    #ELSE
  7562      #IFSAME !5 TO
  7563        #CHECK !3 _RLGU#
  7564        #CHECK !4 _RLGU#
  7565        #CHECK !6 _RLGU#
  7566        #CHECK !7 .
  7567        SET_FILE_FIELD !3 !4
  7568        SET_SEGMENT_MISC |CI0 |CI0
  7569        !A [] $504 !1 !6
  7570      #ELSE
  7571        #IFSAME !6 TO
  7572          #CHECK !3 _RLGU#
  7573          #CHECK !4 _RLGU#
  7574          #CHECK !5 _RLGU#
  7575          #CHECK !7 _RLGU#
  7576          #CHECK !8 .
  7577          SET_FILE_FIELD !3 !4
  7578          SET_SEGMENT_MISC !5 |CI0
  7579          !A [] $504 !1 !7
  7580        #ELSE
  7581          #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX Missing keyword "TO"
  7582        #ENDIF
  7583      #ENDIF
  7584    #ENDIF
  7585  #ENDIF
  7586#ENDCOMMAND
  7587
  7588
  7589// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7590//
  7591//  Command:
  7592//     STRUCTURE_START fileNum driverName
  7593//
  7594//  Description:
  7595//     This function begins creation of a new file or modification of
  7596//     an existing file.
  7597//
  7598//  Parameters:
  7599//     fileNum:
  7600//         The number for an existing file. It must be 0 if starting a
  7601//         new file or the number of a file being modified. In either
  7602//         case, a handle to the structure is written back into fileNum
  7603//         so that attributes of the new structure can be queried.
  7604//
  7605//     driverName:
  7606//         Name of the driver to use when creating a new file.
  7607//
  7608// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7609
  7610#COMMAND STRUCTURE_START RLG#U INDLG#U .
  7611    !A [] $505 !1 !2
  7612#ENDCOMMAND
  7613
  7614
  7615// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7616//
  7617//  Command:
  7618//      STRUCTURE_ABORT structureHandle
  7619//
  7620//  Description:
  7621//      Terminates a file structure operation without completing it.
  7622//
  7623//  Parameters:
  7624//      structureHandle
  7625//          Handle from the structure_start.
  7626//
  7627// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7628
  7629#COMMAND STRUCTURE_ABORT RLG#U .
  7630    !A [] $508 !1
  7631#ENDCOMMAND
  7632
  7633
  7634// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7635//
  7636//  Command:
  7637//      STRUCTURE_END fileNum {restructureOptions {tempDir {callBackObject}}}
  7638//
  7639//  Description:
  7640//      This function commits a structure operation, performing restructure
  7641//      on the file if necessary.
  7642//
  7643//  Parameters:
  7644//      fileNum:
  7645//          The number of the file ( or handle returned by STRUCTURE_START
  7646//          for a new file ) which a STRUCTURE_START has been done on.
  7647//
  7648//      restructureOptions:
  7649//          The IAND'ing of the following API attributes:
  7650//              DF_STRUCTEND_OPT_NONE
  7651//              DF_STRUCTEND_OPT_FORCE
  7652//              DF_STRUCTEND_OPT_RECOMPRESS
  7653//              DF_STRUCTEND_OPT_INPLACE
  7654//
  7655//      tempDir:
  7656//          A temporary directory to be used in not restructuring in place.
  7657//
  7658//      callBackObject:
  7659//          An object id which will receive MSG_CALLBACK during the restructure
  7660//          operation. This the first parameter of this message is a string
  7661//          containing progress information.
  7662//
  7663// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7664
  7665#COMMAND STRUCTURE_END RLUG# LUG# NDILUG# LUG# .
  7666    !A [] $506 !1 !2
  7667    !A [] $507 !3 !4
  7668#ENDCOMMAND
  7669
  7670
  7671// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7672//
  7673//  Command:
  7674//        STRUCTURE_COPY fromFileNumber TO toFileNumber
  7675//
  7676//  Descriptiion:
  7677//        Copies structure of one file to another
  7678//
  7679//  Parameters:
  7680//        fromFileNumber:
  7681//            File Number of the file from where the structure is to be copied
  7682//
  7683//        toFileNumber:
  7684//            Number of the file to which the structure is to be copied
  7685//
  7686//
  7687// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7688
  7689
  7690#COMMAND STRUCTURE_COPY RLUG# "TO" RLUG# .
  7691    !A [] $51C !1 !3
  7692#ENDCOMMAND
  7693
  7694// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7695//
  7696//  Command:
  7697//        FILL_FIELD FileNumber fieldNumber { "WITH" <Fill_Type> }
  7698//
  7699//  Description:
  7700//        Fill a field with the highest or lowest value ot the type.
  7701//  Fill_type:
  7702//         DF_HIGH or DF_LOW. For example for a numeric field, DF_HIGH is
  7703//         all 9's and lowest being all 0's
  7704//
  7705//  Parameters:
  7706//         FileNumber:
  7707//            Number of the file
  7708//
  7709//         Field Number:
  7710//            Number of the field which is to be filled
  7711//
  7712// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7713
  7714#COMMAND FILL_FIELD RLUG# RLUG#  "WITH" RLUG# .
  7715    !A [] $51D !1
  7716    !A [] $51E !2 !4
  7717#ENDCOMMAND
  7718
  7719
  7720// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7721//
  7722//  Command:
  7723//      CREATE_FIELD fileNum {"AT" fieldNum}
  7724//
  7725//  Description:
  7726//      Creates a new field. If fieldNum is ommitted or 0,
  7727//      field is appended to record. Actual fieldNum assigned
  7728//      to new field is returned in fieldNum. fileNum must
  7729//      be the number of a file currently being restructured or
  7730//      created.
  7731//
  7732//  Parameter:
  7733//      fileNum
  7734//          Handle for either a file or a structure
  7735//      fieldNum
  7736//          Field to be modified
  7737//
  7738// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7739
  7740#COMMAND CREATE_FIELD RLUG# "AT""" LUG# .
  7741    !A [] $509 !1 !3
  7742#ENDCOMMAND
  7743
  7744
  7745// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7746//
  7747//  Command:
  7748//      DELETE_FIELD fileNum fieldNum
  7749//
  7750//  Description:
  7751//      Delete the field described by fieldNum and fileNum. NOTE:
  7752//      the fileNum handle must be for a file that has had a STRUCTURE_START
  7753//      done on it.
  7754//
  7755//  Parameter:
  7756//      fileNum
  7757//          Handle for either a file or a structure
  7758//      fieldNum
  7759//          Field to be modified
  7760//
  7761// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7762
  7763#COMMAND DELETE_FIELD R R .
  7764    !A [] $50b !1 !2
  7765#ENDCOMMAND
  7766
  7767
  7768// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7769//
  7770//  Command:
  7771//      CREATE_INDEX fileNum {"AT" indexNum}
  7772//
  7773//  Description:
  7774//      Creates a new index for file fileNum. STRUCTURE_START must have
  7775//      been called for fileNum. IndexNum will contain the number of
  7776//      the index created; any value in it prior to the call is ignored.
  7777//
  7778//  Parameter:
  7779//      indexNum
  7780//          Handle for either a file or a structure
  7781//      fieldNum
  7782//          Field to be modified
  7783//
  7784// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7785
  7786#COMMAND CREATE_INDEX RLUG# "AT" RLUG#C .
  7787    !A [] $50a !1 !3
  7788#ENDCOMMAND
  7789
  7790
  7791// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7792//
  7793//  Command:
  7794//      DELETE_INDEX fileNum indexNum
  7795//
  7796//  Description:
  7797//      Delete the index described by indexNum and fileNum. NOTE:
  7798//      the fileNum handle must be for a file that has had a
  7799//      STRUCTURE_START done on it.
  7800//
  7801// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7802
  7803#COMMAND DELETE_INDEX RLUG# RLUG# .
  7804    !A [] $50c !1 !2
  7805#ENDCOMMAND
  7806
  7807
  7808// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7809//
  7810//  Command:
  7811//      VARIABLE_FILE_COMMAND command [fileSymbol|fileNum]
  7812//
  7813//  Description:
  7814//      This command allows the execution of any other command,
  7815//      handling both file numbers ( 102 ) and file symbols
  7816//      ( PERSON )
  7817//
  7818//  Parameters:
  7819//      command:
  7820//          The DataFlex command number
  7821//      fileSymbol:
  7822//          The symbol used to load the .FD file; the logical name of the file.
  7823//      fileNum:
  7824//          The number of the file ( obviously ).
  7825//
  7826// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7827
  7828#COMMAND VARIABLE_FILE_COMMAND
  7829  //#IFSAME !2 |FS0,0& |FN0,0& |FD0,0&
  7830  // This supports both Indirect_file and Indirect_file.Recnum -JJT
  7831  #IFSAME !2.FILE_NUMBER |FS0,0& |FN0,0& |FD0,0& |FS0,0&.RECNUM
  7832    !A [] !1 |CI0 !3
  7833  #ELSE
  7834    #IFCLASS !2 SNDIECWVF
  7835        !A [] !1 !2 !3
  7836    #ELSE
  7837        DECLARE_DATAFILE !2
  7838        !A [] !1 !2.FILE_NUMBER !3
  7839    #ENDIF
  7840  #ENDIF
  7841#ENDCOMMAND
  7842
  7843
  7844// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7845//
  7846//  Command:
  7847//      OPEN {fileName AS} [logicalName|fileNum|] {MODE fileMode} index
  7848//
  7849//  Description:
  7850//      Open a DataFile using the specified filename of filenumber.
  7851//
  7852//  Parameters:
  7853//      fileName:
  7854//          A string containing the physical name of the file
  7855//      logicalName:
  7856//          The symbolic name used to find the .FD file.
  7857//      fileNum:
  7858//          A number which will be used to open the file. If using the "AS"
  7859//          form, fileNum may be a variable containing a 0. In that case,
  7860//          filelist will be searched for an entry with a logical name
  7861//          matching fileName; the number of the first entry matching will
  7862//          be used as the number to open the file and will be written
  7863//          back to the variable used for fileNum.
  7864//      fileMode:
  7865//          The mode to open the file in ( e.g., DF_EXCLUSIVE ).
  7866//      index:
  7867//          Index to buffer, may be either a number or an index symbol (INDEX.1)
  7868//
  7869// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7870
  7871#COMMAND API_OPEN RLG#
  7872  #IFSAME !2 AS
  7873    //#IFSAME !3 |FS0,0& |FN0,0& |FD0,0&
  7874    // This supports both Indirect_file and Indirect_file.Recnum -JJT
  7875    #IFSAME !3.FILE_NUMBER |FS0,0& |FN0,0& |FD0,0& |FS0,0&.RECNUM
  7876        #SET Q$ $516 // Open indirect
  7877    #ELSE
  7878        #SET Q$ $50d // Open normally
  7879    #ENDIF
  7880    #IFSAME !4 MODE
  7881      #CHECK !5 _RLUG#
  7882      !A [] $517 !5 !6
  7883      VARIABLE_FILE_COMMAND !q !3 !1
  7884    #ELSE
  7885      !A [] $517 DF_SHARE !4
  7886      VARIABLE_FILE_COMMAND !q !3 !1
  7887    #ENDIF
  7888  #ELSE
  7889    //#IFSAME !1 |FS0,0& |FN0,0& |FD0,0&
  7890    // This supports both Indirect_file and Indirect_file.Recnum -JJT
  7891    #IFSAME !1.FILE_NUMBER |FS0,0& |FN0,0& |FD0,0& |FS0,0&.RECNUM
  7892        #SET Q$ $516 // Open indirect
  7893    #ELSE
  7894        #SET Q$ $50d // Open normally
  7895    #ENDIF
  7896    #IFSAME !2 MODE
  7897      #CHECK !3 _RLUG#
  7898      !A [] $517 !3 !4
  7899      VARIABLE_FILE_COMMAND !q !1 |CS""
  7900    #ELSE
  7901      !A [] $517 DF_SHARE !2
  7902      VARIABLE_FILE_COMMAND !q !1  |CS""
  7903    #ENDIF
  7904  #ENDIF
  7905#ENDCOMMAND
  7906
  7907// Removed for 11.0 - only works with recnum tables. This was never documented and never designed to be used.
  7908// The Old_xxx commands were created when the API was added and probably left here for testing.
  7909// Anyone using the direct old command value (e.g. $c4 for relate) will only work with recnum tables. It is
  7910// very unikely anyone is using the actual command codes (a very bad practice that this not at all supported).
  7911//#COMMAND OLD_OPEN
  7912//  #IFSAME !2 AS
  7913//    DECLARE_DATAFILE !3
  7914//    #CHECK !3 _TR
  7915//    #CHECK !1 _#LG
  7916//    #CHECK !5 .
  7917//    #CHECK !3.RECNUM _URW#LG
  7918//    #IF (!0>3)
  7919//      #CHECK !4 _DGLOBU#
  7920//      MOVEINT !4 TO FIELDNUMBER
  7921//      !A [] $182 !3.RECNUM !1
  7922//    #ELSE
  7923//      MOVEINT |CI0 TO FIELDNUMBER
  7924//      !A [] $182 !3.RECNUM !1
  7925//    #ENDIF
  7926//  #ELSE
  7927//    #CHECK !3 .
  7928//    DECLARE_DATAFILE !1
  7929//    #CHECK !1.RECNUM _URW#LG
  7930//    #IF (!0>1)
  7931//      #CHECK !2 _FWSNDELG#U
  7932//      !A [] $180 !1.RECNUM !2
  7933//    #ELSE
  7934//      !A [] $180 !1.RECNUM |CI0
  7935//    #ENDIF
  7936//  #ENDIF
  7937//#ENDCOMMAND
  7938
  7939#COMMAND OPEN
  7940    API_OPEN !1 !2 !3 !4 !5 !6 !7 !8 !9
  7941#ENDCOMMAND
  7942
  7943
  7944// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7945//
  7946//  Command:
  7947//      CLEAR {logicalName|fileNum}*n
  7948//
  7949//  Description:
  7950//      Clear the current record in the file.
  7951//
  7952//  Parameters:
  7953//      logicalName:
  7954//          The name used to identify the file in a DataFlex program.
  7955//      fileNum:
  7956//          The number used to open the file.
  7957//
  7958// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7959
  7960#COMMAND API_CLEAR RLG#
  7961  VARIABLE_FILE_COMMAND $50e !1
  7962  #IF (!0>1)
  7963    API_CLEAR !2 !3 !4 !5 !6 !7 !8 !9
  7964  #ENDIF
  7965#ENDCOMMAND
  7966
  7967// see Old_open command for notes on this removal
  7968//#COMMAND OLD_CLEAR CVWR#LGE
  7969//  #IFDEF !1
  7970//    !A [] $C1 !1
  7971//  #ELSE
  7972//    #CHECK !1.RECNUM _CVWLR#GU
  7973//    !A [] $C1 !1.RECNUM
  7974//  #ENDIF
  7975//  #IF !0>1
  7976//    OLD_CLEAR !2 !3 !4 !5 !6 !7 !8 !9
  7977//  #ENDIF
  7978//#ENDCOMMAND
  7979
  7980#COMMAND CLEAR
  7981    #IFSAME !1 DF_ALL
  7982        !A [] $52C
  7983    #ELSE
  7984        API_CLEAR !1 !2 !3 !4 !5 !6 !7 !8 !9
  7985    #ENDIF
  7986#ENDCOMMAND
  7987
  7988
  7989// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  7990//
  7991//  Command:
  7992//      NewRecord {logicalName|fileNum}*n
  7993//
  7994//  Description:
  7995//      Sets the record buffer to inactive while retaining all existing data (w/ exception of recnum which is 0ed)
  7996//
  7997//  Parameters:
  7998//      logicalName:
  7999//          The name used to identify the file in a DataFlex program.
  8000//      fileNum:
  8001//          The number used to open the file.
  8002//
  8003// added as of 12.0 - This is the recommended way to "inactivate" a record so it can be saved as a new record.
  8004// if recnum is used, this always moves 0 to recnum.
  8005// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8006
  8007#COMMAND NEWRECORD RLG#
  8008  VARIABLE_FILE_COMMAND $531 !1
  8009  #IF (!0>1)
  8010    NEWRECORD !2 !3 !4 !5 !6 !7 !8 !9
  8011  #ENDIF
  8012#ENDCOMMAND
  8013
  8014
  8015
  8016// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8017//
  8018//  Command:
  8019//      CLOSE {logicalName|fileNum}*n
  8020//
  8021//  Description:
  8022//      Closes the file.
  8023//
  8024//  Parameters:
  8025//      logicalName:
  8026//          The name used to identify the file in a DataFlex program.
  8027//      fileNum:
  8028//          The number used to open the file.
  8029//
  8030// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8031
  8032#COMMAND API_CLOSE RLG#
  8033  VARIABLE_FILE_COMMAND $50f !1
  8034  #IF (!0>1)
  8035    API_CLOSE !2 !3 !4 !5 !6 !7 !8 !9
  8036  #ENDIF
  8037#ENDCOMMAND
  8038
  8039// see Old_open command for notes on this removal
  8040//#COMMAND OLD_CLOSE RTE
  8041//  #CHECK !1.RECNUM _CVWLR#GU
  8042//  !A [] $181 !1.RECNUM
  8043//  #IF (!0>1)
  8044//    OLD_CLOSE !2 !3 !4 !5 !6 !7 !8 !9
  8045//  #ENDIF
  8046//#ENDCOMMAND
  8047
  8048#COMMAND CLOSE
  8049    #IFSAME !1 DF_ALL
  8050       !A [] $52D !2
  8051    #ELSE
  8052       API_CLOSE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8053    #ENDIF
  8054#ENDCOMMAND
  8055
  8056
  8057// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8058//
  8059//  Command:
  8060//      GET_FIELD_VALUE fileNum fieldNum "TO" destVariable;
  8061//          {"LENGTH" iLength {"OFFSET" iOffset}}
  8062//
  8063//  Description:
  8064//      Gets the value of a field into the destVariable doing any
  8065//      type conversion necessary.
  8066//
  8067//  Parameters:
  8068//      fileNum:
  8069//          The number used to open the file.
  8070//      fieldNum:
  8071//          The number of the field.
  8072//      destVariable:
  8073//          Where the fields value will be put.
  8074//      iLength:
  8075//          The length of the data to be used. By default, all
  8076//          data (or as much as can be) is written into the field.
  8077//          A length of 0 causes all data to be written.
  8078//      iOffset:
  8079//          The first byte in the field where data will be written, from 0.
  8080//          Default is that data will be written into the field starting at
  8081//          byte 0.
  8082//
  8083// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8084
  8085#COMMAND GET$FIELD$VALUE$HELP RLGU# RLGU# "TO" CRLGU# "LENGTH" RLGU# "OFFSET" RLGU# .
  8086  SET_FILE_FIELD !1 !2
  8087  SET_LENGTH_OFFSET !6 !8
  8088  !A [] $510 !4
  8089#ENDCOMMAND
  8090
  8091#COMMAND GET_FIELD_VALUE RLGU# RLGU# "TO" CRLGU#
  8092  #IF (!0=4)
  8093    GET$FIELD$VALUE$HELP !1 !2 !3 !4 LENGTH 0 OFFSET 0
  8094  #ELSE
  8095    #IF (!0=6)
  8096      GET$FIELD$VALUE$HELP !1 !2 !3 !4 !5 !6 OFFSET 0
  8097    #ELSE
  8098      GET$FIELD$VALUE$HELP !1 !2 !3 !4 !5 !6 !7 !8 !9
  8099    #ENDIF
  8100  #ENDIF
  8101#ENDCOMMAND
  8102
  8103
  8104// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8105//
  8106//  Command:
  8107//      SET_FIELD_VALUE fileNum fieldNum "TO" newValue;
  8108//          {"LENGTH" iLength {"OFFSET" iOffset {noTruncateFlag}}}
  8109//
  8110//  Description:
  8111//      Sets the value of a field to newValue doing any type conversion
  8112//      necessary.
  8113//
  8114//  Parameters:
  8115//      fileNum:
  8116//          The number used to open the file.
  8117//      fieldNum:
  8118//          The number of the field.
  8119//      newValue:
  8120//          The value to be put into the field.
  8121//      iLength:
  8122//          The length of the data to be used. By default, all
  8123//          data (or as much as can be) is written into the field.
  8124//          A length of 0 causes all data to be written.
  8125//      iOffset:
  8126//          The first byte in the field where data will be written, from 0.
  8127//          Default is that data will be written into the field starting at
  8128//          byte 0.
  8129//      noTruncateFlag:
  8130//          Flag which signifies whether existing data in the field
  8131//          following data that is edited will be truncated or not. By
  8132//          default, all old data following new data written is truncated.
  8133//
  8134// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8135
  8136#COMMAND SET$FIELD$VALUE$HELP$2 "LENGTH" RLGU# "OFFSET" RLGU# .
  8137    SET_LENGTH_OFFSET !2 !4
  8138#ENDCOMMAND
  8139
  8140#COMMAND SET$FIELD$VALUE$HELP RLGU# RLGU# "TO" RLGU# RLGU# .
  8141  SET_FILE_FIELD !1 !2
  8142  !A [] $511 !4 !5
  8143#ENDCOMMAND
  8144
  8145#COMMAND SET_FIELD_VALUE RLGU# RLGU# "TO" RLGU#
  8146  #IF (!0=4)
  8147    SET$FIELD$VALUE$HELP$2 LENGTH 0 OFFSET 0
  8148    SET$FIELD$VALUE$HELP !1 !2 !3 !4 DFFALSE
  8149  #ELSE
  8150    #IF (!0=6)
  8151      SET$FIELD$VALUE$HELP$2 !5 !6 OFFSET 0
  8152      SET$FIELD$VALUE$HELP !1 !2 !3 !4 DFFALSE
  8153    #ELSE
  8154      #IF (!0=8)
  8155        SET$FIELD$VALUE$HELP$2 !5 !6 !7 !8
  8156        SET$FIELD$VALUE$HELP !1 !2 !3 !4 DFFALSE
  8157      #ELSE
  8158        SET$FIELD$VALUE$HELP$2 !5 !6 !7 !8
  8159        SET$FIELD$VALUE$HELP !1 !2 !3 !4 !9
  8160      #ENDIF
  8161    #ENDIF
  8162  #ENDIF
  8163#ENDCOMMAND
  8164
  8165
  8166// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8167//
  8168//  Command:
  8169//      SAVERECORD {logicalName|fileNum}*n
  8170//
  8171//  Description:
  8172//      Saves the current record in the specified files.
  8173//
  8174//  Parameters:
  8175//      logicalName:
  8176//          The name used to identify the file in a DataFlex program.
  8177//      fileNum:
  8178//          The number used to open the file.
  8179//
  8180// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8181
  8182#COMMAND API_SAVERECORD RLG#
  8183  VARIABLE_FILE_COMMAND $512 !1
  8184  #IF !0>1
  8185    API_SAVERECORD !2 !3 !4 !5 !6 !7 !8 !9
  8186  #ENDIF
  8187#ENDCOMMAND
  8188
  8189// see Old_open command for notes on this removal
  8190//#COMMAND OLD_SAVERECORD CVWR#LGE
  8191//  #IFDEF !1
  8192//    !A [] $C2 !1
  8193//  #ELSE
  8194//    #CHECK !1.RECNUM _CVWLR#GU
  8195//    !A [] $C2 !1.RECNUM
  8196//  #ENDIF
  8197//  #IF !0>1
  8198//    OLD_SAVERECORD !2 !3 !4 !5 !6 !7 !8 !9
  8199//  #ENDIF
  8200//#ENDCOMMAND
  8201
  8202#COMMAND SAVERECORD
  8203    API_SAVERECORD !1 !2 !3 !4 !5 !6 !7 !8 !9
  8204#ENDCOMMAND
  8205
  8206
  8207// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8208//
  8209//  Command:
  8210//      ATTACH {logicalName|fileNum}*n
  8211//
  8212//  Description:
  8213//      Updates all fields in the current record which relate to another file
  8214//      with the values of those fields in the parent ( or related-to) files.
  8215//
  8216//  Parameters:
  8217//      logicalName:
  8218//          The name used to identify the file in a DataFlex program.
  8219//      fileNum:
  8220//          The number used to open the file.
  8221//
  8222// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8223
  8224#COMMAND API_ATTACH RLG#
  8225    VARIABLE_FILE_COMMAND $513 !1
  8226    #IF !0>1
  8227       API_ATTACH !2 !3 !4 !5 !6 !7 !8 !9
  8228    #ENDIF
  8229#ENDCOMMAND
  8230
  8231// see Old_open command for notes on this removal
  8232//#COMMAND OLD_ATTACH CVWR#LGE
  8233//  #IFDEF !1
  8234//    !A [] $C5 !1
  8235//  #ELSE
  8236//    #CHECK !1.RECNUM _CVWLR#GU
  8237//    !A [] $C5 !1.RECNUM
  8238//  #ENDIF
  8239//  #IF !0>1
  8240//    OLD_ATTACH !2 !3 !4 !5 !6 !7 !8 !9
  8241//  #ENDIF
  8242//#ENDCOMMAND
  8243
  8244#COMMAND ATTACH
  8245    API_ATTACH !1 !2 !3 !4 !5 !6 !7 !8 !9
  8246#ENDCOMMAND
  8247
  8248
  8249// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8250//
  8251//  Command:
  8252//      SAVE {logicalName|fileNum}*n
  8253//
  8254//  Description:
  8255//      Save the contents of the currently active record, updating the
  8256//      records with any data in parent files from related fields (as per
  8257//      attach).
  8258//
  8259//  Parameters:
  8260//      logicalName:
  8261//          The name used to identify the file in a DataFlex program.
  8262//      fileNum:
  8263//          The number used to open the file.
  8264//
  8265// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8266
  8267#COMMAND API_SAVE RLG#
  8268  ATTACH !1
  8269  SAVERECORD !1
  8270  #IF (!0>1)
  8271    API_SAVE !2 !3 !4 !5 !6 !7 !8 !9
  8272  #ENDIF
  8273#ENDCOMMAND
  8274
  8275// see Old_open command for notes on this removal
  8276//#COMMAND OLD_SAVE CVWR#LGE
  8277//  #IFDEF !1
  8278//    !A [] $C5 !1
  8279//    !A [] $C2 !1
  8280//  #ELSE
  8281//    #CHECK !1.RECNUM _CLVWLR#GU
  8282//    !A [] $C5 !1.RECNUM
  8283//    !A [] $C2 !1.RECNUM
  8284//  #ENDIF
  8285//  #IF !0>1
  8286//    OLD_SAVE !2 !3 !4 !5 !6 !7 !8 !9
  8287//  #ENDIF
  8288//#ENDCOMMAND
  8289
  8290#COMMAND SAVE
  8291    API_SAVE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8292#ENDCOMMAND
  8293
  8294
  8295// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8296//
  8297//  Command:
  8298//      DELETE {fileNum|logicalName}*n
  8299//
  8300//  Description:
  8301//      Delete the currently active record from the datafile
  8302//
  8303//  Parameters:
  8304//      logicalName:
  8305//          The name used to identify the file in a DataFlex program.
  8306//      fileNum:
  8307//          The number used to open the file.
  8308//
  8309// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8310
  8311// see Old_open command for notes on this removal
  8312//#COMMAND OLD_DELETE CVWR#LGE
  8313//  #IFDEF !1
  8314//    !A [] $C3 !1
  8315//  #ELSE
  8316//    #CHECK !1.RECNUM _CVWLR#GU
  8317//    !A [] $C3 !1.RECNUM
  8318//  #ENDIF
  8319//  #IF !0>1
  8320//    OLD_DELETE !2 !3 !4 !5 !6 !7 !8 !9
  8321//  #ENDIF
  8322//#ENDCOMMAND
  8323
  8324#COMMAND API_DELETE RLG#
  8325  VARIABLE_FILE_COMMAND $514 !1
  8326  #IF !0>1
  8327    API_DELETE !2 !3 !4 !5 !6 !7 !8 !9
  8328  #ENDIF
  8329#ENDCOMMAND
  8330
  8331#COMMAND DELETE
  8332    API_DELETE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8333#ENDCOMMAND
  8334
  8335
  8336// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8337//
  8338//  Command:
  8339//      RELATE {fileNum|logicalName}*n
  8340//
  8341//  Description:
  8342//      Moves all related fields into the parent files and then performs a
  8343//      find in the parents using the main index of the first (or primary)
  8344//      related field for each parent.
  8345//
  8346//  Parameters:
  8347//      logicalName:
  8348//          The name used to identify the file in a DataFlex program.
  8349//      fileNum:
  8350//          The number used to open the file.
  8351//
  8352// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8353
  8354// see Old_open command for notes on this removal
  8355//#COMMAND OLD_RELATE CVWR#LGR
  8356// $c4 is not public anywhere now. It only works with recnum (e.g. |fnXxxx,00). If anyone one is actually using
  8357// $c4 in their code (highly unlikely) this will only work with recnum tables
  8358//  #IFDEF !1
  8359//    !A [] $C4 !1
  8360//  #ELSE
  8361//    #CHECK !1.RECNUM _CVWLR#GU
  8362//    !A [] $C4 !1.RECNUM
  8363//  #ENDIF
  8364//  #IF !0>1
  8365//    OLD_RELATE !2 !3 !4 !5 !6 !7 !8 !9
  8366//  #ENDIF
  8367//#ENDCOMMAND
  8368
  8369#COMMAND API_RELATE RLG#
  8370  VARIABLE_FILE_COMMAND $515 !1
  8371  #IF !0>1
  8372    API_RELATE !2 !3 !4 !5 !6 !7 !8 !9
  8373  #ENDIF
  8374#ENDCOMMAND
  8375
  8376#COMMAND RELATE
  8377    API_RELATE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8378#ENDCOMMAND
  8379
  8380
  8381// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8382//
  8383//  Command:
  8384//      REREAD {fileNum|logicalName}*n
  8385//
  8386//  Description:
  8387//      Locks all files and then re-finds the current record in each file
  8388//      specified as an argument to the command. If no files are specified,
  8389//      then all files are reread.
  8390//
  8391//  Parameters:
  8392//      logicalName:
  8393//          The name used to identify the file in a DataFlex program.
  8394//      fileNum:
  8395//          The number used to open the file.
  8396//
  8397// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8398
  8399// see Old_open command for notes on this removal
  8400//#COMMAND OLD_REFRESH T  // Re-find all files listed by record identity
  8401//  #CHECK !1.RECNUM _RUWG
  8402//  !A [] $C0 !1.RECNUM |CI2         // FIND command
  8403//  !A [FINDERR] $047 |CI25 |CS"!1" // ERROR command
  8404//  #IF !0>1
  8405//    OLD_REFRESH !2 !3 !4 !5 !6 !7 !8 !9
  8406//  #ENDIF
  8407//#ENDCOMMAND
  8408
  8409// see Old_open command for notes on this removal
  8410//#COMMAND OLD_REREAD
  8411//  #IF !0=0
  8412//    !A [] $0C9 // REREAD command
  8413//  #ELSE
  8414//    !A [] $0C7 // LOCK command
  8415//    [MULTIUSER] OLD_REFRESH !1 !2 !3 !4 !5 !6 !7 !8 !9
  8416//  #ENDIF
  8417//#ENDCOMMAND
  8418
  8419// private. Does a reread for passed file using GetRowId function
  8420#COMMAND VARIABLE_ROWKEY_REFRESH_COMMAND
  8421  // This supports both Indirect_file and Indirect_file.Recnum
  8422  #IFSAME !1.FILE_NUMBER |FS0,0& |FN0,0& |FD0,0& |FS0,0&.RECNUM
  8423      // if someone is doing a Reread and passing indirect_file, then they need to support recnum
  8424      // tables. This technique is not recommended and I doubt if anyone is actually doing this!
  8425      !A [] $CC |CI0 |CI2
  8426  #ELSE
  8427    // the old api_refresh used index_number this so we can safely use this variable (it is not used)
  8428    #IFCLASS !1 SNDIECWVF
  8429        Move (FindByRowId(!1,GetRowId(!1))) to Index_number
  8430    #ELSE
  8431        DECLARE_DATAFILE !1
  8432        Move (FindByRowId(!1.FILE_NUMBER,GetRowId(!1.FILE_NUMBER))) to Index_number
  8433    #ENDIF
  8434  #ENDIF
  8435#ENDCOMMAND
  8436
  8437#COMMAND API_REFRESH
  8438  #IF (!0>0)
  8439    #CHECK !1 _LG#
  8440    // uses GetRowId function to do the reread
  8441    VARIABLE_ROWKEY_REFRESH_COMMAND !1
  8442    #IFCLASS !1 SNDIECWV
  8443      [FINDERR] ERROR 25 !1
  8444    #ELSE
  8445      [FINDERR] ERROR 25 |CS"!1"
  8446    #ENDIF
  8447    API_REFRESH !2 !3 !4 !5 !6 !7 !8 !9
  8448    // the old api_refresh used index_number and set it to zero. We do this to
  8449    // in the unlikely event that someone is counting on this being zero outside of the command
  8450    MOVE 0 to INDEX_NUMBER
  8451  #ENDIF
  8452#ENDCOMMAND
  8453
  8454
  8455//#COMMAND API_REFRESH
  8456//  #IF (!0>0)
  8457//    #CHECK !1 _LG#
  8458//    MOVE 0 to INDEX_NUMBER
  8459//    VARIABLE_FILE_COMMAND $CC !1 |CI2
  8460//    #IFCLASS !1 SNDIECWV
  8461//      [FINDERR] ERROR 25 !1
  8462//    #ELSE
  8463//      [FINDERR] ERROR 25 |CS"!1"
  8464//    #ENDIF
  8465//    API_REFRESH !2 !3 !4 !5 !6 !7 !8 !9
  8466//  #ENDIF
  8467//#ENDCOMMAND
  8468
  8469#COMMAND API_REREAD
  8470  #IF (!0=0)
  8471    !A [] $0C9 // REREAD ALL
  8472  #ELSE
  8473    !A [] $0C7 // LOCK
  8474    [MULTIUSER] API_REFRESH !1 !2 !3 !4 !5 !6 !7 !8 !9
  8475  #ENDIF
  8476#ENDCOMMAND
  8477
  8478#COMMAND REREAD
  8479    API_REREAD !1 !2 !3 !4 !5 !6 !7 !8 !9
  8480#ENDCOMMAND
  8481
  8482
  8483// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8484//
  8485//  Command:
  8486//      ZEROFILE {fileNum|logicalName}
  8487//
  8488//  Description:
  8489//      Erases all data within the file.
  8490//
  8491//  Parameters:
  8492//      logicalName:
  8493//          The name used to identify the file in a DataFlex program.
  8494//      fileNum:
  8495//          The number used to open the file.
  8496//
  8497// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8498
  8499// see Old_open command for notes on this removal
  8500//#COMMAND OLD_ZEROFILE $RT .
  8501//  #IFDEF !1.RECNUM
  8502//    #SET Q$ !1.RECNUM
  8503//    !A [] $308 |CI!q
  8504//  #ELSE
  8505//    #CHECK !1 _SG#L
  8506//    !A [] $308 !1
  8507//  #ENDIF
  8508//#ENDCOMMAND
  8509
  8510#COMMAND API_ZEROFILE RLG# .
  8511  VARIABLE_FILE_COMMAND $308 !1
  8512#ENDCOMMAND
  8513
  8514#COMMAND ZEROFILE
  8515  API_ZEROFILE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8516#ENDCOMMAND
  8517
  8518
  8519// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8520//
  8521//  Command:
  8522//      VCONSTRAIN fileNum RELATES fileNum2
  8523//      VCONSTRAIN fileNum AS boolExpression
  8524//      VCONSTRAIN fileNum fieldNum mode expression
  8525//      VCONSTRAIN fileNum fieldNum mode fileNum2 fieldNum2
  8526//
  8527//  Description:
  8528//      This command allows a variable constraint to be created.
  8529//
  8530//  Parameters:
  8531//      fileNum
  8532//          Num of the file to be constrained
  8533//      fieldNum
  8534//          Num of the field to be constrained
  8535//      boolExpression
  8536//          An expression which is treated as FALSE if it evaluates to zero,
  8537//          TRUE if non-zero
  8538//      expression
  8539//          Any DataFlex expression
  8540//      fileNum2
  8541//          Num of the file to be constrained to
  8542//      fieldNum2
  8543//          Num of the field to be constrained to
  8544//      mode
  8545//          Either the symbols LT, LE, EQ, NE, GT, GE, CONTAINS, and MATCHES,
  8546//          or an expression that corresponds to their symbolic value.
  8547//          MATCHES = 6, CONTAINS = 7.
  8548//
  8549// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8550
  8551#COMMAND CONSTRAIN R
  8552  #IFSAME !2 AS
  8553    #CHECK !3 _CFLVNSWG#
  8554    #CHECK !1.FILE_NUMBER _R#ULWV
  8555    #SET Q$ !1.FILE_NUMBER
  8556    !A [] $DB |CI!q !3        // FILE AS (BOOL-EXP)
  8557  #ELSE
  8558    #IFSAME !2 BETWEEN      // FIELD BETWEEN A AND B
  8559      #CHECK !4 "AND"
  8560      CONSTRAIN !1 GE !3
  8561      CONSTRAIN !1 LE !5
  8562    #ELSE
  8563      #IFSAME !2 RELATES
  8564        #CHECK !3 "TO"
  8565        #IFDEF !1
  8566          #IFDEF !4
  8567            !A [] $D9 !1 !4        // FILE RELATES TO FILE
  8568          #ELSE
  8569            !A [] $D9 !1 !4.FILE_NUMBER // FILE RELATES TO FILE
  8570          #ENDIF
  8571        #ELSE
  8572          #IFDEF !4
  8573            !A [] $D9 !1.FILE_NUMBER !4
  8574          #ELSE
  8575            !A [] $D9 !1.FILE_NUMBER !4.FILE_NUMBER
  8576          #ENDIF
  8577        #ENDIF
  8578      #ELSE
  8579        #CHECK !1 _R#LWVCEBG
  8580        #IF !0>1
  8581          #IFSAME !2 MATCHES
  8582            #SET Q$ 6
  8583          #ELSE
  8584            #IFSAME !2 CONTAINS
  8585              #SET Q$ 7
  8586            #ELSE
  8587              #CHECK !2 _U
  8588              #SET Q$ !2
  8589            #ENDIF
  8590          #ENDIF
  8591          MOVE |CI!q TO INDEX_NUMBER
  8592          #IFCLASS !3 "F"
  8593            !A [] $D2 !1 !3 // FILE MODE FILE
  8594          #ELSE
  8595            !A [] $D1 !1 !3 // FILE MODE VALUE
  8596          #ENDIF
  8597        #ELSE
  8598          #CHECK !1 _CVW#GRE
  8599          !A [] $D3 !1 // FIELD ONLY
  8600        #ENDIF
  8601      #ENDIF
  8602    #ENDIF
  8603  #ENDIF
  8604#ENDCOMMAND
  8605
  8606// Handles comparing file.field to expression|file.field.
  8607#COMMAND VCONSTRAIN_COMPARE #LGUR #LGUR LR #LGUR #LGU .
  8608  !A [] $E7 !1 !2 // Store fileNum fieldNum
  8609  #IFSAME !3 MATCHES CONTAINS $0 $1 $2 $3 $4 $5 $6 $7
  8610    #IFSAME !3 MATCHES
  8611      #SET Q$ 6
  8612    #ELSE
  8613      #IFSAME !3 CONTAINS
  8614        #SET Q$ 7
  8615      #ELSE
  8616        #CHECK !3 _U
  8617        #SET Q$ !3
  8618      #ENDIF
  8619    #ENDIF
  8620    !A [] $E8 |CI!q    // Store comparison mode
  8621  #ELSE
  8622    !A [] $E8 !3    // Store comparison mode
  8623  #ENDIF
  8624  #IF (!0>4)
  8625    !A [] $E9 !4 !5 // fileNum2 fieldNum2
  8626  #ELSE
  8627    !A [] $EA !4    // Expression
  8628  #ENDIF
  8629#ENDCOMMAND
  8630
  8631#COMMAND VCONSTRAIN_AS #LGUR "AS" #LGUR .
  8632  !A [] $DB !1 !3
  8633#ENDCOMMAND
  8634
  8635#COMMAND VCONSTRAIN_RELATE #LGUR "RELATES" #LGUR .
  8636  !A [] $D9 !1 !3
  8637#ENDCOMMAND
  8638
  8639#COMMAND VCONSTRAIN
  8640  #IFSAME !2 RELATES
  8641    VCONSTRAIN_RELATE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8642  #ELSE
  8643    #IFSAME !2 AS
  8644      VCONSTRAIN_AS !1 !2 !3 !4 !5 !6 !7 !8 !9
  8645    #ELSE
  8646      VCONSTRAIN_COMPARE !1 !2 !3 !4 !5 !6 !7 !8 !9
  8647    #ENDIF
  8648  #ENDIF
  8649#ENDCOMMAND
  8650
  8651// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8652//
  8653//  Command:
  8654//      SORT fileNum {indexNumbers {options {callBackObject}}}
  8655//
  8656//  Description:
  8657//
  8658//  Parameters:
  8659//      logicalName:
  8660//          The name used to identify the file in a DataFlex program.
  8661//      fileNum:
  8662//          The number used to open the file.
  8663//      indexNumbers:
  8664//          Optional string listing all index numbers to sort.
  8665//      callBackObject:
  8666//          An object id which will receive MSG_CALLBACK during the restructure
  8667//          operation. This the first parameter of this message is a string
  8668//          containing progress information.
  8669//
  8670// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8671#COMMAND SORT R#LGU #LGU #LUG #LGU .
  8672    !A [] $519 !3 !4
  8673    !A [] $518 !1 !2
  8674#ENDCOMMAND
  8675
  8676
  8677// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8678//
  8679//  Command:
  8680//      OUTPUT_AUX_FILE fileType FOR fileNum {NUMBER logicalNum} {TO optPath}
  8681//
  8682//  Description:
  8683//      Output a database related file.
  8684//
  8685//  Parameters:
  8686//      fileNum:
  8687//          The number used to open the file.
  8688//      logicalNum:
  8689//          The logical number to be used to create the file. Only used if the
  8690//          file to be created is a new file (thus has no set file number).
  8691//      fileType:
  8692//          The type of file to be created, e.g., DF_AUX_FILE_FD or
  8693//          DF_AUX_FILE_DEF.
  8694//      optPath:
  8695//          Optional filename/sequential device where output will be written.
  8696//
  8697// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8698
  8699#COMMAND OUTPUT_AUX_FILE_HELP "NUMBER" L#GU "TO" L#GUIND .
  8700  !A [] $51A !2 !4
  8701#ENDCOMMAND
  8702
  8703#COMMAND OUTPUT_AUX_FILE R#LGU "FOR" R#LGU
  8704  #IF (!0>5)
  8705    #IFSAME !6 NUMBER
  8706      OUTPUT_AUX_FILE_HELP !6 !7 !4 !5 !8 !9
  8707    #ELSE
  8708      OUTPUT_AUX_FILE_HELP !4 !5 !6 !7 !8 !9
  8709    #ENDIF
  8710  #ELSE
  8711    #IF (!0>3)
  8712      #IFSAME !4 NUMBER
  8713        OUTPUT_AUX_FILE_HELP !4 !5 TO |CS"" !6 !7 !8 !9
  8714      #ELSE
  8715        #IFSAME !4 TO
  8716           OUTPUT_AUX_FILE_HELP NUMBER |CI0 !4 !5 !6 !7 !8 !9
  8717        #ELSE // Something is wrong, compiler will say what
  8718           OUTPUT_AUX_FILE_HELP !4 !5 !6 !7 !8 !9
  8719        #ENDIF
  8720      #ENDIF
  8721    #ELSE
  8722      OUTPUT_AUX_FILE_HELP NUMBER |CI0 TO |CS""
  8723    #ENDIF
  8724  #ENDIF
  8725  !A [] $51B !1 !3
  8726#ENDCOMMAND
  8727
  8728
  8729// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8730//
  8731//  Command:
  8732//      OUTPUT_DEF_FILE fileNum {NUMBER logicalNum} {TO optPath}
  8733//
  8734//  Description:
  8735//      Output a .DEF file.
  8736//
  8737//  Parameters:
  8738//      fileNum:
  8739//          The number used to open the file.
  8740//      logicalNum:
  8741//          The logical number to be used to create the file. Only used if the
  8742//          file to be created is a new file (thus has no set file number).
  8743//      optPath:
  8744//          Optional filename/sequential device where output will be written.
  8745//
  8746// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8747
  8748#COMMAND OUTPUT_DEF_FILE
  8749    OUTPUT_AUX_FILE DF_AUX_FILE_DEF FOR !1 !2 !3 !4 !5 !6 !7 !8 !9
  8750#ENDCOMMAND
  8751
  8752
  8753// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8754//
  8755//  Command:
  8756//      OUTPUT_FD_FILE fileNum {NUMBER logicalNum} {TO optPath}
  8757//
  8758//  Description:
  8759//      Output an FD file.
  8760//
  8761//  Parameters:
  8762//      fileNum:
  8763//          The number used to open the file.
  8764//      logicalNum:
  8765//          The logical number to be used to create the file. Only used if the
  8766//          file to be created is a new file (thus has no set file number).
  8767//      optPath:
  8768//          Optional filename/sequential device where output will be written.
  8769//
  8770// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8771
  8772#COMMAND OUTPUT_FD_FILE
  8773    OUTPUT_AUX_FILE DF_AUX_FILE_FD FOR !1 !2 !3 !4 !5 !6 !7 !8 !9
  8774#ENDCOMMAND
  8775
  8776
  8777// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8778//
  8779//  Command:
  8780//      DELETE_DB fileNumber | logicalNameString {IGNORE_ERRORS}
  8781//
  8782//  Description:
  8783//      Deletes a dGatafile. If IGNORE_ERRORS is passed, all errors
  8784//      are suppressed. This should be used when deleting a file that
  8785//      may or may not exist.
  8786//
  8787//  Parameters:
  8788//      fileNumber:
  8789//          Number of file to delete. File can be open but does not have
  8790//          to be
  8791//      logicalNameString:
  8792//          String containing the logical name of the file to delete.
  8793//
  8794// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8795
  8796#COMMAND DELETE_DB RL#G """IGNORE_ERRORS" .
  8797  #IFSAME !2 IGNORE_ERRORS
  8798    !A [] $0e2 !1 |CI1
  8799  #ELSE
  8800    !A [] $0e2 !1 |CI0
  8801  #ENDIF
  8802#ENDCOMMAND
  8803
  8804//-=-=-=-==-==--=-=-=-=-=--=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8805//
  8806// Command:
  8807//      COPY_RECORDS FileNumber1 TO fileNumber2 {NoOfRecords};
  8808//          {USING indexNum} {CALLBACK callback_id}
  8809//
  8810// Description:
  8811//      Copies NoOfRecords from fileNumber1 to fileNumber2. If USING is not
  8812//      specified, recnum is used otherwise records are copied using the
  8813//      specified indexNum. If CALLBACK is specified, the callback function
  8814//      in the object callback_id is called. FileNumber1 AND FileNumber2
  8815//      should have identical fields.
  8816//
  8817// Parameters:
  8818//      FileNumber1:
  8819//            Number of file FROM where  records are to be copied.
  8820//      FileNumber2:
  8821//            Number of fiel TO which recordsare to be copied.
  8822//      NoOfRecords:
  8823//            Number of records to be copied.
  8824//      indexNum:
  8825//            Index Number. If not specified, files are copied in the order of recnum.
  8826//      callback_id:
  8827//            Object id of the object containing the callback function.
  8828//
  8829//-=-=-=-==-==--=-=-=-=-=--=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8830
  8831#COMMAND COPY$RECORD$HELP "USING" #RLUG "CALLBACK" #RLUG .
  8832     !A [] $521 !2 !4
  8833#ENDCOMMAND
  8834
  8835#COMMAND COPY_RECORDS #RLUG "TO" #RLUG
  8836  #IF (!0 > 3)
  8837    #IFSAME !4 USING CALLBACK
  8838        !A [] $522 |CI0
  8839        #IFSAME !4 USING
  8840            #IF (!0>5)
  8841                COPY$RECORD$HELP !4 !5 !6 !7 !8 !9
  8842            #ELSE
  8843                COPY$RECORD$HELP !4 !5 CALLBACK |CI0 !7 !8 !9
  8844            #ENDIF
  8845        #ELSE
  8846            #IFSAME !4 CALLBACK
  8847                COPY$RECORD$HELP USING |CI0 !4 !5 !6 !7 !8 !9
  8848            #ELSE
  8849                COPY$RECORD$HELP !4 !5 !6 !7 !8 !9
  8850            #ENDIF
  8851        #ENDIF
  8852    #ELSE
  8853        !A [] $522 !4
  8854        #IF (!0>4)
  8855            #IFSAME !5 USING
  8856                #IF (!0>6)
  8857                    COPY$RECORD$HELP !5 !6 !7 !8 !9
  8858                #ELSE
  8859                    COPY$RECORD$HELP !5 !6 CALLBACK |CI0 !7 !8 !9
  8860                #ENDIF
  8861            #ELSE
  8862                #IFSAME !5 CALLBACK
  8863                    COPY$RECORD$HELP USING |CI0 !5 !6 !7 !8 !9
  8864                #ELSE
  8865                    COPY$RECORD$HELP !5 !6 !7 !8 !9
  8866                #ENDIF
  8867            #ENDIF
  8868        #ELSE
  8869            COPY$RECORD$HELP USING |CI0 CALLBACK |CI0
  8870        #ENDIF
  8871    #ENDIF
  8872 #ELSE
  8873    !A [] $522 |CI0
  8874    COPY$RECORD$HELP USING |CI0 CALLBACK |CI0
  8875 #ENDIF
  8876 !A [] $524 !1 !3
  8877#ENDCOMMAND
  8878
  8879//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8880//
  8881// Command:
  8882//     FIELD_MAP FileNumber <field_name> "TO" FieldNumber
  8883//
  8884// Description:
  8885//     converts <field_name> into field number and puts it in FieldNumber
  8886// Parameters:
  8887//      FileNumber:
  8888//            No of the file containing the fields.
  8889//      field_name:
  8890//            name of the field to be converted into number.
  8891//      FieldNumber:
  8892//            Value returned by FIELD_MAP
  8893//
  8894//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=---=-=-=-=-=-=--=-=-=-=-
  8895
  8896#COMMAND FIELD_MAP #RLUG #RLI "TO" #RLUG .
  8897   !A [] $525 !1 !2
  8898   !A [] $526 !4
  8899#ENDCOMMAND
  8900
  8901
  8902//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8903//
  8904// Command:
  8905//      LOAD_DRIVER driver_name
  8906//
  8907// Description:
  8908//      Loads a database driver
  8909//
  8910// Parameter:
  8911//      driver_name:
  8912//          Name of the database driver.
  8913//
  8914//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8915
  8916#COMMAND LOAD_DRIVER #RLI .
  8917   !A [] $527  !1
  8918#ENDCOMMAND
  8919
  8920//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8921//
  8922// Command:
  8923//      UNLOAD_DRIVER driver_name
  8924//
  8925// Description:
  8926//      Loads a database driver
  8927//
  8928// Parameter:
  8929//      driver_name:
  8930//          Name of the database driver.
  8931//
  8932//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8933
  8934#COMMAND UNLOAD_DRIVER #RlI .
  8935   !A [] $528  !1
  8936#ENDCOMMAND
  8937
  8938
  8939// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8940//
  8941//  Command:
  8942//      READ_HEX {CHANNEL channelNum} varName {numHexBytes}
  8943//
  8944//  Description:
  8945//      Read a stream of hex bytes from the sequential channel chosen. The
  8946//      stream must be in the form of a string containing two byte printable
  8947//      hex numbers, e.g., "616263" would correspond the the string "abc".
  8948//      The value is converted into ASCII before it is store in varName.
  8949//
  8950//  Parameters:
  8951//      channelNum:
  8952//          The number of the sequential device channel to be read from. If
  8953//          not specified, the currently active input channel is read from.
  8954//      varName:
  8955//          The variable to read the bytes into.
  8956//      numHexBytes:
  8957//          The number of two digit hex codes to read in, e.g., "616263" is
  8958//          3 hex codes (even though it is actually 6 bytes). If ommitted or
  8959//          zero, READ_HEX will read until it encounters the end of the line.
  8960//          If data is read which cannot be converted from hex to ascii,
  8961//          READ_HEX stops at that point.
  8962//
  8963// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8964
  8965#COMMAND READ_HEX
  8966  #IFSAME !1 CHANNEL
  8967    !A [] $10A |CI0 !2
  8968    #IF !0>2
  8969      #CHECK !3 _ULE
  8970      #CHECK !4 _RU
  8971      !A [] $110 !3 !4
  8972    #ENDIF
  8973  #ELSE
  8974    #CHECK !1 _ULEC
  8975    #CHECK !2 _RU
  8976    !A [] $110 !1 !2
  8977  #ENDIF
  8978#ENDCOMMAND
  8979
  8980
  8981// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  8982//
  8983//  Command:
  8984//      WRITE_HEX {CHANNEL channelNum} {value}*n
  8985//
  8986//  Description:
  8987//      Writes any set of values (expressions, variables, etc.) to the chosen
  8988//      sequential channel in the form of a stream of two digit hex codes,
  8989//      e.g., the string "abc" would be written as "616263".
  8990//
  8991//  Parameters:
  8992//      channelNum:
  8993//          The number of the sequential device channel to be read from. If
  8994//          not specified, the currently active input channel is read from.
  8995//      value:
  8996//          Any variable, expression, etc. to be written out. The value is
  8997//          evaluated and converted to a string before being written, e.g.,
  8998//          a value of (1 + 1) would be converted to the string "2" and
  8999//          then written out as "50" which is the hex code corresponding to
  9000//          the character '2'.
  9001//
  9002// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9003
  9004#COMMAND WRITE$HEX$HELP
  9005  #IF (!0>0)
  9006    !A [] $10F !1
  9007    WRITE$HEX$HELP !2 !3 !4 !5 !6 !7 !8 !9
  9008  #ENDIF
  9009#ENDCOMMAND
  9010
  9011#COMMAND WRITE_HEX
  9012  #IFSAME !1 CHANNEL
  9013    !A [] $10A |CI1 !2
  9014    #IF !0>2
  9015      WRITE$HEX$HELP !3 !4 !5 !6 !7 !8 !9
  9016    #ENDIF
  9017  #ELSE
  9018    WRITE$HEX$HELP  !1 !2 !3 !4 !5 !6 !7 !8 !9
  9019  #ENDIF
  9020#ENDCOMMAND
  9021
  9022
  9023// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9024//
  9025//  Command:
  9026//      GET_CURSOR_VISIBLE
  9027//
  9028//  Description:
  9029//      Returns 0 if the cursor is hidden, non-zero if it is visible. NOTE:
  9030//      this only reflects whether the cursor will be shown during the next
  9031//      user input action, not whether it is currently shown.
  9032//
  9033// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9034
  9035#COMMAND GET_CURSOR_VISIBLE R#LGUC .
  9036    !A [] $154 !1
  9037#ENDCOMMAND
  9038
  9039
  9040// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9041//
  9042//  Command:
  9043//      SET_CURSOR_VISIBLE visibleFlag
  9044//
  9045//  Description:
  9046//      Sets the cursor hidden or displayable. NOTE: this only affects
  9047//      whether the cursor will be shown during the next user input action,
  9048//      not whether it is currently shown.
  9049//
  9050//  Parameters:
  9051//      visibleFlag
  9052//          If this value is non-zero, the cursor will be displayed. If zero,
  9053//          the cursor will be hidden.
  9054//
  9055// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9056
  9057#COMMAND SET_CURSOR_VISIBLE R#LGU .
  9058    !A [] $155 !1
  9059#ENDCOMMAND
  9060
  9061
  9062// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9063 //
  9064//  Command:
  9065//      COMPUTE_SCREEN_CRC {startX startY endX endY "TO"} crcVariable
  9066//
  9067//  Description:
  9068//      Returns a CRC for a region of the screen. This can be used by
  9069//      automated testing programs to verify that the screen has the
  9070//      expected display.
  9071//
  9072//  Parameters:
  9073//      startX, startY, endX, endY
  9074//          Starting and ending coordinates of the region to be CRC'd. If
  9075//          not given, the whole screen is checked.
  9076//      crcVariable
  9077//          A variable which will contain the CRC.
  9078//
  9079// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9080
  9081#COMMAND COMPUTE$CRC$HELP R#LGU R#LGU R#LGU R#LGU "TO" R#LGUC
  9082  !A [] $151 !1 !2
  9083  !A [] $152 !3 !4
  9084  !A [] $153 !6
  9085#ENDCOMMAND
  9086
  9087#COMMAND COMPUTE_SCREEN_CRC
  9088  #IFSAME !1 TO
  9089    COMPUTE$CRC$HELP |CI-1 |CI-1 |CI-1 |CI-1 !1 !2 !3 !4 !5 !6 !7 !8 !9
  9090  #ELSE
  9091    COMPUTE$CRC$HELP !1 !2 !3 !4 !5 !6 !7 !8 !9
  9092  #ENDIF
  9093#ENDCOMMAND
  9094
  9095
  9096//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9097//
  9098//  Command:
  9099//      CALL_DRIVER fileNumber driverName;
  9100//          FUNCTION driverFunction CALLBACK objectID;
  9101//          PASSING aString aString2 aLong RESULT returnValue
  9102//
  9103//   Descrtiption:
  9104//      A function call used directly access driver specific functions.
  9105//
  9106//   Parmeters:
  9107//       fileNumber
  9108//           Number of the file
  9109//       driverName
  9110//           Name of the driver
  9111//       driverFunction
  9112//           Numeric value corresponding to a driver specific function
  9113//       returnValue
  9114//           Value returned by CALL_DRIVER
  9115//       aString
  9116//           A string
  9117//       aString2
  9118//           Another string
  9119//       aLoing
  9120//           A long
  9121//       objectID
  9122//           Object id for an object that will be sent the GET_CALLBACK
  9123//           message
  9124//
  9125//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9126
  9127#COMMAND CALL$DRIVER$1 #RLUG #RLDNIGU "FUNCTION" #RGUL "CALLBACK" #RGUL .
  9128    !A [] $529 !1 !2
  9129    !A [] $52A !4 !6
  9130#ENDCOMMAND
  9131
  9132#COMMAND CALL$DRIVER$2 "PASSING" #CRUG #CRUG #RLUG "RESULT" #RLUG .
  9133    !A [] $530 !4
  9134    !A [] $52B !2 !3
  9135    !A [] $082 STRMARK !6
  9136#ENDCOMMAND
  9137
  9138#COMMAND CALL_DRIVER
  9139    CALL$DRIVER$1 !1 !2 !3 !4 !5 !6
  9140    CALL$DRIVER$2 !7 !8 !9
  9141#ENDCOMMAND
  9142
  9143
  9144//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9145//
  9146//   Command:
  9147//       LOAD_DEF defName ONTO structureHandle
  9148//
  9149//   Descrtiption:
  9150//       Will load the file definition from defName on top of the structure
  9151//       defined by structureHandle. While the structure may be for an
  9152//       existing file, no structure operations (other than STRUCTURE_START)
  9153//       should be performed on structureHandle prior to calling LOAD_DEF.
  9154//
  9155//   Parmeters:
  9156//       structureHandle
  9157//           Handle to an new or modified structure.
  9158//       defName
  9159//           Name of the sequential device which contains the .DEF
  9160//           specification.
  9161//
  9162//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9163
  9164#COMMAND LOAD_DEF #RLUG "ONTO" #RLUG .
  9165    !A [] $52F !1 !3
  9166#ENDCOMMAND
  9167
  9168
  9169//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9170//
  9171//   Command:
  9172//       SET_FILELIST newName
  9173//
  9174//   Descrtiption:
  9175//       Sets the filelist.cfg file to the name specified. If the specified
  9176//       file cannot be opened, the current filelist file remains unchanged.
  9177//
  9178//   Parmeters:
  9179//       newName
  9180//           The name of the file to use as filelist.cfg
  9181//
  9182//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9183
  9184#COMMAND SET_FILELIST RL#UGDNI .
  9185    SET_ATTRIBUTE DF_FILELIST_NAME TO !1
  9186#ENDCOMMAND
  9187
  9188
  9189//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9190//
  9191//   Command:
  9192//       GET_FILELIST Name
  9193//
  9194//   Descrtiption:
  9195//       Gets the name of the current filelist file.
  9196//
  9197//   Parmeters:
  9198//       Name
  9199//           The name of the file being used as filelist.
  9200//
  9201//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9202
  9203#COMMAND GET_FILELIST RL#UGDNI .
  9204    GET_ATTRIBUTE DF_FILELIST_NAME TO !1
  9205#ENDCOMMAND
  9206
  9207
  9208// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9209//
  9210//  Command:
  9211//      LOGIN ServerName UserName Password {DriverName}
  9212//
  9213//  Description:
  9214//      Login to the specified server using the passed user and password.
  9215//
  9216//  Parameters
  9217//      ServerName
  9218//          Name of the server (driver specific) to be logged into
  9219//
  9220//      UserName
  9221//          Name of the user to be used for the login
  9222//
  9223//      Password
  9224//          Password to use for the login
  9225//
  9226//      DriverName
  9227//          Optional database driver to use for the login. API defaults
  9228//          to attempting a login with all drivers.
  9229//
  9230// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9231
  9232#COMMAND LOGIN #ULGR$ #ULGR$ #ULGR$ #ULG$ .
  9233  !A [] $4c4 !1 !4
  9234  !A [] $4c5 !2 !3
  9235#ENDCOMMAND
  9236
  9237
  9238//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9239//
  9240//   Commands:
  9241//       ENUM_LIST, DEFINE, and END_ENUM_LIST
  9242//
  9243//   Descrtiption:
  9244//       Altogether, these commands can be used to enumerate symbol
  9245//       replacements for lists of symbols.
  9246//
  9247//       DEFINE outside of an ENUM/ENUM_LIST block can be used to define
  9248//       individual symbolic replacements, and to define "flags". (However,
  9249//       there is no UNDEFINE. Sorry.)
  9250//
  9251//   Parmeters:
  9252//       ENUM_LIST and END_ENUM_LIST take no parameters.
  9253//       DEFINE supports several syntaxes:
  9254//
  9255//       DEFINE symbol
  9256//          If outside an enum list, defines a symbolic replacement named
  9257//          symbol as |CI1 (to be used with #IFDEF compiler directive).
  9258//
  9259//       DEFINE symbol1 symbol2 ...
  9260//          If within an enum list, defines a symbolic replacement named
  9261//          symbol1 as a constant integer one greater than the previous
  9262//          symbolic replacement in the enum list (and symbol2 and each
  9263//          additional parameter are defined one greater than the symbol
  9264//          before it).
  9265//
  9266//       DEFINE symbol FOR originalSymbol
  9267//          If outside an enum list, defines a symbolic replacement named
  9268//          symbol for originalSymbol. In this instance, originalSymbol may
  9269//          be any valid symbol name or constant value.
  9270//
  9271//       DEFINE symbol FOR constInt
  9272//          If within an enum list, defines a symbolic replacement named
  9273//          symbol for the constant integer constInt. Only constant integers
  9274//          can be used for constInt with the AS syntax option within enum
  9275//          lists.
  9276//
  9277//  Examples:
  9278//
  9279//  enumeration_list
  9280//      define ddd          // starts at 0 by default
  9281//      define eee          // 1
  9282//      define fff ggg hhh  // 2 3 4
  9283//  end_enumeration_list
  9284//
  9285//  enum_list
  9286//      define rrr for 5     // start at 5
  9287//      define sss          // 6
  9288//      define ttt for 21    // jump to 21
  9289//      define uuu          // 22
  9290//  end_enum_list
  9291//
  9292//  define aaa for ttt       // generic symbolic replacements
  9293//  define aaa for "Hello"
  9294//
  9295//  define zzz              // defines zzz as |CI1 (to be used with #IFDEF)
  9296//
  9297// Note: Defining multiple "flags" (define sss ttt) is not allowed in order
  9298// to allow proper type-checking. (The compiler's preprocessor substitutes
  9299// the symbols too early; therefore, it becomes impossible to differentiate
  9300// the allowable syntaxes if multiple arguments are allowed.)
  9301//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9302
  9303#COMMAND ENUMERATION_LIST .
  9304  #IF (!Zs=1)
  9305    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT ENUMERATION LISTS CANNOT BE BE NESTED
  9306  #ENDIF
  9307  #SET ZS$ 1 // enum_flag
  9308  #SET ZT$ 0 // initial enum_value
  9309#ENDCOMMAND
  9310
  9311// Define with better protections against alias datatype naming
  9312#COMMAND DEFINE R
  9313  #IFSAME !2 FOR
  9314    #IF (!Zs=0)     // if not enum
  9315      #IFDEF !1     // ignore redefinition of symbols (only if not enum)
  9316        // if def'ed it means that !1 is a constant (has already been defined). If we are trying to turn this
  9317        // into a datatype, we know that this is wrong and we should warn the developer. So check if replacement is a variable name.
  9318        // Note in all cases, alias types will get converted to one of these real names.
  9319        #IFSAME !3  STRING  NUMBER  DATE  INTEGER  REAL  BIGINT  BOOLEAN  ADDRESS  TIME  DATETIME  FLOAT  CHAR  UCHAR  SHORT  USHORT  UINTEGER  UBIGINT  CURRENCY  TIMESPAN  DECIMAL  VARIANT
  9320          #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED "Attempt to redefine a constant as a data type"
  9321        #ELSE
  9322           // if not a data type, we ignore the redefinition and assume all is OK
  9323        #ENDIF
  9324      #ELSE
  9325        #IFSAME !1 $0     // ignore redefinition if already defined as FALSE
  9326        #ELSE
  9327          #IFSAME !1 $1   // ignore redefinition if already defined as TRUE
  9328          #ELSE
  9329            #IFSAME !1  STRING  NUMBER  DATE  INTEGER  REAL  BIGINT  BOOLEAN  ADDRESS  TIME  DATETIME  FLOAT  CHAR  UCHAR  SHORT  USHORT  UINTEGER  UBIGINT  CURRENCY  TIMESPAN  DECIMAL  VARIANT
  9330              // if here this must be an alias datatype that has already been defined. Either this is a duplicate
  9331              // definition (which we ignore) or a new definition (which is an error)
  9332              #IFSAME !1 !3 // if same ok..redefinition
  9333                // #REM define datatype ok
  9334              #ELSE
  9335                #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED "Attempt to redefine a data type"
  9336              #ENDIF
  9337            #ELSE
  9338              #CHECK !4 .
  9339              #IFSAME !1 !3 // ignore self definitions. e.g. define cat for cat
  9340                // #REM define to .self. is dumb but ok
  9341              #ELSE
  9342                #REPLACE !1 !3
  9343              #ENDIF
  9344            #ENDIF
  9345          #ENDIF
  9346        #ENDIF
  9347      #ENDIF
  9348    #ELSE           // else enum
  9349      // check that symbol to be replaced is not a datatype or alias datatype
  9350      #IFSAME !1  STRING  NUMBER  DATE  INTEGER  REAL  BIGINT  BOOLEAN  ADDRESS  TIME  DATETIME  FLOAT  CHAR  UCHAR  SHORT  USHORT  UINTEGER  UBIGINT  CURRENCY  TIMESPAN  DECIMAL  VARIANT
  9351        #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED "Attempt to redefine a data type"
  9352      #ELSE
  9353        #IFTYPE !3 "I"
  9354          #IFCLASS !3 "C"
  9355            #CHECK !4 .
  9356            #REPLACE !1 !3
  9357            #SET ZT$ (!3+1)
  9358          #ELSE
  9359            #ERROR DFERR_COMP_CONSTANT_EXPECTED ENUMERATION VALUE MUST BE A CONSTANT
  9360          #ENDIF
  9361        #ELSE
  9362          #ERROR DFERR_COMP_CONSTANT_EXPECTED ENUMERATION VALUE MUST BE A CONSTANT
  9363        #ENDIF
  9364      #ENDIF
  9365    #ENDIF
  9366  #ELSE             // not "FOR"
  9367    // check that symbol to be replaced is not a datatype or alias datatype
  9368    #IFSAME !1  STRING  NUMBER  DATE  INTEGER  REAL  BIGINT  BOOLEAN  ADDRESS  TIME  DATETIME  FLOAT  CHAR  UCHAR  SHORT  USHORT  UINTEGER  UBIGINT  CURRENCY  TIMESPAN  DECIMAL  VARIANT
  9369      #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED "Attempt to redefine a data type"
  9370    #ELSE
  9371      #IF (!Zs=0)     // if not enum
  9372        #CHECK !2 .
  9373        #IFDEF !1     // define for |CI1 if they were previously undefined
  9374          #IFSAME !1 |CI1
  9375          #ELSE
  9376            #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED "ATTEMPT TO REDEFINE SYMBOL FOR DIFFERENT VALUE"
  9377          #ENDIF
  9378        #ELSE
  9379          #IFSUB '!1'
  9380            #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED "ATTEMPT TO REDEFINE SYMBOL FOR DIFFERENT VALUE"
  9381          #ELSE
  9382            #REPLACE !1 |CI1
  9383          #ENDIF
  9384        #ENDIF
  9385      #ELSE
  9386        #REPLACE !1 |CI!Zt
  9387        #SET ZT$ !ZT
  9388        #IF (!0>1)
  9389          DEFINE !2 !3 !4 !5 !6 !7 !8 !9
  9390        #ENDIF
  9391      #ENDIF
  9392    #ENDIF
  9393  #ENDIF
  9394#ENDCOMMAND
  9395
  9396
  9397
  9398#COMMAND END_ENUMERATION_LIST .
  9399  #IF (!Zs=0)     // if not enum
  9400    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT END_ENUMERATION_LIST WITHOUT ENUMERATION_LIST COMMAND
  9401  #ELSE
  9402    #SET ZS$ 0 // reset enum_flag
  9403  #ENDIF
  9404#ENDCOMMAND
  9405
  9406
  9407//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9408//
  9409//   Command:
  9410//       ENTRY_NAME_ITEM itemName file.field ...
  9411//
  9412//   Description:
  9413//      Just like Entry_Item except the first parameter is a (global) Item
  9414//      Name.
  9415//
  9416//   Parameters:
  9417//       itemName
  9418//           The (global) name of the item being defined/created.
  9419//
  9420//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9421
  9422#COMMAND ENTRY_NAME_ITEM R R
  9423  #IFDEF !1            // Already exists?
  9424    #IFTYPE !1 "CI"    // If a constant integer
  9425      #IF (!1=!Zg)     // of the correct value...all is well.
  9426      #ELSE            // Else, It is a duplicate item.
  9427        #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED DUPLICATE ITEM NAME
  9428      #ENDIF
  9429    #ELSE              // else defined as something else.
  9430      #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED NAME ALREADY DEFINED
  9431    #ENDIF
  9432  #ELSE                // this names the item (!Zg is the trick)
  9433    #REPLACE !1 !Zg
  9434  #ENDIF               // now a regular entry_Item
  9435  ENTRY_ITEM !2 !3 !4 !5 !6 !7 !8  !9
  9436#ENDCOMMAND
  9437
  9438
  9439//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9440//
  9441//   Command:
  9442//       ON_NAME_ITEM itemName itemValue ...
  9443//
  9444//   Description:
  9445//      Just like On_Item except the first parameter is a (global) Item
  9446//      Name.
  9447//
  9448//   Parameters:
  9449//       itemName
  9450//           The (global) name of the item being defined/created.
  9451//
  9452//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9453
  9454#COMMAND ON_NAME_ITEM R
  9455  #IFDEF !1            // Already exists?
  9456    #IFTYPE !1 "CI"    // If a constant integer
  9457      #IF (!1=!Zg)     // of the correct value...all is well.
  9458      #ELSE            // Else, It is a duplicate item.
  9459        #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED DUPLICATE ITEM NAME
  9460      #ENDIF
  9461    #ELSE              // else defined as something else.
  9462      #ERROR DFERR_COMP_SYMBOL_ALREADY_DEFINED NAME ALREADY DEFINED
  9463    #ENDIF
  9464  #ELSE                // this names the item (!Zg is the trick)
  9465    #REPLACE !1 !Zg
  9466  #ENDIF               // now a regular entry_Item
  9467  ON_ITEM !2 !3 !4 !5 !6 !7 !8  !9
  9468#ENDCOMMAND
  9469
  9470
  9471// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9472//
  9473//  Command:
  9474//      BEGIN_TRANSACTION
  9475//
  9476//  Description:
  9477//      Starts a transaction on any open files.
  9478//
  9479// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9480
  9481#COMMAND BEGIN_TRANSACTION .
  9482  #SET N$ !N
  9483  #PUSH !R
  9484  #XPUSH !n $INIT  // Init IF/ELSE stack at this nesting level.
  9485  #IFIND //INCLUDE JUMPS IF INDICATORS ON LINE.
  9486    // GOTO BEGIN$TRAN$!r
  9487    !A [] $041 |CI0
  9488    #FREF BEGIN$TRAN$!r !a
  9489    #$ !A 0 0 0 $041 |CL0
  9490    #FREF END$TRAN$!r !a
  9491  #ENDIF
  9492  #$ BEGIN$TRAN$!r:
  9493  #$ BEGIN$!r:
  9494  #$ !A [0 0 0] $0C7 |CI0
  9495  #FREF END$TRAN$!r !a
  9496#ENDCOMMAND
  9497
  9498
  9499// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9500//
  9501//  Command:
  9502//      END_TRANSACTION
  9503//
  9504//  Description:
  9505//      Attempts to commit all operations in the current transaction.
  9506//
  9507// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9508
  9509#COMMAND END_TRANSACTION .
  9510  #POP S$
  9511  !A [] $0C8
  9512  #IFDEF WHILE$!s
  9513    !A [] $041 WHILE$!s
  9514  #ENDIF
  9515  END$!s:
  9516  END$TRAN$!s:
  9517  #SET N$ !n-1
  9518#ENDCOMMAND
  9519
  9520
  9521// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9522//
  9523//  Command:
  9524//      ABORT_TRANSACTION
  9525//
  9526//  Description:
  9527//      Aborts any currently active transactions, unlocking the files.
  9528//
  9529// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9530
  9531#COMMAND ABORT_TRANSACTION .
  9532  !A [] $0EB
  9533#ENDCOMMAND
  9534
  9535
  9536//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9537//
  9538//   Command:
  9539//       SET_RESOURCE_LIBRARY newName
  9540//
  9541//   Description:
  9542//       Tells the program to look in the specified file when opening
  9543//       resources (with the DIRECT_INPUT command). Specifying "" (the empty
  9544//       string) as the newName resets the resource library to look in the
  9545//       currently executing program for resources. The new library must be a
  9546//       properly compiled DataFlex program; all commands and non-resource
  9547//       data in the program/library are ignored. The filename MUST include
  9548//       the extension, but is not required to be .FLX. If the specified
  9549//       file cannot be opened, an error occurs and the current resource
  9550//       library continues to be used.
  9551//
  9552//       Note: Any resources that are currently open when the resource
  9553//       library is changed remain open; i.e. you may continue to read from
  9554//       them. The setting of the resource library only affects the
  9555//       DIRECT_INPUT command when opening resources.
  9556//
  9557//   Parameters:
  9558//       newName
  9559//           The name of the file to use as the library of resources.
  9560//
  9561//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9562
  9563#COMMAND SET_RESOURCE_LIBRARY #RLUGOB .
  9564  !A [] $113 !1
  9565#ENDCOMMAND
  9566
  9567
  9568//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9569//
  9570//  Command:
  9571//      GET_RESOURCE_NAME resourceName|resourceId TO stringVariable
  9572//
  9573//   Description:
  9574//      A command to retrieve the name of a resource at runtime. For the first
  9575//      parameter, you may pass either the resource name (not in quotes) (I
  9576//      know that sounds strange, and you'd probably never do it, but it WILL
  9577//      work) or the integer value of the resource id.
  9578//
  9579//   Parameters:
  9580//       resourceId
  9581//            Integer value of a resource id.
  9582//       stringVariable
  9583//            Variable to return the resource name to.
  9584//
  9585//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9586
  9587#COMMAND GET_RESOURCE_NAME R#LG "TO" RL#OBUGDNI .
  9588  #IFDEF !1
  9589    !A [] $114 !1 !3
  9590  #ELSE
  9591    !A [] $114 !1.RSC !3
  9592  #ENDIF
  9593#ENDCOMMAND
  9594
  9595
  9596//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9597//
  9598//  Command:
  9599//      ADD value TO variable
  9600//
  9601//   Description:
  9602//      Adds the specified value to the target variable.
  9603//
  9604//   Parameters:
  9605//       value:
  9606//            Any expression
  9607//       variable
  9608//            Any window, variable, etc. that can receive a value
  9609//
  9610//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9611
  9612#COMMAND ADD R#OBLG "TO" UR#OLGC .
  9613  Move (!3 + !1) to !3
  9614#ENDCOMMAND
  9615
  9616
  9617//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9618//
  9619//  Command:
  9620//      SUBTRACT value FROM variable
  9621//
  9622//   Description:
  9623//      Subtracts the specified value to the target variable.
  9624//
  9625//   Parameters:
  9626//       value:
  9627//            Any expression
  9628//       variable
  9629//            Any window, variable, etc. that can receive a value
  9630//
  9631//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9632
  9633#COMMAND SUBTRACT R#OBLG "FROM" UR#OLGC .
  9634  Move (!3 - !1) to !3
  9635#ENDCOMMAND
  9636
  9637
  9638//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9639//
  9640//  Command:
  9641//      BREAK [BEGIN|END]
  9642//
  9643//   Description:
  9644//      Exit or jump to start of a control loop (WHILE, REPEAT, FOR). Default
  9645//      action is to exit if no argument supplied.
  9646//
  9647//   Parameters:
  9648//      BEGIN:
  9649//          Jump to start of loop.
  9650//      END:
  9651//          Jump to end of loop and exit.
  9652//
  9653//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9654
  9655#COMMAND BREAK "BEGIN""END""" .
  9656  #POP S$
  9657  #PUSH !s
  9658  #IFSAME !1 BEGIN
  9659    Goto BEGIN$!s
  9660  #ELSE
  9661    Goto END$!s
  9662  #ENDIF
  9663#ENDCOMMAND
  9664
  9665//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9666//
  9667//  Command:
  9668//      HARD$EXIT <integer>
  9669//
  9670//  THIS COMMAND IS INTENDED FOR INTERNAL DAC TESTING USE ONLY
  9671//  USE WITHIN AN APPLICATION WILL PROBABLY CAUSE SYSTEM INTEGRITY
  9672//  PROBLEMS!
  9673//
  9674//  This command causes the runtime to do an exit(#) without
  9675//  any internal cleanup.  It is intended for testing server
  9676//  transaction support.
  9677//
  9678//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9679
  9680#COMMAND HARD$EXIT R#LG  .
  9681    !A [] $54 !1
  9682#ENDCOMMAND
  9683
  9684//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9685//
  9686//  Command:
  9687//      netware_get_tts_flag <path name> to <integer boolean>
  9688//
  9689//  THIS COMMAND IS INTENDED FOR INTERNAL DAC TESTING USE ONLY!
  9690//
  9691//  This command returns the state of the TTS flag of a file (by path name),
  9692//  returns false (0) if not a tts volume.
  9693//
  9694//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9695
  9696#COMMAND NETWARE_GET_TTS_FLAG R#LG "TO" RL#OBUGD .
  9697    !A [] $30D !1 !3
  9698#ENDCOMMAND
  9699
  9700//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9701//
  9702//  Command:
  9703//      netware_set_tts_flag <path name> to <integer boolean>
  9704//
  9705//  THIS COMMAND IS INTENDED FOR INTERNAL DAC TESTING USE ONLY!
  9706//
  9707//  This command sets the state of the TTS flag of a file (by path name),
  9708//  returns [FOUND] if status could be set.
  9709//
  9710//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9711
  9712#COMMAND NETWARE_SET_TTS_FLAG R#LG "TO" RL#OBUGD .
  9713    !A [] $30E !1 !3
  9714#ENDCOMMAND
  9715
  9716//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9717//
  9718//  Command:
  9719//      netware_get_available <integer boolean>
  9720//
  9721//  THIS COMMAND IS INTENDED FOR INTERNAL DAC TESTING USE ONLY!
  9722//
  9723//  This command returns non-zero if netware is loaded.
  9724//
  9725//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9726
  9727#COMMAND NETWARE_GET_AVAILABLE RL#OBUGD .
  9728    !A [] $30F !1 |CI0
  9729#ENDCOMMAND
  9730
  9731//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9732//
  9733//  Command:
  9734//      VALID_DRIVE driveLetter retVal
  9735//
  9736//  Description:
  9737//      This command returns non-zero if the drive is a valid drive letter
  9738//      This command is only useful under dos/os2/windows
  9739//
  9740//  Parameters:
  9741//      driveLetter
  9742//             Drive letter to check if valid. Must be a letter.
  9743//      retVal
  9744//             Integer results of command
  9745//
  9746//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9747
  9748#COMMAND VALID_DRIVE R R
  9749   !A [] $581 !1 !2
  9750#ENDCOMMAND
  9751
  9752//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9753//
  9754//  Command:
  9755//
  9756//      SET_DIRECTORY directory
  9757//
  9758//  Description:
  9759//      Sets the current directory. The directory argument may contain a drive
  9760//      letter to set the current directory on a particular drive.
  9761//
  9762//  Parameters:
  9763//      directory
  9764//          The new current directory to be set. The directory argument may
  9765//          contain a drive letter to set the current directory on a particular
  9766//          drive.
  9767//
  9768//  NOTE: This command will be removed for final VDF 4.0 release. A new message
  9769//        will be added to provide replacement functionality. KCR
  9770//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9771
  9772#COMMAND SET_DIRECTORY R
  9773   !A [] $58C !1
  9774#ENDCOMMAND
  9775
  9776//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9777//
  9778//  Command:
  9779//
  9780//      FILE_EXIST fileName result
  9781//
  9782//  Description:
  9783//      Returns non-zero if the specified file exists.
  9784//
  9785//  Parameters:
  9786//      fileName
  9787//          The name of the file to check the existance of.
  9788//      result
  9789//          Non-zero if the file exists or zero if does not exist.
  9790//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9791
  9792#COMMAND FILE_EXIST R R
  9793   !A [] $58D !1 !2
  9794#ENDCOMMAND
  9795
  9796//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9797//
  9798//  Command:
  9799//
  9800//      GET_DIRECTORY {drive} currentDirectory
  9801//
  9802//  Description:
  9803//      Returns the current directory.
  9804//
  9805//  Parameters:
  9806//      {drive}
  9807//          The drive letter to get the current directory for. If drive is
  9808//          not specifed then the current drive is assumed.
  9809//      currentDirectory
  9810//          The current directory for the appropriate drive.
  9811//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9812
  9813#COMMAND GET_DIRECTORY R
  9814    #IF (!0 > 1)
  9815        !A [] $58E !1 !2
  9816    #ELSE
  9817        !A [] $58E |CS"" !1
  9818    #ENDIF
  9819#ENDCOMMAND
  9820
  9821//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9822//
  9823//  Command:
  9824//
  9825//      MAKE_DIRECTORY directory {permissions}
  9826//
  9827//  Description:
  9828//      Makes a directory on the current drive. Uses the optional permissions
  9829//      value for the directory if it is specified.
  9830//
  9831//  Parameters:
  9832//      directory
  9833//          The name of the new directory to be made.
  9834//      {permissions}
  9835//          The access permissions of the new directory. If this is not
  9836//          specified then the default is DF_FLEX_ALL_RIGHTS.
  9837//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9838
  9839#COMMAND MAKE_DIRECTORY R
  9840    #IF !0 < 2
  9841        !A [] $58F !1 |CI2047
  9842    #ELSE
  9843        !A [] $58F !1 !2
  9844    #ENDIF
  9845#ENDCOMMAND
  9846
  9847//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9848//
  9849//  Command:
  9850//
  9851//      REMOVE_DIRECTORY directory
  9852//
  9853//  Description:
  9854//      Removes the specified directory.
  9855//
  9856//  Parameters:
  9857//      directory
  9858//          The name of the directory to be removed.
  9859//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9860
  9861#COMMAND REMOVE_DIRECTORY R
  9862   !A [] $590 !1
  9863#ENDCOMMAND
  9864
  9865//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9866//
  9867//  Command:
  9868//
  9869//      MAKE_TEMP_FILE tempExtension tempFile
  9870//
  9871//  Description:
  9872//      Makes a temporary file with a unique name with the specified extension
  9873//      and returns the unique name that was generated.
  9874//
  9875//  Parameters:
  9876//      tempExtension
  9877//          The extension to use when making the temporary file.
  9878//      tempFile
  9879//          The name of the temporary file that is returned.
  9880//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9881
  9882#COMMAND MAKE_TEMP_FILE R R .
  9883   !A [] $591 !1 !2
  9884#ENDCOMMAND
  9885
  9886//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9887//
  9888//  Command:
  9889//
  9890//      GET_FILE_MOD_TIME fileName "TO" date {hour} {minute} {second}
  9891//
  9892//  Description:
  9893//      Returns the file modified date/time stamp for the specified file.
  9894//
  9895//  Parameters:
  9896//      fileName
  9897//          The file to get the date/time stamp for.
  9898//      date
  9899//          The date the file was last modifed.
  9900//      {hour}
  9901//          The hour of the day that the file was last modified.
  9902//      {minute}
  9903//          The minute that the file was last modified.
  9904//      {second}
  9905//          The second that the file was last modified.
  9906//
  9907//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9908
  9909#COMMAND GET_FILE_MOD_TIME R "TO" R
  9910    !A [] $592  !1 !3
  9911
  9912    #IF !0 > 3
  9913        !A [] $593 !4
  9914    #ENDIF
  9915
  9916    #IF !0 > 4
  9917        !A [] $594  !5
  9918    #ENDIF
  9919
  9920    #IF !0 > 5
  9921        !A [] $595 !6
  9922    #ENDIF
  9923
  9924#ENDCOMMAND
  9925
  9926//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9927//
  9928//  Command:
  9929//
  9930//      SET_FILE_MOD_TIME fileName "TO" date {hour} {minute} {second}
  9931//
  9932//  Description:
  9933//      Sets the file modified date/time stamp for the specified file.
  9934//
  9935//  Parameters:
  9936//      fileName
  9937//          The file to set the date/time stamp for.
  9938//      date
  9939//          The new date that the file was modified.
  9940//      {hour}
  9941//          The new hour that the file was modified.
  9942//      {minute}
  9943//          The new minute that the file was modified.
  9944//      {second}
  9945//          The new second that the file was modified.
  9946//
  9947//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9948
  9949#COMMAND SET_FILE_MOD_TIME R "TO" R
  9950    !A []   $597 !1 !3  //Date
  9951
  9952    #IF (!0 > 3)
  9953        !A [] $598 !4   //Hour
  9954    #ENDIF
  9955
  9956    #IF (!0 > 4)
  9957        !A [] $599 !5   //Minutes
  9958    #ENDIF
  9959
  9960    #IF (!0 > 5)
  9961        !A [] $59A !6   //Seconds
  9962    #ENDIF
  9963
  9964    !A []   $596 !1
  9965#ENDCOMMAND
  9966
  9967// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9968//
  9969//  Command:
  9970//      SET_VIDEO_MODE
  9971//      GET_VIDEO_MODE
  9972//
  9973//  Description:
  9974//      Video Modes for DOS
  9975//
  9976// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9977
  9978
  9979#COMMAND SET_VIDEO_MODE "TO" _RUSD#
  9980  !A [] $150 !2
  9981#ENDCOMMAND
  9982
  9983#COMMAND GET_VIDEO_MODE "TO" _RUSD#
  9984  !A [] $14F !2
  9985#ENDCOMMAND
  9986
  9987
  9988// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9989//
  9990//  Command:
  9991//      DEFINE_SYMBOL
  9992//
  9993//  Description:
  9994//      Like #REPLACE except it checks if the symbol exists first.
  9995//
  9996// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9997
  9998#COMMAND DEFINE_SYMBOL R "FOR" R
  9999  #IFDEF !1
 10000  #ELSE
 10001    #REPLACE !1 !3
 10002  #ENDIF
 10003#ENDCOMMAND
 10004
 10005// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10006//
 10007//  Command:
 10008//      GET_DATE_ATTRIBUTE
 10009//
 10010//  Description:
 10011//
 10012// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10013
 10014#COMMAND GET_DATE_ATTRIBUTE R "TO" R .
 10015    !A [] $2E1 !1 !3
 10016#ENDCOMMAND
 10017
 10018// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10019//
 10020//  Command:
 10021//      SET_DATE_ATTRIBUTE
 10022//
 10023//  Description:
 10024//
 10025// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10026
 10027#COMMAND SET_DATE_ATTRIBUTE R "TO" R .
 10028    !A [] $2E2 !1 !3
 10029#ENDCOMMAND
 10030
 10031#IFDEF IS$WINDOWS
 10032#ELSE
 10033
 10034//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10035//
 10036//  Command:
 10037//      SET_GROUP_ID groupId
 10038//
 10039//  Description:
 10040//      This command sets the group id to be used.
 10041//
 10042//  Parameters:
 10043//      groupId
 10044//           The group id to set as the current group id
 10045//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10046
 10047#COMMAND SET_GROUP_ID R
 10048    !A []   $582    !1
 10049#ENDCOMMAND
 10050
 10051//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10052//
 10053//  Command:
 10054//
 10055//      SET_USER_ID userId
 10056//
 10057//  Description:
 10058//      This command sets the user id to be used.
 10059//
 10060//  Parameters:
 10061//      userId
 10062//           The user id to set as the current user id
 10063//
 10064//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10065
 10066#COMMAND SET_USER_ID R
 10067    !A []   $583    !1
 10068#ENDCOMMAND
 10069
 10070//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10071//
 10072//  Command:
 10073//
 10074//      GET_GROUP_ID retVal
 10075//
 10076//  Description:
 10077//      This command returns the current group id.
 10078//
 10079//  Parameters:
 10080//      retVal
 10081//           the value returned is the current user group id
 10082//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10083
 10084#COMMAND GET_GROUP_ID R
 10085    !A []   $584    !1
 10086#ENDCOMMAND
 10087
 10088//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10089//
 10090//  Command:
 10091//
 10092//      GET_EFFECTIVE_GROUP_ID retVal
 10093//
 10094//  Description:
 10095//      This command returns the current effective group id. This may be
 10096//      different from the actual group id if, say, the user has become
 10097//      superuser under unix.
 10098//
 10099//  Parameters:
 10100//      retVal
 10101//           the value returned is the current effective user group id
 10102//
 10103//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10104
 10105#COMMAND GET_EFFECTIVE_GROUP_ID R
 10106    !A []   $585    !1
 10107#ENDCOMMAND
 10108
 10109//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10110//
 10111//  Command:
 10112//
 10113//      GET_USER_ID retVal
 10114//
 10115//  Description:
 10116//      This command returns the current user id.
 10117//
 10118//  Parameters:
 10119//      retVal
 10120//           the value returned is the current user id
 10121//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10122
 10123#COMMAND GET_USER_ID R
 10124    !A []   $586    !1
 10125#ENDCOMMAND
 10126
 10127//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10128//
 10129//  Command:
 10130//
 10131//      GET_EFFECTIVE_USER_ID retVal
 10132//
 10133//  Description:
 10134//      This command returns the current effective user id. This may be
 10135//      different from the actual user id if, say, the user has become
 10136//      superuser under unix.
 10137//
 10138//  Parameters:
 10139//      retVal
 10140//           the value returned is the current effective user group id
 10141//
 10142//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10143
 10144#COMMAND GET_EFFECTIVE_USER_ID R
 10145    !A []   $587    !1
 10146#ENDCOMMAND
 10147
 10148//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10149//
 10150//  Command:
 10151//
 10152//      GET_PERMISSION fileName "TO" retVal
 10153//
 10154//  Description:
 10155//      This command returns the current access privledeges for the specified
 10156//      file
 10157//
 10158//  Parameters:
 10159//      fileName
 10160//          The name of the file to check the permissions for
 10161//      retVal
 10162//          An value containing all the permission bits for the file
 10163//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10164
 10165#COMMAND GET_PERMISSION R "TO" R
 10166    !A []   $588    !1 !3
 10167#ENDCOMMAND
 10168
 10169//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10170//
 10171//  Command:
 10172//
 10173//      SET_PERMISSION fileName "TO" permissions
 10174//
 10175//  Description:
 10176//      This command sets the access privledeges for the specified file.
 10177//      The various permissions must be and'ed together to form one argument
 10178//
 10179//  Parameters:
 10180//      fileName
 10181//          The name of the file to set the permissions for
 10182//      permissions
 10183//          An value containing all the permission bits for the file and'ed
 10184//          together to form one integer value
 10185//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10186
 10187#COMMAND SET_PERMISSION R "TO" R
 10188    !A []   $589    !1 !3
 10189#ENDCOMMAND
 10190
 10191//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10192//
 10193//  Command:
 10194//
 10195//      ADD_PERMISSION fileName permissions
 10196//
 10197//  Description:
 10198//      This command adds the requested access privledeges for the specified
 10199//      file to the access permissions already set for this file.
 10200//      The various permissions must be and'ed together to form one argument.
 10201//      These permission bits will then be and'ed together with the existing
 10202//      permission bits for the file.
 10203//
 10204//  Parameters:
 10205//      fileName
 10206//          The name of the file to add the permissions for
 10207//      permissions
 10208//          An value containing the permission bits to be changed for the file
 10209//          and'ed together to form one integer value
 10210//
 10211//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10212
 10213#COMMAND ADD_PERMISSION R R
 10214    !A []   $58A    !1 !2
 10215#ENDCOMMAND
 10216
 10217//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10218//
 10219//  Command:
 10220//
 10221//      DELETE_PERMISSION fileName permissions
 10222//
 10223//  Description:
 10224//      This command removes the requested access privledeges for the specified
 10225//      file from the access permissions already set for this file.
 10226//      The various permissions must be and'ed together to form one argument
 10227//
 10228//  Parameters:
 10229//      fileName
 10230//          The name of the file to remove the permissions for
 10231//      permissions
 10232//          An value containing the permission bits to be removed for the file
 10233//          and'ed together to form one integer value
 10234//
 10235//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10236
 10237#COMMAND DELETE_PERMISSION R R
 10238    !A []   $58B    !1 !2
 10239#ENDCOMMAND
 10240
 10241//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10242//
 10243//  Command:
 10244//
 10245//      SET_FILE_OWNER fileName "TO" owner {group}
 10246//
 10247//  Description:
 10248//      Sets the file owner of the specifed file and optionally sets the
 10249//      group id of the file.
 10250//
 10251//  Parameters:
 10252//      fileName
 10253//          The file to set the owner for.
 10254//      owner
 10255//          The new owner for the file.
 10256//      {group}
 10257//          The new group id for the file.
 10258//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10259
 10260#COMMAND SET_FILE_OWNER R "TO" R
 10261    #IF (!0 > 3)
 10262        !A [] $59D !3 !4
 10263    #ELSE
 10264        !A [] $59D !3  0
 10265    #END
 10266
 10267    !A [] $59C !1
 10268#ENDCOMMAND
 10269
 10270//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10271//
 10272//  Command:
 10273//
 10274//      GET_FILE_OWNER fileName "TO" owner {group}
 10275//
 10276//  Description:
 10277//      Gets the file owner of the specifed file and optionally gets the
 10278//      group id of the file.
 10279//
 10280//  Parameters:
 10281//      fileName
 10282//          The file to get the owner for.
 10283//      owner
 10284//          The owner of the file.
 10285//      {group}
 10286//          The group id of the file.
 10287//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 10288
 10289#COMMAND GET_FILE_OWNER R "TO" R
 10290    !A [] $59B !1 !3
 10291
 10292    #IF (!0 > 3)
 10293        !A [] $59C !4
 10294    #ENDIF
 10295#ENDCOMMAND
 10296
 10297#ENDIF
 10298
 10299// JJT-5.1
 10300// Changed commands
 10301
 10302#COMMAND COMPILER_DESKTOP_METHOD_WARNINGS "ON""OFF"
 10303  #IFSAME !1 ON
 10304    #SET ZL$ (!Zl | 4) // add bit 3
 10305  #ELSE
 10306    #SET ZL$ (!Zl & 3)  // strip bit 3 - the default fir 8.3, will change in future
 10307    #REM AMBIGUOUS .DESKTOP. METHODS ARE ALLOWED (THIS IS .NOT. RECOMMENDED)
 10308  #ENDIF
 10309#ENDCOMMAND
 10310
 10311#COMMAND COMPILER_WARNINGS "ON""OFF""OLD""OLDOFF"
 10312  #IFSAME !1 ON
 10313    #SET ZL$ (!Zl & 6) // strip bit 1
 10314    #REM STRICT COMPILER WARNINGS ON
 10315  #ELSE
 10316    #IFSAME !1 OFF
 10317      #SET ZL$ (!Zl | 1)  // add bit 1
 10318      #REM STRICT COMPILER WARNINGS OFF
 10319    #ELSE
 10320      #IFSAME !1 OLD
 10321        #SET ZL$ (!Zl | 2)  // add bit 2
 10322        #REM OLD STYLE COMPILER CHECKING ON (written to .prn file)
 10323      #ELSE
 10324        #SET ZL$ (!Zl & 5) // strip bit 2
 10325        #REM OLD STYLE COMPILER CHECKING OFF
 10326      #ENDIF
 10327    #ENDIF
 10328  #ENDIF
 10329#ENDCOMMAND
 10330
 10331// changes: 1. declare an error if not within a procedure or function
 10332//          2. Check for mismatched Begin/End blocks.
 10333//          3. Check for child objects within end_object
 10334//
 10335#COMMAND END_PROCEDURE .
 10336  // This tracks number of nested objects in method.
 10337  // !Zn is the level of !n when the proc/funct started. Upon
 10338  // completion !n should be that value. If not error.
 10339  // If error, compiler stack is messed up
 10340  #IF (!Zn = !n)
 10341  #ELSE
 10342    #ERROR DFERR_COMP_UNRESOVLED_CONTROL_BLOCK Mismatch in Method
 10343    #SET B$ (!b | 4) // stack is screwed up..we have no idea if we are in proc
 10344  #ENDIF
 10345
 10346  // When Proc started we set !Zm to 0. It counts nested objects. It
 10347  // should be zero. If not we have an error.
 10348  // If error, compiler stack is messed up
 10349  #IF (!Zm > 0)
 10350    #ERROR DFERR_COMP_MISSING_END_OBJECT Mismatch in Method
 10351    #SET B$ (!b | 4) // stack is screwed up..we have no idea if we are in proc
 10352  #ENDIF
 10353
 10354#IFDEF MANGLE_NAMES
 10355  // Let NUM_ARGUMENTS get referenced again in the code, if it has been turned off.
 10356  #ALLOW  NUM_ARGUMENTS
 10357  #UNDEF __@INSIDE_FUNCTION@__     // Leaving function/proc.
 10358
 10359#ENDIF
 10360
 10361  #IF (!b & 4)              // are we within a Procedure
 10362    #SET B$ (!b & 3)        // reset flag to in_procedure
 10363    #POP U$
 10364    #REPLACE OBJ$!Za$LNUM |CI!Zg     // Update the count in the local cmd.
 10365    //  !A [] OBJ$END$HANDLER |CI0
 10366    !A [] $0455 |CI0
 10367    #REPLACE OBJ$!Za$ENDPROC !a
 10368    #POP U$
 10369    #POP ZG$
 10370
 10371    #STKSYM
 10372  #ELSE
 10373    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT End_Funct/End_proc command .not. within a method
 10374  #ENDIF
 10375
 10376#ENDCOMMAND
 10377
 10378
 10379
 10380// changes: 1. declare an error if not within a class
 10381//          2. declare an error if within a procedure/function
 10382//          3. declare an error in object (implies missing end_object)
 10383// Note: it is possible that under advanced usage you might be
 10384//       creating a class in a method. If this is the case you should
 10385//       use base_end_class
 10386#COMMAND END_CLASS .
 10387  #IF (!b & 2)                     // must be within class or an error
 10388    #IF (!b & 4)                   // end-class within procedure is probably wrong
 10389      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT CLASS/END_CLASS should .not. be inside a method
 10390    #ELSE
 10391      #IF (!b & 1) // if object must be error. Should be end object
 10392        #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT End_object expected before End_class
 10393      #ENDIF
 10394      BASE_END_CLASS
 10395    #ENDIF
 10396  #ELSE
 10397    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT End_class without class
 10398  #ENDIF
 10399#ENDCOMMAND
 10400
 10401// this is lower level end_class. It doesn't check that the
 10402// command apppears in the "right" spot.
 10403#COMMAND BASE_END_CLASS .
 10404  #SET ZI$ (!Zi+!Zf)             //subobject count = self + superclass
 10405  #REPLACE !$.AGG |CI!Zi         //define subobject count
 10406  !A [] END$CLASS U_!$ |CI!Zi
 10407
 10408  #SPOP                 // restore the old class name
 10409  #POP X$               // reset the property index
 10410  #POP ZI$              // reset old sub_object_count
 10411  #POP ZF$              // reset super_class_count
 10412  #POP ZB$              // reset current_dep
 10413  #POP B$               // reset obj_flag
 10414#ENDCOMMAND
 10415
 10416
 10417// changes: declare an error if not within an object
 10418//          if within a class, this should be inside of a method
 10419#COMMAND END_OBJECT
 10420  #IF (!b & 1)  // if not within an object..error
 10421    // if within a class (2) but not within a procedure (4) we have an error
 10422    // you should not place objects in classes outside of methods
 10423    #IF (!b = 3) // 3 = in class and in object, not in method
 10424      #IF (!Zl & 1)
 10425        #REM WARNING 4391: Object/End_object within class is .NOT. in a method
 10426      #ELSE
 10427        #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Object/End_object within class should be in a method
 10428      #ENDIF
 10429    #ENDIF
 10430
 10431    // If within method, we count number of nested objects.
 10432    // If lt 0, declare an error, End_procedure will check for >0
 10433    #IF ( !b & 4 )   // if object within method
 10434      #SET ZM$ !Zm-1 // decrement count
 10435      #IF (!Zm < 0)  // if lt 0, declare error
 10436        #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT End_Object without Object in Method
 10437      #ENDIF
 10438    #ENDIF
 10439
 10440    // if here we are within a object.
 10441    // if we are within a class we are also within a procedure
 10442
 10443    //
 10444    // The following section was added 01-08-90 by SAL to support inheritable
 10445    // end-instance macros for classes
 10446    //
 10447    #IFSUB '!$$SC'  //if flex-defined class
 10448    #IFSUB '!$$EM'  //if end-instance macro defined for class,
 10449      !$$EM !$ !1 !2 !3 !4 !5 !6 !7 !8 !9
 10450    #ELSE
 10451      FORWARD_END_CONSTRUCT !$ !1 !2 !3 !4 !5 !6 !7 !8 !9
 10452    #ENDIF
 10453    #ELSE
 10454      DEFAULT_END_OBJECT  //else use default
 10455    #ENDIF
 10456    #SPOP           //restore old class name
 10457    //
 10458    // end of addition 01-08-90 by SAL
 10459    //
 10460  #ELSE
 10461    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT End_Object without Object
 10462  #ENDIF
 10463#ENDCOMMAND
 10464
 10465// changes: declare an error if not within a procedure or function
 10466//
 10467#COMMAND FUNCTION_RETURN GO .
 10468  #IF (!b & 4)              // are we within a Procedure
 10469    #IF (!0 > 0)
 10470      #IFSAME !1 $0
 10471        // !A [] OBJ$HRET |CI0
 10472        !A [] $0450 |CI0
 10473      #ELSE
 10474        #IFSAME !1 $1
 10475          // !A [] OBJ$HRET |CI1
 10476          !A [] $0450 |CI1
 10477        #ELSE
 10478          #CHECK !1 _U
 10479          // !A [] OBJ$HRET !1
 10480          !A [] $0450 !1
 10481        #ENDIF
 10482      #ENDIF
 10483    #ELSE
 10484      // !A [] OBJ$HRET |CI0
 10485      !A [] $0450 |CI0
 10486    #ENDIF
 10487  #ELSE
 10488    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Method return .not. within a method
 10489  #ENDIF
 10490#ENDCOMMAND
 10491
 10492// change: return can be used in methods or in sub-routines
 10493// perhaps next revision
 10494//#COMMAND RETURN
 10495//  #IF (!b & 4)              // are we within a Procedure/function
 10496//    #IF (!Zl & 2)
 10497//      #REM #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE Old Style Usage: Possible gosub return inside of method
 10498//    #ENDIF
 10499//    Procedure_Return !1     // we are returning from a method
 10500//  #ELSE
 10501//    // tells us what we need to fix.
 10502//    #IF (!Zl & 2)
 10503//      #REM #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE Old Style Usage: Gosub style/Return s/b Gosub_return
 10504//    #ENDIF
 10505//    #IF (!Zl & 1)             // if relaxed...
 10506//      Gosub_Return !1 !2      // we are doing an old style sub-routine return
 10507//    #ELSE
 10508//      Procedure_Return !1     // we are returning from a method.. will gen an error
 10509//    #ENDIF
 10510//  #ENDIF
 10511//#ENDCOMMAND
 10512
 10513// change: if within a method declare an error. Force use of
 10514//         gosub_return. This catches errors where developer types
 10515//         return instead of procedure_return.
 10516//
 10517#COMMAND RETURN
 10518  #IF (!b & 4)                // are we within a Procedure/function
 10519    #IF (!Zl & 1)             // if relaxed...
 10520      #REM WARNING 4388: Old Style Usage: s/b gosub_return
 10521      Gosub_Return !1 !2 !3 !4 !5 !6 !7 !8 !9 // we are doing an old style sub-routine return
 10522    #ELSE
 10523      #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE Old Style Usage: s/b gosub_return
 10524    #ENDIF
 10525  #ELSE                       // we are not within method. Normal gosub/return usage
 10526    Gosub_Return !1 !2 !3 !4 !5 !6 !7 !8 !9 // we are doing an old style sub-routine return
 10527  #ENDIF
 10528#ENDCOMMAND
 10529
 10530#COMMAND Gosub_Return VFWNDE#G
 10531
 10532  #IF !0=0
 10533    !A [] $043 |CL0
 10534  #ELSE
 10535    #IFSAME !1 RETURN GOSUB_RETURN
 10536      #SET Q$ (!a+2)
 10537      !A [] $043 |CL!q // RETURN RETURN
 10538      GOSUB_RETURN !2 !3 !4 !5 !6 !7 !8 !9
 10539    #ELSE
 10540      #IFDEF !1
 10541        #CHECK !1 _S
 10542        #CHECK !2 .
 10543        !A [] $043 !1
 10544      #ELSE
 10545        !A [] $043 |CL0
 10546        #FREF !1 !a
 10547      #ENDIF
 10548    #ENDIF
 10549  #ENDIF
 10550#ENDCOMMAND
 10551
 10552
 10553// if not defined as local make it local if needed
 10554//
 10555
 10556#COMMAND INTEGER R
 10557  DEFINE$VARIABLE$HELP Integer !1 !2 !3 !4 !5 !6 !7 !8 !9
 10558#ENDCOMMAND
 10559
 10560#COMMAND STRING R E#L%
 10561  DEFINE$VARIABLE$HELP String !1 !2 !3 !4 !5 !6 !7 !8 !9
 10562#ENDCOMMAND
 10563
 10564#COMMAND DATE R
 10565  DEFINE$VARIABLE$HELP Date !1 !2 !3 !4 !5 !6 !7 !8 !9
 10566#ENDCOMMAND
 10567
 10568#COMMAND NUMBER R
 10569  DEFINE$VARIABLE$HELP Number !1 !2 !3 !4 !5 !6 !7 !8 !9
 10570#ENDCOMMAND
 10571
 10572#COMMAND REAL R
 10573  DEFINE$VARIABLE$HELP Real !1 !2 !3 !4 !5 !6 !7 !8 !9
 10574#ENDCOMMAND
 10575
 10576#COMMAND ADDRESS R
 10577  DEFINE$VARIABLE$HELP Address !1 !2 !3 !4 !5 !6 !7 !8 !9
 10578#ENDCOMMAND
 10579
 10580#COMMAND BIGINT R
 10581  DEFINE$VARIABLE$HELP BIGINT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10582#ENDCOMMAND
 10583
 10584//#COMMAND LOGICAL R
 10585//  DEFINE$VARIABLE$HELP LOGICAL !1 !2 !3 !4 !5 !6 !7 !8 !9
 10586//#ENDCOMMAND
 10587
 10588#COMMAND TIME R
 10589  DEFINE$VARIABLE$HELP TIME !1 !2 !3 !4 !5 !6 !7 !8 !9
 10590#ENDCOMMAND
 10591
 10592#COMMAND DATETIME R
 10593  DEFINE$VARIABLE$HELP DATETIME !1 !2 !3 !4 !5 !6 !7 !8 !9
 10594#ENDCOMMAND
 10595
 10596#COMMAND FLOAT R
 10597  DEFINE$VARIABLE$HELP FLOAT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10598#ENDCOMMAND
 10599
 10600#COMMAND CHAR R
 10601  DEFINE$VARIABLE$HELP CHAR !1 !2 !3 !4 !5 !6 !7 !8 !9
 10602#ENDCOMMAND
 10603
 10604#COMMAND UCHAR R
 10605  DEFINE$VARIABLE$HELP UCHAR !1 !2 !3 !4 !5 !6 !7 !8 !9
 10606#ENDCOMMAND
 10607
 10608#COMMAND SHORT R
 10609  DEFINE$VARIABLE$HELP SHORT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10610#ENDCOMMAND
 10611
 10612#COMMAND USHORT R
 10613  DEFINE$VARIABLE$HELP USHORT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10614#ENDCOMMAND
 10615
 10616#COMMAND UINTEGER R
 10617  DEFINE$VARIABLE$HELP UINTEGER !1 !2 !3 !4 !5 !6 !7 !8 !9
 10618#ENDCOMMAND
 10619
 10620#COMMAND BOOLEAN R
 10621  DEFINE$VARIABLE$HELP BOOLEAN !1 !2 !3 !4 !5 !6 !7 !8 !9
 10622#ENDCOMMAND
 10623
 10624#COMMAND UBIGINT R
 10625  DEFINE$VARIABLE$HELP UBIGINT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10626#ENDCOMMAND
 10627
 10628#COMMAND CURRENCY R
 10629  DEFINE$VARIABLE$HELP CURRENCY !1 !2 !3 !4 !5 !6 !7 !8 !9
 10630#ENDCOMMAND
 10631
 10632#COMMAND TIMESPAN R
 10633  DEFINE$VARIABLE$HELP TIMESPAN !1 !2 !3 !4 !5 !6 !7 !8 !9
 10634#ENDCOMMAND
 10635
 10636#COMMAND DECIMAL R
 10637  DEFINE$VARIABLE$HELP DECIMAL !1 !2 !3 !4 !5 !6 !7 !8 !9
 10638#ENDCOMMAND
 10639
 10640#COMMAND VARIANT R
 10641  DEFINE$VARIABLE$HELP VARIANT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10642#ENDCOMMAND
 10643
 10644#COMMAND ROWID R
 10645  DEFINE$VARIABLE$HELP RowID !1 !2 !3 !4 !5 !6 !7 !8 !9
 10646#ENDCOMMAND
 10647
 10648
 10649#COMMAND DEFINE$VARIABLE$HELP
 10650  #IFDEF __@INSIDE_STRUCT@__
 10651    #IFADIM !2
 10652      STRUCT_ARRAY_MEMBER !1 !2 !3 !4 !5 !6 !7 !8 !9
 10653    #ELSE
 10654      STRUCT_SCALAR_MEMBER  !1 !2 !3 !4 !5 !6 !7 !8 !9
 10655    #ENDIF
 10656  #ELSE
 10657    #IFDEF  __@INSIDE_FUNCTION@__
 10658      //#IF (!Zl & 2) // warn if old style and odd
 10659      //  #REM #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE Old style usage: Possible global variable in method
 10660      //#ENDIF
 10661
 10662      // jjt - used to be "& 1" which was wrong. 2 is old style flag, 1 is strict. changed in 9.1
 10663      // I would hope that no-one is using this feature anymore.
 10664      #IF (!Zl & 2) // old style - force to global
 10665        Global_Variable !1 !2 !3 !4 !5 !6 !7 !8 !9
 10666        #REM WARNING: Global Variable defined in method
 10667      #ELSE
 10668        Local !1 !2 !3 !4 !5 !6 !7 !8 !9
 10669      #ENDIF
 10670    #ELSE
 10671      Global_Variable !1 !2 !3 !4 !5 !6 !7 !8 !9
 10672    #ENDIF
 10673  #ENDIF
 10674#ENDCOMMAND
 10675
 10676// Change: Check that U_!1 is not yet defined
 10677//         Error if within class
 10678//         Error if within a method
 10679#COMMAND CLASS _RCDNSO "IS" "A""AN" _RDNO //_UGBO#L _UGBO#L _GBO#L .
 10680  #IF (!b & 6)            // if within class or procedure...error
 10681    #IF (!b & 2)          // if within class
 10682      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Classes cannot be nested within classes
 10683    #ELSE                 // if within method
 10684      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Classes cannot be nested within methods
 10685    #ENDIF
 10686  #ELSE
 10687    #CHECK U_!1 _T                      // does new class exist? If yes error
 10688    #CHECK U_!4 _U                      // does superclass exist? if no error
 10689    #REPLACE !1$SC !4                   //define superclass of new class
 10690    #IFSAME !5 STARTMAC                 //if start macro specified,
 10691      #REPLACE !1$SM !6                 //remember its name
 10692      #IFSAME !7 ENDMAC                 //if end macro specified,
 10693        #REPLACE !1$EM !8               //remember it
 10694        BASE_CREATE_CLASS !1 !2 !3 !4 !9
 10695      #ELSE
 10696        BASE_CREATE_CLASS !1 !2 !3 !4 !7 !8 !9
 10697      #ENDIF
 10698    #ELSE
 10699      #IFSAME !5 ENDMAC                 //no STARTMAC - if ENDMAC specified,
 10700        #REPLACE !1$EM !6               //remember it
 10701        BASE_CREATE_CLASS !1 !2 !3 !4 !7 !8 !9
 10702      #ELSE
 10703        BASE_CREATE_CLASS !1 !2 !3 !4 !5 !6 !7 !8 !9
 10704      #ENDIF
 10705    #ENDIF
 10706  #ENDIF
 10707#ENDCOMMAND
 10708
 10709// Change: Clear In object Flag. If a class is created within an object
 10710//         it is not relevant.
 10711
 10712#COMMAND BASE_CREATE_CLASS _RCDNSO "IS" "A""AN" _RDNO _UGBO#L _UGBO#L _GBO#L .
 10713  #PUSH !b              // save obj_flag
 10714  #PUSH !Zb             // save current_dep
 10715  #PUSH !Zf             // save the super_class_count
 10716  #SET B$ (!b | 2)      // set flag to in_class
 10717  // we want to strip in in-object flag. This will get restored when
 10718  // the class is ended. When a class is defined it is not relevant if
 10719  // it is in an object or not.
 10720  #SET B$ (!b & 14)     // set flag to not in_class (remove bit 0)
 10721  #SET ZB$ 0                // based on atomic class object
 10722  #IF ( (!b & 1) = 0 )          // are we NOT in a create_object?
 10723    #IFDEF !4.AGG               // bump dep number by already
 10724      #SET ZB$ !4.AGG           // defined sub objects
 10725    #ENDIF
 10726  #ENDIF
 10727  #SET ZF$ !Zb              // save the super_class_count
 10728  #PUSH !Zi             // save current sub object count
 10729  #SET ZI$ 0                // and init for new class
 10730
 10731  #PUSH !x                  // save old property index
 10732  #SET X$ 0                 //init to first array index# (0)
 10733
 10734  #SPUSH             // save the old class name
 10735  #SET $$ !1                // retain the name of the class
 10736  #IFDEF U_!1               // if the new class id has already
 10737  #ELSE                 // been defined, dont bother
 10738    Global_variable INTEGER U_!1            // else put it into a int of that name
 10739  #ENDIF
 10740  #DATA                 // wind up the stream
 10741  #IFDEF !4
 10742    #DPUSH !4
 10743  #ELSE
 10744    #DPUSH U_!4             // based upon
 10745  #ENDIF
 10746  #IF (!0<5)
 10747    #DPUSH |CI0             // no colors defined, use default
 10748  #ELSE
 10749    #DPUSH !5               // else do what they say
 10750  #ENDIF
 10751  #IF (!0<6)
 10752    #DPUSH |CI0             // no colors defined, use default
 10753  #ELSE
 10754    #DPUSH !6               // else do what they say
 10755  #ENDIF
 10756  #IF (!0=7)                // if parameter used, this will be
 10757    #DPUSH |CS"!7"          // the name of a 'C' function.
 10758  #ELSE
 10759    #DPUSH |CS""            // else inherit one from the parent
 10760  #ENDIF
 10761  !A [] CREATE$CLASS U_!1 |VL       // let 'er rip
 10762#ENDCOMMAND
 10763
 10764
 10765// changes: 1. Allow New syntax: Property type Name {dflt} public|private is optional
 10766//          2. Check placement as follows:
 10767//             2.1. Must be in class or object
 10768//             2.2. Cannot be in a child object defined by a class
 10769//             2.3. If in class, must be in procedure (constructor)
 10770//             2.4. If in object, must not be in procedure.
 10771//          3. Check for Property Name conflicts (Get_name conflict)
 10772//             3.1. If defined as object access - error
 10773//             3.2. If defined as global method - error
 10774//             3.3. If defined with different param list - error (already does this)
 10775
 10776
 10777// Changes: 1. No_image is optional if windows (always provided by compiler)
 10778//          2. If within class, s/b within a class (in df$object)
 10779#COMMAND OBJECT R "IS" "A""AN" RVD#I
 10780  #IFDEF IS$WINDOWS
 10781    // If windows we can check for no_image and if it is not presented then
 10782    // we will provide a no_image argument. Therefore you should NEVER need to use
 10783    // No_image with windows.
 10784    #IF (!0<5)                // if no image try to aquire one
 10785      #IFDEF !1.N             // if image exists with object name, use that
 10786         OBJECT !1 !2 !3 !4 !1
 10787      #ELSE
 10788         OBJECT !1 !2 !3 !4 NO_IMAGE // else use no_image
 10789      #ENDIF
 10790    #ELSE
 10791      #IFDEF !5.N                               // if passed a valid image or
 10792         DF$OBJECT !1 !2 !3 !4 !5 !6 !7 !8 !9   // no_image use them. Else add
 10793      #ELSE                                     // the no_image parameter.
 10794        #IFSAME !5 NO_IMAGE
 10795           DF$OBJECT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10796        #ELSE
 10797           DF$OBJECT !1 !2 !3 !4 NO_IMAGE !5 !6 !7 !8 !9
 10798        #ENDIF
 10799      #ENDIF
 10800    #ENDIF
 10801  #ELSE
 10802    // If character mode no_image must be explicitly provided (as it has always been).
 10803    // we cannot use the no_image replacement because it does not work with dynamic
 10804    // visual objects (like edits).
 10805    #IF (!0<5)                // if no image try to aquire one
 10806      DF$OBJECT !1 !2 !3 !4 !1
 10807    #ELSE
 10808      DF$OBJECT !1 !2 !3 !4 !5 !6 !7 !8 !9
 10809    #ENDIF
 10810  #ENDIF
 10811#ENDCOMMAND
 10812
 10813#COMMAND DF$OBJECT R "IS" "A""AN" RVD#I
 10814
 10815  #IF (!b & 2) // if within a class
 10816    #IF ( (!b & 4)=0 ) // should be within a method
 10817      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Objects in classes should be within a method
 10818    #ENDIF
 10819  #ENDIF
 10820
 10821  // if we are within a method we will keep track of the number of
 10822  // nested objects. When the method ends we will verify that this is 0.
 10823  // This lets us warn about mismathed object/end-object commands
 10824  #IF ( !b & 4)   // if object within method
 10825    #SET ZM$ !ZM  // increment
 10826  #ENDIF
 10827
 10828
 10829  #DATA                   // start up the data stream
 10830  #PUSH !Zj               // save the unique object label
 10831  #PUSH !b                // save current definition state
 10832
 10833  #IF (!b > 0)            // if not global..we make no guesses about
 10834                          // dependent numbers. Let the runtime assign
 10835                          // dependent order.
 10836  //#IF (!b = 4)          // if in procedure and not class
 10837    #SET ZJ$ 0            // do not inc z
 10838  #ELSE
 10839    #SET ZJ$ !ZB          // assign the next object id
 10840  #ENDIF
 10841  #PUSH !Zb               // save this level on stack
 10842  #IFDEF !4.AGG           // was this a class with sub objects?
 10843    #SET ZB$ !4.AGG       // sub objects will begin at the
 10844  #ELSE                   // next object after superclass
 10845    #SET ZB$ 0            // base classes start at 0
 10846  #ENDIF
 10847  #SET ZI$ !ZI            // count this object at the current level
 10848  #PUSH !Zi               // and push the level
 10849  #IF (!b > 0)            // if (in_object | in_class)
 10850    #IF (!b & 2)          // obj_flag == in_class?
 10851      #IF (!b & 1)        // obj_flag == in_Object?
 10852      #ELSE               // No Name for Subobject in constructor
 10853        // don't define this anymore...
 10854        //#REPLACE !$.!1.OBJ |CI-!Zj  // object_name = -current_object
 10855      #ENDIF
 10856    #ENDIF
 10857    // (LS) removed setting of ZJ; it is NOT being used.
 10858    // (Removed when max lines increased > 32k)
 10859    //      #SET ZJ$ (32766-!a)           // a very unique label for this object
 10860    #DPUSH |CS".!1"           // make name from parent and child
 10861  #ELSE               // global object name
 10862    #DPUSH |CS"!1"            // assign an absolute name to object
 10863  #ENDIF
 10864  #CHECK U_!4 _U          // does class exist?
 10865  #DPUSH U_!4             // define then class the class id
 10866  GET$OBJ$IMAGE !5            // define the objects image
 10867  #IF ((!b & 3) = 2)          // if in_class & !in_object
 10868    // don't assign dep nums anymore
 10869    //#DPUSH !$.!1.OBJ          // pick the assigned dependant number
 10870    // New code just sets 0
 10871    #DPUSH |CI0           // pick the next dependant number
 10872  #ELSE               //
 10873    #IF (!b = 0)          // A global object must assign #
 10874      #IFDEF !1.OBJ           // Is the symbol defined, name_object?
 10875        #DPUSH |CI0           // pick the next dependant number
 10876      #ELSE
 10877        #DPUSH |CI!Zj         // force the dependant number
 10878//        #SET ZJ$ ($1000+!Zj)       // mark as global object
 10879        #SET ZJ$ ($10000000+!Zj)   // using 32-bit ids now
 10880        // as of 8.3 we no longer use dependent lists so we cannot create the ObjName.obj symbol anymore. This method of ussage has
 10881        // been deprecated since early framework days and it is now no longer suppoted. The only way you can use the .obj method is to
 10882        // use name_object, which moves this into a global integer variable. Developers are advised to change the ObjName.obj to
 10883        // (ObjName(desktop)).
 10884        // Also I don't think the above Zj is even needed, but for now they remain.
 10885        //#REPLACE !1.OBJ |CI!Zj        // Assign an ID to this object
 10886      #ENDIF
 10887    #ELSE
 10888      #DPUSH |CI0         // pick the next dependant number
 10889    #ENDIF
 10890  #ENDIF
 10891  REGISTER_OBJECT !1
 10892  #DPUSH GET_!1
 10893  #SET B$ (!b | 1)            // we are in a object definition
 10894  !A [] OBJ$CREATE |VL        // create the object now
 10895
 10896  #IFDEF !1.OBJ
 10897    #IFCLASS !1.OBJ V$        // does this object have a global?
 10898      MOVE CURRENT_OBJECT TO !1.OBJ   // Move the object id to its global
 10899    #ENDIF
 10900  #ENDIF
 10901
 10902  #SPUSH   //save the old class name
 10903  #SET $$ !4
 10904  #IFSUB '!$$SC' // if flex-defined class
 10905    #IFSUB '!$$SM' // if begin-instance macro exists
 10906      #IFDEF IS$WINDOWS
 10907        // in windows we know that an image is always passed (object creates one if needed)
 10908        // and that images are never used. Therefore replace image argument with 0.
 10909        !$$SM !$ 0 !6 !7 !8 !9
 10910      #ELSE
 10911        // character might be passing an image and it might not. We must pass the value
 10912        !$$SM !$ !5 !6 !7 !8 !9
 10913      #ENDIF
 10914    #ELSE
 10915      FORWARD_BEGIN_CONSTRUCT !$ !5 !6 !7 !8 !9
 10916    #ENDIF
 10917  #ELSE
 10918    ADD$IMAGE$ARGS MSG_CONSTRUCT_OBJECT !5 !6 !7 !8 !9  //else use default
 10919  #ENDIF
 10920#ENDCOMMAND
 10921
 10922// Changes:  1. Methods not allowed in class child-objects
 10923//           2. If on desktop and not Global/for..is for cDesktop (changed in 8.3, was Desktop)
 10924
 10925
 10926
 10927#COMMAND GET$SET "GET""SET" RD#OBLG
 10928
 10929  #IFSAME !3 OF
 10930//    #IFSAME !5 FILE_FIELD // is the file_field keyword used?
 10931//      #IFCLASS !6 F       // test for file element
 10932//        #PUSH !h
 10933//        #PUSH !g
 10934//        #SET H$ %!6       // get the fieldnumber of parameter
 10935//        #SET G$ !6        // get the filenumber of parameter
 10936//        GET$SET$HELP !1 !2 !3 !4 |CI!g |CI!h !7 !8 !9
 10937//        #POP G$
 10938//        #POP H$
 10939//      #ELSE
 10940//        #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNKNOWN FILE_FIELD: !6
 10941//      #ENDIF
 10942//    #ELSE
 10943//      #IFSAME !5 FIELD      // is the field keyword used?
 10944//        #IFCLASS !6 F       // test for file element
 10945//          #PUSH !h
 10946//          #SET H$ %!6         // get the fieldnumber of parameter
 10947//          GET$SET$HELP !1 !2 !3 !4 |CI!h !7 !8 !9
 10948//          #POP H$
 10949//        #ELSE
 10950//          #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNKNOWN FIELD: !6
 10951//        #ENDIF
 10952//      #ELSE
 10953        GET$SET$HELP !1 !2 !3 !4 !5 !6 !7 !8 !9
 10954//      #ENDIF
 10955//    #ENDIF
 10956  #ELSE  // !3 not OF. Provide Object
 10957    GET$SET !1 !2 OF CURRENT_OBJECT !3 !4 !5 !6 !7 !8 !9
 10958  #ENDIF
 10959#ENDCOMMAND
 10960
 10961#COMMAND GET$SET$HELP "GET""SET" RD#OBLG "OF" RSND#OBLG R
 10962
 10963  #IF ( (!Zl & 1)=0)
 10964    #IFCLASS !2 "EFWV"
 10965      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Unusual Usage: Variable or Expression used as message
 10966    #ENDIF
 10967
 10968    #IF (!b = 2) // within class but not in object or method
 10969      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Messages in class should be in method
 10970    #ENDIF
 10971  #ENDIF
 10972
 10973  #IFSAME DFLT$!2 __X__ __F__  // is this a item type message?
 10974    #IFSAME !5 ITEM       // is the item keyword used?
 10975      OBJECT$PROPERTIES !1 !2 !4 !6 !7 !8 !9 // pass it on
 10976    #ELSE
 10977      #IFSAME !5 TO       // if no param passed create a default
 10978        #IFSAME DFLT$!2 __F__   // is this a form type message?
 10979          #IF (!Zl & 2)
 10980            // if a Form_ message, and no item was passed before the TO
 10981            // and there are two params after the two this is an old syntax.
 10982            #IF (!0>6)
 10983              // this one must be fixed!
 10984              #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE OBSOLETE SYNTAX: GET/SET FORM_XXX TO X Y
 10985              #REM #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE OBSOLETE SYNTAX: GET/SET FORM_XXX TO X Y
 10986            #ENDIF
 10987          #ENDIF
 10988          OBJECT$PROPERTIES !1 !2 !4   0 !5 !6 !7 !8 !9  // use 0 as dflt
 10989        #ELSE
 10990          #IF (!Zl & 2)
 10991            // if a item_ message, and no item was passed before the TO
 10992            // it used to replace with current which is now changed to
 10993            // 0. Warn that this might cause a problem in old programs.
 10994            #REM #ERROR DFERR_COMP_OBSOLETE_UNSUPPORTED_FEATURE Old Style Usage: No ITEM keyword. Is replacement for .current. or 0
 10995          #ENDIF
 10996          //OBJECT$PROPERTIES !1 !2 !4 0 !5 !6 !7 !8 !9  // use 0 as dflt
 10997          OBJECT$PROPERTIES !1 !2 !4 -99 !5 !6 !7 !8 !9  // use CURRENT as dflt
 10998        #ENDIF
 10999      #ELSE // params are passed. Just Use them
 11000        OBJECT$PROPERTIES !1 !2 !4 !5 !6 !7 !8 !9 // pass it on
 11001        //#REM ITEM KEYWORD OMITTED. USE !5
 11002      #ENDIF
 11003    #ENDIF
 11004  #ELSE // not Item or Form based
 11005    OBJECT$PROPERTIES !1 !2 !4 !5 !6 !7 !8 !9  // just supply args
 11006  #ENDIF
 11007#ENDCOMMAND
 11008
 11009
 11010#COMMAND OBJECT$PROPERTIES "GET""SET" RD#OBLG RSND#OBLG R
 11011  #DATA
 11012
 11013  #IFDEF !2         // is message in a variable?
 11014    #DPUSH !2           // yes, just push the value
 11015  #ELSE
 11016    #IFDEF !1_!2        // is this message defined?
 11017      #DPUSH !1_!2      // yes, push the definition
 11018    #ELSE
 11019      // If there is no message defined, try matching with mangled symbol.
 11020      #IFSAME !1 GET
 11021        #MANG !1_!2 !4 !5 !6 !7 !8 !9
 11022      #ELSE
 11023        #MING !1_!2 !4 !5 !6 !7 !8 !9
 11024      #ENDIF
 11025      // Push it, if we can, or push a fref to the mangled name.
 11026      // Fwd refs try to match without the syntactic sugar first.
 11027      #IFDEF !?
 11028      
 11029        // Overloading does not allow File_Field, Field or Item (get only)
 11030        #IFSAME FILE_FIELD !2 !3 !4 !5 !6 !7 !8 !9
 11031          #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FILE_FIELD keyword not allowed in Overloaded messages"
 11032        #ELSE
 11033          #IFSAME FIELD !2 !3 !4 !5 !6 !7 !8 !9
 11034            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FIELD keyword not allowed in Overloaded messages"
 11035          #ELSE
 11036            #IFSAME !1 GET // GET's #mang does not test for ITEM so we disallow it here.
 11037              #IFSAME ITEM !2 !3 !4 !5 !6 !7 !8 !9
 11038                #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "ITEM keyword not allowed or needed in GET Overloaded messages"
 11039              #ENDIF  
 11040            #ENDIF  
 11041          #ENDIF
 11042        #ENDIF
 11043        
 11044        #DPUSH !?
 11045      #ELSE
 11046        #DPUSH |CI0       // forward reference the message
 11047        #FREF !? !a,0      // add the reference to be defined
 11048      #ENDIF
 11049    #ENDIF
 11050  #ENDIF
 11051
 11052  #PUSH !Zg
 11053  #SET ZG$ 0
 11054
 11055  #PUSH !Zh
 11056  #SET ZH$ 2  // 3 unrestricted params following TO and TO is optional
 11057  #IF (!Zl & 1)
 11058    #SET ZH$ 3  // Its ok...no fancy checking
 11059  #ELSE
 11060    #IFSAME !1 GET
 11061      #SET ZH$ 1  // 1 means 1 param following TO
 11062    #ELSE
 11063      #IFSAME DFLT$2$!2 __2__  // is this a complex set message? (more than 1 param)
 11064      #ELSE
 11065        #IFSAME DFLT$!2 __X__ __F__  // is this a item or form type message?
 11066        //#IFSAME DFLT$!2 __F__  // is this a item or form type message?
 11067          #SET ZH$ 1  // 1 means 1 param following TO
 11068        #ENDIF
 11069      #ENDIF
 11070    #ENDIF
 11071  #ENDIF
 11072
 11073  PROPERTY$HELP !4 !5 !6 !7 !8 !9
 11074
 11075  #POP ZH$
 11076  #POP ZG$
 11077
 11078  // Precedence of Object ID resolution
 11079  // 1. If variable (hopefully local)
 11080  // 2. if expression
 11081  // 3. If .obj (old style, to be avoided)
 11082  // 4. If object access id
 11083
 11084  #IFDEF !3 // if a variable, constant or expression...it's defined
 11085    OBJECT$DEFINE !1 !3
 11086  #ELSE
 11087
 11088    // remove object.OBJ check - must explicitly add .obj if you want it
 11089    //#IFDEF !3.OBJ   // old style: If global object or defined w/ .obj (ugh)
 11090    //  OBJECT$DEFINE !1 !3.OBJ
 11091    //#ELSE
 11092
 11093      #IFDEF GET_!3 // if defined as a function
 11094        #IF (GET_!3>$40000000) // and an object access method
 11095          // replace simple name with expression syntax
 11096          OBJECT$DEFINE !1 (!3(Current_object))
 11097        #ELSE // if defined as a function but not an access method. This is an error
 11098          #ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE "Already defined as a function"
 11099        #ENDIF
 11100      #ELSE
 11101        // 12.0 change:
 11102        // !3 is not defined but we will pass this on and allow the compiler to attempt to resolve it
 11103        OBJECT$DEFINE !1 (!3(Current_object))
 11104
 11105        //// not yet defined. We could either forward ref as object or
 11106        //// declare an error. For now let's just do an error.
 11107        //#ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE Object .not. yet defined
 11108        //// here is how we would forward ref as obj
 11109        ////Register_object !3
 11110        ////!A [] OBJ$!1 (!3(Current_object)) |VL
 11111      #ENDIF
 11112
 11113    //#ENDIF
 11114  #ENDIF
 11115#ENDCOMMAND
 11116
 11117#COMMAND OBJECT$DEFINE R R
 11118   !A [] OBJ$!1 !2 |VL
 11119#ENDCOMMAND
 11120
 11121// this forces the param passed to be subsituted for an expression
 11122// you can directly dpush an expression
 11123#COMMAND DPUSH$EXP R .
 11124    #DPUSH !1
 11125#ENDCOMMAND
 11126
 11127
 11128
 11129
 11130#COMMAND PROPERTY$HELP
 11131  #IF (!0>0)
 11132    // check that none of the params are indicators. We wrap this in an IFLOGICAL because the # test 
 11133    // also fires on other symbols like EQ
 11134    #IFLOGICAL !1
 11135        #CHECK !1 _#
 11136    #ENDIF    
 11137    #IFSAME !1 FIELD
 11138      #IFCLASS !2 F         // test for file element
 11139        #PUSH !h
 11140        #SET H$ %!2         // get the fieldnumber of parameter
 11141        PROPERTY$HELP |CI!h !3 !4 !5 !6 !7 !8 !9
 11142        #POP H$
 11143      #ELSE
 11144        #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNKNOWN FIELD: !2
 11145      #ENDIF
 11146    #ELSE
 11147      #IFSAME !1 FILE_FIELD
 11148        #IFCLASS !2 F         // test for file element
 11149          #PUSH !h
 11150          #PUSH !g
 11151          #SET H$ %!2  // get the fieldnumber of parameter
 11152          #SET G$ !2   // get the filenumber of parameter
 11153          PROPERTY$HELP |CI!g |CI!h !3 !4 !5 !6 !7 !8 !9
 11154          #POP G$
 11155          #POP H$
 11156        #ELSE
 11157          #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNKNOWN FILE_FIELD: !2
 11158        #ENDIF
 11159      #ELSE
 11160      
 11161        #IFSAME !1 OF // "of" should have already been processed. This is an error
 11162          #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX INVALID USE OF 'OF'
 11163          #SET ZH$ 4 // 4 means error occurred
 11164        #ELSE
 11165        
 11166          // Check that TO is used properly.
 11167          #IFSAME !1 TO
 11168            #IF (!Zl & 1)
 11169            #ELSE
 11170              #IF (!Zh=3)  // TO already encountered. TOO many Tos
 11171                #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX TOO MANY 'TO'
 11172                #SET ZH$ 4 // 4 means error occurred
 11173              #ELSE
 11174                #IF (!0=1) // missing param after to
 11175                  #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX NO VALUE FOLLOWING 'TO'
 11176                  #SET ZH$ 4 // 4 means error occurred
 11177                #ELSE
 11178                  #SET ZH$ 3 // Mark as found a to. May get changed if an error
 11179                  #IF (!Zh=1) // A GET or ITEM SET without a TO yet
 11180                    #IF (!0>2)  // too many params after the to
 11181                      #IFSAME !1 FIELD // if FIELD we expect another param
 11182                      #ELSE
 11183                        #IFSAME !1 FILE_FIELD // if FILE_FIELD we expect another param
 11184                        #ELSE
 11185                          #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX TOO MANY PARAMS AFTER 'TO'
 11186                          #SET ZH$ 4 // 4 means error occurred
 11187                        #ENDIF
 11188                      #ENDIF    
 11189                    #ENDIF
 11190                  #ENDIF
 11191                #ENDIF
 11192              #ENDIF
 11193            #ENDIF
 11194          #ELSE
 11195            #IFSAME !1 ITEM
 11196            #ELSE
 11197              #SET ZG$ !ZG
 11198              #IFDEF !1
 11199                #DPUSH !1
 11200              #ELSE
 11201                #IFCLASS !1 0123456789ABCDEF
 11202                  #DPUSH !1
 11203                #ELSE
 11204                  //#IFDEF MSG_!1
 11205                  //  #DPUSH MSG_!1
 11206                  //#ELSE
 11207                  //  #DPUSH |CI0
 11208                  //  #FREF MSG_!1 !a,!Zg
 11209                  //#ENDIF
 11210    
 11211                  #IFDEF GET_!1 // if defined as a function
 11212                  // This would support passing of object names as parameters. Not supported
 11213                  // for now.
 11214                    #IF (GET_!1>$40000000) // and an object access method..we will help out
 11215                      // replace simple name with expression syntax
 11216                      DPUSH$EXP (!1(current_object))
 11217                    #ELSE       // if defined as a function but not an access method. This is an error
 11218                      #DPUSH !1 // will generate an Error
 11219                    #ENDIF
 11220                  #ELSE       // If undefined
 11221                    // this could be msg_!1 but we will call than an error
 11222                    //#DPUSH !1 // will generate an Error
 11223                    #IFDEF MSG_!1
 11224                      #DPUSH MSG_!1
 11225                    #ELSE
 11226                      #DPUSH |CI0
 11227                      #FREF MSG_!1 !a,!Zg
 11228                    #ENDIF
 11229    
 11230                  #ENDIF
 11231                #ENDIF
 11232              #ENDIF
 11233            #ENDIF
 11234          #ENDIF
 11235    
 11236        #ENDIF
 11237        #IF (!Zh<4) // 4 indicates an error occurred
 11238          PROPERTY$HELP !2 !3 !4 !5 !6 !7 !8 !9 // as long as there is still no error
 11239        #ENDIF
 11240      #ENDIF
 11241    #ENDIF
 11242  #ELSE
 11243    #IF (!Zh<3) // If 1 or 2, TO was never found
 11244      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX MISSING 'TO' KEYWORD
 11245    #ENDIF
 11246  #ENDIF
 11247#ENDCOMMAND
 11248
 11249//
 11250////old
 11251//#COMMAND PROPERTY$HELP
 11252//  #IF (!0>0)
 11253//    #IFSAME !1 OF // "of" should have already been processed. This is an error
 11254//      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX INVALID USE OF 'OF'
 11255//      #SET ZH$ 4 // 4 means error occurred
 11256//    #ELSE
 11257//      // Check that TO is used properly.
 11258//      #IFSAME !1 TO
 11259//        #IF (!Zl & 1)
 11260//        #ELSE
 11261//          #IF (!Zh=3)  // TO already encountered. TOO many Tos
 11262//            #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX TOO MANY 'TO'
 11263//            #SET ZH$ 4 // 4 means error occurred
 11264//          #ELSE
 11265//            #IF (!0=1) // missing param after to
 11266//              #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX NO VALUE FOLLOWING 'TO'
 11267//              #SET ZH$ 4 // 4 means error occurred
 11268//            #ELSE
 11269//              #IF (!Zh=1) // A GET or ITEM SET without a TO yet
 11270//                #IF (!0>2)  // too many params after the to
 11271//                  #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX TOO MANY PARAMS AFTER 'TO'
 11272//                  #SET ZH$ 4 // 4 means error occurred
 11273//                #ELSE
 11274//                  #SET ZH$ 3 // Mark as found a to
 11275//                #ENDIF
 11276//              #ELSE        // If here a non-item SET
 11277//                #SET ZH$ 3 // Mark as found a to
 11278//              #ENDIF
 11279//            #ENDIF
 11280//          #ENDIF
 11281//        #ENDIF
 11282//      #ELSE
 11283//        #IFSAME !1 ITEM
 11284//        #ELSE
 11285//          #SET ZG$ !ZG
 11286//          #IFDEF !1
 11287//            #DPUSH !1
 11288//          #ELSE
 11289//            #IFCLASS !1 0123456789ABCDEF
 11290//              #DPUSH !1
 11291//            #ELSE
 11292//              //#IFDEF MSG_!1
 11293//              //  #DPUSH MSG_!1
 11294//              //#ELSE
 11295//              //  #DPUSH |CI0
 11296//              //  #FREF MSG_!1 !a,!Zg
 11297//              //#ENDIF
 11298//
 11299//              #IFDEF GET_!1 // if defined as a function
 11300//              // This would support passing of object names as parameters. Not supported
 11301//              // for now.
 11302//                #IF (GET_!1>$40000000) // and an object access method..we will help out
 11303//                  // replace simple name with expression syntax
 11304//                  DPUSH$EXP (!1(current_object))
 11305//                #ELSE       // if defined as a function but not an access method. This is an error
 11306//                  #DPUSH !1 // will generate an Error
 11307//                #ENDIF
 11308//              #ELSE       // If undefined
 11309//                // this could be msg_!1 but we will call than an error
 11310//                //#DPUSH !1 // will generate an Error
 11311//                #IFDEF MSG_!1
 11312//                  #DPUSH MSG_!1
 11313//                #ELSE
 11314//                  #DPUSH |CI0
 11315//                  #FREF MSG_!1 !a,!Zg
 11316//                #ENDIF
 11317//
 11318//              #ENDIF
 11319//            #ENDIF
 11320//          #ENDIF
 11321//        #ENDIF
 11322//      #ENDIF
 11323//    #ENDIF
 11324//    #IF (!Zh<4) // 4 indicates an error occurred
 11325//      PROPERTY$HELP !2 !3 !4 !5 !6 !7 !8 !9 // as long as there is still no error
 11326//    #ENDIF
 11327//  #ELSE
 11328//    #IF (!Zh<3) // If 1 or 2, TO was never found
 11329//      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX MISSING 'TO' KEYWORD
 11330//    #ENDIF
 11331//  #ENDIF
 11332//#ENDCOMMAND
 11333
 11334// Changes: 1. support "OF" as well as "TO". OF is preferred
 11335//          2. Check location of "OF" keyword
 11336//          3. Check for improper message type (expression)
 11337//          4. If sent directly within class (not method)...error
 11338#COMMAND SEND RSD#OBLG
 11339
 11340  #IF ( (!Zl & 1)=0)
 11341    // we expect message to be msg_xxx, constant or local var.
 11342    // Actually locals are weird, but much more acceptable
 11343    #IFCLASS !1 "EFWV" // if exp, file, window or global...weird
 11344      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX Unusual Usage: Variable or Expression used as message
 11345    #ENDIF
 11346
 11347    #IF (!b = 2) // within class but not in object or method
 11348      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Messages in class should be in method
 11349    #ENDIF
 11350  #ENDIF
 11351
 11352  #DATA
 11353  #IFDEF !1
 11354    #DPUSH !1
 11355  #ELSE
 11356
 11357    #IFNDEF MANGLE_NAMES
 11358
 11359      #IFDEF MSG_!1
 11360        #DPUSH MSG_!1
 11361      #ELSE
 11362        #DPUSH |CI0
 11363        #FREF MSG_!1 !a,0
 11364      #ENDIF
 11365
 11366    #ELSE
 11367
 11368      #IFSAME !2 TO OF
 11369        #IFDEF MSG_!1
 11370          #DPUSH MSG_!1
 11371        #ELSE
 11372          #MANG MSG_!1 !4 !5 !6 !7 !8 !9
 11373          #IFDEF !?
 11374            #IFSAME FILE_FIELD !2 !3 !4 !5 !6 !7 !8 !9
 11375              #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FILE_FIELD keyword not allowed in Overloaded messages"
 11376            #ELSE
 11377              #IFSAME FIELD !2 !3 !4 !5 !6 !7 !8 !9
 11378                #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FIELD keyword not allowed in Overloaded messages"
 11379              #ENDIF
 11380            #ENDIF
 11381            #DPUSH !?
 11382          #ELSE  // message undefined. push obj function fixup.
 11383            #DPUSH |CI0
 11384            #FREF !? !a,0
 11385          #ENDIF
 11386        #ENDIF
 11387      #ELSE
 11388        #IFDEF MSG_!1
 11389          #DPUSH MSG_!1
 11390        #ELSE
 11391          #MANG MSG_!1 !2 !3 !4 !5 !6 !7 !8 !9
 11392          #IFDEF !?
 11393            #IFSAME FILE_FIELD !2 !3 !4 !5 !6 !7 !8 !9
 11394              #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FILE_FIELD keyword not allowed in Overloaded messages"
 11395            #ELSE
 11396              #IFSAME FIELD !2 !3 !4 !5 !6 !7 !8 !9
 11397                #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FIELD keyword not allowed in Overloaded messages"
 11398              #ENDIF
 11399            #ENDIF
 11400            #DPUSH !?
 11401          #ELSE
 11402            #DPUSH |CI0   // can't tell if it's object or global. push object.
 11403            #FREF !? !a,0
 11404          #ENDIF
 11405        #ENDIF
 11406      #ENDIF
 11407
 11408    #ENDIF  // Name Mangling Case
 11409
 11410  #ENDIF
 11411  #IFSAME !2 TO OF // support both OF (suggested) and TO (old)
 11412    SEND$HELP !4 !5 !6 !7 !8 !9
 11413    SEND$CMD TO TO !3
 11414  #ELSE
 11415    SEND$HELP !2 !3 !4 !5 !6 !7 !8 !9
 11416    SEND$CMD TO TO CURRENT_OBJECT
 11417  #ENDIF
 11418#ENDCOMMAND
 11419
 11420#COMMAND SEND$CMD
 11421  #IFSAME !1 !2
 11422    #IFDEF !3 // if a variable, constant or expression...it's defined
 11423      OBJECT$SEND$DEFINE !3
 11424    #ELSE
 11425      // remove .obj resolution. must manually add this
 11426      //#IFDEF !3.OBJ   // old style: If global object or defined w/ .obj (ugh)
 11427      //  OBJECT$SEND$DEFINE !3.OBJ
 11428      //#ELSE
 11429        #IFDEF GET_!3 // if defined as a function
 11430          #IF (GET_!3>$40000000) // and an object access method
 11431            // replace simple name with expression syntax
 11432            OBJECT$SEND$DEFINE (!3(Current_object))
 11433          #ELSE // if defined as a function but not an access method. This is an error
 11434             #ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE "Already defined as a function"
 11435          #ENDIF
 11436        #ELSE
 11437          // 12.0 change:
 11438          // !3 is not defined but we will pass this on and allow the compiler to attempt to resolve it
 11439          OBJECT$SEND$DEFINE (!3(Current_object))
 11440          
 11441          //// not yet defined. We could either forward ref as object or
 11442          //// declare an error. For now let's just do an error.
 11443          //#ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE Object .Not. yet defined
 11444          //// here is how we would forward ref as obj
 11445          ////!A [] OBJ$SEND |CI0 |VL
 11446          ////#FREF (!3(Current_object)) !a
 11447        #ENDIF
 11448      //#ENDIF
 11449    #ENDIF
 11450  #ELSE
 11451    !A [] OBJ$SEND CURRENT_OBJECT |VL
 11452  #ENDIF
 11453#ENDCOMMAND
 11454
 11455#COMMAND OBJECT$SEND$DEFINE R
 11456   !A [] OBJ$SEND !1 |VL
 11457#ENDCOMMAND
 11458
 11459
 11460#COMMAND SEND$HELP
 11461  #IF (!0>0)
 11462    // check that none of the params are indicators. We wrap this in an IFLOGICAL because the # test 
 11463    // also fires on other symbols like EQ
 11464    #IFLOGICAL !1
 11465        #CHECK !1 _#
 11466    #ENDIF    
 11467    #IFSAME !1 OF TO
 11468      #ERROR DFERR_COMP_INVALID_MESSAGE_SYNTAX INVALID POSITION FOR '!1'
 11469    #ELSE
 11470      #IFSAME !1 FIELD
 11471        #IFCLASS !2 F         // test for file element
 11472          #PUSH !h
 11473          #SET H$ %!2         // get the fieldnumber of parameter
 11474          SEND$HELP |CI!h !3 !4 !5 !6 !7 !8 !9
 11475          #POP H$
 11476        #ELSE
 11477          #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNKNOWN FIELD: !2
 11478        #ENDIF
 11479      #ELSE
 11480        #IFSAME !1 FILE_FIELD
 11481          #IFCLASS !2 F         // test for file element
 11482            #PUSH !h
 11483            #PUSH !g
 11484            #SET H$ %!2  // get the fieldnumber of parameter
 11485            #SET G$ !2   // get the filenumber of parameter
 11486            SEND$HELP |CI!g |CI!h !3 !4 !5 !6 !7 !8 !9
 11487            #POP G$
 11488            #POP H$
 11489          #ELSE
 11490            #ERROR DFERR_COMP_UNDEFINED_SYMBOL_IN_ARGUMENT UNKNOWN FILE_FIELD: !2
 11491          #ENDIF
 11492        #ELSE
 11493          // As of 10.1 we will support passing of object names as parameters.
 11494          #IFDEF !1   // if value is defined, just use it
 11495            #DPUSH !1
 11496          #ELSE
 11497            #IFCLASS !1 0123456789ABCDEF // this allows one to pass hex constants (e.g. $C003, NOENTER)
 11498              #DPUSH !1
 11499            #ELSE             // not defined, see if this is an object, referecne
 11500              #IFDEF GET_!1   // if defined as a function and is an object access, use it
 11501                #IF (GET_!1>$40000000)
 11502                  DPUSH$EXP (!1(current_object))
 11503                #ELSE
 11504                  #DPUSH !1 // will generate a symbol not defined error
 11505                #ENDIF
 11506              #ELSE
 11507                #DPUSH !1 // will generate a symbol not defined error
 11508              #ENDIF
 11509            #ENDIF
 11510          #ENDIF
 11511          SEND$HELP !2 !3 !4 !5 !6 !7 !8 !9
 11512        #ENDIF
 11513      #ENDIF
 11514    #ENDIF
 11515  #ENDIF
 11516#ENDCOMMAND
 11517
 11518// Create Move command that will move object access methods
 11519// to a var with simple name
 11520#COMMAND MOVE R "TO" R .
 11521  #IFDEF !1 // if Move Var to Var...normal move.
 11522    MoveVar !1 !2 !3
 11523  #ELSE
 11524    #IFDEF GET_!1   // if defined as a function
 11525      #IF (GET_!1>$40000000) // If move Object-access to (var|property)
 11526        MoveObj !1 !2 !3
 11527      #ELSE
 11528        MoveVar !1 !2 !3 // this will generate an error
 11529      #ENDIF
 11530    #ELSE
 11531      MoveVar !1 !2 !3 // will gen an error
 11532    #ENDIF
 11533  #ENDIF
 11534#ENDCOMMAND
 11535
 11536//#COMMAND MOVEVAR #L "TO" #GLEURC .
 11537//  #IFCLASS !1 "G"  // MOVE INDICATOR                // 12.0 note: this logic, which has been in fmac forever
 11538//    #CHECK !1 _VWFC                                 // would never work.
 11539//    !A [] $4020 !1 |GB[0] !3 IN$GLALL |3
 11540//  #ELSE
 11541//    // Type independent move as of 2.3
 11542//    !A  [] $086 !1 !3
 11543//  #ENDIF
 11544//#ENDCOMMAND
 11545
 11546// changed for 12.0 to support moving indicators
 11547
 11548#COMMAND MOVEVAR GL "TO" GLEURC .
 11549  // The ability to move to and from indicators was added to 12.0 along with the #IFLOGICAL compiler command.
 11550  // This allows developers to treat indicators just like booleans removing the need to create
 11551  // indicate and indicator commands. The Move command can now and should be used for all assignments.
 11552  #IFCLASS !1 "G"  // allowing this case through hangs the compiler .. error is reported already above in argument check
 11553  #ELSE
 11554    #IFLOGICAL !1
 11555      #IFLOGICAL !3
 11556        Indicate !3 as [!1]    // Move Indicator to Indicator   becomes: Indicate Indicator as [Indicator]
 11557      #ELSE
 11558        Movevar (!1) to !3     // Move Indicator to Var
 11559      #ENDIF
 11560    #ELSE
 11561      #IFLOGICAL !3
 11562        // if dest is indicator, check source to decide what kind of statement to build
 11563        #IFSAME !1 true false dftrue dffalse
 11564          Indicate !3 !1    // Move true|false to Indicator   becomes: Indicate Indicator true|false
 11565        #ELSE
 11566          #IFCLASS !1 _E
 11567            Indicate !3 as !1 // Move (exp) to Indicator      becomes: Indicate Indicator as (exp)
 11568          #ELSE
 11569            Indicate !3 as (!1)  // Move var to Indicator     becomes: Indicate Indicator as (var)
 11570          #ENDIF
 11571        #ENDIF
 11572      #ELSE
 11573        // if source and dest are both not indicators use the standard Move logic
 11574        //Type independent move as of 2.3
 11575        !A  [] $086 !1 !3
 11576      #ENDIF
 11577    #ENDIF
 11578  #ENDIF
 11579#ENDCOMMAND
 11580
 11581
 11582#COMMAND MOVEOBJ #L "TO" #GLEURC .
 11583
 11584  #IFDEF GET_!1   // if defined as a function
 11585    #IF (GET_!1>$40000000) // If move Object-access to (var|property)
 11586      MoveVar (!1(Current_object)) to !3
 11587    #ELSE
 11588      #ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE "Already defined as a function"
 11589    #ENDIF
 11590  #ELSE
 11591    #ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE "Object not yet defined"
 11592  #ENDIF
 11593
 11594#ENDCOMMAND
 11595
 11596
 11597// changes: Check that object name is not already a global/class function
 11598//          Add alternate access syntax @Name
 11599//          check that the name is not an internal function
 11600// MG: 7/2/99 No mangling here for object access method, because no parameters.
 11601// If we decide to mangle on return type (not likely) we can change this and
 11602// use MARG.
 11603
 11604#COMMAND REGISTER_OBJECT R .
 11605  #IFDEF UI.EXISTS
 11606  #ELSE
 11607    USE UI
 11608  #ENDIF
 11609
 11610  // check for following errors
 11611  // 1. name defined as internal function
 11612  // 2. name defined as overloaded function
 11613  // 3. name defined as global function
 11614  // 4. name defined as non-overloaded class function
 11615
 11616  #IF ( (!Zl & 1)=0)
 11617    #IFSAME FN$!1  __F__
 11618      #ERROR DFERR_COMP_ILLEGAL_OBJECT_DEFINTION !1 is an internal function name
 11619    #ENDIF
 11620  #ENDIF
 11621
 11622  // check if name is already used for overloaded function, if so, error
 11623  #IFDEF GET_!1_OVERLOADED
 11624    #ERROR DFERR_COMP_ILLEGAL_OBJECT_DEFINTION !1 Already defined as a overloaded function
 11625  #ELSE
 11626    // Check that object name is not already a global or class function.
 11627    #IFDEF GET_!1
 11628      #IF (GET_!1<$40000001)
 11629        #IF (GET_!1<0)
 11630          #ERROR DFERR_COMP_ILLEGAL_OBJECT_DEFINTION !1 Already defined as a global function
 11631        #ELSE
 11632          #ERROR DFERR_COMP_ILLEGAL_OBJECT_DEFINTION !1 Already defined as a function/Property
 11633        #ENDIF
 11634      #ENDIF
 11635    #ELSE
 11636      #REPLACE GET_!1 |CI!ZH
 11637      #FREG GET_!1 RETURNS INTEGER
 11638      // register additional object access methods
 11639      // #REPLACE @!1 (!1(current_object))
 11640    #ENDIF // if Get_ defined
 11641  #ENDIF  // if Get_ overloaded
 11642
 11643#ENDCOMMAND
 11644
 11645// Changes:  Check for Global error (used to check !1)
 11646//           Check for Object access name error
 11647//           Check that the name is not a global name
 11648
 11649#COMMAND REGISTER_FUNCTION R
 11650  #IFDEF UI.EXISTS
 11651  #ELSE
 11652    USE UI
 11653  #ENDIF
 11654
 11655  #IF ( (!Zl & 1)=0)
 11656    #IFSAME FN$!1  __F__
 11657      #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is an internal function name
 11658    #ENDIF
 11659  #ENDIF
 11660
 11661  #IFSAME RETURNS !2 !3 !4 !5 !6 !7 !8 !9
 11662  #ELSE
 11663    #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX MISSING KEYWORD RETURNS ON FUNCTION DECLARATION
 11664  #ENDIF
 11665
 11666  #IFSAME !2 GLOBAL
 11667    #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION GLOBAL FUNCTIONS CANNOT BE REGISTERED
 11668  #ELSE
 11669    // Check if non-mangled symbol is already defined.
 11670    // If it is, it might be an object name...error
 11671    //           also make sure new function is not an overload..error
 11672    #IFDEF GET_!1
 11673
 11674      #IF (GET_!1<0)
 11675        #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is already defined as a global function
 11676      #ENDIF
 11677
 11678      #IF (GET_!1>$40000000)
 11679        #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is already defined as an object
 11680      #ENDIF
 11681
 11682      #IFDEF MANGLE_NAMES
 11683        #IFSAME OVERLOADED !2 !3 !4 !5 !6 !7 !8 !9
 11684          #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Non-Overloaded
 11685        #ENDIF
 11686      #ENDIF
 11687      // Validate the argument list.
 11688      CHECK$METHOD$ARGUMENT$LIST  !2 !3 !4 !5 !6 !7 !8 !9
 11689      // We will get more chance of matching fixups (and creating fewer errors) if we just register the function anyway.
 11690      // The parameter list could generate the right name and if it does later fixups will resolve correctly without error.
 11691      // It's possible that the list changes the mangled name. If it does, when the function is fixed, fixup errors may
 11692      // appear. They can be fixed then.
 11693      MESSAGE$ADDRESS GET_!1            // Generate the constant for message identifier. Message$Address checks if it already exists.
 11694    #ELSE
 11695      // Verify that the argument list is syntactically correct.
 11696      CHECK$METHOD$ARGUMENT$LIST  !2 !3 !4 !5 !6 !7 !8 !9
 11697
 11698      // Create the constant identifier for the message if it's not already defined.
 11699      #IFNDEF MANGLE_NAMES
 11700        MESSAGE$ADDRESS GET_!1
 11701      #ELSE
 11702        #IFSAME OVERLOADED !2 !3 !4 !5 !6 !7 !8 !9
 11703          // we don't support Byref with overloading
 11704          #IFSAME BYREF !2 !3 !4 !5 !6 !7 !8 !9
 11705            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "BYREF not allowed in overloaded methods"
 11706          #ENDIF
 11707          #MARG GET_!1 !2 !3 !4 !5 !6 !7 !8 !9    // Genearte the mangled symbol.
 11708          MESSAGE$ADDRESS !?                      // Generate the message identifer.
 11709          // if this is the first time we've defined this, create overloaded symbol
 11710          #IFNDEF GET_!1_OVERLOADED
 11711            #REPLACE GET_!1_OVERLOADED  |CI1
 11712          #ENDIF
 11713        #ELSE
 11714          // We are defining a non-overload function. Make sure we have not already
 11715          // defined it as overloaded
 11716          #IFDEF GET_!1_OVERLOADED
 11717            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is already defined as an overloaded function
 11718          #ELSE
 11719            MESSAGE$ADDRESS GET_!1
 11720          #ENDIF
 11721        #ENDIF
 11722      #ENDIF
 11723    #ENDIF
 11724
 11725    // Register the function here.
 11726    #IFNDEF MANGLE_NAMES
 11727      #IFSAME !2 FOR
 11728        #FREG GET_!1 !4 !5 !6 !7 !8 !9
 11729      #ELSE
 11730        #FREG GET_!1 !2 !3 !4 !5 !6 !7 !8 !9
 11731      #ENDIF
 11732    #ELSE
 11733      #IFSAME OVERLOADED !2 !3 !4 !5 !6 !7 !8 !9
 11734        #IFSAME !2 FOR
 11735          #FREG !? !4 !5 !6 !7 !8 !9
 11736        #ELSE
 11737          #FREG !? !2 !3 !4 !5 !6 !7 !8 !9
 11738        #ENDIF
 11739      #ELSE
 11740        #IFSAME !2 FOR
 11741          #FREG GET_!1 !4 !5 !6 !7 !8 !9
 11742        #ELSE
 11743          #FREG GET_!1 !2 !3 !4 !5 !6 !7 !8 !9
 11744        #ENDIF
 11745      #ENDIF
 11746    #ENDIF
 11747
 11748  #ENDIF   // Not a global
 11749
 11750#ENDCOMMAND
 11751
 11752// Changes:  Check for Object access name error
 11753#COMMAND FUNCTION R
 11754
 11755  #IF ( (!Zl & 1)=0)
 11756    #IFSAME FN$!1  __F__
 11757      #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is an internal function name
 11758    #ENDIF
 11759  #ENDIF
 11760
 11761
 11762  #IFDEF MANGLE_NAMES
 11763    #IFDEF GET_!1
 11764      #IF (GET_!1>$40000000)
 11765        #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is already defined as an object
 11766      #ENDIF
 11767    #ENDIF
 11768    #IFSAME RETURNS !2 !3 !4 !5 !6 !7 !8 !9
 11769    #ELSE
 11770       #ERROR DFERR_COMP_INVALID_METHOD_SYNTAX MISSING KEYWORD RETURNS ON FUNCTION DECLARATION
 11771    #ENDIF
 11772    HANDLE$MESSAGE GET !1 !2 !3 !4 !5 !6 !7 !8 !9
 11773  #ELSE
 11774    #IFDEF GET_!1
 11775      #IF (GET_!1>$40000000)
 11776        #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 is already defined as an object
 11777      #ENDIF
 11778    #ENDIF
 11779    HANDLE$MESSAGE GET_!1 !2 !3 !4 !5 !6 !7 !8 !9
 11780  #ENDIF
 11781
 11782#ENDCOMMAND
 11783
 11784// called by Set/Get
 11785// Changes:  1. If in object and msg_consruct_object..error
 11786//           2. Cannot nest methods (already was there)
 11787//           3. Methods not allowed in class child-objects
 11788//           4. If on desktop and not Global/for..is for cDesktop
 11789//
 11790
 11791//#IFDEF MANGLE_NAMES
 11792  #COMMAND HANDLE$MESSAGE$HELP RGOBL#
 11793    #IFSAME !1 MSG
 11794      #PREG !2 !3 !4 !5 !6 !7 !8 !9
 11795    #ELSE
 11796      #FREG !2 !3 !4 !5 !6 !7 !8 !9
 11797    #ENDIF
 11798  #ENDCOMMAND
 11799//#ENDIF
 11800
 11801#COMMAND HANDLE$MESSAGE RGOBL#
 11802
 11803  // support new 8.3 syntax for desktop methods (e.g. procedure Foo DESKTOP .....)
 11804  #IFNDEF MANGLE_NAMES
 11805    #IFSAME !2 DESKTOP
 11806      #IFDEF IS$WINDOWS
 11807        Handle$message$2 !1 For cDesktop !3 !4 !5 !6 !7 !8 !9
 11808      #ELSE
 11809        Handle$message$2 !1 For Desktop !3 !4 !5 !6 !7 !8 !9
 11810      #ENDIF
 11811    #ELSE
 11812        Handle$message$2 !1 !2 !3 !4 !5 !6 !7 !8 !9
 11813    #ENDIF
 11814  #ELSE
 11815    #IFSAME !3 DESKTOP
 11816      #IFDEF IS$WINDOWS
 11817        Handle$message$2 !1 !2 For cDesktop !4 !5 !6 !7 !8 !9
 11818      #ELSE
 11819        Handle$message$2 !1 !2 For Desktop  !4 !5 !6 !7 !8 !9
 11820      #ENDIF
 11821    #ELSE
 11822        Handle$message$2 !1 !2 !3 !4 !5 !6 !7 !8 !9
 11823    #ENDIF
 11824  #ENDIF
 11825#ENDCOMMAND
 11826
 11827#COMMAND HANDLE$MESSAGE$2 RGOBL#
 11828
 11829  #IFDEF UI.EXISTS
 11830  #ELSE
 11831    USE UI
 11832  #ENDIF
 11833
 11834  // if the publish meta-attribute is set, we want to generate the RegisterInterface command before we do anything in this new method.
 11835  // we will also check as many things as possible to make sure this is a valid place for this. We expect this:
 11836  // 1. to appear in classes and not objects
 11837  // 2. cannot be global, FOR, or desktop
 11838  // 3. cannnot be override
 11839
 11840  // If the meta attribute Published is true, we handle special case for webapps.
 11841  // note I am not checking for the Mangle_names ifdef - I just assume it's true (hasn't been unset for many versions).
 11842  #IFMATTR Published true  // This is true if the Published attribute is active and its value is true
 11843    // method must be an object method and not For, global or overloaded
 11844    #IFSAME !3 GLOBAL FOR OVERLOADED // any of these are not allowed. Note that DESKTOP is already converted to For cDesktop at this point
 11845      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT "The Publish meta tag cannot be used with GLOBAL, DESKTOP, FOR, or OVERLOADED methods."
 11846    #ELSE
 11847      #IF (!b = 1)   // the only valid place for this is within a method within an object.
 11848        MESSAGE$ADDRESS !1_!2  // create id symbol for this message. We do this to avoid fowward reference error in registerInterface
 11849        #SPUSH
 11850        #PUBLISH  //  This creates the Send RegisterInterface line and puts the result in !$, based on the original source line which is expected to be something like Function Foo Integer iArg...
 11851        !$        //  This would then actually call Send RegisterInterface
 11852        #REM !$
 11853        #SPOP
 11854       #ELSE
 11855         #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT "The Publish meta tag can only be used within methods defined directly inside of objects."
 11856      #ENDIF
 11857    #ENDIF
 11858  #ENDIF
 11859
 11860
 11861
 11862  // procedure construct_object only allowed in class
 11863  #IF (!b & 1) // if in object
 11864    #IFDEF MANGLE_NAMES
 11865      #IFSAME !1 MSG
 11866        #IFSAME !2 CONSTRUCT_OBJECT
 11867          #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Construct_object .not. allowed in objects
 11868        #ENDIF
 11869      #ENDIF
 11870    #ELSE
 11871      #IFSAME !1 MSG_CONSTRUCT_OBJECT
 11872        #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Construct_object .not. allowed in objects
 11873      #ENDIF
 11874    #ENDIF
 11875  #ENDIF
 11876
 11877  // not allowed to nest methods
 11878  // Check flag to determine whether we are already in a method.
 11879  #IF (!b & 4)
 11880    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Procedures and Functions may .not. be nested.
 11881  #ELSE
 11882    // non global methods are not allowed class child-objects
 11883
 11884    #IFNDEF MANGLE_NAMES
 11885
 11886      #IFSAME !2 GLOBAL
 11887      #ELSE
 11888        #IF ((!b & 3)=3) // if in class object
 11889          #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Methods .not. allowed in class child-objects
 11890        #ENDIF
 11891      #ENDIF
 11892
 11893    #ELSE
 11894
 11895      #IFSAME !3 GLOBAL
 11896      #ELSE
 11897        #IF ((!b & 3)=3) // if in class object
 11898          #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Methods .not. allowed in class child-objects
 11899        #ENDIF
 11900      #ENDIF
 11901
 11902    #ENDIF
 11903  #ENDIF
 11904
 11905  // Give error if the stack symbol NUM_ARGUMENTS is defined.
 11906  #CHECK NUM_ARGUMENTS _T
 11907
 11908  //
 11909  #SET ZN$ !n     // static nesting level
 11910  #SET ZM$ 0      // # objects in method
 11911  #PUSH !Zg
 11912  #PUSH !Za
 11913  #SET ZA$ !a
 11914  #PUSH !Zu
 11915  #DATA
 11916  #STKSYM                      // forget all old stack symbols
 11917  #SET B$ (!b | 4)             // set flag to in_procedure
 11918
 11919  // This was changed to allow us to prohibit arguments with num_arguments inside the scope of a function.
 11920  #REPLACE NUM_ARGUMENTS |SI0  // define the arg count
 11921
 11922  #IFDEF MANGLE_NAMES
 11923    #SREP __@INSIDE_FUNCTION@__   |CI1   // lets other commands check that they are inside a function scope.
 11924  #ENDIF
 11925
 11926  #IFNDEF MANGLE_NAMES
 11927
 11928
 11929  #ELSE
 11930
 11931  //  This is the mangling code.
 11932
 11933    #IFSAME !3 GLOBAL
 11934      #DPUSH |CI0         // No message
 11935      #DPUSH |CI0         // for no class
 11936      // Check if overloaded symbol is already defined.
 11937      #IFSAME OVERLOADED !4 !5 !6 !7 !8 !9
 11938        #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION Global functions/procedures cannot be overloaded
 11939      #ELSE
 11940        #IFDEF !1_!2_OVERLOADED
 11941          #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Overloaded
 11942        #ELSE
 11943          #IFDEF !1_!2
 11944            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION Global method !1 !2 Already Defined
 11945          #ELSE
 11946            #SET ZG$ (0-!a-2)   // make it negative to distuinguish it
 11947            #REPLACE !1_!2 |CI!Zg
 11948          #ENDIF
 11949        #ENDIF
 11950      #ENDIF
 11951      CHECK$METHOD$ARGUMENT$LIST !4 !5 !6 !7 !8 !9
 11952      #IF (!0>1)          // do we have arguments?
 11953        #SET ZG$ 1        // starting argument number
 11954        DEFINE_ARGUMENTS !4 !5 !6 !7 !8 !9
 11955      #ENDIF
 11956
 11957      HANDLE$MESSAGE$HELP !1 !1_!2 !3 !4 !5 !6 !7 !8 !9
 11958
 11959    #ELSE  // not global functions
 11960
 11961      // make sure message is not already defined as a global
 11962      #IFDEF !1_!2
 11963        #IF (!1_!2<0)  // if defined as a global already, we have an error
 11964          #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !1 !2 already defined as a Global method
 11965        #ENDIF
 11966      #ENDIF
 11967
 11968      // Mangling case & Using FOR
 11969      #IFSAME !3 FOR          // are we explicit about the class?
 11970
 11971        #IFSAME OVERLOADED !5 !6 !7 !8 !9
 11972          #IFDEF !1_!2
 11973            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As non-overloaded
 11974          #ELSE
 11975            // we don't support Byref with overloading
 11976            #IFSAME BYREF !5 !6 !7 !8 !9
 11977              #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "BYREF not allowed in overloaded methods"
 11978            #ENDIF
 11979            // Mangle name of method.
 11980            #MARG !1_!2 !5 !6 !7 !8 !9
 11981            // Also lock name without parameters and sugar.
 11982            #IFNDEF !1_!2_OVERLOADED
 11983              #REPLACE !1_!2_OVERLOADED  |CI1
 11984            #ENDIF
 11985            MESSAGE$ADDRESS !?         // create id symbol for this message
 11986            #DPUSH !?
 11987          #ENDIF
 11988        #ELSE   // FOR class, but not an overloaded function.
 11989
 11990          #IFDEF !1_!2_OVERLOADED
 11991            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Overloaded
 11992          #ELSE
 11993            MESSAGE$ADDRESS  !1_!2  // create id symbol for this message
 11994            #DPUSH !1_!2
 11995          #ENDIF
 11996
 11997        #ENDIF
 11998
 11999        #IFDEF !4
 12000          #IFSAME !4 DESKTOP
 12001            #IFDEF IS$WINDOWS
 12002              #DPUSH U_cObject  // Message for the desktop class
 12003            #ELSE
 12004              #DPUSH U_DESKTOP  // Message for the desktop class
 12005            #ENDIF
 12006          #ELSE
 12007            #DPUSH !4         // Message for the named class
 12008          #ENDIF
 12009        #ELSE
 12010          #CHECK U_!4 _RSDNU   // Check the class to see if it exists.
 12011          #DPUSH U_!4         // Message for the named class
 12012        #ENDIF
 12013
 12014        CHECK$METHOD$ARGUMENT$LIST !5 !6 !7 !8 !9
 12015
 12016        #IF (!0>3)
 12017          #SET ZG$ 1                  // starting argument number
 12018          DEFINE_ARGUMENTS !5 !6 !7 !8 !9
 12019        #ENDIF
 12020
 12021        #IFSAME OVERLOADED !4 !5 !6 !7 !8 !9              // Non global
 12022          HANDLE$MESSAGE$HELP !1 !? !5 !6 !7 !8 !9
 12023        #ELSE
 12024          HANDLE$MESSAGE$HELP !1 !1_!2 !5 !6 !7 !8 !9
 12025        #ENDIF
 12026
 12027      #ELSE // Method is declared in a class or in an object
 12028        #IF (!b & 2)              // obj_flag == in_class?
 12029        #ELSE
 12030          #IF (!b & 1)            // in_object, instance method
 12031            !A [] CLONE$CLASS     // if in object, clone the class
 12032          #ENDIF
 12033        #ENDIF
 12034
 12035        #IFSAME OVERLOADED !3 !4 !5 !6 !7 !8 !9
 12036          #IFDEF !1_!2
 12037            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As non-overloaded
 12038          #ELSE
 12039            // we don't support Byref with overloading
 12040            #IFSAME BYREF !3 !4 !5 !6 !7 !8 !9
 12041              #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "BYREF not allowed in overloaded methods"
 12042            #ENDIF
 12043            #MARG !1_!2 !3 !4 !5 !6 !7 !8 !9
 12044            MESSAGE$ADDRESS !?
 12045            #IFNDEF !1_!2_OVERLOADED
 12046              #REPLACE !1_!2_OVERLOADED  |CI1
 12047            #ENDIF
 12048            #DPUSH !?               // the message
 12049          #ENDIF
 12050        #ELSE
 12051          // a non-overlaoded message
 12052          #IFDEF !1_!2_OVERLOADED
 12053            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION This Method Was Previously Defined As Overloaded
 12054          #ELSE
 12055            MESSAGE$ADDRESS  !1_!2  // create id symbol for this message
 12056            #DPUSH !1_!2
 12057          #ENDIF
 12058        #ENDIF
 12059
 12060        // push the proper destination for the message
 12061        #IF (!b & 2)             // obj_flag == in_class?
 12062          #DPUSH U_!$            // handle msg for "current class"
 12063        #ELSE
 12064          #IF (!b & 1)           // in_object, instance method
 12065            #DPUSH |CI0          // handle for objects class
 12066          #ELSE                  // Message is out on desktop and not identfied w/ FOR Xxxxx
 12067            #IFDEF IS$WINDOWS      // 8.3: if windows we are going to place this on the cDesktop object
 12068                                   // which will allow all objects to delegate to it, which is probably
 12069                                   // what people expect. Prior to 8.3, it create a "for desktop" so all classes/objects
 12070                                   // immediately understood this. This represents a change in behavior.
 12071              #REM Ambiguous methods on .DESKTOP. are .not. recommended (Obsolete technique)
 12072              // this is not a real error but we can use this to look at ambiguous desktop methods to make make sure
 12073              // that they are being used in the proper 8.3 style. This warning is controlled by the method
 12074              // Compiler_desktop_method_warnings ON|OFF (OFF is default)
 12075              #IF (!Zl & 4)
 12076                 #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION Ambiguous method on .Desktop. Should be "Desktop" or "Global" or moved.
 12077              #ENDIF
 12078              #DPUSH U_cObject     // Message for the desktop (UI_OBJECT) class. Not advised for VDF after 8.2
 12079            #ELSE
 12080              #DPUSH U_DESKTOP     // Message for the desktop (UI_OBJECT) class. Not advised for VDF after 8.2
 12081            #ENDIF
 12082          #ENDIF   // stand alone message that gets defined as U_DESKTOP
 12083        #ENDIF     // end of else of object method
 12084        CHECK$METHOD$ARGUMENT$LIST !3 !4 !5 !6 !7 !8 !9
 12085        #IF (!0>1)                // do we have arguments?
 12086          #SET ZG$ 1                  // starting argument number
 12087          DEFINE_ARGUMENTS !3 !4 !5 !6 !7 !8 !9
 12088        #ENDIF
 12089
 12090        #IFSAME OVERLOADED !3 !4 !5 !6 !7 !8 !9
 12091          HANDLE$MESSAGE$HELP !1 !? !3 !4 !5 !6 !7 !8 !9
 12092        #ELSE
 12093          HANDLE$MESSAGE$HELP !1 !1_!2 !3 !4 !5 !6 !7 !8 !9
 12094        #ENDIF
 12095
 12096      #ENDIF       // class method
 12097    #ENDIF
 12098  #ENDIF  // mangling case
 12099
 12100//  !A [] HANDLE$FOR |CI0 |VL     // handle the message
 12101  !A [] $0454 |CI0 |VL
 12102  #FREF OBJ$!Za$ENDPROC !a      // fref the end procedure line
 12103
 12104  #IFDEF MANGLE_NAMES
 12105    // MG added code here to check the parameter count.
 12106    #IFDEF !1_!2_OVERLOADED
 12107       // Check parameter count
 12108      #DATA
 12109      #DPUSH NUM_ARGUMENTS
 12110      #DPUSH |CI!Zg
 12111      #DPUSH !?
 12112
 12113      #IFSAME !1 GET
 12114        #DPUSH |CI1
 12115      #ELSE
 12116        #IFSAME !1 MSG
 12117          #DPUSH |CI2
 12118        #ELSE
 12119          #IFSAME !1 SET
 12120            #DPUSH |CI3
 12121          #ENDIF
 12122        #ENDIF
 12123      #ENDIF
 12124      !A [] $0467 |CI0 |VL
 12125      #FORBID  NUM_ARGUMENTS  300 "NUM_ARGUMENTS was used in an overloaded method"
 12126    #ENDIF
 12127  #ENDIF
 12128  #SET ZG$ 0                    // starting argument number for locals
 12129
 12130  // JJT - changed in 9.1. This used to occur when the first local was created. Since this is executed at runtime
 12131  // this created a situation where the first local might be in a block that is not executed. When moved to here
 12132  // the local init command is always executed. We still strongly discourage the declartion of variables anywhere
 12133  // accept the top of a method block. This simply fixes and unintended side-effect of our implementation.
 12134  //!A [] LOCAL$ARGUMENT |CI0  // Create the command to save the local count,
 12135  !A [] $0456 |CI0
 12136  #FREF OBJ$!Za$LNUM !a       // and tell flex to update it later.
 12137
 12138#ENDCOMMAND
 12139
 12140#COMMAND ITEM_LIST .
 12141  #PUSH !Zd
 12142  #SET ZD$ |CI-1         // -1 means in an item list.
 12143
 12144  #PUSH !Zg
 12145  #PUSH !Zj
 12146  #SET ZJ$ !a
 12147  #PUSH !Zj
 12148  #SET ZG$ 0              // Set the item counter to zero.  This is used to
 12149                         // count and assign ID's to the items.
 12150  !A [] OBJ$ILIST |CI0   // Create the command to save the item count,
 12151  #FREF OBJ$!Zj$INUM !a    // and tell flex to update it later.
 12152#ENDCOMMAND
 12153
 12154
 12155#COMMAND END_ITEM_LIST .
 12156  #POP ZJ$
 12157  #REPLACE OBJ$!Zj$INUM |CI!Zg     // Update the count in the ITEM_LIST cmd.
 12158  !A [] OBJ$ENDILIST OBJ$!Zj$INUM         // Tell runtime this is the end of list.
 12159  #POP ZJ$
 12160  #POP ZG$
 12161  #POP ZD$    // Restore "in item list" marker
 12162#ENDCOMMAND
 12163
 12164#COMMAND ENTRY_ITEM R
 12165  #IF (!Zd = -1) // if within a On_item group
 12166    ENTRY$ITEM !1 !2 !3 !4 !5 !6 !7 !8 !9
 12167  #ELSE
 12168    #IF (!0>1)
 12169      ENTRY$ITEM !1 !2 !3 !4 !5 !6 !7 !8 !9
 12170    #ELSE
 12171      #IFCLASS !1 "F"
 12172        #PUSH !h
 12173        #PUSH !g
 12174        #SET H$ %!1  // get the fieldnumber of parameter
 12175        #SET G$ !1   // get the filenumber of parameter
 12176        Send Bind_Data |CI!g |CI!h
 12177        #POP G$
 12178        #POP H$
 12179      #ELSE
 12180        ENTRY$ITEM !1 !2 !3 !4 !5 !6 !7 !8 !9
 12181      #ENDIF
 12182    #ENDIF
 12183  #ENDIF
 12184#ENDCOMMAND
 12185
 12186#COMMAND ENTRY$ITEM R
 12187  #SET ZG$ !ZG
 12188  #DATA
 12189  #IFCLASS !1 "EC"
 12190    #ENTOPT {$C0A0=!1,$C002,$C003,!2}
 12191  #ELSE
 12192    #ENTOPT {$C0A0=!1,!2}
 12193  #ENDIF
 12194  !A [] OBJ$ENTRY$ITEM |CI0 |VL
 12195#ENDCOMMAND
 12196
 12197#COMMAND REPLACE_CLASS_NAME R R
 12198   #IFDEF U_!2
 12199       #Replace U_!1 U_!2
 12200       #IFSUB '!2$SC'
 12201          #Replace !1$SC !2$SC
 12202       #ENDIF
 12203       #IFSUB '!2$SM'
 12204          #Replace !1$SM !2$SM
 12205       #ENDIF
 12206       #IFSUB '!2$EM'
 12207          #Replace !1$EM !2$EM
 12208       #ENDIF
 12209   #ENDIF
 12210#ENDCOMMAND
 12211
 12212#COMMAND ON_KEY RULGBO#SDN "SEND" RLGBO#SDN """TO""OF""PRIVATE" _DNOB """PRIVATE" .
 12213  #IFSAME !4 PRIVATE
 12214    ON_KEY !1 !2 !3 TO |CI-1 PRIVATE
 12215  #ELSE
 12216    #DATA
 12217    #DPUSH !1
 12218    #IFSAME !4 TO OF
 12219      #IFDEF !5
 12220        #DPUSH !5
 12221      #ELSE
 12222        //#IFDEF !5.OBJ
 12223        //  #DPUSH !5.OBJ
 12224        //#ELSE
 12225        //  #DPUSH |CI0
 12226        //  #FREF !5.OBJ !a,1
 12227        //#ENDIF
 12228        #IFDEF GET_!5 // if defined as a function
 12229          #IF (GET_!5>$40000000) // and an object access method..we will help out
 12230            // replace simple name with expression syntax
 12231            DPUSH$EXP (!5(current_object))
 12232          #ELSE       // if defined as a function but not an access method. This is an error
 12233            #DPUSH !5 // will generate an Error
 12234          #ENDIF
 12235        #ELSE       // If undefined
 12236          // 12.0 change. If not defined, this will get pushed as an object expression 
 12237          // allowing one to not have to use register_object if the object is defined later
 12238          // in the file.
 12239          DPUSH$EXP (!5(current_object))
 12240          //#DPUSH !5 // will generate an Error
 12241        #ENDIF
 12242      #ENDIF
 12243    #ELSE
 12244      #DPUSH |CI-1
 12245    #ENDIF
 12246    #IFSAME !6 PRIVATE
 12247      #DPUSH |CI1
 12248    #ENDIF
 12249    #IFDEF !3
 12250      !A [] OBJ$ONKEY !3 |VL
 12251    #ELSE
 12252      #IFDEF MSG_!3
 12253        !A [] OBJ$ONKEY MSG_!3 |VL
 12254      #ELSE             // else the command is defined in flex code
 12255        !A [] OBJ$ONKEY |CI0 |VL        // get flex to fix the fwd ref
 12256        #FREF MSG_!3 !a
 12257      #ENDIF
 12258    #ENDIF
 12259  #ENDIF
 12260#ENDCOMMAND
 12261
 12262#COMMAND ON_ITEM NDI """SEND""BEGIN_PULL_DOWN"
 12263  #IF (!0<2)
 12264    #IF (!0<1)
 12265      ON_ITEM '' SEND MSG_NONE
 12266    #ELSE
 12267      ON_ITEM !1 SEND MSG_NONE
 12268    #ENDIF
 12269  #ELSE
 12270    #IFSAME !1 SEND
 12271      ON_ITEM '' !1 !2 !3 !4 !5 !6 !7 !8 !9
 12272    #ELSE
 12273      #IFSAME !2 SEND
 12274        #SET ZG$ !ZG                   // Increment the item counter
 12275        #IFSAME !4 TO OF
 12276          #CHECK !6 .
 12277          #DATA
 12278          #IFDEF !3
 12279            #DPUSH !3           // Push the (variable) message
 12280          #ELSE
 12281            #IFDEF MSG_!3
 12282              #DPUSH MSG_!3     // Push the constant message
 12283            #ELSE
 12284              #DPUSH |CI0
 12285              #FREF MSG_!3 !a,0     // Forward fef the message
 12286            #ENDIF
 12287          #ENDIF
 12288          #IFDEF !5
 12289            #DPUSH !5           // Push the (expression, var) dest object
 12290          #ELSE
 12291            //#IFDEF !5.OBJ
 12292            //  #DPUSH !5.OBJ     // Push the global object
 12293            //#ELSE
 12294            //  #DPUSH |CI0
 12295            //  #FREF !5.OBJ !a,1     // Forward ref the object
 12296            //#ENDIF
 12297
 12298            #IFDEF GET_!5 // if defined as a function
 12299              #IF (GET_!5>$40000000) // and an object access method..we will help out
 12300                // this is where we can get tricky and use access methods
 12301                DPUSH$EXP (!5(current_object))
 12302              #ELSE       // if defined as a function but not an access method. This is an error
 12303                #DPUSH !5 // will generate an Error
 12304              #ENDIF
 12305            #ELSE  // If object name not defined (this is a new block for 12.0)
 12306              // 12.0 change. If not defined, this will get pushed as an object expression 
 12307              // allowing one to not have to use register_object if the object is defined later
 12308              // in the file.
 12309              DPUSH$EXP (!5(current_object))
 12310            #ENDIF
 12311          #ENDIF
 12312
 12313          !A [] OBJ$ITEM_EXEC !1 |VL
 12314
 12315        #ELSE
 12316          #IF (!0 > 3)
 12317            #CHECK !4 "TO"
 12318          #ENDIF
 12319          #IFDEF MSG_!3
 12320            !A [] OBJ$ITEM MSG_!3 !1       // Create the item passing name and value.
 12321          #ELSE
 12322            #IFDEF !3
 12323              !A [] OBJ$ITEM !3 !1         // Create the item passing name and value.
 12324            #ELSE
 12325              !A [] OBJ$ITEM |CI0 !1       // Create the item passing name and value.
 12326              #FREF MSG_!3 !a              // fix value later with procedure address
 12327            #ENDIF
 12328          #ENDIF
 12329        #ENDIF
 12330      #ELSE
 12331        #IFSAME !2 BEGIN_PULL_DOWN
 12332          #CHECK !3 _R
 12333          REGISTER_OBJECT !3
 12334          ON_ITEM !1 SEND ACTIVATE_PULL_DOWN TO (!3(CURRENT_OBJECT))
 12335          #IFSUB 'END_MENU'
 12336            CREATE_MENU !3 SUB_LOCATION !4 !5 !6 !7 !8 !9
 12337          #ELSE
 12338            #ERROR DFERR_COMP_INVALID_ARGUMENT "BEGIN_PULL_DOWN" REQUIRES MENU_SYSTEM PACKAGE
 12339          #ENDIF
 12340        #ENDIF
 12341      #ENDIF
 12342    #ENDIF
 12343  #ENDIF
 12344#ENDCOMMAND
 12345
 12346//****************************************************************************//
 12347//                                                                            //
 12348// Returns the field number of a fieldnumber passed.                          //
 12349//                                                                            //
 12350// USAGE:                                                                     //
 12351// GET_FIELDNUMBER FlexErrs.Note to MyVar                                     //
 12352//                                                                            //
 12353//****************************************************************************//
 12354
 12355#COMMAND GET_FIELDNUMBER R "TO" R .
 12356  #PUSH !g
 12357  #SET G$ %!1
 12358  Move |CI!g to !3
 12359  #POP G$
 12360#ENDCOMMAND
 12361
 12362
 12363
 12364//****************************************************************************//
 12365//                                                                            //
 12366// Returns the file number of a fieldnumber passed.                           //
 12367//                                                                            //
 12368// USAGE:                                                                     //
 12369// GET_FILENUMBER FlexErrs.Note to MyVar                                      //
 12370//                                                                            //
 12371//****************************************************************************//
 12372
 12373#COMMAND GET_FILENUMBER R "TO" R .
 12374  #PUSH !g
 12375  #SET G$ !1
 12376  Move |CI!g to !3
 12377  #POP G$
 12378#ENDCOMMAND
 12379
 12380// Private command to start event loop for web applications (added in vdf9.1)
 12381//
 12382#COMMAND START_WEBAPP .
 12383  !A [] $468
 12384#ENDCOMMAND
 12385
 12386// Used by Web-services to properly convert data-types
 12387// for XML/web services
 12388
 12389// Convert from XML to VDF:
 12390//    ConvertFromXml eType sData to sData
 12391//
 12392#COMMAND ConvertFromXML R R "TO" R
 12393    #DATA
 12394    #DPUSH !1
 12395    #DPUSH !2
 12396    #DPUSH !4
 12397    !A [] $2ED |CI0 |VL
 12398#ENDCOMMAND
 12399
 12400// Convert to XML from VDF:
 12401//    ConvertToXml eType sData to sData
 12402//
 12403#COMMAND ConvertToXML R R "TO" R
 12404    #DATA
 12405    #DPUSH !1
 12406    #DPUSH !2
 12407    #DPUSH !4
 12408    !A [] $2EE |CI0 |VL
 12409#ENDCOMMAND
 12410
 12411// Used in 11.0 to handle structs/arrays in client web-services. Reads and writes from a ValueTree to the variable.
 12412// The type of variable is determined by the variable type you use. Value tree is:
 12413//            Struct tValueTree
 12414//                String       sValue        // data value. Value only exists if there are no children
 12415//                tValueTree[] children      // child values. If a struct or array, we have children and no value
 12416//            End_Struct
 12417//
 12418
 12419#COMMAND ValueTreeSerializeParameter R "TO" R
 12420    !A [] $2ef !1 !3
 12421#ENDCOMMAND
 12422
 12423#COMMAND ValueTreeDeserializeParameter R "TO" R
 12424    !A [] $2f0 !1 !3
 12425#ENDCOMMAND
 12426
 12427
 12428
 12429// sets !q to num of dimensions. !q must be initialized before this is called
 12430#COMMAND ARRAY_DIM_COUNT_HELPER R
 12431  #IFADIM !1
 12432    #SET Q$ !Q
 12433    ARRAY_DIM_COUNT_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12434  #ENDIF
 12435#ENDCOMMAND
 12436
 12437// dpushes the size of each dimension
 12438#COMMAND ARRAY_DIM_SIZE_HELPER R
 12439  #IFADIM !1
 12440    #SPUSH
 12441    #DIMSTRIP !1
 12442    #DPUSH !$
 12443    #SPOP
 12444    ARRAY_DIM_SIZE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12445  #ENDIF
 12446#ENDCOMMAND
 12447
 12448#COMMAND ARRAY_LOCAL_VARIABLE_REPLACE_HELPER R
 12449  #IFADIM !1
 12450    ARRAY_LOCAL_VARIABLE_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12451  #ELSE
 12452    #IFSAME !$ K
 12453      #REPLACE !1 |SA!ZG!$!qV!h
 12454    #ELSE
 12455      #REPLACE !1 |SA!ZG!$!q
 12456    #ENDIF
 12457  #ENDIF
 12458#ENDCOMMAND
 12459
 12460#COMMAND ARRAY_GLOBAL_VARIABLE_REPLACE_HELPER R
 12461  #IFADIM !1
 12462    ARRAY_GLOBAL_VARIABLE_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12463  #ELSE
 12464    #IFSAME !$ K
 12465      #REPLACE !1 |VA!v!$!qV!h
 12466    #ELSE
 12467      #REPLACE !1 |VA!v!$!q
 12468    #ENDIF
 12469  #ENDIF
 12470#ENDCOMMAND
 12471
 12472#COMMAND ARRAY_ARGUMENT_REPLACE_HELPER R
 12473  #IFADIM !1 // first skip past all []s
 12474    ARRAY_ARGUMENT_REPLACE_HELPER !2 !3 !4 !5 !6  !7 !8 !9
 12475  #ELSE
 12476    // start of line is now either "BYREF VarName" or "varName"
 12477    #IFSAME !1 BYREF
 12478      #IFSAME !$ K
 12479        #REPLACE !2 |RA-!ZG!$!qV!h
 12480      #ELSE
 12481        #REPLACE !2 |RA-!ZG!$!q
 12482      #ENDIF
 12483    #ELSE
 12484      #IFSAME !$ K
 12485        #REPLACE !1 |SA-!ZG!$!qV!h
 12486      #ELSE
 12487        #REPLACE !1 |SA-!ZG!$!q
 12488      #ENDIF
 12489    #ENDIF
 12490  #ENDIF
 12491#ENDCOMMAND
 12492
 12493#COMMAND ARRAY_INIT_HELPER R
 12494  #IFADIM !1
 12495    ARRAY_INIT_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12496  #ELSE
 12497    !A [] $088 !1 |VL
 12498  #ENDIF
 12499#ENDCOMMAND
 12500
 12501#COMMAND LOCAL$ARRAY T R R
 12502  #DATA
 12503  #SET Q$ 0
 12504  ARRAY_DIM_COUNT_HELPER !2 !3 !4 !5 !6 !7 !8 !9 // sets !q to num of dims
 12505  #PUSH !q     // we need this a bit later
 12506  #DPUSH |CI!q //Push the number of dimensions
 12507
 12508  #PUSH !g
 12509  #DTYPE G$ !1
 12510  #IF (!g=19)
 12511    #PUSH !h
 12512    #STRG H$ !1
 12513    #SPUSH
 12514    #DTSYM !1  // moves datatype Letter ID into !$
 12515    ARRAY_LOCAL_VARIABLE_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12516    #SPOP
 12517    #DPUSH |CI19
 12518    #DPUSH |CI!h
 12519    #POP H$
 12520  #ELSE
 12521    #PUSH !g
 12522    #SPUSH
 12523    #DTSYM !1 // moves datatype Letter ID into !$
 12524    ARRAY_LOCAL_VARIABLE_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12525    #SPOP
 12526    #POP G$
 12527    #DPUSH |CI!g //Push the element type
 12528  #ENDIF
 12529  #POP G$
 12530
 12531  ARRAY_DIM_SIZE_HELPER !2 !3 !4 !5 !6 !7 !8 !9 //Push the size of each dimension
 12532  ARRAY_INIT_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12533
 12534  // at the moment only support multiple array variables with single dimension arrays
 12535  // e.g. "integer[] i1 i2" is allowed, "integer[][] i1 i2" is not allowed.
 12536  // this limit was created because it will be very difficult to make fmac do this and this should be a rare occurance.
 12537  #POP Q$ // number of dimensions
 12538  #IF (!q>1) // if more than one dimension
 12539    #IF (!0>(!q+2)) // num of params must be num of dimensions plus 2
 12540      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT 'Multi Dimensional array variables must be defined one per line'
 12541    #ENDIF
 12542  #ELSE
 12543    #IF (!0>3)
 12544      LOCAL$ARRAY !1 !2 !4 !5 !6 !7 !8 !9
 12545    #ENDIF
 12546  #ENDIF
 12547
 12548#ENDCOMMAND
 12549
 12550#COMMAND GLOBAL$ARRAY T R R
 12551  #DATA
 12552
 12553  #SET Q$ 0
 12554  ARRAY_DIM_COUNT_HELPER !2 !3 !4 !5 !6 !7 !8 !9 // sets !q to num of dims
 12555  #PUSH !q     // we need this a bit later
 12556  ARRAY_DIM_SIZE_HELPER !2 !3 !4 !5 !6 !7 !8 !9 //Push the size of each dimension
 12557
 12558  #PUSH !g
 12559  #DTYPE G$ !1
 12560  #IF (!g=19)
 12561    #PUSH !h
 12562    #STRG H$ !1
 12563    #DPUSH |CI!h
 12564    #DPUSH |CI19
 12565    #DPUSH |CI!q //Push the number of dimensions
 12566    #ARRV V$
 12567    #SPUSH
 12568    #DTSYM !1  // moves datatype Letter ID into !$
 12569    ARRAY_GLOBAL_VARIABLE_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12570    #SPOP
 12571    #POP H$
 12572  #ELSE
 12573    #DPUSH |CI!g //Push the element type
 12574    #DPUSH |CI!q //Push the number of dimensions
 12575    #ARRV V$
 12576    #SPUSH
 12577    #DTSYM !1  // moves datatype Letter ID into !$
 12578    ARRAY_GLOBAL_VARIABLE_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12579    #SPOP
 12580  #ENDIF
 12581  #POP G$
 12582
 12583  // at the moment only support multiple array variables with single dimension arrays
 12584  // e.g. "integer[] i1 i2" is allowed, "integer[][] i1 i2" is not allowed.
 12585  // this limit was created because it will be very difficult to make fmac do this and this should be a rare occurance.
 12586  #POP Q$ // number of dimensions
 12587  #IF (!q>1) // if more than one dimension
 12588    #IF (!0>(!q+2)) // num of params must be num of dimensions plus 2
 12589      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT 'Multi Dimensional array variables must be defined one per line'
 12590    #ENDIF
 12591  #ELSE
 12592    #IF (!0>3)
 12593      Global$Array !1 !2 !4 !5 !6 !7 !8 !9
 12594    #ENDIF
 12595  #ENDIF
 12596
 12597#ENDCOMMAND
 12598
 12599#COMMAND DEFINE_SCALAR_ARGUMENT
 12600  #PUSH !q
 12601  #DTYPE Q$ !1
 12602  #IF (!q=-1) // undefined type error
 12603      #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 12604  #ELSE
 12605    #IF (!q=19) // a struct
 12606      #PUSH !h
 12607      #STRG H$ !1
 12608      #IFSAME !2 BYREF
 12609        #REPLACE !3 |RK-!ZGV!h
 12610      #ELSE
 12611        #REPLACE !2 |SK-!ZGV!h
 12612      #ENDIF
 12613      #POP H$
 12614    #ELSE // not a struct
 12615      #SPUSH
 12616      #DTSYM !1  // moves datatype Letter ID into !$
 12617      #IFSAME !2 BYREF
 12618        #REPLACE !3 |R!$-!ZG
 12619      #ELSE
 12620        #REPLACE !2 |S!$-!ZG
 12621      #ENDIF
 12622      #SPOP
 12623    #ENDIF
 12624  #ENDIF
 12625  #POP Q$
 12626#ENDCOMMAND
 12627
 12628#COMMAND DEFINE_ARRAY_ARGUMENT T R R
 12629  #SET Q$ 0
 12630  ARRAY_DIM_COUNT_HELPER !2 !3 !4 !5 !6 !7 !8 !9 // sets !q to num of dims
 12631
 12632  #PUSH !g
 12633  #DTYPE G$ !1
 12634  #IF (!g=-1) // undefined type error
 12635      #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 12636  #ELSE
 12637    #IF (!g=19)
 12638      #PUSH !h
 12639      #STRG H$ !1
 12640      #SPUSH
 12641      #DTSYM !1  // moves datatype Letter ID into !$
 12642      ARRAY_ARGUMENT_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12643      #SPOP
 12644      #POP H$
 12645    #ELSE
 12646      #SPUSH
 12647      #DTSYM !1  // moves datatype Letter ID into !$
 12648      ARRAY_ARGUMENT_REPLACE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 12649      #SPOP
 12650    #ENDIF
 12651  #ENDIF
 12652  #POP G$
 12653#ENDCOMMAND
 12654
 12655#COMMAND DEFINE_ARGUMENTS
 12656  #IF (!0>0)
 12657    #IFSAME !1 OVERLOADED
 12658      DEFINE_ARGUMENTS !2 !3 !4 !5 !6 !7 !8 !9
 12659    #ElSE
 12660      #IFSAME !1 RETURNS
 12661      #ELSE
 12662        #IFADIM !2
 12663          DEFINE_ARRAY_ARGUMENT !1 !2 !3 !4 !5 !6 !7 !8 !9
 12664        #ELSE
 12665          DEFINE_SCALAR_ARGUMENT !1 !2 !3 !4 !5 !6 !7 !8 !9
 12666        #ENDIF
 12667        DEFINE_NEXT_ARGUMENT !2 !3 !4 !5 !6 !7 !8 !9
 12668      #ENDIF
 12669    #ENDIF
 12670  #ENDIF
 12671#ENDCOMMAND
 12672
 12673// get next argument. Skip past all []s and the BYREF symbol
 12674#COMMAND DEFINE_NEXT_ARGUMENT
 12675  #IF (!0>0)
 12676    #IFADIM !1
 12677      DEFINE_NEXT_ARGUMENT !2 !3 !4 !5 !6 !7 !8 !9
 12678    #ELSE
 12679      #IFSAME !1 BYREF
 12680        DEFINE_ARGUMENTS !3 !4 !5 !6 !7 !8 !9
 12681      #ELSE
 12682        DEFINE_ARGUMENTS !2 !3 !4 !5 !6 !7 !8 !9
 12683      #ENDIF
 12684    #ENDIF
 12685  #ENDIF
 12686#ENDCOMMAND
 12687
 12688
 12689#COMMAND SCALAR$PROPERTY R R
 12690  #IFSAME !3 PRIVATE
 12691    PROPERTY !1 !$.!2 PUBLIC !4
 12692  #ELSE
 12693    #IFSAME !3 PUBLIC
 12694
 12695      // Check property for proper placement
 12696      // 1. Must be in class or object
 12697      // 2. Cannot be in a child object defined by a class
 12698      // 3. If in class, must be in procedure (constructor)
 12699      // 4. If in object, must not be in procedure.
 12700
 12701      #IF ((!Zl & 1) = 0)
 12702        #IF (!b & 3 ) // Within class or object? It should be
 12703          #IF ((!b & 3)=3 ) // but not both....Error
 12704            #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Property cannot be defined in an object within a class
 12705          #ELSE
 12706            #IF (!b & 2)        // in-class: Must be within a method (constructor)
 12707              #IF ( (!b & 4)=0) // in-class and not in method...bad
 12708                #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Class Property must be defined within a constructor procedure
 12709              #ENDIF
 12710            #ELSE // in-object: Cannot be in method
 12711              #IF (!b & 4)  // if within object and within method...an error
 12712                #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Object Property cannot be in a method
 12713              #ENDIF
 12714            #ENDIF
 12715          #ENDIF
 12716        #ELSE
 12717          #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Property can only be defined within a class or object
 12718        #ENDIF
 12719      #ENDIF
 12720
 12721      #IF (!b & 1 ) // if within object
 12722        !A [] CLONE$CLASS     // Create a new class
 12723      #ENDIF
 12724
 12725      #IF ( (!Zl & 1)=0)
 12726        #IFSAME FN$!2  __F__
 12727          #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION !2 is an internal function name
 12728        #ENDIF
 12729      #ENDIF
 12730
 12731      // Check for GET_ name conflicts as follows:
 12732      //  1. If defined as an overloaded message - error
 12733      //  2. If defined as object access - error
 12734      //  3. If defined as global method - error
 12735
 12736      #IFDEF GET_!2_OVERLOADED
 12737        #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION This GET Method Was Previously Defined As Overloaded
 12738      #ELSE
 12739        #IFDEF GET_!2
 12740          #IF (GET_!2>$40000000)
 12741            #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION GET !2 is already defined as an object name
 12742          #ELSE
 12743            #IF (GET_!2<0)
 12744              #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION GET !2 is already defined as a global function
 12745            #ENDIF // note else condition...defined as proeprty or class function...this is ok
 12746          #ENDIF
 12747        #ELSE
 12748          MESSAGE$ADDRESS GET_!2
 12749        #ENDIF
 12750      #ENDIF
 12751
 12752      #DATA           // Start the property
 12753
 12754      #DPUSH GET_!2       // Push the get property id
 12755      #FREG GET_!2 RETURNS !1
 12756
 12757      // Make sure Set message not defined as overloaded or global
 12758      #IFDEF SET_!2_OVERLOADED
 12759        #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION This SET Method Was Previously Defined As Overloaded
 12760      #ELSE
 12761        #IFDEF SET_!2
 12762          #IF (SET_!2<0)
 12763            #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION SET !2 is already defined as a global message
 12764          #ENDIF
 12765        #ELSE
 12766           MESSAGE$ADDRESS SET_!2
 12767        #ENDIF
 12768      #ENDIF
 12769
 12770      #DPUSH SET_!2       // Push the set property id
 12771      #PREG SET_!2 !1
 12772      #DTYPE Q$ !1        // get the property type in q
 12773      #DPUSH |CI!q        // push the type
 12774      #IF (!q=19)
 12775        //It's a struct, so we must push the struct metadata as well
 12776        #PUSH !h
 12777        #STRG H$ !1
 12778        #DPUSH |CI!h
 12779        #POP H$
 12780      #ENDIF
 12781      #IF (!0 > 3)
 12782        #DPUSH !4
 12783      //#ELSE                // 10/30/1997: If no default param is passed force
 12784        //SF - This has been moved to the runtime now
 12785        //SF - We may want to change this logic and not provide a default value at all.
 12786        //The runtime can easily be changed to handle this better.
 12787        //#IFSAME !1 ROWID
 12788        //  //Do nothing, RowID should not have a default value
 12789        //  //i.e. there are no constant RowIDs, and string to RowID conversion is illegal
 12790        //#ELSE
 12791        //  #IFSAME !1 STRING DATETIME TIME TIMESPAN  // a default value. String types require
 12792        //    #DPUSH |CS''     // a string, all others are numeric. This
 12793        //  #ELSE              // fixes a problem in the runtime where
 12794        //    #DPUSH |CI0      // dates and numbers did not initialize properly
 12795        //  #ENDIF             // when no initial param was passed in the command
 12796        //#ENDIF
 12797      #ENDIF
 12798      !A [] CREATE$PROPERTY |CI0 |VL
 12799    #ELSE
 12800      // this supports syntax of "property Integer Prop 10"
 12801      PROPERTY !1 !2 PUBLIC !3
 12802    #ENDIF
 12803  #ENDIF
 12804#ENDCOMMAND
 12805
 12806#COMMAND ARRAY_PROPERTY_NAME_HELPER2 R R
 12807  // Check property for proper placement
 12808  // 1. Must be in class or object
 12809  // 2. Cannot be in a child object defined by a class
 12810  // 3. If in class, must be in procedure (constructor)
 12811  // 4. If in object, must not be in procedure.
 12812
 12813  #IF ((!Zl & 1) = 0)
 12814    #IF (!b & 3 ) // Within class or object? It should be
 12815      #IF ((!b & 3)=3 ) // but not both....Error
 12816        #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Property cannot be defined in an object within a class
 12817      #ELSE
 12818        #IF (!b & 2)        // in-class: Must be within a method (constructor)
 12819          #IF ( (!b & 4)=0) // in-class and not in method...bad
 12820            #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Class Property must be defined within a constructor procedure
 12821          #ENDIF
 12822        #ELSE // in-object: Cannot be in method
 12823          #IF (!b & 4)  // if within object and within method...an error
 12824            #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Object Property cannot be in a method
 12825          #ENDIF
 12826        #ENDIF
 12827      #ENDIF
 12828    #ELSE
 12829      #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Property can only be defined within a class or object
 12830    #ENDIF
 12831  #ENDIF
 12832
 12833  #IF (!b & 1 ) // if within object
 12834    !A [] CLONE$CLASS     // Create a new class
 12835  #ENDIF
 12836
 12837  #IF ( (!Zl & 1)=0)
 12838    #IFSAME FN$!2  __F__
 12839      #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION !2 is an internal function name
 12840    #ENDIF
 12841  #ENDIF
 12842
 12843  // Check for GET_ name conflicts as follows:
 12844  //  1. If defined as an overloaded message - error
 12845  //  2. If defined as object access - error
 12846  //  3. If defined as global method - error
 12847
 12848  #IFDEF GET_!2_OVERLOADED
 12849    #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION This GET Method Was Previously Defined As Overloaded
 12850  #ELSE
 12851    #IFDEF GET_!2
 12852      #IF (GET_!2>$40000000)
 12853        #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION GET !2 is already defined as an object name
 12854      #ELSE
 12855        #IF (GET_!2<0)
 12856          #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION GET !2 is already defined as a global function
 12857        #ENDIF // note else condition...defined as proeprty or class function...this is ok
 12858      #ENDIF
 12859    #ELSE
 12860      MESSAGE$ADDRESS GET_!2
 12861    #ENDIF
 12862  #ENDIF
 12863
 12864  #DPUSH GET_!2       // Push the get property id
 12865
 12866  #FREG GET_!2 RETURNS !1 |GB[] //Make it array type by appending [], the number of dimensions are not used here
 12867
 12868  // Make sure Set message not defined as overloaded or global
 12869  #IFDEF SET_!2_OVERLOADED
 12870    #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION This SET Method Was Previously Defined As Overloaded
 12871  #ELSE
 12872    #IFDEF SET_!2
 12873      #IF (SET_!2<0)
 12874        #ERROR DFERR_COMP_ILLEGAL_PROPERTY_DEFINTION SET !2 is already defined as a global message
 12875      #ENDIF
 12876    #ELSE
 12877       MESSAGE$ADDRESS SET_!2
 12878    #ENDIF
 12879  #ENDIF
 12880
 12881  #DPUSH SET_!2       // Push the set property id
 12882  #PREG SET_!2 !1 |GB[] //Make it array type by appending [], the number of dimensions are not used here
 12883#ENDCOMMAND
 12884
 12885
 12886#COMMAND ARRAY_PROPERTY_NAME_HELPER R R
 12887  #IFADIM !2
 12888    ARRAY_PROPERTY_NAME_HELPER !1 !3 !4 !5 !6 !7 !8 !9
 12889  #ELSE
 12890    #IFSAME !3 PRIVATE
 12891      ARRAY_PROPERTY_NAME_HELPER !1 !$.!2 PUBLIC !4 !5 !6 !7 !8 !9
 12892    #ELSE
 12893      #IFSAME !3 PUBLIC
 12894        ARRAY_PROPERTY_NAME_HELPER2 !1 !2 !3 !4 !5 !6 !7 !8 !9
 12895      #ELSE
 12896        ARRAY_PROPERTY_NAME_HELPER !1 !2 PUBLIC !3 !4 !5 !6 !7 !8 !9
 12897      #ENDIF
 12898    #ENDIF
 12899  #ENDIF
 12900#ENDCOMMAND
 12901
 12902#COMMAND ARRAY$PROPERTY R R
 12903  #DATA           // Start the property
 12904
 12905  //Push the get and set messages
 12906  ARRAY_PROPERTY_NAME_HELPER !1 !2 !3 !4 !5 !6 !7 !8 !9
 12907
 12908  #DPUSH |CI21        // Push ARGARRAY
 12909  #SET Q$ 0
 12910  ARRAY_DIM_COUNT_HELPER !2 !3 !4 !5 !6 !7 !8 !9 // sets !q to num of dims
 12911  #DPUSH |CI!q //Push the number of dimensions
 12912
 12913  #DTYPE Q$ !1        // get the property type in q
 12914  #DPUSH |CI!q        // Push the array type
 12915  #IF (!q=19)
 12916    //It's a struct, so we must push the struct metadata as well
 12917    #PUSH !h
 12918    #STRG H$ !1
 12919    #DPUSH |CI!h
 12920    #POP H$
 12921  #ENDIF
 12922  ARRAY_DIM_SIZE_HELPER !2 !3 !4 !5 !6 !7 !8 !9 //Push the size of each dimension
 12923  !A [] CREATE$PROPERTY |CI0 |VL
 12924#ENDCOMMAND
 12925
 12926#COMMAND PROPERTY R R
 12927  #PUSH !q
 12928  #DTYPE Q$ !1        // get the property type in q
 12929  #IF (!q=-1) // undefined type error
 12930     #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 12931  #ELSE
 12932    #IFADIM !2
 12933      ARRAY$PROPERTY !1 !2 !3 !4 !5 !6 !7 !8 !9
 12934    #ELSE
 12935      SCALAR$PROPERTY  !1 !2 !3 !4 !5 !6 !7 !8 !9
 12936    #ENDIF
 12937  #ENDIF
 12938  #POP Q$
 12939#ENDCOMMAND
 12940
 12941// note that this command also creates a symbol _struct_XYZ where XYZ is the struct name. This can
 12942// be used with #ifdef to see if a struct is defined
 12943#COMMAND STRUCT R
 12944  #IFDEF __@INSIDE_STRUCT@__
 12945    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT "STRUCT command within a STRUCT. Structs cannot be Nested"
 12946  #ELSE
 12947    #STRU !1
 12948    #SREP __@INSIDE_STRUCT@__   |CI1   // lets other commands check that they are inside a struct scope.
 12949  #ENDIF
 12950#ENDCOMMAND
 12951
 12952#COMMAND END_STRUCT
 12953  #IFNDEF __@INSIDE_STRUCT@__
 12954    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT "END_STRUCT command without STRUCT"
 12955  #ELSE
 12956    #STRE
 12957    #UNDEF __@INSIDE_STRUCT@__ // Leaving struct declaration
 12958  #ENDIF
 12959#ENDCOMMAND
 12960
 12961#COMMAND STRUCT_SCALAR_MEMBER R R
 12962  #PUSH !q
 12963  #DTYPE Q$ !1        // get the property type in q
 12964  #IF (!q =-1)
 12965    #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 12966  #ELSE
 12967    #IF (!q=19)
 12968      #PUSH !h
 12969      #STRG H$ !1
 12970      #STRM STRUCT |CI!h !2
 12971      #POP H$
 12972    #ELSE
 12973      #STRM SCALAR |CI!q !2
 12974    #ENDIF
 12975  #ENDIF
 12976  #POP Q$
 12977#ENDCOMMAND
 12978
 12979#COMMAND STRUCT_ARRAY_TYPE_HELPER R
 12980  #PUSH !q
 12981  #DTYPE Q$ !1        // get the property type in q
 12982  #IF (!q =-1)
 12983    #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 12984  #ELSE
 12985    #IF (!q=19)
 12986      #PUSH !h
 12987      #STRG H$ !1
 12988      #DPUSH |CI!h
 12989      #DPUSH |CI19
 12990      #POP H$
 12991    #ELSE
 12992      #DPUSH |CI!q
 12993    #ENDIF
 12994  #ENDIF
 12995  #POP Q$
 12996#ENDCOMMAND
 12997
 12998#COMMAND STRUCT_ARRAY_MEMBER_HELPER R
 12999  #IFADIM !1
 13000    STRUCT_ARRAY_MEMBER_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 13001  #ELSE
 13002    #STRM ARRAY !1
 13003  #ENDIF
 13004#ENDCOMMAND
 13005
 13006#COMMAND STRUCT_ARRAY_MEMBER T R R
 13007  #DATA
 13008  ARRAY_DIM_SIZE_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 13009  STRUCT_ARRAY_TYPE_HELPER !1
 13010  #SET Q$ 0
 13011  ARRAY_DIM_COUNT_HELPER !2 !3 !4 !5 !6 !7 !8 !9 // sets !q to num of dims
 13012  #DPUSH |CI!q //Push the number of dimensions
 13013  STRUCT_ARRAY_MEMBER_HELPER !2 !3 !4 !5 !6 !7 !8 !9
 13014#ENDCOMMAND
 13015
 13016
 13017#COMMAND Local$Scalar R R
 13018  #CHECK !2 _RT
 13019  #PUSH !q
 13020  #DTYPE Q$ !1        // get the property type in q
 13021  #IF (!q=19)
 13022    //It's a struct
 13023    #PUSH !h
 13024    #STRG H$ !1
 13025    #REPLACE !2 |SK!ZGV!h
 13026    #POP H$
 13027  #ELSE
 13028    #SPUSH
 13029    #DTSYM !1 // moves datatype Letter ID into !$
 13030    #REPLACE !2 |S!$!ZG
 13031    #SPOP
 13032  #ENDIF
 13033  #POP Q$
 13034
 13035  #IF (!0>2)
 13036    Local$Scalar !1 !3 !4 !5 !6 !7 !8 !9
 13037  #ENDIF
 13038#ENDCOMMAND
 13039
 13040#COMMAND LOCAL R R // T T
 13041  #IFDEF __@INSIDE_FUNCTION@__
 13042    #PUSH !q
 13043    #DTYPE Q$ !1
 13044    #IF (!q=-1)
 13045      #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 13046    #ELSE
 13047      #IFADIM !2
 13048        Local$Array !1 !2 !3 !4 !5 !6 !7 !8 !9
 13049      #ELSE
 13050        Local$Scalar  !1 !2 !3 !4 !5 !6 !7 !8 !9
 13051      #ENDIF
 13052    #ENDIF
 13053    #POP Q$
 13054  #ELSE
 13055    #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT LOCAL Variables can only be defined within methods
 13056  #ENDIF
 13057#ENDCOMMAND
 13058
 13059
 13060//#COMMAND GLOBAL$Scalar R R
 13061
 13062// #CHECK !2 _RT
 13063
 13064// #IFSAME !1 STRING
 13065//   // strings are treated as special because they have a set of values.
 13066//   #IF (!0>2)
 13067//     #IFDEF !3
 13068//       #CHECK !3 _VSWDF
 13069//       #STR V$ !3
 13070//       #REPLACE !2 |VS!v
 13071//       #IF (!0>3)
 13072//         Global$Scalar !1 !4 !5 !6 !7 !8 !9
 13073//       #ENDIF
 13074//     #ELSE
 13075//       #STR V$ 80
 13076//       #REPLACE !2 |VS!v
 13077//       Global$Scalar !1 !3 !4 !5 !6 !7 !8 !9
 13078//     #ENDIF
 13079//   #ELSE
 13080//     #STR V$ 80
 13081//     #REPLACE !2 |VS!v
 13082//   #ENDIF
 13083// #ELSE
 13084//   #PUSH !q
 13085//   #DTYPE Q$ !1        // get the property type in q
 13086//   #IF (!q=19)
 13087//     //It's a struct
 13088//     #PUSH !h
 13089//     #STRG H$ !1
 13090//     #STRV V$ !h
 13091//     #REPLACE !2 |VK!vV!h
 13092//     #POP H$
 13093//   #ELSE
 13094//     #SPUSH
 13095////     #SET $$ TYPE$SYMBOL$!1
 13096////     #REM arg is !$
 13097////     Scalar$Variable$Help !2 TYPE$SYMBOL$G$!1 // V
 13098////     Scalar$Variable$Help !2 !$ V
 13099//     #DTSYM !1
 13100//     #REPLACE !2 |V!$!v // ZG
 13101//     #REM !2 ------------------------------------
 13102//     #SPOP
 13103
 13104//   #ENDIF
 13105//   #POP Q$
 13106
 13107//   #IF (!0>2)
 13108//     GLOBAL$Scalar !1 !3 !4 !5 !6 !7 !8 !9
 13109//   #ENDIF
 13110//#ENDCOMMAND
 13111
 13112
 13113#COMMAND GLOBAL_VARIABLE R R
 13114  #PUSH !q
 13115  #DTYPE Q$ !1
 13116  #IF (!q=-1)
 13117    #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 13118  #ELSE
 13119    #IFADIM !2       // if a global array, treat as such
 13120      Global$Array !1 !2 !3 !4 !5 !6 !7 !8 !9
 13121    #ELSE
 13122      Global$Scalar !1 !2 !3 !4 !5 !6 !7 !8 !9
 13123    #ENDIF // if aDim
 13124  #ENDIF // if (!q=-1)
 13125  #POP Q$
 13126#ENDCOMMAND
 13127
 13128#COMMAND  Global$Scalar
 13129  #IF (!0>0)
 13130    #CHECK !2 _RT
 13131
 13132    #IFSAME !1 STRING
 13133      // strings are treated as special because they have a set of values.
 13134      #IF (!0>2)
 13135        #IFDEF !3
 13136          #CHECK !3 _VSWDF
 13137          #STR V$ !3
 13138          #REPLACE !2 |VS!v
 13139          #IF (!0>3)
 13140             Global$Scalar !1 !4 !5 !6 !7 !8 !9
 13141          #ENDIF
 13142        #ELSE
 13143          #STR V$ 80
 13144          #REPLACE !2 |VS!v
 13145           Global$Scalar !1 !3 !4 !5 !6 !7 !8 !9
 13146        #ENDIF
 13147      #ELSE
 13148        #STR V$ 80
 13149        #REPLACE !2 |VS!v
 13150      #ENDIF
 13151    #ELSE
 13152      #IFSAME !1 INTEGER
 13153        #REPLACE !2 |VI!D
 13154      #ELSE
 13155        #IFSAME !1 DATE
 13156          #NUM V$
 13157          #REPLACE !2 |VD!v
 13158        #ELSE
 13159          #IFSAME !1 NUMBER
 13160            #NUM V$
 13161            #REPLACE !2 |VN!v
 13162          #ELSE
 13163            #IFSAME !1 REAL
 13164              #REAL V$
 13165              #REPLACE !2 |VR!v
 13166            #ELSE
 13167              #IFSAME !1 ADDRESS
 13168                #ADDRESS V$
 13169                #REPLACE !2 |VX!v
 13170              #ELSE
 13171                #IFSAME !1 BIGINT
 13172                  #BIGINT V$
 13173                  #REPLACE !2 |VH!v
 13174                #ELSE
 13175                  #IFSAME !1 TIME
 13176                    #TIME V$
 13177                    #REPLACE !2 |VT!v
 13178                  #ELSE
 13179                    #IFSAME !1 DATETIME
 13180                      #STAM V$
 13181                      #REPLACE !2 |VM!v
 13182                    #ELSE
 13183                      #IFSAME !1 FLOAT
 13184                        #FLOAT V$
 13185                        #REPLACE !2 |VF!v
 13186                      #ELSE
 13187                        #IFSAME !1 CHAR
 13188                          #CHAR V$
 13189                          #REPLACE !2 |VY!v
 13190                        #ELSE
 13191                          #IFSAME !1 UCHAR
 13192                            #UCHAR V$
 13193                            #REPLACE !2 |VC!v
 13194                          #ELSE
 13195                            #IFSAME !1 SHORT
 13196                              #SHORT V$
 13197                              #REPLACE !2 |VW!v
 13198                            #ELSE
 13199                              #IFSAME !1 USHORT
 13200                                #USHORT V$
 13201                                #REPLACE !2 |VU!v
 13202                              #ELSE
 13203                                #IFSAME !1 UINTEGER
 13204                                  #ULONG V$
 13205                                  #REPLACE !2 |VV!v
 13206                                #ELSE
 13207                                  #IFSAME !1 BOOLEAN
 13208                                    #BIT V$
 13209                                    #REPLACE !2 |VZ!v
 13210                                  #ELSE
 13211                                    #IFSAME !1 UBIGINT
 13212                                      #BIGU V$
 13213                                      #REPLACE !2 |VG!v
 13214                                    #ELSE
 13215                                      #IFSAME !1 CURRENCY
 13216                                        #CURR V$
 13217                                        #REPLACE !2 |VO!v
 13218                                      #ELSE
 13219                                        #IFSAME !1 TIMESPAN
 13220                                          #SPAN V$
 13221                                          #REPLACE !2 |VP!v
 13222                                        #ELSE
 13223                                          #IFSAME !1 DECIMAL
 13224                                            #BIGN V$
 13225                                            #REPLACE !2 |VQ!v
 13226                                          #ELSE
 13227                                            #IFSAME !1 VARIANT
 13228                                              #VRNT V$
 13229                                              #REPLACE !2 |VJ!v
 13230                                            #ELSE
 13231                                              #IFSAME !1 ROWID
 13232                                                #ROWI V$
 13233                                                #REPLACE !2 |V@!v
 13234                                              #ELSE
 13235                                                #PUSH !h
 13236                                                #STRG H$ !1
 13237                                                #IF !h
 13238                                                  #STRV V$ !h
 13239                                                  #REPLACE !2 |VK!vV!h
 13240                                                #ELSE
 13241                                                  #ERROR DFERR_COMP_INVALID_DATATYPE (!1)
 13242                                                #ENDIF
 13243                                                #POP H$
 13244                                              #ENDIF // RowID
 13245                                            #ENDIF // Variant
 13246                                          #ENDIF // Decimal
 13247                                        #ENDIF // TimeSpan
 13248                                      #ENDIF // Currenct
 13249                                    #ENDIF // UBigInt
 13250                                  #ENDIF // Boolean
 13251                                #ENDIF // UInteger
 13252                              #ENDIF // UShort
 13253                            #ENDIF // Short
 13254                          #ENDIF // UChar
 13255                        #ENDIF // Char
 13256                      #ENDIF // Float
 13257                    #ENDIF // TimeDate
 13258                  #ENDIF // Time
 13259                #ENDIF // BigInt
 13260              #ENDIF // address
 13261            #ENDIF  // real
 13262          #ENDIF // number
 13263        #ENDIF // date
 13264      #ENDIF  // integer
 13265      #IF (!0>2)
 13266         Global$Scalar !1 !3 !4 !5 !6 !7 !8 !9
 13267      #ENDIF
 13268    #ENDIF     // end of string
 13269  #ENDIF      // if there are parameters
 13270#ENDCOMMAND
 13271
 13272// External function command declairs the external entry point to
 13273// The DF system.  The compiler creates a reference to the function
 13274// complete with return type and parameter information.  The macro
 13275// also generates code that retains the name of the function and the
 13276// name of the library in a runtime array.  This array is used when
 13277// the DLL is "loaded".
 13278
 13279#COMMAND SET_DEFAULT_CALLTYPE _R .
 13280  #IF (!1=16)
 13281    #SET ZK$ 1
 13282  #ELSE
 13283    #SET ZK$ 0
 13284  #ENDIF
 13285#ENDCOMMAND
 13286
 13287
 13288//External_Function FunctionName "FunctionName" DLLName {Parameters ...} Returns DataType
 13289#COMMAND EXTERNAL_FUNCTION
 13290    #IF !Zk=0
 13291      EXTERNAL$FUNCTION $54C LOAD_ON_USE GET_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13292    #ELSE
 13293      EXTERNAL$FUNCTION $54D LOAD_ON_USE GET_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13294    #ENDIF
 13295#ENDCOMMAND
 13296
 13297#COMMAND EXTERNAL_PROCEDURE
 13298    #IF !Zk=0
 13299      EXTERNAL$FUNCTION $54C LOAD_ON_USE MSG_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13300    #ELSE
 13301      EXTERNAL$FUNCTION $54D LOAD_ON_USE MSG_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13302    #ENDIF
 13303#ENDCOMMAND
 13304
 13305#COMMAND EXTERNAL_FUNCTION16
 13306    EXTERNAL$FUNCTION $54D LOAD_ON_USE GET_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13307#ENDCOMMAND
 13308
 13309#COMMAND EXTERNAL_PROCEDURE16
 13310    EXTERNAL$FUNCTION $54D LOAD_ON_USE MSG_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13311#ENDCOMMAND
 13312
 13313#COMMAND EXTERNAL_FUNCTION32
 13314    EXTERNAL$FUNCTION $54C LOAD_ON_USE GET_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13315#ENDCOMMAND
 13316
 13317#COMMAND EXTERNAL_PROCEDURE32
 13318    EXTERNAL$FUNCTION $54C LOAD_ON_USE MSG_ !1 !2 !3 !4 !5 !6 !7 !8 !9
 13319#ENDCOMMAND
 13320
 13321//External$Function Command Flag GET_|MSG_ FunctionName {"FunctionName"} DLLName {Parameters ...} Returns DataType
 13322#COMMAND EXTERNAL$FUNCTION _R _R "GET_""MSG_" TR RIDN
 13323  #IFTYPE !5 S
 13324
 13325    // check that the function name is not one of our reserved internal functions
 13326    #IFSAME !3 GET_
 13327      #IFSAME FN$!4  __F__
 13328        #ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is an internal function name
 13329      #ENDIF
 13330    #ENDIF
 13331
 13332    #IFDEF !3!4 // if defined as object, function, property, external, an error
 13333      // We have an error. This just generates more accurate information
 13334      #IFSAME !3 GET_  // function errors can  be name already used as Object, global function, or reg function
 13335        #IF (GET_!4>$40000000)
 13336          #ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as an object
 13337        #ELSE
 13338          #IF (GET_!4<0)
 13339            #ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as a global function
 13340          #ELSE
 13341            #ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION !4 is already defined as a function or external_function
 13342          #ENDIF
 13343        #ENDIF
 13344      #ELSE  // if procecure it can be global or regular
 13345        #IF (MSG_!4<0)
 13346          #ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as a global procedure
 13347        #ELSE
 13348          #ERROR DFERR_COMP_ILLEGAL_EXTERNAL_FUNCTION_DEFINTION !4 is already defined as a procedure or external_procedure
 13349        #ENDIF
 13350      #ENDIF
 13351    #ELSE
 13352      MESSAGE$ADDRESS !3!4 // create any symbol (for global)
 13353      CHECK$METHOD$ARGUMENT$LIST !7 !8 !9
 13354      #DATA
 13355      #FREG !3!4 GLOBAL !7 !8 !9
 13356      #DPUSH !3!4      // Message ID
 13357      #DPUSH !2        // Load Type
 13358      #DPUSH |CS"!6"   // DLL Name
 13359      #DPUSH !5     // Function Name
 13360      GET$RETURN$TYPE !7 !8 !9  // Push Return Type
 13361      !A [] !1 |CI0 |VL
 13362    #ENDIF
 13363  #ELSE
 13364    EXTERNAL$FUNCTION !1 !2 !3 !4 |CS"!4" !5 !6 !7 !8 !9
 13365  #ENDIF
 13366#ENDCOMMAND
 13367
 13368#COMMAND GET$RETURN$TYPE
 13369    #IF !0=1
 13370        #IFSAME !1 INTEGER
 13371            #DPUSH |CI3
 13372        #ELSE
 13373            #IFSAME !1 UINTEGER
 13374                #DPUSH |CI15
 13375            #ELSE
 13376                #IFSAME !1 STRING
 13377                    #DPUSH |CI0
 13378                #ELSE
 13379                    #IFSAME !1 REAL
 13380                        #DPUSH |CI5
 13381                    #ELSE
 13382                        #IFSAME !1 FLOAT
 13383                            #DPUSH |CI10
 13384                        #ELSE
 13385                            #IFSAME !1 ADDRESS
 13386                                #DPUSH |CI7
 13387                            #ELSE
 13388                                #IFSAME !1 SHORT
 13389                                    #DPUSH |CI13
 13390                                #ELSE
 13391                                    #IFSAME !1 USHORT
 13392                                        #DPUSH |CI14
 13393                                    #ELSE
 13394                                        #IFSAME !1 CHAR
 13395                                            #DPUSH |CI11
 13396                                        #ELSE
 13397                                            #IFSAME !1 UCHAR
 13398                                                #DPUSH |CI12
 13399                                            #ELSE
 13400                                                #IFSAME !1 BOOLEAN
 13401                                                    #DPUSH |CI3 // Push an int for boolean return type
 13402                                                #ELSE
 13403                                                    #DPUSH |CI3 // Push an int return value anyway
 13404                                                    #ERROR DFERR_COMP_ILLEGAL_RETURN_TYPE Unknown return type for external function
 13405                                                #ENDIF
 13406                                            #ENDIF
 13407                                        #ENDIF
 13408                                    #ENDIF
 13409                                #ENDIF
 13410                            #ENDIF
 13411                        #ENDIF
 13412                    #ENDIF
 13413                #ENDIF
 13414            #ENDIF
 13415        #ENDIF
 13416    #ELSE
 13417        GET$RETURN$TYPE !2 !3 !4 !5 !6 !7 !8 !9
 13418    #ENDIF
 13419#ENDCOMMAND
 13420
 13421// Commands used for active-x stuff. Moved from flexcom20_base.pkg. The Embed_activeX_resource stuff results in very
 13422// strange long errors if this command i snot always available.
 13423#COMMAND Include_ActiveX_Resource R R
 13424    #BSTR V$ file storage !1 !2
 13425    Set psResourceData to |VS!v
 13426#ENDCOMMAND
 13427
 13428#COMMAND EMBED_ACTIVEX_RESOURCE
 13429    #BSTR V$ READ BASE64RESOURCE
 13430#ENDCOMMAND
 13431 
 13432#COMMAND END_EMBED_ACTIVEX_RESOURCE
 13433    Set psResourceData to |VS!v
 13434#ENDCOMMAND
 13435
 13436// for internal use only for generating the errordisplay stack dump dialog
 13437// ErrorDisplay iErrorLine sMessage sCaption sOkText sCopyText
 13438#COMMAND ErrorDisplay R R R R R
 13439    #DATA
 13440    #DPUSH !1
 13441    #DPUSH !2
 13442    #DPUSH !3
 13443    #DPUSH !4
 13444    #DPUSH !5
 13445    !A[] $57 |VL
 13446#ENDCOMMAND    
 13447
 13448
 13449// Low level command that can be used within error handlers (e.g. error_report) to get a string of the current call stack.
 13450#COMMAND CALLSTACKDUMP R
 13451    !A [] $058 !1
 13452#ENDCOMMAND
 13453
 13454// This forces the entire application to use the old MSXML3 parser. 
 13455// This must be used before you create any XML object. Only provided
 13456// for backwards compatibility. Added 15.1 
 13457#COMMAND USE_LEGACY_XML_LIB
 13458    !A [] $057c
 13459#ENDCOMMAND
 13460
 13461