From f604930a1eb4abb9e7d099b8070da0bf2834ba05 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Tue, 23 Jun 2009 09:56:44 +0000 Subject: [PATCH] 2009-06-23 11:56 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/bin/hb-func.sh * harbour/utils/hbmk2/hbmk2.prg * updated automatic first function detection to decode non symbol characters in C function names --- harbour/ChangeLog | 6 ++++++ harbour/bin/hb-func.sh | 3 +++ harbour/utils/hbmk2/hbmk2.prg | 31 +++++++++++++++++++++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8847976c0f..6c098af330 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,12 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-06-23 11:56 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/bin/hb-func.sh + * harbour/utils/hbmk2/hbmk2.prg + * updated automatic first function detection to decode non symbol + characters in C function names + 2009-06-23 10:57 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * examples/hboleold/hboleold.hbp + examples/hboleold/tests/hbmk.hbm diff --git a/harbour/bin/hb-func.sh b/harbour/bin/hb-func.sh index 551c3b2423..13aedd1746 100755 --- a/harbour/bin/hb-func.sh +++ b/harbour/bin/hb-func.sh @@ -673,6 +673,9 @@ hb_lnk_request() echo " hb_gt_szNameDefault = \\"\$gt\\";" fi if [ -n "\${HB_MAIN_FUNC}" ]; then + if [ \${HB_MAIN_FUNC} != \${HB_MAIN_FUNC/x/y} ]; then + HB_MAIN_FUNC=\`echo "\${HB_MAIN_FUNC}"|sed -e 's/x\\(..\\)/\\\\\\\\x\\1" "/'\` + fi echo " hb_vmSetLinkedMain( \\"\${HB_MAIN_FUNC}\\" );" fi echo "HB_CALL_ON_STARTUP_END( hb_lnk_SetDefault_build )" diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index d5af2d0034..d031feb231 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -3251,6 +3251,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) '' + hb_osNewLine() +; '#include "hbapi.h"' + hb_osNewLine() ) IF ! Empty( array ) + AEval( array, {|tmp, i| array[ i ] := FuncNameEncode( tmp ) } ) FWrite( fhnd, '' + hb_osNewLine() ) AEval( array, {|tmp| FWrite( fhnd, 'HB_FUNC_EXTERN( ' + tmp + ' );' + hb_osNewLine() ) } ) FWrite( fhnd, '' + hb_osNewLine() ) @@ -5475,10 +5476,10 @@ STATIC FUNCTION TimeElapsed( nStartSec, nEndSec ) RETURN Round( ( nEndSec - iif( nEndSec < nStartSec, nStartSec - 86399, nStartSec ) ), 1 ) STATIC FUNCTION IsValidHarbourID( cName ) - LOCAL tmp + LOCAL c IF HB_ISFIRSTIDCHAR( Left( cName, 1 ) ) - FOR tmp := 2 TO Len( cName ) - IF ! HB_ISNEXTIDCHAR( SubStr( cName, tmp, 1 ) ) + FOR EACH c IN SubStr( cName, 2 ) + IF ! HB_ISNEXTIDCHAR( c ) RETURN .F. ENDIF NEXT @@ -5486,6 +5487,23 @@ STATIC FUNCTION IsValidHarbourID( cName ) ENDIF RETURN .F. + +STATIC FUNCTION FuncNameEncode( cName ) + LOCAL cResult, c + + cResult := "" + FOR EACH c IN cName + IF c == "_" .OR. IsAlpha( c ) .OR. ( ! cResult == "" .AND. IsDigit( c ) ) + cResult += c + ELSE + cResult += "x" + Lower( HB_NumToHex( Asc( c ), 2 ) ) + ENDIF + NEXT + RETURN cResult + +STATIC FUNCTION IsHexDigit( c ) + RETURN c $ "0123456789ABCDEFabcdef" + /* in GCC LD (except DJGPP) the order of registering init function * does not depend directly on the order of linked files. If we want * to inform HVM about valid startup function then we should try to @@ -5514,7 +5532,12 @@ STATIC FUNCTION getFirstFunc( hbmk, cFile ) IF ( n := At( " T HB_FUN_", cFuncList ) ) != 0 n += 10 DO WHILE ( c := SubStr( cFuncList, n++, 1 ) ) == "_" .OR. ; - IsDigit( c ) .OR. IsAlpha( c ) + IsDigit( c ) .OR. IsAlpha( c ) + IF c == "x" .AND. IsHexDigit( SubStr( cFuncList, n, 1 ) ) .AND. ; + IsHexDigit( SubStr( cFuncList, n + 1, 1 ) ) + c := HB_HexToNum( SubStr( cFuncList, n, 2 ) ) + n += 2 + ENDIF cFuncName += c ENDDO ENDIF