From e322d0d408aad65655a14f11c2f0d661f82bf6d5 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 1 Apr 2000 16:05:00 +0000 Subject: [PATCH] 20000401-18:00 GMT+1 Victor Szakats --- harbour/ChangeLog | 35 +++ harbour/Makefile | 4 +- harbour/bin/bld.bat | 2 +- harbour/bin/bld.cmd | 2 +- harbour/bin/bld.sh | 2 +- harbour/contrib/hbclip/hbclip.prg | 3 + harbour/include/hbapi.h | 5 +- harbour/include/hbextern.ch | 1 + harbour/makefile.bc | 9 +- harbour/makefile.vc | 3 +- harbour/source/common/Makefile | 1 + harbour/source/common/hbver.c | 423 +++++++++++++++++++++++++++++ harbour/source/rtl/version.c | 429 +++--------------------------- harbour/source/vm/cmdarg.c | 20 +- harbour/tests/version.prg | 8 +- 15 files changed, 534 insertions(+), 413 deletions(-) create mode 100644 harbour/source/common/hbver.c diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 724bd257c8..bdd016d267 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,38 @@ +20000401-18:00 GMT+1 Victor Szakats + + * source/rtl/version.c + + source/common/hbver.c + * source/common/Makefile + * include/hbapi.h + * include/hbextern.ch + * contrib/hbclip/hbclip.prg + * source/vm/cmdarg.c + * tests/version.prg + * makefile.bc + * makefile.vc + % Cleaned up the include section. + + Added TRACE calls (CVSed previously) + + Separated hb_version() into hb_verCompiler() and hb_verHarbour() + * Renamed hb_os() to hb_verPlatform() + * Renamed variables in hb_verCompiler() + + Moved hb_ver*() functions to common directory. + + HB_COMPILER() function added to return just the compiler info. + + HB_COMPILER() function added to HBCLIP.LIB + + //INFO will now display platform info. + + //BUILD will now display compiler info. + - //INFO will not display compiler info. + * Test program updated. + ; Tested with BCC53, BCC55, BCC31, CYGWIN, MINGW32, MSC8 (compile only), + MSVC, DJGPP on W2KRC2, WNTSP4, W95, W95B, W98, MSDOS62, DOS5, DOS5+Win31 + ; Please test it with WATCOM, Linux/GCC, OS2/GCC, OS2/ICC, + and BCC31/DJGPP under OS/2. + + * Makefile + ! Some spaces comverted to tabs + + * bin/bld.* + ! common -> commo for DJGPP + 20000401-03:20 EST Paul Tucker * source/rdd/dbf1.c * source/rdd/sdf1.c diff --git a/harbour/Makefile b/harbour/Makefile index ec4721ce1b..62ae535c51 100644 --- a/harbour/Makefile +++ b/harbour/Makefile @@ -7,8 +7,8 @@ ROOT = ./ DIRS=\ include \ source \ - utils \ + utils \ tests \ -# samples \ +# samples \ include $(ROOT)config/dir.cf diff --git a/harbour/bin/bld.bat b/harbour/bin/bld.bat index 02d476b2d5..d336a7c4b6 100644 --- a/harbour/bin/bld.bat +++ b/harbour/bin/bld.bat @@ -106,7 +106,7 @@ rem if "%HB_GT_LIB%" == "" set HB_GT_LIB= if "%HB_GT_LIB%" == "" set HB_GT_LIB=gtdos if "%HB_COMPILER%" == "bcc16" bcc -O2 -mh -I..\include -L..\lib %1.c tools.lib debug.lib vm.lib rtl.lib %HB_GT_LIB%.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib common.lib - if "%HB_COMPILER%" == "djgpp" gcc %1.c -o%1.exe -I..\include -L..\lib -ltools -ldebug -lvm -lrtl -l%HB_GT_LIB% -lrdd -lrtl -lvm -lmacro -lpp -ldbfnt -ldbfcd -lcommon + if "%HB_COMPILER%" == "djgpp" gcc %1.c -o%1.exe -I..\include -L..\lib -ltools -ldebug -lvm -lrtl -l%HB_GT_LIB% -lrdd -lrtl -lvm -lmacro -lpp -ldbfnt -ldbfcd -lcommo goto END :A_W32 diff --git a/harbour/bin/bld.cmd b/harbour/bin/bld.cmd index 0d8492c321..b0e82494f2 100644 --- a/harbour/bin/bld.cmd +++ b/harbour/bin/bld.cmd @@ -106,7 +106,7 @@ rem if "%HB_GT_LIB%" == "" set HB_GT_LIB= if "%HB_GT_LIB%" == "" set HB_GT_LIB=gtdos if "%HB_COMPILER%" == "bcc16" bcc -O2 -mh -I..\include -L..\lib %1.c tools.lib debug.lib vm.lib rtl.lib %HB_GT_LIB%.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib common.lib - if "%HB_COMPILER%" == "djgpp" gcc %1.c -o%1.exe -I..\include -L..\lib -ltools -ldebug -lvm -lrtl -l%HB_GT_LIB% -lrdd -lrtl -lvm -lmacro -lpp -ldbfnt -ldbfcd -lcommon + if "%HB_COMPILER%" == "djgpp" gcc %1.c -o%1.exe -I..\include -L..\lib -ltools -ldebug -lvm -lrtl -l%HB_GT_LIB% -lrdd -lrtl -lvm -lmacro -lpp -ldbfnt -ldbfcd -lcommo goto END :A_W32 diff --git a/harbour/bin/bld.sh b/harbour/bin/bld.sh index 2155876827..2278226830 100644 --- a/harbour/bin/bld.sh +++ b/harbour/bin/bld.sh @@ -86,7 +86,7 @@ else if [ "$HB_COMPILER" == "bcc16" ]; then bcc -O2 -mh -I..\include -L..\lib $1.c tools.lib debug.lib vm.lib rtl.lib $HB_GT_LIB.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib common.lib elif [ "$HB_COMPILER" == "djgpp" ]; then - gcc $1.c -o$1.exe -I..\include -L..\lib -ltools -ldebug -lvm -lrtl -l$HB_GT_LIB -lrdd -lrtl -lvm -lmacro -lpp -ldbfnt -ldbfcd -lcommon + gcc $1.c -o$1.exe -I..\include -L..\lib -ltools -ldebug -lvm -lrtl -l$HB_GT_LIB -lrdd -lrtl -lvm -lmacro -lpp -ldbfnt -ldbfcd -lcommo else echo Error: HB_COMPILER value is unsupported. fi diff --git a/harbour/contrib/hbclip/hbclip.prg b/harbour/contrib/hbclip/hbclip.prg index c10ea5ce05..d6b7dfc6fa 100644 --- a/harbour/contrib/hbclip/hbclip.prg +++ b/harbour/contrib/hbclip/hbclip.prg @@ -50,3 +50,6 @@ FUNCTION HB_TRACESTATE( nValue ) FUNCTION HB_TRACELEVEL( nValue ) RETURN 0 +FUNCTION HB_COMPILER() + RETURN iif( "5.3" $ Version(), "Microsoft C 8.0", "Microsoft C 5.1" ) + diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index ffa628c759..dc93f2a789 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -479,8 +479,9 @@ 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 ); +extern char * hb_verPlatform( void ); +extern char * hb_verCompiler( void ); +extern char * hb_verHarbour( void ); #if defined(HB_EXTERN_C) } diff --git a/harbour/include/hbextern.ch b/harbour/include/hbextern.ch index 24d6343b80..ab738bf6a7 100644 --- a/harbour/include/hbextern.ch +++ b/harbour/include/hbextern.ch @@ -258,6 +258,7 @@ EXTERNAL EMPTY //symbols from file: rtl\environ.c // EXTERNAL OS +EXTERNAL HB_COMPILER EXTERNAL VERSION EXTERNAL GETENV EXTERNAL GETE diff --git a/harbour/makefile.bc b/harbour/makefile.bc index aa9dba7057..2a0cf6ab59 100644 --- a/harbour/makefile.bc +++ b/harbour/makefile.bc @@ -390,6 +390,7 @@ COMMON_LIB_OBJS = \ $(OBJ_DIR)\hbfsapi.obj \ $(OBJ_DIR)\hbstr.obj \ $(OBJ_DIR)\hbtrace.obj \ + $(OBJ_DIR)\hbver.obj \ $(OBJ_DIR)\expropt1.obj \ $(OBJ_DIR)\expropt2.obj \ $(OBJ_DIR)\reserved.obj @@ -579,11 +580,11 @@ $(OBJ_DIR)\hbstr.obj : $(COMMON_DIR)\hbstr.c $(CC) $(CLIBFLAGS) -o$@ $** tlib $(COMMON_LIB) -+$@,, -$(OBJ_DIR)\reserved.obj : $(COMMON_DIR)\reserved.c +$(OBJ_DIR)\hbtrace.obj : $(COMMON_DIR)\hbtrace.c $(CC) $(CLIBFLAGS) -o$@ $** tlib $(COMMON_LIB) -+$@,, -$(OBJ_DIR)\hbtrace.obj : $(COMMON_DIR)\hbtrace.c +$(OBJ_DIR)\hbver.obj : $(COMMON_DIR)\hbver.c $(CC) $(CLIBFLAGS) -o$@ $** tlib $(COMMON_LIB) -+$@,, @@ -595,6 +596,10 @@ $(OBJ_DIR)\expropt2.obj : $(COMMON_DIR)\expropt2.c $(CC) $(CLIBFLAGS) -o$@ $** tlib $(COMMON_LIB) -+$@,, +$(OBJ_DIR)\reserved.obj : $(COMMON_DIR)\reserved.c + $(CC) $(CLIBFLAGS) -o$@ $** + tlib $(COMMON_LIB) -+$@,, + # # PP.LIB dependencies # diff --git a/harbour/makefile.vc b/harbour/makefile.vc index 65560f3395..5b966e7ee2 100644 --- a/harbour/makefile.vc +++ b/harbour/makefile.vc @@ -493,9 +493,10 @@ DEBUG_LIB_OBJS = \ COMMON_LIB_OBJS = \ $(OBJ_DIR)\hbfsapi.obj \ $(OBJ_DIR)\hbstr.obj \ + $(OBJ_DIR)\hbtrace.obj \ + $(OBJ_DIR)\hbver.obj \ $(OBJ_DIR)\expropt1.obj \ $(OBJ_DIR)\expropt2.obj \ - $(OBJ_DIR)\hbtrace.obj \ $(OBJ_DIR)\reserved.obj # diff --git a/harbour/source/common/Makefile b/harbour/source/common/Makefile index 83e7a4ac7f..a7facb0847 100644 --- a/harbour/source/common/Makefile +++ b/harbour/source/common/Makefile @@ -8,6 +8,7 @@ C_SOURCES=\ hbfsapi.c \ hbstr.c \ hbtrace.c \ + hbver.c \ reserved.c \ expropt1.c \ expropt2.c \ diff --git a/harbour/source/common/hbver.c b/harbour/source/common/hbver.c new file mode 100644 index 0000000000..879e3b1d2e --- /dev/null +++ b/harbour/source/common/hbver.c @@ -0,0 +1,423 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * Version detection functions + * + * Copyright 1999 {list of individual authors and e-mail addresses} + * www - http://www.harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version, with one exception: + * + * The exception is that if you link the Harbour Runtime Library (HRL) + * and/or the Harbour Virtual Machine (HVM) with other files to produce + * an executable, this does not by itself cause the resulting executable + * to be covered by the GNU General Public License. Your use of that + * executable is in no way restricted on account of linking the HRL + * and/or HVM code into it. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit + * their web site at http://www.gnu.org/). + * + */ + +/* + * The following parts are Copyright of the individual authors. + * www - http://www.harbour-project.org + * + * Copyright 1999 Luiz Rafael Culik + * hb_verPlatform() (support for determining the windows version) + * + * Copyright 1999 Jose Lalin + * hb_verPlatform() (support for determining many windows flavours) + * hb_verCompiler() (support for determining some compiler version/revision) + * + * Copyright 2000 Victor Szakats + * hb_verPlatform() (support for detecting Windows NT on DOS) + * hb_verPlatform() (rearrangment and cleanup) + * + * See doc/license.txt for licensing terms. + * + */ + +/* NOTE: The following #ifdef block for __IBMCPP__ must + be ahead of any and all #include statements! +*/ + +#if defined(__IBMCPP__) + #define INCL_DOSMISC +#endif + +#define HB_OS_WIN_32_USED + +#include "hbapi.h" +#include "hbver.h" + +#if defined(HB_OS_WIN_32) + #include + #if ! defined(VER_PLATFORM_WIN32_WINDOWS) + #define VER_PLATFORM_WIN32_WINDOWS 1 + #endif + #if ! defined(VER_PLATFORM_WIN32_CE) + #define VER_PLATFORM_WIN32_CE 3 + #endif +#endif + +#if defined(HB_OS_DOS) + #include + #if defined(__WATCOMC__) + #include + #endif + + #if defined(__WATCOMC__) && defined(__386__) && !defined(__WINDOWS_386__) + #define INT_86 int386 + #else + #define INT_86 int86 + #endif +#endif + +#if defined(HB_OS_UNIX) + #include +#endif + +/* 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] */ + +/* NOTE: The caller must free the returned buffer. [vszakats] */ + +char * hb_verPlatform( void ) +{ + char * pszPlatform; + + HB_TRACE(HB_TR_DEBUG, ("hb_verPlatform()")); + + /* NOTE: Must be larger than 128, which is the maximum size of + osVer.szCSDVersion (Win32). [vszakats] */ + pszPlatform = ( char * ) hb_xgrab( 256 ); + +#if defined(HB_OS_DOS) + + { + union REGS regs; + + regs.h.ah = 0x30; + INT_86( 0x21, ®s, ®s ); + + sprintf( pszPlatform, "DOS %d.%02d", regs.h.al, regs.h.ah ); + + /* Host OS detection: Windows 2.x, 3.x, 95/98 */ + + { + #if defined(__BORLANDC__) || defined(_MSC_VER) + regs.x.ax = 0x1600; + #else + regs.w.ax = 0x1600; + #endif + INT_86( 0x2F, ®s, ®s ); + + 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 + sprintf( szHost, " (Windows %d.%02d)", regs.h.al, regs.h.ah ); + + strcat( pszPlatform, szHost ); + } + } + + /* Host OS detection: Windows NT/2000 */ + + { + #if defined(__BORLANDC__) || defined(_MSC_VER) + regs.x.ax = 0x3306; + #else + regs.w.ax = 0x3306; + #endif + INT_86( 0x21, ®s, ®s ); + + #if defined(__BORLANDC__) || defined(_MSC_VER) + if( regs.x.bx == 0x3205 ) + #else + if( regs.w.bx == 0x3205 ) + #endif + strcat( pszPlatform, " (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 + sprintf( szHost, " (OS/2 %d.%02d)", regs.h.al / 10, regs.h.ah ); + + strcat( pszPlatform, szHost ); + } + } + } + +#elif defined(HB_OS_OS2) + + { + unsigned long aulQSV[ QSV_MAX ] = { 0 }; + APIRET rc = DosQuerySysInfo( 1L, QSV_MAX, ( void * ) aulQSV, sizeof( ULONG ) * QSV_MAX ); + + if( rc == 0 ) + sprintf( pszPlatform, "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 + sprintf( pszPlatform, "OS/2" ); + } + +#elif defined(HB_OS_WIN_32) + + { + OSVERSIONINFO osVer; + + osVer.dwOSVersionInfoSize = sizeof( osVer ); + + if( GetVersionEx( &osVer ) ) + { + char * pszName = "Windows"; + + switch( osVer.dwPlatformId ) + { + case VER_PLATFORM_WIN32_WINDOWS: + + if( osVer.dwMajorVersion == 4 && osVer.dwMinorVersion < 10 ) + pszName = "Windows 95"; + else if( osVer.dwMajorVersion == 4 && osVer.dwMinorVersion == 10 ) + pszName = "Windows 98"; + + break; + + case VER_PLATFORM_WIN32_NT: + + if( osVer.dwMajorVersion == 5 ) + pszName = "Windows 2000"; + else + pszName = "Windows NT"; + + break; + + case VER_PLATFORM_WIN32s: + pszName = "Windows 32s"; + break; + + case VER_PLATFORM_WIN32_CE: + pszName = "Windows CE"; + break; + } + + sprintf( pszPlatform, "%s %d.%02d.%04d", + pszName, + osVer.dwMajorVersion, + osVer.dwMinorVersion, + LOWORD( osVer.dwBuildNumber ) ); + + /* Add service pack/other info */ + + if( osVer.szCSDVersion ) + { + int i; + + /* Skip the leading spaces (Win95B, Win98) */ + for( i = 0; osVer.szCSDVersion[ i ] != '\0' && isspace( osVer.szCSDVersion[ i ] ); i++ ); + + if( osVer.szCSDVersion[ i ] != '\0' ) + { + strcat( pszPlatform, " " ); + strcat( pszPlatform, osVer.szCSDVersion + i ); + } + } + } + else + sprintf( pszPlatform, "Windows" ); + } + +#elif defined(HB_OS_UNIX) + + { + struct utsname un; + + uname( &un ); + + sprintf( pszPlatform, "%s %s", un.sysname, un.release ); + } + +#elif defined(HB_OS_MAC) + + { + strcpy( pszPlatform, "MacOS compatible" ); + } + +#else + + { + strcpy( pszPlatform, "(unknown)" ); + } + +#endif + + return pszPlatform; +} + +/* NOTE: The caller must free the returned buffer. [vszakats] */ + +char * hb_verCompiler( void ) +{ + char * pszCompiler; + char * pszName; + int iVerMajor; + int iVerMinor; + + HB_TRACE(HB_TR_DEBUG, ("hb_verCompiler()")); + + pszCompiler = ( char * ) hb_xgrab( 80 ); + +#if defined(__IBMC__) || defined(__IBMCPP__) + + #if defined(__IBMC__) + iVerMajor = __IBMC__; + #else + iVerMajor = __IBMCPP__; + #endif + + if( iVerMajor >= 300 ) + pszName = "IBM Visual Age C++"; + else + pszName = "IBM C++"; + + iVerMajor /= 100; + iVerMinor = iVerMajor % 100; + +#elif defined(__BORLANDC__) + + pszName = "Borland C++"; + #if (__BORLANDC__ == 1040) /* Version 3.1 */ + iVerMajor = 3; + iVerMinor = 1; + #elif (__BORLANDC__ >= 1280) /* Version 5.x */ + iVerMajor = __BORLANDC__ >> 8; + iVerMinor = ( __BORLANDC__ & 0xFF ) >> 4; + #else /* Version 4.x */ + iVerMajor = __BORLANDC__ >> 8; + iVerMinor = ( __BORLANDC__ - 1 & 0xFF ) >> 4; + #endif + +#elif defined(__TURBOC__) + + pszName = "Borland Turbo C"; + iVerMajor = __TURBOC__ >> 8; + iVerMinor = __TURBOC__ & 0xFF; + +#elif defined(_MSC_VER) + + pszName = "Microsoft C/C++"; + iVerMajor = _MSC_VER / 100; + iVerMinor = _MSC_VER % 100; + +#elif defined(__MPW__) + + pszName = "MPW C"; + iVerMajor = __MPW__ / 100; + iVerMinor = __MPW__ % 100; + +#elif defined(__WATCOMC__) + + pszName = "Watcom C/C++"; + iVerMajor = __WATCOMC__ / 100; + iVerMinor = __WATCOMC__ % 100; + +#elif defined(__DJGPP__) + + pszName = "Delorie GCC"; + iVerMajor = __GNUC__; + iVerMinor = __GNUC_MINOR__; + +#elif defined(__CYGWIN__) + + pszName = "Cygnus GCC (Cygwin)"; + iVerMajor = __GNUC__; + iVerMinor = __GNUC_MINOR__; + +#elif defined(__MINGW32__) + + pszName = hb_xgrab( 80 ); + sprintf( pszName, "Cygnus GCC (Mingw32 %g)", __MINGW32__ ); + iVerMajor = __GNUC__; + iVerMinor = __GNUC_MINOR__; + +#elif defined(__GNUC__) + + #if defined(__EMX__) + pszName = "GNU C/EMX C"; + #else + pszName = "GNU C"; + #endif + + iVerMajor = __GNUC__; + iVerMinor = __GNUC_MINOR__; + +#else + + pszName = ( char * ) NULL; + iVerMajor = 0; + iVerMinor = 0; + +#endif + + if( pszName ) + sprintf( pszCompiler, "%s %d.%d", pszName, iVerMajor, iVerMinor ); + else + pszCompiler[ 0 ] = '\0'; + +#if defined(__MINGW32__) + hb_xfree( pszName ); +#endif + + return pszCompiler; +} + +/* NOTE: The caller must free the returned buffer. [vszakats] */ + +char * hb_verHarbour( void ) +{ + char * pszVersion; + + HB_TRACE(HB_TR_DEBUG, ("hb_verHarbour()")); + + pszVersion = ( char * ) hb_xgrab( 80 ); + + sprintf( pszVersion, "Harbour %d.%d%s Intl. (Build %d) (%04d.%02d.%02d)", + HB_VER_MAJOR, HB_VER_MINOR, HB_VER_REVISION, HB_VER_BUILD, HB_VER_YEAR, HB_VER_MONTH, HB_VER_DAY ); + + return pszVersion; +} + diff --git a/harbour/source/rtl/version.c b/harbour/source/rtl/version.c index d880b06289..2ff3e2356c 100644 --- a/harbour/source/rtl/version.c +++ b/harbour/source/rtl/version.c @@ -4,7 +4,7 @@ /* * Harbour Project source code: - * OS(), VERSION() functions + * OS(), VERSION(), HB_COMPILER() functions * * Copyright 1999 {list of individual authors and e-mail addresses} * www - http://www.harbour-project.org @@ -37,414 +37,49 @@ * The following parts are Copyright of the individual authors. * www - http://www.harbour-project.org * - * Copyright 1999 Luiz Rafael Culik - * Support for determining the windows version - * - * Copyright 1999 Jose Lalin - * Support for determining many windows flavours + * Copyright 2000 Victor Szakats + * HB_COMPILER() * * See doc/license.txt for licensing terms. * */ -/* NOTE: The following #ifdef block for __IBMCPP__ must - be ahead of any and all #include statements! -*/ - -#if defined(__IBMCPP__) - #define INCL_DOSMISC -#endif - -#define HB_OS_WIN_32_USED - -#include - #include "hbapi.h" -#include "hbapierr.h" -#include "hbver.h" - -#if defined(HB_OS_WIN_32) - #if ! defined(VER_PLATFORM_WIN32_WINDOWS) - #define VER_PLATFORM_WIN32_WINDOWS 1 - #endif - #if ! defined(VER_PLATFORM_WIN32_CE) - #define VER_PLATFORM_WIN32_CE 3 - #endif -#endif - -#if defined(__TURBOC__) || defined(__BORLANDC__) || defined(_MSC_VER) || defined(__DJGPP__) || defined(__MINGW32__) - #include - #include -#endif - -#if defined(HB_OS_UNIX) - #include -#endif - -#if defined(__WATCOMC__) - #include - #if defined(__386__) && !defined(__WINDOWS_386__) - #define INT_86 int386 - #else - #define INT_86 int86 - #endif -#else - #if defined(__EMX__) - #define INT_86 _int86 - #else - #define INT_86 int86 - #endif -#endif - -/* 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 256 - -char * hb_os( void ) -{ - char * pszOS; - - HB_TRACE(HB_TR_DEBUG, ("hb_os(%hu)", uiMode)); - - pszOS = ( char * ) hb_xgrab( HB_OS_BUFFER_LEN ); - -#if defined(HB_OS_DOS) - - { - union REGS regs; - - regs.h.ah = 0x30; - INT_86( 0x21, ®s, ®s ); - - sprintf( pszOS, "DOS %d.%02d", regs.h.al, regs.h.ah ); - - /* Host OS detection: Windows 2.x, 3.x, 95/98 */ - - { - #if defined(__BORLANDC__) || defined(_MSC_VER) - regs.x.ax = 0x1600; - #else - regs.w.ax = 0x1600; - #endif - INT_86( 0x2F, ®s, ®s ); - - 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 - sprintf( szHost, " (Windows %d.%02d)", regs.h.al, regs.h.ah ); - - strcat( pszOS, szHost ); - } - } - - /* Host OS detection: Windows NT/2000 */ - - { - #if defined(__BORLANDC__) || defined(_MSC_VER) - regs.x.ax = 0x3306; - #else - regs.w.ax = 0x3306; - #endif - INT_86( 0x21, ®s, ®s ); - - #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 - sprintf( szHost, " (OS/2 %d.%02d)", regs.h.al / 10, regs.h.ah ); - - strcat( pszOS, szHost ); - } - } - } - -#elif defined(HB_OS_OS2) - - { - 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 - sprintf( pszOS, "OS/2" ); - } - -#elif defined(HB_OS_WIN_32) - - { - OSVERSIONINFO osVer; - - osVer.dwOSVersionInfoSize = sizeof( osVer ); - - if( GetVersionEx( &osVer ) ) - { - char * pszName = "Windows"; - - switch( osVer.dwPlatformId ) - { - case VER_PLATFORM_WIN32_WINDOWS: - - if( osVer.dwMajorVersion == 4 && osVer.dwMinorVersion < 10 ) - pszName = "Windows 95"; - else if( osVer.dwMajorVersion == 4 && osVer.dwMinorVersion == 10 ) - pszName = "Windows 98"; - - break; - - case VER_PLATFORM_WIN32_NT: - - if( osVer.dwMajorVersion == 5 ) - pszName = "Windows 2000"; - else - pszName = "Windows NT"; - - break; - - case VER_PLATFORM_WIN32s: - pszName = "Windows 32s"; - break; - - case VER_PLATFORM_WIN32_CE: - pszName = "Windows CE"; - break; - } - - sprintf( pszOS, "%s %d.%02d.%04d", - pszName, - osVer.dwMajorVersion, - osVer.dwMinorVersion, - LOWORD( osVer.dwBuildNumber ) ); - - /* Add service pack/other info */ - - if( osVer.szCSDVersion ) - { - int i; - - /* Skip the leading spaces (Win95B, Win98) */ - for( i = 0; osVer.szCSDVersion[ i ] != '\0' && isspace( osVer.szCSDVersion[ i ] ); i++ ); - - if( osVer.szCSDVersion[ i ] != '\0' ) - { - strcat( pszOS, " " ); - strcat( pszOS, osVer.szCSDVersion + i ); - } - } - } - else - sprintf( pszOS, "Windows" ); - } - -#elif defined(HB_OS_UNIX) - - { - struct utsname un; - - uname( &un ); - - sprintf( pszOS, "%s %s", un.sysname, un.release ); - } - -#elif defined(HB_OS_MAC) - - { - strcpy( pszOS, "MacOS compatible" ); - } - -#else - - { - strcpy( pszOS, "(unknown)" ); - } - -#endif - - return pszOS; -} - -/* The caller must free the returned buffer. */ - -#define HB_VERSION_BUFFER_LEN 80 - -/* Support for determining some compiler version/revision by Jose Lalin - dezac@corevia.com -*/ - -char * hb_version( USHORT uiMode ) -{ - char * pszVersion; - - HB_TRACE(HB_TR_DEBUG, ("hb_version(%hu)", uiMode)); - - pszVersion = ( char * ) hb_xgrab( HB_VERSION_BUFFER_LEN ); - - sprintf( pszVersion, "Harbour %d.%d%s Intl. (Build %d) (%04d.%02d.%02d)", - HB_VER_MAJOR, HB_VER_MINOR, HB_VER_REVISION, HB_VER_BUILD, HB_VER_YEAR, HB_VER_MONTH, HB_VER_DAY ); - - if( uiMode != 0 ) - { - /* Optionally include the Compiler name and version, if available. */ - char * compiler; - int version; - int revision; - - #if defined(__IBMC__) || defined(__IBMCPP__) - - #if defined(__IBMC__) - version = __IBMC__; - #else - version = __IBMCPP__; - #endif - - if( version >= 300 ) - compiler = "IBM Visual Age C++"; - else - compiler = "IBM C++"; - - version /= 100; - revision = version % 100; - - #elif defined(__BORLANDC__) - - compiler = "Borland C++"; - #if (__BORLANDC__ == 1040) - /* Version 3.1 */ - version = 3; - revision = 1; - #elif (__BORLANDC__ >= 1280) - /* Version 5.x */ - version = __BORLANDC__ >> 8; - revision = ( __BORLANDC__ & 0xFF ) >> 4; - #else - /* Version 4.x */ - version = __BORLANDC__ >> 8; - revision = ( __BORLANDC__ - 1 & 0xFF ) >> 4; - #endif - - #elif defined(__TURBOC__) - - compiler = "Borland Turbo C"; - version = __TURBOC__ >> 8; - revision = __TURBOC__ & 0xFF; - - #elif defined(_MSC_VER) - - compiler = "Microsoft C/C++"; - version = _MSC_VER / 100; - revision = _MSC_VER % 100; - - #elif defined(__MPW__) - - compiler = "MPW C"; - version = __MPW__ / 100; - revision = __MPW__ % 100; - - #elif defined(__WATCOMC__) - - compiler = "Watcom C/C++"; - version = __WATCOMC__ / 100; - revision = __WATCOMC__ % 100; - - #elif defined(__DJGPP__) - - compiler = "Delorie GCC"; - version = __GNUC__; - revision = __GNUC_MINOR__; - - #elif defined(__CYGWIN__) - - compiler = "Cygnus GCC (Cygwin)"; - version = __GNUC__; - revision = __GNUC_MINOR__; - - - #elif defined(__MINGW32__) - - compiler = hb_xgrab( 80 ); - sprintf( compiler, "Cygnus GCC (Mingw32 %g)", __MINGW32__ ); - version = __GNUC__; - revision = __GNUC_MINOR__; - - #elif defined(__GNUC__) - - #if defined(__EMX__) - compiler = "GNU C/EMX C"; - #else - compiler = "GNU C"; - #endif - - version = __GNUC__; - revision = __GNUC_MINOR__; - - #else - - compiler = ( char * ) NULL; - version = 0; - revision = 0; - - #endif - - if( compiler ) - { - strncat( pszVersion, " (", HB_VERSION_BUFFER_LEN ); - strncat( pszVersion, compiler, HB_VERSION_BUFFER_LEN ); - if( version ) - { - char buf[ 40 ]; - sprintf( buf, "(%d.%d)", version, revision ); - strncat( pszVersion, " ", HB_VERSION_BUFFER_LEN ); - strncat( pszVersion, buf, HB_VERSION_BUFFER_LEN ); - } - strncat( pszVersion, ")", HB_VERSION_BUFFER_LEN ); - pszVersion[ HB_VERSION_BUFFER_LEN - 1 ] = '\0'; - } - #if defined(__MINGW32__) - hb_xfree( compiler ); - #endif - } - - return pszVersion; -} HB_FUNC( OS ) { - char * pszString = hb_os(); - hb_retc( pszString ); - hb_xfree( pszString ); + char * pszPlatform = hb_verPlatform(); + hb_retc( pszPlatform ); + hb_xfree( pszPlatform ); } +HB_FUNC( HB_COMPILER ) +{ + char * pszCompiler = hb_verCompiler(); + hb_retc( pszCompiler ); + hb_xfree( pszCompiler ); +} + +/* NOTE: The parameter accepted is a Harbour extension. */ + HB_FUNC( VERSION ) { - char * pszString = hb_version( hb_pcount() > 0 ? 1 : 0 ); - hb_retc( pszString ); - hb_xfree( pszString ); + char * pszVersion = hb_verHarbour(); + + if( hb_pcount() > 0 ) + { + char * pszCompiler = hb_verCompiler(); + + pszVersion = ( char * ) hb_xrealloc( pszVersion, strlen( pszVersion ) + strlen( pszCompiler ) + 3 ); + + strcat( pszVersion, " (" ); + strcat( pszVersion, pszCompiler ); + strcat( pszVersion, ")" ); + + hb_xfree( pszCompiler ); + } + + hb_retc( pszVersion ); + hb_xfree( pszVersion ); } diff --git a/harbour/source/vm/cmdarg.c b/harbour/source/vm/cmdarg.c index 459446ecaf..4f63c75cd0 100644 --- a/harbour/source/vm/cmdarg.c +++ b/harbour/source/vm/cmdarg.c @@ -278,25 +278,39 @@ void hb_cmdargProcessVM( void ) { if( hb_cmdargCheck( "INFO" ) ) { - char * pszVersion = hb_version( 1 ); + char * pszVersion; char buffer[ 128 ]; + pszVersion = hb_verHarbour(); hb_conOutErr( pszVersion, 0 ); hb_conOutErr( hb_conNewLine(), 0 ); + hb_xfree( pszVersion ); + + pszVersion = hb_verPlatform(); + hb_conOutErr( pszVersion, 0 ); + hb_conOutErr( hb_conNewLine(), 0 ); + hb_xfree( pszVersion ); + sprintf( buffer, "DS avail=%luKB OS avail=%luKB EMM avail=%luKB", hb_xquery( HB_MEM_BLOCK ), hb_xquery( HB_MEM_VM ), hb_xquery( HB_MEM_EMS ) ); hb_conOutErr( buffer, 0 ); hb_conOutErr( hb_conNewLine(), 0 ); - - hb_xfree( pszVersion ); } if( hb_cmdargCheck( "BUILD" ) ) { + char * pszCompiler; + hb_conOutErr( "Harbour Compiler Build Info", 0 ); hb_conOutErr( hb_conNewLine(), 0 ); hb_conOutErr( "---------------------------", 0 ); hb_conOutErr( hb_conNewLine(), 0 ); + pszCompiler = hb_verCompiler(); + hb_conOutErr( "Compiler: ", 0 ); + hb_conOutErr( pszCompiler, 0 ); + hb_conOutErr( hb_conNewLine(), 0 ); + hb_xfree( pszCompiler ); + hb_conOutErr( "Strict CA-Clipper compatibility: ", 0 ); #if defined( HARBOUR_STRICT_CLIPPER_COMPATIBILITY ) hb_conOutErr( "Yes", 0 ); diff --git a/harbour/tests/version.prg b/harbour/tests/version.prg index 5e53780b3d..7db8fd450f 100644 --- a/harbour/tests/version.prg +++ b/harbour/tests/version.prg @@ -10,7 +10,9 @@ function Main() - ? VERSION() - ? VERSION(NIL) + outstd( chr( 34 ) + version() + chr( 34 ) + hb_osnewline() ) + outstd( chr( 34 ) + version( NIL ) + chr( 34 ) + hb_osnewline() ) + outstd( chr( 34 ) + hb_compiler() + chr( 34 ) + hb_osnewline() ) + outstd( chr( 34 ) + os() + chr( 34 ) + hb_osnewline() ) -return nil + return nil