Project hosted by
Open Source Extended Clipper Language

xHarbour News


xHarbour BETA-1.7 for the different platforms are available for download from the download page now.

Here are some of the fixes, and new features offered by Beta-1.7:

xHarbour Core compiler
  • Fixed a segfault when compiling multiple sources with debug info.
  • Fixed typo in HB_CompOptimizeFrames() generation of HB_P_LARGEFRAME when static frame is ommited.
  • Removed the condition in SwitchCase which was ambiguous, but no longer needed.
  • Added support for \q in extended strings.
  • Fixed segfault when generating debug info for a codeblock.
  • new hb_compGetDebugInfo() which generate line numer information for debugger from generated PCODE.
  • Fixed generating line number information in HB_P_LINEOFFSET. The line numbers do not need to be ascending. When code from other files is included, offset can be negative or 0.
  • New hb_compPCodeStat() function which generates PCODE statistics.
  • New support for automatic size checking of variable size PCODEs in hb_compPCodeEval()
  • Removed unnecessary functions for checking the real size of variable size PCODEs
  • Corrected generation for hb_p_(push|pop)global*
  • Minor optimization in genC.c
  • Optimize usage of HB_P_NOT PCODE - remove repeated NOT operations or revert conditional jumps if they are just after NOT.
  • Fixed a segfault when generating debug info for some codeblocks.
  • Added unconditional and conditional jump joining optimization
  • Updated -gc3 output for TRY/CATCH/FINALLY/END to work with current HVM. The semantic of this statement is unchanged
  • Changed the exit code for .hrb file compilation in xhbcmp
  • Changed the init code to update symbol table address after symbol registration by HVM
  • Modified TRY/CATCH/FINALLY flow to comply with standard conventions
  • Added "TRY section requires a CATCH or FINALLY handler" error when a TRY is used without a CATCH or FIANALLY.
  • Fixed typos related to CLASSMETHOD
  • Added few #untranslate to allow recycling of per class rules.
  • Added support for :InitClass()
  • Added "THROW" as a reserved word.
  • Added missing case for "CATCH"
  • Removed redundant older rule for DESTRUCTOR ... -> METHOD ...
  • Refined rule for DESTRUCTOR ... to allow both variation of () or missing ()
  • Added support for -go<n> to control C source generation. The default for -go is HB_COMPGENC_COMPACT
  • Protected DllCalls functions with #ifdef __PLATFORM__Windows
  • Added support -go[0-3] and other -g* switches to xhb* scripts
  • Added hb_itemMove() macro mapped to hb_itemForwardValue()
  • Changed definition of SUPERTABLE for optional dynamic overloading this modification will not effect existing code
  • Message symbols are not function symbols - cleaned the HB_FS_MESSAGE usage and fix the problem with registering static function in global symbol table
  • Keep function name set by compiler for static initstatics.
  • Extend init statics name with the number of used static variables.
  • Fixed segfault on codeblocks in module-wide static variable initialization with debug info.
  • Fixed compilation of extended codeblocks in expression context.
  • Added support for Extended Block with no formal parameters.
  • Eliminated redundancy in CodeBlock rule
  • Fixed .hil creation. Compiler GPFed on code: i18n("%s%s%s%s"). The same fix allows to use formatting for string internationalization, ex. sprintf(i18n("Count: %d"), nCount)
  • Implemented placement of I18N tables into .exe resource (for Win32).
  • Added HB_Crypt and HB_Decrypt to
  • Removed support for MAX_STREAM in favor of new STREAM_SIZE_ALLOC.
  • Improved sPair to use malloc()/realloc() instead of fixed size stack memory.
  • Fixed GPF trap in STREAM_APPEND().
  • Fixed typo in hbFix.c which broke conditional jump reduction.
  • Added to new errors (memory corruption and memory overflow) for compiler level FM statistic.
  • Fixed hb_conOutErr() to properly display data when given size is 0.
  • Don't suppress line number generation after RETURN statements.
    This fixes code like:
    CASE 1 == NIL /* wrong lineno in error msg */
  • Disable line striping optimization when -l compiler switch (suppress line number information) is set - in such case it's only waste of time.
  • Added dead code eliminator (f.e. inside WHILE .F. / IF .F. blocks).
  • Added repeated HB_P_LINE* pcodes stripping - the can appear after dead code elimination
  • Added optimization for WHILE .T. / IF .T.
  • Added -kJ switch which disable jump optimization
  • Restored BEGIN SEQUENCE / RECOVER / END elimination with empty SEQUENCE body
  • Rewritten jump optimization to to support multi passes
xHarbour Virtual Machine (VM)
  • Fixed GPF trap related to user passed value being shorter than the structure size.
  • Fixed GPF when an INIT procedure used OLE.
  • Fixed GPF trap.
  • Minor optimization
  • Fixed a few typos in TEXTHIDDEN implementation.
  • Fixed a couple of HB_TRACE calls.
  • Fixed callstack info corruption.
  • Changed code generated for double values to avoid limitation in some C compilers like MSVC and possible differ conversion inside C RTL then the one which uses Harbour RTL
  • Added optimizations for add and div by integer value
  • Support for detecting startup function in C++ mode
  • Optimized hb_vmPlus() to avoid reallocation of just allocated memory.
  • Implemented symbol tables recycling for dynamic PCODE loading/unloading
  • Added optional string and code block cloning if they are created from dynamically loaded PCODE.
  • Updated .hrb files to use symbol tables recycling
  • Added support for static variables in DLLs
  • Added support for INIT/EXIT procedures executing
  • Changed the handler returned by LIBLOAD() from numeric to pointer.
  • hb_vmProcessSymbols() returns symbol table adress
  • Added missing dynamic memory allocation for string items created by dynamically loaded PCODE in HB_P_LOCALNEARSETSTR
  • Added counter with number of free symbol tables to not scan for free tables at program startup
  • Removed HB_FS_ALLOCATED from hbvmpub.h
  • Changed the code for hb_symbolNew() to avoid possible memory leak alerts and keep the list of all dynamic symbols accessible. It also reduced the size of memory allocated for new symbols.
  • Added support for loading dynamic libraries (.so) in Linux. dlopen()/dlclose() are POSIX standard functions so it should also work in other *nixes but it may need additional library on linking (dl in Linux). That's why it's not enabled at this time.
  • Fixed missing condition on bCanRetry where it may have been recovered already.
  • Added hb_itemGetSymbol() to ItemAPI.c
  • Added hb_itemMove() macro mapped to hb_itemForwardValue()
  • Updated hb_vmProcessDllSymbols()/VM_PROCESS_DLL_SYMBOLS to return registered symbol table and use the same parameters as hb_vmProcessSymbols()
  • Changed to keep parameter references in DO() function. Now it works like IIF()/EVAL() and HB_LIBDO()
  • Added HB_LIBERROR() which returns string with information about error which appeared in LIBLOAD()/LIBFREE(). For now, it only works for Linux.
  • Fxed hb_rddGetFieldValue() to not operate on unallocated stack area
  • Added HB_EXPORT to hb_stackNewFrame() and hb_stackOldFrame()
  • Removed a REVIEW comment and uncommented an hb_stackPop() in HB_P_ENDFINALLY
  • Added parenthesis to hb_stackItem() macro.
  • Fixed codeblock body cloning.
  • Added SET PATH directories for file search in __MVRESTORE function
  • Fixed HB_P_MACROPUSHINDEX. Fixed GPF in direct uninitialized HB_ITEM assignment and fixed memory leak.
  • Changed hb_objHasMessage() to not return TRUE when OnError message is set
  • Fixed hb_vmPushVariable() to not work on not allocated stack item.
  • Do not generate RT errors "Alias does not exist" in constructions like: ("NOT_EXISTING_ALIAS")->(...). Clipper compatible modifications. I do not like it but current previous behavior made problems for people who have code like:
    if ("NOT_EXISTING_ALIAS")->(used())
       ? "Table not open..."
  • Fixed some other RT errors to be Clipper compatible
  • Prevents memory corruption when a subclass redefines superclass' DATA.
  • Added hb_gcIncRef() and hb_gcDecRef()
  • Added detection of premature release of HB_IT_POINTER in the garbage collector.
  • Revised hb_itemClear() and hb_ityemCopy() to use new hb_gcIncRef() and hb_gcDecRef() for HB_IT_POINTER
  • Fixed multiple GPF traps in FastItem.c by adding calls to hb_gcIncRef() when pre-existing pointer is copied to new item.
  • Commented out redundant hb_xmemcopy call in itemputc.
  • Fix possible problems related to the table of initial values of instance vars.
  • Change in pointers managed by garbage collector.
  • ulHolders start with 0 in garbage.c now.
  • hb_itemPutPtrGC() increment reference calling to hb_gcIncRef() in fastitem.c.
  • hb_itemClear() decrement reference calling to hb_gcDecRef() and execute hb_gcFree() if not locked with hb_gcLock() in fastitem.c.
  • Use of the pointers protected by a HB_ITEM in inet.c.
  • Delete hb_gcFree() to avoid double elimination and chained of pointers to the structure of thread to be updated when thread finalizes, avoiding errors of access to released memory in thread.c.. These pointers are returned by StartThread() and GetCurrentThread().
  • Add forgotten call to hb_threadIdleEnd() when execute TRY/CATCH.
  • Adopt the new pseudo-function naming scheme in DbgEntry.c.
  • Raise error on possible GPF trap in hb_codeblockGetVar().
  • Added error generation for invalid arguments to HB_SaveBlock() and HB_RestoreBlock()
  • Added error generation incase codeblock exports detached vars in HB_SaveBlock().
  • Modified to directly store/restore uiClass member of codeblock inHB_SaveBlock() HB_RestoreBlock()
  • Fixed GPF trap in __OBJGETCLSNAME() and added support for overloaded types in __OBJGETCLSNAME
  • Added support for overloading HB_IT_HASH
  • Added HASH overloading support to syntax:
    EXTEND [TYPE] ...
  • Corrected usage of hb_param() to hb_paramError() in calls to hb_err*()
  • Restored HASH support in HB_P_IVARREF (used in array assignment syntax hHash["Key"] := Value
  • Added overloading support to HB_P_IVARREF
  • Added prg callable __ClsCntClasses() to return count of defined classes.
  • __CLASSNAME() reverted to return class name only based on numeric handle argument or "" for any invalid argument
  • __OBJGETCLSNAME() revised to not treat numerics as handles but rather always return pure class name of any type argument.
  • Added hb_vmPushDynSym( PHB_DYNS ). It should allow most applications to not use [P]HB_SYMB at all. Removing PHB_SYMB from 3-rd party .c code may allow us to add freeing unused symbol tables from HVM in the future.
  • Fixed GPF when non object item is passed to hb_objHasMessage()
  • Fixed GPF trap in hb_clsValidScope() related to scalar classes.
  • Added: USHORT __cls_CntMethods( USHORT uiClass, PHB_FUNC pFunction )
  • Added logic to detect and raise error when attempting to associate a class which has DATAs to scalar types.
  • Fixed GPF trap in hb_clsInst() and revised to raise error if class handle argument is invalid.
  • Minor improvement to argument validation in __CLSINSTSUPER()
  • Added __CLSINSTNAME( <cClassName> ) which will instantiate if class definition is registered, or else will attempt to call a class function with the specified name
  • Added hb_vmPushDynSym( PHB_DYNS ). It should allow most applications to not use [P]HB_SYMB at all. Removing PHB_SYMB from 3-rd party .c code may allow us to add freeing unused symbol tables from HVM in the future.
  • Added void hb_vmPushEvalSym( void ) for the code which do not want to access any [P]HB_SYMB structures.
  • Added support for TEXT INTO ‹LValue›.
  • Added hb_vmRequest( USHORT uiRequest ).
  • Added Save/Reset/Restore of HVM's s_uiActionRequest so that Desructors are never interrupted from being executed.
  • Increased output error buffer in ErrorAPI.c
  • Fixed debugging of expressions with field references.
  • Set DOSERROR() to oError:OSCODE when RT error is generated. It's documented Clipper behavior.
  • New hb_extIsObject() which works like existing hb_extIsArray()
  • Fixed pointer updating in memory statistic presentation on machines with strict alignment.
  • New functions: hb_dynsymFindSymbol() and hb_dynsymGetSymbol()
  • Minor correction in hb_vmEqual() for hb_objGetOpOver( pItem1 ) & HB_CLASS_OP_EXACTEQUAL
  • Fixed uninitialized memory access.
  • New functions: hb_winmainArgInit() and hb_winmainArgGet() to set/retrieve WinMain() parameters.
  • Use HB_SM_RT_MACRO flag in hb_macro*() calls.
xHarbour Run Time Library (RTL)
  • Corrected file open attribute in Set.c
  • Fixed FHANDLE HB_EXPORT in hb_fsCreateTemp().
  • Fixed few typos in dllcall.c which resulted in GPF traps.
  • Added DataSource DATA to check if TBrowse was called via TBrowseDB() or TBrowseNew(). This is important when the datasource is not a database, but (for example) an array, to control resetting the positioning in the datasource.
  • The Configure() method was fixed to position the row when a row movement is performed before stabilization.
  • Fixed the RowCount and ::nNewRowPos values in the Configure() method of TBrowse.
  • Fixed AddColumn() method to call the Configure() method when the first column is added to avoid a wrong value in ::RowCount (TBrowse).
  • Fixed the bound array access error in ::aRedraw array in TBrowse.
  • Removed the CheckStable() method in TBrowse.
  • Changed TBrowseDB() call from TBrowseNew() to TBrowse() directly to differ how TBrowse() was called in "browdb.prg". See details about the new DataSource property above.
  • Fixed the "@E" picture behavior in date get if "SET DATE BRITISH" is used and "SET CENTURY ON" is called afterwards.
  • Added "@K+" extension picture behavior in _delete() method which empties every get buffer if the first key pressed is DEL. Note that the "@K" picture behavior is not affected by this change.
  • Changed IsBadDate() function to best date verification in "tget.prg".
  • Stripped the leading spaces in HB_HexToNum().
  • Corrected the redundant use of two pDisp->AddRef() occurrences.
  • Fixed the initial value of ::nHeaderHeight and ::nFooterHeight in Configure() (TBrowse).
  • Removed the limitation for AsString method generation to arrays of unsigned char. It is now applicable to all arrays.
  • Changed the Loop() method in order to fix page down and page up movements and home / end key behavior in "achoice.prg".
  • Changed CheckRowsToBeRedrawn() method in order to fix page down, page up, down and up movements in "tbrowse.prg".
  • Fixed number transformation in picture that has no template before decimal sign.
  • Added function HB_StrRemEscSeq().
  • Added support for self class casting.
  • Added flag FC_TEMPORARY to give to support to the creation of real temporary files under platform Windows
  • Removed initialization of :ExitState() in :New() in "tget.prg".
  • Changed Configure() method to call IsDB() to check what kind of datasource is used by TBrowse at first configuration.
  • Fixed GPF trap related to calculated class name or returned dispatch.
  • Changed the Bin2L() call to Bin2U() in the GetRegistry() function. The value of a REG_DWORD should be unsigned.
  • Modified Alt key handling.

    This also modifies alt-numpad key handling.
    When numlock is on, then alt-numpad works as in dos. When numlock is off, alt-numpad returns K_ALT-<key> for each key pressed (ie, K_ALT_LEFT)

    Alt key 'blocking' should no longer be an issue.

  • New function HB_REGEXREPLACE().

    hb_RegexReplace( cRegex, ;
                     cString, ;
                     cReplace, ;
                     lCaseSensitive, ;
                     lNewLine, ;
                     nMaxMatches, ;
                     nGetMatch ) --> cReturn
    See also tests/regexrpl.prg
  • Fixed tbrowse:gobotom() method.
  • Changed DateMsg() method to reposition the cursor at home position of the get after displaying the message "Invalid date" at scoreboard. Note that the previous value of the get is not restored as Clipper does.
  • New static function InvertDwM() in tGet.prg to invert day with month in date var type to use with "@E" picture.
  • Fixed set date format to use with "@E" picture in date var.
  • Reverted change in RefreshCurrent() method to avoid error in colorrect refresh.
  • Fixed the @E in numeric value without any other symbol in the picture. Example: transform( 123456.78, "@E").
  • Fixed dbedit behaviour after append blank.
  • Fix to refresh screen at initialization mode, when a movement key is pressed before the start of dbEdit.
  • Minor fix in _douserfunc() in dbedit.prg.
  • New xHarbour extention: #define DE_INIT for Dbedit initialization.
  • Fixed _douserfunc() to return DE_ABORT if eval() return zero.
  • Fixed bug preventing GT delayed initialization
  • Fixed bug preventing gtAlleg delayed initialization NOTE: INKEY() returns 0 until first GT output
  • New - a few Xbase++ compatibile functions for dynamic calling of dll routines. (not Xbase++ dlls!)
  • Fixed some bugs in tGet.prg in numeric gets:
  • Fixed tGet.prg to display negative numbers correctly in get with or without decimal point.
  • Fixed tGet.prg to not display negative zero.
  • Fixed tGet.prg to not display cursor out of get area if we press dot key in a numeric get without decimal point.
  • Fixed to return numeric value at same format than initial value format, respecting amount of digits after decimal point.
  • Fixed tGet.prg to display and return zero if we press only dot key and not press any digit in a numeric get.
  • Fixed tGet.prg to not display cursor out of get area if we press comma key in a numeric get without decimal point. This is complementary fix of the last tget commit
  • Added drawing mode set capability for SOLID and XOR modes in gtalleg.C.
  • Added 2 misssing gfx primitives in gtalleg.C : gfxMouseX() and gfxMouseY()
  • Fixed tGet.prg's undo method to reset ::minus flag if previous value was negative but ::original not.
  • Fixed tGet.prg to show all commas and dots when we use "@E 999,999.99" or "@R 999,999.99" pictures to numeric get, until exit edit buffer, as Clipper does.
    set confirm on
    nVar := 0
    @0,0 Get nVar pict "@R 99,999,999.99"
    Enter 1234567890. The previous get shows 12 345 678.90 until press enter while Clipper shows 12,345,678.90.
  • Changed HB_NEW_KCTRL to HB_EXT_INKEY in gtalleg.C, new control codes was not working anymore.
  • Fixed VarGet() method do return numeric values in accord with pictures.
  • Fxed ParsePict() method to convert negative numeric values.
  • New 'append mode' behaviour for dbEdit. This exact like Clipper's undocumented dbEdit feature. To use it, declare "#define DE_APPEND 3" in your prg and return them from your own dbedit user function.
  • Fixed get clear for "##,###.##" pictures.
  • Fix in TypeFile.prg when displaying the text read from file (Alltrim the text to display)
  • Fixed DbEdit.prg to clean keyboard buffer for each loop, to reset the lastkey value access into user function.
  • Added support for CTRL+A in TEditor.prg select all and some fixes to cut/copy/paste
  • Removed columns check before starting dbEdit(). This is unneeded because cause a bad behaviour, if we pass any empty element in column array.
  • Fxed HowMuchNumeric() function in tGet.prg to show value in numeric var with picture "@E 999.99 %".
  • Fxed ParsePict() method in tGet.prg to not extract left spaces before "9" in picture of numeric var, example "@E 999.99".
  • Fxed VarGet() method in tGet.prg to maintain ::original value when exit with ESC before start get edition.
  • Fix to recent negative index support in [] overloading
  • Removed tracelog and fixed text selection in tEditor
  • Fixed get of negative number small than 1 in tGet.prg
  • Fixed TGet.prg to show commas and dots in display while edit numeric vars with pictures "999,999.99" , "@R 999,999.99" or "@E 999,999.99".
  • Fixed TGet.prg to avoid any char prior to "@" into picture.
  • Fixed End() method in TGet.prg to repos cursor in a correct position when a non numeric get has picture with dot and/or comma.
  • fixed todecpos() method to not convert to zeros when in the initial value of a numeric get is not zero and we press enter. The correct value must be initial value instead zeros.
  • Fixed ParsePict() method in TGet.prg to not avoid spaces after function symbol and before templates, in the mask.
  • Fixed Untransform() method in TGet.prg to adjust correct return value in numeric get if var get is without picture and display buffer is empty.
  • Fixed Input() method in TGet.prg to not allow input of "-" (minus sign) in numeric get after decimal dot, if any.
  • Fixed Persist.prg to make it possible to de-serialize objects which contain collections (like arrays) of other objects.
  • Corrected gt_preExt in GTWin.c
  • Fixed alert.prg to force alert to be on the screen.
  • Added missing 3 param in method declaration seciton (CLASS...ENDCLASS) for ::LoadFromFile() and ::LoadFromText() methods.
  • Added CATCH logic to avoid HB_SetWith( &( cLine ) ) [line 193] to leave app hung up in memory with no kind of clue as of to what went wrong in case of wrong class name stored while loading a persistent object.
  • New HB_Decode() function. Usefull function to decode a var using an inline command instead of a sequence of IF, or CASE or SWITCH. Less efficient in speed comparison, but very compact to write.
    hb_Decode( cValType, "C", "test", "D",;
               CToD( "01/03/2006" ), "L",.T., NIL )
    hb_Decode( nVal, 1, "test1", 2,;
               "test2", 3, "test3", "default" )
    hb_Decode( cVal, "A", {|| a+1 }, "B",;
               {|| b+1 } )
  • Fix in ::configure() in TBrowse.prg. Commented out ::lNeverDisplay to not permit to check if a browse has limited rows to display. This happens when we have a browse with only one line. Also modified ::RedrawHeaders() for the same reason.
  • Fix in TBrowse.prg in ::configure(). This fixes the position of current RowPos in browse and in oDataCache. (Also in datacache class modified nCurRow var to be assignable). This is needed when we have to change directly position of current rowpos as in Array browsing.
  • Added Pointer handler to hb_gtSetCloseHandler() in GTApi.c. This permits to call SetGtCloseHandler() passing a function reference like SetGtCloseHandler( @Check_Exit() ).
  • Added K_MWFORWARD and K_MWBACKWARD to ::InitKeys() in TBrowse.prg
  • Expanded ::HitTest() in TBrowse.prg to cover all HT* defines. Now it is possible to cover all points inside browse with mouse
  • Changed ::DrawARow() method in TBrowse.prg. When it draws empty lines it has to use standard tbrowse colors and not evaluates column colorblocks
  • Reset ::lUndo to .f. in ::SetFocus() in TGet.prg to avoid clearing of get in case of re-use after an ESC.
  • New GTGUI GT driver which supports TONE and CLIPBOARD functionality only and is hacked to overload the default GT driver in multi GT compilation to make Windows users happy.
  • New hb_gtSetDefault() function in GTNul
  • Fixed GTWIN so it work also in Windows GUI applications now
  • Fixed wrong break position in Math.c
  • Added hb_DecodeOrEmpty(). This is the same function as hb_Decode() but returns an empty value of passed value instead of NIL
  • Change method CheckRowPos() in TBrowse.prg to fix some issues with the redraw of the screen when not on the first row and the user "reconfigures" the browse.
  • Fixed soft-CR using in MEMOLINE function in TxtLine.c
  • Fix in TBrowse.prg to deal with frozen columns in tbrowse:hittest and HTFOOTING only if ::lFooters
  • Fix in TBrowse.prg; TDataCache:GetCell - check for !empty nRow and nCol
  • Fix in TBrowse.prg; Tbrowse:hilight and :dehilight check for :nRowPos>0
  • Fix in TBrowse.prg; Tbrowse:refreshcurrent check that ::nRowPos>0
  • Fixed Clipper compatability in TGetInt.prg of :Type for GET aVar[...] when :Display() is NOT called.
  • Fixed decoding a nested array in Decode.prg
  • Added hb_DecodeOrEmpty() function in Decode.prg that returns an empty value of checking value parameter instead of NIL.
  • Register "GUI" GT as default by executing hb_gtSetDefault( "GUI" ) at startup in gtdef.c
  • Added support setting default GT driver by REQUEST HB_GT_<name>_DEFAULT Now you can use this in your source code:
    to force linking four GT drivers and setting WVT as default one in MULTI GT builds. If code is linked dynamically with harbour.dll which contain all GT drivers then to set the default one it's enough to add to .prg code:
    For example :
  • Changed ::naTextLen to Len( ::aText ) in TEditor.prg
  • Fixes from in TBrowse.prg on method LeftDetermine() and function TBMouse()
  • Try set Fullscreen first, before trying windowed mode in GTAlleg.c
  • Fixed bound error in TEditor.prg when ::LastRow() is zero and we press <Enter> at insert mode.
  • Fixed ::GetText() method in TEditor.prg to avoid bound error when ::LastRow()=0.
  • Fixed bug in MemoEdit.prg; userfunction = .f. wasn't exiting.
  • Fixed <cString> argument in MemoEdit.prg verification when it is a memo field.
  • In TEditor.prg, restored K_ALT_W previous behaviour in edit() method.
  • Fine-tuned k_esc() and k_bs() methods in TEditir.prg
  • Fixed MemoEdit.prg to assign ME_UNKEY to udf when <ESC>, <ALT-W> or <CTRL-W> is typed.
  • Fixed problem in GTApi.c regarding wselect(0) and wselect(n)
  • Add hb_gtDispBegin() and hb_gtDispEnd() in hb_ctWSelect()
  • Fixed K_Bs() method (backspace) in TEditor.prg to repos the cursor at end of previous line.
  • Changes in TEditor.prg for HB_EXT_INKEY use only.
  • Fixed TEditor.prg to exit and save with K_ALT_W if HB_EXT_INKEY is declared.
  • Changed method K_Del() in TEditor.prg. Pressing DEL if a text selection is active, delete the selected text.
  • Changed SetTexSelection() method in TEditor to select and unselect text in any direction ( shift-down/up and up/down).
  • Fixed the GetTextSelection() method in TEditor.prg to return only selected lines.
  • Fixed AddText() method in to insert lines accordly. This was inserting an empty line before and after of the selected text.
  • Changed Ctrl-C in TEditor.prg to maintain selected text after copy.
  • Fixed Edit() method in TEditor to call ::ClrTextSelection() after any movement or edition key.
  • NOTE: As xHarbour Builder is build with -DHB_EXT_INKEY flag, you must declare #define HB_EXT_INKEY in your main prg to avoid unexpected results.
  • Removed aUnhandledKeys DATA in MemoEdit.prg.
  • Added aExtKeys DATA in memoEdit.prg for use with HB_EXT_INKEY only.
  • Added K_SH_LEFT and K_SH_RIGHT in aExtKeys data to allow select text at shift-right/shift-left keys.
  • Removed nLineLength argument treatment in MemoEdit.prg, transferred to HbEditor.
  • Changed New() method in TEditor.prg to fix nLineLenght treatment in compliance with Clipper. If nLineLengh is nil, lwordwrap will be true and nWordWrapCol will be nRight-nLeft+1. If nLineLenght is < 0, nLineLenght will be 255 and lWordWrap will be .f., otherwise nLineLenght will be Max(6,nLineLength).
  • Added text selection in TEditor.prg at shift-right and shift-left keys.
  • Changed nSelStart data to nRowSelStart, nSelEnd data to nRowSelEnd in TEditor.prg.
  • Added new nColSelStart and nColSelEnd datas in TEditor.prg.
  • Added nTextRow, nTextCol, nWndRow and nWndCol datas to future use in TEditor.prg.
  • Changed SetTextSelection() method in TEditor.prg to work properly wih shift-down, shift-up, shift-right and shif-left keys.
  • Changed TEditor.prg to call Clttextselection() method if any movement/edit key is typed by keyboard or mouse.
  • Fixed to process ::aExtKeys in MemoEdit.prg if memoedit is called without udf.
  • Fixed MemoEdit's K_ESC en K_INS key treatment if udf is present.
  • Changed moved() method in TBrowse.prg to call forcestable() if any movement key is pressed before stabilization.
  • Moved lBottom initialization in TBrowse.prg so Tbrowse will not crash with an empty databases.
  • Reverted ValToPrg() in CStr.prg to use the UNmodified original string. Note: Use ValToPrgexp() to use binary encoding and ValToPrg() for normal display
  • Added HASH scalar class sample in TClass.prg
  • Modified AsString in TClass.prg to use ValToPrg() instead of ValToPrgExp()
  • Added StringToLiteral() to CStr.prg and calll it in ValToPrg()
  • Use ValToPrg() in CStr.prg instead of ValToPrgExp() in nested calls from ValToPrg()
  • Further optimization and simplifaction in persist.prg
  • Added codeblock support in hbserial.prg
  • Minor optimization in profiler.prg using __ClsCntClasses()
  • Fixed K_ESC behaviour in MemoEdit.prg that wasn't exit while buffer is not changed.
  • Fixed memoEdit.prg to trap nextkey when a key is inserted into buffer by setkey.
  • Fixed bug in TEditor.prg related to ME_TOGGLESCROLL behaviour.
  • Fixed bug in TEditor.prg related to selection text and paste behaviour.
  • Added support in TEditor.prg to K_CTRL_RET and (K_SH_END and K_SH_HOME) selection keys.
  • Improved support for nested objects in ValToPrg[Exp]()
  • Revised persistance of codeblocks to generate informative alternate block instead of error when codeblock can not be persisted.
  • Added PrgExpToVal() to CStr.prg
  • Fixed bound error in MemoEdit.prg with ntop,nleft,nbottom,nright coordinates.
  • Fixed ::settextselection() method for column selection with shift-right/shift-left keys.
  • Now the caption of the CheckBox is highlite when has focus like in C5.3
  • Added C level hb_hextonum() function in hbhex2n.c
  • Added accesses, assigns and methods in TBColumn.prg for each property to allow verify their values before assign it.
  • Fixed width property assign: width := x or width(x) in TBColumn.prg.
  • Removed old o_Blank constant and 12nd element (NIL) of ::aColInfo array in TBrowse.prg.
  • Removed ColorToDisp() function in TBrowse.prg.
  • Renamed prefixes of tbcolumn info constants from "o_" to "TBCI_".
  • Assigned new values to TBC_CLR_ constants to allow change heading and footing color index.
  • Added DefColorOK() function to avoid access to unknowable color index from colorspec.
  • Added C level hb_hextonum() function
  • Added directive #ifdef HB_COMPAT_C53 to defcolor array and setdefcolor() method in TBColumn.prg.
  • Adjusted TBC_CLR_HEADING and TBC_CLR_FOOTING constant values in conformity with HB_COMPAT_C53.
  • Moved EvalSkipBlock() method source out from #ifdef HB_COMPAT_C53.
  • Added support for KEYBOARD { nInteger, cString, cString2, nInteger2, ... }
    KEYBOARD nInteger
    KEYBOARD cString
  • Added __KEYBOARD( xData, lAddToExistingBuffer ) ( Default = .F. ). The second parameter determines if we want xData added to the existing keyboard buffer contents ( .T. ) or replaced.
  • Updated __SetFunction() to support numerics and arrays argumnts now supported by __Keyboard()
  • Added reset of DispBegin()s (thnx to Leo Letendre)
  • Added UTF8 related functions: hb_cdpUTF8StringLength(), hb_cdpStringInUTF8Length(), hb_cdpUTF8ToStrn().
  • Changed name of hb_cdpStrnToUTF() function to hb_cdpStrnToUTF8() to avoid confusions with UTF16.
  • Fixed size of given string setting in Regex.
  • Generate 2001 RunTime error in dbDelim.prg when the work area is not in use before the export file is created.
  • Fixed GPF trap f.e. ctod('0115.2005') and optimized to avoid redundant indirections ints -> string -> ints
  • Removed date range checking with minor typo inside.
  • Set 0 at the end of destination string in hb_cdpStrnToUTF8()
  • Added optional BOOL parameter to functions which translate to UTF8 to not translate control code characters.
  • Fixed invalid handle error in Windows when file() fails (detected by AQTime profiler). It used to produce fancy GPFs when file() returns .F. massively.
  • Added support for VTWrraper() class - for now only VT_UNKNOWN and ( VT_UNKNOWN | VT_BYREF ) in WinOle.prg
  • Fixed GPG trap for VT_UNKNOWN in hb_oleVariantToItem()
  • Removed static s_OleRefFlags.
  • Fixed GPF traps related to aPrgParams being static - changed to local
  • Fixed GPF trap related to empty RegEx.
  • Fix in TBrowse.prg; Don't crash on zero-sized caches in TDataCache():FillRow().
  • Fixed ValToPrg() and ValToPrgExp() to correctly convert strings with Chr( 0 / 10 / 13 ).
  • New hb_strMatchWildExact() function.
  • Added 3-rd parameter <lExact> to WildMatch() - when it's TRUE. WildMatch() will check if given pattern cover the whole string. Without it it check if pattern is valid prefix only.
  • Fixed positioning error in HB_REGEXALL(). Thanks to Maurilio Longo for locating it.
  • Fixed bound error access/assign in TBrowse.prg to ::aCache array under some conditions. Created static function ChaceOk() to verify ::aCache validity before assign/access it. Changed RefreshCurrent() method to avoid multiple trigger before stabilization, that generate tbrowse instability.
  • Modified Alt key handling.
xHarbour Preprocessor
  • Reduced MAX_CICLES to 256 in ppcore.c. This should be more than enough.
  • Few fixes in handling of \ in ParseCommand() and ConvertPatterns()
  • Added support for \\ in ParseCommand() and ConvertPatterns()
  • Fixed and greatly simplified handling of \ in ConvertPatterns()
  • Fixed GPF trap related to #[x]uncommand with previous #[x]command with empty value. For example:
    #xcommand TRACELOG( <x> ) =>
    #xuncommand TRACELOG( <x> )
  • Fixed wild match markers to consume lines beyond ';' even when current line reached EOL
  • Fixed wild match markers to only consume ';' when pending line[s] are not empty.
  • Fixed wild match markers to pre-process text of pending lines.
  • Added #define directive to list of directives which retain pending lines as 1 unit
  • Fixed all END* rules to not use wild match markers, which is buggy for compounded rules such as
  • Added #error to list of directives trigerring bRule in hb_pp_ParseExpression()
  • Fixed getExpReal() to accept unmatched ( { and [ as valid expression (Clipper compatibility
  • Few fixes to E"..." support
  • Fixed bug in handling of E"..." - was activate for any token ending with E before a "..."
  • Added error reporting if #include directive has any non space characters after the file name
xHarbour Debugger
  • Fixed displaying BOF() value for both BOF() and EOF().
  • Avoid TBrowses with null height. Fixed recursive repaint issues.
  • Switch to an open work area if the current one is !Used().
  • Correctly reposition windows after hiding the monitor window.
  • Added Ctrl F and Space as equivalents for PgDn and Ctrl B as an equivalent for PgUp in the help browser.
  • Codeblock tracing is ON by default.
  • Let the compiler generate debug info for GLOBAL EXTERNAL variables.
  • Collect GLOBAL EXTERNAL variable info.
  • More speed optimization.
  • By default, display only GLOBAL and GLOBAL EXTERNAL variables declared in the current module. Added an option to display all GLOBAL variables.
  • Strip pathname from module filenames.
  • Let the compiler generate stop line number information in bitmap format together with respective source file names and let the debugger use this new line number information.
  • Allow user to select a source file from list of known source files.
  • Added support for hashes
  • Added "@S" picture mask for ::InputBox() method
  • Implemented mouse click on "close" button for ::InputBox() method
  • Fixed reporting of local variables in variadic functions.
  • Fixed an error when navigating through workareas from a free workarea.
  • Fixed stabilization in the dbinfo and structure window when navigating through alias window.
  • Fix in determining valid stop lines.
xHarbour RDD
  • Added capabilitie of SET OPTIMIZE ON |OFF over filters In the RDD that admit optimization, p. ej. BMDBFCDX, SET OPTIMIZE it determines if the filters will be optimized using the open order formations in the area of present work. If this indicator is activated (ON), controller RDD will optimize the search of registries that fulfill the condition established by the filter, diminishing the reading of data of the file of data base. If the indicator is deactivated (OFF), it does not optimize itself.
  • Added support for NULL value set in memo fields by ACCESS
  • Added support for all CL5.3 BLOB*() functions.
  • Added new RDD DBFBLOB compatible with CL5.3 DBFBLOB. It operates on memo files only (.dbv) without tables (.dbf). To create .DBV file use:
    dbCreate( cFile, {}, "DBFBLOB" )
  • Do not report error when empty structure table is passed to DBCREATE() CL5.3 allow to create even DBF files without any fields.
  • Added default SYSNAME method
  • Fixed possible memory leak when APPEND failed in TRANSREC method
  • Fixed using HS_ADD()/HS_REPLACE() without STRING/BLOCK expression in HSX.
  • New DELIM RDD. It's fully Clipper compatible in comma files parsing. Unlike in Clipper, in xHarbour these RDD can be used also in direct import operations with APPEND FROM ... VIA "DELIM". This RDD also supports whole record transfering between RDDs if they support the same record format and field representation and can translate extended field types like "I", "B", "V3", "V4", etc.
  • Replaced old code of __dbDelim() function in dbDelim.prg with simple calls to __dbCopy()/__dbApp(). This should fix most of the reported incompatibilities in DELIM import/export operations and increase their speed by many times.
  • New SDF RDD. It's fully Clipper compatible in DSF files parsing. Unlike in Clipper, in xHarbour these RDD can be used also in direct import operations with APPEND FROM ... VIA "SDF". This RDD also supports whole record transfering between RDDs if they support the same record format and field representation and can translate extended field types like "I", "B", "V3", "V4", etc.
  • Replaced old code of __dbSDF() function in dbSDF.prg with simple calls to __dbCopy()/__dbApp(). This should fix most of the reported incompatibilities in SDF import/export operations and increase their speed by many times.
  • Added support for table structure inheriting in transfer RDDs.
  • Added eleventh parameter with delimiter to __dbCopy()/__dbApp()
  • Force 10 bytes size for memo fields in DBF and SMT memos.
  • Added some dummy DBI_* actions in base RDD level.
  • Fixed default RDD seting in APPEND FROM / COPY TO
  • Added undocumented Clipper function: __dbTrans(), __dbOpenSDF() and __dbJoin().
  • DBI_LOCKOFFSET now returns DBF record lock offset really used(f.e. updated in FP locking after open/close production index)
  • Fixed setting [V]FP DBF table type
  • Added ARRAYRDD RDD driver and samples. It works actually without ORDER, RELATIONS and something else, but it can be usefull to parse databases in memory.
  • Generate RT error when trying to create a DBF with memo fields without MEMO RDD linked.
  • Added HB_FS_LOCAL to function symbols in registered symbol tables.
  • Removed RDDI_LARGEFILE and return the default WA value (FALSE)
  • Added DBOI_KEYCOUNTRAW and DBOI_KEYNORAW. They work like DBOI_KEYCOUNT and DBOI_KEYNO in pure DBFNTX. Only with some upper level RDDs like RMDBFNTX which supports bitmap filters they can return different results.
  • Removed SYSNAME() method - use the default WA one.
  • Removed ORDCOND() from ( it's not normal function )
  • Moved pseudofunction ORDCOND() from to
  • New __dbOpenSDF() function
  • Keep strict Clipper compatibility in DBCREATE() parameters. The 6-th parameter is optional delimiter used by some RDDs like DELIM
  • New __dbTransRec() and updated to use it like in Clipper
  • Updated dbsort.prg, dbstrux.prg and dbjoin.prg for strict Clipper DBCREATE() parameters
  • Removed ORDCOND(), __dbTransRec() and __dbOpenSDF() from dummy.prg
  • Removed redefinition of #define RDT_FULL in arrayrdd.prg
  • Added extended COPY TO ... DELIMITED ... / APPEND FROM ... DELIMITED ... to support some other common formats.
     // uses chr(9) as field separator and without string delimiters
      // uses '|' as field separator and without string delimiters
    COPY TO ... DELIMITED WITH ( { cStrDelim, cFldSeparator } )
    APPEND FROM ... DELIMITED WITH ( { cStrDelim, cFldSeparator } )
      // allows users to set and any character field
          delimiters and fields separators
  • Always initialize all members in RDD structures to avoid GPF when some RDD will try to access uninitialized data
  • Fixed GPF in DBF2TEXT when work are is not in use.
  • New 'Y' (currency) field support - mapped to double
  • Fixed several bugs in sort command.
  • Removed no longer necessary using of temporary aliases.
  • Added DBI_SCOPEDRELATION action in WorkArea.c. It alow to test if given relation on current work area sets scope on child index. F.e.: dbInfo( DBI_SCOPEDRELATION, 1 )
xHarbour DBFCDX
  • Corrected OrdKeyGoto(nKeyNo) on a DBF without index and with filter (it was positioned in nKeyNo + 1).
  • Fixed ordKeyPos() - for records out of scope
  • Fix for update current order number after ordDestroy()
  • Fixed scope checking when skip is done from the record which dos not exist in index
  • Clear the logical key position buffer for pending relations or hot record buffer updating
  • Updated internal production index flag after manual opening production index.
  • Disabled early retrieving from the cache key position and key count
xHarbour DBFNTX
  • Fixed ordKeyGoto() - only the index file was repositioned and the record in DBF was not changed.
  • Fixed skip back after updating last record.
  • Do not interrupt subindexing when new record is concurrently added by other station
  • Disabled validation of unused index pages - Clipper left them dirty so xHarbour reported that index is corrupted.
xHarbour RDDADS
  • New unmodified file from latest (81) ADS sdk. Original file had 1 xHarbour modification which was moved to rddads.h
  • Corrected 2 undocumented funs declaration to be guarded by the appropriate #ifdef and placed inside the HB_EXTERN section
  • Updated default of ADS_REQUIRE_VERSION to 8.1 - users of ADS version 6, will need to add a -DADS_REQUIRE_VERSION=6 to their make file[s]
  • Synched adsmgmnt.c with some ADS structure modification in the 8.1 sdk - should not affect binary compatability with older client versions
  • Added possibility to save memo fields bigger than 64K.
  • Inverted checking for memo data types, verifying binary first, to prevent freeze in some empty ADT tabes.
  • Make GOTOP() when new index is open and is set as control one.
  • Fixed bug where the Found flag set by AdsSeek() was incorrect. This code is activated only when ADS cannot serve a filter itself and filtering is done at the app level. If the first "hit" from a seek landed on a bad record, SKIPFILTER would move to the appropriate following record but the Found() flag was wrong.
  • Fixed ADT creation bug with > 450 fields
  • Fixed location and slashes for and in include/
  • Fixed AdsDDSetDatabaseProperty arg list and buffer sizing. (bug was failure in setting new admin password)
  • Removed dead code from AdsConnect60 in adsfunc.c
  • Fixed AdsDDGetUserProperty arg validation and buffer sizing. Notice change in parameters!!
    It's no longer necessary to allocate a buffer in prg code nor pass the length of that buffer, BUT cProperty must be passed by reference. nConnectionHandle was 5th arg before, now it's the 4th.
  • Removed unused variables and some minor cleanup.
  • Fixed adsFlush() to commit changes for both local and remote servers.
  • Call AdsFlushFileBuffers() only when _SET_HARDCOMMIT is set (default)
  • Fixed bug where skipping FROM eof would go to record 1. Somewhere we lost one of the special handling items for how ADS is radically different from Clipper. The fact is, ACE32 will skip off of EOF to record 1 !!! We instead need to trap that condition and do nothing, of course.
xHarbour CT.LIB
  • Function HB_FUNC_STATIC( SETATTRIBUTE ) is active again but it is now guarded by #ifndef __PLATFORM__Windows
  • Fixed showtime() function to work at multiple calls.
  • All date/Time functions rewritten in C
  • New support for 32-bit numbers in NumAnd(), NumOr() and NumXor() for clipper compatibility.
  • Changed the default value of cPad parameter in NToC() in "numconv.prg".
  • Fixed ShowTime() function: time is displayed only on screen and is not printed if "SET DEVICE TO PRINTER" is set while ShowTime is active under GTWin.
  • Added codepage support for PosAlpha() function.
  • Fixed ShowTime() function which showed the time when it was called (without parameters) more than once.
  • Floor() and Ceiling() returned a INT with a cast from a Double instead of using HB_RetNLen.
  • Added save/restore of SetCursor() settings to HB_ShowTimeClock().
  • Fixed SAYSCREEN() to work properly on Linux. Fixed provided by Mario
  • Fixed small Clipper incompatibility in Center()
  • Fixed small Clipper incompatibility in ShowTime() - display time on physical screen
  • Fixed small clipper incompatibility in Center()
  • Fixed small clipper incompatibility in ShowTime() - display time on physical screen
  • Updated exename function to return properly under windows in ctmisc.prg
  • Fixed RANGEREPL and RANGEREM functions. They where not respecting values =chr(128)
  • Fixed very bad GPF traps in PosIns() and PosDel()
  • Fixed cton() function with incorrect argument.
  • Added codepage support for posupper/poslower functions.
  • Fixed PosDel() with empty first argument and not empty second argument
  • Added codepage support for tokenupper/tokenlower functions
  • Fixed hexadecimal character argument conversion in the CT bit functions,
  • Fixed hexadecimal character argument conversion in the CT bit functions.
  • Fixed possible hb_xgrab() call with zero length.
  • Replaced hb_fsWrite and hb_fsRead with hb_fsWriteLarge and hb_fsReadLarge for STRFILE() and FILESTR() functions.
  • Use WildMatch() with .T. 3-rd parameter - this is the CT3 LIKE() behavior.
xHarbour LIBNF.LIB
  • Fixed FT_FUse: FT_FUse(0) returns the next unused textarea.
  • Fixed FT_GETE() to work under windows platform.
  • Fix on windows detection in Numlock.c and Caplock.c
  • Changed Origin.C to not access **__argv directly.
xHarbour GTWIN.LIB
  • Corrected gt_preExt.
  • Fix in Alert.prg to force it to be on the screen.
  • Correct potential stack overflow in gt_setmode
  • Removed no longer used GTI_XCURSOR*
  • Added GTI_CURSORBLINKRATE to control cursor blinking frequency in milliseconds.
xHarbour GTWVT.LIB
xHarbour GTWVW.LIB
  • Changed WM_CLOSE behaviour to support hb_gtHandleClose()
  • Rewritten hb_wvw_gtDrawImage(). Now it supports displaying transparent image if bTransp parameter is TRUE.
  • Modified hb_wvw_gtRenderPicture()to support displaying transparent image if bTransp parameter is TRUE.
  • Added lTransp optional parameter to HB_FUNC( WVW_DRAWIMAGE ). Supports displaying images with proportional height/width ratio.
  • .PRG callable wvw_SetMaxBMcache() to get/set maximum number of bitmap cache for WVW_DRAWIMAGE.
  • .PRG callable wvw_NumBMcache() to get current number of bitmap cached by WVW_DRAWIMAGE.
xHarbour TIP.LIB
  • METHOD Boundary(nType) - used for creating and boundary key when using a multipart form post.
  • METHOD Attach( cInputName, cFileName, cMimeType ) - used to include files when posting using ::postmultipart()
  • METHOD PostMultiPart( cPostData, cQuery ) - used to submit a form via the multipart protocol which is mainly used when there is a file to upload.
  • Added method WriteAll( cFile ) to save ::ReadAll() to a file
  • Fixed garbage in Post: cData[-1] = "" leaves the last byte dirty
  • Removed alltrim( cTmp ) in Post to fix send of hb_serialize()
  • Added CLASS <x> to METHODs lines
  • removed ::hHeaders[ "Content-Length" ] := Ltrim( Str( Len( cBody ) ) ) from SetBody method. Seemed to be a workaround for not using the "boundry" correctly
  • Added ::lBodyEncoded:=.t. to prevent an extra crlf being appended in SetBody
  • Fix in ToString() method: message body has to be encoded when there are attachments.
  • Fix in ToString() method: attachments getting an extra crlf before the boundry
  • fixed :write() - no need to check for ::oUrl:cUserId as a prereq. as we may not have an Auth connection.
  • New very basic CGI class with cookies and sessions.
  • Fixed :mget(). It now uses :downloadfile() instead of :retr()
xHarbour USRRDD
  • Replaced hb_stackPush() with hb_vmPushNil()
  • new additional validations in RDD structures <-> item conversions
xHarbour HBZIP.LIB
  • Fixed Possible memory leak.
  • Updated to use xharbour api insted of direct usage of HB_ITEM structure
© 2024 All rights reserved.
Contact us | Terms of Use Agreement
xHarbour.ORG is maintained by Enrico Maria Giordano
Internet services kindly provided by