diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 530c563829..59e98bd631 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,10 +16,65 @@ The license applies to all entries newer than 2009-04-28. */ +2010-07-16 18:22 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * external/minizip/minizip.dif + + Updated after latest changed by Tamas Tevesz. Thanks a lot! + + * utils/hbmk2/hbmk2.prg + + Added support for vxworks/diab compiler. + + * utils/hbtest/hbtest.prg + + Added my name to the copyright header. + + * config/global.mk + ! Fixed to only assign *nix specific default value HB_INSTALL_PREFIX + on *nix hosts (only a problem when doing *nix cross-builds _from_ + non-*nix systems). + + * utils/hbmk2/hbmk2.prg + * config/vxworks/gcc.mk + * config/vxworks/diab.mk + + Added minimal support for HB_BUILD_SHARED=yes for vxworks targets. + For diab it just won't find the harbour .so (see comment for more) + For gcc it links okay, though it's detected as kernel task, so + current support is most probably not right. + + * config/vxworks/diab.mk + * Minor change to sync one C compiler option with VxWorks Workbench + generated one. + + ; NOTE: By this change Harbour VxWorks base port is finished. Besides + being an interesting excercise, it helped to develope new + non-*nix to *nix cross building codepaths, tweak Harbour for + "headless" (w/o terminal) OSes, and to break the ground for + target CPU selection inside one target platform. + Harbour builds cleanly using both vxworks/gcc and vxworks/diab, + and compiler tools plus non-MT utils run properly as well. + + Obviously I made few functional tests, but from the experiences + of the port effort, these are the remaining areas: + - reporting bug(s) to Wind River (particularly the one + breaking hvm.c compilation, requiring HB_LONG_LONG_OFF + forcage, causing other unnecessary limits and hbtest + failures) + - serial I/O needs to be implemented using VxWorks specific + sioLib API + - 'fork' has to be replaced. + - sockets were not tested, anyhow they are supposed to work. + - termios is missing, so large parts of GTSTD and GTTRM are + disabled on this platform. + - ARM/MIPS CPU support needs to be added to hbatomic.h + - HB_LIBLOAD() and friends need to be implemented, but I hit + walls here. + - MT apps GPFs, this needs to be fixed probably inside our + code, but it's possible some build options are needed which + I missed all along. + - HB_SHARED_MODE=yes needs further tweaking. + 2010-07-16 09:04 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbide/idebrowse.prg - ! Fixed: ideDBU - sequential search on a character field was - making exact comparison, i.e., fieldval == searchval, now + ! Fixed: ideDBU - sequential search on a character field was + making exact comparison, i.e., fieldval == searchval, now it is : fieldval = searchval. 2010-07-16 15:15 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) @@ -346,7 +401,7 @@ ; TOFIX: - Unrecoverable error 9998: Harbour terminal (GT) initialization failure - when running hbtest. + when running hbtest. [DONE] - GPF when running hbmk2 and hbrun. (hbformat, hbi18 startup fine) It's related to MT mode. @@ -452,7 +507,7 @@ ; NOTE: - vxworks has no termios, for serial comm support it has sioLib.h. - vxworks supports another C compiler, which - was not tested yet. + was not tested yet. [DONE] - vxworks supports lots of CPUs, only x86 was tested yet. - There are still mutex related warnings to sort out. diff --git a/harbour/config/global.mk b/harbour/config/global.mk index 91d4fd4e29..8256955fbc 100644 --- a/harbour/config/global.mk +++ b/harbour/config/global.mk @@ -1447,6 +1447,7 @@ else ifneq ($(DESTDIR),) HB_INSTALL_PREFIX := $(DESTDIR) else + ifneq ($(HB_HOST_PLAT_UNIX),) # Stick to *nix customs. I do not like it, it needs admin. HB_INSTALL_PREFIX := /usr/local # Add postfix for cross builds @@ -1457,6 +1458,7 @@ else endif endif endif + endif HB_INSTALL_PREFIX := $(subst /,$(DIRSEP),$(HB_INSTALL_PREFIX)) else diff --git a/harbour/config/vxworks/diab.mk b/harbour/config/vxworks/diab.mk index 56592ab053..fd347d7ba3 100644 --- a/harbour/config/vxworks/diab.mk +++ b/harbour/config/vxworks/diab.mk @@ -76,6 +76,12 @@ DLIBPATHS := $(foreach dir,$(LIB_DIR) $(SYSLIBPATHS_DYN),-L$(dir)) LDLIBS := $(foreach lib,$(HB_USER_LIBS) $(LIBS) $(SYSLIBS_BIN),-l$(lib)) +ifeq ($(HB_BUILD_SHARED),yes) + # TOFIX: .so is referred by it's full link time search path, + # there is even a backslash present in the dir formed by + # the linker + LDFLAGS += -Wl, -Xdynamic +endif LDFLAGS += $(LDLIBPATHS) AR := $(HB_CCPREFIX)dar diff --git a/harbour/config/vxworks/gcc.mk b/harbour/config/vxworks/gcc.mk index c70a730fdd..de7d356b3d 100644 --- a/harbour/config/vxworks/gcc.mk +++ b/harbour/config/vxworks/gcc.mk @@ -54,6 +54,10 @@ DLIBPATHS := $(foreach dir,$(LIB_DIR) $(SYSLIBPATHS_DYN),-L$(dir)) LDLIBS := $(foreach lib,$(HB_USER_LIBS) $(LIBS) $(SYSLIBS_BIN),-l$(lib)) +ifeq ($(HB_BUILD_SHARED),yes) + # TOFIX: no entry point + LDFLAGS += -shared +endif LDFLAGS += $(LDLIBPATHS) AR := $(HB_CCPREFIX)ar$(HB_CCPOSTFIX) diff --git a/harbour/external/minizip/minizip.dif b/harbour/external/minizip/minizip.dif index cf380354dc..ad352b8be7 100644 --- a/harbour/external/minizip/minizip.dif +++ b/harbour/external/minizip/minizip.dif @@ -1,6 +1,6 @@ diff -urN minizip.orig/crypt.h minizip/crypt.h ---- minizip.orig/crypt.h 2010-07-16 00:52:06.960236990 +0200 -+++ minizip/crypt.h 2010-07-16 00:52:06.970234708 +0200 +--- minizip.orig/crypt.h 2010-07-16 15:11:30.820235577 +0200 ++++ minizip/crypt.h 2010-07-16 15:11:30.820235577 +0200 @@ -38,6 +38,8 @@ * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ @@ -11,8 +11,8 @@ diff -urN minizip.orig/crypt.h minizip/crypt.h return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } diff -urN minizip.orig/ioapi.c minizip/ioapi.c ---- minizip.orig/ioapi.c 2010-07-16 00:52:06.980235219 +0200 -+++ minizip/ioapi.c 2010-07-16 00:52:06.980235219 +0200 +--- minizip.orig/ioapi.c 2010-07-16 15:11:30.820235577 +0200 ++++ minizip/ioapi.c 2010-07-16 15:11:30.820235577 +0200 @@ -15,6 +15,7 @@ #endif @@ -143,9 +143,9 @@ diff -urN minizip.orig/ioapi.c minizip/ioapi.c pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; diff -urN minizip.orig/ioapi.h minizip/ioapi.h ---- minizip.orig/ioapi.h 2010-07-16 00:52:06.980235219 +0200 -+++ minizip/ioapi.h 2010-07-16 00:52:06.980235219 +0200 -@@ -21,29 +21,40 @@ +--- minizip.orig/ioapi.h 2010-07-16 15:11:30.820235577 +0200 ++++ minizip/ioapi.h 2010-07-16 15:11:30.820235577 +0200 +@@ -21,29 +21,50 @@ #ifndef _ZLIBIOAPI64_H #define _ZLIBIOAPI64_H @@ -189,10 +189,20 @@ diff -urN minizip.orig/ioapi.h minizip/ioapi.h +#include "hbsetup.h" + ++#if defined( HB_OS_VXWORKS ) && defined( _STD_USING_INT_TYPES ) ++ /* NOTE: Hack to avoid collision between stdint.h and types/vxTypes.h. [vszakats] */ ++ #ifndef __BIT_TYPES_DEFINED__ ++ #define __BIT_TYPES_DEFINED__ ++ #endif ++ #ifndef _SYS_INT_TYPES_H ++ #define _SYS_INT_TYPES_H ++ #endif ++#endif ++ +#if defined( __BORLANDC__ ) || \ + defined( __WATCOMC__ ) || \ + defined( __MINGW32CE__ ) || \ -+ defined( __DCC__ ) || \ ++ defined( HB_OS_VXWORKS ) || \ + defined( HB_OS_BSD ) || \ + defined( HB_OS_DARWIN ) || \ + defined( HB_OS_HAIKU ) || \ @@ -204,8 +214,8 @@ diff -urN minizip.orig/ioapi.h minizip/ioapi.h #define fopen64 fopen #define ftello64 ftell diff -urN minizip.orig/unzip.c minizip/unzip.c ---- minizip.orig/unzip.c 2010-07-16 00:52:07.040236336 +0200 -+++ minizip/unzip.c 2010-07-16 00:52:07.040236336 +0200 +--- minizip.orig/unzip.c 2010-07-16 15:11:30.870234454 +0200 ++++ minizip/unzip.c 2010-07-16 15:11:30.870234454 +0200 @@ -68,13 +68,17 @@ #include #include @@ -293,8 +303,8 @@ diff -urN minizip.orig/unzip.c minizip/unzip.c pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; diff -urN minizip.orig/zip.c minizip/zip.c ---- minizip.orig/zip.c 2010-07-16 00:52:07.100236615 +0200 -+++ minizip/zip.c 2010-07-16 00:52:07.100236615 +0200 +--- minizip.orig/zip.c 2010-07-16 15:11:30.930234949 +0200 ++++ minizip/zip.c 2010-07-16 15:11:30.930234949 +0200 @@ -29,16 +29,20 @@ #include "zlib.h" #include "zip.h" diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index e755548fa0..09eaf2fb37 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -2700,14 +2700,8 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF hbmk[ _HBMK_lDEBUG ] AAdd( hbmk[ _HBMK_aOPTC ], "-g" ) ENDIF - IF hbmk[ _HBMK_cPLAT ] == "vxworks" .AND. ; - Empty( hbmk[ _HBMK_cCCPOSTFIX ] ) - SWITCH hbmk[ _HBMK_cCPU ] - CASE "x86" ; hbmk[ _HBMK_cCCPOSTFIX ] := "pentium" ; EXIT - CASE "arm" ; hbmk[ _HBMK_cCCPOSTFIX ] := "arm" ; EXIT - CASE "mips" ; hbmk[ _HBMK_cCCPOSTFIX ] := "mips" ; EXIT - CASE "ppc" ; hbmk[ _HBMK_cCCPOSTFIX ] := "ppc" ; EXIT - ENDSWITCH + IF hbmk[ _HBMK_cPLAT ] == "vxworks" + vxworks_env_init( hbmk ) ENDIF cLibLibPrefix := "lib" cLibPrefix := "-l" @@ -2775,19 +2769,6 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) AAdd( hbmk[ _HBMK_aOPTC ], "-fno-strict-aliasing" ) AAdd( hbmk[ _HBMK_aOPTC ], "-D_C99" ) AAdd( hbmk[ _HBMK_aOPTC ], "-D_HAS_C9X" ) - SWITCH hbmk[ _HBMK_cCPU ] - CASE "x86" ; tmp := "simpentium/SIMPENTIUM" ; EXIT - CASE "arm" ; tmp := "arm/ARMARCH7" ; EXIT - OTHERWISE - tmp := NIL - ENDSWITCH - IF tmp != NIL - IF hbmk[ _HBMK_lCreateDyn ] - AAdd( hbmk[ _HBMK_aLIBPATH ], PathSepToSelf( GetEnv( "WIND_BASE" ) + "/target/lib/usr/lib/" + tmp + "/common/PIC" ) ) - ELSE - AAdd( hbmk[ _HBMK_aLIBPATH ], PathSepToSelf( GetEnv( "WIND_BASE" ) + "/target/lib/usr/lib/" + tmp + "/common" ) ) - ENDIF - ENDIF ENDIF cOpt_CompC += " {FC}" IF ! Empty( hbmk[ _HBMK_cWorkDir ] ) @@ -2843,9 +2824,18 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) AAdd( hbmk[ _HBMK_aOPTL ], "-bind_at_load" ) ENDIF ENDIF + IF hbmk[ _HBMK_cPLAT ] == "vxworks" + IF hbmk[ _HBMK_lSHARED ] + AAdd( hbmk[ _HBMK_aOPTL ], "-shared" ) /* TOFIX: no entry point */ + ENDIF + ENDIF IF hbmk[ _HBMK_lSTRIP ] IF hbmk[ _HBMK_lCreateLib ] .OR. hbmk[ _HBMK_cPLAT ] $ "darwin|sunos" - cBin_Post := "strip" + IF hbmk[ _HBMK_cPLAT ] == "vxworks" + cBin_Post := "strip" + hbmk[ _HBMK_cCCPOSTFIX ] + ELSE + cBin_Post := "strip" + ENDIF IF hbmk[ _HBMK_lCreateDyn ] .OR. hbmk[ _HBMK_lCreateLib ] cOpt_Post := "-S {OB}" ELSE @@ -4040,7 +4030,106 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) CASE hbmk[ _HBMK_cPLAT ] == "vxworks" .AND. hbmk[ _HBMK_cCOMP ] == "diab" - /* TODO */ + #if defined( __PLATFORM__UNIX ) + hbmk[ _HBMK_nCmd_Esc ] := _ESC_NIX + #elif defined( __PLATFORM__WINDOWS ) + hbmk[ _HBMK_nCmd_Esc ] := _ESC_DBLQUOTE + #endif + IF hbmk[ _HBMK_lDEBUG ] + AAdd( hbmk[ _HBMK_aOPTC ], "-g" ) + ENDIF + vxworks_env_init( hbmk ) + cLibLibPrefix := "lib" + cLibPrefix := "-l" + cLibExt := "" + cObjExt := ".o" + cBin_Lib := hbmk[ _HBMK_cCCPREFIX ] + "dar" + cOpt_Lib := "{FA} rcs {OL} {LO}" + cBin_CompCPP := hbmk[ _HBMK_cCCPREFIX ] + "dplus" + cBin_CompC := iif( hbmk[ _HBMK_lCPP ] != NIL .AND. hbmk[ _HBMK_lCPP ], cBin_CompCPP, hbmk[ _HBMK_cCCPREFIX ] + "dcc" ) + cOpt_CompC := "-c" + IF hbmk[ _HBMK_lOPTIM ] + cOpt_CompC += " -XO level-3" + ENDIF + tmp := "-WDVSB_DIR=" + PathSepToSelf( GetEnv( "WIND_BASE" ) + "/target/lib" ) + AAdd( hbmk[ _HBMK_aOPTC ], tmp ) + AAdd( hbmk[ _HBMK_aOPTL ], tmp ) + AAdd( hbmk[ _HBMK_aOPTD ], tmp ) + SWITCH hbmk[ _HBMK_nWARN ] + CASE _WARN_MAX ; AAdd( hbmk[ _HBMK_aOPTC ], "-W -Xlint" ) ; EXIT + CASE _WARN_YES ; AAdd( hbmk[ _HBMK_aOPTC ], "-W -Xlint" ) ; EXIT + CASE _WARN_LOW ; AAdd( hbmk[ _HBMK_aOPTC ], "-W" ) ; EXIT + CASE _WARN_NO ; AAdd( hbmk[ _HBMK_aOPTC ], "" ) ; EXIT + ENDSWITCH + cOpt_CompC += " {FC}" + IF ! Empty( hbmk[ _HBMK_cWorkDir ] ) + cOpt_CompC += " {IC} -o {OO}" + ELSE + cOpt_CompC += " {LC}" + ENDIF + /* lib path list ({DL}) must precede lib list */ + cBin_Dyn := cBin_CompC + cOpt_Dyn := "-Xpic -Wl, -Xshared -o {OD} {LO} {DL} {FD} {LS}" + cBin_Link := cBin_CompC + cOpt_Link := "{LO} {LA} {DL} {FL}" + cLibPathPrefix := "-L" + cLibPathSep := " " + cLibLibExt := ".a" + AAdd( hbmk[ _HBMK_aOPTL ], "{LL} {LB}" ) + AAdd( hbmk[ _HBMK_aOPTD ], "{LL} {LB}" ) + l_aLIBHBBASE_2 := iif( hbmk[ _HBMK_lMT ], aLIB_BASE_2_MT, aLIB_BASE_2 ) + IF hbmk[ _HBMK_lSTATICFULL ] + AAdd( hbmk[ _HBMK_aOPTL ], "-Wl, -Xstatic" ) /* not tested */ + ELSE + AAdd( hbmk[ _HBMK_aOPTD ], "-Wl, -Xdynamic" ) + ENDIF + IF hbmk[ _HBMK_lSHARED ] + /* TOFIX: .so is referred by it's full link time search path, + there is even a backslash present in the dir formed by + the linker */ + AAdd( hbmk[ _HBMK_aOPTL ], "-Wl, -Xdynamic" ) + ENDIF + IF hbmk[ _HBMK_lMAP ] + /* TODO: Map goes to stdout, we should ideally catch it to {OM} */ + AAdd( hbmk[ _HBMK_aOPTL ], "-m16" ) + AAdd( hbmk[ _HBMK_aOPTD ], "-m16" ) + ENDIF + IF hbmk[ _HBMK_lSTRIP ] + IF hbmk[ _HBMK_lCreateLib ] + cBin_Post := "strip" + IF hbmk[ _HBMK_lCreateDyn ] .OR. hbmk[ _HBMK_lCreateLib ] + cOpt_Post := "-S {OB}" + ELSE + cOpt_Post := "{OB}" + ENDIF + ELSE + AAdd( hbmk[ _HBMK_aOPTL ], "-s" ) + AAdd( hbmk[ _HBMK_aOPTD ], "-s" ) + ENDIF + ENDIF + IF lStopAfterCComp + IF ! hbmk[ _HBMK_lCreateLib ] .AND. ! hbmk[ _HBMK_lCreateDyn ] .AND. ( Len( hbmk[ _HBMK_aPRG ] ) + Len( hbmk[ _HBMK_aC ] ) + Len( hbmk[ _HBMK_aCPP ] ) ) == 1 + AAdd( hbmk[ _HBMK_aOPTC ], "-o{OO}" ) + ENDIF + ELSE + AAdd( hbmk[ _HBMK_aOPTL ], "-o{OE}" ) + ENDIF + + IF hbmk[ _HBMK_lCreateDyn ] + AAdd( hbmk[ _HBMK_aOPTC ], "-Xpic" ) + ENDIF + + /* Add system libraries */ + IF ! hbmk[ _HBMK_lSHARED ] + IF ! Empty( cLIB_BASE_PCRE ) .AND. ! hb_FileExists( _HBLIB_FULLPATH( cLIB_BASE_PCRE ) ) + AAdd( l_aLIBSYS, "pcre" ) + cLIB_BASE_PCRE := NIL + ENDIF + IF ! Empty( cLIB_BASE_ZLIB ) .AND. ! hb_FileExists( _HBLIB_FULLPATH( cLIB_BASE_ZLIB ) ) + AAdd( l_aLIBSYS, "z" ) + cLIB_BASE_ZLIB := NIL + ENDIF + ENDIF ENDCASE @@ -5650,6 +5739,49 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) RETURN hbmk[ _HBMK_nErrorLevel ] +STATIC PROCEDURE vxworks_env_init( hbmk ) + + /* Array positions for aTable */ + #define _VX_CCPOSTFIX 1 + #define _VX_DIAB_CPU 2 + #define _VX_CPU 3 + #define _VX_LIB_SUBDIR 4 + + #define _VX_DIAB_ENV "rtp" + + /* Conversion table between hbmk2 CPU and vxworks values required to target that CPU */ + LOCAL aTable := {; + "x86" => { "pentium", "X86LH" , "_VX_SIMPENTIUM", "simpentium/SIMPENTIUM" },; + "arm" => { "arm" , "ARMV7LS", "_VX_ARMARCH7" , "arm/ARMARCH7" },; + "mips" => { "mips" , "" , "" , "" },; + "ppc" => { "ppc" , "" , "" , "" }} + + IF hbmk[ _HBMK_cCPU ] $ aTable + IF Empty( hbmk[ _HBMK_cCCPOSTFIX ] ) + /* Used by gcc, and it's also used for strip even with diab compiler */ + hbmk[ _HBMK_cCCPOSTFIX ] := aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_CCPOSTFIX ] + ENDIF + IF hbmk[ _HBMK_cCOMP ] == "diab" + IF ! Empty( aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_DIAB_CPU ] ) + AAdd( hbmk[ _HBMK_aOPTC ], "-t" + aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_DIAB_CPU ] + ":" + _VX_DIAB_ENV ) + AAdd( hbmk[ _HBMK_aOPTL ], "-t" + aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_DIAB_CPU ] + ":" + _VX_DIAB_ENV ) + AAdd( hbmk[ _HBMK_aOPTD ], "-t" + aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_DIAB_CPU ] + ":" + _VX_DIAB_ENV ) + ENDIF + IF ! Empty( aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_CPU ] ) + AAdd( hbmk[ _HBMK_aOPTC ], "-D_VX_CPU=" + aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_CPU ] ) + ENDIF + ENDIF + IF ! Empty( aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_LIB_SUBDIR ] ) + IF hbmk[ _HBMK_lCreateDyn ] + AAdd( hbmk[ _HBMK_aLIBPATH ], PathSepToSelf( GetEnv( "WIND_BASE" ) + "/target/lib/usr/lib/" + aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_LIB_SUBDIR ] + "/common/PIC" ) ) + ELSE + AAdd( hbmk[ _HBMK_aLIBPATH ], PathSepToSelf( GetEnv( "WIND_BASE" ) + "/target/lib/usr/lib/" + aTable[ hbmk[ _HBMK_cCPU ] ][ _VX_LIB_SUBDIR ] + "/common" ) ) + ENDIF + ENDIF + ENDIF + + RETURN + STATIC PROCEDURE DoIMPLIB( hbmk, bBlk_ImpLib, cLibLibPrefix, cLibLibExt ) LOCAL cMakeImpLibDLL LOCAL tmp, tmp1 diff --git a/harbour/utils/hbtest/hbtest.prg b/harbour/utils/hbtest/hbtest.prg index 75b6a7d812..bb71e9bdd6 100644 --- a/harbour/utils/hbtest/hbtest.prg +++ b/harbour/utils/hbtest/hbtest.prg @@ -102,7 +102,8 @@ STATIC s_lDBFAvail := .F. PROCEDURE Main( cPar1, cPar2 ) OutStd( "Harbour Regression Test Suite" + HB_OSNewLine() +; - "Copyright (c) 1999-2010, http://harbour-project.org/" + HB_OSNewLine() ) + "Copyright (c) 1999-2010, Viktor Szakats" + HB_OSNewLine() +; + "http://harbour-project.org/" + HB_OSNewLine() ) IF cPar1 == NIL cPar1 := ""