git-svn-id: svn://10.65.10.50/branches/R_10_00@20682 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			818 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			818 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* c4code.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| 
 | |
| #ifdef S4TESTING
 | |
| #include <fcntl.h>
 | |
| #include <sys\types.h>
 | |
| #include <sys\stat.h>
 | |
| #endif
 | |
| 
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #ifndef __DLL__
 | |
| #ifndef S4OS2PM
 | |
| extern unsigned _stklen ;
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef _MSC_VER
 | |
| #ifndef __DLL__
 | |
| #include <malloc.h>
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CBPP
 | |
| #ifdef __cplusplus
 | |
| #include "d4data.hpp"
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4TESTING
 | |
| int s4test_handle ;
 | |
| #endif
 | |
| 
 | |
| char f4memo_null_char = '\0' ;
 | |
| char  *expr4buf = 0 ;
 | |
| 
 | |
| #ifdef S4OS2
 | |
| #ifdef S4OS2SEM
 | |
| #include <time.h>
 | |
| 
 | |
| static char sem4mem[20], sem4expr[20] ;
 | |
| static HMTX hmtx4mem, hmtx4expr ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef __DLL__
 | |
| 
 | |
| #ifdef S4PASCAL
 | |
| typedef char far* LPSTR ;
 | |
| typedef unsigned int HANDLE ;
 | |
| typedef unsigned short WORD ;
 | |
| #define PASCAL _pascal
 | |
| #define S4USE_WEP
 | |
| #endif
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| #ifdef _MSC_VER
 | |
| #if  _MSC_VER != 800
 | |
| #define S4USE_WEP
 | |
| #endif
 | |
| #else
 | |
| #define S4USE_WEP
 | |
| #endif
 | |
| HINSTANCE cb5inst = NULL;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4OS2
 | |
| ULONG _dllmain (ULONG termflag, HMODULE modhandle)
 | |
| {
 | |
| #ifdef S4OS2SEM
 | |
|   int i ;
 | |
|   APIRET rc ;
 | |
|   time_t t ;
 | |
| #endif
 | |
| 
 | |
|   if ( termflag == 0 )
 | |
|   {
 | |
|     mem4init() ;
 | |
| #ifdef S4OS2SEM
 | |
|     strcpy( sem4expr, "\\SEM32\\S4A" ) ;
 | |
|     strcpy( sem4mem, "\\SEM32\\S4B" ) ;
 | |
|     for ( i = 0 ; i < 100 ; i++ )
 | |
|     {
 | |
|       u4delay_sec() ;
 | |
|       time( &t ) ;
 | |
|       t %= 10000L ;
 | |
| 
 | |
|       c4ltoa45( t, sem4expr + 10, -4 ) ;
 | |
|       c4ltoa45( t, sem4mem + 10, -4 ) ;
 | |
| 
 | |
|       rc = DosCreateMutexSem( sem4expr, &hmtx4expr, 0, 0 ) ;
 | |
|       if ( rc != 0 )
 | |
|         continue ;
 | |
| 
 | |
|       rc = DosCreateMutexSem( sem4mem, &hmtx4mem, 0, 0 ) ;
 | |
|       if ( rc != 0 )
 | |
|       {
 | |
|         DosCloseMutexSem( hmtx4expr ) ;
 | |
|         continue ;
 | |
|       }
 | |
|       return 1 ;
 | |
|     }
 | |
| #else
 | |
|     return 1 ;
 | |
| #endif
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     mem4reset() ;
 | |
| #ifdef S4OS2SEM
 | |
|     DosCloseMutexSem( hmtx4mem ) ;
 | |
|     DosCloseMutexSem( hmtx4expr ) ;
 | |
| #endif
 | |
|   }
 | |
| 
 | |
|   return 1;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifdef S4PASCAL_DOS
 | |
| int far PASCAL LibMain( HANDLE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine )
 | |
| {
 | |
|   mem4init() ;
 | |
|   return 1 ;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| #ifndef S4PASCAL_DOS
 | |
| #pragma argsused
 | |
| int far PASCAL LibMain( HINSTANCE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine )
 | |
| {
 | |
|   if( !cb5inst )
 | |
|     cb5inst = hInstance;
 | |
| 
 | |
|   mem4init() ;
 | |
|   return 1 ;
 | |
| }
 | |
| 
 | |
| HINSTANCE CALLBACK c4dll_inst( void )
 | |
| {
 | |
|   return cb5inst;
 | |
| }
 | |
| #endif   /* S4PASCAL_DOS */
 | |
| #endif   /* S4WINDOWS */
 | |
| 
 | |
| #ifdef S4USE_WEP
 | |
| #pragma argsused
 | |
| int S4FUNCTION WEP( int nParameter )
 | |
| {
 | |
|   mem4reset() ;
 | |
|   return 1 ;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif  /* __DLL__ */
 | |
| 
 | |
| void S4FUNCTION d4init( CODE4 *c4 )
 | |
| {
 | |
| #ifdef S4OS2SEM
 | |
| #ifdef S4OS2
 | |
| #ifndef __DLL__
 | |
|   time_t t ;
 | |
|   int i ;
 | |
|   APIRET rc ;
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4TESTING
 | |
|   int oflag ;
 | |
| #endif
 | |
| 
 | |
|   if ( c4 == 0 )
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4parm, E4_D4INIT ) ;
 | |
| #else
 | |
|   return ;
 | |
| #endif
 | |
| 
 | |
|   memset( (void *)c4, 0, sizeof( CODE4 ) ) ;
 | |
| 
 | |
|   /* if a DLL, can't check the stack length since this is a separate executable */
 | |
| #ifndef S4WIN32
 | |
| #ifndef S4WINDOWS
 | |
| #ifndef __DLL__
 | |
| #ifdef __TURBOC__
 | |
| #ifndef S4OS2PM
 | |
|   if ( _stklen < 5000U ) /* 5000 seems to be an appropriate minimum */
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4result, E4_RESULT_STC ) ;
 | |
| #else
 | |
|   e4( c4, e4result, E4_RESULT_STC ) ;
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| #ifdef _MSC_VER
 | |
|   if ( stackavail() < 5000U )
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4result, E4_RESULT_STC ) ;
 | |
| #else
 | |
|   e4( c4, e4result, E4_RESULT_STC ) ;
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
|   c4->debug_int = 0x5281 ; /* Some random value for double checking. */
 | |
|   c4->mem_size_block       = 0x400 ;   /* 1024 */
 | |
|   c4->mem_size_sort_pool   = 0xF000 ;  /* 61440 */
 | |
|   c4->mem_size_sort_buffer = 0x1000 ;  /* 4096 */
 | |
|   c4->mem_size_buffer      = 0x4000 ;  /* 16384 */
 | |
|   c4->mem_size_memo        =  0x200 ;  /*   512 */
 | |
|   c4->mem_size_memo_expr   =  0x400 ;  /*  1024 */
 | |
| 
 | |
|   c4->default_unique_error = r4unique_continue ;
 | |
| 
 | |
| #ifndef S4LANGUAGE
 | |
|   u4ncpy( c4->date_format, "MM/DD/YY", sizeof(c4->date_format) ) ;
 | |
| #else
 | |
| #ifdef S4GERMAN
 | |
|   u4ncpy( c4->date_format, "DD.MM.YY", sizeof(c4->date_format) ) ;
 | |
| #endif
 | |
| #ifdef S4FRENCH
 | |
|   u4ncpy( c4->date_format, "MM/DD/YY", sizeof(c4->date_format) ) ;
 | |
| #endif
 | |
| #ifdef S4SWEDISH
 | |
|   u4ncpy( c4->date_format, "YYYY-MM-DD", sizeof(c4->date_format) ) ;
 | |
| #endif
 | |
| #ifdef S4FINNISH
 | |
|   u4ncpy( c4->date_format, "YYYY-MM-DD", sizeof(c4->date_format) ) ;
 | |
| #endif
 | |
| #ifdef S4NORWEGIAN
 | |
|   u4ncpy( c4->date_format, "DD-MM-YYYY", sizeof(c4->date_format) ) ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CLIPPER
 | |
|   c4->numeric_str_len  = 17 ;    /* default length for clipper numeric keys is 10  */
 | |
|   c4->decimals         = 2 ;
 | |
| #endif  /* S4CLIPPER */
 | |
| 
 | |
|   /* Flags initialization */
 | |
|   c4->go_error = c4->open_error = c4->create_error =
 | |
|     c4->tag_name_error = c4->auto_open = c4->field_name_error =
 | |
|       c4->safety = c4->skip_error = c4->expr_error = 1 ;
 | |
|   c4->lock_attempts = -1 ;   /* wait forever */
 | |
| 
 | |
|   c4->mem_start_index = c4->mem_expand_index =
 | |
|     c4->mem_expand_data  = c4->mem_start_data = 5 ;
 | |
|   c4->mem_start_block = c4->mem_expand_block =
 | |
|     c4->mem_start_tag    = c4->mem_expand_tag = 10 ;
 | |
| 
 | |
|   c4->relate_error = 1 ;
 | |
|   c4->do_index_verify = 1 ;
 | |
| 
 | |
| #ifndef S4OPTIMIZE_OFF
 | |
|   c4->do_opt = 1 ;   /* by default do optimization */
 | |
|   c4->optimize = -1 ;   /* by default optimize non-shared files */
 | |
|   c4->optimize_write = -1 ;
 | |
| #ifdef S4OS2
 | |
|   c4->mem_start_max = 0xF0000L ;
 | |
| #else
 | |
| #ifdef S4UNIX
 | |
|   c4->mem_start_max = 0xF0000L ;
 | |
| #else
 | |
| #ifdef S4WINDOWS
 | |
|   c4->mem_start_max = 0xF0000L ;
 | |
| #else
 | |
|   c4->mem_start_max = 0x50000L ;
 | |
| #endif  /* S4WINDOWS */
 | |
| #endif
 | |
| #endif
 | |
| #endif  /* not S4OPTIMIZE_OFF */
 | |
| 
 | |
|   /* set up the semaphores */
 | |
| #ifdef S4OS2SEM
 | |
| #ifdef S4OS2
 | |
| #ifndef __DLL__
 | |
|   /* create new ones */
 | |
|   strcpy( sem4expr, "\\SEM32\\S4A" ) ;
 | |
|   strcpy( sem4mem, "\\SEM32\\S4B" ) ;
 | |
|   for ( i = 0 ; i < 100 ; i++ )
 | |
|   {
 | |
|     u4delay_sec() ;
 | |
|     time( &t ) ;
 | |
|     t %= 10000L ;
 | |
| 
 | |
|     c4ltoa45( t, sem4expr + 10, -4 ) ;
 | |
|     c4ltoa45( t, sem4mem + 10, -4 ) ;
 | |
| 
 | |
|     rc = DosCreateMutexSem( sem4expr, &hmtx4expr, 0, 0 ) ;
 | |
|     if ( rc != 0 )
 | |
|       continue ;
 | |
| 
 | |
|     rc = DosCreateMutexSem( sem4mem, &hmtx4mem, 0, 0 ) ;
 | |
|     if ( rc != 0 )
 | |
|     {
 | |
|       DosCloseMutexSem( hmtx4expr ) ;
 | |
|       continue ;
 | |
|     }
 | |
|     break ;
 | |
|   }
 | |
| #endif
 | |
|   /* make sure created and can open... assign to code_base pointer */
 | |
|   if ( DosOpenMutexSem( sem4expr, &c4->hmtx_expr ) != 0 )
 | |
|     e4( c4, e4info, "OS/2 Semaphore open failed" ) ;
 | |
|   if ( DosOpenMutexSem( sem4mem, &c4->hmtx_mem ) != 0 )
 | |
|     e4( c4, e4info, "OS/2 Semaphore open failed" ) ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4TESTING
 | |
|   oflag = O_APPEND | O_CREAT | O_RDWR | O_TEXT ;
 | |
|   s4test_handle = open("S4TEST.ERR", oflag, S_IWRITE ) ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| /* if do_init is set to 1, d4init() is called on the allocated CODE4 */
 | |
| CODE4 *S4FUNCTION code4alloc( int do_init )
 | |
| {
 | |
|   CODE4 *c4 ;
 | |
| #ifndef S4CBPP
 | |
|   c4 = (CODE4 *)u4alloc( sizeof( CODE4 ) ) ;
 | |
| #else
 | |
| #ifdef __cplusplus
 | |
|   c4 = (CODE4 *)u4alloc( sizeof( Code4 ) ) ;
 | |
| #else
 | |
|   c4 = (CODE4 *)u4alloc( sizeof( CODE4 ) ) ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
|   if ( c4 == 0 )
 | |
|     return 0 ;
 | |
| 
 | |
|   if ( do_init == 1 )
 | |
|     d4init( c4 ) ;
 | |
| 
 | |
|   return c4 ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION d4init_undo( CODE4 *c4 )
 | |
| {
 | |
|   if ( c4 == 0 )
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4parm, E4_D4INIT_UNDO ) ;
 | |
| #else
 | |
|   return -1 ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4OS2
 | |
| #ifdef S4OS2SEM
 | |
|   DosCloseMutexSem( hmtx4mem ) ;
 | |
|   DosCloseMutexSem( hmtx4expr ) ;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifndef S4OPTIMIZE_OFF
 | |
|   d4opt_suspend( c4 ) ;
 | |
| #endif
 | |
|   d4close_all( c4 ) ;
 | |
| 
 | |
|   mem4release( c4->index_memory ) ;
 | |
|   c4->index_memory = 0 ;
 | |
| 
 | |
|   mem4release( c4->bitmap_memory ) ;
 | |
|   c4->bitmap_memory = 0 ;
 | |
| 
 | |
|   mem4release( c4->data_memory ) ;
 | |
|   c4->data_memory = 0 ;
 | |
| 
 | |
|   mem4release( c4->tag_memory ) ;
 | |
|   c4->tag_memory = 0 ;
 | |
| 
 | |
|   mem4release( c4->bitmap_memory ) ;
 | |
|   c4->bitmap_memory = 0 ;
 | |
| 
 | |
|   u4free( c4->expr_work_buf ) ;
 | |
|   c4->expr_work_buf = 0 ;
 | |
|   c4->expr_buf_len = 0 ;
 | |
| 
 | |
|   u4free( c4->field_buffer ) ;
 | |
|   c4->field_buffer = 0 ;
 | |
|   c4->buf_len = 0 ;
 | |
| 
 | |
|   u4free ( c4->stored_key ) ;
 | |
|   c4->stored_key = 0 ;
 | |
|   c4->stored_key_len = 0 ;
 | |
| 
 | |
|   return c4->error_code ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION d4close_all( CODE4 *c4 )
 | |
| {
 | |
|   DATA4 *data_on, *data_next ;
 | |
|   int rc ;
 | |
| 
 | |
| #ifdef S4VBASIC
 | |
|   if ( c4parm_check( c4, 1, E4_D4CLOSE_ALL ) )
 | |
|     return -1 ;
 | |
| #endif  /* S4VBASIC */
 | |
| 
 | |
|   if ( c4 == 0 )
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4parm, E4_D4CLOSE_ALL ) ;
 | |
| #else
 | |
|   return -1 ;
 | |
| #endif
 | |
| 
 | |
|   rc = 0 ;
 | |
| 
 | |
|   for ( data_next = (DATA4 *)l4first( &c4->data_list ) ; ; )
 | |
|   {
 | |
|     data_on = data_next ;
 | |
|     if ( !data_on )
 | |
|       break ;
 | |
|     data_next = (DATA4 *)l4next( &c4->data_list, data_next ) ;
 | |
| 
 | |
|     if ( d4close( data_on ) < 0 )
 | |
|       rc = -1 ;
 | |
|   }
 | |
| 
 | |
|   if ( c4->error_code < 0 )
 | |
|     return -1 ;
 | |
|   return rc ;
 | |
| }
 | |
| 
 | |
| DATA4 *S4FUNCTION d4data( CODE4 *c4, char *alias_name )
 | |
| {
 | |
|   char buf[12] ;
 | |
|   DATA4 *data_on ;
 | |
| #ifdef S4DEBUG
 | |
|   DATA4 *data_result ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4VBASIC
 | |
|   if ( c4parm_check( c4, 1, E4_D4DATA ) )
 | |
|     return 0 ;
 | |
| #endif  /* S4VBASIC */
 | |
| 
 | |
|   if ( c4 == 0 || alias_name == 0 )
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4parm, E4_D4DATA ) ;
 | |
| #else
 | |
|   return 0 ;
 | |
| #endif
 | |
| 
 | |
|   u4ncpy( buf, alias_name, sizeof( buf ) ) ;
 | |
| #ifndef S4UNIX
 | |
|   c4upper( buf ) ;
 | |
| #endif
 | |
| 
 | |
|   data_on = 0 ;
 | |
| #ifdef S4DEBUG
 | |
|   data_result = 0 ;
 | |
| #endif
 | |
| 
 | |
|   for(;;)
 | |
|   {
 | |
|     data_on = (DATA4 *)l4next( &c4->data_list, data_on ) ;
 | |
|     if ( !data_on )
 | |
|       break ;
 | |
| 
 | |
|     if ( strcmp( buf, data_on->alias ) == 0 )
 | |
|     {
 | |
| #ifdef S4DEBUG
 | |
|       if ( data_result != 0 )
 | |
|         e4severe( e4info, E4_INFO_DUP ) ;
 | |
|       data_result = data_on ;
 | |
| #else
 | |
|       return data_on ;
 | |
| #endif  /* S4DEBUG */
 | |
|     }
 | |
|   }
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   return data_result ;
 | |
| #else
 | |
|   return data_on ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| #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_BUILD
 | |
| #define S4OPERATING 0x10
 | |
| #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 S4SAFE
 | |
| #define S4SAFE_VAL 0x20000
 | |
| #else
 | |
| #define S4SAFE_VAL 0
 | |
| #endif
 | |
| 
 | |
| #ifdef S4SINGLE
 | |
| #define S4SINGLE_VAL 0x40000
 | |
| #else
 | |
| #define S4SINGLE_VAL 0
 | |
| #endif
 | |
| 
 | |
| #if S4VERSION != 5104
 | |
| error Your CodeBase source version does not match your header file version.
 | |
| #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 +
 | |
|                  S4SAFE_VAL + S4SINGLE_VAL ) ;
 | |
| }
 | |
| 
 | |
| #ifdef S4VB_DOS
 | |
| 
 | |
| DATA4 *d4data_v( CODE4 *c4, char *alias )
 | |
| {
 | |
|   return d4data( c4, c4str(alias) ) ;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #ifdef S4DLL_BUILD
 | |
| #ifndef S4PASCAL_DOS
 | |
| 
 | |
| /*Structures for CodeControls Functions */
 | |
| 
 | |
| typedef   struct ctrl4code_tag
 | |
| {
 | |
|   LINK4       link;
 | |
|   HINSTANCE   hInst;
 | |
|   CODE4       *code;
 | |
|   int         alloc;
 | |
|   LIST4       form;
 | |
| }CTRL4CODE;
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| int         S4FUNCTION ctrl4addCode(HINSTANCE hInst );                                 //450
 | |
| void        S4FUNCTION ctrl4codeListInit(void);                                        //451
 | |
| void        S4FUNCTION ctrl4freeCtrlNode(CTRL4CODE *node);
 | |
| void        S4FUNCTION ctrl4freeCodeList(void);                                        //452
 | |
| CTRL4CODE * S4FUNCTION ctrl4getCtrlCode(HINSTANCE hInst);                              //453
 | |
| void        S4FUNCTION ctrl4initVBX(CODE4 *code,HINSTANCE hInstance,int initialize);   //454
 | |
| void        S4FUNCTION ctrl4initVBXUndo(CODE4 *code,HINSTANCE hInstance);              //455
 | |
| 
 | |
| /***************************************************************\
 | |
|  *  List Containing CODE4 and hInstance
 | |
|  *  structures for CodeControls
 | |
|  \***************************************************************/
 | |
| 
 | |
| LIST4    ctrl4codeListVBX;
 | |
| 
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| void S4FUNCTION ctrl4codeListInit(void)
 | |
| {
 | |
|   //memset(&ctrl4codeListVBX,0,sizeof(LIST4));
 | |
| }
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| int S4FUNCTION ctrl4addCode(HINSTANCE hInst )
 | |
| {
 | |
|   CTRL4CODE   *node;
 | |
| 
 | |
|   if(!hInst)
 | |
|     return -1;
 | |
| 
 | |
|   node = (CTRL4CODE *) u4alloc(sizeof(CTRL4CODE));
 | |
|   if(node)
 | |
|   {
 | |
|     node->hInst = hInst;
 | |
|     node->alloc = 1;
 | |
|     node->code = NULL;
 | |
|     l4add(&ctrl4codeListVBX,node);
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| void S4FUNCTION ctrl4freeCtrlNode(CTRL4CODE *node)
 | |
| {
 | |
|   if(node)
 | |
|   {
 | |
|     l4remove(&ctrl4codeListVBX,node);
 | |
|     if(node->code)
 | |
|     {
 | |
|       d4init_undo(node->code);
 | |
|       u4free(node->code);
 | |
|     }
 | |
|     u4free(node);
 | |
|   }
 | |
| }
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| void S4FUNCTION ctrl4freeCodeList(void)
 | |
| {
 | |
|   CTRL4CODE   *node;
 | |
| 
 | |
|   for(node = (CTRL4CODE *) l4first(&ctrl4codeListVBX);node != NULL;)
 | |
|   {
 | |
|     l4remove(&ctrl4codeListVBX,node);
 | |
|     if(node->code && node->alloc)
 | |
|     {
 | |
|       d4init_undo(node->code);
 | |
|       u4free(node->code);
 | |
|     }
 | |
|     u4free(node);
 | |
|     node = (CTRL4CODE *) l4next(&ctrl4codeListVBX,node);
 | |
|   }
 | |
| }
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| CTRL4CODE * S4FUNCTION ctrl4getCtrlCode(HINSTANCE hInst)
 | |
| {
 | |
|   CTRL4CODE   *node,*newnode,*returnnode = NULL;
 | |
| 
 | |
|   if(hInst == 0)
 | |
|     return NULL;
 | |
| 
 | |
|   for(node = (CTRL4CODE *) l4first(&ctrl4codeListVBX);node != NULL;)
 | |
|   {
 | |
|     if(node->hInst == hInst)
 | |
|     {
 | |
|       returnnode = node;
 | |
|       node = NULL;
 | |
|     }
 | |
|     else
 | |
|       node = (CTRL4CODE *) l4next(&ctrl4codeListVBX,node);
 | |
|   }
 | |
|   return returnnode;
 | |
| }
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| void S4FUNCTION ctrl4initVBXUndo(CODE4 *code,HINSTANCE hInstance)
 | |
| {
 | |
|   CTRL4CODE   *node;
 | |
| 
 | |
|   node = ctrl4getCtrlCode(hInstance);
 | |
|   if(node)
 | |
|   {
 | |
|     if(code != node->code)
 | |
|       d4init_undo(code);
 | |
| 
 | |
|     d4init_undo(node->code);
 | |
|     if(node->alloc)
 | |
|     {
 | |
|       u4free(node->code);
 | |
|     }
 | |
|     l4remove(&ctrl4codeListVBX,node);
 | |
|     u4free(node);
 | |
|   }
 | |
| }
 | |
| 
 | |
| /***************************************************************\
 | |
|   \***************************************************************/
 | |
| 
 | |
| void S4FUNCTION ctrl4initVBX(CODE4 *code,HINSTANCE hInstance,int initialize)
 | |
| {
 | |
|   CODE4       *oldcode;
 | |
|   CTRL4CODE   *node;
 | |
|   int         dealloc;
 | |
| 
 | |
|   if(code)
 | |
|   {
 | |
|     node = ctrl4getCtrlCode(hInstance);
 | |
|     if(!node)
 | |
|     {
 | |
|       ctrl4addCode(hInstance);
 | |
|       node = ctrl4getCtrlCode(hInstance);
 | |
|       if(node)
 | |
|         node->alloc = 0;
 | |
|     }
 | |
| 
 | |
|     if(node)
 | |
|     {
 | |
|       if(node->code)
 | |
|       {
 | |
|         dealloc = 0;
 | |
|         if(node->alloc)
 | |
|           dealloc = IDYES;
 | |
|         else
 | |
|           dealloc = MessageBox(0,"Warning! Detected two calls to ctrl4init\nwithout intervening call to ctrl4initUndo!\n\nOk to free previously allocated CODE4 memory ?","Multiple CODE4 Detected",MB_YESNO|MB_TASKMODAL|MB_ICONEXCLAMATION);
 | |
| 
 | |
|         if(dealloc == IDYES)
 | |
|         {
 | |
|           oldcode = node->code;
 | |
|           ctrl4initVBXUndo(node->code,hInstance);
 | |
|           u4free(oldcode);
 | |
|           node->code = NULL;
 | |
|         }
 | |
|       }
 | |
|       node->alloc = 0;
 | |
|       node->code = code;
 | |
| 
 | |
|       if(initialize)
 | |
|         d4init(code);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| #endif /* S4PASCAL_DOS */
 | |
| #endif /* S4DLL_BUILD */
 |