----------------------------------------------------------------------------
README           About this report.

 Report Name:  CL513                                  Report Date: 03/09/91
 Author: Compiled by Jo W. French dba Practical Computing of La Canada
                     290 Starlight Crest Drive
                     La Canada, CA 91011
                     (818) 790-3699
                     CompuServe ID:  74730,1751

 Notes: Supercedes CL512. See Credits. ~ indicates change from last issue.

 This report pertains to Clipper(r) 5.0. Each item herein contains the
 applicable version number. It has been compiled from messages posted
 on CompuServe forums from 09/15/90 through 03/08/91. The author has
 verified most, but not all, of the stated anomalies. The severity of
 each item is best left to the reader's judgement; however, those items
 which will 'crash' the system are so noted.

 Verification Conditions.

   a) COMPILER: Clipper 5.0 version 1.03 dtd 09/15/90.
   b) LINKER:  RTLINK version 3.11 as supplied by lanquage vendor.
      No Incremental Linking was used.
   c) SYSTEM: IBM PS/2 Model 80 with 4Mb RAM, 222 Mb Fixed Disk.
   d) DOS Version: IBM DOS version 3.30.
   e) CONFIG.SYS:
        DEVICE=c:\dos\vdisk.sys 1536 512 128 /E
        DEVICE=c:\qemm\qemm.sys RAM
        SHELL=c:\command.com /E:512 /P
        FILES=51
        BUFFERS=8
   f) ENVIRONMENT
        COMSPEC=C:\COMMAND.COM
        PROMPT=$p$g
        PATH=C:\dos;C:\bat;C:\;C:\me;C:\ws5;F:\clipper5\bin;D:\trh;
             C:\qemm;F:\ng;
        LIB=F:\clipper5\lib;
        INCLUDE=F:\clipper5\include;
        OBJ=F:\clipper5\obj;
        PLL=F:\clipper5\pll;
        CLIPPER=F21;
   g) EXTENDED MEMORY: 1536Kb (DOS VDISK)
   h) EXPANDED MEMORY: 1536Kb (QEMM vs. 5.0)
   i) TSR's: All TSR's are loaded above 9FFF using QEMM's LOADHI.
----------------------------------------------------------------------------
Credits          That's Thanks Folks!

  My Thanks to the Sysops and Members of CompuServe for their
  countless hours of cussing, working and losing sleep to present
  solutions to the anomalies presented herein. Keep up the Good Work!

        This is NOT an official Nantucket(r) publication.

  Please report errors and ommissions to: Jo W. French  74730,1751

  Note: See Read Me
----------------------------------------------------------------------------
ACOPY()           Fails to copy under certain conditions.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  ACOPY() fails to copy when the 4th parameter, <nCount>, is NIL in a
  parameter list; e.g., ACOPY(<aSource>, <aTarget>, , , <nTargetPosition>).

  Cause

  Unknown. <nCount> is apparently defaulting to 0 in this incidence.

  Work Around(s)

  Place a valid number in this parameter position; e.g.,
  ACOPY(<aSource>, <aTarget>, , LEN(<aSource>), <nTargetPosition>).

  Notes

  ACOPY(<aSource>, <aTarget>) works satisfactorily for a complete copy.

----------------------------------------------------------------------------
AEVAL()           Undocumented return reference.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  AEVAL() documentation does not mention the presence of a second return
  reference; i.e., the element number.

  Cause

  Documentation omission.

  Work Around(s)

  Annotate your documentation.

  Notes

  This permits things like the following:

  AEVAL(array, { | value, element | array[element] = value * 2 } )

  which replaces each element with 2 times the original value.

  seealso "DBEVAL()"

----------------------------------------------------------------------------
ALLTRIM()         Returns runtime error if embedded in a macro.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When ALLTRIM(cVar) is included in a macro statement, a runtime
  error occurs when the macro is expanded.

  Cause

  ALLTRIM(cVar) is a psuedo-function, created by directive in STD.CH; i.e.,

        #translate Alltrim(<c>)     =>   Ltrim(Trim( <c> ))

  Work Around(s)

  1) Create a real function, ALLTRIM(cVar), in your .PRG; e.g.,
            FUNCTION ALLTRIM
            PARAMETERS cVar
            RETURN  LTRIM(TRIM(cVar))

  2) Create the above function and compile using the /N option.
     Include the resultant .OBJ file when linking.
     Note: You may delete the #translate line from MYNAME.CH.

  3) Create the above function and compile using the /N option.
     Add the resultant .OBJ file to a .LIB file; e.g., EXTEND.LIB.
     Note: You may delete the #translate line from MYNAME.CH.

  4) Replace all ALLTRIM(cVar) references in your .PRG with
     LTRIM(TRIM(cVar)).

  Note

  See Support Bulletin 4 in the NANFORUM Library.

  seealso "RIGHT()" "STD.CH"

----------------------------------------------------------------------------
APPEND            'Sticks' at EOF() ??.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  The following is extracted from a message posted by ron 70671, 156:

  When appending records to a file and successfully writing to and unlocking
  that record, a SKIP -1, or lookup with the SEEK command, results in the
  record pointer going to EOF(). GO TOP and GO BOTTOM do not work and
  neither does SKIP -1.

  Cause

  This problem has been traced to the use of SET FILTER. The user was
  setting a filter to a memvar which evaluated to a null; e.g.,
  cVar := ""
  SET FILTER TO (cVar)

  In Clipper 5.0, this effectively eliminated all records except
  LastRec() + 1.

  Work Around(s)

  Not applicable.

  Notes
  The equivalent in S'87 effectively removes the filter.

----------------------------------------------------------------------------
ARRAYS/General    Miscellaneous declaration anomalies.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statements

  1) If an array is declared using the form:

        LOCAL aArray := {}

     and AADD() or ASIZE() are used to size the array, the array is not
     compatible with externals such as C and ASM.

  2) Two users, using Private arrays, have reported that the arrays appear,
     to their applications, to lose their initialized values - although the
     debugger will display the values.

  3) Sizing arrays, using fixed dimensions, may cause an internal
     error (333). Examples:

         Local ar1[100,8], ar2[100,8], ar3[100,8]
         ar1 := Array(100,8) ; ar2 := Array(100,8) ; ar3 := Array(100,8)

  Cause

  1) - 3) Unknown.

  Work Around(s)

  1) If the array is declared and sized using the form:

         LOCAL aArray[20]

     it can be used with C and ASM.

  2) One user reports that creating a function, passing it an element
     number and returning the_array[Element_number] solved his problem.

  3) Declare array variables and use Aadd / Asize. Example:
          Local ar1, ar2, ar3, nX
          For nX := 1 To 100
            Aadd(ar1, {}) ; Asize(ar1[nX], 8)
            Aadd(ar2, {}) ; Asize(ar2[nX], 8)
            Aadd(ar3, {}) ; Asize(ar3[nX], 8)
          Next

----------------------------------------------------------------------------
ASORT()           Array sort with NIL elements out of order.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When ASORT() is used on an array containing NIL elements, the last
  non-NIL data will appear in the last element; e.g., AA, BB, NIL,
  NIL, CC.

  Cause

  Unknown.

  Work Around(s)

  After sorting an array which contains NIL elements, perform the
  following operation:

      FOR i = LEN(aArray) TO 1 STEP -1
        IF aArray[i] = NIL
          ADEL(aArray,i)
        ENDIF
      NEXT

  which will place all NIL elements at the end of the array; e.g.,
  AA, BB, CC, NIL, NIL.

----------------------------------------------------------------------------
BEGIN_SEQUENCE    Documentation error re' Return useage.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  A user encountered an Error 10 after RETURNing from within a BEGIN
  SEQUENCE structure, after 16 such returns.

  Cause

  Documentation error. Illegal useage.

  Work Around(s)

  Do not RETURN, EXIT or LOOP from within a BEGIN SEQUENCE structure.
  Annotate your documentation.

----------------------------------------------------------------------------
BOF()             Set to .F. on each database access.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  1) BOF() is reverts to .F. each time the database is accessed; e.g.,
     IF <dbf_condition> .and. BOF() will always return .F. where <dbf_
     condition> might be something like IF field_data == "something".

  2) BOF() will return .T. under the following example:
       USE test
       GO LASTREC() + 1
       ? BOF()   // => .T.

  Cause

  Unknown.

  Work Around(s)

  1) Assure that BOF() is evaluated before evaluating other database items.
     In the example above, change it to read IF BOF() .and. <dbf_condition>.

----------------------------------------------------------------------------
BASE50.PLL        Pre-linking with this file may 'hang' the system.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  A user, without EMS, reported that his system 'hung' when indexing a
  7674 record file containing a 6 character field. He was pre-linking
  BASE50.PLL

  Cause

  Unknown.

  Work Around(s)

  In the reported incident, the problem was cured by NO pre-linking
  or pre-linking with Roger Donnay's, FULLBASE.PLL. See FAST50.ZIP
  in NANFORUM's LIB 17.

  seealso "INDICES" "MEMORY/VMM"

----------------------------------------------------------------------------
CALL()*           Parameters are passed in reverse order.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When CALL proc WITH a, b, c is executed the receiving procedure will
  receive the parameters as c, b, a.

  Cause

  Unknown.

  Work Around(s)

  Reverse order of parameter list or use extend system.

  seealso "EXTEND System"

----------------------------------------------------------------------------
CHR(26)           Attempting to print Chr(26) causes error.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When Chr(26) is included within a string to be printed, the application
  will fail with a TERM/0 Print Error; e.g.,

       Set Device To Print
       @ 1, 0 Say "This is a test " + Chr(26) + " that fails."
       Set Device To Screen

  Cause

  Unknown.

  Work Around(s)

  None.

  Note

  Whereas Summer 87 will not print this character, it does not cause the
  application to fail.

----------------------------------------------------------------------------
CLD               Debugger anomalies.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

    1. Linking CLD.LIB, as a LIB, does not work.
    2. RESTART command does not work, gives SYNTAX ERROR.
    3. PASS POINTS does not work as described in documentation.
    4. LIST only lists Break Points not Watch Points and Trace Points.
    5. F6 DBF file view: Moving in alist of tables when one or more is
       empty or EOF() causes the debugger to bomb.
    6. Only one command line parameter is recognized; i.e., when
       CLD testprog par1 par2 is executed, par2 is NIL.
    7. Other. See CLDBUG.ZIP in the NANFORUM LIB for 4 other anomalies;
       i.e., date display, ambiquous variables, erroneous commands and
       accessing the error class exported variable e.args.

  Cause

  Unknown.

  Work Around(s)

    1. Link CLD.LIB as an .OBJ; i.e., RTLINK FI yourfile, CLD.LIB
    2. Unknown.
    3. Use 'PASSPOINT' instead of 'PP'.
    4. Unknown.
    5. Pressing a menu hot key and RESTART off the menu will get things
       back in order.
    6. Unknown.
    7. See referenced file.

----------------------------------------------------------------------------
CLOSE-UP          Problem with CLOSE-UP remote operation.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Keys not recognized when using CLOSE-UP remote operation, specifically
  in MENU TO operation.

  Cause

  Incorrect CLOSE-UP settings.

  Work Around(s)

  Set CLOSE-UP keys to Advanced (requires version 3.0A).

----------------------------------------------------------------------------
COL()             Returns start of 'get' display vs end in S'87.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  COL() returns the column at the start of a get display in Clipper 5.0
  vis-a-vis the end of the get display in Summer '87.

  Cause

  Unknown.

  Work Around(s)

  Adjust screen display commands accordingly or use the new Get Class
  functions; e.g.,

       ...
       @ 0,0 say "Input" GET <var> VALID myfunc
       READ

       FUNCTION myfunc
       LOCAL g := getactive()
       @ g:row, g:col + len(g:buffer) + 1  SAY '<CExp>'
       RETURN .t.

----------------------------------------------------------------------------
COMPILER          Miscellaneous observations.

  Clipper Version  1.03 dtd 09/15/90.

  Observations

  1) IF the /P parameter is used in SET CLIPPERCMD and in the command
  line, the result is no .ppo file.

  2) Fatal compiler errors, or aborting the compile, will leave, what
  one user has dubbed, 'compiler turds'; i.e., compiler working files
  on your disk.

  3) Reminder, per the manual, pg. 3-2, SET CLIPPERCMD or command line
  options MUST be separated by a space (or the remainder will be ignored).

  4) /O Compiler Option ( Programming and Utilities Guide, pg 3-10)
     If only a path is supplied, it must end with \.

----------------------------------------------------------------------------
DBEVAL()          Documentation interpretation.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  DBEVAL() documentation states that DBEVAL() returns NIL. This statement
  should not limit your imaginative use of this function, as illustrated
  below.

  Cause

  Not Applicable.

  Work Around(s)

  Not Applicable.

  Notes:

  * This example fills a multi-dimensional array with the contents of a
  * .dbf file using DBEVAL and AEVAL.
  * It also demonstrates the dynamic attribute of STATIC arrays and
  * use of AEVAL's undocumented, second variable.

  STATIC aArray := {}
  LOCAL n, y
  CLS ; USE test NEW ; ASIZE(aArray,LASTREC())
  DBEVAL( {|| ;
    aArray[RECNO()] := {} , ASIZE(aArray[RECNO()], FCOUNT()), ;
    AEVAL(aArray[RECNO()],{|x,e| aArray[RECNO(),e] := FIELDGET(e)} ) } )
  USE
  QOUT() ; QOUT()
  AEVAL(aArray, { |x,e| AEVAL(aArray[e], { |x| QQOUT(x), QQOUT(" ") }), ;
                        QOUT() })

  seealso "AEVAL()"

----------------------------------------------------------------------------
DBU               Miscellaneous anomalies.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  1) If you try to change the name of a memo field, of an existing indexed
     (with DBU) database, and answer 'Yes' to the warning that 'Memos will
     be lost..'; you will lose all the records in your database as well.

  2) You may end up in an 'run-away' situation (Alt C to break) in the
     following set of circumstances: (Note: files containg 1000+? records)

     a) Open a database and Index with DBU.
     b) (F5) Browse the database.
     c) Before the screen has completely refreshed the database information,
        press (F7) to perform a seek operation (select seek).
     d) Enter an index key and 'Watch the fun begin'. (Thanks Kelly!)

  Cause

  Unknown.

  Work Around(s)

  Unknown.

----------------------------------------------------------------------------
SET DELETED ON    DELETED() records may still be visible.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Under certain combinations of physical file order (adjacent records),
  indexing and filtering, it can be shown that DELETED() records in a file
  may remain visible.

  Cause

  Unknown.

  Work Around(s)

  Test for DELETED() records; i.e.; in an example, the following showed
  a deleted record. Adding .AND. .NOT. DELETED() to the filter cured the
  problem. Thanks to a user for submitting test program, files, et al!

  SET DELETED ON
  USE test NEW
  SET INDEX TO test
  SET FILTER TO .....
  GO TOP
  WHILE .NOT. EOF()
    ? DELETED()
    SKIP
  END

----------------------------------------------------------------------------
DELIMITED | SDF   COPY TO or APPEND FROM anomalies.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  COPY and APPEND commands, using certain delimiters, do not produce
  the desired result. Further, certain APPEND FROM commands will
  append junk until all available disk space is exhausted.

  Cause

  Unknown.

  Work Around(s)

  Unknown. Nantucket to supply.

  Notes:

  1) COPY commands; using SDF, DELIMITED or DELIMITED WITH comma; work.
  2) APPEND commands; using SDF, DELIMITED or DELIMITED WITH comma; work,
     only if the text file ends in ^^Z or <CR><LF>. Caution! APPEND will
     try to append 'records' until out of disk space, causing a crash.
  3) DELIMITED WITH commands, other than those above, fail to produce
     the desired results. A hi-bit character will be used as the delimiter.
  4) The Detroit Area Clipper Users Group BBS (313-651-7841) has a file,
     DBAPPDEL.ZIP (E. Mark Kothe) which contains a program for appending
     with a BLANK delimiter.

----------------------------------------------------------------------------
Divide by Zero    Results in zero.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Division by zero results in zero vis-a-vis a run time error in S'87.

  Work Around(s)

   Test divisors for zero and return whatever you desire.

----------------------------------------------------------------------------
DIRECTORY()       Resultant array may == NIL.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  The array created by the DIRECTORY() function will == NIL if no files
  meet the <cDirSpec> or the <cDirSpec> is not valid.

  Work Around(s)

   Annotate your documentation. Test result for NIL.

----------------------------------------------------------------------------
Error Class       args variable incorrectly named.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Documentation error. 'params' is the correct name of the Exported
  Instance Variable referred to as 'args'.

  Work Around(s)

  Annotate your documentation. Use 'params' instead of 'args'.

----------------------------------------------------------------------------
ERRORSYS.PRG      Not compatible with S'87.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Clipper 5.0's ERRORSYS.PRG is incompatible with S'87 routines.

  Work Around(s)

      A user has uploaded ERRSUB.ZIP to NANFORUM to resolve differences.

----------------------------------------------------------------------------
EXTEND System     Changes made to a variable may effect other variables.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When a pointer points to more than one variable and one of the variables
  is changed in an ASM or C function, the other variables may be changed.

  Work Around(s)
  a) Make a local copy of the variable and pass it to the function.
  b) Break the pointer relationship before passing the variable.

  Notes This subject is slightly over the author's head, so forgive
            the terminology <g>.
  a) The following is an abstract of a forum message on the subject:

    Fm: Pedro P. Polakoff [3PS] 73157,2412
    Here is code that will demonstrate that:

       1. _parc() returns a pointer to the actual data.
       2. cVar1:=cVar2:="Foobar" points both variables at the same
          block of memory much as a C char * does.

    CLIPPER PORTION ---
    static cVar1
    static cVar2

    function str_test
       cVar1:=cVar2:="Foobar"      // HERE IS THE ASSIGNMENT
       QOut(cVar1,cVar2)
       ChangeStr(cVar2)            // NOTE NOT PASSED BY REFERENCE
       QOut(cVar1,cVar2)
    return(NIL)

    C PORTION ---

    #include <extend.h>

    CLIPPER changestr()
    {
       char *str;
       register int p;
       byte q='A';

       if(PCOUNT==1 && ISCHAR(1)){
          str=_parc(1);           // pointer to pointer
          for(p=0;p<_parclen(1);p++){str[p]^=q;}  // directly changed
       }
       _ret();                    // NIL return
    }
  b) Another example can be found in EXTBUG.ZIP in the NANFORUM LIB 17.
     Uploaded by Francois Batte 70022,3424.

  seealso "CALL()*"

----------------------------------------------------------------------------
FCREATE           Norton Guide documentation error.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  FCREATE's attribute definition is incorrect in the Norton Guide.

  Work Around(s)

      Use the documentation in the manual or refer to FILEIO.CH.
      The correct attributes are:
          0    Create normal read/write file (default)
          1    Create read-only file
          2    Create hidden file
          4    Create system file

----------------------------------------------------------------------------
FIELDWBLOCK()     Does not work per 'Guide' description.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  FIELDWBLOCK(<cFieldName>, <nWorkArea>) does not access nWorkArea; e.g.,

    USE test1 ALIAS one NEW;  nOne:= Select()  // cFieldName is keyid
    USE test2 ALIAS two NEW;  nTwo:= Select()  // cFieldName is last_name

    ? EVAL(fieldwblock ("last_name", nTwo))  // works ok.
    ? EVAL(fieldwblock ("keyid", nOne))      // does not work.

  Work Around(s)  as submitted by MIKE SCHINKEL 73567,3612.

    USE test1 ALIAS one NEW;  nOne:= Select()
    USE test2 ALIAS two NEW;  nTwo:= Select()

    ? one->( EVAL( FieldWBlock( "keyid", nOne ) ) )        // Both these
    ? ( nOne )->( EVAL( FieldWBlock( "keyid", nOne ) ) )   // are same.

    ? two->( EVAL( FieldWBlock( "last_name", nTwo ) ) )      // Both these
    ? ( nTwo )->( EVAL( FieldWBlock( "last_name", nTwo ) ) ) // are same.

  Notes

  A description of FIELDWBLOCK's behaviour, as submitted by Manuel
  Gonzalez 71121,1442, is as follows:

  1) If the work-area number fed to FIELDWBLOCK is the same as the current
     work area and the field exists, it returns the field's value when
     it's EVALuated.

  2) If the work-area number fed to FIELDWBLOCK is the same as the current
     work area and the field does not exist, it returns NIL.

  3) If the work-area number fed to FIELDWBLOCK is not the same as the
     current work area and the field does not exist in the work area
     specified, ERRORSYS says: "Variable does not exist: (fieldname)."

  4) If the work-area number fed to FIELDWBLOCK is not the same as the
     current work area and the field DOES exist in the work area spe-
     cified, FIELDWBLOCK returns NIL.  EVALuating FIELDWBLOCK bombs.


----------------------------------------------------------------------------
GETSYS.PRG        Modifications and corrections.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statements

  1) Unable to enter characters having an ASCII value > 127 in GET's.

  2) Control W or Control End exits getlist.

  3) Unable to enter negative decimal numbers using decimal point
     movement.

  4) An 'unselected' color setting is ignored until the GET is entered
     and exited.

  5) The cursor movement method, home(), documentation is incomplete.

  6) When a GET ... WHEN <lCond> command is issued and a condition dependent
     entry is at the top or bottom of the getlist, the system appears to
     lock up.

  Cause

  1) Line 413 of an unmodified GETSYS.PRG reads as follows:
          if (nKey >= 32 .and. nKey <= 127)

  2) GETSYS.PRG option

  3) Unknown.

  4) Unknown.

  5) Incomplete documentattion.

  6) GETSYS.PRG programming error.

  Work Arounds

  1) Line 413 may be edited, with caution, to permit a greater range of
     entries. Check for conflicts with any SET KEY's or SET FUNCTION's.
     GETSYS.PRG should be compiled and linked with your .PRG.

  2) The GETSYS.PRG has an #ifdef NOTDEF in the program. If you
     #define NOTDEF at the beginning of the file, CTRL W and CTRL END
     will move to the last valid item of the getlist.

  3) Enter negative decimal numbers, with PICTURE template #, as
     spaces up to the position before the decimal point, then minus,
     then number OR enter minus, then zeros until cursor jumps past
     decimal point, then number.

  4) Unknown.

  5) The cursor movement method, home(), toggles between the left-most
     editable position and the position before a decimal point, if one
     is present. This effect may be changed by changing getsys.prg as
     follows:
         Case (nKey == K_HOME)    //reference
           IF COL() != g:col      // don't go home if already there
             g:home()             //reference
           ENDIF COL() != g:col

     Annotate your documentation.

  6) The following changes to GETSYS.PRG will correct the problem.

  Note: This group of changes should be ignored if the 'Ira' fixes,
  below, are incorporated.
  ********************************************************************

     The changes commence at line 242 of the original program.

// 242    if (localReadExit)
            i := 0
// 244    else
// 245      i := 0
// 246      direction := BACKWARD
// 247    end
        end
      else
        if ( --i < 1 )
          * going backward, at top of getlist
          if (localReadExit)
            i := 0
          else
            i := 2                  // changed 255, was i := 1

  ********************************************************************
     GETSYS.PRG should be compiled with the /N option and linked with
     your .PRG.

  Note: The following changes to GETSYS.PRG have been submitted by
  Ira Emus (76702,672) to 'fix a bunch of anomalies you might find when
  using the WHEN keyword.' :

  ********************************************************************
  186  LOCAL nKey := 0, cKey     // change
  242   IF (LocalReadExit) .OR. nKey == K_ENTER   // change
  246   i := nLen-1               // change
  256   i := 2                    // change
  334     new := if( localReadExit, 0, 1 )     // reference
  335     GetExitRequested := new == 0         // Add
  341     new := if( localReadExit, 0, nLen )  // reference
  348     GetExitRequested := new == 0         // Add
  183    local g, passcount := 0         // change
  246    direction := BACKWARD           // reference
  247    passcount++                     // add
  256    direction := FORWARD            // reference
  257    passcount++                     // add
  260      IF passcount = 2              // add
  261         i := 0                     // add
  262      ENDIF                         // add
  263      loop                          // reference
  264    end                             // reference
  265    passcount := 0                  // add
  260   g:display()   // Add
  261   loop          // reference
  ********************************************************************

  The above 'Ira' changes have been 're-ordered' by another user
  as follows:

"The changes are reordered so that the added lines are in reverse
order so that line numbers don't change their reference line number.
183->182 means 'Ira' code showed line 183 but it should have been 182.

Changed Lines:
183->182   local g, passcount := 0                  // change
186->185  LOCAL nKey := 0, cKey                     // change
242       IF (LocalReadExit) .OR. nKey == K_ENTER   // change
246->245  i := nLen-1               // change
256->255  i := 2                    // change

Added Lines:
341->334  new := if( localReadExit, 0, nLen )  // reference
348->335  GetExitRequested := new == 0         // Add
334->327  new := if( localReadExit, 0, 1 )     // reference
335->328  GetExitRequested := new == 0         // Add

These 7 line numbers are difficult to tell exactly where g:display()
goes since two changes were made here.  They've been combined.

Original code reference:
263->260     loop                          // reference
264->261   end                             // reference

After additions (with new line numbers for loop and end).
260          IF passcount = 2              // add
261             i := 0                     // add
262          ENDIF                         // add
260->263     g:display()                   // add
263->264     loop                          // reference
264->265   end                             // reference
265->266   passcount := 0                  // add

These four lines are correct.
256        direction := FORWARD            // reference
257        passcount++                     // add
246        direction := BACKWARD           // reference
247        passcount++                     // add   "

  Note
  Author's note: I think the 'differences' may be due to Version 1.02 vs.
  1.03 - hope everyone can decipher 'em. Thanks to Ira!

  seealso "\SOURCE\SYS" "READ" "PICTURE"

----------------------------------------------------------------------------
Get:Delete()      Documentation omission.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Get:Delete() Syntax is not in documentation.

  Cause

  Documentation omission.

  Work Around(s)

  Annotate your documentation to add the definition to the GET Class,
  Cursor Movement Methods definitions

   delete()     Deletes the character under the cursor

----------------------------------------------------------------------------
GetNew()          Error in syntax documentation.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  GetNew() Syntax is not correct in documentation.

  Cause

  Error in documentation.

  Work Around(s)

  Edit your documentation to reflect the correct syntax:

    GetNew([<nRow>], [<nCol>], [<bBlock>],[<cGetVar>],[<cPicture>],
           [<cColorSpec>]) --> objGet

----------------------------------------------------------------------------
Get:VarGet()      Get Class, missing manual documentation.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  The definition of VarGet() is missing from the manual, but included
  in the Norton(r) Guide.

  Cause

  Ommission.

  Work Around(s)

  Annotate your manual to include VarGet() as follows:

  varGet()        Returns the current value of the Get variable               ^r^CEA^r

  varGet() --> GetVarValue

   Returns the current value of the Get variable.  For simple Get
   variables this is equivalent to executing Get:block:

   aGet:varGet() == EVAL(aGet:block)

   However, if the Get variable is an array element, EVAL(aGet:block)
   will not return the value of the Get variable; in this case use of
   varGet() is required.  An example of varGet() may be found in the
   READMODAL() function, defined in Getsys.prg.

----------------------------------------------------------------------------
Get:VarPut()      Get Class, missing manual documentation.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  The definition of VarPut() is missing from the manual, but included
  in the Norton(r) Guide.

  Cause

  Ommission.

  Work Around(s)

  Annotate your manual to include VarPut() as follows:

  varPut()        Sets the Get variable to the passed value                   ^r^CEA^r

  varPut() --> Value

   Sets the Get variable to the passed value.  For simple Get variables
   this is equivalent to executing Get:block with an argument:

   aGet:varPut(aValue) == EVAL(aGet:block, aValue)

   However, if the Get variable is an array element, EVAL(aGet:block,
   aValue) will not set the value of the Get variable; in this case use
   of varPut() is required.

----------------------------------------------------------------------------
IF(<exp>)         Use with caution with commands and statements.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  IF(<exp>) will be pre-processed as though it was the IF command and
  a compiler error will occur; e.g.,

     SET RELATION TO field + IF(<exp)) ...

  Cause

  Pre-processor action

  Workaround(s)

  1)  Use IIF() instead of IF()
  2)  Make IF() into an expression; e.g., field + (IF(<exp>))

----------------------------------------------------------------------------
IF nX == 0        May return incorrect logic.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Given the assignment, nX := 0.6, the test, IF (nX == 0) will return
  true.

  Cause

  Unknown.

  Workaround(s)

  1)  IF nX == 0.0  works ok.
  2)  IF 0 == nX   or  IF 0.0 == nX  work ok.
  3)  IF | IFF( nX == 0, action1, action2 ) work ok.
  4)  IF ROUND( nX, 2 ) == ROUND( 0, 2 ) works ok.

----------------------------------------------------------------------------
INCREMENT         RTlink option, problems.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Users have reported problems when attempting to use the Incremental
  Linking feature of RTLINK.

  Cause

  Unknown.

  Work Around(s)

  Avoid the use of this feature until a fix is available.

----------------------------------------------------------------------------
INDICES           Numerous reported problems.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Numerous reported problems re' indices; e.g., SEEK's, SET RELATION TO's
  and PACK's. Numerical indices containing appended blanks are out of
  order. Indexing on a child relation will destroy the child's index.

  Cause

  Unknown.

  Work Around(s)

  Unknown. Suggest use of character type index keys.
  Nantucket(r) Tech Support has allegedly suggested adding CHR(0) to
  the end of index key expressions. The following function will handle
  negative numbers and treat blanks as zeros.

  FUNCTION num2str(nNumber)
  RETURN ( PADL(LTRIM(STR(IF(nNumber<0,ABS(1/nNumber),nNumber),;
         LEN(STR(nNumber))+2,LEN(STR(nNumber))-AT(".",STR(nNumber))+2)),;
         LEN(STR(nNumber))+2,IF(nNumber<0,"-","0")) )

  A workaround for indexing on a child's data is to use a UDF. Example:

      SELECT 2
      USE test2 ALIAS S
      INDEX ON key_id TO test2
      SELECT 1
      USE test1 ALIAS P
      INDEX ON RELFUNC(P->key_id) TO test1

      FUNCTION RELFUNC(idkey)
      LOCAL cRetVal
      SELECT 2
      SEEK idkey
      cRetVal = IF( !S->(EOF()), S->last_name+S->first_name,;
                    SPACE(LEN(S->last_name+S->first_name)) )
      SELECT 1
      RETURN cRetVal

  Note:  The index file created by indexing on a number field has a
  different internal representation depending upon whether the file was
  created by Summer '87 or Clipper 5.0.

  seealso "MEMORY/VMM" "PACK" "SET RELATION"

----------------------------------------------------------------------------
INSTALL           Installation Problems

  See Support Bulletins 1 and 2 in NANFORUM LIB 16.

----------------------------------------------------------------------------
INTERNAL ERRORS   No documentation. See User-upload, CL5IEn.ZIP

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Nantucket(r) has not supplied Internal Error documentation.

  Work Around

  Terry McConnell, [71570,3571], has started a compendium of comments
  on Internal Errors, based on NANFORUM messages since 11/90. The
  current (12/08/91) uploaded file name is CL5IE1.ZIP and is available
  on NANFORUM (New Uploads) and DBADVISO (xBase).

----------------------------------------------------------------------------
JOIN              FIELDS statement required for secondary fields.        ~

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Join will not incorporate secondary file fields, unless so specified
  by the FIELDS argument. This is different than S'87, but noted in the
  docs.

  Work Around

  Use FIELDS argument if you want to include secondary fields in your
  resultant .dbf.

----------------------------------------------------------------------------
LABEL FORM        Miscellaneous Anomalies.                               ~

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statements

  a) If the user attempts to execute a second label report, a runtime
     (assignment) error will occur.
  b) Issuing a SET MARGIN prior to a LABEL FORM causes labels
     to be printed at a column position equal to three times the
     margin setting.

  Cause

  LBLRUN.PRG programming errors.

  Work Around(s)

  See Nantucket(r)'s support bulletin, S50006.TXT, on NANFORUM LIB,
  which contains a fixed LBLRUN.PRG. This fix does not correct console
  action. See SET CONSOLE for changes.

  seealso "NOCONSOLE" "SET CONSOLE"

----------------------------------------------------------------------------
LOCAL             Inline assignment clarification.

  Clipper Version  1.03 dtd 09/15/90.

  Clarification:

  Inline assignments of the following form:

     LOCAL a := b := c:= 0

  result in LOCAL a and PRIVATE b and c. Use:
     LOCAL a, b, c
     a := b := c := 0

  Further, LOCAL x := 1, y := x + 2, z := y + 4  will cause a run-time
  error: BASE/1081 Argument Error: +. Use:
     LOCAL x, y, z
     x := 1; y := x + 2; z := y + 4   or

     LOCAL x := 1
     LOCAL y := x + 2
     LOCAL z := y + 4

----------------------------------------------------------------------------
MACRO             Memvar to .dbf - same name as field.

  Clipper Version  1.03 dtd 09/15/90.

  Discussion

  In S'87 it was possible to declare public memory variables, the same
  name as .dbf fields, get data from the .dbf, edit the data and replace
  the field data with the memory variables - using macros. One or more
  third party libs had routines to accomplish this. These routines do
  not work 'as is' under 5.0.

  Work-around

  The following illustrates a way of accomplishing the above - thanks to
  MIKE SCHINKEL 73567,3612 for the 'basics':

    USE test NEW            // fields data1, data2
    CLS
    Dbf_To_Mem()

    @ 10,10 say "Data1" get M->data1
    @ 11,10 say "Data2" get M->data2
    READ

    Mem_To_Dbf()

    ? test->data1, test->data2

    **************
    FUNCTION Dbf_To_Mem()
      LOCAL i, nFCnt:= FCount(), cFldName
      FOR i:= 1 TO nFCnt
        cFldName := FieldName(i)
        PUBLIC &cFldName
        Eval( MemvarBlock( FieldName( i ) ), FieldGet( i ) )
      NEXT
    RETURN NIL

    **************
    FUNCTION Mem_To_Dbf()
      LOCAL i, nFCnt:= FCount()
      FOR i:= 1 TO nFCnt
        FieldPut( i, Eval( MemvarBlock( FieldName( i ) ) ) )
      NEXT
    RETURN NIL
    **************

  Note
  The above will cause a Compiler Error if the /a option is used.
  An alternative is to declare and initialize the 'field names' as
  memvars in the calling routine:
    MEMVAR data1, data2
    data1 := data2 := Space(4)

  All of the above is presented as a 'quickie' S'87 workaround. Better
  methods for Scatter/Gather type functions exist; e.g., fieldget()/
  fieldput() into/from arrays, using Clipper 5.0.

----------------------------------------------------------------------------
MANUAL            Missing documentation.

  Clipper Version  1.03 dtd 09/15/90.

  As noted in the README file, the following function or statement
  definitions are missing from the manual:

 BREAK()        Branch out of a BEGIN SEQUENCE...END construct            F
 DECLARE*       Create and initialize private memory variables and arrays S
 DEVOUT()       Write a value to the current device                       F
 FIELDBLOCK()   Return a set-get code block for a field variable          F
 FIELDGET()     Retrieve the value of a field variable                    F
 FIELDPUT()     Set the value of a field variable                         F
 FIELDWBLOCK()  Return a set-get block for a field in a given work area   F
 GETACTIVE()    Return the currently active Get object                    F
 MEMVARBLOCK()  Return a set-get code block for a given memory variable   F
 OUTERR()       Write a list of values to the standard error device       F
 OUTSTD()       Write a list of values to the standard output device      F
 SETBLINK()     Toggle asterisk (*) interpretation in SETCOLOR()          F
 SETMODE()      Change display mode to specified number of rows, columns  F

  Note: These definitions have been uploaded as MAN001.TXT and MAN002.TXT
        in the NANFORUM library.

  The following match-marker description is also missing from the manual:

     <(idMarker)>             Extended Expression match-marker
     
      Extended Expression match-marker:  matches a regular or
      extended expression, including a filename or path specification. It
      is used in combination with the smart stringify result-marker to
      assure that extended expressions won't get stringified, while
      normal, unquoted string file specifcations will.

----------------------------------------------------------------------------
MEMORY/VMM        Numerous reported VMM crashes.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Numerous problems have been reported re' memory related crashes.

  Cause

  Unknown.

  Work Around(s)

  Unknown, however:

  a) One user, Pedro P. Polakoff [3PS] 73157,2412 reports:
     Anyone who is having problems with the VMM error: 5317 (Swap space
     exhausted), especially when using linker's other than RTLink, can
     solve the problem by using the following function call:

        Function VMMKickStart()
          local cDummy:=Space(8000)       // Warplink Base
          -- or --
          local cDummy:=Space(16000)      // Blinker Base
        return(NIL)

     as the very first executed line of your program.

  b) If the system locks up when indexing, and you linked WITH
     BASE50.PLL, try linking WITHOUT BASE50.PLL or linking with
     Roger Donnay's suggested FULLBASE.PLL. (See FAST50.ZIP in
     NANFORUM LIB 17, New Uploads.)

  Notes

  See Support Bulletins 3 and 4 in NANFORUM LIB 16.

----------------------------------------------------------------------------
MENU TO           Anomalies using Menu To xChoice.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  a) When used with SetKey(), the set key procedure does not receive the
     correct parameters for cproc, cline and, cvar.
  b) When called in a sub-procedure, 'Menu To cPublicVar', does not
     assign the choice to external variable, cPublicVar.

  Cause

  a) Unknown.
  b) Unknown.

  Work Around(s)

  1) Tech support at Nantucket suggests the following work around to be
     placed at the top of all setkey() procedures :

     if procname(3) == "__MENUTO"
       cproc := procname(4)
     else
       cproc := procname(3)
     endi

     The following alternative(s) have been suggested by a user.

     First create an #include file called BUGFIX.CH as follows:

       #define FIXCPROC   procname(if(procname(3)=='__MENUTO',4,3))
       #define FIXCLINE   procline(if(procname(3)=='__MENUTO',4,3))
       #define FIXCVAR    readvar()

     and modify your set key procedure by placing the following at the
     top of each procedure:

       cproc := FIXCPROC
       cline := FIXCLINE
       cvar  := FIXCVAR

                              OR (Combination of above.)

       #define FIXCPASS(x,y,z);
             x := procname(if(procname(3)=='__MENUTO',4,3)) ;;
             y := procline(if(procname(3)=='__MENUTO',4,3)) ;;
             z := readvar()

     Place the following at the top of setkey procedures:

       FIXCPASS(cproc,cline,cvar)

  2) Assign the Menu To choice to a cTempVar, then assign
     cPublicVar := cTempVar.

  seealso "PROCNAME()"

----------------------------------------------------------------------------
MISC              Miscellaneous clarification/anomalies.

  Clipper Version  1.03 dtd 09/15/90.

  a) CL.BAT (Support Bulletin S50004.TXT)
     This batch file was not supplied with Clipper 5.0.
     Here are the intended contents:

      CLIPPER %1
      RTLINK FI %1

  b) NDX File Support ( Card contained with Clipper 5.0 )
     You must request this feature from Nantucket(r). Not available
     as of late November.

  c) MEMVARBLOCK() (NG Function Description)
     MEMVARBLOCK() cannot be used to create set-get blocks for LOCAL
     or STATIC variables.

  d) Code block parameter visibility - documentation anomaly.
     Page 1-21 of the Clipper 5 Reference, last sentence, 2nd paragraph
     reads: "....a declaration that occurs within a code block (a block
     parameter), applies to that code block and any code blocks nested
     within it.". The block parameter IS NOT visible to nested code blocks,
     unless you pass it.

  e) In certain incidences, terminating a macro expression with a period,
      '.', does not work; e.g.,
        FUNCTION IndexFile(cKey, cIndexName)
           INDEX ON &cKey. TO (cIndexName)
           RETURN (NIL)
     Result: Compiler "Error C2081 Macro of declared symbol: '&cKey.'

  f) Menu.prg example on page 1-2 of the Reference Manual has as its
     first line '#include "Database.prg" ...'. This directive should
     be placed at the end of the program (it includes generic database
     functions).


  g) Re-direction. Clipper 5.0 does not accept command line parameters
     re-directed from a text file; e.g.  CLIPPROG  < TEXTFILE.

  h) STATIC arrays. Documentation anomaly, pg. 1-57. Contrary to the
     documentation, STATIC arrays are also dynamic.

  i) The following program results in a run-time error because x was not
     initialized; however, the error message, "Error BASE/1087  Argument
     error: -- " should reference ++ instead.

              function main
              local x
              x++
              return nil

  j) The COPY FILE command doesn't throw an error to the error handler if
     there is an "out of drive space" error.

  k) When there is an error in a CASE expression, the runtime error
     occurs on the line of the first CASE:

     1: DO CASE
     2:   CASE 1==4
     3:   CASE "A"=="Z"
     4:   CASE 1=="Z"
     5: ENDCASE

     will send an argument error on line 2, not on 4 as expected.

  l) Delay Loops.
       For I := 1 To 10000 ; Next
     Produces no discernible delay if 'To' is less than 65536.

       For I := 1.0 To 10000 ; Next
     Will produce a delay (About 4 seconds on an IBM PS/2 Mod 80).

  seealso "SCREEN"

----------------------------------------------------------------------------
MULTI-STATEMENT   Multi-statement lines, CAUTION.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When using multiple statements on one programming line; i.e.;
  separating commands with a semi-colon; there are several commands
  which will cause erroneous results, if they are not at the end of
  line.

  Cause

  Pre-processor action.

  Work Around(s)

  Make sure that the following commands, if used, appear at the end
  of the line, ONLY.

  ENDDO    <*x*>             SET STEP <*x*>
  ENDIF    <*x*>             SET SAFETY <*x*>
  ENDCASE  <*x*>             SET TALK <*x*>
  ENDFOR   <*x*>             SET PATH TO <*path*>
  SET ECHO <*x*>             SET COLOR TO  <*spec*>
  SET HEADING <*x*>          SET COLOUR TO <*spec*>
  SET MENU <*x*>             RUN <*cmd*>
  SET STATUS <*x*>           ! <*cmd*>

  COPY   TO   <(file)>  DELIMITED  WITH <*delim*>
  APPEND FROM <(file)>  DELIMITED  WITH <*delim*>

  seealso "STD.CH" "DELIMITED | SDF" "SET COLOUR"

----------------------------------------------------------------------------
Numerics          Problem with numbers > 2 ** 31.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Certain large numbers, entered as variables, return unexpected
  values. Examples:

          Assignment                 ? nVar

  nVar := 4503599627436033   =>  4503599627436033
  nVar := 4503599627436032   =>  4503599627436032
  nVar := 4503599627436031   =>  65535
  nVar := 4503599627403264   =>  35868
  nVar := 4503599627403263   =>  32767
  nVar := 4503599627370498   =>  2
  nVar := 4503599627370497   =>  1
  nVar := 4503599627370496   =>  0    // 2 ** 54
  nVar := 4503599627370495   => -1
  nVar := 4503599627370494   => -2
  nVar := 4503599627337729   => -32767
  nVar := 4503599627337728   =>  4503599627337728
  nVar := 4503599627337727   =>  4503599627337727


  Cause

  Unknown.

  Work Around(s)

  Append '.0' to the variable at assignment; e.g.,

    nVar := 4503599627370496.0  =>  4503599627370496.0

  Notes

  The above example 'ranges' about 2 ** 54. Similar, but not identical,
  results will occur when nVar > 2 ** 31. Attempts to assign nVar as
  ROUND(nNumber,nPlaces) or nNumber * 1.0 failed to cure the problem;
  however, if nVar is created as a result of say 2 ** 32, the assignment
  appears to be correct.

----------------------------------------------------------------------------
NG MODE           Un-documented Norton(r) Guide Mode.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  NG can be executed in a mode which will permit it to unload from
  memory when F10 or Escape is used to exit the program.

  Cause

  Documentation omission.

  Work Around(s)

  Enter NG TEST.NG at the DOS prompt. When NG receives the specific
    parameter TEST.NG, it will load in the above described mode.
    Annotate your documentation.

  Note TEST.NG is the specific parameter to be used. This is NOT
  the name of an existing file.

----------------------------------------------------------------------------
NOCONSOLE         Not documented as REPORT | LABEL FORM option.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  NOCONSOLE parameter to REPORT | LABEL FORM .. commands is missing.

  Cause

  Syntactical ommissions in documentation. Note: FRMRUN.PRG | LBLRUN.PRG
  programming uses the presence | absence of a NOCONSOLE parameter to
  SET CONSOLE accordingly. See SET CONSOLE for re-programming solutions.

  Work Around(s)

  1) Change documentation to reflect addition of this parameter:
    REPORT | LABEL FORM <xcReport> [TO PRINTER] [TO FILE <xcFile>][<scope>]
    [WHILE <lCondition>] [FOR <lCondition>][PLAIN | HEADING <cHeading>]
    [NOEJECT] [SUMMARY] [NOCONSOLE]

----------------------------------------------------------------------------
OS()              Does not return user's operating system.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  OS() returns the operating system programmed into EXAMPLP.PRG.

  Cause

  Incorrect documentation or non-implementation of function.

  Work Around(s)

  1) Change documentation to reflect true action of this function.
  2) Edit EXAMPLEP.PRG to reflect the desired system, compile and
     link with your program.

----------------------------------------------------------------------------
PACK              PACK's with multiple open indices may fail.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  PACK's with multiple indices may fail. The BADPAC.ZIP file on
  NANFORUM illustrates the problem.

  Cause

  Unknown. Suspect indexing procedure.

  Work Around(s)

  Close indices before PACKing. Re-index the files, using INDEX ON rather
  than REINDEX. Some users recommend erasing the index files prior to
  usage of the INDEX ON. Otherwise, design your program so that PACK's
  are not required.

  seealso "REINDEX" "INDICES"

----------------------------------------------------------------------------
PC-MOS            Problem with NETERR().

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Craig Cigas 71660,1440, reports that under PC-MOS 4.1, NETERR() returns
  its default value at all times.

  Cause

  Unknown.

  Work Around(s)

  The user enclosed his function, which was opening files, in a BEGIN
  SEQUENCE structure which exited when an EG-OPEN error was detected.

----------------------------------------------------------------------------
PICTURE           Anomalies with the PICTURE clause.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  1) PICTURE "Y"      May return lowercase, if character type variable.
      Using @ <row>, <col> GET <cVar> PICTURE "Y"  OR
      Using @ <row>, <col> SAY <cString> GET <cVar> PICTURE "Y"
      will not force UPPER(cVar); i.e., cVar returned will be the same
      case as entered by the user.

  2) PICTURE "@R <template> may not produce the desired results, per
     the following example:
     Using @ <row>, <col> SAY "abcdefgh" PICTURE "@R X_X_X_X_X_X_X_X"
     produces a_b_c_defgh.

  3) The PICTURE clause may truncate a variable but will not increase
     it's length. Examples:

        cVar := ""
        @ row, col get cVar PICTURE "!!!!!"   // Does not work.

        cVar := SPACE(10)
        @ row, col get cVar PICTURE "!!!!!"   // Will truncate cVar.

  4) The PICTURE format function, "@Z #" does not perform as documented.
     Assuming the get variable is zero, the active get will display 0.

  5) The GET PICTURE format function, "@S<n>" performs differently
     than S'87; i.e., large values of <n> will not wrap to the next
     line(s).

  Cause

  1) Not implemented in STD.CH

  2) Unknown.

  3) Unknown.

  4) Unknown.

  5) Deliberate change.

  Work Around(s)

  1) Place the following line at the beginning of your program or
     at the end of MYNAME.CH

        #translate PICTURE "Y" => PICTURE "@! Y"

  2) Format the string through other means. It appears that this template
     will work if four or less items of the input string are to be
     formatted at a time; i.e., "8185551212" to "@R (999)999-9999" works
     satisfactorily.

  3) Exercise caution in programming.

  4) Unknown.

  5) Roll your own.

  seealso "STD.CH"

----------------------------------------------------------------------------
PROCNAME()        Returns wrong value when in SET KEY procedure.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When PROCNAME() is called from within a SET KEY procedure, the wrong
  procedure name is returned.

  Cause

  Unknown.

  Work Around(s)

  1) Modify your program to use some other method of identifying
     'where you are' for HELP routines, etc.

----------------------------------------------------------------------------
RMAKE >           Omit spaces when re-directing error output.            ~

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement
  This re-direction of error output statement does not work:
      // Inference rule to compile
      .prg.obj:
      clipper $** $(options) > comperr.txt

  Cause

  Unknown.

  Work Around(s)

  1) Remove the spaces surrounding the >; i.e.,
       clipper $** $(options)>comperr.txt

----------------------------------------------------------------------------
QEMM              Clipper hangs under certain conditions.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When the Clipper environmental variable includes /Ennn, and nnn is
  greater than 0 and QEMM is set with the FRAME=NONE and NOEMS is NOT
  specified, a clipper application will 'hang' the system.

  Cause

  Unknown.

  Work Around(s)

  If NOEMS, by itself, or NOEMS is used with FRAME=NONE, the application
  will execute; however, this apparently means that other applications,
  such as Lotus, will not be able to use memory normally accessed via the
  VCPI interface.

----------------------------------------------------------------------------
RANGE             Compiler errors.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statements

  1) RANGE compiler error (C2010) when GET <Var> is an array element.

    Using @ <row>, <col> GET <Var> RANGE <lo>, <hi>   OR
    Using @ <row>, <col> GET <Var> PICTURE .. RANGE <lo>, <hi> OR
    Using @ <row>, <col> SAY <cString> GET <Var> PICTURE .. RANGE <hi>, <lo>

    returns a compiler error if the <Var> is an array element.

  2) WHEN RANGE  ( Not Implemented, contrary to documentation.)

    Using @ <row>, <col> GET <Var> PICTURE .. WHEN <cond> RANGE <lo>, <hi>
                             OR
    Using @ <row>, <col> SAY <cString> GET <Var> PICTURE .. WHEN <cond> ;
    RANGE <hi>, <lo>

    returns a compiler error, whereas the documentation reflects that
    RANGE | VALID may be used.

  Cause

  1) Pre-processor action.
  2) Not implemented in STD.CH

  Work Around(s)

  1 & 2) Edit MYNAME.CH lines per the following:

#command @ <row>, <col> GET <var> [PICTURE <pic>] ;
             [RANGE <lo>, <hi>] [WHEN <when>] ;
=> ;
         SetPos(<row>, <col>) ;;
         AAdd( GetList, _GET_(<var>, <(var)>, <pic>, ;
        {|_1, _2| RangeCheck(_1, _2, <lo>, <hi>)}, <{when}>) )

#command @ <row>, <col> SAY <sayxpr> [PICTURE <saypic>] ;
         GET <var> [PICTURE <pic>] [RANGE <lo>, <hi>] [WHEN <when>] ;
=> ;
         @ <row>, <col> SAY <sayxpr> [PICTURE <saypic>] ;;
         @ Row(), Col()+1 GET <var> [PICTURE <pic>] ;
          [RANGE <lo>, <hi>] [WHEN <when>];

  Note:

  The documentation lists the useage as RANGE or VALID. The above two
  changes bring the action into compliance with the documentation. The
  following 4 changes to MYNAME.CH, submitted by John Beckner, will
  permit both RANGE and VALID to be used concurrently:

 #command @ <row>, <col>;
          GET <var> [PICTURE <getpic>] [WHEN <when>] [RANGE <lo>, <hi>];
 =>;
          @ <row>, <col> GET <var> [PICTURE <getpic>] [WHEN <when>];
          [VALID {|_1| _1 >= <lo> .and. _1 <= <hi>}]

 #command @ <row>, <col>;
          GET <var> [PICTURE <getpic>] [WHEN <when>];
          [RANGE <lo>, <hi> VALID <valid>];
 =>;
          @ <row>, <col> GET <var> [PICTURE <getpic>] [WHEN <when>];
          [VALID {|_1| (<valid>) .and. _1 >= <lo> .and. _1 <= <hi>}]

 #command @ <row>, <col> SAY <sayexpr> [PICTURE <saypic>];
          GET <var> [PICTURE <getpic>] [WHEN <when>] [RANGE <lo>, <hi>];
 =>;
          @ <row>, <col> SAY <sayexpr> [PICTURE <saypic>];;
          @ <row>, col()+1 GET <var> [PICTURE <getpic>] <WHEN <when>];
          [VALID {|_1| _1 >= <lo> .and. _1 <= <hi>}]

 #command @ <row>, <col> SAY <sayexpr> [PICTURE <saypic>];
          GET <var> [PICTURE <getpic>] [WHEN <when>];
          [RANGE <lo>, <hi> VALID <valid>];
 =>;
          @ <row>, <col> SAY <sayexpr> [PICTURE <saypic>];;
          @ <row>, col()+1 GET <var> [PICTURE <getpic>] [WHEN <when>];
          [VALID {|_1| (<valid>) .and. _1 >= <lo> .and. _1 <= <hi>}]

  seealso "STD.CH"

----------------------------------------------------------------------------
READ              Command documentation.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  READ command documentaion re' Navigation Keys is incorrect.

  Cause

  Incorrect documentation.

  Work Around(s)

  1) Annotate your documentation as follows:

     Table 4-9: READ Navigation Keys
     
     Key                                Action
     
     Leftarrow                          Character left. Does not move cursor
                                        to previous GET
     Rightarrow, Ctrl-D                 Character right. Does not move cursor
                                        to next GET
     Ctrl-Leftarrow, Ctrl-Z             Word left
     Ctrl-Rightarrow, Ctrl-B            Word right
     Uparrow, Ctrl-E                    Previous GET
     Dnarrow, Ctrl-X, Return, Ctrl-M    Next GET
     Home, Ctrl-A                       First character of GET
     End, Ctrl-F                        Last character of GET
     Ctrl-Home, Ctrl ]                  Beginning of first GET
  *  Ctrl-End, Ctrl-W                   Beginning of last GET
                            OR          Terminate READ saving current GET
     

     Table 4-12: READ Exit Keys
     
     Key                         Action
     
     Ctrl-C, PgUp, PgDn          Terminate READ saving current GET
  *  Ctrl-End, Ctrl-W            Terminate READ saving current GET
                           OR    Beginning of last GET
     Ctrl-W, Ctrl-C, PgUp, PgDn  Terminate READ saving current GET
     Return, Ctrl-M              Terminate READ from last GET
     Esc                         Terminate READ without saving current GET
     Uparrow                     Terminate READ from first GET if
                                 READEXIT()=.T.
     Dnarrow                     Terminate READ from last GET if
                                 READEXIT()=.T.
     

  Note:  Action of Ctrl-End, Ctrl-W is dependent upon whether or not
           NOTDEF is defined in GETSYS.PRG.

  seealso "GETSYS.PRG"

----------------------------------------------------------------------------
REINDEX           Does not re-create index file header.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  REINDEX uses the existing index file header. If this is corrupted,
  the resultant index file will also be invalid.

  Cause

  Unknown.

  Work Around(s)

  1) Use INDEX ON to create new indices. Some users have suggested
     erasing the existing index file prior to INDEX ON usage.

  seealso "INDICES" "PACK"

----------------------------------------------------------------------------
REPORT FORM       Anomalies with Report forms.                           ~

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  1) REPORT FORM will not display character report fields which are
     4 or less characters, unless the field width is set to five.

  2) The expression *** Total *** is appended to a report containing
     numeric fields, whether or not totals are requested. If group
     action is elected, ** Subtotal ** and * Subsubtotal * will
     show in the report, whether or not totals are requested.

  3) REPORT FORM will not print a report which does not contain at
     least one character field.

  4) Multi-line reports cannot be printed using the string +";"+ string
     method.

  5) REPORT ... HEADING ".." cannot be printed using the +";"+ method.

  6) SET MARGIN TO. FrmRun.prg suffers from the same anomaly as LblRun.prg.
     See the Label related support bulletin, S50006.TXT for info.

  7) The Group Eject option is not implemented.                            ~

  Cause

  1) FRMRUN.PRG. MLCOUNT() and MEMOLINE() do not work with a linelength
     parameter less than 4.

  2, 3, 4, 5, 6, 7) FRMRUN.PRG programming errors.

  Work Around(s)

  1) Set report field width to 5 for character fields less than 5
     characters OR re-program FRMRUN.PRG as follows:

     XMEMOLINE Function:

     IF nLineLength < 5
       RETURN ( SUBSTR(cString, nLineLength * (nLineNumber-1) + 1,;
                nLineLength) )
     ELSE
       RETURN( MEMOLINE( cString, nLineLength, nLineNumber, nTabSize,
               lWrap ) )
     ENDIF

     XMLCOUNT Function:

     IF nLineLength < 5
       RETURN ( INT(LEN(cString) / nLineLength) + ;
              IF( LEN(cstring) % nLineLength == 0, 0, 1 ) )
     ELSE
       RETURN( MLCOUNT( cString, nLineLength, nTabSize, lWrap ) )
     ENDIF

  2) Define a STATIC variable, say totalflag. Set this flag to .F. in
     the __ReportForm function, after the LOCAL statements. Reset this
     flag in the "// Column total elements" loop:

       IF aReportData[RP_COLUMNS,nCol,RC_TOTAL]  // reference
         totalflag := .t.                        // add
         FOR nGroup := 1 TO LEN(aReportTotals)   // reference

     and apply this flag as desired throughout the program. Compile
     and link with your programs requiring this function.

  3) Modify FRMRUN.PRG, about line 380, as follows:

   // Only run through the record detail if this is NOT a summary report
   IF !aReportData[ RP_SUMMARY ]
      // Determine the max number of lines needed by each expression
      nMaxLines := 1  // Changed from 0 to 1.
      FOR nCol := 1 TO LEN(aReportData[RP_COLUMNS])
        ....
  4) Modify FRMRUN.PRG as follows:
     a) Add a variable, cRepStr, to the LOCAL's in ExecuteReport().
     b) Look for the following around line 366 and modify:
        IF aReportData[RP_COLUMNS,nCol,RC_TYPE] $ "CM"
          // added to fix ";"
          cRepStr := EVAL(aReportData[RP_COLUMNS,nCol,RC_EXP])
          while AT(";",cRepStr) > 0
            cRepStr := Stuff(cRepStr, at(";",cRepStr),1,chr(13)+chr(10))
          end
          // revised
          nMaxLines := MAX(XMLCOUNT(cRepStr,;
                       aReportData[RP_COLUMNS,nCol,RC_WIDTH]), nMaxLines)
        ENDIF
     c) Look for the following around line 381 and modify:
        IF aReportData[RP_COLUMNS,nCol,RC_TYPE] $ "CM"
          // Load the current line of the current column into cLine
          // added to fix ";"
          cRepStr := EVAL(aReportData[RP_COLUMNS,nCol,RC_EXP])
          while at(";",cRepStr) > 0
            cRepStr := Stuff(cRepStr, at(";",cRepStr),1,chr(13)+chr(10))
          end
          // revised
          cLine := XMEMOLINE(TRIM(cRepStr),;
                aReportData[RP_COLUMNS,nCol,RC_WIDTH], nLine )

          cLine := PADR( cLine, aReportData[RP_COLUMNS,nCol,RC_WIDTH] )

        ELSE

  5) Insert a routine, similar to the above, in FrmRun, ReportHeader().

  6) Make changes similar to those incorporated in the LBLRUN.PRG fix
     in S50006.TXT. (Search for 'OldMargin'). It will also be necessary
     to change:

   LOCAL nHeadingLength := aReportData[RP_WIDTH] - 15
*  LOCAL nHeadingLength := aReportData[RP_WIDTH]-aReportData[RP_LMARGIN]-30

   AADD( aPageHeader, PADC( aReportData[RP_HEADER,nLine], ;
                      aReportData[RP_WIDTH] ) )
*  AADD( aPageHeader, PADC( aReportData[RP_HEADER,nLine], ;
*                     aReportData[RP_WIDTH]-aReportData[RP_LMARGIN] ) )

  7) Requires multiple program line changes - see Notes.                   ~

  Notes
  The above, and other fixes and customizations are available in a file,
  C5REP4.ZIP, on NANFORUM.

  seealso "NOCONSOLE" "SET CONSOLE"

----------------------------------------------------------------------------
RESERVED WORDS    Comments on reserved words.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Numerous users have reported problems which have been traced to the
  use of variable names which conflict with Clipper 5.0 commands or
  statements.

  Work Around(s)

  Exercise caution in the choice of variable names. Remember, if your
  variable name is four characters long and these characters match the
  first four letters of a Clipper 5.0 or UDC command, you've got problems.
  Just avoid this situation as well as names that match Clipper 5.0
  commands and statements. Remember also, If you create a UDF of the same
  name as a Clipper 5.0 function, its action will supersede Clipper's.

----------------------------------------------------------------------------
RESTORE           ADDITIVE parameter unreliable.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  RESTORE FROM <memfile> ADDITIVE may corrupt Public/Private variables.

  Cause
  Unknown. To be 'fixed' by Nantucket(r).

  Work Around(s)

  Use some other method of storing / retrieving variables; e.g., a .dbf
  file.

----------------------------------------------------------------------------
RIGHT()           Returns runtime error if embedded in a macro.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When RIGHT(cVar) is included in a macro statement, a runtime
  error occurs when the macro is expanded.

  Cause

  RIGHT(cVar) is a psuedo-function, created by directive in STD.CH; i.e.,

        #translate Right(<c>, <n>)  =>   Substr( <c>, -(<n>), <n>)

  Work Around(s)

  1) Create a real function, RIGHT(cVar), in your .PRG; e.g.,
            FUNCTION ALLTRIM
            PARAMETERS cVar, nVar
            RETURN  SUBSTR(cVar, -nVar, nVar)

  2) Create the above function and compile using the /N option.
     Include the resultant .OBJ file when linking.
     Note: You may delete the #translate line from MYNAME.CH.

  3) Create the above function and compile using the /N option.
     Add the resultant .OBJ file to a .LIB file; e.g., EXTEND.LIB.
     Note: You may delete the #translate line from MYNAME.CH.

  4) Replace all RIGHT(cVar) references in your .PRG with
     SUBSTR(cVar, -nVar, nVar).

  Note

  See Support Bulletin 4 in the NANFORUM Library.

  seealso "ALLTRIM()" "STD.CH"

----------------------------------------------------------------------------
ROUND()           Returns unpredictable results.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  The ROUND() function, like its predecessor in S'87, does not return
  the desired result, in certain cases.

  Cause
  Unknown.

  Work Around(s)

  The following function seems to do the trick:

  FUNCTION ROUNDIT(nNumber, nPlaces)
  nPlaces := IF( nPlaces == NIL, 0, nPlaces )
  RETURN IF(nNumber < 0.0, -1.0, 1.0) * ;
         INT( ABS(nNumber) * 10 ^ nPlaces + 0.50 + 10 ^ -12 ) / 10 ^ nPlaces

  Notes
  FYI, here are some particularly unique numbers:
    1.265   146.795   8.245   18.435   10.165   16.685
    1.025     4.645   8.155   35.105  286.335    4.515  4.225

----------------------------------------------------------------------------
S50005.TXT        Nantucket(r) - Things that you should know.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Nantucket(r) has issued Support Bulletin, S50005.TXT, available in
  NANFORUM LIB 16, which lists comments and workarounds concerning the
  following subjects.

     1) Duplicate fields in a COPY TO command
     2) BEGIN SEQUENCE...END with multiple GETS
     3) SET KEY and undefined functions
     4) Translation rules
     5) Displaying long gets
     6) Omitting spaces before macros
     7) TBrowse limit exceeded
     8) Passing color strings by reference to SETCOLOR()
     9) 00/00/00 is an invalid date

  Cause
  Unknown.

  Work Around(s)

  See subject document.

----------------------------------------------------------------------------
SCREEN            Misc. SETMODE(), SETBLINK(), SETCOLOR()

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  a) Cursor anomalies. Try using SET CLIPPER=CGACURS if you are
     experiencing cursor anomalies. Reference: NG Environment.

  b) A 'splash of color' may remain at 0, 65 after using SETCOLOR()
     and GET. This can be eliminated by SET SCOREBOARD OFF.

  c) SETBLINK(), SETMODE() (NG Function Descriptions)
     These are environmental or screen attributes; hence, they will
     change the full screen when invoked. You may want to save the
     screen before invoking either of these functions.

     SETMODE() should be followed by a CLS or CLEAR SCREEN.
     The following routine will put the display in 50 row mode and
     turn off the cursor - on an IBM PS/2 Model 80.

        SetMode(50,80)
        Cls
        SetCursor(1)
        FOR nI := 1.0 to 250; NEXT    // Adjust delay as required.
        SetCursor(0)

     Similar programming is required when returning to 25 row mode.

     SETBLINK() is a tricky little devil. Despite the fact that its
     alleged default is .T., it may be necessary to issue SetBlink(.T.)
     before any blinking will occur. Further, it may be necessary to
     re-issue a SetColor(cVar) after the SetBlink(lVar) call. Takes
     a little experimentation <g>.


----------------------------------------------------------------------------
SET COLOUR        Incorrect syntax in STD.CH.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  SET COLOUR directives in STD.CH need to be changed to enable
  command recognition.

  Cause
  Incorrect programming.

  Work Around(s)

  Edit the SET COLOUR lines, in MYNAME.CH, to read as follows:

  #command  SET COLOUR TO [<*spec*>]   =>  SetColor( #<spec> )
  #command  SET COLOUR TO ( <c> )      =>  SetColor( <c> )

  seealso "STD.CH" "MISC"

----------------------------------------------------------------------------
SET CONSOLE OFF   Turned back on by REPORT | LABEL FORM TO ...

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When SET CONSOLE OFF is used prior to a REPORT | LABEL FORM <formname>
  TO PRINT | FILE, it appears to be ignored.

  Cause

  Syntactical ommissions in documentation. Note: FRMRUN.PRG | LBLRUN.PRG
  programming uses the presence | absence of a NOCONSOLE parameter to
  SET CONSOLE accordingly.

  Work Around(s)

  1) Change documentation to reflect addition of this parameter:
    REPORT | LABEL FORM <xcReport> [TO PRINTER] [TO FILE <xcFile>][<scope>]
    [WHILE <lCondition>] [FOR <lCondition>][PLAIN | HEADING <cHeading>]
    [NOEJECT] [SUMMARY] [NOCONSOLE]

  2) Use NOCONSOLE in Clipper 5.0 programs.

  3) Change the following lines:

     FRMRUN.PRG:

       *  lConsoleOn := SET( _SET_CONSOLE, !lNoConsole )
       lConsoleOn := IF( !lNoConsole, SET(_SET_CONSOLE),;
                        SET(_SET_CONSOLE, .F.) )
     LBLRUN.PRG
       *  LOCAL lConsoleOn := .T.          // CONSOLE status
       LOCAL lConsoleOn                 // CONSOLE status

       *  IF lConsole == NIL
       *   lConsole := .T.
       *  ENDIF

       *  IF lConsole              // To the screen
       *   lConsoleOn := SET( _SET_CONSOLE, lConsole )
       *  ENDIF
       lConsoleOn := IF( !lNoConsole, SET(_SET_CONSOLE),;
                        SET(_SET_CONSOLE, .F.) )

     Compile and link these programs with your program when these
     functions are required.

  seealso "NOCONSOLE"

----------------------------------------------------------------------------
SET RELATION      Anomalies reported using this command.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  SET RELATION TO ... INTO ...  The following two anomalies have been
  reported:

    1) Corruption of a child index when replacing non-key child fields.

    2) Deleted records are not recognized as deleted in the child.

  Cause

  Unknown.

  Work Around(s)  Note: Assumes Parent is selected.

  1) Select Child; SET ORDER TO 0; Replace; SET ORDER TO 1; Select Parent.
  2) Select Child; SEEK; select Parent - the SEEK command differentiates
     between deleted and non-deleted records.

  seealso "INDICES"

----------------------------------------------------------------------------
SET TYPEAHEAD     Limited to 15 characters.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Various user tests have shown that setting the <nKeyBoardSize>
  parameter greater than 15 does not increase the size of the buffer.

  Cause

  Unknown.

  Work Around

  Unknown.

----------------------------------------------------------------------------
SKIP ALIAS        <nWorkArea> case mis-translated.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  SKIP ALIAS (nWorkArea) is translated by the pre-processor to:
            __dbSkip( alias (nWorkArea) )  which is incorrect.

  Cause

  Ordering of SKIP translations in STD.CH

  Work Around

  Change the order of the SKIP translations in MYNAME.CH as follows:
  // old
  // #command SKIP ALIAS <a>       =>  <a> -> ( __dbSkip(1) )
  // #command SKIP <n> ALIAS <a>   =>  <a> -> ( __dbSkip(<n>) )
  // #command SKIP <n>             =>  __dbSkip( <n> )
  // #command SKIP                 =>  __dbSkip(1)

  // new
  #command SKIP <n>                =>  __dbSkip( <n> )
  #command SKIP ALIAS <a>          =>  <a> -> ( __dbSkip(1) )
  #command SKIP <n> ALIAS <a>      =>  <a> -> ( __dbSkip(<n>) )
  #command SKIP                    =>  __dbSkip(1)

  SKIP ALIAS (nWorkArea) will then be correctly translated to:
         (nWorkArea) -> ( __dbSkip(1) )

----------------------------------------------------------------------------
SORT ON <number>  Produces incorrect result with negative numbers.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  When SORT is used on a number field, the result is incorrect if the
  file to be sorted contains negative numbers.

  Cause

  Unknown.

  Work Around(s)

  Unknown. Suggest using the function presented under INDICES to index
  the file and then use COPY.

  seealso "INDICES"

----------------------------------------------------------------------------
STD.CH            Comments re' header file STD.CH

  STD.CH is a header file. The pseudo-functions therein are hard coded
  in CLIPPER.EXE; i.e., STD.CH is not automatically 'included' when a
  .PRG is compiled but its pseudo-functions are.

  It is suggested that users may wish to copy STD.CH to another file;
  e.g., MYNAME.CH; make changes as desired to MYNAME.CH, and force
  the inclusion of MYNAME.CH at compile time with the /UMYNAME.CH
  option. A header file included in this fashion will take precedence
  over the STD.CH pseudo-functions hard coded in CLIPPER.EXE.

----------------------------------------------------------------------------
TBROWSE           Miscellaneous notes on TBrowse variables.              ~

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  a) oTB:colorRect() (NG, Classes, TBrowse, Miscellaneous Methods)
     oTB:colorRect() does not recognize the last color in colorSpec.
  b) oTb:footSep
     No documentation.
  c) oTb:autolite
     Run time error if oTb:autolite is stated prior to adding a column.
  d) oTb:freeze
     The following sequence will 'hide' a column separator between columns
     1 and 2:
     Create browse object with a column separator (oTb:colSep)
     addcolumn 1
     oTb:freeze
     addcolumn 2
     Note: Same action occurs if an oCol:colSpec is applied to column 2.
  e) See S50005.TXT, Support Note, for field limit of 200.

  f) If math, other than addition or subtraction, is performed on the      ~
     value to be returned from a skipblock function, the return value
     is not interpreted correctly by skipblock.

  Cause

  a) Unknown.
  b) Documentation ommission.
  c) - f) That's just the way it works.

  Work Around(s)

  a) Add an additional dummy color to colorSpec.

     oTB:colorSpec := "W/N,N/W,R/G,G/R"
     ...
     oTB:colorRect( aRect, { 1, 2 } )   // okay
     oTB:colorRect( aRect, { 3, 4 } )   // doesn't work.

     oTB:colorSpec += ",N/N"            // add dummy color

     oTB:colorRect( aRect, { 3, 4 } )   //  works

  b) Annotate your manual to include this Instance Variable.

  c) Don't declare oTb:autolite before a column has been added.

  d) Don't declare oTb:freeze until a column, after the column to be
     frozen, has been added.

  e) Don't try to browse more than 200 fields.

  f) Return the value as follows: Bin2i(I2bin(nRetVal))

----------------------------------------------------------------------------
TEXT/ENDTEXT      Space after ENDTEXT causes compiler error.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  If source code has a space following the ENDTEXT, the compiler will
  produce an error. The error may be C2033, Missing ENDTEXT or possibly,
  C3001 Memory Overbooked.

  Cause

  Unknown.

  Work Around(s)

  Remove white space after ENDTEXT

----------------------------------------------------------------------------
TONE/ISPRINTER    Conflict with Tom Rettig Library, TR.LIB

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  Inclusion of the TONE() function in a program linked with TR.LIB,
  using RTLINK, produces an undefined symbol error; e.g., the following
  program:
     ? isprinter()
     ? tone()

  Cause

  Unknown.

  Work Around(s)

  Remove isprint from TR.LIB using a library manager; e.g., LIB.EXE.

  Notes

  Mr. Rettig will 'fix', subsequent to Nantucket's promised 'fix disk'.

----------------------------------------------------------------------------
TYPE()            Comments on Clipper 5.0 return values.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  1) TYPE("LocalVar" or "StaticVar") returns 'U'.
  2) TYPE("PrivateObject") returns 'A'.

  Cause

  1) TYPE("cVar") uses macro expansion to evaluate variables.
  2) Unknown.

  Work Around(s)

        Use VALTYPE(var)

  Notes

       TYPE("Undeclared_Var")      Returns 'U'
       VALTYPE("Undeclared_Var")   Returns runtime error

----------------------------------------------------------------------------
USE EXCLUSIVE     Second attempt to use file returns DOS Error 5.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  A user has reported that a second attempt to 'Use filename Alias filename
  Exclusive New' resulted in DOS ERROR 5 vis-a-vis being handled by his
  NetErr() routine.

  Cause

  Unknown.

  Work Around(s)

  To be supplied by Nantucket(r).

----------------------------------------------------------------------------
USE READONLY      Network reports file opened in R/W mode.

  Clipper Version  1.03 dtd 09/15/90.

  Problem Statement

  A user has reported that his network reported file opened in R/W mode,
  despite use of READONLY parameter. This has been verified by Nantucket(r)

  Cause

  Unknown.

  Work Around(s)

  To be supplied by Nantucket(r).

----------------------------------------------------------------------------
//<parameter>     Undocumented feature.

  Clipper Version  1.03 dtd 09/15/90.

  Feature Statement

  1) //INFO  Undocumented diagnostic feature. Create a program with the
     single command 'wait'. Compile and link. Execute the program with the
     parameter //INFO. This will illustrate the type of diagnostic
     information available; e.g.,
        Clipper (R) 5.0 Rev. 1.03 USASCII
        DS=4A80:0000  DS avail=40KB  OS avail=277KB  EMM avail=1536KB
        Press any key to continue...(Fixed Heap=21KB)

  2) // can also be used to SET CLIPPER parameters from the command line;
     e.g., Program //E0 //F31.
  Cause

  Documentation ommission.

  Work Around(s)

  Annotate your documentation.

----------------------------------------------------------------------------
\INCLUDE          Comments on \CLIPPER5\INCLUDE\ Files.

    The following header files in the \CLIPPER5\INCLUDE\ sub-directory
    should be included in .PRG files which need them.

    ACHOICE.CH              MEMOEDIT.CH
    BOX.CH                  SET.CH
    DBEDIT.CH               SETCURS.CH
    DBSTRUCT.CH             EXTEND.H     (5.0 with C)
    DIRECTRY.CH             EXTENDA.MAC  (A'86)
    ERROR.CH                EXTENDA.INC  (S'87)
    FILEIO.CH               EXTASM.INC   (C)
    INKEY.CH

    A special case is the STD.CH header file, also in this sub-directory.

  seealso "STD.CH"

----------------------------------------------------------------------------
\LIB              Comments on \CLIPPER5\LIB\ Files.

    File notes:

    CLIPPER  LIB   Automatically linked with Rtlink unless overridden.
    DBFNTX   LIB   Automatically linked with Rtlink unless overridden.
    EXTEND   LIB   Automatically linked with Rtlink unless overridden.
    TERMINAL LIB   Included in BASE50.PLL
      _VDISPLAY.........SCR
      _VKEYBOARD........KEYBD
      _VMOUSE...........MOUSE
    EXTENDLI ORG
    CLD      LIB
    RTLUTILS LIB

  Function Location Changes

    S'87 EXTEND.LIB              5.0 LOCATION

  AFIELDS                        CLIPPER.LIB
  ALLTRIM                        CLIPPER.EXE (STD.CH)
  HEADER                         CLIPPER.LIB
  LEFT                           CLIPPER.LIB
  LUPDATE                        CLIPPER.LIB
  NEXTKEY                        CLIPPER.LIB
  RECSIZE                        CLIPPER.LIB
  RESTSCREEN                     CLIPPER.LIB
  RIGHT                          CLIPPER.EXE (STD.CH)
  SAVESCREEN                     CLIPPER.LIB
  SETCOLOR                       CLIPPER.LIB
  VERSION                        CLIPPER.LIB

  Lo-level file routines
  The following functions are in EXTEND.LIB, not CLIPPER.LIB as stated
  in the documentation:
       FCLOSE  FCREATE   FERASE   FERROR  FOPEN
       FREAD   FREADSTR  FRENAME  FSEEK   FWRITE

----------------------------------------------------------------------------
\SOURCE\SYS       Comments on \CLIPPER5\SOURCE\SYS\ Files.

   The following files in the \CLIPPER5\SOURCE\SYS sub-directory
   are hard coded in CLIPPER.EXE. They may be modified, compiled
   and linked to make changes.

    FRMDEF.CH                   LBLBACK.PRG
    FRMBACK.PRG                 LBLRUN.PRG
    FRMRUN.PRG                  ERRORSYS.PRG
    LBLDEF.CH                   GETSYS.PRG

