* include/harbour.hbx
* src/rtl/cdpapihb.c
+ added new PRG function:
hb_cdpIsCharIdx( [ <cCdpID> ] [, <lNewMode>] ) -> <lPrevMode>
It returns .T. when given codepage uses custom character indexes
instead of byte indexes.
If <cCdpID> is not specified then current HVM codepage is used.
Optional logical parameter <lNewMode> allows to enable/disable
custom character indexes in codepages which have such functionality,
i.e. UTF8, BIG5, CP950.
* src/rtl/rtlshort.c
* removed __QUITCANCEL() - this function does not exist in Cl*pper.
* src/pp/ppcore.c
! restored previous algorithm for scanning #included files when included
file is given without path
Now the following(Cl*pper compatible) file search algorithm is used
for files which are not marked as system headers (system headers are
enclosed in <>):
1) if file name contains absolute path then open the file from
the given location. If path starts with drive letter then
is always used as absolute path regardless of used path separator
after drive delimiter: ":"
2) if file name contains relative path then open then:
a) try to access included file starting from current directory
b) try to access included file starting from the path taken from
the first compiled file in list of included files
c) check INCLUDE paths (paths specified by -I compile switch and
taken from INCLUDE envvar)
3) if file name does not contain any path then open then:
a) try to access included file starting from the path taken from
the first compiled file in list of included files (if it does
not have any path then starting from current directory)
b) check INCLUDE paths (paths specified by -I compile switch and
taken from INCLUDE envvar)
For files marked as system headers in #include directive (enclosed in <>)
the file name is always used as relative path and Harbour scans only
INCLUDE paths (-I and INCLUDE envvar). It's Harbour extension, Cl*pper
does not support system headers.
; Maybe we should think about adding yet another step between (b) and (c)
in case 2 above and between (a) and (b) in case 3:
- try to access included file starting from the path taken from
the file with #include directive
It should help to create nested projects using relative paths. Maybe
it should even have the highest priority. It could be important only
in case of file name conflicts.
* contrib/hbmzip/mzip.c
* src/rtl/filesys.c
! initialize tm_isdst member of tm structure with -1 to force correct
local time to UTC conversion in mktime()
* src/pp/ppcore.c
! fixed directory include precedence in #included files which
are not marked as system headers (system headers are enclosed in <>)
Now the following order is used:
1) try to access included file as is starting from current directory
2) if included file has relative path then check if the first
compiled file has path and if yes try to access file using this
path as start point
3) check INCLUDE paths (envvar and -I parameter)
Previous version used: 2 for nested files or 1 for first file or when
first file was given without path then 3.
Now we are Cl*pper compatible but such version strongly depends on
current directory which has the highest priority. Personally I do no
like such behavior because it may give different results when current
directory is changed.
* src/vm/classes.c
! fixed __objGetIVars() to correctly serialize objects without any own
and inherited instance variables
* contrib/hbhpdf/3rd/libhpdf/hpdfimac.c
! include string.h
* contrib/hbhpdf/3rd/libhpdf/libhpdf.dif
* rediffed
* src/rtl/filesys.c
! fixed FXO_TRUNCATE flag used without FXO_SHARELOCK in POSIX systems
* src/rtl/net.c
! typo in variable name
* src/vm/task.c
! variable scope
* src/compiler/compi18n.c
* minor variable type update
* ChangeLog.txt
! formatting
* src/rtl/Makefile
* src/rtl/net.c
+ src/rtl/netusr.c
* moved hb_UserName() to separate file. It uses internally getpwuid()
in *nix builds and access to this function adds additional library
dependency which may block static builds in some cases.
TODO: eliminate hb_UserName() from things like initial random seed
to not create unnecessary dependency.
* contrib/gtqtc/gtqtc1.cpp
+ enable software input panel (virtual keyboard) in iOS builds
* src/common/hbprintf.c
* removed modfl() protection with old HB_OS_IPHONE macro.
If someone will need it for some old iOS versions then please read
it protected by HB_OS_IOS and __IPHONE_OS_VERSION_MIN_REQUIRED
macros or inform me about the exact iOS version which do not support
modfl() and I'll add it.
* include/hbatomic.h
* disable GCC atomic macros for GCC <= 4.5 in OS2 builds.
They can be manually enabled by users using:
set HB_USER_CFLAGS=-DHB_USE_GCCATOMIC
* include/hbsetup.h
* set HB_OS_IOS when __IPHONE_OS_VERSION_MIN_REQUIRED is defined
* include/hbsetup.h
* src/common/hbver.c
* detect 64bit ARM CPUs
* contrib/hbct/envparam.c
* contrib/hbnf/getenvrn.c
! disabled ENVPARAM() and FT_GETE() in iOS builds
+ added support for FT_GETE() in OS2 builds
* src/rtl/itemseri.c
! fixed stupid typo which could cause buffer overrun during
serialization of hash items with default value.
Tanks to Abe for reporting the problem.
* src/rdd/workarea.c
! fixed typo in RDDI_AUTOORDER type - it should be numeric
just like in _SET_AUTORDER. Many thanks to Rolf for locating
the problem
* src/debug/dbgentry.c
! fixed typo in my previous commit for AltD() function detection
Thanks to Franček Prijatelj for reporting the problem and Abe
for self contain example
* src/rdd/dbfcdx/dbfcdx1.c
* reverted byte order in Harbour CDX signature - by mistake I used
little endian. When existsing index is open then reverted signatures
are accepted for backward compatiblity though they will be removed
in the future.
* src/rdd/workarea.c
* move results of EVALBLOCK() RDD method from Harbour stack return item
to workarea valResult item instead of copping it.
; Warning: This modification may exploit problems in code which
wrongly looks for result of EVALBLOCK() RDD method in
HVM stack return item instead of workarea valResult item.
* include/harbour.hbx
* src/vm/cmdarg.c
+ added new PRG function
hb_ACmdLine() -> <array>
borrowed from Viktor's branch (2015-03-12 03:02 UTC+0100 Viktor Szakats)
It returns array with all command line parameters. Unlike
hb_AParams( __dbgProcLevel() - 1 )
hb_ACmdLine() returns all parameters also hidden ones just like
hb_CmdLine() function and hb_argv()/hb_argc()
Please also remember that hb_AParams() returns current value of
parameters which could be changed bu user code so they can be different
then original parameters passed to given function.
* src/rtl/gtchrmap.c
* casting
* include/std.ch
* synced casing with Viktor's branch
* include/hbapirdd.h
* include/hbusrrdd.ch
+ added DBTF_RECALL flag which disables transferring record DELETED flag
* src/rdd/dbcmd.c
* src/rdd/workarea.c
! disable transferring DELETED flag to destination area in SORT TO /
__dbArrange() operations
* src/rdd/delim1.c
* src/rdd/sdf1.c
+ added dummy RECALL() methods - now RECALL() can be executed by workarea
TRANSREC() method when DBTF_RECALL flag is set
* src/rdd/dbf1.c
! restored the line with initialization of allocated memory buffer
I deleted by mistake removing my private comments before commit.
Without this line sort could randomly crash on small tables (less
then 65537 sorted records)
* include/Makefile
- include/hbdbsort.h
* src/rdd/Makefile
- src/rdd/hbdbsort.c
* src/rdd/dbf1.c
- completely removed old code used in DBF* RDDs as low level backend
for SORT TO ... command and __dbArrange() function.
It was buggy and extremely inefficient in some cases, i.e. after
20 hours I killed process which was sorting table with 2'000'000
records in reverted order so I cannot even say how much time it
needed.
* src/rdd/dbf1.c
+ added new code for table sorting in DBF* RDDs
(SORT TO ... / __dbArrange() backend)
New code fixes many different problems which existed in previous one
like missing support for national collation, wrong descending orders,
wrong sorting of numeric fields with negative values, missing support
for sorting many field types, missing support for transferring MEMO
fields, missing support for transferring records to table with different
field structure or serving by different RDD, etc.
New code is also many times faster then the old one. In practice it
means is now usable for tables with more then few thousands records,
i.e. the test table with 2'000'000 records I used with old code was
copied in sorted order in 13 secs. when pure COPY TO needed 10 secs.
Now it's possible to export sorted tables to different RDDs, i.e.
using DELIM or SDF RDDs in desitnation area.
New code is written in general form without any local to DBF* RDDs
extensions so it can be adopted as base in any other RDD. Probably
I'll move it to default workarea methods so it will be inherited by
all Harbour RDDs and only if necessary authors of some RDDs may
overload it, i.e. to move the operation to the server side in remote
RDDs when source and destination tables are processed by the same
server.
This modification closes the last known for years bug or rather bag
of bugs ;-) in Harbour.
; NOTE: For large tables new sorting algorithm may access source records
more then once. It means that results may be wrongly sorted when
sorted fields in exported records are modified concurrently by
other station during exporting. This can be easy eliminated by
copping source records to temporary file anyhow it will introduce
additional overhead in all cases and user can easy eliminate the
problem by simple FLOCK before sort or making export to temporary
file and then sorting this file or he can simply ignore this
problem as unimportant in the specific situation so I decided to
not implement double copping.
I haven't tested what Cl*pper exactly does in such case so
I cannot say if current behavior is or isn't Cl*pper compatible.
* src/rdd/dbcmd.c
! fixed __dbArrange() to allow record transfer with the same conditions
as __dbTrans() just like Cl*pper does.
Low level RDD code should respect it, i.e. it should be possible to
sort using fields which exist only in source workarea, the order
and number of fields in source and destination workareas can be
completely different, etc.
Low level DBF* SORT() method is completely broken in such cases and
has to be rewritten.
* contrib/hbtip/smtpcli.prg
! do not execute STARTTLS command if server does not report it's supported
(issue #90)
* src/rdd/dbcmd.c
* use DBI_TRANSREC in __dbTrans() and __dbArrange() (pure record copping
without sorting)
* include/hbapi.h
* src/vm/garbage.c
+ added hb_gcDummyClear() function
* include/hbapirdd.h
* include/hbusrrdd.ch
+ added DBTF_CPYCTR constant value - when set in dbTransInfo.uiFlags
then after record transfer field counters should to be copied from
source to destination area
* include/hbapirdd.h
* src/rdd/wafunc.c
+ added new C functions hb_dbTransInfoPut() and hb_dbTransInfoGet()
which allow to store and retrieve pointer to DBTRANSINFO structure
into/from HB_ITEM with strict type verification.
* src/rdd/wafunc.c
* pass pointer to DBTRANSINFO structure as argument of DBI_TRANSREC
action. It allows RDD serving destination area to decide which
fields and how should be transferred updating uiFlags, uiItemCount
and lpTransItems members of DBTRANSINFO.
If RDD removes all fields from DBTRANSINFO structure (uiItemCount==0)
or does not return HB_SUCCESS for DBI_TRANSREC action (default WA
implementation returns HB_SUCCESS so it's not necessary to overload
it if RDD does not make any additional operations) then record
transfer is interrupted.
* copy field counters only when destination area asked about it setting
DBTF_CPYCTR in dbTransInfo.uiFlags in DBI_TRANSREC action.
* src/rdd/dbf1.c
* do not copy automatically updated fields when destination area
is not empty
* set DBTF_CPYCTR to indicate that counters should be copied from
source to destination area when original value of automatically
updated fields are transferred
; Now DBF* RDDs in Harbour respects the following rules for record
transfer operations (COPY TO / APPEND FROM) with automatically
updated fields:
- COPY TO transfers original values to destination table and
finally copy counters from the source table to destination one
so autoincrement fields in both tables after next append will be
initialized with the same values regardless of number of copied
records - even if only single record is copied then counters in
destination table will inherit next values for new record from
the source table. Also values of RowVer and ModTime fields are
copied from source to destination table and not updated during
transfer operation.
- APPEND FROM works like COPY TO (original field values and then
counters are copied to destination table) if the source table
supports counters and destination table is empty and FLocked()
or opened in exclusive mode.
If source table does not support counters for given fields, i.e.
it is processed by transfer RDD like DELIM or SDF (RDT_TRANSFER)
or destination table is not empty or opened in shared mode and
FLock is not set when APPEND FROM is executed then automatically
updated fields (counters, RowVer, ModTime) are not copied and
initialized with new values like for each new record added to
destination table.
* ChangeLog.txt
! typo in last ChangeLog entry
* include/hbapi.h
! fixed HB_ISMEMO() macro, original version was accepting the same
items as HB_ISCHAR() so it was not compatible with ISMEMO() macro
in Cl*pper.
* src/rtl/valtype.c
* use HB_ISMEMO() macro
* src/rdd/dbf1.c
* src/rtl/hbinet.c
* pacified warnings (Thanks to Grigory)
* src/rdd/dbcmd.c
* src/rdd/wafunc.c
* small code simplification and cleanup
! protection against GPF when wrong parameters are passed to __dbArrange()
+ added support for transferring records using __dbArrange() to area with
different fields order (low level driver may refuse to finish such
operation but not it's possible.
* contrib/rddads/ads1.c
! use AdsSetLongLong() (if available) instead of AdsSetDouble() to not
strip less significant bits from 64bit integer number during conversion
to double
* allow ADS to decide if writing into rowver and modtime fields is legal
instead of generating our own arbitrary RTE
* include/dbinfo.ch
* src/rdd/workarea.c
+ added new dbInfo() action DBI_TRANSREC
It indicates if area is destination table of currently processed COPY TO
or APPEND FROM operation.
* include/hbapirdd.h
* src/rdd/wafunc.c
+ added new C function:
HB_ERRCODE hb_dbTransCounters( LPDBTRANSINFO lpdbTransInfo );
It copies field counters from source into destination table used
in transfer operation.
* src/rdd/dbcmd.c
* src/rdd/wafunc.c
+ call DBI_TRANSREC to inform destination area that record transfer
operation starts and stop. It allows destination RDD to change
rules used for assign to automatically updated fields, i.e. unblock
such operation.
+ call hb_dbTransCounters() to update counters in destination table
after COPY TO operation
* src/rdd/sdf1.c
* src/rdd/delim1.c
* clear AutoInc flag
* src/rdd/dbf1.c
+ allow to set get and set counter for RowVer fields using DBS_COUNTER
action
* return HB_FAILURE for DBS_COUNTER and DBS_STEP if it's not supported
by given field.
+ added support for DBI_TRANSREC - in case of DBF* RDDs it unblocks
writing to automatically updated fields
* ChangeLog.txt
* src/compiler/hbmain.c
* src/nortl/nortl.c
! save and restore SETs which can be modified by -fn[:[l|u]|-],
-fd[:[l|u]|-], -fp[:<char>] and -fs[-] compiler flags.
It fixes problem with HBMK2 so now above switches can be used
with HBMK2.
* src/rdd/delim1.c
* src/rdd/sdf1.c
! disabled code which allows to delete just added record.
It was not Cl*pper compatible and caused bad side effects
in COPY TO ... DELIM | SDF - deleted records were nor
copied
* src/rdd/dbf1.c
+ added support for autoincrement fields with counter longer then 4 bytes
Warning: if someone created tables with such fields i.e. { "I:+", 8, 0 }
after my modification which added support for AutoInc flags in
all numeric DBF fields then he should update counters manually
using DBS_COUNTER flag. New code uses 64bit counters for such
field located in different part of DBFFIELD structure.
* src/compiler/cmdcheck.c
! fixed error messages when wrong parameters are passed.
When wrong parameters are taken from HARBOURCMD or CLIPPERCMD
"Bad command line option '%s'"
error is generated and
"Bad command line parameter '%s'"
when wrong parameters are from command line.
New behavior is Cl*pper compatible.
* contrib/hbssl/tests/inetssl.prg
* contrib/rddads/ads1.c
* src/rtl/teditor.prg
* formatting of my recent modifications taken from Viktor's branch
* src/common/hbfsapi.c
* src/compiler/complex.c
* formatting
* include/hbset.h
* src/vm/set.c
* src/nortl/nortl.c
+ add new C functions to change HVM set values:
hb_setSetFileCase(), hb_setSetDirCase(), hb_setSetDirSeparator(),
hb_setSetTrimFileName()
* include/hbcomp.h
* include/hbcompdf.h
* src/compiler/cmdcheck.c
* src/compiler/hbmain.c
* src/compiler/ppcomp.c
* src/compiler/genc.c
* src/compiler/hbusage.c
* src/nortl/nortl.c
* rewritten code used to parse command line and environment parameters.
New code is covered by GPL + Harbour exception license.
All parameters are decoded by only one function and whole code is
smaller so it's much easier to modify this code.
! fixed some small bugs and incompatibilities with Cl*pper in parameter
parsing
! fixed -y undocumented (YYDEBUG) switch
- removed -x[<prefix>] set symbol init function name prefix (for .c only)
compiler command line switch
* moved -fn[:[l|u]|-] -fd[:[l|u]|-] -fp[:<char>] and -fs[-] switches
parsing to core compiler library. Now these switches are also works
with compiler library linked with HBMK2.
; TOFIX: HBMK2 ignores -fn/-fd switches and allocates temporary names
which are not compatible with names used later by harbour
compiler when above switches are activated. HBMK2 should
parse parameters and update SET FILECASE / SET DIRCASE before
it creates temporary files.
* src/rtl/mlcfunc.c
! fixed MPosToLC() results for position in last line which have to
be moved after analyzing rest of line due to word wrapping.
* src/rtl/teditor.prg
* rewritten whole internal code critical for basic functionality.
+ resolved the problem with keycode conflicts for GTs which
support extended keycodes.
+ added support missing MemoEdit() editor functionality.
; Number of bugs and mistakes was to big to try to update it.
New code is smaller and simpler. I tried to keep compatibility
with previous version and added to new version most of "helper"
methods which are not used in MemoEdit() at all anyhow I cannot
guaranty that all existing code using TEditor will work without
modifications, i.e. I had to remove :SetPos() and all logic bound
with it because it was to hard for my brain to understand this
idea and/or functionality.
If someone needs strict compatibility with previous version then
he should add to his source code copy of old code.
Current code should addressed most of MemoEdit() problems with
text formatting and editing reported in the past though probably
not all. I have no spare time for precise tests of Cl*pper's
MemoEdit().
* src/rtl/memoedit.prg
* overload :InsertState() method to show <insert> SCOREBOARD message
* changed "Abort Edit? (Y/N)" message position to be Clipper compatible
* removed redundant keycode comparison
* do not ::SetPos HBEditor method - this method has been removed
* src/rtl/mlcfunc.c
* modified unpadded MemoLine() mode to return last blank
character in the line
* src/rtl/teditor.prg
! fixed typo in MemoLine() parameters
+ added lSoftCR parameter to GetText() - when it's true returned
text contains SoftCRs
* src/rtl/memoedit.prg
! return text with SoftCRs - Cl*pper compatible
; Above modifications fix initial and result text formatting
in MemoEdit() (#33)
* src/codepage/l_fr.h
+ added 'Ç' and 'ç' characters to set of french letters
; this modification affected "FRISO" and "FRWIN" codepages.
Users using them and above characters in index field should
reindex their databases.
* include/hbcpage.hbx
* src/codepage/Makefile
* src/codepage/cpfr850.c
+ src/codepage/cpfr850c.c
* renamed "FR850" codepage to "FR850C". This is is Cl*pper ntxfre.obj
compatible codepage.
If someone uses DBF files with indexes simultaneously with Cl*pper
applications using collation order defined in ntxfre.obj the he has
to use "FR850C" codepage in Harbour.
Warning: Any users using French "FR850" codepage so far should change
the code to "FR850C".
+ added new French codepage "FR850" with all French characters and
accented equal collation rules.
; above modifications close issue #88