From acf600f27f98fbcd190b9c4f4d134ccd047ec63a Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 9 Jun 2012 16:03:21 +0000 Subject: [PATCH] 2012-06-09 17:58 UTC+0200 Viktor Szakats (harbour syenar.net) * contrib/hbrun/hbrun.prg + enabled UTF8EX as default CP for hbrun script. This makes scripts portable and on par with other script languages. It also syncs this aspect with hbmk2's script runner facility. INCOMPATIBLE. Make sure to create scripts that are unicode compatible and use UTF8 CP for accents. If you need old behavior, add 'hb_cdpSelect( "EN" )' to the top of your script. ; contains copy/paste code from hbmk2 for OS and terminal CP detection. These should eventually make it into the RTL * INSTALL ! minor --- harbour/ChangeLog | 16 ++ harbour/INSTALL | 4 +- harbour/contrib/hbrun/hbrun.prg | 413 +++++++++++++++++++++++++++++++- 3 files changed, 430 insertions(+), 3 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index d67d9cf162..8f6884dcc0 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,22 @@ The license applies to all entries newer than 2009-04-28. */ +2012-06-09 17:58 UTC+0200 Viktor Szakats (harbour syenar.net) + * contrib/hbrun/hbrun.prg + + enabled UTF8EX as default CP for hbrun script. This makes + scripts portable and on par with other script languages. + It also syncs this aspect with hbmk2's script runner + facility. INCOMPATIBLE. Make sure to create scripts + that are unicode compatible and use UTF8 CP for accents. + If you need old behavior, add 'hb_cdpSelect( "EN" )' to + the top of your script. + ; contains copy/paste code from hbmk2 for OS and terminal + CP detection. These should eventually make it into the + RTL + + * INSTALL + ! minor + 2012-06-09 17:27 UTC+0200 Viktor Szakats (harbour syenar.net) * contrib/make.hb % use '%d' in hb_strformat() instead of calling hb_ntos() diff --git a/harbour/INSTALL b/harbour/INSTALL index 5911d665da..01d8b16250 100644 --- a/harbour/INSTALL +++ b/harbour/INSTALL @@ -1319,7 +1319,7 @@ HARBOUR header and/or lib dirs, built-in constants to make files or environment. No such thing is necessary and all of these is automatically handled by hbmk2. IOW start simple and don't be overbusy with "fine-tuning" - your configuration, if you need to, the problem is most probably + your configuration. If you need to, the problem is most probably elsewhere. It's also good idea to try with Harbour nightly binary or official release first. 12. If you are to report a problem with Harbour itself, always provide @@ -1398,7 +1398,7 @@ HARBOUR (this is not a requirement though) - You can access hbmk2 using absolute or relative paths, and it will work equally well: - 'C:\hb20\bin\hbmk2 hello.prg' + 'C:\hb\bin\hbmk2 hello.prg' - GNU Make, MSYS, or any other extra tool is *not* needed to build a Harbour application with above methods. diff --git a/harbour/contrib/hbrun/hbrun.prg b/harbour/contrib/hbrun/hbrun.prg index e3c50856f7..13ebd1b449 100644 --- a/harbour/contrib/hbrun/hbrun.prg +++ b/harbour/contrib/hbrun/hbrun.prg @@ -92,7 +92,15 @@ PROCEDURE _APPMAIN( cFile, ... ) LOCAL cExt LOCAL hHeaders - LOCAL aDynamic := {} + LOCAL aDynamic + + hb_cdpSelect( "UTF8EX" ) + + /* Configure terminal and OS codepage */ + hbmk_auto_cp_term() + hbmk_auto_cp_os() + + aDynamic := {} LoadExtDynamicFromFile( aDynamic, hb_DirBase() + "hbrun.ext" ) LoadExtDynamicFromString( aDynamic, GetEnv( "HBRUN_EXT" ) ) @@ -205,6 +213,12 @@ FUNCTION hbrun_DirBase() FUNCTION hbrun_ProgName() RETURN s_cProgName +INIT PROCEDURE ClipInit() + + hb_cdpSelect( "UTF8EX" ) + + RETURN + EXIT PROCEDURE hbrun_exit() hbrun_HistorySave() @@ -858,3 +872,400 @@ STATIC FUNCTION win_reg_app( lRegister, lAllUser, cAppPath ) RETURN lSuccess #endif + +STATIC FUNCTION hbmk_auto_cp_term() + LOCAL cCP + LOCAL cLang + + #if defined( __PLATFORM__WINDOWS ) + cCP := __CPWinToCPStd( wapi_GetOEMCP() ) + cLang := hb_UserLang() + #elif defined( __PLATFORM__UNIX ) + IF ! Empty( GetEnv( "LANG" ) ) + __UnixParseLangCP( GetEnv( "LANG" ), @cCP, @cLang ) + ELSE + __UnixParseLangCP( GetEnv( "LC_CTYPE" ), @cCP, @cLang ) + ENDIF + #elif defined( __PLATFORM__DOS ) + /* TODO */ + #elif defined( __PLATFORM__OS2 ) + /* TODO */ + #endif + + IF ! Empty( cCP := __CPStdToHarbour( cCP, cLang ) ) + hb_SetTermCP( cCP ) + ENDIF + + RETURN cCP + +STATIC FUNCTION hbmk_auto_cp_os() + LOCAL cCP + LOCAL cLang + + #if defined( __PLATFORM__WINDOWS ) + cCP := __CPWinToCPStd( wapi_GetACP() ) + cLang := hb_UserLang() + #elif defined( __PLATFORM__UNIX ) + IF ! Empty( GetEnv( "LANG" ) ) + __UnixParseLangCP( GetEnv( "LANG" ), @cCP, @cLang ) + ELSE + __UnixParseLangCP( GetEnv( "LC_CTYPE" ), @cCP, @cLang ) + ENDIF + #elif defined( __PLATFORM__DOS ) + /* TODO */ + #elif defined( __PLATFORM__OS2 ) + /* TODO */ + #endif + + IF ! Empty( cCP := __CPStdToHarbour( cCP, cLang ) ) + Set( _SET_OSCODEPAGE, cCP ) + ENDIF + + RETURN cCP + +/* language[_territory][.codeset] */ +/* [language[_territory][.codeset][@modifier]] */ +/* TODO: handle "C"/"POSIX" values and values starting with "/" */ +STATIC FUNCTION __UnixParseLangCP( cString, /* @ */ cCP, /* @ */ cLang ) + LOCAL tmp + + IF ( tmp := At( ".", cString ) ) > 0 + cLang := Left( cString, tmp - 1 ) + cCP := SubStr( cString, tmp + 1 ) + IF ( tmp := At( "@", cString ) ) > 0 + cCP := Left( cString, tmp - 1 ) + ENDIF + ELSE + cLang := cString + cCP := "UTF-8" + ENDIF + + RETURN NIL + +STATIC FUNCTION __CPUnixToCPStd( cCPUnix ) + + IF HB_ISSTRING( cCPUnix ) + + cCPUnix := StrTran( cCPUnix, "_" ) + cCPUnix := StrTran( cCPUnix, "-" ) + + /* TOFIX: update the list of std unix cp names */ + SWITCH Lower( cCPUnix ) + CASE "ibm437" + CASE "cp437" ; RETURN "cp437" + CASE "ibm737" + CASE "cp737" ; RETURN "cp737" + CASE "ibm775" + CASE "cp775" ; RETURN "cp775" + CASE "ibm850" + CASE "cp850" ; RETURN "cp850" + CASE "ibm852" + CASE "cp852" ; RETURN "cp852" + CASE "ibm857" + CASE "cp857" ; RETURN "cp857" + CASE "ibm860" + CASE "cp860" ; RETURN "cp860" + CASE "ibm861" + CASE "cp861" ; RETURN "cp861" + CASE "ibm865" + CASE "cp865" ; RETURN "cp865" + CASE "ibm866" + CASE "cp866" ; RETURN "cp866" + CASE "windows1250" ; RETURN "cp1250" + CASE "windows1251" ; RETURN "cp1251" + CASE "windows1252" ; RETURN "cp1252" + CASE "windows1253" ; RETURN "cp1253" + CASE "windows1254" ; RETURN "cp1254" + CASE "windows1257" ; RETURN "cp1257" + CASE "koi8r" ; RETURN "koi-8" + CASE "koi8u" ; RETURN "koi-8u" + CASE "iso88591" ; RETURN "iso8859-1" + CASE "iso88592" ; RETURN "iso8859-2" + CASE "iso88595" ; RETURN "iso8859-5" + CASE "iso88597" ; RETURN "iso8859-7" + CASE "iso88599" ; RETURN "iso8859-9" + CASE "utf8" ; RETURN "utf8" + ENDSWITCH + ENDIF + + RETURN "" + +STATIC FUNCTION __CPWinToCPStd( nCPWin ) + + IF HB_ISNUMERIC( nCPWin ) + SWITCH nCPWin + CASE 437 ; RETURN "cp437" + CASE 737 ; RETURN "cp737" + CASE 775 ; RETURN "cp775" + CASE 850 ; RETURN "cp850" + CASE 852 ; RETURN "cp852" + CASE 857 ; RETURN "cp857" + CASE 860 ; RETURN "cp860" + CASE 861 ; RETURN "cp861" + CASE 865 ; RETURN "cp865" + CASE 866 ; RETURN "cp866" + CASE 1200 ; RETURN "utf16" + CASE 1250 ; RETURN "cp1250" + CASE 1251 ; RETURN "cp1251" + CASE 1252 ; RETURN "cp1252" + CASE 1253 ; RETURN "cp1253" + CASE 1254 ; RETURN "cp1254" + CASE 1257 ; RETURN "cp1257" + CASE 20866 ; RETURN "koi-8" + CASE 21866 ; RETURN "koi-8u" + CASE 28591 ; RETURN "iso8859-1" + CASE 28592 ; RETURN "iso8859-2" + CASE 28595 ; RETURN "iso8859-5" + CASE 28597 ; RETURN "iso8859-7" + CASE 28599 ; RETURN "iso8859-9" + CASE 65001 ; RETURN "utf8" + ENDSWITCH + ENDIF + + RETURN "" + +STATIC FUNCTION __CPStdToHarbour( cCPStd, cCtryStd ) + LOCAL cCP + LOCAL cCtryHb + LOCAL cdp + + IF ! Empty( cCPStd ) + IF Lower( cCPStd ) == "utf8" + cCP := "UTF8" + ELSEIF Lower( cCPStd ) == "utf16" + cCP := "UTF16LE" + ELSE + IF ! Empty( cCtryHb := __CtryStdToCtry( cCtryStd ) ) + FOR EACH cdp IN hb_cdpList() + IF Left( cdp, 2 ) == cCtryHb + IF Lower( cCPStd ) == hb_cdpUniID( cdp ) + cCP := cdp + EXIT + ENDIF + ENDIF + NEXT + ENDIF + IF Empty( cCP ) + FOR EACH cdp IN hb_cdpList() + IF Lower( cCPStd ) == hb_cdpUniID( cdp ) + cCP := cdp + EXIT + ENDIF + NEXT + ENDIF + ENDIF + ENDIF + + RETURN cCP + +STATIC FUNCTION __CtryStdToCtry( cCtryStd ) + LOCAL cCtryHb := Left( hb_cdpSelect(), 2 ) + + IF HB_ISSTRING( cCtryStd ) + SWITCH Lower( cCtryStd ) + CASE "af-za" ; EXIT + CASE "af" ; EXIT + CASE "ar-ae" ; EXIT + CASE "ar-bh" ; EXIT + CASE "ar-dz" ; EXIT + CASE "ar-eg" ; EXIT + CASE "ar-iq" ; EXIT + CASE "ar-jo" ; EXIT + CASE "ar-kw" ; EXIT + CASE "ar-lb" ; EXIT + CASE "ar-ly" ; EXIT + CASE "ar-ma" ; EXIT + CASE "ar-om" ; EXIT + CASE "ar-qa" ; EXIT + CASE "ar-sa" ; EXIT + CASE "ar-sy" ; EXIT + CASE "ar-tn" ; EXIT + CASE "ar-ye" ; EXIT + CASE "ar" ; EXIT + CASE "az-az-cyrl" ; EXIT + CASE "az-az-latn" ; EXIT + CASE "az" ; EXIT + CASE "be-by" ; EXIT + CASE "be" ; EXIT + CASE "bg-bg" + CASE "bg" ; cCtryHb := "BG" ; EXIT + CASE "ca-es" ; EXIT + CASE "ca" ; EXIT + CASE "cy-gb" ; EXIT + CASE "cs-cz" + CASE "cs" ; cCtryHb := "CS" ; EXIT + CASE "da-dk" + CASE "da" ; cCtryHb := "DK" ; EXIT + CASE "de-at" + CASE "de-ch" + CASE "de-de" + CASE "de-li" + CASE "de-lu" + CASE "de" ; cCtryHb := "DE" ; EXIT + CASE "div-mv" ; EXIT + CASE "div" ; EXIT + CASE "el-gr" + CASE "el" ; cCtryHb := "EL" ; EXIT + CASE "en-au" + CASE "en-bz" + CASE "en-ca" + CASE "en-cb" + CASE "en-gb" + CASE "en-ie" + CASE "en-jm" + CASE "en-nz" + CASE "en-ph" + CASE "en-tt" + CASE "en-us" + CASE "en-za" + CASE "en-zw" + CASE "en" ; cCtryHb := "EN" ; EXIT + CASE "es-ar" + CASE "es-bo" + CASE "es-cl" + CASE "es-co" + CASE "es-cr" + CASE "es-do" + CASE "es-ec" + CASE "es-es" + CASE "es-gt" + CASE "es-hn" + CASE "es-mx" + CASE "es-ni" + CASE "es-pa" + CASE "es-pe" + CASE "es-pr" + CASE "es-py" + CASE "es-sv" + CASE "es-uy" + CASE "es-ve" + CASE "es" ; cCtryHb := "ES" ; EXIT + CASE "et-ee" ; EXIT + CASE "et" ; EXIT + CASE "eu-es" ; EXIT + CASE "eu" ; EXIT + CASE "fa-ir" ; EXIT + CASE "fa" ; EXIT + CASE "fi-fi" + CASE "fi" ; cCtryHb := "FI" ; EXIT + CASE "fo-fo" ; EXIT + CASE "fo" ; EXIT + CASE "fr-be" + CASE "fr-ca" + CASE "fr-ch" + CASE "fr-fr" + CASE "fr-lu" + CASE "fr-mc" + CASE "fr" ; cCtryHb := "FR" ; EXIT + CASE "gl-es" ; EXIT + CASE "gl" ; EXIT + CASE "gu-in" ; EXIT + CASE "gu" ; EXIT + CASE "he-il" ; EXIT + CASE "he" ; EXIT + CASE "hi-in" ; EXIT + CASE "hi" ; EXIT + CASE "hr-hr" + CASE "hr" ; cCtryHb := "HR" ; EXIT + CASE "hu-hu" + CASE "hu" ; cCtryHb := "HU" ; EXIT + CASE "hy-am" ; EXIT + CASE "hy" ; EXIT + CASE "id-id" ; EXIT + CASE "id" ; EXIT + CASE "is-is" + CASE "is" ; cCtryHb := "IS" ; EXIT + CASE "it-ch" + CASE "it-it" + CASE "it" ; cCtryHb := "IT" ; EXIT + CASE "ja-jp" ; EXIT + CASE "ja" ; EXIT + CASE "ka-ge" ; EXIT + CASE "ka" ; EXIT + CASE "kk-kz" ; EXIT + CASE "kk" ; EXIT + CASE "kn-in" ; EXIT + CASE "kn" ; EXIT + CASE "ko-kr" ; EXIT + CASE "ko" ; EXIT + CASE "kok-in" ; EXIT + CASE "kok" ; EXIT + CASE "ky-kz" ; EXIT + CASE "ky" ; EXIT + CASE "lt-lt" + CASE "lt" ; cCtryHb := "LT" ; EXIT + CASE "lv-lv" ; EXIT + CASE "lv" ; EXIT + CASE "mk-mk" ; EXIT + CASE "mk" ; EXIT + CASE "mn-mn" ; EXIT + CASE "mn" ; EXIT + CASE "mr-in" ; EXIT + CASE "mr" ; EXIT + CASE "ms-bn" ; EXIT + CASE "ms-my" ; EXIT + CASE "ms" ; EXIT + CASE "nb-no" ; EXIT + CASE "nl-be" + CASE "nl-nl" + CASE "nl" ; cCtryHb := "NL" ; EXIT + CASE "nn-no" ; EXIT + CASE "no" ; cCtryHb := "NO" ; EXIT + CASE "pa-in" ; EXIT + CASE "pa" ; EXIT + CASE "pl-pl" + CASE "pl" ; cCtryHb := "PL" ; EXIT + CASE "pt-br" + CASE "pt-pt" + CASE "pt" ; cCtryHb := "PT" ; EXIT + CASE "ro-ro" + CASE "ro" ; cCtryHb := "RO" ; EXIT + CASE "ru-ru" + CASE "ru" ; cCtryHb := "RU" ; EXIT + CASE "sa-in" ; EXIT + CASE "sa" ; EXIT + CASE "sk-sk" + CASE "sk" ; cCtryHb := "SK" ; EXIT + CASE "sl-si" + CASE "sl" ; cCtryHb := "SL" ; EXIT + CASE "sq-al" ; EXIT + CASE "sq" ; EXIT + CASE "sr-sp-cyrl" + CASE "sr-sp-latn" ; cCtryHb := "SR" ; EXIT + CASE "sv-fi" + CASE "sv-se" + CASE "sv" ; cCtryHb := "SV" ; EXIT + CASE "sw-ke" ; EXIT + CASE "sw" ; EXIT + CASE "syr-sy" ; EXIT + CASE "syr" ; EXIT + CASE "ta-in" ; EXIT + CASE "ta" ; EXIT + CASE "te-in" ; EXIT + CASE "te" ; EXIT + CASE "th-th" ; EXIT + CASE "th" ; EXIT + CASE "tr-tr" + CASE "tr" ; cCtryHb := "TR" ; EXIT + CASE "tt-ru" ; EXIT + CASE "tt" ; EXIT + CASE "uk-ua" + CASE "uk" ; cCtryHb := "UA" ; EXIT + CASE "ur-pk" ; EXIT + CASE "ur" ; EXIT + CASE "uz-uz-cyrl" ; EXIT + CASE "uz-uz-latn" ; EXIT + CASE "uz" ; EXIT + CASE "vi-vn" ; EXIT + CASE "vi" ; EXIT + CASE "zh-chs" ; EXIT + CASE "zh-cht" ; EXIT + CASE "zh-cn" ; EXIT + CASE "zh-hk" ; EXIT + CASE "zh-mo" ; EXIT + CASE "zh-sg" ; EXIT + CASE "zh-tw" ; EXIT + ENDSWITCH + ENDIF + + RETURN cCtryHb