Friday, February 27, 2009

What's fixed in CA-Clipper 5.2d ?

The following information on the CA-Clipper 5.2d patch was extrated from 52dix.txt which came with the patch. This is an important patch as it fixes 86 known bugs !!!

What is the 5.2d patch ?

The CA-Clipper 5.2d/ExoSpace 1.0f upgrade described in this file contains latest fixes for CA-Clipper and CA-Clipper/ExoSpace. This includes an updated version of the DBFMDX driver revised to be compatible with the CA-Clipper/Compiler Kit. The DBFMDX database collation drivers are now CA-Clipper/ExoSpace compatible also. The DBFCDX driver has not been changed. We are currently working on a separate patch for it. It will be published as soon as it is ready.

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 collector that occurred 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 occurred 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 inconsistency between OrdSetFocus("") and OrdSetFocus(0). Now OrdSetFocus("") also restores the natural order.

49. Fixed OrdNumber("") so that it returns zero rather than the number of orders for the workarea when DBFNDX driver is used.

50. Fixed the GO command when DBFNDX driver is used and the data type of was DOUBLE, not LONG.

51. Fixed the OrdName(0) so it would return the name of the current controlling order when DBFNDX driver is used.

52. Fixed the OrdNumber() when DBFNDX driver is used and there is no in the Order List.

53. Major revisions have been made to the DBFMDX driver to rectify the problems in the previous versions.

54. Fixed SET ALTERNATE so it generates a run-time error when there is no space available on the disk.

55. Fixed the STRTRAN() function so it no longer goes into an infinite loop when the cSearch parameter is a zero length string.

56. Fixed ALLTRIM() so it generates an error when given an argument of the wrong type.

57. Fixed the function DIRECTORY (, "V") so it does not pad the volume name with garbage, if its length is exactly 8 characters long.

58. All commas contained in a GET's PICTURE clause are now copied into the GET's edit buffer.

59. When a GET's PICTURE clause contains an '@R', the number of editable positions in its edit buffer is now calculated correctly.

60. When a GET's PICTURE clause contains an '@R', non-picture characters beyond the last editable position are now displayed.

61. 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.

62. A bug was fixed in which GETs that had a PICTURE clause containing a leading '$' would sometimes display negative values with multiple '$' characters.

63. 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.

64. 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.

65. The ALERT() function now updates the LASTKEY status.

66. Fixed ALERT() so that it no longer exhibits occasional problems when fewer than four option strings are used.

67. 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.

68. Fixed the 'SET FUNCTION TO' command so that it will now accept strings that contain only white space.

69. The SET DATE FORMAT code was modified so that the format string must contain non-numeric delimiters between the month, day, and year portions.

70. Fixed the DEVPOS() function so that it now immediately responds to an error condition.

71. Fixed STUFF() so it will generate a run-time error when there is insufficient virtual memory to create it's data buffer.

72. Fixed VAL("-.nnnn") so it does not return "******" now.

73. 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.

74. Fixed DBU to respond to the key when BROWSEing a database in which none of the records match the filter condition.

75. Fixed DBU so it does not go to an endless loop if, when VIEWing an empty database, the user presses any character key.

76. Fixed DBU to update and reopen indexes after PACKing or ZAPing a database.

77. Fixed DBU so that BROWSE reflects the filter condition after PACKing or ZAPing a database.

78. 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.

79. Fixed the REPORT FORM command without the TO PRINT clause so it produces the printer output if SET PRINT ON command was previously issued.

80. The multi-lines per record using ";" - method is now implemented.

81. Fixed the number of lines on the first REPORT page to be the same as the number of lines on the following pages.

82. Fixed the REPORT FORM command not to do page eject after subgroup if page eject after group flag was set to TRUE.

83. Fixed the REPORT FORM heading not to be truncated when page width is set to 61 or more characters.

84. Fixed the CA-Clipper Debugger so it does not display garbage in the last line of the Monitor Window when was pressed.

85. Fixed RLOCK() and DBRLOCK() so that it would not fail if the database was the child of a relation and there was a pending seek.

86. Fixed the failure of the RLOCK() function when invoked after a successful FLOCK() on an open shared database.

No comments:

Post a Comment

Welcome to Clipper... Clipper... Clipper

In 1997, then using Delphi 3, I had already created 32-bits Windows applications for HRIS, ERP and CRM. In 2007, using Ruby on Rails, an AJAX powered CRM site running on Apache & MySQL was created and I am now using Visual Studio .Net 2008 to create web-based projects and Delphi 7 for Win32 applications using SQL2005 & DBFCDX.

So, why then am I reviving the Original Clipper... Clipper... Clipper via a Blog as CA-Clipper is a programming language for the DOS world ? Believe it or not, there are still some clients using my mission-critical CA-Clipper applications for DOS installed in the late 80's and up to the mid 90's. This is testimony to CA-Clipper's robustness as a language :-)

With the widespread introduction of Windows 7 64-bits as the standard O/S for new Windows based PCs & Notebooks, CA-Clipper EXE simply will not work and it has become imperative for Clipper programmers to migrate immediately to Harbour to build 32/64 bits EXEs

Since 28th January 2009, this blog has been read by 134,389 (10/3/11 - 39,277) unique visitors (of which 45,151 (10/3/11 - 13,929) are returning visitors) from 103 countries and 1,574 cities & towns in Europe (37; 764 cities), North America (3; 373 cities) , Central America & Caribeans (6; 13 cities), South America(10; 226 cities), Africa & Middle-East (12; 44 cities) , Asia-Pacific (21; 175 cities). So, obviously Clipper is Alive & Well : -)

TIA & Enjoy ! (10th October 2012, 11:05; 13th November 2015)

Original Welcome Page for Clipper... Clipper... Clipper

This is the original Welcome Page for Clipper... Clipper... Clipper, which I am republishing for historical and sentimental reasons. The only changes that I have made was to fix all the broken links. BTW, the counter from is still working :-)

Welcome to Chee Chong Hwa's Malaysian WWW web site which is dedicated to Clipperheads throughout the world.

This site started out as a teeny-weeny section of Who the heck is Chee Chong Hwa ? and has graduated into a full blown web site of more than 140 pages (actually hundreds of A4 size pages) ! This is due to its growing popularity and tremendous encouragements from visiting Clipperheads from 100 countries worldwide, from North America, Central America, Caribbean, South America, Europe, Middle-East, Africa and Asia-Pacific. Thanx Clipperheads, you all made this happen !

What is Clipper ?

You may ask, what is this Clipper stuff ? Could Clipper be something to do with sailing as it is the name of a very fast sailing American ship in the 19th century ?

Well, Clipper or to be precise, CA-Clipper is the premier PC-Software development tool for DOS. It was first developed by Nantucket Corporation initially as a compiler for dBase3+ programs. Since then, CA-Clipper has evolved away from its x-base roots with the introduction of lexical scoping & pre-defined objects like TBrowse. As at today, the most stable version ofClipper is 5.2e while the latest version, 5.3a was introduced on 21 May 1996.

As at 11th November, 1996, an unofficial 5.3a fixes file was made available by Jo French. See the About CA-Clipper 5.3a section for more details. BTW, Jo French uploaded the revised 5.3a fixes file on 20th November, 1996.

Latest News

The latest news is that CA has finally released the long-awaited 5.3b patch on 21 May, 1997.

For 5.3b users, you must a take a look at Jo French's comments on unfixed bugs in 5.3b.

BTW, have you used Click ? If you're a serious Clipperprogrammer and need an excellent code formatter, Click is a natural choice. How to get it ? Simple, access Phil Barnett's site via my Cool Clipper Sites.

32-bits Clipper for Windows ?

Have you tried Xbase ++ ? Well, I have and compared to Delphi (my current Windows programming tool of choice), I'm still sticking to Delphi.

Anyway, you should visit the Alaska Home Page. Give it a chance and then draw your own conclusions !.

The Harbour Project

Is this the future of Xbase ? Take a look at at the Harbour Project

You are Visitor # ...

According to, you are visitor since 3 June 1996.

If you like or dislike what you see on this website, please drop me a line by clicking the email button at the bottom of this page or better still, by filling out the form in my guest book. If you are not sure what to write,click here to take a look at what other Clipperheads have to say.