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
This commit is contained in:
Viktor Szakats
2012-06-09 16:03:21 +00:00
parent 9034e0d551
commit acf600f27f
3 changed files with 430 additions and 3 deletions

View File

@@ -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()

View File

@@ -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.

View File

@@ -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