which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
536 lines
12 KiB
C
Executable File
536 lines
12 KiB
C
Executable File
/*********************************************************************
|
|
d4switch.c (c)Copyright Sequiter Software Inc., 1990-1993.
|
|
All rights reserved.
|
|
|
|
This example program is a Windows application similar in operation to
|
|
d4exampl.c
|
|
|
|
*********************************************************************/
|
|
|
|
#include "d4all.h"
|
|
|
|
#ifdef __TURBOC__
|
|
extern unsigned _stklen = 10000 ;
|
|
#endif
|
|
|
|
|
|
/*********** Structure Declarations **********************************/
|
|
|
|
typedef struct
|
|
{
|
|
#ifdef S4WINDOWS
|
|
#ifdef S4MEDIUM
|
|
char *ptr ;
|
|
#else
|
|
LPSTR ptr ;
|
|
#endif
|
|
#else
|
|
int n_parms ;
|
|
int i_parm ;
|
|
char **parms ;
|
|
#endif
|
|
} D4PARSE_STR;
|
|
|
|
typedef struct
|
|
{
|
|
HWND hWnd ;
|
|
HANDLE hInst ;
|
|
D4PARSE_STR parse_str ;
|
|
int x,y ;
|
|
|
|
#ifdef S4WINDOWS
|
|
TEXTMETRIC tm ;
|
|
LPMSG lpmsg ;
|
|
MSG msg ; /* Last Message */
|
|
int did_close ;
|
|
int did_quit ;
|
|
HCURSOR hSaveCursor ;
|
|
#endif
|
|
} D4DISPLAY;
|
|
|
|
/*********** Function Prototype and Global Variable Declarations *****/
|
|
|
|
int verify_switches() ;
|
|
void S4FUNCTION d4display_str( char *, int ) ;
|
|
long S4FUNCTION u4switch() ;
|
|
|
|
D4DISPLAY display ;
|
|
|
|
#ifdef S4WINDOWS
|
|
|
|
HCURSOR hHourGlass, hSaveCursor ;
|
|
extern MSG msg ;
|
|
extern TEXTMETRIC tm ;
|
|
|
|
int PASCAL WinMan(HANDLE, HANDLE, LPSTR, int) ;
|
|
BOOL InitApplication(HANDLE) ;
|
|
BOOL InitInstance(HANDLE, int) ;
|
|
long FAR PASCAL _export MainWndProc(HWND, UINT, UINT, LONG) ;
|
|
|
|
void S4FUNCTION d4display_init( HWND ) ;
|
|
void S4FUNCTION d4parsestring_init( D4PARSE_STR *, LPSTR ) ;
|
|
int S4FUNCTION d4display_quit() ;
|
|
|
|
|
|
/*********** Windows initialization functions ************************/
|
|
|
|
BOOL InitApplication(HANDLE hInstance)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
wc.style = NULL;
|
|
wc.lpfnWndProc = MainWndProc;
|
|
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInstance;
|
|
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
|
|
wc.lpszMenuName = "TestMenu";
|
|
wc.lpszClassName = "TestWClass";
|
|
|
|
return (RegisterClass(&wc));
|
|
}
|
|
|
|
|
|
BOOL InitInstance( HANDLE hInstance, int nCmdShow)
|
|
{
|
|
HWND hWnd;
|
|
|
|
hWnd = CreateWindow(
|
|
"TestWClass",
|
|
"Test CodeBase",
|
|
WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
NULL,
|
|
NULL,
|
|
hInstance,
|
|
NULL
|
|
);
|
|
|
|
if (!hWnd)
|
|
return (FALSE);
|
|
|
|
SetTimer( hWnd, hWnd, 1000, NULL ) ;
|
|
|
|
d4display_init( hWnd ) ;
|
|
display.hInst = hInstance ; /* for t4filter.c */
|
|
|
|
ShowWindow(hWnd, nCmdShow);
|
|
UpdateWindow(hWnd);
|
|
return (TRUE);
|
|
}
|
|
|
|
long FAR PASCAL _export MainWndProc( HWND hWnd, UINT message, UINT wParam,
|
|
LONG lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
display.did_close = 1 ;
|
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
|
|
|
default:
|
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
|
}
|
|
return (NULL);
|
|
}
|
|
|
|
/************ display text in Windows functions ***********************/
|
|
|
|
void S4FUNCTION d4parsestring_init( D4PARSE_STR *p_str, LPSTR p )
|
|
{
|
|
memset( p_str, 0, sizeof(D4PARSE_STR) ) ;
|
|
|
|
#ifdef S4MEDIUM
|
|
lstrcpy( pointer, p ) ;
|
|
p_str->ptr = pointer ;
|
|
#else
|
|
p_str->ptr = p ;
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION d4display_init( HWND h )
|
|
{
|
|
HDC hdc ;
|
|
TEXTMETRIC tm ;
|
|
|
|
memset( &display, 0, sizeof(D4DISPLAY) ) ;
|
|
display.hWnd = h ;
|
|
display.lpmsg = &(display.msg) ;
|
|
hdc = GetDC(display.hWnd) ;
|
|
GetTextMetrics( hdc, &tm ) ;
|
|
display.tm = tm ;
|
|
ReleaseDC(display.hWnd,hdc) ;
|
|
display.x = 0 ;
|
|
display.y = 0 ;
|
|
display.did_close = 0 ;
|
|
display.did_quit = 0 ;
|
|
}
|
|
|
|
|
|
int S4FUNCTION d4display_quit( )
|
|
{
|
|
/* If there is a message, the message is processed. */
|
|
/* If the message says quit, then TRUE is returned. */
|
|
if ( display.did_quit ) return 1 ;
|
|
|
|
for (;;)
|
|
{
|
|
if ( ! display.did_close )
|
|
if ( ! PeekMessage( display.lpmsg, display.hWnd, 0, 0, PM_NOREMOVE ) )
|
|
return 0 ;
|
|
|
|
if ( ! GetMessage( display.lpmsg, display.hWnd, 0, 0 ) )
|
|
{
|
|
MessageBox( display.hWnd, "", "Program Completed", MB_OK ) ;
|
|
display.did_quit = 1 ;
|
|
return 1 ;
|
|
}
|
|
|
|
TranslateMessage(display.lpmsg);
|
|
DispatchMessage(display.lpmsg);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void S4FUNCTION d4display_str( char *str, int is_new_line )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
RECT rect ;
|
|
HDC hdc ;
|
|
int len, height, width ;
|
|
DWORD dword ;
|
|
char blank_line[180] ;
|
|
|
|
memset(blank_line, 32, 179) ;
|
|
blank_line[179] = '\0' ;
|
|
|
|
hdc = GetDC(display.hWnd) ;
|
|
len = strlen(str) ;
|
|
|
|
dword = GetTextExtent( hdc, str, len ) ;
|
|
height = HIWORD( dword ) ;
|
|
width = LOWORD( dword ) ;
|
|
|
|
if ( is_new_line )
|
|
{
|
|
display.x = 0 ;
|
|
display.y += height + display.tm.tmExternalLeading ;
|
|
}
|
|
|
|
GetClientRect( display.hWnd, &rect ) ;
|
|
|
|
if ( (display.y+height) > rect.bottom )
|
|
{
|
|
display.y = 0 ;
|
|
InvalidateRect( display.hWnd, &rect, 1 ) ;
|
|
}
|
|
|
|
TextOut( hdc, display.x,display.y, str, len ) ;
|
|
|
|
if ( (display.y+(2*height)) > rect.bottom )
|
|
TextOut( hdc, 0, 0, blank_line, strlen(blank_line) ) ;
|
|
else
|
|
TextOut( hdc, 0, (display.y+height+display.tm.tmExternalLeading), blank_line, strlen(blank_line) ) ;
|
|
|
|
display.x += width ;
|
|
|
|
ReleaseDC(display.hWnd,hdc) ;
|
|
#else
|
|
if ( is_new_line )
|
|
{
|
|
printf( "\n%s", str ) ;
|
|
display.x = 1 ;
|
|
}
|
|
else
|
|
if (display.x == 0)
|
|
{
|
|
printf( "\r%s", str ) ;
|
|
display.x = 1 ;
|
|
}
|
|
else
|
|
{
|
|
printf( "%s", str ) ;
|
|
display.x = 1 ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*********************************************************************/
|
|
|
|
#ifndef S4WINDOWS
|
|
void main()
|
|
{
|
|
#else
|
|
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
if (!hPrevInstance)
|
|
if (!InitApplication(hInstance))
|
|
return (FALSE);
|
|
|
|
if (!InitInstance(hInstance, nCmdShow))
|
|
return (FALSE);
|
|
|
|
d4parsestring_init( &display.parse_str, lpCmdLine ) ;
|
|
#endif
|
|
|
|
if (verify_switches())
|
|
{
|
|
d4display_str( "** ERROR ** Switch Configuration Confliction.", 1 ) ;
|
|
d4display_str( " Your current switches in 'd4all.h' do not match the library.", 1 ) ;
|
|
}
|
|
else
|
|
d4display_str( "\nSwitches Verified Successfully!", 1 ) ;
|
|
|
|
#ifdef S4WINDOWS
|
|
PostQuitMessage(0) ;
|
|
|
|
for (;;)
|
|
{
|
|
if (d4display_quit() )
|
|
return (display.msg.wParam) ;
|
|
}
|
|
#else
|
|
exit(0) ;
|
|
#endif
|
|
}
|
|
|
|
int verify_switches()
|
|
{
|
|
long d4switch ;
|
|
|
|
d4switch = u4switch() ;
|
|
|
|
d4display_str( " ", 1 ) ;
|
|
d4display_str( " ", 1 ) ;
|
|
d4display_str( "Library Conditional Compilation Switches:", 1 ) ;
|
|
if( d4switch & 1 )
|
|
d4display_str( "S4FOX - FoxPro Index File Compatibility", 1 ) ;
|
|
if( d4switch & 2 )
|
|
d4display_str( "S4CLIPPER - Clipper Index File Compatibility", 1 ) ;
|
|
if( d4switch & 4 )
|
|
d4display_str( "S4MDX - dBASE IV Index File Compatibility", 1 ) ;
|
|
if( d4switch & 8 )
|
|
d4display_str( "S4NDX - dBASE III or III PLUS Index File Compatibility", 1 ) ;
|
|
if( d4switch & 0x10 )
|
|
d4display_str( "S4DLL - Microsoft Windows DLL (S4DLL_BUILD on Library Build)", 1 ) ;
|
|
if( d4switch & 0x20 )
|
|
d4display_str( "S4WINDOWS - Microsoft Windows Static with Static Library", 1 ) ;
|
|
if( d4switch & 0x40 )
|
|
d4display_str( "S4OS2 - OS/2", 1 ) ;
|
|
if( d4switch & 0x40 )
|
|
d4display_str( "S4CODE_SCREENS - CodeScreens output Functions", 1 ) ;
|
|
if( d4switch & 0x100 )
|
|
d4display_str( "S4DEBUG - Extensive CodeBase Error Checking", 1 ) ;
|
|
if( d4switch & 0x200 )
|
|
d4display_str( "S4ERROR_HOOK - Custom Error Function", 1 ) ;
|
|
if( d4switch & 0x400 )
|
|
d4display_str( "\nS4LOCK_CHECK - Internal CodeBase Locking Diagnostics", 1 ) ;
|
|
if( d4switch & 0x800 )
|
|
d4display_str( "\nS4LOCK_HOOK - Custom Lock Failure Function", 1 ) ;
|
|
if( d4switch & 0x1000 )
|
|
d4display_str( "\nS4MAX - Maximum Memory Allocation Testing", 1 ) ;
|
|
if( d4switch & 0x2000 )
|
|
d4display_str( "\nS4MEMO_OFF - Memo File support source code removed", 1 ) ;
|
|
if( d4switch & 0x4000 )
|
|
d4display_str( "\nS4OLD_CODE - Support Functions from CodeBase 4.5", 1 ) ;
|
|
if( d4switch & 0x8000 )
|
|
d4display_str( "\nS4OPTIMIZE_OFF - Memory Optimization source code removed", 1 ) ;
|
|
if( d4switch & 0x10000 )
|
|
d4display_str( "\nS4PORTABLE - Maximum Portability", 1 ) ;
|
|
if( d4switch & 0x20000 )
|
|
d4display_str( "\nS4SAFE - Immediate File Length Updates", 1 ) ;
|
|
if( d4switch & 0x40000 )
|
|
d4display_str( "\nS4SINGLE - Multi-user support source code removed", 1 ) ;
|
|
|
|
#ifdef S4OPTIMIZE_OFF
|
|
if( (d4switch & 0x8000) == 0 )
|
|
{
|
|
d4display_str( "***ERROR***: S4OPTIMIZE_OFF must be used in Library Build too.", 1 ) ;
|
|
return 1 ;
|
|
}
|
|
#else
|
|
if( d4switch & 0x8000 )
|
|
{
|
|
d4display_str( "***ERROR***: S4OPTIMIZE_OFF must be off in Library Build too.", 1 ) ;
|
|
return 1 ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4FOX
|
|
if( (d4switch & 1) == 0 )
|
|
{
|
|
d4display_str( "***ERROR***: S4FOX must be used in Library Build too.", 1 ) ;
|
|
return 1 ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4CLIPPER
|
|
if( (d4switch & 2) == 0 )
|
|
{
|
|
d4display_str( "***ERROR***: S4CLIPPER must be used in Library Build too.", 1 ) ;
|
|
return 1 ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4MDX
|
|
if( (d4switch & 4) == 0 )
|
|
{
|
|
d4display_str( "***ERROR***: S4MDX must be used in Library Build too.", 1 ) ;
|
|
return 1 ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4NDX
|
|
if( (d4switch & 8) == 0 )
|
|
{
|
|
d4display_str( "***ERROR***: S4NDX must be used in Library Build too.", 1 ) ;
|
|
return 1 ;
|
|
}
|
|
#endif
|
|
return 0 ;
|
|
}
|
|
|
|
#ifdef S4FOX
|
|
#define S4FORMAT 1
|
|
#endif
|
|
|
|
#ifdef S4CLIPPER
|
|
#ifdef S4FORMAT
|
|
error Choose only one CodeBase index file compatibility option.
|
|
#endif
|
|
#define S4FORMAT 2
|
|
#endif
|
|
|
|
#ifdef S4MDX
|
|
#ifdef S4FORMAT
|
|
error Choose only one CodeBase index file compatibility option.
|
|
#endif
|
|
#define S4FORMAT 4
|
|
#endif
|
|
|
|
#ifdef S4NDX
|
|
#ifdef S4FORMAT
|
|
error Choose only one CodeBase index file compatibility option.
|
|
#endif
|
|
#define S4FORMAT 8
|
|
#endif
|
|
|
|
#ifndef S4FORMAT
|
|
error You must define either S4FOX, S4CLIPPER, S4NDX or S4MDX
|
|
#endif
|
|
|
|
#ifdef S4DLL
|
|
#define S4OPERATING 0x10
|
|
#ifndef S4DLL_BUILD
|
|
error When building a CodeBase DLL, use the S4DLL_BUILD switch.
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4WINDOWS
|
|
#undef S4OPERATING
|
|
#define S4OPERATING 0x20
|
|
#endif
|
|
|
|
#ifdef S4OS2
|
|
#ifdef S4OPERATING
|
|
error Choose one of CodeBase switches S4DLL/S4WINDOWS, S4OS2, and S4CODE_SCREENS
|
|
#endif
|
|
#define S4OPERATING 0x40
|
|
#endif
|
|
|
|
#ifdef S4CODE_SCREENS
|
|
#ifdef S4OPERATING
|
|
error Choose one of CodeBase switches S4DLL/S4WINDOWS, S4OS2, and S4CODE_SCREENS
|
|
#endif
|
|
#define S4OPERATING 0x80
|
|
#endif
|
|
|
|
#ifndef S4OPERATING
|
|
#define S4OPERATING 0
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
#define S4DEBUG_VAL 0x100
|
|
#else
|
|
#define S4DEBUG_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4ERROR_HOOK
|
|
#define S4ERROR_HOOK_VAL 0x200
|
|
#else
|
|
#define S4ERROR_HOOK_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4LOCK_CHECK
|
|
#define S4LOCK_CHECK_VAL 0x400
|
|
#else
|
|
#define S4LOCK_CHECK_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4LOCK_HOOK
|
|
#define S4LOCK_HOOK_VAL 0x800
|
|
#else
|
|
#define S4LOCK_HOOK_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4MAX
|
|
#define S4MAX_VAL 0x1000
|
|
#else
|
|
#define S4MAX_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4MEMO_OFF
|
|
#define S4MEMO_OFF_VAL 0x2000
|
|
#else
|
|
#define S4MEMO_OFF_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4OLD_CODE
|
|
#define S4OLD_CODE_VAL 0x4000
|
|
#else
|
|
#define S4OLD_CODE_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4OPTIMIZE_OFF
|
|
#define S4OPTIMIZE_OFF_VAL 0x8000
|
|
#else
|
|
#define S4OPTIMIZE_OFF_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4PORTABLE
|
|
#define S4PORTABLE_VAL 0x10000
|
|
#else
|
|
#define S4PORTABLE_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4SAFE
|
|
#define S4SAFE_VAL 0x20000
|
|
#else
|
|
#define S4SAFE_VAL 0
|
|
#endif
|
|
|
|
#ifdef S4SINGLE
|
|
#define S4SINGLE_VAL 0x40000
|
|
#else
|
|
#define S4SINGLE_VAL 0
|
|
#endif
|
|
|
|
long S4FUNCTION u4switch()
|
|
{
|
|
return (long) ( S4FORMAT + S4OPERATING + S4DEBUG_VAL + S4ERROR_HOOK_VAL +
|
|
S4LOCK_CHECK_VAL + S4LOCK_HOOK_VAL + S4MAX_VAL +
|
|
S4MEMO_OFF_VAL + S4OLD_CODE_VAL + S4OPTIMIZE_OFF_VAL +
|
|
S4PORTABLE_VAL + S4SAFE_VAL + S4SINGLE_VAL ) ;
|
|
}
|