* src/rtl/itemseri.c
* minor update in comments
* contrib/hbct/ctwin.c
* src/rtl/hbgtcore.c
! fixed GTCTW window handle save/restore on debugger activation
I broke in 107b36e847
Thanks to Rolf for the info and patch.
* contrib/hbziparc/ziparc.prg
* synced with Viktor's branch.
This code should contain Rolf fixes. Please test.
* src/rtl/gtwin/gtwin.c
+ added support for disabling [x] button of console window in older
MS-Windows versions which do not have GetConsoleWindow() function,
i.e. Win9x/ME
* include/hbserial.ch
* src/rtl/itemseri.c
+ added HB_SERIALIZE_IGNOREREF flag.
This flag fully disables logic used to detect multireferences to the
same complex (sub)items like arrays or hashes. It increses the speed
of serialization but serialized data does not contain any information
about refences, i.e. aVal[ 1 ] and aVal[ 2 ] in code below:
aSub := { 1, 2, 3 }
aVal := { aSub, aSub }
are serialized as separated arrays. Additionally items with cyclic
references like:
aSub[ 2 ] := aSub
cannot be serialized at all with HB_SERIALIZE_IGNOREREF flag because
it will create infinite serialization loop and crash with out of
memory message.
* src/rtl/itemseri.c
% rewritten algorithm used to detect cyclic and multi references in
serialized items. The original algorithm has very high overhead when
huge arrays were serialized, i.e. serialization of array with 1'000'000
of subarrays needed about 30 minutes on my i5@3.30GHz. Now it needs
less then a second and this time is only a little bit bigger then
used by serialization with HB_SERIALIZE_IGNOREREF flag.
This modification improve performance also in other code using Harbour
serialization mechanism like I18N files, HBNETIO, GTNET, ... when large
arrays or hashes are saved or transmitted.
* include/hbapi.h
* include/hbapicls.h
* src/vm/arrays.c
* src/vm/classes.c
* src/vm/hashes.c
* src/vm/itemapi.c
* replaced algorithm used to detect cyclic and multi references in
array and hash clone operations with new one similar to current
item serial code. The speed improvement for very large arrays is
the same as in case of serialization code.
* src/rtl/gtsln/mousesln.c
! typo in while loop - synced with Viktor's branch
* contrib/hbtip/mail.prg
! fixed missing 1-st adress in CC and BCC parameters - many
for information about the bug and patch
* contrib/hbtip/sendmail.prg
! typo in comment - thanks to Heinz V Bergen too
* src/rtl/gtwvt/gtwvt.c
* some minor modification to sync code with Vitkor's branch
* src/vm/hvm.c
* src/vm/itemapi.c
* small optimization in string comparison
* extras/gtwvw/gtwvwd.c
! fixed typo in WVW_SETICON() - thanks to Ash
* src/rdd/dbcmd53.c
! typo in comment
* src/rtl/dateshb.c
% use hb_retclen() instead of hb_retc() when size is well known.
* src/rtl/valtoexp.prg
% use hb_defaultValue()
* src/vm/estack.c
* minor cleanup
* src/vm/fm.c
* modified a little bit HB_MEMINFO structure to force strict alignment
+ added debug code covered by HB_FM_FORCE_REALLOC macro which forces
allocateing new block in each hb_xrealloc() call
! protect realloc() in HB_FM_STATISTIC by mutex, it fixes issue #77.
* src/rtl/hbproces.c
% unlock HVM waiting for process in OS2 builds
! build array of argument passed to process in hb_processRun() in
parent process not forked one. It fixes possible deadlock in forked
process because memory is allocated to create arguments array and
in MT program memory managers may use mutexes internally which can
be cloned to forked process in locked state.
It fixes seldom and random HBMK2 freezing during compilation
with -jobs=<n> parameter.
* utils/hbmk2/hbmk2.prg
! fixed race condition in concurrent C compiler execution (-jobs=<n>)
with script file
* src/debug/dbgentry.c
! fixed crash when wrong expression is used as tracepoint
! fixed expression analyzer to correctly recognized extended strings e"..."
* formatting
* src/debug/dbgbrwsr.prg
* src/debug/dbghelp.prg
* src/debug/dbgtarr.prg
* src/debug/dbgthsh.prg
* src/debug/dbgtinp.prg
* src/debug/dbgtmenu.prg
* src/debug/dbgtobj.prg
* src/debug/dbgtwin.prg
* src/debug/dbgwa.prg
* src/debug/debugger.prg
* added calls to ::NotSupported() method for some still missing
functionality
! do not use SetColor() but directly pass colors to used objects
and functions
! do not use SetPos() and Row()/Col() for core functionality - it was
source of few minor bugs
% enable cursor only in input objects and disable it just after
% eliminated code to save and restore cursor position and shape
! fixed initial positioning in help window
+ implemented HiLite() and DeHiLite() methods in HBDbBrowser() class
! fixed positioning when end of source data is reached in browser
% eliminated some redundant or completely useless code and comments
% use some fully functional HBDbBrowser() features instead of manual
encoding similar functionality
! validate watchpoint and tracepoint expressions
% use SWITCH statements
! fixed expression presentation (added __dbgValToExp() and __dbgValToStr())
! fixed input for new expressions
! fixed browser scrolling in object inspector
! fixed inkey() processing inside debugger (ALT+D and ALT+C)
! fixed browsers highliting in WA inspector
! fixed hardcoded limit for 512 workareas in WA inspector
! fixed initial WA positioning in WA inspector
* resized WA inspector window
* many other minor fixes and improvements
* contrib/hbwin/olecore.c
+ added some additional error codes to win_oleErrorText() function
* contrib/hbwin/hbole.ch
+ added OLE error code definitions with WIN_* prefix for errors returned
by win_oleErrorText()
* contrib/xhb/xhb.hbx
* contrib/xhb/xhbole.prg
+ aded new function OleDefaultArg()
% minor simplification
* src/rtl/itemseri.c
* do not generate RTE when wrong string is deserialized.
Now RTE 3016 is generated only when compressed data is deserialized
and ZLIB is not linked with final binaries so users can easy locate
the source of problem.
* src/vm/garbage.c
% added missing static in s_gcSpinLock declaration
* src/rtl/hbi18n1.c
* typo in comment
* src/rdd/dbf1.c
* src/rdd/dbffpt/dbffpt1.c
* src/rdd/dbsql.c
* formatting
* src/rdd/usrrdd/rdds/logrdd.prg
* src/rdd/usrrdd/usrrdd.c
* src/rtl/checkbox.prg
* src/rtl/getsys.prg
* src/rtl/listbox.prg
* src/rtl/menuto.prg
* src/rtl/pushbtn.prg
* src/rtl/radiobtn.prg
* src/rtl/radiogrp.prg
* src/rtl/scrollbr.prg
* src/rtl/tbrowse.prg
* src/rtl/tget.prg
* src/rtl/tgetint.prg
* src/rtl/tgetlist.prg
* src/rtl/tmenuitm.prg
* src/rtl/errapi.c
* src/rtl/hbgtcore.c
* src/rtl/hbi18n1.c
* src/rtl/hbinet.c
* src/rtl/idle.c
* src/rtl/math.c
* src/rtl/setkey.c
* src/vm/asort.c
* src/vm/hashfunc.c
* src/vm/thread.c
* accept any EVAL item not only codeblocks. Actually it means that
also SYMBOL items are accepted but in the future we may extend it
and accept also objects of classes with :eval() message.
* src/rtl/tget.prg
! fixed GET default PICTURE for TIMESTAMP type
fixes https://github.com/harbour/core/issues/65
2014-05-11 00:05 UTC+0200 Viktor Szakats
! fixed GET colors when _SET_INTENSITY == .F.
2014-04-22 02:35 UTC+0200 Viktor Szakats
% use Stuff() instead of different combinations of Left() and SubStr()
* include/harbour.hbx
* src/rtl/left.c
+ added new function to replace "=" operator without the SET EXACT ambiguity
in its most common pattern of usage:
hb_LeftEq( <cString1>, <cString2> ) -> <lResult>
it's equivalent to this expression, but faster and shorter:
( Left( <cString1>, Len( <cString2> ) ) == <cString2> )
2014-01-22 03:09 UTC+0100 Viktor Szakáts
+ added hb_LeftEqI(). Same as hb_LeftEq() but case-insensitive.
hb_LeftEqI( <cString1>, <cString2> ) -> <lResult>
2014-02-04 13:38 UTC+0100 Viktor Szakáts
* include/harbour.hbx
* src/rtl/chruni.c
+ added hb_BRAt(). Same as hb_RAt() but for raw/binary strings
2014-06-25 19:54 UTC+0200 Viktor Szakats
* contrib/sddsqlt3/core.c
! fixed missing first record of query
2013-11-08 21:43 UTC+0100 Viktor Szakats
; many of above modification was borrowed directly or try to follow some
changes in Viktor's branch - thanks.
* src/common/hbfsapi.c
* src/rtl/filesys.c
* src/rtl/filebuf.c
* contrib/hbmzip/mzip.c
* contrib/xhb/filestat.c
! if available always use stat64() instead of stat() in *nixes builds.
On 32-bit platforms stat() fails for larger files (>2GB).
It should fix problem reported by Lorenzo.
* src/rtl/filebuf.c
! fixed bad typo inside hb_fileIsLocalName() - result was reverted.
Many thanks to Juan Gálvez for locating the problem.
* src/debug/dbgbrwsr.prg
! fixed typo in previous commit.
It should fix also problem with positioning in debugger source
window reported by Alexey Myronenko.
% minor simplification
* contrib/hbmisc/udpds.prg
! updated to send correct broadcast messages in * nixes and
respect broadcast addresses returned by system for IP interfaces
* src/rdd/hbdbsort.c
* src/rdd/hbsix/sxcompr.c
* pacified warnings
* src/rtl/cdpapi.c
* src/rtl/iousr.c
* src/rtl/hbjson.c
* src/rtl/gtcrs/gtcrs.c
* src/rtl/gtsln/gtsln.c
* src/rtl/gttrm/gttrm.c
* src/rtl/gtxwc/gtxwc.c
* src/rdd/workarea.c
* src/rdd/hbsix/sxcompr.c
* contrib/hbct/token2.c
* contrib/hbsqlit3/core.c
* pacified some of -Wshadow warnings
* include/hbapicdp.h
! typo in comment: bytes -> bits
* src/vm/garbage.c
* src/vm/thread.c
* disabled some code with spinlocks when HB_HELGRIND_FRIENDLY macro
is defined. It causes that final MT HVM code is slower using native
platform mutexes but only such ones helgrind can recognize so the
new macro can be useful for people who want to make some tests with
helgrind. In such case they should rebuild Harbour with
HB_USER_CFLAGS=HB_HELGRIND_FRIENDLY
We use spinlocks and atomic integer operations also in few other
places so it's possible that deeper tests can exploit them and
we will have to cover them by HB_HELGRIND_FRIENDLY too just to
easy detect real problems.
* contrib/gtqtc/gtqtc.h
* contrib/gtqtc/gtqtc1.cpp
* overload inputMethodEvent() in console object and insert
commitString() data into GT keyboard input queue.
It's necessary for Android working with SoftwareInputPanel
and it fixes problem with eaten standard characters.
QT documentation says that QInputMethodEvent are generated
only when Qt::WA_InputMethodEnabled attribute is set but
tests shows that it's not true and these events are generated
instead of keyPress/keyRelease ones for simple text input.
CTRL modifier, ESC, INS, HOME, END, PGUP, PGDN and Fn keys
still does not work with GTQTC in Android builds.
* src/rtl/tbrowse.prg
! fixed compilation with HB_BRW_STATICMOUSE
! do not cover dummy ivar with HB_COMPAT_C53 macro
* minor simplification
* src/vm/arrays.c
* removed old commented code not used with current GC
* src/rtl/filebufd.c
* src/rtl/iousr.c
* slightly modified code to pacify warnings in some older GCC versions
* contrib/gtwvg/gtwvg.hbx
* regenerated with new function
* src/rtl/filebuf.c
! unlock HVM stack before locking local mutex and calling hb_fs*()
functions which also unlocks HVM. It fixes possible deadlock condition
when hb_gcAll( .T. ) is executed.
* include/hbapi.h
* src/vm/garbage.c
! changed mark function semantic.
Adding support for user defined mark function I created race condition
in MT GC code. It happens because blocks marked as deleted were not
scanned by GC mark code so their subitems where not accessible.
To fix it we have to change mark function semantic. Now mark function
can be executed also for blocks currently deleted. It means that GC
block destructor should clean references to just removed items and
subblocks. The best place to make it is clearing pointers to GC blocks
just after hb_itemRelease() or hb_gcRefFree().
It is save to clean the reference just before hb_itemRelease() or
hb_gcRefFree() but only for the single block passed to these functions.
It is not save to clear reference to more then one block and then
execute above functions.
+ check reference count after destructor execution for all blocks
not only arrays - warning it may exploit some wrong C code.
- removed not longer used hb_gcRefCheck() function.
* include/hbvm.h
* src/vm/hvm.c
+ added new internal function hb_vmLockForce()
! fixed to mark GC blocks with active threads
* src/vm/thread.c
* include/hbthread.h
% modified sync mutexes used by xBase++ signal class emulation
to not use item array internally
* updated mutex destructor to new GC mark semantic
! mark GT items if GT is bound with thread item
! fixed mutex notify/subscribe code to not change GC items
when HVM stack is unlocked
! use hb_vmLockForce() to eliminate potential deadlock
+ added new C function hb_threadEnterCriticalSectionGC().
It should be used instead of hb_threadEnterCriticalSection()
in code which manipulates GC items inside critical section.
It's slower but eliminates possible deadlock condition.
Please remember that remember that both functions cannot
be used for the same mutex. So if it's necessary to use
hb_threadEnterCriticalSectionGC() in one place then it
has to be used in all others when the same mutex is locked.
* src/vm/arrays.c
* src/vm/codebloc.c
* src/vm/hashes.c
* src/rtl/hbgtcore.c
* contrib/hbcurl/core.c
* contrib/hbexpat/core.c
* updated destructors to new GC mark semantic
* contrib/hbxpp/dllx.c
! fixed destructor for pointer item created by DllPrepareCall()
Now it respects reference counter.
; added note about real behavior of library handle destructor,
I haven't changed existing code behavior but maybe it should
be done.
* contrib/xhb/hbserv.c
* src/debug/dbgentry.c
* src/rdd/wacore.c
! fixed possible deadlocks by using hb_threadEnterCriticalSectionGC()
instead of hb_threadEnterCriticalSection().
* contrib/hbmemio/memio.c
! slightly modified hb_memfsDirectory() code to avoid race condition
without using hb_threadEnterCriticalSectionGC()
* src/vm/fm.c
% reduce the lock range in HB_FM_STAT builds
* src/rtl/hbsocket.c
! added missing HVM stack unlocking in hb_socketSelect() function
* src/rtl/gtxwc/gtxwc.c
! added few missing locks for version compiled with HB_XWC_XLIB_NEEDLOCKS
* src/rdd/dbtotal.prg
* allow to use symbols instead of codeblocks
* modified Harbour extension which uses ordKey() as default group
signature to work also without index. In such case all records
are summarized into single one.
; Most of above modifications were critical for stability of MT programs.
They should allow to activate GC in any place.
* include/Makefile
+ include/hbiousr.ch
* src/rtl/Makefile
+ src/rtl/iousr.c
+ added module for writting Harbour FILE IO redirectors at PRG level
+ tests/iotcp.prg
+ example code for FILE IO redirector written in PRG.
It's IOTCP and gives exactly the same functionality as TCP redirector
in contrib which is written in C.
* src/vm/runner.c
% modified internal structure to eliminate some memory allocations
* contrib/hbpgsql/rddcopy.c
% small simplification
* include/hbapifs.h
* src/rtl/filebuf.c
* src/rtl/filebufd.c
* contrib/hbcomio/comio.c
* contrib/hbmemio/memio.c
* contrib/hbnetio/netiocli.c
* contrib/hbtcpio/tcpio.c
* changed internal FILE IO API. Now all functions which do
not operate on PHB_FILE receive pointer to function table
(PHB_FILE_FUNCS) used by given redirector.
* src/rtl/vfile.c
* open wirtual files in READWRITE mode by default
* translate FO_* attributes to FXO_* ones
* src/vm/classes.c
! fixed typo in RTE message
* src/vm/garbage.c
* use different error code (1301/1302) for destructor RTE
* src/rtl/gtxwc/gtxwc.c
* src/rtl/gtxwc/gtxwc.h
+ added support for HB_GTI_FONTWEIGHT with HB_GTI_FONTW_* actions
* contrib/hbpgsql/rddcopy.c
! fixed memory leak
% encapsulate PQ calls in hb_vmUnlock()/hb_vmLock() to not stop
other threads when GC is activated
* include/hbapifs.h
* src/rtl/filebuf.c
* move HB_FILE_TYPE_MAX definition to header file
% include C stat() header only in *nix builds
* src/pp/ppcore.c
! force stringify when illegal characters are included inside
square brackets []
* src/rdd/hbdbsort.c
* casting
* src/rtl/filesys.c
+ added additional method to extract file time in MS-Windows version of
hb_fsGetFileTime()
* include/hbapifs.h
* src/rtl/vfile.c
+ added C functions to manipulate PRG level hb_vf*() file pointer items
* include/hbapifs.h
* src/rtl/filebuf.c
+ added C functions to create/extract file IO handle from raw file handle
+ added C functions to check if file IO handle points to local file
* contrib/hbmzip/mzip.c
* changed hb_fs*() API to hb_file*() API
! fixed file time setting in *nix builds
* contrib/hbtcpio/tcpio.c
* use default timeout defined in initial hostname string in read/write
operations
* include/hbapicom.h
* src/rtl/hbcom.c
+ added new C function:
int hb_comFindPort( const char * pszDevName, HB_BOOL fCreate );
It check if given port name is already defined and if not and second
parameter fCreate is TRUE then it allocates such port in one of last
free slots. On success port number is returned. If port cannot be
found or created 0 is returned.
* include/harbour.hbx
* src/rtl/hbcomhb.c
+ added new PRG function:
hb_comFindPort( <cDeviceName> [, <lCreate> = .F. ] ) -> <nPort>
* contrib/hbplist.txt
+ contrib/hbcomio/comio.c
+ contrib/hbcomio/hbcomio.hbc
+ contrib/hbcomio/hbcomio.hbp
+ added new Harbour FILE IO redirector.
It recognizes and process names with "COM<n>:" prefix, in form like:
COM<n>:[<com_params>]
<n> is port number or port name prefixed with "$" character.
<com_params> may contain serial port parameters like baud rate, stop
and data bits, parity and flow control (XON,XOFF,CTS, RTS,DST,DTR).
As delimiter comma "," is accepted.
This redirector can be used in different subsystems using Harbour
FILE IO and stream read/write operations, i.e.
REQUEST HB_COMIO
SET PRINTER TO COM2:38400,N81,XONXOFF
can be used to connect to serial printers.
Please remember that redirectors like NETIO can be used as wrapper
to other redirectors so code like:
pFile := hb_vfOpen( "NET:192.168.0.1:::COM1:9600,8N1" )
opens 1-st serial port on the server and
pFile := hb_vfOpen( "NET:192.168.0.1:::COM$/dev/ttyUSB0:9600,8N1" )
opens "/dev/ttyUSB0" serial device on the server.
* src/vm/set.c
! fixed freed memory access exploited by interactions between
modifications in last few years.
! do not try to remove trailing ^Z char reading from the stream
if FS_END seek reports 0.
! if possible open printer/alternate/extra output in write only mode
to avoid problem on devices where read access is not available.
* src/rtl/langapi.c
* keep EN lang active after deinitialization
* src/rtl/filesys.c
! fixed condition for file time refresh in *nix builds
! fixed file time setting in *nix builds
* include/hbapifs.h
* src/rtl/Makefile
* src/rtl/filebuf.c
+ src/rtl/filebufd.c
* renamed hb_fileRegister2() to hb_fileRegisterFull()
+ added new function hb_fileRegisterPart() which simplifies writing
small FILE IO redirectors.
* contrib/hbmemio/memio.c
* contrib/hbnetio/netiocli.c
* use hb_fileRegisterFull()
* contrib/hbplist.txt
+ contrib/hbtcpio/hbtcpio.hbc
+ contrib/hbtcpio/hbtcpio.hbp
+ contrib/hbtcpio/hbtcpio.hbx
+ contrib/hbtcpio/tcpio.c
+ added new Harbour FILE IO redirector.
It recognizes and process names with "tcp:" prefix, in form like:
tcp:<host>:<port>[:<timeout>]
It can be used in different subsystems using Harbour FILE IO and
stream read/write operations, i.e.
REQUEST HB_TCPIO
SET PRINTER TO tcp:192.168.0.110:9100
can be used to connect to network printers using TCP direct printing.
* utils/hbmk2/po/hbmk2.pt_BR.po
! fixed typo in translation
* src/debug/dbgentry.c
! added additional protection against recursive debugger activation.
It should fix problem reported by Rafa.
* src/rtl/fssize.c
* use explicit open attributes.
* src/rtl/copyfile.c
! reset error object between different RTE calls in __copyFile()
! copy file attributes only on *nix platforms.
In Cl*pper __copyFile() does not copy attributes so maybe also
in *nixes we should make the same.
* contrib/xhb/xhbcopyf.c
* changed hb_fs*() API to hb_file*() API.
* include/hbchksum.h
* src/rtl/hbmd5.c
* changed C function:
void hb_md5file( HB_FHANDLE hFile, char * digest )
to
HB_BOOL hb_md5file( const char * pszFileName, char * digest )
Warning: [INCOMPATIBLE]
* src/rtl/copyfile.c
* src/rtl/fscopy.c
* src/rtl/hbmd5.c
* src/rtl/isprint.c
* src/rtl/memofile.c
* changed hb_fs*() API to hb_file*() API
* contrib/hbnetio/netiocli.c
! fixed GPF when non attributes are passed to hb_fileDirectory()
redirected to NETIO - thanks to Rolf for the info about the problem.
* contrib/hbnetio/netiosrv.c
! allow to pass empty directory to hb_fileDirectory() redirected to NETIO
* src/vm/set.c
! added missing FXO_APPEND flag.
It should fix#54.
* src/vm/asort.c
! respect milliseconds part when timestamp values are compared in ASORT()
Note: ASORT() does not use exact comparison so when mixed date and
timestamp values are used only date is significant. Just like in:
ASort( aValue, {|x, y| x < y } )
* src/rtl/filebuf.c
! fixed C&P typo.
It should fix problem with SET PRINTER TO reported by Rolf.
* src/rtl/hbgtcore.c
! added missing break after HB_GTI_VERSION
* ChangeLog.txt
* include/harbour.hbx
* src/rtl/Makefile
- src/rtl/xfile.c
+ src/rtl/vfile.c
* renamed PRG functions HB_X*() to HB_VF*()
* renamed PRG functions hb_vf[GS]etAttr() to hb_vfAttr[GS]et()
* renamed PRG functions hb_vf[GS]etDateTime() to hb_vfTime[GS]et()
* include/hbapifs.h
* src/rtl/filebuf.c
* src/rtl/fscopy.c
* contrib/hbmemio/memio.c
* contrib/hbnetio/netio.h
* contrib/hbnetio/netiocli.c
* contrib/hbnetio/netiosrv.c
* renamed C functions hb_file[GS]etAttr() to hb_fileAttr[GS]et()
* renamed C functions hb_file[GS]etFileTime() to hb_fileTime[GS]et()
* contrib/hbnetio/netio.h
* contrib/hbnetio/netiocli.c
* contrib/hbnetio/netiosrv.c
+ added support for redirecting hb_vfConfig() to the server.
NETIO does not use it anyhow NETIO works as full redirector
to server system and it may be used on the server side.
* include/hbapifs.h
* src/rtl/filebuf.c
+ added new C function hb_filePOpen()
* include/hbset.h
* src/vm/set.c
* src/rtl/console.c
* changed hb_fs*() API to hb_file*() API in HVM SETs
* src/vm/memvars.c
* changed hb_fs*() API to hb_file*() API in .mem files
* src/vm/runner.c
* changed hb_fs*() API to hb_file*() API in .hrb files
* include/hbapifs.h
* src/rtl/filesys.c
* renamed hb_fsPOpen() param
* contrib/hbhpdf/3rd/libhpdf/hpdffdfj.c
! removed executable attribute
* src/vm/thread.c
! fixed typo reported by Viktor - thanks.
* include/hbapifs.h
* src/rtl/hbproces.c
* src/rtl/spfiles.c
* src/rtl/filesys.c
* src/rtl/file.c
* synced parameter file and dir names used in declarations and
implementations
* include/hbrddcdx.h
+ added few fields used in ADI files
* src/codepage/cp_utf8.c
* src/rtl/cdpapi.c
! always return -1, 0 and 1 from hb_cdpcmp() function.
Workaround for problem exploited by optimized memcmp() function.
* src/rdd/dbfntx/dbfntx1.c
! fixed possible sort problem when optimized memcmp() is used
* added feew missing const declarations
* src/rdd/dbfntx/dbfntx1.c
* src/rdd/dbfnsx/dbfnsx1.c
* src/rdd/dbfntx/dbfntx1.c
! fixed OrdWildSeek() to work with optimized memcmp()
* include/hbapifs.h
* src/rtl/disksphb.c
+ added new C function:
double hb_fsDiskSpace( const char * pszPath, HB_USHORT uiType );
* include/hbapifs.h
* src/rtl/direct.c
+ added new C function:
PHB_ITEM hb_fsDirectory( const char * pszDirSpec,
const char * pszAttributes );
* src/rtl/filesys.c
! report EOF in hb_fsEof() also when file position is out of file size
* updated comment
* include/hbapifs.h
* src/rtl/filebuf.c
+ extended Harbour FILE IO API and added support for read/write filepos,
directory and link operations.
Read/write filepos support in some systems (i.e. *nixes) needs additional
emulation code. If it's not necessary then this functionality can be
disabled by FXO_NOSEEKPOS attribute. Now this attribute is used by our
RDD code.
* src/rtl/Makefile
+ src/rtl/xfile.c
+ added PRG interface to Harbour FILE IO API
The following PRG functions are available for Harbour programmers:
HB_XEXISTS( <cFileName>, [ @<cDestFileName> ] ) -> <lOK>
HB_XERASE( <cFileName> ) -> <nResult>
HB_XRENAME( <cFileSrc>, <cFileDst> ) -> <nResult>
HB_XCOPYFILE( <cFileSrc>, <cFileDst> ) -> <nResult>
HB_XDIREXISTS( <cDirName> ) -> <lExists>
HB_XDIRMAKE( <cDirName> ) -> <nSuccess>
HB_XDIRREMOVE( <cDirName> ) -> <nSuccess>
HB_XDIRECTORY( [ <cDirSpec> ], [ <cAttr> ] ) -> <aDirectory>
HB_XDIRSPACE( <cDirName>, [ <nInfoType> ] ) -> <nFreeSpace>
HB_XGETATTR( <cFileName>, @<nAttr> ) -> <lOK>
HB_XSETATTR( <cFileName>, <nAttr> ) -> <lOK>
HB_XGETDATETIME( <cFileName>, @<tsDateTime> ) -> <lOK>
HB_XSETDATETIME( <cFileName>, <tsDateTime> ) -> <lOK>
HB_XLINK( <cExistingFileName>, <cNewFileName> ) -> <nSuccess>
HB_XLINKSYM( <cTargetFileName>, <cNewFileName> ) -> <nSuccess>
HB_XLINKREAD( <cFileName> ) -> <cDestFileName> | ""
HB_XOPEN( <cFileName>, [ <nMode> ], [ <nAttr> ] ) -> <pHandle> | NIL
HB_XCLOSE( <pHandle> ) -> <lOK>
HB_XLOCK( <pHandle>, <nStart>, <nLen>, [ <nType> ] ) -> <lOK>
HB_XUNLOCK( <pHandle>, <nStart>, <nLen> ) -> <lOK>
HB_XLOCKTEST( <pHandle>, <nStart>, <nLen>, [ <nType> ] ) ;
-> <nPID> | 0 (nolock) | -1 (err)
HB_XREAD( <pHandle>, @<cBuff>, [ <nToRead> ], [ <nTimeOut> ] ) ;
-> <nRead>
HB_XWRITE( <pHandle>, <cBuff>, [ <nToWrite> ], [ <nTimeOut> ] ) ;
-> <nWritten>
HB_XREADAT( <pHandle>, @<cBuff>, [ <nToRead> ], [ <nAtOffset> ] ) ;
-> <nRead>
HB_XWRITEAT( <pHandle>, <cBuff>, [ <nToWrite> ], [ <nAtOffset> ] ) ;
-> <nWritten>
HB_XSEEK( <pHandle>, <nOffset>, [ <nWhence> ] ) -> <nOffset>
HB_XTRUNC( <pHandle>, [ <nAtOffset> ] ) -> <lOK>
HB_XSIZE( <pHandle> ) -> <nSize>
HB_XEOF( <pHandle> ) -> <lEOF>
HB_XFLUSH( <pHandle>, [ <lDirtyOnly> ] ) -> NIL
HB_XCOMMIT( <pHandle> ) -> NIL
HB_XCONFIG( <pHandle>, <nSet>, [ <nParam> ] ) -> <nResult>
HB_XHANDLE( <pHandle> ) -> <nOsHandle>
HB_XTEMPFILE( @<cFileName>, [ <cDir> ], [ <cPrefix> ], [ <cExt> ], ;
[ <nAttr> ] ) -> <pHandle> | NIL
Please remember that not all redirectors have to support all of them.
I.e. MEMIO allows to use directory names in files but does not allow to
create or remove directories. It also does not support file attributes
and times in current implementation though it can be easy added.
HB_XCONFIG() is general function which can be used by redirector
authors to make some special operations which are specific to given
device.
HB_XTEMPFILE() always creates temporary files on local system without
switching to FILE IO redirector. It's intentional behavior.
* src/rtl/fscopy.c
* used Harbour FILE IO API in hb_fsCopy()/HB_FCOPY()
Please remember that HB_FCOPY() always makes operation using current
system when HB_XCOPY() may optimize it moving the operation to low
level subsystem or even other computer i.e. NETIO can do that when
both files are located on the same server.
* src/rdd/delim1.c
* src/rdd/sdf1.c
* src/rdd/dbf1.c
* src/rdd/dbfcdx/dbfcdx1.c
* src/rdd/dbffpt/dbffpt1.c
* src/rdd/dbfnsx/dbfnsx1.c
* src/rdd/dbfntx/dbfntx1.c
* src/rdd/hsx/hsx.c
* open files with FXO_NOSEEKPOS attribute to inform low level API that
read/write filepos is not used (disables unnecessary filepos emulation).
* contrib/hbnetio/netio.h
* contrib/hbnetio/netiocli.c
* contrib/hbnetio/netiosrv.c
+ added support for extended Harbour FILE IO API.
* contrib/hbnetio/utils/hbnetio/netiomgm.hb
! renamed "quit" command to "shutdown" as suggested by Rolf.
* contrib/hbnetio/utils/hbnetio/hbnetio.prg
* allow to interrupt server process using ESC when run in console window.
* contrib/hbmemio/memio.c
+ added support for extended Harbour FILE IO API.
I left two minor TODO notes - maybe someone will try to implement it.
* src/rtl/saverest.c
! added protection against passing to small screen
buffer to RestScreen() function (issue #43)
* src/rtl/xsavescr.c
! save and reuse original screen size in
__XSaveScreen()/__XRestScreen() functions
* include/hbwince.h
- removed GetProcAddress() redefinition which forced ANSI
version not supported in recent Windows Mobile MSVC libraries
* include/hbwinuni.h
+ added new macros which hide differences between Windows systems
in GetProcAddress() usage: HB_WINAPI_GETPROCADDRESS() and
HB_WINAPI_GETPROCADDRESST()
The second one adds "W" or "A" suffix to function names.
- removed not longer used HB_WINAPI_FUNCTION_NAME() macro
* src/vm/dynlibhb.c
* updated hb_libSymAddr() to work with Unicode version of
GetProcAddress() in WinCE builds
* src/vm/maindllp/dllpcode.c
* updated hb_dllGetProcAddress() to work with Unicode version of
GetProcAddress() in WinCE builds
* contrib/hbwin/wapi_winbase.c
* updated WAPI_GetProcAddress() to work with Unicode version of
GetProcAddress() in WinCE builds
* src/common/hbdate.c
* src/common/hbver.c
* src/rtl/diskspac.c
* src/rtl/disksphb.c
* src/rtl/fslink.c
* src/rtl/gtwin/gtwin.c
* src/rtl/gtwvt/gtwvt.c
* src/vm/extrap.c
* contrib/gtwvg/gtwvgd.c
* contrib/gtwvg/wvgwin.c
* contrib/hbwin/axcore.c
* contrib/hbwin/mapi.c
* contrib/hbwin/wapi_shellapi.c
* contrib/hbwin/wapi_winbase.c
* contrib/hbwin/wapi_wingdi_font.c
* contrib/hbwin/win_prn2.c
* contrib/hbwin/win_prn3.c
* contrib/hbwin/win_rpc.c
* extras/gtwvw/gtwvwd.c
* use HB_WINAPI_GETPROCADDRESS*()
* contrib/hbtip/utils.c
* src/rtl/gtwvt/gtwvt.c
* casting to pacify some warnings
* src/compiler/harbour.y
* src/compiler/harbour.yyc
* src/compiler/harbour.yyh
* changed type of valChar.length from int to HB_SIZE
* include/hbpp.h
* src/pp/ppcore.c
* changed type of last hb_pp_tokenBlockString() parameter
from int * to HB_SIZE *
* src/compiler/complex.c
* removed unnecessary casting
* src/rtl/hbproces.c
! do not use SetHandleInformation() in WinCE builds
* config/wce/global.mk
* utils/hbmk2/hbmk2.prg
! added iphlpapi to WinCE builds
; modifications taken from Viktor's branch.
* include/hb.ch
+ added hbserial.ch
* src/rtl/base64c.c
+ HB_BASE64ENCODE(): added second parameter to request
specific line length for the output. Line length
should be specified in visible characters (w/o the
2 EOL bytes). EOL is fixed to CRLF.
https://en.wikipedia.org/wiki/Base64
; probably there exist more optimal implementations
; (code slightly modified)
* contrib/hbct/ctnet.c
! fixed copy and past typo in previous commit
* src/rdd/hbsix/sxcompat.prg
! fixed sx_Compress() and sx_Decompress() used with arrays
; modifications below comes from Viktor fork:
* include/dbinfo.ch
* src/rdd/workarea.c
+ added support for new dbInfo() action: DBI_CODEPAGE
It returns Harbour CP used by current work area.
* src/common/expropt2.c
* change instruction order to protect against NULL references
if we ever add support for dummy lists
* src/common/hbver.c
! CLANG detection
* src/lang/l_fr.c
* src/lang/l_hu.c
* updated translations
* src/rtl/cdpapihb.c
* include/harbour.hbx
+ added function hb_cdpExists( <cCDP> ) -> <lExists>
it returns .T. if the passed codepage is supported
and linked, .F. otherwise
* src/rtl/hbrand.c
* include/harbour.hbx
+ added hb_randStr( <nLen> ) -> <cBytes> which returns a strong
random stream of bytes of requested length
* src/vm/hashfunc.c
* include/harbour.hbx
+ New hash function to easily check for the existence
of a key and at the same time retrieving its corresponding
value:
hb_HGetRef( <hHash>, <xKey>[, <@xValue> ] ) -> <lFound>
If the key is not found, <xValue> is also reset to NIL.
Useful to replace hb_HPos()/hb_HValueAt() call pairs and
associated temp variable, or to avoid multiple hash lookups
for the cost of one temp variable.
* src/rtl/copyfile.c
% use 64KB buffer
* src/rtl/tget.prg
! Get():Insert()/Get():OverStrike() GET freeze fix reworked
using better solution by Heinz.
* src/rtl/tgetlist.prg
* src/rtl/tmenuitm.prg
* src/rtl/tmenusys.prg
* src/rtl/tpopup.prg
! fixed to precisely verify against multiple expected class names
previously a custom class named f.e. 'LIST' was accepted in some
places for LISTBOX
! fixed TOFIX where CP/encoding dependent string was
used to determine whether a menu item is separator
throughout the lifetime of the menu.
* src/common/hbdate.c
* src/common/hbprintf.c
* src/common/hbtrace.c
* src/common/hbver.c
* src/compiler/compi18n.c
* src/compiler/genc.c
* src/compiler/gencc.c
* src/compiler/hbusage.c
* src/debug/dbgthsh.prg
* src/debug/dbgtmenu.prg
* src/debug/debugger.prg
* src/debug/tbrwtext.prg
* src/pp/hbpp.c
* src/rdd/dbfcdx/dbfcdx1.c
* src/rdd/dbfuncs.prg
* src/rdd/dbtotal.prg
* src/rdd/hbsix/sxcompat.prg
* src/rdd/hbsix/sxini.prg
* src/rdd/usrrdd/rdds/arrayrdd.prg
* src/rdd/usrrdd/rdds/hscdx.prg
* src/rtl/adir.prg
* src/rtl/arc4.c
* src/rtl/cdpdet.prg
* src/rtl/dbedit.prg
* src/rtl/dircmd.prg
* src/rtl/diskspac.c
* src/rtl/disksphb.c
* src/rtl/errint.c
* src/rtl/errintlo.c
* src/rtl/errsys.prg
* src/rtl/filesys.c
* src/rtl/fslink.c
* src/rtl/gtkbstat.c
* src/rtl/gtwin/gtwin.c
* src/rtl/gtwvt/gtwvt.c
* src/rtl/hbbffnc.c
* src/rtl/hbi18n1.c
* src/rtl/hbi18n2.prg
* src/rtl/hbini.prg
* src/rtl/hbjson.c
* src/rtl/listbox.prg
* src/rtl/menusys.prg
* src/rtl/mtran.c
* src/rtl/radiogrp.prg
* src/rtl/tgetlist.prg
* src/rtl/tmenusys.prg
* src/rtl/tobject.prg
* src/rtl/tpersist.prg
* src/rtl/tpopup.prg
* src/rtl/tpopuphb.prg
* src/rtl/treport.prg
* src/rtl/tscalar.prg
* src/rtl/ttopbar.prg
* src/rtl/tget.prg
* src/rtl/tlabel.prg
* src/rtl/tmenuitm.prg
* src/rtl/valtoexp.prg
* src/rtl/valtype.c
* src/vm/dlmalloc.c
* src/vm/fm.c
! check module handle returned by GetModuleHandle() in MS-Windows
builds
! use %u for unsigned printf formatting
* casting, formatting, casing and some modifications in names
* use #if 0 / #endif to mark commented blocks
* updated year to 2014
% use FOR EACH, SWITCH, DO CASE statements
% use :__enumFirst() / :__enumLast()
% eliminated some local variables and redundant declarations
% use hb_defaultValue()
% use $ operator instead of At() and hb_HHasKey()
% use hb_ADel() instead of ADel()+ASize()
* replace some functions with procedures
* pacified some MSC warnings
* use hb_StrFormat() for user messages
* use :: instead of Self:
* use ANSI date delimiters
* src/rtl/hbsocket.c
* removed not longer valid TODO note
* contrib/hbmisc/bbabble.c
! fixed buffer size calculation (it fixes buffer overflow for small
strings, i.e. 2 bytes and does not allocate more memory then necessary
for long ones)
* contrib/hbct/dattime2.c
! fixed CToMonth() and CToDoW() to respect case intensive search for
strings with national characters
* variable name synced with Viktor branch
* contrib/hbct/strswap.c
! fixed NULL reference when neither 1-st nor 2-nd parameter is passed
by reference
* contrib/hbct/fcopy.prg
! fixed source file positioning in case of partial write
! use hb_FGetDateTime() / hb_FSetDateTime() instead of
FileDate()+FileTime() / SetFDaTi()
It's faster and unlike FileDate() and FileTime() it does
not leave directory open.
! fixed typo (RTE)
% minor simplification
* src/rtl/disksphb.c
! use dynamic binding for GetDiskFreeSpaceEx() function
; modifications below comes from Viktor fork:
* contrib/hbct/ctwin.c
% removed unnecessary declaration
* contrib/hbct/envparam.c
! do not call FreeEnvironmentStrings() is it's not necessary
* contrib/hbodbc/odbc.c
! fixed potential buffer overflow in SQLERROR()/SQLGETDIAGREC()
* contrib/hbnetio/netiosrv.c
! fixed possible NULL reference
* contrib/hbct/ctnet.c
! added missing check for result of WinAPI function call
* contrib/hbct/cttime.prg
! SecToTime(): fixed regression from 2007-11-18 13:46 UTC+0100
* contrib/hbwin/hbolesrv.c
! fixed char -> TCHAR after recent unicodification
* config/win/global.mk
* utils/hbmk2/hbmk2.prg
* src/rtl/hbsocket.c
+ added support for returning NIC MAC address by hb_socketGetIFaces()
in MS-Windows builds.
To see physical device addresses bound with active IP interfaces use:
#include "hbsocket.ch"
PROCEDURE Main()
LOCAL aIFace
FOR EACH aIFace IN hb_socketGetIFaces( , .t. )
? "IP:", aIFace[ HB_SOCKET_IFINFO_ADDR ], ;
" MAC:", aIFace[ HB_SOCKET_IFINFO_HWADDR ]
NEXT
WAIT
RETURN
* src/rtl/hbjson.c
! indent null used as cross reference replacement
* strip space at the end of line after ":" in human readable output
of objects with complex values
* respect _SET_EOL setting in human readable output
* round decoded number to keep the same final value as compiler
* src/rtl/hbproces.c
* minor simplification