* harbour/src/vm/set.c
! fixed small typos in returned values (FALSE instead of NULL and 0)
* harbour/src/vm/estack.c
* make calling hb_stackTotalItems() safe in MT mode when stack is not
initialized - now this function can be used to check if HVM stack
exists and is initialized in ST and MT mode
* harbour/src/rtl/errintlo.c
! fixed at least 4 GPF traps exploited when hb_errInternal() was called
and HVM stack was not initialized
* harbour/include/Makefile
+ harbour/include/hbcdpreg.h
* harbour/include/hbapicdp.h
* harbour/src/rtl/cdpapi.c
+ added new CDP API which fixes many errors and limitations in old
implementation.
Warning !!! some very serious bugs in national sorting have been
fixed. It may cause that old indexes using some national
sorting will not be compatible. Please rebuild existing
indexes.
* harbour/src/vm/itemapi.c
* harbour/src/rdd/hsx/hsx.c
* harbour/src/rdd/dbfntx/dbfntx1.c
* harbour/src/rdd/dbfnsx/dbfnsx1.c
* harbour/src/rdd/dbfcdx/dbfcdx1.c
* harbour/contrib/hbbmcdx/bmdbfcdx.c
* harbour/contrib/rddads/adsx.c
* harbour/contrib/rddsql/sqlmix.c
* updated to work with new CDP API
TOFIX: update adsx.c and sqlmix.c to use hb_cdpcmp() which resepcts
sorting with accented and mulitybyts characters.
Mindaugas, can you update above code?
* harbour/src/codepage/cpbg866.c
* harbour/src/codepage/cpbgiso.c
* harbour/src/codepage/cpbgmik.c
* harbour/src/codepage/cpbgwin.c
* harbour/src/codepage/cpcs852.c
* harbour/src/codepage/cpcsiso.c
* harbour/src/codepage/cpcskam.c
* harbour/src/codepage/cpcswin.c
* harbour/src/codepage/cpde850.c
* harbour/src/codepage/cpdeiso.c
* harbour/src/codepage/cpdewin.c
* harbour/src/codepage/cpel737.c
* harbour/src/codepage/cpeliso.c
* harbour/src/codepage/cpelwin.c
* harbour/src/codepage/cpes850.c
* harbour/src/codepage/cpes850c.c
* harbour/src/codepage/cpesiso.c
* harbour/src/codepage/cpesisoc.c
* harbour/src/codepage/cpeswin.c
* harbour/src/codepage/cpeswinc.c
* harbour/src/codepage/cpeswinm.c
* harbour/src/codepage/cpfr850.c
* harbour/src/codepage/cpfriso.c
* harbour/src/codepage/cpfrwin.c
* harbour/src/codepage/cphr437.c
* harbour/src/codepage/cphr852.c
* harbour/src/codepage/cphrwin.c
* harbour/src/codepage/cphu852.c
* harbour/src/codepage/cphu852s.c
* harbour/src/codepage/cphuiso.c
* harbour/src/codepage/cphuisos.c
* harbour/src/codepage/cphuwin.c
* harbour/src/codepage/cphuwins.c
* harbour/src/codepage/cpit437.c
* harbour/src/codepage/cpit850.c
* harbour/src/codepage/cpitisb.c
* harbour/src/codepage/cpitiso.c
* harbour/src/codepage/cpitwin.c
* harbour/src/codepage/cpltwin.c
* harbour/src/codepage/cppl852.c
* harbour/src/codepage/cppliso.c
* harbour/src/codepage/cpplmaz.c
* harbour/src/codepage/cpplwin.c
* harbour/src/codepage/cppt850.c
* harbour/src/codepage/cpptiso.c
* harbour/src/codepage/cpro852.c
* harbour/src/codepage/cproiso.c
* harbour/src/codepage/cprowin.c
* harbour/src/codepage/cpru866.c
* harbour/src/codepage/cpruiso.c
* harbour/src/codepage/cprukoi.c
* harbour/src/codepage/cpruwin.c
* harbour/src/codepage/cpsk852.c
* harbour/src/codepage/cpskiso.c
* harbour/src/codepage/cpskkam.c
* harbour/src/codepage/cpskwin.c
* harbour/src/codepage/cpsl437.c
* harbour/src/codepage/cpsl852.c
* harbour/src/codepage/cpsliso.c
* harbour/src/codepage/cpslwin.c
* harbour/src/codepage/cpsrwin.c
* harbour/src/codepage/cpsv850.c
* harbour/src/codepage/cpsvclip.c
* harbour/src/codepage/cpsviso.c
* harbour/src/codepage/cpsvwin.c
* harbour/src/codepage/cptr857.c
* harbour/src/codepage/cptriso.c
* harbour/src/codepage/cptrwin.c
* harbour/src/codepage/cpua1125.c
* harbour/src/codepage/cpua866.c
* harbour/src/codepage/cpuakoi.c
* harbour/src/codepage/cpuawin.c
* harbour/src/codepage/uc037.c
* harbour/src/codepage/uc1006.c
* harbour/src/codepage/uc1026.c
* harbour/src/codepage/uc1125.c
* harbour/src/codepage/uc1250.c
* harbour/src/codepage/uc1251.c
* harbour/src/codepage/uc1252.c
* harbour/src/codepage/uc1253.c
* harbour/src/codepage/uc1254.c
* harbour/src/codepage/uc1255.c
* harbour/src/codepage/uc1256.c
* harbour/src/codepage/uc1257.c
* harbour/src/codepage/uc1258.c
* harbour/src/codepage/uc424.c
* harbour/src/codepage/uc500.c
* harbour/src/codepage/uc737.c
* harbour/src/codepage/uc775.c
* harbour/src/codepage/uc850.c
* harbour/src/codepage/uc852.c
* harbour/src/codepage/uc855.c
* harbour/src/codepage/uc856.c
* harbour/src/codepage/uc857.c
* harbour/src/codepage/uc860.c
* harbour/src/codepage/uc861.c
* harbour/src/codepage/uc862.c
* harbour/src/codepage/uc863.c
* harbour/src/codepage/uc864.c
* harbour/src/codepage/uc865.c
* harbour/src/codepage/uc866.c
* harbour/src/codepage/uc869.c
* harbour/src/codepage/uc874.c
* harbour/src/codepage/uc875.c
* harbour/src/codepage/uc885910.c
* harbour/src/codepage/uc885911.c
* harbour/src/codepage/uc885913.c
* harbour/src/codepage/uc885914.c
* harbour/src/codepage/uc885915.c
* harbour/src/codepage/uc885916.c
* harbour/src/codepage/uc88591b.c
* harbour/src/codepage/uc8859_1.c
* harbour/src/codepage/uc8859_2.c
* harbour/src/codepage/uc8859_3.c
* harbour/src/codepage/uc8859_4.c
* harbour/src/codepage/uc8859_5.c
* harbour/src/codepage/uc8859_6.c
* harbour/src/codepage/uc8859_7.c
* harbour/src/codepage/uc8859_8.c
* harbour/src/codepage/uc8859_9.c
* harbour/src/codepage/ucascii.c
* harbour/src/codepage/ucatari.c
* harbour/src/codepage/uckam.c
* harbour/src/codepage/uckoi8.c
* harbour/src/codepage/uckoi8u.c
* harbour/src/codepage/ucmacce.c
* harbour/src/codepage/ucmaccyr.c
* harbour/src/codepage/ucmacgrk.c
* harbour/src/codepage/ucmacice.c
* harbour/src/codepage/ucmacrom.c
* harbour/src/codepage/ucmactrk.c
* harbour/src/codepage/ucmaz.c
* harbour/src/codepage/ucmik.c
* harbour/src/codepage/ucnext.c
* updated for new CP API
Warning: please test all national CPs. I'm not able to test unknown for
me national character conditions so it's possible that I made
something wrong. Additionally current CP API does not have
some limitations which existed in the old one so now some hacks
or workarounds can be cleaned. I.e. now all translations are
done using Unicode tables so it's not necessary to use the
same number of characters to make them working.
Updating CP files I've found the following potential problems
in definitions which I haven't fixed or fixed only partially:
cpes850c.c - update for new format removing hacks for old CP
implementation
cpesisoc.c > remove, it's not longer necessary
cpeswinc.c /
cpeswinm.c - it is the same as cpesiso.c so it should be removed
cphu852.c \
cphu852s.c \
cphuiso.c > update for new format removing hacks for old CP
cphuwin.c / implementation
cphuisos.c > remove, it's not longer necessary
cphuwins.c /
cphr437.c > does it really use CP-437? and ^]\[@~}|{` instead of
cpsl437.c / nationalletters or it uses different then 437 CP for
7-bit Croatian characters encoding. It's important
because without valid unicode table translations will
not work.
cpit437.c - update for new version if necessary (upper characters)
cpsv850.c \
cpsviso.c > they had ACCENTED_INTERLEAVED but without ACCENTED_EQUAL
cpsvwin.c / so this setting was ignored. Now it's not ignored.
cpsvclip.c - update for new format to be fully not only
"almost compatible with Clipper's NTXSWE.OBJ"
For sure these are not all problems inherited from old CP
implementation so please verify all existing CPs.
* harbour/src/codepage/cp_tpl.c
+ added new example for CP definition. Working on new CPs please read
this description:
If accented characters need special sorting ( HB_CDP_ACSORT_EQUAL or
HB_CDP_ACSORT_INTERLEAVE ) then you need to mark the accented
characters with the symbol '~' before each of them, for example:
a~_
If there is two-character sequence, which is considered as one, it
should be marked with '.' before and after it, for example:
... h.ch.i ...
if such multibyte character has its own Unicode representation then
this Unicode value can be set using '=' symbol, for example:
....h.ch=2A7C.i
and it will be used in translations.
The Upper case string and the Lower case string should use the
same letters. If some characters does not have corresponding upper
or lower letter then space ' ' can be used as dummy character, for
example in German CPs there is no upper case 'scharfes S' letter
so space is used as dummy character.
HB_CP_LATIN should be 1 if the national alphabet is based on Latin
otherwise 0
Please note that now you can use two versions of CP definition.
The 1-st one which uses human readable form similar to the old CP
definition and 2-nd which uses directly final CP tables so it
allows to replicate any conditions which existed in Clipper or
any other compatible language which uses static tables.
tests/cpinfo.prg can generate automatically .c files with new CP
definition in the 2-nd version. Now if user wants to create new
Harbour CP which is fully Clipper compatible he only has to
compile and link cpinfo.prg with given national sorting module
and then execute it with new Harbour CP name as 1-st parameter.
cp<cpname>.c file is generated which can be added to Harbour
repository. Optional 2-nd parameter is CP description and 3-rd
is Harbour Unicode table ID (if not given 437 is used and should
be updated by user in .c file). This method should definitely
resolve any problems with creating Clipper compatible CP definition.
It also allows to easy verify if CP definitions are compatible. It's
enough to compare generated .c files.
* harbour/src/codepage/uckam.c
! fixed Kamenicky Unicode table definition - it was Mazovia CP :)
* harbour/src/codepage/cpde850.c
* harbour/src/codepage/cpdeiso.c
* harbour/src/codepage/cpdewin.c
! fixed CP wrongly encoded CP due to limitations in old CP definition.
Now it's possible to define different number of upper an lower
characters (space " " can be used as dummy character) and I used
it to eliminate hack for 'scharfes S' which does not exists as upper
case.
Please clean other CPs which contain similar hacks.
* harbour/src/codepage/cphu852.c
* harbour/src/codepage/cphuiso.c
* harbour/src/codepage/cphuwin.c
* harbour/src/codepage/cpua866.c
* removed dummy letters introduced for old translation code
* harbour/src/rtl/natmsg.c
* harbour/src/rtl/cdpapi.c
* harbour/include/hbextern.ch
+ added HB_CDPINFO() function
* redirected _NATSORTVER() function to HB_CDPINFO()
To All,
Please check your national sorting in current version and make
any updates if necessary or inform me about found problems.
I've checked that Polish CPs are working fine and all existing
CPs passes my test program which verified some technical aspects
of CP implementation. But I cannot verify if this definitions
satisfy users in different countries.
* intentionally removed DOC header/footer so that hbdoc/hbdoc2 ignore this file
* please see en-EN/hbinet.txt which now replaces this file
* harbour/examples/hbdoc2/hbdoc2.prg
* removed 'merge' lines mistakenly left in
* harbour/src/rtl/strcase.c
* harbour/src/rtl/cdpapi.c
* moved some CP dependent functions from strcase.c to cdpapi.c
They will be reimplemented in new CDP code.
* harbour/src/rtl/cdpapi.c
* harbour/include/hbapicdp.h
+ added new C functions to eliminate direct access to HB_CODEPAGE
structure by non core code
* harbour/src/rtl/gtcgi/gtcgi.c
* harbour/src/rtl/gtpca/gtpca.c
* harbour/src/rtl/gtstd/gtstd.c
* harbour/src/rtl/gtcrs/gtcrs.c
* harbour/src/rtl/gtsln/gtsln.c
* harbour/src/rtl/gttrm/gttrm.c
* harbour/src/rtl/gtxwc/gtxwc.c
* harbour/src/rtl/gtdos/gtdos.c
* harbour/src/rtl/gtwin/gtwin.c
* harbour/src/rtl/gtwvt/gtwvt.c
* harbour/contrib/gtwvg/gtwvg.c
* harbour/contrib/gtqtc/gtqtc.cpp
* updated to eliminate direct access to HB_CODEPAGE structure
* utils/hbmk2/hbmk2.prg
! Deleted 'lib' prefix for os2/gcc targets to sync it
with Harbour GNU make build setup.
See my mail on dev list for other options.
* utils/hbmk2/hbmk2.prg
* config/os2/gcc.mk
! Fixed to use .lib extension in gccomf mode. As far I could
debunk it from lenghty e-mail, this is the default extension for
libs, used by OS/2 GCC in OMF mode.
If not, don't blame me.
! Fixed to not use lib prefix in gccomf mode.
It does seem alright but due to no testing again give me
*very short correction information*, if this turns out to be
false.
* contrib/hbct/disk.c
! Typo in comment.
* harbour/utils/hbmk2/hbmk2.prg
! fixed incremental mode for @.clp files.
I tried to make all modifications locally to not break
some other code which may need "@" in file names because
I do not know hbmk2 code.
* utils/hbmk2/hbmk2.prg
* config/os2/gcc.mk
* Changed to use GCC default extensions for objects and libs
even in OMF mode.
! This fixed hbmk2 problems reported by David Arturo Macias Corona.
; Please verify if now also changed lib extension didn't create
any new problem in hbmk2, f.e. when using -strip option.
* INSTALL
+ Added EXAMPLEs for Windows SDK 7. There is included compiler
there for almost all combinations, only Itanium didn't work
for me out of the box.
This is the simplest and most slim way to use MSVC compiler,
and also free.
* harbour/src/common/hbstr.c
! fixed typo in HB_TRACE message - problem reported by Alex
* harbour/src/rtl/cdpapi.c
! fixed casting for C++ builds - problem reported by Marcos
* harbour/src/rtl/cdpapi.c
* harbour/include/hbapicdp.h
+ added two new functions hb_cdpU16ToStr() and hb_cdpU16LEToStr()
* harbour/doc/xhb-diff.txt
! fixed typo in code example reported by Guy Roussin
! fixed some other typos - i.e. in detached local description
* config/win/bcc.mk
+ Added hack to automatically configure bcc compilers
which makes proper setup of bcc32.cfg and ilink32.cfg
unnecessary. NOTE: This only works if you use compiler
autodetection, which means DON'T set HB_COMPILER to bcc
manually.
; Please make tests, f.e. I didn't test .dll creation.
* config/global.mk
+ Exporting autodetected compiler PATH.
* config/rules.mk
* Moved linker flags before output name option to make
some tools happy (bcc in this case).
* INSTALL
- Deleted just added extra NOTE for bcc users. Now it should
be configured automatically.
* config/global.mk
+ Added autodetection of x86_64 architecture on win platform
even when using 32-bit build of GNU Make.
(This makes usage of 64-bit build of GNU Make less important.)
* include/hbdefs.h
* Changed HB_SIZE to ULONG. Added TOFIX to later change it
to 'long'. With its current setup it's possible to gradually
change 'ULONG' usages to 'HB_SIZE' when used as string/array
length ot index. This can be a gradual process.
* include/hbdefs.h
+ Added HB_MAX[U]INT as new name for HB_[U]LONG.
+ Added HB_[U]LONG to new type list with TOFIX note.
* Changed HB_ATTR to not rely on Windows type.
- Deleted hb[Type] style types from planning.
* config/detect.mk
- Disabled OpenSSL detection for bcc.
For some reason it's building with errors now.
I can't figure what change caused this as it was building
fine a month ago. It's not the hbssl source code, openssl
sources are the same, I have no time to figure it out.
Anyway it wasn't working with bcc at link time anyway.
* include/hbdefs.h
+ Added new planned types. These are meant to replace previous
proposition with the format 'hb<Type>'. New ones use usual
'HB_<TYPE>' format. Also added HB_TRUE and HB_FALSE.
These new names don't look alien at all in code, so hopefully
we can go into the transition with more courage. As a plus,
some of the HB_TYPE format types are already implemented and
used (HB_WCHAR, HB_LONG, HB_ULONG, etc).
A new important type is HB_SIZE, which I hope will replace
ULONG for string and array indices.
* Changed HB_CHAR to be declared as 'char' instead of 'BYTE'.
(this type was added long ago, but is not yet used anywhere
in code)
* Changed HB_COLOR to be declared as 'int' instead of 'BYTE'.
(this type was added long ago, but is not yet used anywhere
in code, since then we've settled to 'int' to represent
colors. Pbly we should move to use this abstract type instead
of int in code.)
; I left hb<Type> code as of yet, but if there is no objection,
I'd like to remove them.
; Here are the new types:
HB_TRUE
HB_FALSE
HB_BOOL
HB_BYTE
HB_CHAR
HB_ULONG
HB_LONG
HB_UINT
HB_SHORT
HB_USHORT
HB_LONGLONG
HB_ULONGLONG
HB_I8
HB_U8
HB_I16 ( HB_I16_MIN, HB_I16_MAX )
HB_U16 ( HB_U16_MAX )
HB_I32 ( HB_I32_MIN, HB_I32_MAX )
HB_U32 ( HB_U32_MAX )
HB_I64 ( HB_I64_MIN, HB_I64_MAX )
HB_U64 ( HB_U64_MAX )
HB_SCHAR
HB_UCHAR
HB_SIZE
HB_DOUBLE
; QUESTION: Do we really need 3 different flavors to denote char/byte?
HB_BYTE - HB_UCHAR - HB_U8
HB_CHAR - HB_SCHAR - HB_I8
If not, we should decide which ones to keep.
If yes, it would be nice to have some guide when to use which.
* utils/hbmk2/hbmk2.prg
+ Added plans (TODO) for next gen compiler autodetection.
This will surpass currently implemented autodetection in
build system. The basic feature added is detection of all
compilers supported by Harbour installation, so it's not
possible to select one which is not installed, plus more
feedback can be given to user. It also cleans embedded vs
in-PATH compilers and gives an easier way to prioritize
found compilers. This is definitely scheduled after
2.0.0 release, and when I have (more) time.
* contrib/hbqt/generator/hbqtgen.prg
* contrib/hbqt/hbqt.h
* contrib/hbqt/hbqt_destruct.cpp
* contrib/hbqt/hbqt_slots.cpp
* contrib/hbqt/hbqt_slots.h
* contrib/hbqt/moc_slots.cpp
* contrib/hbxbp/tests/demoxbp.prg
* contrib/hbxbp/xbpbrowse.prg
* contrib/hbxbp/xbpdialog.prg
* contrib/hbxbp/xbpgeneric.prg
* contrib/hbxbp/xbpmenubar.prg
* contrib/hbxbp/xbpwindow.prg
* contrib/qtgui/QTableView.cpp
* contrib/qtgui/TQTableView.prg
! Some more debug information included.
Please note that the build may be broken, so bear with me for a
couple of days. Lorenzo, you can continue with experiments.
* harbour/contrib/rddads/ads1.c
! In APPEND metohd generate RT error EG_APPENDLOCK only if ACE returns
1024 error code (Append Lock Failed). In all other cases generate
EG_CORRUPTION RTE.
This modifications allows to early detect some serious problems like
index corruptions in Mindaugas example with long keys in ADSCDX.
Warning! Before ADS RDD generated EG_APPENDLOCK for each errors
returned by AdsAppendRecord() and they were caught by default error
handler (ERRORSYS) and silently converted to NetErr().
Now only for 1024 ACE error which is real append lock error
EG_APPENDLOCK is generated and all other errors will not be silently
ignored so it's also possible that this modification will exploit
some errors in concurrent accessed which are not reported by ADS/ACE
as 1024 and maybe we will have to report them as EG_APPENDLOCK too.
In such case please send information about such error codes here.
* harbour/src/rdd/dbfcdx/dbfcdx1.c
% added small protection against code which may want to create
degenerated index tree using very large keys (over 158 bytes length)
+ w64-make.exe
+ Added win64 build of GNU Make 3.81.90-CVS-20090901.
Experimental. On 64-bit Windows systems it's generally
recommended to use this version, but please be aware of
the experimental nature of this build yet. There are
some pending patches in GNU Make bug tracker, plus latest
CVS is broken so I used the latest good one.
* INSTALL
+ Added NOTE for Borland C++ users how to setup their
compiler. This is repetition of Borland readme content
which seemingly nobody reads and do this day many users
get wrong. I'm not sure if these same users will read
INSTALL, but let's give it a try.
* ChangeLog
! Fixed my timezone since last weekend.
* package/winuni/RELNOTES
+ Provisions for next version: MinGW 4.4.1 updated documented.
Now at TDM-2, fixing some seriously looking performance
problem. (tdragon.net distro)
* INSTALL
* Minor fix to UPX supported platforms.
* contrib/hbmisc/Makefile
+ contrib/hbmisc/ffind.c
+ Added direct file find API from my own function collection:
FILEFINDFIRST( <cFileNameMask>, @<ffindinfo>[, <nAttr> ] ) -> <lFound>
FILEFINDNEXT( <ffindinfo> ) -> <lFound>
FILEFINDNAME( <ffindinfo> ) -> <cFileName> (without drive/dir)
FILEFINDATTR( <ffindinfo> ) -> <nAttr>
FILEFINDSIZE( <ffindinfo> ) -> <nSize>
FILEFINDDATE( <ffindinfo> ) -> <dDate>
FILEFINDTIME( <ffindinfo> ) -> <cTime> (as "HH:MM:SS")
It's an alternative to DIRECTORY()/FILE() functions.
; NOTE: To release the file find handle on some platforms
(like Windows), and allow deletion of the dir we've
been scanning, <ffindinfo> should go out of scope or
be explicitly release by freeing <ffindinfo> variable.
To make this easy, some may want to add:
#xtranslate FILEFINDCLOSE( <f> ) => \( <f> := NIL \)
#xtranslate FILEFINDCLOSE( @<f> ) => \( <f> := NIL \)
; NOTE: Could be extended to return new timestamp format.
* contrib/rddads/adsfunc.c
+ Added lAlive := AdsIsConnectionAlive( hConnection ) function.
Borrowed from Augusto Infante / xhb.
Three small fixes applied.
* harbour/src/common/hbgete.c
* harbour/src/common/hbffind.c
* harbour/src/common/hbfsapi.c
* harbour/src/rtl/fstemp.c
* harbour/src/rtl/filesys.c
* harbour/src/rtl/diskspac.c
* harbour/src/rtl/disksphb.c
* harbour/src/rtl/net.c
! fixed memory leak reported by Pritpal
* cleanup some UNICODE conversions in Windows builds (mostly resolved
some macros when UNICODE macro is also explicitly used and cleaned
some buffers length passed to windows functions.
* removed unnecessary casting - if it's not necessary for some strange
reasons never cast strings to LP[C][TW]STR calling windows functions.
Such casting does not make any conversions but only hides potential
bugs.
* harbour/contrib/hbwin/axcore.c
* pacified warning
* harbour/doc/xhb-diff.txt
+ added information about Harbour and xHarbour versions described by
above text - thanks to Chen for suggestion
* small update for HBNETIO and HBMEMIO
+ harbour/doc/xhb-diff.txt
+ added text which describes most important differences between Harbour
and xHarbour with some references to Clipper and other compatible
compilers like xBase++, CLIP, FlagShip.
Many thanks to Viktor and Pritpal for updating this text.
* utils/hbmk2/hbmk2.prg
! Fixes to lib dependency detection code.
It should now work on darwin/bsd/hpux/beos gcc/clang/sunpro
platforms/compilers but obviously I didn't test them all
(only darwin/clang).
There was one typo hitting generic branch of lib detection
plus lib prefix was not taken into account at all there.
Probably on some platforms it would be better to implement
target specific lib searching algorithm to mimic actual
linker behaviour. Currently, differences are to be expected.
- Deleted gccomf from a win/wce only branch in LibExists().