diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 265edd7ae2..63d84cb6e3 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,27 @@ +20000401-04:57 GMT+1 Victor Szakats + + * source/rtl/environ.c + * include/hbapi.h + % Reorganized. Now the motto is that each target platform should first + detect the version of the native platform version, then if applicable + (only in DOS currently) detect the host OS. + This way the source is *far* more clean, and consistent between + platforms and compilers. + + Added WinNT detection for the DOS platform. + * #ifdef mess removed. + + C callable version added (hb_os()) + * Some variables renamed. + ; Tested with BCC55, BCC31, CYGWIN, MINGW32, MSC8 (compile only), + MSVC on W2KRC2, WNTSP4, W95, W95B, W98, MSDOS62 + ; Please test it with DJGPP, WATCOM, Linux/GCC, OS2/GCC, OS2/ICC, + and BCC31 under OS/2. + + * source/rtl/inkey.c + * Comment for W2K corrected. + + * doc/whatsnew.txt + + Added some items for the next release. + 20000331-21:35 EST Paul Tucker * makefile.bc + Added dbgtmenu dbgtwin.c &.prg to the debug library rules. diff --git a/harbour/doc/whatsnew.txt b/harbour/doc/whatsnew.txt index da6f59070a..555f0d0c97 100644 --- a/harbour/doc/whatsnew.txt +++ b/harbour/doc/whatsnew.txt @@ -4,6 +4,22 @@ ---------------------------------------------------------------------- +- Final cleanups on global macro and symbol names. +- DISKSPACE() enhancements +- Microsoft C++ 8.x compiler support +- 10 character symbol support finalized +- VAL() made fully compatible +- Source files split to several smaller files +- GT API selection is now at link time instead of compile time +- Make and build files further cleaned up, enhanced, optimized, synchronized + etc... +- Compiler and platform detection enhanced, some hacks removed, + multiplatform cleanups and fixes. +- Warning levels upped, warnings fixed, code quality raised +- Version numbering standardized +- Multiple source file support in Harbour command line +- HBCLIP and RUNJAVA contribution dirs added + Build 0.32 2000-03-07 - New Borland make files diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index 738dc2535c..ffa628c759 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -479,6 +479,7 @@ extern void hb_macroPushAliasedValue( HB_ITEM_PTR, HB_ITEM_PTR ); extern char * hb_macroGetType( HB_ITEM_PTR ); /* misc */ +extern char * hb_os( void ); extern char * hb_version( USHORT uiMode ); #if defined(HB_EXTERN_C) diff --git a/harbour/source/rtl/environ.c b/harbour/source/rtl/environ.c index 2186cc9a8d..23fd18658b 100644 --- a/harbour/source/rtl/environ.c +++ b/harbour/source/rtl/environ.c @@ -38,10 +38,10 @@ * www - http://www.harbour-project.org * * Copyright 1999 Luiz Rafael Culik - * Support for determining the window version by + * Support for determining the windows version * * Copyright 1999 Jose Lalin - * Support for determining many windows flavours by + * Support for determining many windows flavours * * See doc/license.txt for licensing terms. * @@ -75,7 +75,7 @@ #include #endif -#if defined(__GNUC__) && !defined(__DJGPP__) && ! defined(__MINGW32__) +#if defined(HB_OS_UNIX) #include #endif @@ -94,255 +94,234 @@ #endif #endif -HB_FUNC( OS ) +/* NOTE: OS() function, as a primary goal will detect the version number + of the target platform. As an extra it may also detect the host OS. + The latter is mainly an issue in DOS, where the host OS can be OS/2 + WinNT/2K, Win3x, Win9x, DOSEMU, Desqview, etc. [vszakats] */ + +#define HB_OS_BUFFER_LEN 80 + +char * hb_os( void ) { - char * cformat = "%s %d.%02d%c"; + char * pszOS; -#if defined(__MPW__) -/* TODO: not implemented yet */ - hb_retc( "MacOS" ); -#else - int hb_osmajor = -1, hb_osminor = -1, hb_osletter = -1; - char * hb_os = NULL; - char version[ 128 ]; -#if defined(__IBMCPP__) + HB_TRACE(HB_TR_DEBUG, ("hb_os(%hu)", uiMode)); + + pszOS = ( char * ) hb_xgrab( HB_OS_BUFFER_LEN ); + +#if defined(HB_OS_DOS) - unsigned long aulQSV[ QSV_MAX ] = { 0 }; - APIRET rc = DosQuerySysInfo( 1L, QSV_MAX, ( void * ) aulQSV, sizeof( ULONG ) * QSV_MAX ); - if( ! rc ) { - hb_osmajor = aulQSV[ QSV_VERSION_MAJOR ] / 10; - hb_osminor = aulQSV[ QSV_VERSION_MINOR ]; - hb_osletter = ( aulQSV[ QSV_VERSION_REVISION ] > 0 && aulQSV[ QSV_VERSION_REVISION ] < 26 ) ? '@' + aulQSV[ QSV_VERSION_REVISION ] : 0; - } - hb_os = "OS/2"; + union REGS regs; -#else + regs.h.ah = 0x30; + INT_86( 0x21, ®s, ®s ); -#if defined(__GNUC__) && !defined(__DJGPP__) && !defined(__MINGW32__) + sprintf( pszOS, "DOS %d.%02d", regs.h.al, regs.h.ah ); - struct utsname un; + /* Host OS detection: Windows 2.x, 3.x, 95/98 */ - uname( &un ); - - #if defined(HARBOUR_GCC_OS2) - sprintf( version, "%s %s", un.sysname, un.version ); - #else - sprintf( version, "%s %s", un.sysname, un.release ); - #endif - - hb_os = ""; - hb_osmajor = -2; - -#else - -/* TODO: add MSVC support but MSVC cannot detect any OS except Windows! */ -#if defined(__TURBOC__) || defined(__BORLANDC__) || defined(_MSC_VER) || defined(__MINGW32__) - -#if defined(HB_OS_WIN_32) - - OSVERSIONINFO osVer; /* for GetVersionEx() */ - char szBuild[ 128 ] = ""; - - cformat = "%s%s %d.%02d.%04d"; - osVer.dwOSVersionInfoSize = sizeof( osVer ); - - if( GetVersionEx( &osVer ) ) - { - switch( osVer.dwPlatformId ) { - case VER_PLATFORM_WIN32_WINDOWS: - hb_osmajor = osVer.dwMajorVersion; - hb_osminor = osVer.dwMinorVersion; - hb_osletter = LOWORD( osVer.dwBuildNumber ); + #if defined(__BORLANDC__) || defined(_MSC_VER) + regs.x.ax = 0x1600; + #else + regs.w.ax = 0x1600; + #endif + INT_86( 0x2F, ®s, ®s ); - if( hb_osmajor == 4 && hb_osminor == 0 && hb_osletter == 950 ) - hb_os = "Windows 95"; - else if( hb_osmajor == 4 && hb_osminor > 0 && - hb_osletter > 950 && hb_osletter <= 1080 ) - hb_os = "Windows 95 SP1"; - else if( hb_osmajor == 4 && hb_osminor < 10 && - hb_osletter > 1080 ) - hb_os = "Windows 95 OSR2"; /* Formerly: "Windows 95 SP2" */ - else if( hb_osmajor == 4 && hb_osminor == 10 && - hb_osletter == 1998 ) - hb_os = "Windows 98"; - else if( hb_osmajor == 4 && hb_osminor == 10 && - hb_osletter > 1998 && hb_osletter < 2183 ) - hb_os = "Windows 98 SP1"; - else if( hb_osmajor > 4 && hb_osletter >= 2183 ) - hb_os = "Windows 98 SE"; + if( regs.h.al != 0x00 && regs.h.al != 0x80 ) + { + char szHost[ 128 ] = ""; + + if( regs.h.al == 0x01 || regs.h.al == 0xFF ) + sprintf( szHost, " (Windows 2.x)" ); else - hb_os = "Windows"; + sprintf( szHost, " (Windows %d.%02d)", regs.h.al, regs.h.ah ); - strncpy( szBuild, osVer.szCSDVersion, sizeof( szBuild ) ); - szBuild[ sizeof( szBuild ) - 1 ] = '\0'; + strcat( pszOS, szHost ); + } + } - break; + /* Host OS detection: Windows NT/2000 */ - case VER_PLATFORM_WIN32_NT: - hb_osmajor = osVer.dwMajorVersion; - hb_osminor = osVer.dwMinorVersion; - hb_osletter = LOWORD( osVer.dwBuildNumber ); + { + #if defined(__BORLANDC__) || defined(_MSC_VER) + regs.x.ax = 0x3306; + #else + regs.w.ax = 0x3306; + #endif + INT_86( 0x21, ®s, ®s ); - if( hb_osmajor == 3 && hb_osminor == 10 ) - hb_os = "Windows NT 3.1"; - else if( hb_osmajor == 3 && hb_osminor == 50 ) - hb_os = "Windows NT 3.5"; - else if( hb_osmajor == 3 && hb_osminor == 51 ) - hb_os = "Windows NT 3.51"; - else if( hb_osmajor == 4 ) - hb_os = "Windows NT 4"; - else if( hb_osmajor == 5 ) - hb_os = "Windows 2000"; + #if defined(__BORLANDC__) || defined(_MSC_VER) + if( regs.x.bx == 0x3205 ) + #else + if( regs.w.bx == 0x3205 ) + #endif + strcat( pszOS, " (Windows NT/2000)" ); + } + + /* Host OS detection: OS/2 */ + + { + regs.h.ah = 0x30; + INT_86( 0x21, ®s, ®s ); + + if( regs.h.al >= 10 ) + { + char szHost[ 128 ] = ""; + + if( regs.h.al == 20 && regs.h.ah > 20 ) + sprintf( szHost, " (OS/2 %d.%02d)", regs.h.ah / 10, regs.h.ah % 10 ); else - hb_os = "Windows NT"; + sprintf( szHost, " (OS/2 %d.%02d)", regs.h.al / 10, regs.h.ah ); - if( osVer.szCSDVersion ) - { - int i = 0; - WORD wServicePack; - - while( osVer.szCSDVersion[ i ] != '\0' && ( osVer.szCSDVersion[ i ] < '0' || osVer.szCSDVersion[ i ] > '9' ) ) - i++; - wServicePack = ( WORD )( atoi( &osVer.szCSDVersion[ i ] ) ); - - if( wServicePack ) - sprintf( szBuild, " SP%i", wServicePack ); - } - - /* TODO: Add support for: - * NT Stand Alone Server - * NT Enterprise Edition - * NT Terminal Server - * NT Primary Domain Controller - * NT Backup Domain Controller - - It can be done with: - RegOpenKey( "System\CurrentControlSet\Control\ProductOptions", ... ) - RegQueryValueEx( "ProductType", ..., szBuffer ) - */ - break; - - case VER_PLATFORM_WIN32s: - hb_osmajor = osVer.dwMajorVersion; - hb_osminor = osVer.dwMinorVersion; - hb_osletter = LOWORD( osVer.dwBuildNumber ); - hb_os = "Windows 32s"; - break; - - case VER_PLATFORM_WIN32_CE: - hb_osmajor = osVer.dwMajorVersion; - hb_osminor = osVer.dwMinorVersion; - hb_osletter = LOWORD( osVer.dwBuildNumber ); - hb_os = "Windows CE"; - break; + strcat( pszOS, szHost ); + } } } -#else -#if defined(_MSC_VER) - if( _osmode == _WIN_MODE ) - { - hb_os = "Windows"; - hb_osmajor = _osmajor; - hb_osminor = _osminor; - hb_osletter = 0; - } -#else - /* detect Windows */ - _AX = 0x160A; - geninterrupt( 0x2F ); - if( _AX == 0 ) - { - hb_osmajor = _BX / 256; - hb_osminor = _BX % 256; - hb_osletter = 0; - hb_os = "Windows"; - } -#endif /* _MSC_VER */ - else - { - hb_os = "DOS"; - hb_osmajor = _osmajor; - hb_osminor = _osminor; - hb_osletter = 0; - } -#endif /* defined(_WINDOWS_) */ +#elif defined(HB_OS_OS2) -#else - - union REGS regs; - - /* detect OS/2 */ - regs.h.ah = 0x30; - - INT_86( 0x21, ®s, ®s ); - - if( regs.h.al >= 10 ) { - hb_os = "OS/2"; - if( regs.h.al == 20 && regs.h.ah > 20 ) - { - hb_osmajor = regs.h.ah / 10; - hb_osminor = regs.h.ah % 10; - } + unsigned long aulQSV[ QSV_MAX ] = { 0 }; + APIRET rc = DosQuerySysInfo( 1L, QSV_MAX, ( void * ) aulQSV, sizeof( ULONG ) * QSV_MAX ); + + if( rc == 0 ) + sprintf( pszOS, "OS/2 %d.%02d%c", + aulQSV[ QSV_VERSION_MAJOR ] / 10, + aulQSV[ QSV_VERSION_MINOR ], + ( aulQSV[ QSV_VERSION_REVISION ] > 0 && aulQSV[ QSV_VERSION_REVISION ] < 26 ) ? '@' + aulQSV[ QSV_VERSION_REVISION ] : 0 ); else - { - hb_osmajor = regs.h.al / 10; - hb_osminor = regs.h.ah; - } - hb_osletter = 0; + sprintf( pszOS, "OS/2" ); } - else + +#elif defined(HB_OS_WIN_32) + { - hb_osmajor = _osmajor; - hb_osminor = _osminor; - regs.w.ax = 0x160A; + OSVERSIONINFO osVer; - INT_86( 0x2F, ®s, ®s ); + char * pszName; + char szBuild[ 128 ] = ""; + int iVerMajor; + int iVerMinor; + int iVerLetter; - if( regs.w.ax == 0 ) + osVer.dwOSVersionInfoSize = sizeof( osVer ); + + if( GetVersionEx( &osVer ) ) { - hb_os = "Windows"; - hb_osmajor = regs.w.bx / 256; - hb_osminor = regs.w.bx % 256; - hb_osletter = 0; + iVerMajor = osVer.dwMajorVersion; + iVerMinor = osVer.dwMinorVersion; + iVerLetter = LOWORD( osVer.dwBuildNumber ); + + switch( osVer.dwPlatformId ) + { + case VER_PLATFORM_WIN32_WINDOWS: + + if( iVerMajor == 4 && iVerMinor == 0 && iVerLetter == 950 ) + pszName = "Windows 95"; + else if( iVerMajor == 4 && iVerMinor > 0 && + iVerLetter > 950 && iVerLetter <= 1080 ) + pszName = "Windows 95 SP1"; + else if( iVerMajor == 4 && iVerMinor < 10 && + iVerLetter > 1080 ) + pszName = "Windows 95 OSR2"; /* Formerly: "Windows 95 SP2" */ + else if( iVerMajor == 4 && iVerMinor == 10 && + iVerLetter == 1998 ) + pszName = "Windows 98"; + else if( iVerMajor == 4 && iVerMinor == 10 && + iVerLetter > 1998 && iVerLetter < 2183 ) + pszName = "Windows 98 SP1"; + else if( iVerMajor > 4 && iVerLetter >= 2183 ) + pszName = "Windows 98 SE"; + else + pszName = "Windows"; + + strncpy( szBuild, osVer.szCSDVersion, sizeof( szBuild ) ); + szBuild[ sizeof( szBuild ) - 1 ] = '\0'; + + break; + + case VER_PLATFORM_WIN32_NT: + + if( iVerMajor == 3 && iVerMinor == 10 ) + pszName = "Windows NT 3.1"; + else if( iVerMajor == 3 && iVerMinor == 50 ) + pszName = "Windows NT 3.5"; + else if( iVerMajor == 3 && iVerMinor == 51 ) + pszName = "Windows NT 3.51"; + else if( iVerMajor == 4 ) + pszName = "Windows NT 4"; + else if( iVerMajor == 5 ) + pszName = "Windows 2000"; + else + pszName = "Windows NT"; + + if( osVer.szCSDVersion ) + { + int i = 0; + int iServicePack; + + while( osVer.szCSDVersion[ i ] != '\0' && ( osVer.szCSDVersion[ i ] < '0' || osVer.szCSDVersion[ i ] > '9' ) ) + i++; + + iServicePack = atoi( &osVer.szCSDVersion[ i ] ); + + if( iServicePack ) + sprintf( szBuild, " SP%i", iServicePack ); + } + + break; + + case VER_PLATFORM_WIN32s: + pszName = "Windows 32s"; + break; + + case VER_PLATFORM_WIN32_CE: + pszName = "Windows CE"; + break; + + default: + pszName = "Windows"; + break; + } } else { - hb_os = "DOS"; - hb_osletter = 0; + iVerMajor = osVer.dwMajorVersion; + iVerMinor = osVer.dwMinorVersion; + iVerLetter = LOWORD( osVer.dwBuildNumber ); + pszName = "Windows"; } + + sprintf( pszOS, "%s%s %d.%02d.%04d", pszName, szBuild, iVerMajor, iVerMinor, iVerLetter ); } -#endif /* __TURBOC__ or __BORLANDC__ or _MSC_VER 0r __DJGPP__ */ -#if defined(__DJGPP__) - hb_os = hb_xgrab( strlen( _os_flavor ) + 1 ); - strcpy( hb_os, _os_flavor ); - hb_osmajor = _osmajor; - hb_osminor = _osminor; - hb_osletter = 0; -#endif - /* TODO: detect other OSes */ +#elif defined(HB_OS_UNIX) -#endif /* __GNUC__ */ -#endif /* __IBMCPP__ */ + { + struct utsname un; + + uname( &un ); + + sprintf( pszOS, "%s %s", un.sysname, un.release ); + } + +#elif defined(HB_OS_MAC) + + { + strcpy( pszOS, "MacOS compatible" ); + } - if( ! hb_os ) strcpy( version, "Unknown" ); - else if( hb_osmajor == -1 ) strcpy( version, hb_os ); - else if( hb_osmajor == -2 ) { /* NOP */ } -#if defined(_WINDOWS_) || defined(__MINGW32__) - else sprintf( version, cformat, hb_os, szBuild, hb_osmajor, hb_osminor, hb_osletter ); #else - else sprintf( version, cformat, hb_os, hb_osmajor, hb_osminor, hb_osletter ); -#endif - hb_retc( version ); -#if defined(__DJGPP__) - hb_xfree( hb_os ); + + { + strcpy( pszOS, "(unknown)" ); + } + #endif -#endif /* __MPW__ */ + return pszOS; } /* The caller must free the returned buffer. */ @@ -357,7 +336,7 @@ char * hb_version( USHORT uiMode ) { char * pszVersion; -/* HB_TRACE(("hb_version(%hu)", uiMode)); */ + HB_TRACE(HB_TR_DEBUG, ("hb_version(%hu)", uiMode)); pszVersion = ( char * ) hb_xgrab( HB_VERSION_BUFFER_LEN ); @@ -489,10 +468,17 @@ char * hb_version( USHORT uiMode ) return pszVersion; } -HB_FUNC( VERSION ) +HB_FUNC( OS ) { - char * pszVersion = hb_version( hb_pcount() > 0 ? 1 : 0 ); - hb_retc( pszVersion ); - hb_xfree( pszVersion ); + char * pszString = hb_os(); + hb_retc( pszString ); + hb_xfree( pszString ); +} + +HB_FUNC( VERSION ) +{ + char * pszString = hb_version( hb_pcount() > 0 ? 1 : 0 ); + hb_retc( pszString ); + hb_xfree( pszString ); } diff --git a/harbour/source/rtl/inkey.c b/harbour/source/rtl/inkey.c index 13f039edcf..20f1fdb765 100644 --- a/harbour/source/rtl/inkey.c +++ b/harbour/source/rtl/inkey.c @@ -153,7 +153,7 @@ void hb_releaseCPU( void ) #elif defined(HB_OS_OS2) DosSleep( 25 ); /* Duration is in milliseconds */ #elif defined(HB_OS_DOS) -/* NOTE: there is a bug under NT 4 (2000 unknown) - if the app is running +/* NOTE: there is a bug under NT 4 and 2000 - if the app is running in protected mode, time slices will _not_ be released - you must switch to real mode first, execute the following, and switch back.