* include/hbdefs.h
+ added new types HB_WCHAR16 and HB_WCHAR32, existing type HB_WCHAR
is mapped to HB_WCHAR16 (just like before)
* include/hbapicdp.h
* src/harbour.def
* src/rtl/cdpapi.c
+ added new C functions for encoding and decoding UTF-8 string using
which HB_WCHAR32:
int hb_cdpU32CharToUTF8( char * szUTF8, HB_WCHAR32 wc );
HB_BOOL hb_cdpUTF8GetU32( const char * pSrc, HB_SIZE nLen,
HB_SIZE * pnIndex, HB_WCHAR32 * pWC );
HB_BOOL hb_cdpUTF8GetUCS( const char * pSrc, HB_SIZE nLen,
HB_SIZE * pnIndex, HB_WCHAR32 * pWC );
HB_BOOL hb_cdpUTF8GetU16( const char * pSrc, HB_SIZE nLen,
HB_SIZE * pnIndex, HB_WCHAR16 * pWC );
HB_BOOL hb_cdpUTF8Validate( const char * pSrc, HB_SIZE nLen );
They support full UCS and are much more restrictive against errors and
wrong UTF-8 encoding, i.e. now overlong encoding is forbidden.
The wrong characters are translated to 0xFFFD and later if such
character does not exist in final CP to '?' ASCII character.
* declaration of the following UTF-8 C functions have been changed to
operate on HB_WCHAR32 instead of HB_WCHAR:
int hb_cdpUTF8CharSize( HB_WCHAR32 wc );
HB_WCHAR32 hb_cdpUTF8StringPeek( const char * pSrc, HB_SIZE nLen,
HB_SIZE nPos );
* the following C functions have been changed to internally operate on
HB_WCHAR32 instead of HB_WCHAR:
hb_cdpUTF8StringLength()
hb_cdpUTF8StringAt()
hb_cdpUTF8StringSubstr()
* the following C functions have been changed to use new hb_cdpUTF8GetU*()
instead of step by step decoding with hb_cdpUTF8ToU16NextChar()
hb_cdpStrToUTF8Disp()
hb_cdpUTF8AsStrLen()
hb_cdpUTF8ToStr()
hb_cdpStrToU16()
hb_cdpUtf8Char()
* use HB_CDP_ERROR_* macros to mark wrong encoding
* src/rtl/cdpapihb.c
* the following UTF-8 C functions have been changed to operate on
HB_WCHAR32 instead of HB_WCHAR:
hb_utf8Chr()
hb_utf8Asc()
hb_utf8Poke()
hb_utf8Peek()
Other UTF-8 PRG functions have been adopted to HB_WCHAR32 by changes
in corresponding C functions.
* src/codepage/cp_utf8.c
* use new function hb_cdpUTF8GetU16() to decode UTF-8 strings in UTF8EX CP
* src/rtl/arc4.c
+ added new macro HB_NO_SYSCTL which allow to disable sysctl() in Linux
builds for GLIBC < 2.30
* src/rtl/cdpapi.c
+ added fallback translation table for different variants of Latin
character, now when translation is made between different encoding
and the variant of Latin character does not exist in destination
code page then it's translated to their base Latin form, i.e.:
hb_utf8ToStr( "ĄĆĘŁŃÓŚŹŻąćęłńóśźż", "EN" ) -> "ACELNOSZZacelnószz"
* tests/uc16_gen.prg
; updated comment
* contrib/hbzebra/coredraw.c
* contrib/hbzebra/hbzebra.hbx
+ added new PRG function:
hb_zebra_getsize( <hZebra>, @<nWidth>, @<nHeight> ) -> <nError>
it calculates size in points of the created barcode and returns 0 on
success or error code
+ contrib/hbzebra/tests/gtgfx.prg
+ borrowed from Viktor's fork, thanks
2014-09-18 22:32 UTC+0200 Viktor Szakats (vszakats users.noreply.github.com)
+ added on-screen barcode example, created by elch
(with some minor cleanups)
https://groups.google.com/d/msg/harbour-users/_Wht51JZGgE/ZXyvaJNH9ggJfeb4fc0e20
* contrib/sddoci/core.c
* map ostrlen() to strlen() or wcslen() in OCI_CHARSET_UNICODE builds
; TOFIX: this library uses wchar_t for unicode strings, it means that
in *nixes where wchar_t is 32-bit integer mapping to Harbour
HB_WCHAR is wrong and has to be fixed
* include/hbapifs.h
* src/harbour.def
* src/rtl/filebuf.c
+ added new C function:
HB_BOOL hb_fileSave( const char * pszFileName,
const void * buffer, HB_SIZE nSize );
* include/harbour.hbx
* src/harbour.def
* src/rtl/vfile.c
+ added new PRG function:
hb_vfSave( <cFileName>, <cFileBody> ) --> <lOK>
* src/rtl/vfile.c
* set FError() code in hb_vfLoad()
* contrib/gtqtc/gtqtc.h
* contrib/gtqtc/gtqtc1.cpp
+ added support for disabling title and frames of console window by
hb_gtInfo( HB_GTI_WINTITLE, <lNoFrame> )
* src/rtl/transfrm.c
! fixed bug in "@S<n>" transformation when multibyte CDP is used
* contrib/hbhpdf/core.c
+ HPDF_GetPageByIndex( hDoc, nIndex ) --> hPage / NIL
suggested by Luigi Ferraris
* contrib/hbhpdf/tests/harupdf.prg
+ test the above (disabled by default)
* README.md
* updated CI badge(s) to GitHub Actions - they also cover
the strict compilation mode, definitions are currently
located in the same file as normal
! cleaned up links, mostly in tools section, some were
broken, for others switched to https where applicable
* mention HB_CCPREFIX= support for clang
* contrib/hbdoc/hbdoc.prg
* contrib/hbformat/utils/hbformat.prg
* contrib/hbnetio/utils/hbnetio/hbnetio.prg
* package/harbour.mft
* package/harbour.rc
* src/compiler/hbusage.c
* utils/hbi18n/hbi18n.prg
* utils/hbtest/hbtest.prg
* bumped copyright year to 2025
+ config/wasm/global.mk
+ config/wasm/libs.mk
+ config/wasm/emcc.mk
* utils/hbmk2/hbmk2.prg
* contrib/hbrun/hbrun.hbp
+ add basic support for build Harbour into JS/WebAssembly using
emscripten, using these settings:
HB_PLATFORM=wasm HB_COMPILER=emcc HB_BUILD_3RDEXT=no
* {abstr} is now a hbmk2 keyword to possibly group all
toolsets similar in flavour: WASI/clang, JS/emscripten
These most likely will be targeting plaforms which are not
full operating-systems, they are also commonly qualified as
sandbox solutions.
* introduced __PLATFORM__WASM and __PLATFORM__ABSTRACT .prg defines
* utils/hbmk2/hbmk2.prg
+ allow to specify hb_ProgName() value at build-time for platforms
where the function cannot return a meaningful value (f.e.
JS/WebAssembly)
; TODO: Add support for passing hb_ProgName() value command-line
parameter, f.e. `--hb:self=hbrun`
* config/global.mk
* include/hbsetup.h
* consider abstract/emscripten targets similar to linux-like
* src/rtl/arc4.c
! fix to build under emscripten (which is assumed to be a
linux-like environment)
; though platform/compiler names are not currently compatible
with origin, this WebAssembly platform support was guided by
Harbour 3.4:
2017-06-09 01:10 UTC Viktor Szakats (vszakats users.noreply.github.com)
as usual Viktor was here before, many thanks!
; example project, how to make a multi-platform GUI application which
also targets WebAssembly, can be found here:
https://github.com/alcz/harbour-cimgui-sokol-starterkit/
* src/rtl/cdpapihb.c
! fixed hb_transalte() to not clear passed string
when neither CPIN nor CPOUT is set
* src/rtl/hbgtcore.c
! fixed hb_gtAttach() to properly work with empty GT pointer
* contrib/hbct/dattime3.c
! fixed in block variable declaration for strict ANSI C compat
* code formatting
; both borrowed from Viktor's fork, thanks
aa4665f16fd9f37296b0
* src/rdd/dbcmd.c
* note about C5.3/5.2 DBAPPEND( [<lUnlockAll>=.t.] ) updated again
upon Przemek notification, thanks
* contrib/hbwin/olecore.c
* pacified false MSVC warning. It's very seldom situation that I'm adding
code to pacify false compiler warnings anyhow in this case it cost in
practice nothing so I decided to do that.
* contrib/xhb/hboutdbg.c
* src/rtl/gtcrs/gtcrs.c
* NULL pointer casting to pacify warning
* src/pp/hbpp.c
% do not created new iLen variable but reuse the one previously declared
* src/vm/classes.c
% allocate puiMsgIdx as array of HB_USHORT items instead of HB_SYMCNT.
This modification only reduces the memory usage and has no effect on
number of accepted symbols.
* changed 'HB_SYMCNT uiHashKey' to 'HB_SIZE nHashKey' to avoid explicit
casting in the code
* include/hbdate.h
* src/common/hbdate.c
* src/harbour.def
+ added new C functions:
HB_BOOL hb_timeStrGetUTC( const char * szTime,
int * piHour, int * piMinutes,
int * piSeconds, int * piMSec,
int * piUTCOffset );
HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime,
int * piYear, int * piMonth,
int * piDay, int * piHour,
int * piMinutes, int * piSeconds,
int * piMSec, int * piUTCOffset );
They can decode timestamp value with ISO 8601 UTC offset.
* src/common/hbdate.c
* use hb_timeStampStrGetUTC() in hb_timeStampStrGetDT() and return UTC
time if it was with UTC offset
Now Harbour compiler accept timestamp strings with with UTC offset, i.e.
? t"2025-01-22 00:45 UTC+0100" // => 2025-01-21 23:45:00.000
Also HB_StrToTS() supports it.
* src/pp/hbpp.c
* use new hb_timeStampStrGetDT() to decode timestamp from ChangeLog to
build revision number. It also fixes bug with decoding negative UTC
offsets.
* contrib/hbcurl/core.c
* contrib/hbcurl/hbcurl.ch
* contrib/hbcurl/hbcurl.hbx
* applied more cleanups, following Viktor Szakats guidance in hisrepo:
6127603217
- add `HB_CURLM_ERROR` to indicate error in hbcurl wrapper.
- replace use of `HB_CURLM_INTERNAL_ERROR` with `HB_CURLM_ERROR`.
- sync Harbour variable integer sizes with curl ones.
- tidy up a variable scopes.
- drop unused variable.
- omit `hb_ret()` (it's a no-op).
- formatting.
- add functions to `hbcurl.hbx`.
+ add curl_ws_send()/curl_ws_recv() - WebSocket connectivity,
borrowed from Viktor's fork, thanks again!
2c71a5c940
* src/rdd/dbcmd.c
* note about C5.3 and Harbour extensions to
DBAPPEND( [<lUnlockAll>=.t.] ), thanks Viktor
* ChangeLog.txt
! typos
* include/hbapifs.h
! added missing declaration for hb_fileParamGet()
* include/hbgtcore.h
* added HB_EXPORT attribute for hb_gt_getClipboard(), hb_gt_setClipboard()
and hb_gt_dos_keyCodeTranslate()
* include/hbrdddbf.h
! removed declaration for hb_dbfTranslateRec() function - this functions
was removed many years ago
* include/harbour.hbx
* src/harbour.def
! fixed order of declared functions - they should be sorted.
* src/rtl/listbox.prg
* merged #371 from Kamil, thanks for the patch.
Applied minor reformat .NOT. -> ! and added a comment
about buggy ListBox:hitTest() on no-box dropdown in
Cl*pper 5.3.
* src/rtl/listbox.prg
! fixed nTop not being incremented in ListBox:hitTest() for no-box dropdown
* replaced inconsistent references to ::nTop with nTop
* renamed variables to better reflect their role
* src/common/hbver.c
* indent cleanup
* src/rtl/filesys.c
* src/rtl/fssize.c
! restore dynamic calling of GetFileAttributesEx() on
Windows (significant only on very old systems)
* src/rtl/hbproces.c
! in process creating functions like hb_processRun(), *Open(),
on Android: don't use setuid( getuid() ) method for resetting
attributes as it rises "Bad system call" and the process is not
executed. This fixes building Harbour in hbmk2 stage on Android
device itself (for example using Termux) and can fix deploying
multi-process Android apps. For devices older than Android 8,
where the kernel was not hardened, please report any regresions,
if you have such multi-process deployments.
* ChangeLog.txt
% stripped spaces before EOLs
* src/compiler/harbour.y
* src/macro/macro.y
* replaced depreciated bison macro %pure-parser with %define api.pure
* src/compiler/complex.c
* src/macro/macrolex.c
* src/compiler/harbour.y
* src/macro/macro.y
* replaced depreciated bison macro %name-prefix with %define api.prefix
; Warning: now Bison 2.6 or newer is required to regenerate Harbour grammar
files. If someone wants/needs to work with older bison versions
then it's enough to restore depreciated macros, Harbour compiler
and macros lexers will work with both versions.
* src/compiler/harbour.yyc
* src/compiler/harbour.yyh
* src/macro/macro.yyc
* src/macro/macro.yyh
* regenerated with Bison 3.02 (the same as before)
* re-added HB_SYMBOL_UNUSED( yynerrs ) to pacify some compilers warnings
* contrib/xhb/hbcompat.ch
! fixed HSetAACompatibility() #xtranslate
* contrib/hbzebra/code39.c
* pacified warning, it's also fix for possible buffer overflow.
* include/hbcomp.h
* src/compiler/genc.c
* src/compiler/hbmain.c
* replaced function hb_compFunctionMarkStatic() with
hb_compFunctionSetScope()
* src/compiler/genc.c
* detect public prg functions written in C inside
#pragma BEGINDUMP / #pragma ENDDUMP and mark them as LOCAL ones
* src/vm/hvm.c
! removed my pseudo fix from 2023-01-30 15:18 UTC+0100 Przemyslaw Czerpak.
It was ugly hack which can work only with some linkers.
This modification fixes FILE() function used with C functions written
without own symbol table
* src/rdd/dbf1.c
* minor code formatting
* contrib/xhb/hbcompat.ch
! fixed HSetAACompatibility() #xtranslate
* contrib/hbzebra/code39.c
* pacified warning, it's also fix for possible buffer overflow.
* include/hbcomp.h
* src/compiler/genc.c
* src/compiler/hbmain.c
* replaced function hb_compFunctionMarkStatic() with
hb_compFunctionSetScope()
* src/compiler/genc.c
* detect public prg functions written in C inside
#pragma BEGINDUMP / #pragma ENDDUMP and mark them as LOCAL ones
* src/vm/hvm.c
! removed my pseudo fix from 2023-01-30 15:18 UTC+0100 Przemyslaw Czerpak.
It was ugly hack which can work only with some linkers.
This modification fixes FILE() function used with C functions written
without own symbol table
* src/rdd/dbf1.c
* minor code formatting
* src/common/hbver.c
! added lacking VER_BUILDNUMBER definition that is missing
in very old compiler sets/SDKs (pre Windows 2000),
noticed by DF7BE - Wilfried Brunken in #362
* README.md
* slightly updated list of supported compilers and
examples to mention MSVC for ARM64 and Clang
* ChangeLog.txt
* hb_scan -> hb_hscan in prev
* .github/workflows/windows-ci.yml
* update windows MSYS2 integration runner set of
requested packages. PGSQL, Firebird and MariaDB libs
are no longer available in the 32-bit environment
+ add clang x86_64 compiler for testing under this CI
* include/harbour.hbx
* include/hbapi.h
* src/common/hbver.c
* src/harbour.def
* src/rtl/version.c
! fixed Windows 11 detection, by vendor likings it has
NT Kernel Version stamped with 10.0, so now Build Number
is more significant as a recognition factor.
+ new C helper functions hb_winisbuild(), hb_iswin11()
+ added PRG function hb_osIsWin11()
* also try to detect new Windows Server versions
* config/win/clang.mk
* utils/hbmk2/hbmk2.prg
* ChangeLog.txt
! recursion happening in the Makefiles rendered recently
introduced compatibility option unreliable. Changed to
use separate variable: HB_USER_FIXES=--mingw-script
You don't need it, the problem shouldn't exist, but
anyway...
* config/global.mk
! detect ARM64 CPU on Windows also under non-native shell (MSYS2 sh)
* on unix also recognize aarch64 from uname
* include/hbsetup.h
* __MINGW64__ define is not x86_64 specific anymore
* config/win/clang.mk
* utils/hbmk2/hbmk2.prg
* reworked Clang on Windows detection (ARM64, x86_64, x86),
now it recognizes those flavours in PATH as distributed
by MSYS2 project and also Visual Studio 2022 Build tools.
Starting Harbour build process should be now possible
both from MSYS2 shell (with the special note to use "make"
command instead of "win-make" from sh) and regular batch
script/cmd shell.
Building on Clang distributed by MS x86_64:
PATH=<InstallPath>\BuildTools\VC\Tools\Llvm\x64\bin;%PATH%
win-make
Clang/MS ARM64:
PATH=<InstallPath>\BuildTools\VC\Tools\Llvm\ARM64\bin;%PATH%
win-make
Building on Clang x86_64 distributed by MSYS2 from cmd:
PATH=C:\msys64\clang64\bin;%PATH%
win-make
Clang/MSYS ARM64 called from cmd:
PATH=C:\msys64\clangarm64\bin;%PATH%
win-make
* src/common/hbver.c
* patched clang version string builder to skip duplicate version
number in some builds
* append processor architecture to clang compiler string
on non-Intel systems
+ config/win/msvcarm.mk
+ config/win/msvcarm64.mk
* config/global.mk
* include/hbsetup.h
* utils/hbmk2/hbmk2.prg
+ introduced support for Windows (10,11) ARM 64-bit platform
native compilers using Visual Studio 2022 Build Tools
before calling win-make, setup environment with:
<InstallPath>\BuildTools\VC\Auxiliary\Build\vcvarsarm64.bat
toolchain should be autodetected as following:
! HB_HOST_PLAT: win (arm64) HB_SHELL: nt
! HB_PLATFORM: win (arm64) (auto-detected)
! HB_COMPILER: msvcarm64 (auto-detected: C:/Program[...]/ARM64/)
to build final application with hbmk2 adding a valid Windows
Platform SDK / CRT paths to INCLUDE= and/or LIB= variable
is needed
; cross compilation from AMD64 hosts is possible:
vcvars64.bat
win-make (build Harbour for your host first)
set HB_HOST_BIN=<HarbourPath>\bin\win\msvc64
vcvarsamd64_arm64.bat
win-make
+ also added support for Windows for ARM 32-bit
before calling win-make, setup environment using:
<InstallPath>\BuildTools\VC\Auxiliary\Build\vcvarsarm.bat
or when cross compiling from ARM64 host:
<InstallPath>\BuildTools\VC\Auxiliary\Build\vcvarsarm64_arm.bat
; please test Windows CE builds if you're using compiler newer
than VC2003 for ARM for possible regressions
* contrib/hbmlzo/3rd/minilzo/lzodefs.h
! recognize ARM64 architecture on Windows to fix build error
; consider updating to upstream minilzo 2.10, issue is fixed there
* src/common/hbver.c
* changed to add processor architecture for MSVC compiler string
on non-Intel systems, as exposed by hb_compiler(), harbour /build,
finalapp.exe //build
* tests/speedtst.prg
* workaround that processor architecture can now appear
in hb_compiler(), so it's not printed by speed test twice
* contrib/xhb/xhberror.c
% cleaned code] to overload ERRORNEW() with XHB_ERRORNEW()
* src/rtl/fscopy.c
% removed unnecessary code
* src/rtl/vfile.c
! fixed typo in comment
* src/vm/dynsym.c
+ allow to use symbol items as parameter in functions:
hb_IsFunction(), __dynsGetIndex(), __dynsIsFun()
* contrib/xhb/xhberror.c
! fixed very bad bug introduced in this modification:
2023-01-31 23:19 UTC+0100 Przemyslaw Czerpak
It corrupted dynamic symbol table due to stupid mistake.
I overloaded whole function symbol instead of its address only.
Many thanks to Juan Gálvez who found the problem.
* include/hbdefs.h
! fixed INT64_MIN definition
* src/vm/dynsym.c
* minor change in function order
* src/vm/memvars.c
+ allow to use symbol items in the following functions:
__mvScope(), __mvExist(), __mvGet(), __mvGetDef(), __mvPut()
* include/hbapifs.h
* src/rtl/fscopy.c
+ added new C function:
HB_BOOL hb_fileCopyEx( const char * pszSource, const char * pszDest,
HB_SIZE nBufSize, HB_BOOL fTime,
PHB_ITEM pCallBack );
Unlike hb_fileCopy() it is never redirected to remote server and copy
operation is always done locally.
pCallBack is codeblock or function symbol, it's executed at the
beginning and then on each nBufSize bytes written and receives two
parameters: nBytesWritten, nTotalSize.
Warning: nTotalSize could be 0 when non regular files like pipes or
sockets are copied.
* src/rtl/vfile.c
+ added new PRG function:
hb_vfCopyFile( <cFileSrc>, <cFileDst>, [<nBufSize>=65536], ;
[<lTimePreserve>=.t.], [<bCallBack>] ) --> <nResult>
It's wrapper to hb_fileCopyEx() C function.
For very big files setting <nBufSize> to greater value, i.e. 16777216
may increase performance.
* contrib/gtqtc/gtqtc.hbp
! do not detect QT5 when HB_BUILD_3RDEXT=no is set
* debian/rules
* removed LD_LIBRARY_PATH setting
* src/rdd/dbcmd.c
* src/rdd/wacore.c
! moved code checking WA number from DbSelectArea() PRG function
to hb_rddSelectWorkAreaNumber() C function. It fixes few things
like:
DbSelectArea( 0 )
and also:
? ( 0 )->( select() )
* contrib/hbexpat/3rd/expat/expat.diff
* contrib/hbexpat/3rd/expat/loadlibr.c
! use HB_WINAPI_GETPROCADDRESS() instead of GetProcAddress()
in WinCE builds
* contrib/hbhpdf/3rd/libhpdf/hpdfstre.c
* contrib/hbhpdf/3rd/libhpdf/libhpdf.diff
! include <windows.h> in WinCE builds, it's necessary for GetLastError()
* src/3rd/jpeg/Makefile
! do not use getenv() in all WinCE builds
* src/common/hbver.c
* cast revision number to HB_ULONG to pacify warning
* src/vm/extrap.c
! do not compile unused in WinCE builds hb_winExceptionHandler()
* include/hbapi.h
* added HB_EXPORT attribute to hb_macroTextValue() function
* include/hbvm.h
* src/vm/hvm.c
+ added C function:
PHB_ITEM hb_vmCompileMacro( const char * szExpr, PHB_ITEM pDest );
It returns Harbour item or NULL at error (wrong macro text).
The result should be used with hb_vmEvalBlockOrMacro() and then freed
by hb_vmDestroyBlockOrMacro(). It hides low level macro representation
so we can change it in the future. Now it's still simple pointer item
without autodestructor.
* src/rdd/hsx/hsx.c
* src/rdd/workarea.c
* use hb_vmCompileMacro() instead of hb_macroCompile()
* src/vm/runner.c
* changed 6101 error message for "Unknown or unregistered symbol"
to "Unknown or unregistered function symbol".
* report above error when HRB module is loaded and its external function
is not registered or not marked as DYNAMIC by earlier registered modules
in HVM symbol table.
Warning. This modification may exploit problems in code loading HRB files
with cross references which has worked so far. In such case user should
pass to hb_hrbLoad()/hb_hrbRun() as first parameters flags containing
HB_HRB_BIND_LAZY or declare the problematic function in his main code
as dynamic, i.e.:
DYNAMIC <funcName>
* src/rdd/dbf1.c
* declare internal function hb_dbfTransCheckCounters() as static one
* src/harbour.def
! added missing exported Harbour functions