From cf6c4473b2a40d4903ca3221a1535fddb4779b07 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Fri, 15 Feb 2013 02:20:42 +0000 Subject: [PATCH] 2013-02-15 03:09 UTC+0100 Viktor Szakats (harbour syenar.net) * src/rtl/tget.prg % use HB_STRXCHG() * utils/hbmk2/hbmk2.prg + use HB_STRXCHG() for all Markdown conversion ! use HB_STRXCHG() in filter evaluation code. It will fix potential problem when macro values contained internal placeholder string ! fixed Markdown conversion in copyright banner % use \t instead of manual solution * other minor cleanups + added a good bunch of TODOs for remaining places where STRTRAN() has to be changed to HB_STRXCHG() I'm only wishing for a syntax that keeps search and replace values closer together to keep the source well readable, f.e.: STRXCHG( str, { ; { "{LI}", cLIValue }, ; { "{FI}", cFIValue } } ) Though it may be solved with a local wrapper because they are not speed critical. Ideas welcome. --- harbour/ChangeLog.txt | 23 +++++ harbour/src/rtl/tget.prg | 8 +- harbour/utils/hbmk2/hbmk2.prg | 160 ++++++++++++++++++---------------- 3 files changed, 109 insertions(+), 82 deletions(-) diff --git a/harbour/ChangeLog.txt b/harbour/ChangeLog.txt index 1ccc53a553..b52527921d 100644 --- a/harbour/ChangeLog.txt +++ b/harbour/ChangeLog.txt @@ -10,6 +10,29 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-02-15 03:09 UTC+0100 Viktor Szakats (harbour syenar.net) + * src/rtl/tget.prg + % use HB_STRXCHG() + + * utils/hbmk2/hbmk2.prg + + use HB_STRXCHG() for all Markdown conversion + ! use HB_STRXCHG() in filter evaluation code. It will + fix potential problem when macro values contained + internal placeholder string + ! fixed Markdown conversion in copyright banner + % use \t instead of manual solution + * other minor cleanups + + added a good bunch of TODOs for remaining places + where STRTRAN() has to be changed to HB_STRXCHG() + I'm only wishing for a syntax that keeps search + and replace values closer together to keep the + source well readable, f.e.: + STRXCHG( str, { ; + { "{LI}", cLIValue }, ; + { "{FI}", cFIValue } } ) + Though it may be solved with a local wrapper because + they are not speed critical. Ideas welcome. + 2013-02-15 02:11 UTC+0100 Viktor Szakats (harbour syenar.net) * utils/hbmk2/hbmk2.*.po * utils/hbmk2/hbmk2.prg diff --git a/harbour/src/rtl/tget.prg b/harbour/src/rtl/tget.prg index 96b1fd1176..a11857cb77 100644 --- a/harbour/src/rtl/tget.prg +++ b/harbour/src/rtl/tget.prg @@ -1326,11 +1326,9 @@ METHOD unTransform() CLASS Get cBuffer := StrTran( cBuffer, Chr( 1 ) ) - cBuffer := StrTran( cBuffer, "$", " " ) - cBuffer := StrTran( cBuffer, "*", " " ) - cBuffer := StrTran( cBuffer, "-", " " ) - cBuffer := StrTran( cBuffer, "(", " " ) - cBuffer := StrTran( cBuffer, ")", " " ) + cBuffer := hb_StrXchg( cBuffer, ; + "$*-()", ; + " " ) cBuffer := PadL( StrTran( cBuffer, " " ), Len( cBuffer ) ) diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index a7b09b661e..f2374ad46f 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -6367,6 +6367,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) nOpt_Esc := iif( "{SCRIPT}" $ cOpt_Res, hbmk[ _HBMK_nScr_Esc ], hbmk[ _HBMK_nCmd_Esc ] ) nOpt_FNF := iif( "{SCRIPT}" $ cOpt_Res, hbmk[ _HBMK_nScr_FNF ], hbmk[ _HBMK_nCmd_FNF ] ) + /* TODO: Use hb_StrXchg() */ cOpt_Res := StrTran( cOpt_Res, "{FR}" , GetEnv( "HB_USER_RESFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTRES ] ) ) cOpt_Res := StrTran( cOpt_Res, "{DI}" , FNameEscape( hbmk[ _HBMK_cHB_INSTALL_INC ], nOpt_Esc, nOpt_FNF ) ) @@ -6374,6 +6375,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) FOR EACH tmp IN l_aRESSRC_TO_DO + /* TODO: Use hb_StrXchg() */ cCommand := cOpt_Res cCommand := StrTran( cCommand, "{IR}", FNameEscape( tmp, nOpt_Esc, nOpt_FNF ) ) cCommand := StrTran( cCommand, "{OS}", FNameEscape( FNameDirExtSet( tmp, hbmk[ _HBMK_cWorkDir ], cResExt ), nOpt_Esc, nOpt_FNF ) ) @@ -6399,6 +6401,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) ENDIF NEXT ELSE + /* TODO: Use hb_StrXchg() */ cOpt_Res := StrTran( cOpt_Res, "{LR}" , ArrayToList( l_aRESSRC_TO_DO,, nOpt_Esc, nOpt_FNF ) ) cOpt_Res := AllTrim( cOpt_Res ) @@ -6508,6 +6511,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) /* Order is significant */ tmp4 := iif( tmp3 == _CCOMP_PASS_C .AND. ( hbmk[ _HBMK_lCPP ] == NIL .OR. ! hbmk[ _HBMK_lCPP ] ), hbmk[ _HBMK_aOPTCX ], hbmk[ _HBMK_aOPTCPPX ] ) cOpt_CompCPass := cOpt_CompC + /* TODO: Use hb_StrXchg() */ cOpt_CompCPass := StrTran( cOpt_CompCPass, "{FC}" , iif( hbmk[ _HBMK_lBLDFLGC ], hb_Version( HB_VERSION_FLAG_C ) + " ", "" ) +; GetEnv( "HB_USER_CFLAGS" ) +; iif( Empty( hbmk[ _HBMK_aOPTC ] ), "", " " + ArrayToList( hbmk[ _HBMK_aOPTC ] ) ) +; @@ -6543,6 +6547,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) NEXT ENDIF ELSE + /* TODO: Use hb_StrXchg() */ cOpt_CompCPass := StrTran( cOpt_CompCPass, "{OO}" , FNameEscape( hb_FNameExtSet( hbmk[ _HBMK_cPROGNAME ], cObjExt ), nOpt_Esc, nOpt_FNF ) ) cOpt_CompCPass := StrTran( cOpt_CompCPass, "{OW}" , FNameEscape( hbmk[ _HBMK_cWorkDir ], nOpt_Esc, nOpt_FNF ) ) @@ -6747,6 +6752,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) nOpt_FNF := iif( "{SCRIPT}" $ cOpt_Link, hbmk[ _HBMK_nScr_FNF ], hbmk[ _HBMK_nCmd_FNF ] ) /* Order is significant */ + /* TODO: Use hb_StrXchg() */ cOpt_Link := StrTran( cOpt_Link, "{FL}" , iif( hbmk[ _HBMK_lBLDFLGL ], hb_Version( HB_VERSION_FLAG_LINKER ) + " ", "" ) +; GetEnv( "HB_USER_LDFLAGS" ) +; iif( Empty( hbmk[ _HBMK_aOPTL ] ), "", " " + ArrayToList( hbmk[ _HBMK_aOPTL ] ) ) ) @@ -6869,6 +6875,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) ENDIF /* Order is significant */ + /* TODO: Use hb_StrXchg() */ cOpt_Dyn := StrTran( cOpt_Dyn, "{FD}" , GetEnv( "HB_USER_DFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTD ] ) ) cOpt_Dyn := StrTran( cOpt_Dyn, "{LO}" , tmp ) cOpt_Dyn := StrTran( cOpt_Dyn, "{LS}" , ArrayToList( ArrayJoin( ListDirExt( hbmk[ _HBMK_aRESSRC ], hbmk[ _HBMK_cWorkDir ], cResExt ), hbmk[ _HBMK_aRESCMP ] ),, nOpt_Esc, nOpt_FNF, cResPrefix ) ) @@ -6948,6 +6955,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) nOpt_FNF := iif( "{SCRIPT}" $ cOpt_Lib, hbmk[ _HBMK_nScr_FNF ], hbmk[ _HBMK_nCmd_FNF ] ) /* Order is significant */ + /* TODO: Use hb_StrXchg() */ cOpt_Lib := StrTran( cOpt_Lib, "{FA}" , GetEnv( "HB_USER_AFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTA ] ) ) cOpt_Lib := StrTran( cOpt_Lib, "{LO}" , ArrayToList( ArrayJoin( l_aOBJ, hbmk[ _HBMK_aOBJUSER ] ),, nOpt_Esc, nOpt_FNF, cLibObjPrefix ) ) cOpt_Lib := StrTran( cOpt_Lib, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc, nOpt_FNF, cLibPrefix ) ) @@ -7109,6 +7117,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) IF ! Empty( cBin_Post ) + /* TODO: Use hb_StrXchg() */ cOpt_Post := StrTran( cOpt_Post, "{OB}", FNameEscape( hbmk[ _HBMK_cPROGNAME ], hbmk[ _HBMK_nCmd_Esc ], hbmk[ _HBMK_nCmd_FNF ] ) ) IF l_cIMPLIBNAME != NIL cOpt_Post := StrTran( cOpt_Post, "{OI}", FNameEscape( l_cIMPLIBNAME, hbmk[ _HBMK_nCmd_Esc ], hbmk[ _HBMK_nCmd_FNF ] ) ) @@ -7221,6 +7230,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) /* Code signing */ + /* TODO: Use hb_StrXchg() */ cOpt_Sign := StrTran( cOpt_Sign, "{ID}", cOpt_SignID ) cOpt_Sign := StrTran( cOpt_Sign, "{OB}", FNameEscape( hbmk[ _HBMK_cPROGNAME ], nOpt_Esc, nOpt_FNF ) ) cOpt_Sign := AllTrim( cOpt_Sign ) @@ -7908,6 +7918,7 @@ STATIC FUNCTION CompileCLoop( hbmk, aTO_DO, cBin_CompC, cOpt_CompC, cObjExt, nOp lOutputSpecified := "{OO}" $ cCommand cOutputFile := FNameDirExtSet( tmp, hbmk[ _HBMK_cWorkDir ], cObjExt ) + /* TODO: Use hb_StrXchg() */ cCommand := StrTran( cCommand, "{IC}", FNameEscape( tmp, nOpt_Esc, nOpt_FNF ) ) cCommand := StrTran( cCommand, "{OO}", FNameEscape( cOutputFile, nOpt_Esc, nOpt_FNF ) ) @@ -11054,9 +11065,9 @@ STATIC FUNCTION ArchCompFilter( hbmk, cItem, cFileName ) ELSE IF ! Empty( cKeyword ) .AND. ! Empty( cValue ) tmp := cExprWithValue - tmp := StrTran( tmp, "%1", cKeyword ) - tmp := StrTran( tmp, "%2", cValue ) - tmp := StrTran( tmp, "%3", cOperator ) + tmp := hb_StrXchg( tmp, ; + { "%1", "%2", "%3" }, ; + { cKeyword, cValue, cOperator } ) cFilterHarb += tmp cKeyword := "" cValue := NIL @@ -11068,9 +11079,9 @@ STATIC FUNCTION ArchCompFilter( hbmk, cItem, cFileName ) IF ! Empty( cKeyword ) IF ! Empty( cValue ) tmp := cExprWithValue - tmp := StrTran( tmp, "%1", cKeyword ) - tmp := StrTran( tmp, "%2", cValue ) - tmp := StrTran( tmp, "%3", cOperator ) + tmp := hb_StrXchg( tmp, ; + { "%1", "%2", "%3" }, ; + { cKeyword, cValue, cOperator } ) cFilterHarb += tmp ELSE cFilterHarb += StrTran( cExpr, "%1", cKeyword ) @@ -12018,6 +12029,7 @@ STATIC FUNCTION win_implib_command( hbmk, cCommand, cSourceDLL, cTargetLib, cFla hb_default( @cFlags, "" ) + /* TODO: Use hb_StrXchg() */ cCommand := StrTran( cCommand, "{FI}", cFlags ) cCommand := StrTran( cCommand, "{ID}", FNameEscape( cSourceDLL, hbmk[ _HBMK_nCmd_Esc ], hbmk[ _HBMK_nCmd_FNF ] ) ) cCommand := StrTran( cCommand, "{OL}", FNameEscape( cTargetLib, hbmk[ _HBMK_nCmd_Esc ], hbmk[ _HBMK_nCmd_FNF ] ) ) @@ -12627,17 +12639,14 @@ STATIC FUNCTION Apple_App_Template_Files( hbmk, cFile, cPROGNAME ) cString := "" ENDSWITCH - cString := StrTran( cString, "%TAB%", Chr( 9 ) ) - + /* TODO: Use hb_StrXchg() */ cString := StrTran( cString, "%__APPNAME__%", cPROGNAME ) cString := StrTran( cString, "%__APPTYPE__%", "APPL" ) cString := StrTran( cString, "%__APPSIGN__%", PadR( cPROGNAME, 4, "?" ) ) cString := StrTran( cString, "%__APPID__%" ) /* TODO */ cString := StrTran( cString, "%__APPVERSION__%" ) /* TODO */ cString := StrTran( cString, "%__APPCOPYRIGHT__%" ) /* TODO */ - IF ! Empty( hbmk[ _HBMK_aICON ] ) - cString := StrTran( cString, "%__APPICON__%", hb_FNameNameExt( hbmk[ _HBMK_aICON ][ 1 ] ) ) - ENDIF + cString := StrTran( cString, "%__APPICON__%", iif( Empty( hbmk[ _HBMK_aICON ] ), "", hb_FNameNameExt( hbmk[ _HBMK_aICON ][ 1 ] ) ) ) RETURN cString @@ -12647,32 +12656,32 @@ STATIC FUNCTION Apple_App_Template_Info_plist() -%TAB%CFBundleInfoDictionaryVersion -%TAB%6.0 -%TAB%CFBundleIdentifier -%TAB%%__APPID__% -%TAB%CFBundleDevelopmentRegion -%TAB%English -%TAB%CFBundleExecutable -%TAB%%__APPNAME__% -%TAB%CFBundleIconFile -%TAB%%__APPICON__% -%TAB%CFBundleName -%TAB%%__APPNAME__% -%TAB%CFBundlePackageType -%TAB%%__APPTYPE__% -%TAB%CFBundleSignature -%TAB%%__APPSIGN__% -%TAB%CFBundleGetInfoString -%TAB%%__APPNAME__% version %__APPVERSION__%, %__APPCOPYRIGHT__% -%TAB%CFBundleLongVersionString -%TAB%%__APPVERSION__%, %__APPCOPYRIGHT__% -%TAB%NSHumanReadableCopyright -%TAB%%__APPCOPYRIGHT__% -%TAB%LSRequiresCarbon -%TAB% -%TAB%CSResourcesFileMapped -%TAB% +\tCFBundleInfoDictionaryVersion +\t6.0 +\tCFBundleIdentifier +\t%__APPID__% +\tCFBundleDevelopmentRegion +\tEnglish +\tCFBundleExecutable +\t%__APPNAME__% +\tCFBundleIconFile +\t%__APPICON__% +\tCFBundleName +\t%__APPNAME__% +\tCFBundlePackageType +\t%__APPTYPE__% +\tCFBundleSignature +\t%__APPSIGN__% +\tCFBundleGetInfoString +\t%__APPNAME__% version %__APPVERSION__%, %__APPCOPYRIGHT__% +\tCFBundleLongVersionString +\t%__APPVERSION__%, %__APPCOPYRIGHT__% +\tNSHumanReadableCopyright +\t%__APPCOPYRIGHT__% +\tLSRequiresCarbon +\t +\tCSResourcesFileMapped +\t #pragma __endtext @@ -12900,6 +12909,7 @@ STATIC FUNCTION __hb_extern_get_list( hbmk, cInputName, cBin_LibHBX, cOpt_LibHBX IF hb_FileExists( cInputName ) + /* TODO: Use hb_StrXchg() */ cOpt_LibHBX := StrTran( cOpt_LibHBX, "{LI}", FNameEscape( cInputName, hbmk[ _HBMK_nCmd_Esc ], hbmk[ _HBMK_nCmd_FNF ] ) ) IF "{OT}" $ cOpt_LibHBX FClose( hb_FTempCreateEx( @cTempFile,,, ".tmp" ) ) @@ -14807,9 +14817,11 @@ STATIC PROCEDURE SetUILang( cUILNG ) hb_i18n_Set( NIL ) hb_langSelect( cUILNG ) ELSE - tmp := "${hb_root}" + _SELF_NAME_ + ".${hb_lng}.hbl" - tmp := StrTran( tmp, "${hb_root}", hb_DirSepAdd( hb_DirBase() ) ) - tmp := StrTran( tmp, "${hb_lng}", StrTran( cUILNG, "-", "_" ) ) + tmp := hb_DirSepAdd( hb_DirBase() ) + ; + _SELF_NAME_ + ; + "." + ; + StrTran( cUILNG, "-", "_" ) + ; + ".hbl" IF hb_i18n_Check( tmp := hb_MemoRead( tmp ) ) hb_i18n_Set( hb_i18n_RestoreTable( tmp ) ) hb_langSelect( cUILNG ) @@ -14829,56 +14841,48 @@ INIT PROCEDURE ClipInit() STATIC FUNCTION ToMarkdown( cText ) - cText := StrTran( cText, "&", "&" ) /* keep it at top */ - cText := StrTran( cText, "<", "<" ) - cText := StrTran( cText, ">", ">" ) + cText := hb_StrXchg( cText, ; + { "&" , "<" , ">" , "(c)" , e"\n" }, ; + { "&", "<", ">", "©", " " + _OUT_EOL } ) - cText := StrTran( cText, "\", "\\" ) /* keep it at top */ - cText := StrTran( cText, "`", "\`" ) - cText := StrTran( cText, "*", "\*" ) - cText := StrTran( cText, "_", "\_" ) - cText := StrTran( cText, "{", "\{" ) - cText := StrTran( cText, "}", "\}" ) - cText := StrTran( cText, "[", "\[" ) - cText := StrTran( cText, "]", "\]" ) - cText := StrTran( cText, "(", "\(" ) - cText := StrTran( cText, ")", "\)" ) - cText := StrTran( cText, "#", "\#" ) - cText := StrTran( cText, "+", "\+" ) - cText := StrTran( cText, "-", "\-" ) - cText := StrTran( cText, ".", "\." ) - cText := StrTran( cText, "!", "\!" ) - - cText := StrTran( cText, "(c)", "©" ) - cText := StrTran( cText, "--", "\-\-" ) + cText := hb_StrXchg( cText, ; + "\`*_{}[]()#+-.!", ; + { "\\", "\`", "\*", "\_", "\{", "\}", "\[", "\]", "\(", "\)", "\#", "\+", "\-", "\.", "\!" } ) #if 0 /* experiments with Markdown formatting */ - cText := StrTran( cText, "<", "*<" ) - cText := StrTran( cText, ">", ">*" ) + cText := hb_StrXchg( cText, ; + { "<", ">" }, ; + { "*<", ">*" } ) #endif RETURN cText STATIC PROCEDURE ShowHeader( hbmk ) + LOCAL cText LOCAL cTrsText LOCAL cTrsTextI - LOCAL cURL := "http://harbour-project.org/" - - LOCAL cText := ; - "Harbour Make (" + _SELF_NAME_ + ") " + HBRawVersion() + _OUT_EOL +; - "Copyright (c) 1999-2013, Viktor Szakáts" + _OUT_EOL +; - "%1$s" + _OUT_EOL + cText := ; + e"Harbour Make (" + _SELF_NAME_ + ") " + HBRawVersion() + e"\n" +; + e"Copyright (c) 1999-2013, Viktor Szakáts\n" IF hbmk[ _HBMK_lMarkdown ] hb_SetTermCP( "UTF8EX" ) /* UTF-8 output for Markdown */ - cText := StrTran( ToMarkdown( cText ), _OUT_EOL, " " + _OUT_EOL ) - cURL := "<" + cURL + ">" + cText := ToMarkdown( cText ) + ELSE + cText := StrTran( cText, e"\n", _OUT_EOL ) ENDIF + OutStd( cText ) - OutStd( hb_StrFormat( cText, cURL ) ) + cText := "http://harbour-project.org/" + IF hbmk[ _HBMK_lMarkdown ] + cText := "<" + ToMarkdown( cText ) + ">" + ToMarkdown( e"\n" ) + ELSE + cText += _OUT_EOL + ENDIF + OutStd( cText ) IF !( hbmk[ _HBMK_cUILNG ] == "en" ) .AND. ; !( hbmk[ _HBMK_cUILNG ] == "en-GB" ) .AND. ; @@ -14886,9 +14890,11 @@ STATIC PROCEDURE ShowHeader( hbmk ) cTrsText := hb_i18n_gettext_noop( "Translation (%1$s): (add your name here)" ) cTrsTextI := I_( cTrsText ) IF !( cTrsText == cTrsTextI ) .AND. ! Empty( cTrsTextI ) - cText := hb_StrFormat( cTrsTextI, hbmk[ _HBMK_cUILNG ] ) + _OUT_EOL + cText := hb_StrFormat( cTrsTextI, hbmk[ _HBMK_cUILNG ] ) + e"\n" IF hbmk[ _HBMK_lMarkdown ] - cText := StrTran( ToMarkdown( cText ), _OUT_EOL, " " + _OUT_EOL ) + cText := ToMarkdown( cText ) + ELSE + cText := StrTran( cText, e"\n", _OUT_EOL ) ENDIF OutStd( cText ) ENDIF @@ -15419,9 +15425,9 @@ STATIC PROCEDURE OutOpt( hbmk, aOpt, nWidth ) hb_default( @nWidth, 22 ) IF hbmk[ _HBMK_lMarkdown ] IF nWidth > 0 - OutStd( " - " + "**" + ToMarkdown( aOpt[ 1 ] ) + "**" + " " + ToMarkdown( StrTran( aOpt[ 2 ], e"\n", " " + _OUT_EOL ) ) + _OUT_EOL ) + OutStd( " - " + "**" + ToMarkdown( aOpt[ 1 ] ) + "**" + " " + ToMarkdown( aOpt[ 2 ] ) + _OUT_EOL ) ELSE - OutStd( ToMarkdown( StrTran( aOpt[ 2 ], e"\n", " " + _OUT_EOL ) ) + _OUT_EOL ) + OutStd( ToMarkdown( aOpt[ 2 ] ) + _OUT_EOL ) ENDIF ELSE aOpt[ 2 ] := StrTran( aOpt[ 2 ], e"\n", hb_eol() ) @@ -15456,7 +15462,7 @@ STATIC PROCEDURE OutNote( hbmk, cText ) OutStd( _OUT_EOL ) ELSE IF hbmk[ _HBMK_lMarkdown ] - OutStd( " - " + ToMarkdown( StrTran( cText, e"\n", " " + _OUT_EOL ) ) + _OUT_EOL ) + OutStd( " - " + ToMarkdown( cText ) + _OUT_EOL ) ELSE cText := StrTran( cText, e"\n", hb_eol() ) nLines := MLCount( cText, hbmk[ _HBMK_nMaxCol ] - 4 )