/* Returns a double value between 0 and 1 */ double hb_random_num( void ) { HB_I32 * seed = SEED_PTR, t; t = *seed; if( t == 0 ) t = ( HB_I32 ) ( ( hb_dateMilliSeconds() ^ ( HB_PTRUINT ) hb_stackId() ) % MODULUS ); #if ! defined( HB_LONG_LONG_OFF ) t = ( HB_I32 ) ( ( HB_LONGLONG ) t * MULTIPLIER % MODULUS ); #else { const HB_I32 Q = MODULUS / MULTIPLIER; const HB_I32 R = MODULUS % MULTIPLIER; t = MULTIPLIER * ( t % Q ) - R * ( t / Q ); if( t < 0 ) t += MODULUS; } #endif *seed = t; return ( double ) ( t - 1 ) / ( MODULUS - 1 ); }
void hb_errInternalRaw( HB_ERRCODE errCode, const char * szText, const char * szPar1, const char * szPar2 ) { char buffer[ 8192 ]; char file[ HB_PATH_MAX ]; const char * szFile, * szInfo; HB_BOOL fStack, fLang; HB_USHORT uiLine; int iLevel; FILE * hLog; HB_TRACE( HB_TR_DEBUG, ( "hb_errInternal(%d, %s, %s, %s)", errCode, szText, szPar1, szPar2 ) ); if( szPar1 == NULL ) szPar1 = ""; if( szPar2 == NULL ) szPar2 = ""; fStack = hb_stackId() != NULL; fLang = fStack && hb_langID() != NULL; szFile = fStack ? hb_setGetCPtr( HB_SET_HBOUTLOG ) : NULL; if( ! szFile ) szFile = "hb_out.log"; hLog = hb_fopen( szFile, "a+" ); if( hLog ) { char szTime[ 9 ]; int iYear, iMonth, iDay; hb_dateToday( &iYear, &iMonth, &iDay ); hb_dateTimeStr( szTime ); fprintf( hLog, "Application Internal Error - %s\n", hb_cmdargARGVN( 0 ) ); fprintf( hLog, "Terminated at: %04d-%02d-%02d %s\n", iYear, iMonth, iDay, szTime ); szInfo = fStack ? hb_setGetCPtr( HB_SET_HBOUTLOGINFO ) : NULL; if( szInfo && *szInfo ) fprintf( hLog, "Info: %s\n", szInfo ); } hb_conOutErr( hb_conNewLine(), 0 ); if( fLang ) hb_snprintf( buffer, sizeof( buffer ), hb_langDGetItem( HB_LANG_ITEM_BASE_ERRINTR ), errCode ); else hb_snprintf( buffer, sizeof( buffer ), "Unrecoverable error %d: ", errCode ); hb_conOutErr( buffer, 0 ); if( hLog ) fprintf( hLog, "%s", buffer ); if( ! szText && fLang ) szText = hb_langDGetItem( HB_LANG_ITEM_BASE_ERRINTR + errCode - 9000 ); if( szText ) hb_snprintf( buffer, sizeof( buffer ), szText, szPar1, szPar2 ); else buffer[ 0 ] = '\0'; hb_conOutErr( buffer, 0 ); hb_conOutErr( hb_conNewLine(), 0 ); if( hLog ) fprintf( hLog, "%s\n", buffer ); if( fStack && hb_stackTotalItems() ) { iLevel = 0; while( hb_procinfo( iLevel++, buffer, &uiLine, file ) ) { char msg[ HB_SYMBOL_NAME_LEN + HB_SYMBOL_NAME_LEN + 32 ]; hb_snprintf( msg, sizeof( msg ), "Called from %s(%hu)%s%s\n", buffer, uiLine, *file ? " in " : "", file ); hb_conOutErr( msg, 0 ); if( hLog ) fprintf( hLog, "%s", msg ); } } if( hLog ) { fprintf( hLog, "------------------------------------------------------------------------\n" ); fclose( hLog ); } }
PHB_ITEM hb_libLoad( PHB_ITEM pLibName, PHB_ITEM pArgs ) { void * hDynLib = NULL; if( hb_itemGetCLen( pLibName ) > 0 ) { int argc = pArgs ? ( int ) hb_arrayLen( pArgs ) : 0, i; const char ** argv = NULL; if( argc > 0 ) { argv = ( const char ** ) hb_xgrab( sizeof( char * ) * argc ); for( i = 0; i < argc; ++i ) argv[ i ] = hb_arrayGetCPtr( pArgs, i + 1 ); } if( hb_vmLockModuleSymbols() ) { /* use stack address as first level marker */ hb_vmBeginSymbolGroup( ( void * ) hb_stackId(), HB_TRUE ); #if defined( HB_OS_WIN ) { void * hFileName; hDynLib = ( void * ) LoadLibraryEx( HB_ITEMGETSTR( pLibName, &hFileName, NULL ), NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); hb_strfree( hFileName ); } #elif defined( HB_OS_OS2 ) { HB_UCHAR LoadError[ 256 ] = ""; /* Area for load failure information */ HMODULE hDynModule; if( DosLoadModule( ( PSZ ) LoadError, sizeof( LoadError ), ( PCSZ ) hb_itemGetCPtr( pLibName ), &hDynModule ) == NO_ERROR ) hDynLib = ( void * ) hDynModule; } #elif defined( HB_HAS_DLFCN ) hDynLib = ( void * ) dlopen( hb_itemGetCPtr( pLibName ), RTLD_LAZY | RTLD_GLOBAL ); if( ! hDynLib ) { HB_TRACE( HB_TR_DEBUG, ( "hb_libLoad(): dlopen(): %s", dlerror() ) ); } #elif defined( HB_CAUSEWAY_DLL ) hDynLib = LoadLibrary( hb_itemGetCPtr( pLibName ) ); #else { int iTODO; } #endif /* set real marker */ hb_vmInitSymbolGroup( hDynLib, argc, argv ); hb_vmUnlockModuleSymbols(); } if( argv ) hb_xfree( ( void * ) argv ); } if( hDynLib ) { void ** pLibPtr = ( void ** ) hb_gcAllocate( sizeof( void * ), &s_gcDynlibFuncs ); *pLibPtr = hDynLib; return hb_itemPutPtrGC( NULL, pLibPtr ); } return NULL; }