From ea84a85230066abfefa4816c47fe9a014f3fdc24 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sun, 4 Jul 2010 17:04:24 +0000 Subject: [PATCH] 2010-07-04 19:03 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) - bin/patchup.hbs + bin/hbxpatch.hbs * Renamed to have hb prefix. Better suggestion are welcome for the name, don't consider this final. Pbly sth like hbupdext.prg would be better. * contrib/Makefile * Changed test status of makefile.hbs call to make it do some actual work. * config/postinst.hbs - Deleted implib creation. Now done by makefile.hbs. Implibs are never required for core, so this is now much cleaner. - Deleted experimental HB_BUILD_ADDONS support. This feature has moved to makefile.hbs and it can be controlled by HB_ADDONS_LIB and HB_ADDONS_BIN to add non-hosted extra components to the build process. The envvar names are not finalized. * Changed to only copy .hbs files starting with 'hb' in bin dir to avoid catching local scripts and adding them to install. * contrib/makefile.hbs + Makred dependencies from external. * Reworked the way project list is assembled. ! Fixed root dir issues. ! Fixed -instpath option * config/postinst.hbs * Tweaked to convert pathseps in external tool calls to native. * ChangeLog ! Corrected most basic problems with Massimo's latest log entry. Massimo: You fixed a one byte typo and caused by to fix about 10 typos writing 3-4 letters. This isn't very effective help. --- harbour/ChangeLog | 73 ++++++++++++++----- harbour/bin/{patchup.hbs => hbxpatch.hbs} | 0 harbour/config/postinst.hbs | 88 ++++------------------- harbour/contrib/Makefile | 6 +- harbour/contrib/makefile.hbs | 80 ++++++++++----------- 5 files changed, 114 insertions(+), 133 deletions(-) rename harbour/bin/{patchup.hbs => hbxpatch.hbs} (100%) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 5313f254ae..48a49c1c4c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -15,10 +15,51 @@ under different terms, please contact respective author(s). The license applies to all entries newer than 2009-04-28. */ -2010-07-04 18:30 UTC+0100 Belgrano Massuno (mbelgrano@deltain.it) -corrected small typo in harbour/examples/httpsrv/uhttp d.prg -made and posted from Jacek Kubica +2010-07-04 19:03 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + - bin/patchup.hbs + + bin/hbxpatch.hbs + * Renamed to have hb prefix. + Better suggestion are welcome for the name, don't + consider this final. Pbly sth like hbupdext.prg + would be better. + + * contrib/Makefile + * Changed test status of makefile.hbs call to make it + do some actual work. + + * config/postinst.hbs + - Deleted implib creation. Now done by makefile.hbs. + Implibs are never required for core, so this is now + much cleaner. + - Deleted experimental HB_BUILD_ADDONS support. This + feature has moved to makefile.hbs and it can be + controlled by HB_ADDONS_LIB and HB_ADDONS_BIN to add + non-hosted extra components to the build process. + The envvar names are not finalized. + * Changed to only copy .hbs files starting with 'hb' + in bin dir to avoid catching local scripts and adding + them to install. + + * contrib/makefile.hbs + + Makred dependencies from external. + * Reworked the way project list is assembled. + ! Fixed root dir issues. + ! Fixed -instpath option + + * config/postinst.hbs + * Tweaked to convert pathseps in external tool calls + to native. + + * ChangeLog + ! Corrected most basic problems with Massimo's latest + log entry. Massimo: You fixed a one byte typo and + caused by to fix about 10 typos writing 3-4 letters. + This isn't very effective help. + +2010-07-04 18:30 UTC+0100 Belgrano Massuno (mbelgrano@deltain.it) + * harbour/examples/httpsrv/uhttpd.prg + made and posted from Jacek Kubica corrected small typo in 2010-07-04 09:08 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbxbp/xbpmenubar.prg @@ -60,38 +101,38 @@ made and posted from Jacek Kubica + Reworked: ideDBU interface. Now it is hosted in a MDI interface which is more natural - to table management, including relational views. User can + to table management, including relational views. User can rearrange and resize the browsers to his personal tastes. Here is the layout hirarchy of ideDBU: - + hbIDE ideDBU - docking pane, right-hand, floatable, dockable. Toolbar - Add a table, Form View, Tabbed View, Original View, - Cascaded View, Tiled View, Remove browser, + Add a table, Form View, Tabbed View, Original View, + Cascaded View, Tiled View, Remove browser, Panels - create button, switch menu Panels - user defined, only one visible at a time Panel 1 Browser 1 - .dbf, an array ( TODO, functionality is there ) - Browser 2 + Browser 2 Browser n - Panel 2 + Panel 2 Browser 1 - Browser 2 + Browser 2 Browser n - Panel n + Panel n Browser 1 - Browser 2 + Browser 2 Browser n - Panels retain their last contents and are presented - on next run as is. The only exception being panel "Main" + Panels retain their last contents and are presented + on next run as is. The only exception being panel "Main" is always the first visible. NOTE: there is a lot on my drawing board. - So far I was struggling to make the behavior of + So far I was struggling to make the behavior of XbpBrowser stable per TBrowse specs and interface design. Rest will follow soon. - + 2010-07-04 15:53 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * harbour-win-spec * harbour-wce-spec diff --git a/harbour/bin/patchup.hbs b/harbour/bin/hbxpatch.hbs similarity index 100% rename from harbour/bin/patchup.hbs rename to harbour/bin/hbxpatch.hbs diff --git a/harbour/config/postinst.hbs b/harbour/config/postinst.hbs index b8e0727e32..beed7f9aea 100644 --- a/harbour/config/postinst.hbs +++ b/harbour/config/postinst.hbs @@ -84,21 +84,10 @@ PROCEDURE Main() hb_FCopy( "COPYING", GetEnv( "HB_INSTALL_PREFIX" ) + _PS_ + "COPYING" ) hb_FCopy( "INSTALL", GetEnv( "HB_INSTALL_PREFIX" ) + _PS_ + "INSTALL" ) hb_FCopy( "TODO" , GetEnv( "HB_INSTALL_PREFIX" ) + _PS_ + "TODO" ) - ENDIF - /* Import library generation */ - - IF GetEnv( "HB_PLATFORM" ) $ "win|wce|os2" .AND. ; - GetEnv( "HB_BUILD_IMPLIB" ) == "yes" .AND. ; - ! Empty( GetEnv( "HB_HOST_BIN_DIR" ) ) - - FOR EACH tmp IN PackageList( "contrib" + _PS_ + hb_osFileMask(), GetEnv( "HB_CONTRIBLIBS" ), GetEnv( "HB_CONTRIB_ADDONS" ) ) - IF hb_FileExists( "contrib" + _PS_ + tmp + _PS_ + tmp + ".hbi" ) - mk_hb_processRun( GetEnv( "HB_HOST_BIN_DIR" ) + _PS_ + "hbmk2" +; - " -quiet -lang=en" +; - " contrib/" + tmp + "/" + tmp + ".hbi" +; - " -o${HB_LIB_INSTALL}/" ) - ENDIF + /* public Harbour scripts */ + FOR EACH tmp IN { "hbxpatch.hbs" } + hb_FCopy( "bin" + _PS_ + tmp, GetEnv( "HB_BIN_INSTALL" ) + _PS_ + tmp ) NEXT ENDIF @@ -114,23 +103,6 @@ PROCEDURE Main() cOptions += " -debug" ENDIF - /* Creating extra binaries */ - - IF ! Empty( GetEnv( "HB_BUILD_ADDONS" ) ) .AND. ; - ! Empty( GetEnv( "HB_HOST_BIN_DIR" ) ) - - OutStd( "! Making binaries for .hbp project addons..." + hb_osNewLine() ) - - FOR EACH tmp IN hb_ATokens( GetEnv( "HB_BUILD_ADDONS" ),, .T. ) - IF ! Empty( tmp ) - mk_hb_processRun( GetEnv( "HB_HOST_BIN_DIR" ) + _PS_ + "hbmk2" +; - " -quiet -lang=en -q0" + cOptions +; - " " + Chr( 34 ) + StrTran( tmp, "\", "/" ) + Chr( 34 ) +; - " -o${HB_BIN_INSTALL}/" ) - ENDIF - NEXT - ENDIF - /* Creating shared version of Harbour binaries (except one which have shared versions build by default and hbmk2) */ @@ -148,7 +120,7 @@ PROCEDURE Main() !( tmp[ F_NAME ] $ "hbformat|hbi18n|hbtest|hbmk2" ) .AND. ; hb_FileExists( "utils" + _PS_ + tmp[ F_NAME ] + _PS_ + tmp[ F_NAME ] + ".hbp" ) - mk_hb_processRun( GetEnv( "HB_HOST_BIN_DIR" ) + _PS_ + "hbmk2" +; + mk_hb_processRun( PathSepToSelf( GetEnv( "HB_HOST_BIN_DIR" ) ) + _PS_ + "hbmk2" +; " -quiet -lang=en -q0 -shared" + cOptions +; " utils/" + tmp[ F_NAME ] + "/" + tmp[ F_NAME ] + ".hbp" +; " -o${HB_BIN_INSTALL}/" + tmp[ F_NAME ] + "-dll" ) @@ -177,7 +149,7 @@ PROCEDURE Main() cOldDir := _PS_ + CurDir() DirChange( GetEnv( "HB_INSTALL_PREFIX" ) + _PS_ + ".." ) - mk_hb_processRun( GetEnv( "HB_DIR_ZIP" ) + "zip" +; + mk_hb_processRun( PathSepToSelf( GetEnv( "HB_DIR_ZIP" ) ) + "zip" +; " -q -9 -X -r -o" +; " " + FN_Escape( tmp ) +; " . -i " + FN_Escape( GetEnv( "HB_PKGNAME" ) + _PS_ + "*" ) +; @@ -191,7 +163,7 @@ PROCEDURE Main() OutStd( "! Making Harbour .exe install package: '" + tmp + "'" + hb_osNewLine() ) - mk_hb_processRun( GetEnv( "HB_DIR_NSIS" ) + "makensis.exe" +; + mk_hb_processRun( PathSepToSelf( GetEnv( "HB_DIR_NSIS" ) ) + "makensis.exe" +; " -V2" +; " " + FN_Escape( StrTran( "package/mpkg_win.nsi", "/", _PS_ ) ) ) ENDIF @@ -210,43 +182,11 @@ STATIC FUNCTION mk_hb_processRun( cCommand ) STATIC FUNCTION FN_Escape( cFN ) RETURN Chr( 34 ) + cFN + Chr( 34 ) -/* NOTE: Must be in sync with contrib/Makefile logic */ -STATIC FUNCTION PackageList( cMask, cBase, cAddOn ) - LOCAL aList := {} - LOCAL aBase - LOCAL tmp - - aBase := iif( Empty( cBase ), {}, hb_ATokens( cBase,, .T. ) ) - - DO CASE - CASE Len( aBase ) == 1 .AND. aBase[ 1 ] == "no" - /* fall through */ - CASE Len( aBase ) > 1 .AND. aBase[ 1 ] == "no" - hb_ADel( aBase, 1, .T. ) - FOR EACH tmp IN Directory( cMask, "D" ) - IF "D" $ tmp[ F_ATTR ] .AND. !( tmp[ F_NAME ] == "." ) .AND. !( tmp[ F_NAME ] == ".." ) .AND. ; - AScan( aBase, {| tmp1 | tmp1 == tmp[ F_NAME ] } ) == 0 - AAdd( aList, tmp[ F_NAME ] ) - ENDIF - NEXT - CASE Len( aBase ) > 0 - aList := hb_ATokens( cBase,, .T. ) - OTHERWISE - FOR EACH tmp IN Directory( cMask, "D" ) - IF "D" $ tmp[ F_ATTR ] .AND. !( tmp[ F_NAME ] == "." ) .AND. !( tmp[ F_NAME ] == ".." ) - AAdd( aList, tmp[ F_NAME ] ) - ENDIF - NEXT - ENDCASE - - IF ! Empty( cAddOn ) - FOR EACH tmp IN hb_ATokens( cAddOn,, .T. ) - IF ! Empty( tmp ) - IF AScan( aList, {| tmp1 | tmp1 == tmp } ) == 0 - AAdd( aList, tmp ) - ENDIF - ENDIF - NEXT - ENDIF - - RETURN aList +STATIC FUNCTION PathSepToSelf( cFileName ) +#if defined( __PLATFORM__WINDOWS ) .OR. ; + defined( __PLATFORM__DOS ) .OR. ; + defined( __PLATFORM__OS2 ) + RETURN StrTran( cFileName, "/", "\" ) +#else + RETURN StrTran( cFileName, "\", "/" ) +#endif diff --git a/harbour/contrib/Makefile b/harbour/contrib/Makefile index b06252f00e..dadc4e61e7 100644 --- a/harbour/contrib/Makefile +++ b/harbour/contrib/Makefile @@ -82,10 +82,10 @@ else endif clean:: - $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)contrib/makefile.hbs clean test,) + $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)contrib/makefile.hbs clean migr,) install:: - $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)contrib/makefile.hbs install test,) + $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)contrib/makefile.hbs install migr,) all: - $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)contrib/makefile.hbs all test,) + $(if $(wildcard $(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT)),+$(HB_HOST_BIN_DIR)/hbrun$(HB_HOST_BIN_EXT) --hb:gtcgi $(TOP)$(ROOT)contrib/makefile.hbs all migr,) diff --git a/harbour/contrib/makefile.hbs b/harbour/contrib/makefile.hbs index 99bb163cae..f9bb86ec42 100644 --- a/harbour/contrib/makefile.hbs +++ b/harbour/contrib/makefile.hbs @@ -10,9 +10,6 @@ * See COPYING for licensing terms. */ -/* WARNING: This file is part of the GNU Make-based build - system. Running it separately is not supported. */ - /* TODO: 1. error handling / reporting / feedback 2. copy headers (or solve .hbc search path in universal way) @@ -32,7 +29,8 @@ STATIC s_lTest PROCEDURE Main( ... ) - LOCAL cBase := "contrib/" + LOCAL cBase := "" + LOCAL cRoot := "../" LOCAL aImpLibs := {; "gtalleg/gtalleg.hbi" ,; @@ -54,7 +52,7 @@ PROCEDURE Main( ... ) LOCAL aLibsPass1 := {; "hbblink/hbblink.hbp" ,; - "hbbz2/hbbz2.hbp" ,; + "hbbz2/hbbz2.hbp" ,; /* uses: bz2 (external) */ "hbclipsm/hbclipsm.hbp" ,; "hbcomm/hbcomm.hbp" ,; "hbct/hbct.hbp" ,; @@ -63,12 +61,12 @@ PROCEDURE Main( ... ) "hbgt/hbgt.hbp" ,; "hbmemio/hbmemio.hbp" ,; "hbmisc/hbmisc.hbp" ,; - "hbmzip/hbmzip.hbp" ,; + "hbmzip/hbmzip.hbp" ,; /* uses: minizip (external) */ "hbnetio/hbnetio.hbp" ,; "hbnf/hbnf.hbp" ,; "hbodbc/hbodbc.hbp" ,; "hbsms/hbsms.hbp" ,; - "hbsqlit3/hbsqlit3.hbp" ,; + "hbsqlit3/hbsqlit3.hbp" ,; /* uses: sqlite3 (external) */ "hbtpathy/hbtpathy.hbp" ,; "hbwin/hbwin.hbp" ,; "hbxpp/hbxpp.hbp" ,; @@ -106,7 +104,7 @@ PROCEDURE Main( ... ) "sddoci/sddoci.hbp" ,; /* uses: rddsql */ "sddodbc/sddodbc.hbp" ,; /* uses: rddsql */ "sddpg/sddpg.hbp" ,; /* uses: rddsql */ - "sddsqlt3/sddsqlt3.hbp" } /* uses: rddsql */ + "sddsqlt3/sddsqlt3.hbp" } /* uses: rddsql, sqlite3 (external) */ LOCAL aLibsPass3 := {; "gtwvg/gtwvg.hbp" ,; /* uses: hbwin */ @@ -119,28 +117,11 @@ PROCEDURE Main( ... ) "hbnetio/utils/netiosrv.hbp" ,; /* uses: hbnetio */ "hbide/hbide.hbp" } /* uses: hbxbp, hbqt */ - LOCAL aAll := {; - aImpLibs ,; - aLibsPass1 ,; - aLibsPass2 ,; - aLibsPass3 ,; - aUtils,; - hb_ATokens( GetEnv( "HB_ADDONS_LIB" ),, .T. ),; - hb_ATokens( GetEnv( "HB_ADDONS_BIN" ),, .T. ) } + LOCAL aAll + LOCAL hItem - LOCAL aAllType := {; - "implib" ,; - "lib" ,; - "lib" ,; - "lib" ,; - "bin" ,; - "lib" ,; - "bin" } - - LOCAL chunk LOCAL cProject LOCAL cProjectDir - LOCAL cType LOCAL cInstallDirVar LOCAL cTargetDir @@ -156,8 +137,8 @@ PROCEDURE Main( ... ) s_lTest := AScan( aParams, "test" ) > 0 - IF s_lTest - OutStd( "! New contrib make orchestrator test run." + iif( AScan( aParams, "clean" ) > 0, " CLEAN", "" ) + iif( AScan( aParams, "install" ) > 0, " INSTALL", "" ) + hb_osNewLine() ) + IF AScan( aParams, "migr" ) > 0 + OutStd( "! New contrib make orchestrator test run." + iif( AScan( aParams, "clean" ) > 0, " CLEAN", "" ) + iif( AScan( aParams, "install" ) > 0, " INSTALL", "" ) + " " + hb_dirBase() + " " + CurDir() + hb_osNewLine() ) /* testing with a limited set of contribs */ aLibsPass1 := {; @@ -217,8 +198,17 @@ PROCEDURE Main( ... ) /* Start building */ - FOR EACH chunk, cType IN aAll, aAllType - FOR EACH cProject IN chunk + aAll := {; + { "type" => "implib", "list" => aImpLibs },; + { "type" => "lib" , "list" => aLibsPass1 },; + { "type" => "lib" , "list" => aLibsPass2 },; + { "type" => "lib" , "list" => aLibsPass3 },; + { "type" => "bin" , "list" => aUtils },; + { "type" => "lib" , "list" => hb_ATokens( GetEnv( "HB_ADDONS_LIB" ),, .T. ) },; + { "type" => "bin" , "list" => hb_ATokens( GetEnv( "HB_ADDONS_BIN" ),, .T. ) } } + + FOR EACH hItem IN aAll + FOR EACH cProject IN hItem[ "list" ] IF ! Empty( cProject ) @@ -235,14 +225,14 @@ PROCEDURE Main( ... ) AScan( aFilter, {| tmp | tmp == cProjectDir } ) == 0,; AScan( aFilter, {| tmp | tmp == cProjectDir } ) > 0 ) - SWITCH cType + SWITCH hItem[ "type" ] CASE "lib" CASE "implib" - cTargetDir := "lib/${hb_plat}/${hb_comp}" + iif( lBuildName, "/${hb_build}", "" ) + cTargetDir := cRoot + "lib/${hb_plat}/${hb_comp}" + iif( lBuildName, "/${hb_build}", "" ) cInstallDirVar := "HB_LIB_INSTALL" EXIT CASE "bin" - cTargetDir := "bin/${hb_plat}/${hb_comp}" + iif( lBuildName, "/${hb_build}", "" ) + cTargetDir := cRoot + "bin/${hb_plat}/${hb_comp}" + iif( lBuildName, "/${hb_build}", "" ) cInstallDirVar := "HB_BIN_INSTALL" EXIT ENDSWITCH @@ -251,14 +241,15 @@ PROCEDURE Main( ... ) call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -clean", .F. ) ELSEIF AScan( aParams, "install" ) > 0 IF ! Empty( GetEnv( cInstallDirVar ) ) .AND. ; - ( ! ( cType == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" ) - call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -instpath=${" + cInstallDirVar + "}", .F. ) + ( ! ( hItem[ "type" ] == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" ) + call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -instpath=${" + cInstallDirVar + "}/", .F. ) ENDIF ELSE call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -inc", .F. ) ENDIF - IF cType == "lib" .AND. GetEnv( "HB_BUILD_CONTRIB_DLL" ) == "yes" .AND. ; + /* Highly experimental */ + IF hItem[ "type" ] == "lib" .AND. GetEnv( "HB_BUILD_CONTRIB_DLL" ) == "yes" .AND. ; hb_FileExists( FN_ExtSet( cBase + cProject, ".hbc" ) ) cInstallDirVar := "HB_BIN_INSTALL" @@ -267,8 +258,8 @@ PROCEDURE Main( ... ) call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -clean", .T. ) ELSEIF AScan( aParams, "install" ) > 0 IF ! Empty( GetEnv( cInstallDirVar ) ) .AND. ; - ( ! ( cType == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" ) - call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -instpath=${" + cInstallDirVar + "}", .T. ) + ( ! ( hItem[ "type" ] == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" ) + call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -instpath=${" + cInstallDirVar + "}/", .T. ) ENDIF ELSE call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -inc", .T. ) @@ -294,7 +285,7 @@ STATIC FUNCTION call_hbmk2( cProject, cTargetDir, cOptions, lDyn ) /* TOFIX: Add -implib option. It collides with static lib so needs to be resolved. */ - nErrorLevel := mk_hb_processRun( GetEnv( "HB_HOST_BIN_DIR" ) + _PS_ + "hbmk2" +; + nErrorLevel := mk_hb_processRun( PathSepToSelf( GetEnv( "HB_HOST_BIN_DIR" ) ) + _PS_ + "hbmk2" +; " -quiet -lang=en -width=1000 -q0" + cOptions +; " " + cProject +; iif( lDyn, " -hbdyn -nohblib- " + FN_ExtSet( cProject, ".hbc" ), "" ) +; @@ -319,3 +310,12 @@ STATIC FUNCTION FN_ExtSet( cFileName, cExt ) hb_FNameSplit( cFileName, @cDir, @cName ) RETURN hb_FNameMerge( cDir, cName, cExt ) + +STATIC FUNCTION PathSepToSelf( cFileName ) +#if defined( __PLATFORM__WINDOWS ) .OR. ; + defined( __PLATFORM__DOS ) .OR. ; + defined( __PLATFORM__OS2 ) + RETURN StrTran( cFileName, "/", "\" ) +#else + RETURN StrTran( cFileName, "\", "/" ) +#endif