20000401-18:00 GMT+1 Victor Szakats <info@szelvesz.hu>
This commit is contained in:
@@ -1,3 +1,38 @@
|
||||
20000401-18:00 GMT+1 Victor Szakats <info@szelvesz.hu>
|
||||
|
||||
* 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 <ptucker@sympatico.ca>
|
||||
* source/rdd/dbf1.c
|
||||
* source/rdd/sdf1.c
|
||||
|
||||
@@ -7,8 +7,8 @@ ROOT = ./
|
||||
DIRS=\
|
||||
include \
|
||||
source \
|
||||
utils \
|
||||
utils \
|
||||
tests \
|
||||
# samples \
|
||||
# samples \
|
||||
|
||||
include $(ROOT)config/dir.cf
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" )
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -258,6 +258,7 @@ EXTERNAL EMPTY
|
||||
//symbols from file: rtl\environ.c
|
||||
//
|
||||
EXTERNAL OS
|
||||
EXTERNAL HB_COMPILER
|
||||
EXTERNAL VERSION
|
||||
EXTERNAL GETENV
|
||||
EXTERNAL GETE
|
||||
|
||||
@@ -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
|
||||
#
|
||||
|
||||
@@ -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
|
||||
|
||||
#
|
||||
|
||||
@@ -8,6 +8,7 @@ C_SOURCES=\
|
||||
hbfsapi.c \
|
||||
hbstr.c \
|
||||
hbtrace.c \
|
||||
hbver.c \
|
||||
reserved.c \
|
||||
expropt1.c \
|
||||
expropt2.c \
|
||||
|
||||
423
harbour/source/common/hbver.c
Normal file
423
harbour/source/common/hbver.c
Normal file
@@ -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 <culik@sl.conex.net>
|
||||
* hb_verPlatform() (support for determining the windows version)
|
||||
*
|
||||
* Copyright 1999 Jose Lalin <dezac@corevia.com>
|
||||
* hb_verPlatform() (support for determining many windows flavours)
|
||||
* hb_verCompiler() (support for determining some compiler version/revision)
|
||||
*
|
||||
* Copyright 2000 Victor Szakats <info@szelvesz.hu>
|
||||
* 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 <ctype.h>
|
||||
#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 <dos.h>
|
||||
#if defined(__WATCOMC__)
|
||||
#include <i86.h>
|
||||
#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 <sys/utsname.h>
|
||||
#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;
|
||||
}
|
||||
|
||||
@@ -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 <culik@sl.conex.net>
|
||||
* Support for determining the windows version
|
||||
*
|
||||
* Copyright 1999 Jose Lalin <dezac@corevia.com>
|
||||
* Support for determining many windows flavours
|
||||
* Copyright 2000 Victor Szakats <info@szelvesz.hu>
|
||||
* 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 <ctype.h>
|
||||
|
||||
#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 <dos.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#if defined(HB_OS_UNIX)
|
||||
#include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
#if defined(__WATCOMC__)
|
||||
#include <i86.h>
|
||||
#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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user