Problems resolved by CA-Clipper 5.2d: 1. Fixed a VMIF in the Object Memory Manager. This occurred in low memory situations when the OMM took space from the VM segment that it was attempting to expand. 2. Fixed a GPF/VMIF in the Object Memory Manager's garbage collecter that occured when there were a large number of static variables. 3. Fixed the FIELDPOS() function so that it no longer returns misleading results when passed an invalid argument. 4. Fixed bug in oStrDup() where an incorrect number of bytes were being copied to an incorrect location for dedicated VM segments. 5. Fixed a VMIF in the Object Memory Manager that occurred when performing an incremental garbage collection on an array that had just satisfied the requirement for occupying its own dedicated VM segment. 6. Fixed a GPF that occurred when growing the class/dictionary table. This happens when instantiating a class or creating a dictionary when the dictionary/class table is full. 7. Fixed the RDD manager so it does not become corrupted when the VMM swaps its data to disk. This occured only in a very low memory situation. 8. Panning right in a TBROWSE containing a single frozen column no longer causes TBROWSE to go into an infinite loop when trying to redisplay. 9. Fixed a GPF in TbrowseNew() and TbrowseDB() in certain memory configurations. 10. Fixed a GPF in the function ALIAS([]) when nWorkArea > 255. 11. Fixed the GPF caused by function ORDKEY() with an invalid . 12. Fixed the SET DELETED ON command so that it does not affect record visibility on a network. 13. Fixed the SORT command so that it deallocates the memory it allocated before returning control to its caller. 14. Fixed internal errors 650, 775 and 999 that occurred when the compiler did not produce correct code for statements that contained an extra set of parentheses. EXAMPLE: (( Test() )) 15. Fixed C3039 PHASE ERROR in the compiler that occurred when a .PRG source file contained several static variables that were inline initialized to a codeblock. EXAMPLE: static Var1 := { | x | func1( x ) } static Var2 := { | x | func2( x ) } static Var3 := { | x | func3( x ) } 16. Fixed a lockup in the compiler that occurred when a .PRG had a large number of STATIC variables. 17. Fixed the compiler so that /Z switch has effect on expressions that contain constants. 18. Fixed the compiler so it will not produce the "C3050 Something terrible has happened" error when it encounters a user defined function whose argument is being negated. Example: MyUDF( -X ) 19. Fixed a problem in the compiler that allowed it to accept illegal comment blocks. EXAMPLE: /**/*/ 20. Fixed the compiler so it now generates an error when it encounters one of the following incorrect control blocks: IF...ELSE...ELSE...ENDIF IF...ELSE...ELSEIF...ENDIF 21. Fixed the compiler to generate an error when it encounters the following statement: Alias->Alias-> 22. Fixed the compiler so it does not generate an error when it encounters an expression containing multiple NOTs. EXAMPLE: iff( ! ! .t., .t., .f. ) 23. Fixed the compiler so it does not generate an error when it encounters a statement in which an aliased expression contains extra parenthesis: (MyFunc())->DBFfield or: ? (MyFunc())[x] 24. Fixed the compiler so it will not produce the "C2005 Statement not recognized match failed at: '&'" error when it encounters the following: @ nCol, nRow SAY "string" + &(macro_expression) 25. Fixed evaluating a macro that contains an alias caused a syntax error in the next macro evaluation. EXAMPLE: ? &( "aTest[1]" ) // ? &( "test->( RECNO() )" ) ? &( "aTest[1]" ) // Syntax error - & 26. Fixed a lockup that occurred when a memvar was created within a macro. The scope of that memvar was incorrect, it expanded to the upper lever procedure. EXAMPLE: &("MEMVAR->dummy") := 666 27. Fixed a lockup that occurred when using a macro to expand an expression, that contains an alias. EXAMPLE: &(alias(1))->( Recno() ) 28. Fixed SELECT() so it now returns 0 when passed an invalid parameter. 29. Fixed DBCREATE() so it generates a run-time error when it is passed an unknown RDD name instead of hanging the system. 30. Fixed The USE command so it does not upper-case convert the contents of the variable which is used in VIA clause. 31. Fixed DBCREATE() so it generates a run-time error when there is not enough space on a drive. 32. Fixed the database/index synchronization as in the following example: SET ORDER TO REPLACE SKIP() SET ORDER TO SKIP(-1) ? RECNO() 33. Fixed the 'INDEX ON TO WHILE ' command so it does not create only one record in the scoped index (regardless how many meet the WHILE condition) when the current index order was used, and the most recent DBF movement was not an index movement (SKIP, SEEK). 34. Fixed the updating of the conditional .NTX file when a field, that was not in the key expression, was updated. 35. Fixed index file update failure on complex key expression when the multiple fields were being concatenated as a key and the key field(s) value(s) were subsequently changed. 36. Fixed the 'REPLACE WITH' command so it will not cause a program to lock up if it attempts to write memo information to disk with insufficient space. 37. Fixed the following commands: COPY TO...SDF, COPY TO...DELIMITED APPEND FROM...SDF, APPEND FROM...DELIMITED so they do not hang the system when the DEFAULT option is chosen from the 'cannot open/create file' error message. 38. Fixed the COPY TO [ SDF | DELIMITED ] command so it does not close the current workarea when the DEFAULT option is chosen from the 'cannot open/create file' error message. 39. Fixed the COPY TO command when the current database is the child of a relation and there is a pending seek. 40. Fixed CREATE FROM & COPY STRUCTURE so they work when the target is a disk drive designator and file name without a backslash. EXAMPLE: C:FileName 41. Fixed the APPEND FROM SDF command so it would ignore null-characters when it reads SDF-file. 42. Fixed TBrowse so that 'hitBottom' would report .T. if an attempt was made to go past the end of the available data when there are not enough records to completely fill the TBrowse display and refreshAll() is invoked prior to stabilization. 43. The decimal portion of the field definition for date, logical and memo fields is now initialized. 44. Fixed the function ORDSETFOCUS() to ignore an invalid as per documentation. 45. Fixed the function ORDSETFOCUS() to return an empty string when a database has no controlling order and the DBFNDX driver is used. 46. Fixed the function INDEXKEY() to return an empty string when there was no database opened in a workarea. 47. Fixed the functions ORDBAGNAME(), ORDNAME(), ORDNUMBER(), ORDKEY(), ORDFOR() to provide an argument type checking. The following run-time errors are generated when one or more of the arguments are of the wrong type: Error DBCMD/1021 Argument error: ORDBAGNAME Error DBCMD/1022 Argument error: ORDFOR Error DBCMD/1023 Argument error: ORDKEY Error DBCMD/1024 Argument error: ORDNAME Error DBCMD/1025 Argument error: ORDNUMBER 48. Fixed the GO command when DBFNDX driver is used and the data type of was DOUBLE, not LONG. 49. Fixed the OrdName(0) so it would return the name of the current controlling order when DBFNDX driver is used. 50. Fixed the OrdNumber() when DBFNDX driver is used and there is no in the Order List. 51. Fixed SET ALTERNATE so it generates a run-time error when there is no space available on the disk. 52. Fixed the STRTRAN() function so it no longer goes into an infinite loop when the cSearch parameter is a zero length string. 53. Fixed ALLTRIM() so it generates an error when given an argument of the wrong type. 54. Fixed the function DIRECTORY (, "V") so it does not pad the volume name with garbage, if its length is exactly 8 characters long. 55. All commas contained in a GET's PICTURE clause are now copied into the GET's edit buffer. 56. When a GET's PICTURE clause contains an '@R', the number of editable positions in its edit buffer is now calculated correctly. 57. When a GET's PICTURE clause contains an '@R', non-picture characters beyond the last editable position are now displayed. 58. When a GET's PICTURE clause contains a paren, a leading paren in its edit buffer now causes the value to be parsed as a negative number. 59. A bug was fixed in which GETs that had a PICTURE clause containing a leading '$' would sometimes display negative values with multiple '$' characters. 60. The size of a GET's edit buffer no longer increases if its PICTURE clause contains a paren, and a negative value is entered into its edit buffer. 61. In the #command for GET, the smart stringify result marker was replaced by a normal stringify result marker. The previous use of the smart stringify marker had caused parsing problems whenever an aliased variable was used in a GET command. 62. The ALERT() function now updates the LASTKEY status. 63. Fixed ALERT() so that it no longer exhibits occasional problems when fewer than four option strings are used. 64. Fixed FSEEK() so that it rejects requests that would cause the resulting absolute file position to become negative. In such cases the current file position is left unchanged and an error flag is set; the value of this flag can be retrieved by calling the FERROR() function. 65. Fixed the 'SET FUNCTION TO' command so that it will now accept strings that contain only white space. 66. The SET DATE FORMAT code was modified so that the format string must contain non-numeric delimiters between the month, day, and year portions. 67. Fixed the DEVPOS() function so that it now immediately responds to an error condition. 68. Fixed STUFF() so it will generate a run-time error when there is insufficient virtual memory to create it's data buffer. 69. Fixed VAL("-.nnnn") so it does not return "******" now. 70. Fixed DBU so it does not go to an endless loop if there is a filter set on a field and if GOTO is used and a record number is given that is not one of the records matching the filter. 71. Fixed DBU to respond to the key when BROWSEing a database in which none of the records match the filter condition. 72. Fixed DBU so it does not go to an endless loop if, when VIEWing an empty database, the user presses any character key. 73. Fixed DBU to update and reopen indexes after PACKing or ZAPing a database. 74. Fixed DBU so that BROWSE reflects the filter condition after PACKing or ZAPing a database. 75. Fixed the REPORT FORM command's sub-grouping feature when the name of the last subgroup in a group was the same as the name of the next group. 76. Fixed the REPORT FORM command without the TO PRINT clause so it produces the printer output if SET PRINT ON command was previously issued. 77. The multi-lines per record using ";" - method is now implemented. 78. Fixed the number of lines on the first REPORT page to be the same as the number of lines on the following pages. 79. Fixed the REPORT FORM command not to do page eject after subgroup if page eject after group flag was set to TRUE. 80. Fixed the REPORT FORM heading not to be truncated when page width is set to 61 or more characters. 81. Fixed the CA-Clipper Debugger so it does not display garbage in the last line of the Monitor Window when was pressed.