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 ) ;
 | |
|                 }
 |