2012-11-16 09:39 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* harbour/include/hbapi.h
  * harbour/src/vm/cmdarg.c
    ! fixed to compile without UNICODE macro
    + added new C functions: hb_cmdargBaseProgName(), hb_cmdargPushArgs()
    * marked places which needs TCHAR conversions in MS-Windows builds

  * harbour/src/vm/hvm.c
    * use hb_cmdargPushArgs()

  * harbour/src/rtl/hbproces.c
    ! fixed to compile without UNICODE macro

  * harbour/src/rtl/gtxwc/gtxwc.c
    * modified code to set window title to always operate on UTF8 values
    * use hb_cmdargBaseProgName()

  * harbour/src/rtl/gtwvt/gtwvt.c
  * harbour/contrib/gtwvg/gtwgud.c
  * harbour/contrib/gtwvg/gtwvgd.c
  * harbour/contrib/gtalleg/gtalleg.c
  * harbour/extras/gtwvw/gtwvwd.c
    * use hb_cmdargBaseProgName()

  * harbour/contrib/hbodbc/odbc.c
    ! keep references to parent handles in sub-handles pointer structures
    ; please make real life tests if it works correctly
This commit is contained in:
Przemyslaw Czerpak
2012-11-16 08:39:35 +00:00
parent 8740095e25
commit 710c40b8a7
12 changed files with 212 additions and 116 deletions

View File

@@ -16,6 +16,34 @@
The license applies to all entries newer than 2009-04-28.
*/
2012-11-16 09:39 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* harbour/include/hbapi.h
* harbour/src/vm/cmdarg.c
! fixed to compile without UNICODE macro
+ added new C functions: hb_cmdargBaseProgName(), hb_cmdargPushArgs()
* marked places which needs TCHAR conversions in MS-Windows builds
* harbour/src/vm/hvm.c
* use hb_cmdargPushArgs()
* harbour/src/rtl/hbproces.c
! fixed to compile without UNICODE macro
* harbour/src/rtl/gtxwc/gtxwc.c
* modified code to set window title to always operate on UTF8 values
* use hb_cmdargBaseProgName()
* harbour/src/rtl/gtwvt/gtwvt.c
* harbour/contrib/gtwvg/gtwgud.c
* harbour/contrib/gtwvg/gtwvgd.c
* harbour/contrib/gtalleg/gtalleg.c
* harbour/extras/gtwvw/gtwvwd.c
* use hb_cmdargBaseProgName()
* harbour/contrib/hbodbc/odbc.c
! keep references to parent handles in sub-handles pointer structures
; please make real life tests if it works correctly
2012-11-16 04:10 UTC+0100 Viktor Szakats (harbour syenar.net)
* ChangeLog
! restored/fixed file that got corrupted in

View File

@@ -330,7 +330,6 @@ static void hb_gt_alleg_ScreenUpdate( PHB_GT pGT )
static HB_BOOL hb_gt_alleg_InitializeScreen( PHB_GT pGT, int iRows, int iCols, HB_BOOL lClearInit )
{
PHB_FNAME pFileName;
int iRet = 1, iWidth, iHeight; /* Don't remove iRet, ixFP and iyFP initializers! */
short ixFP = 0, iyFP = 0;
HB_BOOL lMode = HB_FALSE, lPrev = s_fInit;
@@ -432,9 +431,13 @@ static HB_BOOL hb_gt_alleg_InitializeScreen( PHB_GT pGT, int iRows, int iCols, H
else
lMode = HB_TRUE;
pFileName = hb_fsFNameSplit( hb_cmdargARGV()[ 0 ] );
al_set_window_title( ( char * ) pFileName->szName );
hb_xfree( pFileName );
{
char * pszBaseName = hb_cmdargBaseProgName();
al_set_window_title( pszBaseName );
if( pszBaseName )
hb_xfree( pszBaseName );
}
if( ! lPrev )
{

View File

@@ -274,13 +274,10 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow )
pWVT->bClosable = HB_TRUE;
{
PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGVN( 0 ) );
PHB_ITEM pItem = hb_itemPutC( NULL, pFileName->szName );
PHB_ITEM pItem = hb_itemPutCPtr( NULL, hb_cmdargBaseProgName() );
pWVT->lpWindowTitle = HB_ITEMGETSTR( pItem, &pWVT->hWindowTitle, NULL );
hb_itemRelease( pItem );
hb_xfree( pFileName );
}
pWVT->pPP = ( HB_GT_PARAMS * ) hb_xgrab( sizeof( HB_GT_PARAMS ) );

View File

@@ -432,13 +432,10 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow )
pWVT->bClosable = HB_TRUE;
{
PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGVN( 0 ) );
PHB_ITEM pItem = hb_itemPutC( NULL, pFileName->szName );
PHB_ITEM pItem = hb_itemPutCPtr( NULL, hb_cmdargBaseProgName() );
pWVT->lpWindowTitle = HB_ITEMGETSTR( pItem, &pWVT->hWindowTitle, NULL );
hb_itemRelease( pItem );
hb_xfree( pFileName );
}
pWVT->ResizeMode = HB_GTI_RESIZEMODE_FONT;

View File

@@ -75,6 +75,7 @@
*/
#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapierr.h"
#include "hbapistr.h"
#include "hbset.h"
@@ -193,102 +194,155 @@ static void hb_SQLHENV_stor( SQLHENV hEnv, int iParam )
/* GC - SQLHDBC */
typedef struct
{
SQLHDBC hDbc;
PHB_ITEM pHEnvItm;
}
HB_SQLHDBC, * PHB_SQLHDBC;
static HB_GARBAGE_FUNC( hb_SQLHDBC_Destructor )
{
/* Retrieve image pointer holder */
SQLHDBC * ptr = ( SQLHDBC * ) Cargo;
PHB_SQLHDBC pHDbc = ( PHB_SQLHDBC ) Cargo;
/* Check if pointer is not NULL to avoid multiple freeing */
if( *ptr )
if( pHDbc->hDbc )
{
#if defined( _HBODBC_AUTO_MM_ )
#if ODBCVER >= 0x0300
SQLFreeHandle( SQL_HANDLE_DBC, ( SQLHANDLE ) *ptr );
SQLFreeHandle( SQL_HANDLE_DBC, ( SQLHANDLE ) pHDbc->hDbc );
#else
SQLFreeConnect( *ptr );
SQLFreeConnect( pHDbc->hDbc );
#endif
#endif
/* set pointer to NULL to avoid multiple freeing */
*ptr = NULL;
pHDbc->hDbc = NULL;
}
if( pHDbc->pHEnvItm )
{
/* release reference to parent handler */
hb_itemRelease( pHDbc->pHEnvItm );
/* set pointer to NULL to avoid multiple freeing */
pHDbc->pHEnvItm = NULL;
}
}
static HB_GARBAGE_FUNC( hb_SQLHDBC_Mark )
{
/* Retrieve image pointer holder */
PHB_SQLHDBC pHDbc = ( PHB_SQLHDBC ) Cargo;
if( pHDbc->pHEnvItm )
{
/* mark parent item handler as used */
hb_gcMark( pHDbc->pHEnvItm );
}
}
static const HB_GC_FUNCS s_gcSQLHDBCFuncs =
{
hb_SQLHDBC_Destructor,
hb_gcDummyMark
hb_SQLHDBC_Mark
};
static SQLHDBC hb_SQLHDBC_par( int iParam )
{
SQLHDBC * ptr = ( SQLHDBC * ) hb_parptrGC( &s_gcSQLHDBCFuncs, iParam );
PHB_SQLHDBC pHDbc = ( PHB_SQLHDBC ) hb_parptrGC( &s_gcSQLHDBCFuncs, iParam );
return ptr ? *ptr : NULL;
return pHDbc ? pHDbc->hDbc : NULL;
}
static SQLHDBC hb_SQLHDBC_is( int iParam )
static HB_BOOL hb_SQLHDBC_is( int iParam )
{
return hb_parptrGC( &s_gcSQLHDBCFuncs, iParam );
return hb_SQLHDBC_par( iParam ) != NULL;
}
static void hb_SQLHDBC_stor( SQLHDBC hDbc, int iParam )
static void hb_SQLHDBC_stor( PHB_ITEM pHEnvItm, SQLHDBC hDbc, int iParam )
{
SQLHDBC * ptr = ( SQLHDBC * ) hb_gcAllocate( sizeof( SQLHDBC ), &s_gcSQLHDBCFuncs );
PHB_SQLHDBC pHDbc = ( PHB_SQLHDBC ) hb_gcAllocate( sizeof( HB_SQLHDBC ), &s_gcSQLHDBCFuncs );
*ptr = hDbc;
pHDbc->hDbc = hDbc;
pHDbc->pHEnvItm = pHEnvItm ? hb_itemNew( pHEnvItm ) : NULL;
hb_storptrGC( ( void * ) ptr, iParam );
hb_storptrGC( ( void * ) pHDbc, iParam );
}
/* GC - SQLHSTMT */
typedef struct
{
SQLHSTMT hStmt;
PHB_ITEM pHDbcItm;
}
HB_SQLHSTMT, * PHB_SQLHSTMT;
static HB_GARBAGE_FUNC( hb_SQLHSTMT_Destructor )
{
/* Retrieve image pointer holder */
SQLHSTMT * ptr = ( SQLHSTMT * ) Cargo;
PHB_SQLHSTMT pHStmt = ( PHB_SQLHSTMT ) Cargo;
/* Check if pointer is not NULL to avoid multiple freeing */
if( *ptr )
if( pHStmt->hStmt )
{
#if defined( _HBODBC_AUTO_MM_ )
#if ODBCVER >= 0x0300
SQLFreeHandle( SQL_HANDLE_STMT, ( SQLHANDLE ) *ptr );
SQLFreeHandle( SQL_HANDLE_STMT, ( SQLHANDLE ) pHStmt->hStmt );
#else
SQLFreeStmt( *ptr, SQL_DROP );
SQLFreeStmt( pHStmt->hStmt, SQL_DROP );
#endif
#endif
/* set pointer to NULL to avoid multiple freeing */
*ptr = NULL;
pHStmt->hStmt = NULL;
}
if( pHStmt->pHDbcItm )
{
/* release reference to parent handler */
hb_itemRelease( pHStmt->pHDbcItm );
/* set pointer to NULL to avoid multiple freeing */
pHStmt->pHDbcItm = NULL;
}
}
static HB_GARBAGE_FUNC( hb_SQLHSTMT_Mark )
{
/* Retrieve image pointer holder */
PHB_SQLHSTMT pHStmt = ( PHB_SQLHSTMT ) Cargo;
if( pHStmt->pHDbcItm )
{
/* mark parent item handler as used */
hb_gcMark( pHStmt->pHDbcItm );
}
}
static const HB_GC_FUNCS s_gcSQLHSTMTFuncs =
{
hb_SQLHSTMT_Destructor,
hb_gcDummyMark
hb_SQLHSTMT_Mark
};
static SQLHSTMT hb_SQLHSTMT_par( int iParam )
{
SQLHSTMT * ptr = ( SQLHSTMT * ) hb_parptrGC( &s_gcSQLHSTMTFuncs, iParam );
PHB_SQLHSTMT pHStmt = ( PHB_SQLHSTMT ) hb_parptrGC( &s_gcSQLHSTMTFuncs, iParam );
return ptr ? *ptr : NULL;
return pHStmt ? pHStmt->hStmt : NULL;
}
static SQLHSTMT hb_SQLHSTMT_is( int iParam )
static HB_BOOL hb_SQLHSTMT_is( int iParam )
{
return hb_parptrGC( &s_gcSQLHSTMTFuncs, iParam );
return hb_SQLHSTMT_par( iParam ) != NULL;
}
static void hb_SQLHSTMT_stor( SQLHSTMT hStmt, int iParam )
static void hb_SQLHSTMT_stor( PHB_ITEM pHDbcItm, SQLHSTMT hStmt, int iParam )
{
SQLHSTMT * ptr = ( SQLHSTMT * ) hb_gcAllocate( sizeof( SQLHSTMT ), &s_gcSQLHSTMTFuncs );
PHB_SQLHSTMT pHStmt = ( PHB_SQLHSTMT ) hb_gcAllocate( sizeof( HB_SQLHSTMT ), &s_gcSQLHSTMTFuncs );
*ptr = hStmt;
pHStmt->hStmt = hStmt;
pHStmt->pHDbcItm = pHDbcItm ? hb_itemNew( pHDbcItm ) : NULL;
hb_storptrGC( ( void * ) ptr, iParam );
hb_storptrGC( ( void * ) pHStmt, iParam );
}
HB_FUNC( SQLALLOCENV ) /* @hEnv --> nRetCode */
@@ -317,7 +371,7 @@ HB_FUNC( SQLALLOCCONNECT ) /* hEnv, @hDbc --> nRetCode */
hb_retni( SQLAllocConnect( hEnv, &hDbc ) );
#endif
hb_SQLHDBC_stor( hDbc, 2 );
hb_SQLHDBC_stor( hb_param( 1, HB_IT_ANY ), hDbc, 2 );
}
else
hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
@@ -428,7 +482,7 @@ HB_FUNC( SQLALLOCSTMT ) /* hDbc, @hStmt --> nRetCode */
hb_retni( SQLAllocStmt( hDbc, &hStmt ) );
#endif
hb_SQLHSTMT_stor( hStmt, 2 );
hb_SQLHSTMT_stor( hb_param( 1, HB_IT_ANY ), hStmt, 2 );
}
else
hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );

View File

@@ -468,15 +468,12 @@ static void hb_gt_wvw_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil
hb_errRT_TERM( EG_CREATE, 10001, "WINAPI CreateWindow() failed", "hb_gt_Init()", 0, 0 );
{
PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGVN( 0 ) );
PHB_ITEM pItem = hb_itemPutC( NULL, pFileName->szName );
void * hWindowTitle;
PHB_ITEM pItem = hb_itemPutCPtr( NULL, hb_cmdargBaseProgName() );
void * hWindowTitle;
hb_gt_wvwSetWindowTitle( 0, HB_ITEMGETSTR( pItem, &hWindowTitle, NULL ) );
hb_strfree( hWindowTitle );
hb_itemRelease( pItem );
hb_xfree( pFileName );
}
hb_gt_wvwCreateObjects( 0 );
@@ -7097,11 +7094,9 @@ HB_FUNC( WVW_NOPENWINDOW )
}
else
{
pFileName = hb_fsFNameSplit( hb_cmdargARGV()[ 0 ] );
PHB_ITEM pItem = hb_itemPutC( NULL, pFileName->szName );
PHB_ITEM pItem = hb_itemPutCPtr( NULL, hb_cmdargBaseProgName() );
lpszWinName = HB_ITEMGETSTR( pItem, &hWinName, NULL );
hb_itemRelease( pItem );
}

View File

@@ -1041,6 +1041,8 @@ extern HB_EXPORT char ** hb_cmdargARGV( void ); /* retrieve command line a
extern HB_EXPORT const char * hb_cmdargARGVN( int argc ); /* retrieve given command line argument */
extern HB_EXPORT HB_BOOL hb_cmdargIsInternal( const char * szArg, int * piLen ); /* determine if a string is an internal setting */
extern HB_EXPORT char * hb_cmdargProgName( void ); /* return application name with path or NULL if not set, caller must free returned value with hb_xfree() if not NULL */
extern HB_EXPORT char * hb_cmdargBaseProgName( void ); /* return application name without path or NULL if not set, caller must free returned value with hb_xfree() if not NULL */
extern int hb_cmdargPushArgs( void ); /* places application parameters on the HVM stack */
extern void hb_cmdargUpdate( void ); /* update arguments after HVM initialization */
extern HB_BOOL hb_cmdargCheck( const char * pszName ); /* Check if a given internal switch (like //INFO) was set */
extern char * hb_cmdargString( const char * pszName ); /* Returns the string value of an internal switch (like //TEMPPATH:"C:\") */

View File

@@ -372,13 +372,10 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow )
pWVT->bSelectCopy = HB_TRUE;
{
PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGVN( 0 ) );
PHB_ITEM pItem = hb_itemPutC( NULL, pFileName->szName );
PHB_ITEM pItem = hb_itemPutCPtr( NULL, hb_cmdargBaseProgName() );
pWVT->lpWindowTitle = HB_ITEMGETSTR( pItem, &pWVT->hWindowTitle, NULL );
hb_itemRelease( pItem );
hb_xfree( pFileName );
}
pWVT->bResizable = HB_TRUE;

View File

@@ -3984,6 +3984,27 @@ static HB_ULONG hb_gt_xwc_CurrentTime( void )
/* *********************************************************************** */
static void hb_gt_xwc_SetTitle( PXWND_DEF wnd, const char * szTitle )
{
if( szTitle && * szTitle )
{
XTextProperty text;
char * pBuffer;
pBuffer = hb_cdpDup( szTitle, HB_GTSELF_HOSTCP( wnd->pGT ), wnd->utf8CDP );
text.value = ( unsigned char * ) pBuffer;
text.encoding = s_atomUTF8String;
text.format = 8;
text.nitems = strlen( pBuffer );
XSetWMName( wnd->dpy, wnd->window, &text );
hb_xfree( pBuffer );
}
else
XStoreName( wnd->dpy, wnd->window, "" );
}
/* *********************************************************************** */
static void hb_gt_xwc_ProcessMessages( PXWND_DEF wnd, HB_BOOL fSync )
{
if( wnd->cursorType != SC_NONE )
@@ -4011,21 +4032,7 @@ static void hb_gt_xwc_ProcessMessages( PXWND_DEF wnd, HB_BOOL fSync )
if( wnd->fDspTitle )
{
wnd->fDspTitle = HB_FALSE;
if( wnd->szTitle )
{
XTextProperty text;
char * pBuffer;
pBuffer = hb_cdpDup( wnd->szTitle, HB_GTSELF_HOSTCP( wnd->pGT ), wnd->utf8CDP );
text.value = ( unsigned char * ) pBuffer;
text.encoding = s_atomUTF8String;
text.format = 8;
text.nitems = strlen( pBuffer );
XSetWMName( wnd->dpy, wnd->window, &text );
hb_xfree( pBuffer );
}
else
XStoreName( wnd->dpy, wnd->window, "" );
hb_gt_xwc_SetTitle( wnd, wnd->szTitle );
}
#if 1
@@ -4327,7 +4334,6 @@ static HB_BOOL hb_gt_xwc_isUTF8( void )
static PXWND_DEF hb_gt_xwc_CreateWndDef( PHB_GT pGT )
{
PHB_FNAME pFileName;
PXWND_DEF wnd = ( PXWND_DEF ) hb_xgrab( sizeof( XWND_DEF ) );
int i;
@@ -4351,10 +4357,8 @@ static PXWND_DEF hb_gt_xwc_CreateWndDef( PHB_GT pGT )
wnd->cursorType = SC_NORMAL;
/* Window Title */
pFileName = hb_fsFNameSplit( hb_cmdargARGVN( 0 ) );
wnd->szTitle = pFileName->szName ? hb_strdup( pFileName->szName ) : NULL;
wnd->szTitle = hb_cmdargBaseProgName();
wnd->fDspTitle = HB_TRUE;
hb_xfree( pFileName );
/* Font parameters */
wnd->fontHeight = XWC_DEFAULT_FONT_HEIGHT;
@@ -4594,7 +4598,7 @@ static void hb_gt_xwc_CreateWindow( PXWND_DEF wnd )
/* Line width 2 */
XSetLineAttributes( wnd->dpy, wnd->gc, 1, LineSolid, CapRound, JoinBevel );
XStoreName( wnd->dpy, wnd->window, wnd->szTitle ? wnd->szTitle : "" );
hb_gt_xwc_SetTitle( wnd, wnd->szTitle );
}
XSetFont( wnd->dpy, wnd->gc, wnd->xfs->fid );
@@ -5107,16 +5111,21 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
}
case HB_GTI_WINTITLE:
pInfo->pResult = hb_itemPutC( pInfo->pResult, wnd->szTitle );
pInfo->pResult = hb_itemPutStrLenUTF8( pInfo->pResult, wnd->szTitle,
strlen( wnd->szTitle ) );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING )
{
void * hString;
HB_SIZE nLen;
const char * pszTitle = hb_itemGetStrUTF8( pInfo->pNewVal, &hString, &nLen );
if( wnd->szTitle )
hb_xfree( wnd->szTitle );
if( hb_itemGetCLen( pInfo->pNewVal ) > 0 )
wnd->szTitle = hb_strdup( hb_itemGetCPtr( pInfo->pNewVal ) );
if( nLen > 0 )
wnd->szTitle = hb_strdup( pszTitle );
else
wnd->szTitle = NULL;
hb_strfree( hString );
wnd->fDspTitle = HB_TRUE;
}

View File

@@ -427,7 +427,7 @@ HB_FHANDLE hb_fsProcessOpen( const char * pszFilename,
PROCESS_INFORMATION pi;
STARTUPINFO si;
DWORD dwFlags = 0;
LPWSTR lpCommand = HB_CHARDUP( pszFilename );
LPTSTR lpCommand = HB_CHARDUP( pszFilename );
memset( &pi, 0, sizeof( pi ) );
memset( &si, 0, sizeof( si ) );

View File

@@ -79,10 +79,12 @@ static char s_szAppName[ HB_PATH_MAX ];
#else
#include "hbwinuni.h"
#include <windows.h>
static char s_szAppName[ MAX_PATH ];
/* static LPTSTR* s_lpArgV = NULL; */
static TCHAR s_lpAppName[ MAX_PATH ];
static char s_szAppName[ MAX_PATH ];
static int s_fSkipAppName = HB_FALSE;
static HANDLE s_hInstance = 0;
@@ -147,6 +149,7 @@ const char * hb_cmdargARGVN( int argc )
static char * hb_cmdargDup( int argc )
{
/* TODO: TCHAR conv */
return argc >= 0 && argc < s_argc ? hb_osStrDecode( s_argv[ argc ] ) : NULL;
}
@@ -157,6 +160,7 @@ void hb_cmdargUpdate( void )
if( s_argc > 0 )
{
#if defined( HB_OS_WIN )
/* TODO: TCHAR conv */
/* NOTE: Manually setup the executable name in Windows,
because in console apps the name may be truncated
@@ -261,6 +265,27 @@ void hb_cmdargUpdate( void )
}
}
/* places application parameters on the HVM stack */
int hb_cmdargPushArgs( void )
{
int argc = hb_cmdargARGC();
char ** argv = hb_cmdargARGV();
int iArgCount = 0, i;
for( i = 1; i < argc; i++ )
{
/* Filter out any parameters beginning with //, like //INFO */
if( ! hb_cmdargIsInternal( argv[ i ], NULL ) )
{
hb_vmPushString( argv[ i ], strlen( argv[ i ] ) );
iArgCount++;
}
}
return iArgCount;
}
HB_BOOL hb_cmdargIsInternal( const char * szArg, int * piLen )
{
HB_TRACE( HB_TR_DEBUG, ( "hb_cmdargIsInternal(%s, %p)", szArg, piLen ) );
@@ -307,6 +332,7 @@ static char * hb_cmdargGet( const char * pszName, HB_BOOL bRetValue )
{
if( bRetValue )
{
/* TODO: TCHAR conv */
char * pszPos = s_argv[ i ] + iPrefixLen + strlen( pszName );
if( *pszPos == ':' )
@@ -426,6 +452,7 @@ int hb_cmdargNum( const char * pszName )
char * hb_cmdargProgName( void )
{
#if defined( HB_OS_WIN )
/* TODO: TCHAR conv */
if( ! s_fSkipAppName )
{
if( s_lpAppName[ 0 ] == 0 )
@@ -437,12 +464,28 @@ char * hb_cmdargProgName( void )
s_lpAppName[ 0 ] = 0;
}
if( s_lpAppName[ 0 ] != 0 )
return hb_osStrU16Decode( s_lpAppName );
return HB_OSSTRDUP( s_lpAppName );
}
#endif
return hb_cmdargDup( 0 );
}
/* NOTE: Pointer must be freed with hb_xfree() if not NULL */
char * hb_cmdargBaseProgName( void )
{
char * pszProgName, * pszBaseProgName;
PHB_FNAME pFileName;
pszProgName = hb_cmdargProgName();
pFileName = hb_fsFNameSplit( pszProgName );
pszBaseProgName = hb_strdup( pFileName->szName );
hb_xfree( pFileName );
hb_xfree( pszProgName );
return pszBaseProgName;
}
/* Check if an internal switch has been set */
HB_FUNC( HB_ARGCHECK )
@@ -502,6 +545,7 @@ HB_FUNC( HB_ARGSHIFT )
{
if( ! hb_cmdargIsInternal( s_argv[ iArg ], NULL ) )
{
/* TODO: TCHAR conv */
s_argv[ 0 ] = s_argv[ iArg ];
#if defined( HB_OS_WIN )
s_fSkipAppName = HB_TRUE;
@@ -516,6 +560,7 @@ HB_FUNC( HB_ARGSHIFT )
--s_argc;
while( iArg < s_argc )
{
/* TODO: TCHAR conv */
s_argv[ iArg ] = s_argv[ iArg + 1 ];
++iArg;
}
@@ -530,6 +575,8 @@ HB_FUNC( HB_CMDLINE )
HB_SIZE nLen;
int iArg;
/* TODO: TCHAR conv */
nLen = 0;
for( iArg = 1; iArg < argc; iArg++ )
nLen += strlen( argv[ iArg ] ) + 1;

View File

@@ -1125,25 +1125,9 @@ void hb_vmInit( HB_BOOL bStartMainProc )
if( bStartMainProc && s_pSymStart )
{
int argc = hb_cmdargARGC();
char ** argv = hb_cmdargARGV();
int iArgCount = 0;
int i;
hb_vmPushSymbol( s_pSymStart ); /* pushes first HB_FS_PUBLIC defined symbol to the stack */
hb_vmPushNil(); /* places NIL at self */
for( i = 1; i < argc; i++ ) /* places application parameters on the stack */
{
/* Filter out any parameters beginning with //, like //INFO */
if( ! hb_cmdargIsInternal( argv[ i ], NULL ) )
{
hb_vmPushString( argv[ i ], strlen( argv[ i ] ) );
iArgCount++;
}
}
hb_vmProc( ( HB_USHORT ) iArgCount ); /* invoke it with number of supplied parameters */
hb_vmProc( ( HB_USHORT ) hb_cmdargPushArgs() ); /* invoke it with number of supplied parameters */
}
}
@@ -8142,26 +8126,9 @@ static void hb_vmDoInitFunctions( HB_BOOL fClipInit )
( strcmp( ( pLastSymbols->pModuleSymbols + ui )->szName,
"CLIPINIT$" ) == 0 ? fClipInit : !fClipInit ) )
{
int argc = hb_cmdargARGC();
char ** argv = hb_cmdargARGV();
int iArgCount;
int i;
hb_vmPushSymbol( pLastSymbols->pModuleSymbols + ui );
hb_vmPushNil();
iArgCount = 0;
for( i = 1; i < argc; i++ ) /* places application parameters on the stack */
{
/* Filter out any parameters beginning with //, like //INFO */
if( ! hb_cmdargIsInternal( argv[ i ], NULL ) )
{
hb_vmPushString( argv[ i ], strlen( argv[ i ] ) );
iArgCount++;
}
}
hb_vmProc( ( HB_USHORT ) iArgCount );
hb_vmProc( ( HB_USHORT ) hb_cmdargPushArgs() );
if( hb_vmRequestQuery() != 0 )
break;
}