* contrib/hbide/resources/tabreadonly.png
! Changed: to reflect clearly visible readonly status.
* contrib/hbide/ideedit.prg
* contrib/hbide/ideeditor.prg
+ Implemented: <MainMenu><Edit><Switch ReadOnly Mode> plus
file's "readonly" attribute obtained by hb_fGetAttr() == 33
( please correct me if it is not OK on all systems ).
"Switch ReadOnly Mode" toggles the readonly status of the
current source in focus only if on disk attribute is normal.
ReadOnly status is permanent if disk attribute equals 33 and
cannot be toggled.
While in readonly mode, cut/paste/alter operation are suspened,
only copy operation is supported. Copy can be performed with
mouse and keyboard both and all three modes are available.
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
* contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
* contrib/hbide/ideedit.prg
! More fluency and refinements in selection process spanning
across all three modes.
* debian/rules
- doc/man/hbmk.1
+ doc/man/hbmk2.1
! Renamed to hbmk2 to be in sync with name of the tool.
* Makefile
! Fixed to always descend into utils directory,
because (in 'install' mode) hbrun and hbmk2 needs
to be built regardless of HB_BUILD_PARTS setting.
* contrib/hbfbird/hbfbird.hbi
! Fixed to set output libname. This is needed because
we can't rely on input filename due to mingw trick.
* config/global.mk
+ Show HB_BUILD_IMPLIB setting. Now there is nothing
hackish in it, so it can be fully supported setting.
* config/postinst.prg
% Minor optimizations in hbmk2 invocation lines.
(removed unnecessary spaces, using envvar macros,
deleted unnecessary double quotes)
! Fixed (in two places) to only invoke hbmk2 if
HB_HOST_BIN_DIR envvar is set.
! NSIS invocation command made more friendly to cross
platform environment by using native pathsep.
+ Will now echo the external commands issued to stdout.
* config/postinst.prg
+ Added new experimental envvar:
HB_BUILD_ADDONS=prj1.hbp prj2.hbp prjn.hbp
Harbour build process will initiate the build of the passed
.hbp files at 'install' phase.
% Simplification to other hbmk2 invocation commands.
* contrib/hbwin/win_svc.c
! Fixed to set running status only if entry function
is valid and able to reenter HVM.
+ Added trace message when entry function cannot be found.
* contrib/hbwin/win_svc.c
! Fixed callback definitions to be the ones required by Windows.
! Fixed main service entry callback to use TCHAR rather than simple char.
+ Added support to pass service launch parameters to Harbour entry
function.
* contrib/hbwin/tests/testsvc.prg
+ Added code to demonstrate parameter passing feature.
* contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
! Just to recompile hbqtgui.lib
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
* contrib/hbide/ideedit.prg
! Fixed: more artifacts about selection/copy operations.
* contrib/hbwin/win_srv.c
* Renamed more variables.
* Moved around hb_strfree() calls to fully avoid the possibility
of freeing string pointers still assigned inside Windows
structures.
! WIN_SERVICESTART() fixed to set last error.
* contrib/hbwin/tests/testsrv.prg
! Fixed to have the default action called
when started without parameter. Required
to make it start when started as service.
+ Test service changed to create a file in
a predictable place (next to .exe) and
fill that with output. Made sure that file is
readable by other processes.
* Cleaned service ID/description.
; I've made successful test with current code.
* contrib/hbwin/win_srv.c
! Fixed static variable types and usage.
! Fixed wrongly used string types.
! Fixed storing temporary pointers to static variables.
Making a copy of the strings instead.
% Deleted unnecessary function declarations.
% Using HB_SIZEOFARRAY() instead of repeating size.
! Fixed variable names to reflect type.
; These fixed previously found errors.
* contrib/hbwin/tests/testsrv.prg
* Replaced ALERT() with '?'.
! Fixed to use HB_TR_ALWAYS to avoid Harbour warning.
% FUNCTION -> PROCEDURE
* doc/howtosvn.txt
* More clearing up.
* contrib/hbwin/win_srv.c
! Fixed one TOFIX which was result of s&r on my part.
; TOFIX remaining:
---
../../../win_srv.c: In function 'hbwin_SrvFunction':
../../../win_srv.c:102:4: warning: passing argument 1 of 'RegisterServiceCtrlHandlerW' from incompatible pointer type
f:\devl\mingw-450\bin\../lib/gcc/mingw32/4.5.0/../../../../include/winsvc.h:234:40: note: expected 'LPCWSTR' but argument is of type 'char *'
../../../win_srv.c: In function 'HB_FUN_WIN_SERVICESTART':
../../../win_srv.c:279:21: warning: assignment from incompatible pointer type
../../../win_srv.c:280:21: warning: assignment from incompatible pointer type
---
* doc/howtosvn.txt
+ Made it more clear that 'Chr(36)' should be replaced by '$'.
* ChangeLog
! Stripped accented char. Pls keep all files in 7-bit mode.
* contrib/hbwin/hbwin.ch
* contrib/hbwin/win_srv.c
* contrib/hbwin/tests/testsrv.prg
! Cleanup fixes:
! Fixed missing SVN props (pls see howtosvn.txt and my e-mail today about them)
! Fixed SVN header
! Stripped accented char.
! Deleted <windows.h>.
! Tabs converted to spaces.
! Fixed indentation and formatting.
% Optimized code to have less redundancy.
! Fixed name of static vars.
% Made callbacks static.
! Fixed hbwin.ch constants to have WIN_ prefix.
! Fixed references to unknown functions in test code.
% Test code reworked to have user selectable modes via cmdline parameter.
! Fixed to define all functions also in WinCE mode, but
with dummy functionality.
! Fixed memory potential leak in WIN_SERVICEDELETE().
! Added some casts.
% Variables declarations moved to inner scopes.
; TOFIX:
- UNICODE build problem in hbwin_SrvFunction().
- possible memory corruption in WIN_SERVICESTART()?
- 'implicit declaration of function 'Sets_ServiceStatus'' in hbwin_SrvFunction().
; All the above are shown as mingw warnings.
* contrib/hbqt/doc/en/class_hbqplaintextedit.txt
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
* contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
* contrib/hbqt/qtgui/THBQPlainTextEdit.prg
* contrib/hbqt/qth/HBQPlainTextEdit.qth
* contrib/hbide/idedocks.prg
* contrib/hbide/ideedit.prg
* contrib/hbide/ideeditor.prg
! Fixed: the artifacts reported by Mindaugas and Itamar.
! Optimized: C++ code.
! Fixed: many other artifacts, i.e., status-bar panel was wrongly
reporting selection mode.
Mindaugas, can you please test again ?
+ contrib/hbwin/win_srv.c
+ contrib/hbwin/tests/testsrv.prg
* contrib/hbwin/hbwin.ch
* contrib/hbwin/Makefile
+ Basical support for running a harbour application as a windows server.
See tests/testsrv.prg.
* harbour/contrib/hbwin/olecore.c
! added protection against possible buffer overflow when more then
32 parameters is passed by reference from foreign code - thank to
Mindaugas for locating the problem.
* harbour.spec
* contrib/Makefile
+ contrib/hbsms
+ contrib/hbsms/tests
+ contrib/hbsms/tests/send.prg
+ contrib/hbsms/tests/hbmk.hbm
+ contrib/hbsms/hbsms.prg
+ contrib/hbsms/hbsms.hbc
+ contrib/hbsms/Makefile
* utils/hbmk2/examples/contribf.hbc
+ Readded hbsms lib.
+ Modified to use newly added core com functions
via HBCT .prg level interface. (instead of hbtpathy)
+ Added disclaimer:
EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES.
The code well may be pure crap, so if you have problem
with it, supply working patches. Pls note that the
reader function uses locally implemented timeout
functionality, which may or may not work at all,
though you can fix it if you have better idea.
I've only tested it using Mac OS X 10.6 + old Nokia "S40"
phone and one bad SMS number to see it kicks off at
all and that's also the end of my testing possibilities.
* src/rtl/gtwvt/gtwvt.c
- Deleted notifierblock/fireevent support.
Light is green to add threaded screen refresh and event
handling. This could enhance performance and fix the
frozen screen refresh in Harbour app loops.
; INCOMPATIBLE: Switch to HB_INKEY_GTEVENT + HB_K_* solution.
* tests/wvtext.prg
+ Updated according to latest changes, now using simple INKEY()
method to receive special GT event.
+ Added reaction to 'lostfocus' event.
+ Added better demonstration for lost/got focus events.
- Deleted GTWVG dependent elements, to adhere to core/contrib
separation rule.
* src/rtl/gtwvt/gtwvt.c
* Changed HB_GTI_CLOSABLE to not cause any visible change on the UI.
Setting HB_GTI_CLOSABLE to .F., will now cause that a HB_K_CLOSE
event is returned to application by INKEY(), and app can decide
whether to ignore it or QUIT.
This also means that the feedback is now not an async event in
HB_GTI_CLOSABLE .F. mode, IOW if the app is in a loop without
reading keys, close button won't work, which is IMO closer to
how apps are supposed to behave. It also won't grey out the
close buttong anymore which is also a unusual thing to do
amongst apps.
; TODO: If this turns out to be good solution, sync this behavior
with HBWIN.
; TODO: Delete old "fireevent" async even handling using notifier
callback codeblock.
* include/inkey.ch
+ Added new special GT events (over existing HB_K_RESIZE):
HB_K_CLOSE
HB_K_GOTFOCUS
HB_K_LOSTFOCUS
+ Added new Harbour specific INKEY() event filter:
HB_INKEY_GTEVENT
* INKEY() codes below marked as compatibility:
K_MMLEFTDOWN, K_MMRIGHTDOWN, K_MMMIDDLEDOWN
* src/rtl/hbgtcore.c
! Fixed to only return HB_K_RESIZE/CLOSE/GOTFOCUS/LOSTFOCUS
events when allowed via HB_INKEY_GTEVENT filter.
; INCOMPATIBILITY: HB_K_RESIZE will now only be returned
by INKEY() if this filter is added.
* src/rtl/gtwvt/gtwvt.c
- Deleted code protected by __HB_GTWVT_GEN_K_MMDOWN_EVENTS guard.
+ Will now generate INKEY() event:
HB_K_LOSTFOCUS
HB_K_GOTFOCUS
and
HB_K_CLOSE.
; TOFIX: HB_K_CLOSE doesn't work yet. Probably some rearrengement
of window close control will be needed.
; The goal is to be able to keep "fireevent" feature in a Clipper/Harbour
and thread friendly manner, so it becomes possible to move OS level
UI event into separate thread.
* harbour/contrib/hbwin/hbwinole.h
* harbour/contrib/hbwin/olecore.c
+ added new C function hb_oleDispInvoke()
* harbour/contrib/hbwin/axcore.c
* use hb_oleDispInvoke() - please test if activex controls still work
correctly
* config/global.mk
! Fixed problem caused by $(wildcard) not matching existing
files when using '/dir//file' format (note double slash).
So f.e. it caused autodetection to fail when dir was
speficied as 'C:\mingw\bin\' (with ending backslash) in PATH.
It's good to remove such backslashes anyway, but from now
on it won't cause problem for Harbour build system.
* src/rtl/tget.prg
! Fixed "@RE" picture mask handling in GETs.
Thanks to Aleksander Czajczynski for reporting the
issue with clear example.
The fix applied is a de-hacked version of the one
sent to the list. What's simply done is 'R' being
disabled when used in conjunction with 'E'.
* contrib/hbide/ideprojmanager.prg
! Synchronized to open "Project Tree" if "Open Project..."
is selected from <MainMenu><Files>.
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
% Many artifacts belonging to horizontal scroll while
text is selected. Also few aspects are optimized.
To me it appears as if selection protocol in hbIDE is OK.
Please post your experiences if something is not upto the
expectations.
* contrib/hbide/resources/curlinehilight.png
! Some refinement though not sufficient yet.
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbide/ideedit.prg
! More optimization and behavioral changes is selected text.
Still litte more work to be done.
* contrib/hbide/idesaveload.prg
! Reintroduced "settings.ide" .ini like file, placed along
hbide.ini", to hold Qt written hbIDE settings. This reversal
is triggered by the fact that, under unknown circumstances,
Qt just mangles the hbIDE.ini contents to a level that a lot of
information it stores is lost. This has happened to me many
times after the settings info was made to be retained in
hbIDE.ini itself. Please do not change it until I come up
with the way to read and write byte arrays per Qt.
Below is the little snapshot what Qt inserts some info
inside existing other text not meant for "idesettings" keyword:
=================================
[FIND]
find_1=setselection
find_2="imagesfind_3=images/"
find_4=":/\r\nfind_5=ShowCaretAtCurrentPosition\r\nfind_6=moveExtendsSelection\r\nfind_7=oDlg\r\nfind_8[ MORE LIKE IT ] +
,,,,,\r\n \r\n[General]\r\n \r\n"
[ ALL OTHER SECTIONS BELOW MANGLED AS ABOVE ]
[General]
hbidesettings="@ByteArray( [ PLUS MORE, IT IS CORRECT ]
=================================
* harbour/include/hbapicom.h
* minor modification in defined names
* harbour/src/rtl/hbcom.c
+ added some very seldom (in practice only on Linux kernels >= 2.4
and not by all hardware drivers) supported termios extensions
* harbour/include/hbatomic.h
! fixed typo in non x86 and non MinGW GCC>=4.1 builds reported
on SF bug tracker
* INSTALL
* Clarification to HB_BUILD_IMPLIB usage.
; NOTE: By now it's very easy to create implibs outside
the central make process:
'hbmk2 @contrib/<lib>/<lib>.hbi'
where <lib> is the name of the contrib. Moving
the resuling import library file(s) to our lib
dir has to be done manually in this case.
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
+ Implemented: column selection with mouse honoring vertical scrolling.
Hopefully I may be able to implement horizontal scrolling too.
* INSTALL
* Two minor cleanups
* config/postinst.prg
+ Will now honor HB_CONTRIBLIBS and HB_CONTRIB_ADDONS
when creating import libraries. IOW it will only create
implibs to the contribs actually built.
* utils/hbmk2/hbmk2.prg
+ Added trick when using real xhb toolchain to detect
-tW C flag and in this case automatically select the ST
C RTL library. (Notice that -tW will only be detected
when passed normally via cmdline or script, and not
when using legacy HB_BUILD_CFLAGS envvar or inherited
compiler flags).
+ contrib/gtalleg/gtalleg.hbi
+ contrib/hbblat/hbblat.hbi
+ contrib/hbcairo/hbcairo.hbi
+ contrib/hbcurl/hbcurl.hbi
+ contrib/hbfbird/hbfbird.hbi
+ contrib/hbfimage/hbfimage.hbi
+ contrib/hbgd/hbgd.hbi
+ contrib/hbhpdf/hbhpdf.hbi
+ contrib/hbmysql/hbmysql.hbi
+ contrib/hbpgsql/hbpgsql.hbi
+ contrib/hbssl/hbssl.hbi
+ contrib/rddads/rddads.hbi
+ contrib/sddfb/sddfb.hbi
+ contrib/sddmy/sddmy.hbi
+ contrib/sddoci/sddoci.hbi
+ contrib/sddpg/sddpg.hbi
+ Added local import library generation hbmk2 make files
to each contrib which requires it.
* config/postinst.prg
+ Changed to use contrib local implib creation hbmk2 scripts to
create import libraries.
- Deleted mingw exception for ocilib to use the static library.
Static lib is definitely better, but if someone would like to
use it, it should be done locally/manually, just like for any
other dependency.
+ Solved firebird implib creation hack/exception in contrib
local .hbi file.
; These fix the last "centralization" issues in Harbour make system.
Still remains documentation problem (everything is in INSTALL),
and *nix .deb/.rpm centralized solution for contrib dependencies
and contrib names in general.
* utils/hbmk2/hbmk2.prg
+ Combining multiple -o options (one with name, one with directory)
is now supported in -hbimplib mode. This makes it work like in
other existing modes.
! Fixes regarding -o option combining and dir inheritance.
(beware of regressions here)
* contrib/gtalleg/gtalleg.hbc
* Changed to use import library on Windows with an unmodified name
(containing version).
* src/rtl/hbcom.c
! Fixed one non-ANSI comment.
* ChangeLog
+ Added two changes missed from prev entry:
* utils/hbmk2/hbmk2.prg
+ In -hbimplib mode any options are automatically passed to
import library creation command (so -iflag option is not
absultely needed)
- Deleted -mkimplibms option now replaces by generic -iflag
solution.
! Stripped UTF-8 char from a recent entry.
* harbour/contrib/hbnetio/netiosrv.c
! fixed yet another typo located by Aleksander Czajczyki which
caused internal error (hb_xfree() with NULL pointer)
* harbour/contrib/hbnetio/netiosrv.c
! fixed typo in NETIO_SRVSTATUS() - -2 was always returned
(modification committed by mistake in my previous commit)
! fixed to return .F. by NETIO_SRVSEND{DATA,IETM}() if hb_znetFlush()
reports error.
Many thanks for Aleksander Czajczyński for information about problems
and his extensive tests.
* utils/hbmk2/hbmk2.pt_BR.po
* utils/hbmk2/hbmk2.hu_HU.po
* utils/hbmk2/hbmk2.prg
- Deleted 'experimental' flags from all features.
* Finalized import lib creation feature in hbmk2.
+ Added -hbimplib mode switch (this replaces -mkimplib= option)
+ Input source files (.dlls) now should be passed to
hbmk2 as simple source filenames (without option prefix).
+ Multiple input source files are now supported.
+ Added -iflag= option to pass flags to import library creation
command directly.
* Changed so that target import library name/dir can now be
specified using -o option (like in other modes).
+ Filenames/dirs are now all normalized.
+ Some warnings are now only shown in -info mode.
; F.e.:
'hbmk2 -hbimplib mydll1 mydll2 -omydir -iflag={bcc}-a'
This also means that a simple .hbp file can be created
to solve the import library needs for a given dependency.
* config/postinst.prg
* Adapted to use new import library creation hbmk2 commands.
* src/rtl/hbcom.c
! Fixed minor typo.
* contrib/hbide/plugins/savebackup.hrb
* contrib/hbide/plugins/savebackup.prg
! Fine tuned to receive correct number of parameters.
* contrib/hbqt/doc/en/class_hbqplaintextedit.txt
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
* contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
* contrib/hbqt/qtgui/THBQPlainTextEdit.prg
* contrib/hbqt/qth/HBQPlainTextEdit.qth
* contrib/hbide/hbide.prg
* contrib/hbide/idedocks.prg
+ Added Icon: Toggle current Line Highlight in "Lines" toolbar.
Public API method is ::toggleCurrentLineHilight().
* contrib/hbide/ideedit.prg
* contrib/hbide/ideeditor.prg
* contrib/hbide/ideenviron.prg
! Reverted: line edits font - monospace to GUI.
* contrib/hbide/ideobject.prg
* contrib/hbide/ideplugins.prg
! tuned to send oIDE and cVer as first and second
argument to {plugin}_init( oIde, cVer ).
* contrib/hbide/ideprojmanager.prg
! Reverted: line edits font - monospace to GUI.
* contrib/hbide/ideshortcuts.prg
+ Public Method - ::toggleCurrentLineHilight().
Toggles displaying current line in distinct color.
* contrib/hbide/idethemes.prg
+ Activated: Selection Background slot.
It facilitates to control the color of selections per theme basis.
+ Prepared to toggle matching braces mode - both vs single.
"Setup" dialog will contain its place holder.
% Fixed many other artifacts coming into way, and possibly
might have broken a few ones, please report.
* harbour/external/minizip/ioapi.h
! fixed FreeBSD and HAIKU builds
* harbour/src/rtl/fserr.c
* added translation for EPERM
* harbour/include/Makefile
+ harbour/include/hbapicom.h
* harbour/src/rtl/Makefile
+ harbour/src/rtl/hbcom.c
+ added Harbour multiplatform serial port C API (hb_com*() functions).
implemented code for *nixes, MS-Windows and OS2. DOS is not supported
yet. Please make test on different platforms.
; few notes about this code:
termios (*nix) based builds:
- reading LSR is not supported
- duration in break signal is fixed (at least 0.25 seconds, and not
more that 0.5 seconds)
- DTR/DSR hardware flow control is not supported
- setting error character is not supported
- discard card is supported only on few platforms
- checking input/output flow state is not supported
- if some platforms do not support some termio extensions then
compile time warnings TODO_* should be generated.
MS-Windows builds:
- discard card is not supported
OS2 builds:
- checking for input flow state is not supported
- discard card is not supported
In all builds not all RS-232 hardware flags/state are available.
OS2 build supports most of them,
This code needs to be extensively tested. I wrote it without any
serious tests. Especially OS2 builds should be verified by OS2
users. I wrote this port using only documentation which OS2 API
available in the Internet.
DOS is not supported yet though it's possible to compile termio code
for *nixes with DJGPP. Anyhow it would be very nice if we can add
our own DOS serial port code. I would like to ask if any of you
has low level serial port code in C for DOS (i.e. used with Clipper)
and can send it to us so we can use it with Harbour. I have my
own serial port library for Clipper but it's written in assembler
and it's much wider then sth what we need so it cannot be easy
adopted for Harbour.
* harbour/contrib/hbct/Makefile
+ harbour/contrib/hbct/ctcom1.c
+ harbour/contrib/hbct/ctcom.ch
+ harbour/contrib/hbct/ctcom2.c
+ added CT3 compatible COM_*() functions.
+ added CT3 compatible XMOBLOCK(), XMOCHECK(), ZEROINSERT() and
ZEROREMOVE() functions.
+ added new CT COM function:
COM_DEVNAME( <nComPort> [, <cNewName> ] ) -> <cPrevName>
which can be used to specify device name for given port in modern
systems which do not give direct hardware access for the process.
; few notes about CT3 COM_*() functions in Harbour.
In COM_OPEN() only 1-st parameter is significant, input/output buffer
sizes and trap mode parameters are ignored. In modern OS-es such
functionality is controlled by OS and usually buffered read/write
is always enabled. The sizes of IO buffers can be used only as
suggested IO buffer size for OS in some systems. It's possible that
these additional parameters will be used in DOS builds in the future.
COM_READ() does not support 2-nd parameter <lNoDelete>. It can be
implemented but because we do not have direct access to OS buffers
then we will have to emulate it ourselves what is rather inefficient.
Anyhow I can implement it if users think it's critical.
In COM_CRC() I fixed few CT3 bugs so it's not bug compatible with CT3,
i.e. it works correctly for 8 bit and smaller polynomials instead of
returning 0 or supports much larger polynomials up to 64bits.
For 16/17 bit polynomials it gives the same results as CT3 so for most
common usage it should be binary compatible with CT3.
In ZEROREMOVE() I fixed decoding some wrong CCITT strings which does
not have trailing 0 so it returns empty string "" for such corrupted
data. If someone needs original CT3 behavior for some broken code then
is can be enabled by HB_CT3_ZEROREMOVE_BUG macro.
I haven't implemented few functions.
COM_GETIO(), COM_SETIO(), COM_GETIRQ(), COM_SETIRQ() are not portable
and can be implemented only for really few platforms, i.e. for DOS
when/if we add support for serial ports to Harbour DOS builds.
Similar functionality for all other platforms gives our new function
COM_DEVNAME().
COM_KEY(), COM_SKEY() and COM_EVENT() are also not implemented.
To make them well we should add support for asynchronous events to HVM
and such extension is still unavailable. Some simulation can be
implemented using idle tasks but this can be done also by final
Harbour users so I decided to not make it.
Please test it - I've never used CT3 COM_*() API with Clipper.
* harbour/contrib/hbct/dummy.c
* removed dummy CT3 serial communication functions
; such files with dummy functions introduces very serious problems for
user code because they do not respect original module granularity
effectively breaking overloading only chosen functions so it breaks
also some real Clipper code.