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
		
			
				
	
	
		
			1202 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1202 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* t4mul.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved. */
 | |
| /* Tests Code Base multi-user. */
 | |
| /* Run program from exactly two workstations. */
 | |
| /* OR run program from exactly one Windows station */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #include "t4test.h"
 | |
| 
 | |
| #ifndef S4INDEX_OFF
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* currently just exclude conio */
 | |
| #else
 | |
| #ifdef S4UNIX
 | |
| #ifdef S4CURSES
 | |
| /*       #include <curses.h>  */
 | |
| #else
 | |
| /*       #include <tinfo.h>   */
 | |
| #endif
 | |
| #else
 | |
| #include <conio.h>
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #define WORK_WIDTH 10
 | |
| 
 | |
| static FIELD4INFO co_fields[] =
 | |
| {
 | |
| { "COMMAND", 'C', WORK_WIDTH,0 },
 | |
| { "PARM", 'C', 8, 0 },
 | |
| { 0,0,0,0 },
 | |
| } ;
 | |
| 
 | |
| static FIELD4INFO wo_fields[] =
 | |
| {
 | |
| { "WORK", 'C', WORK_WIDTH,0 },
 | |
| { 0,0,0,0 },
 | |
| } ;
 | |
| 
 | |
| static TAG4INFO wo_tags_one[] =
 | |
| {
 | |
| { "TAG1", "WORK", 0,0,0 },
 | |
| { "TAG2", "WORK", 0,0,0 },
 | |
| { 0,0,0,0,0 },
 | |
| } ;
 | |
| 
 | |
| static TAG4INFO wo_tags_two[] =
 | |
| {
 | |
| { "TAG3", "WORK", 0,0,0 },
 | |
| { "TAG4", "WORK", 0,0,0 },
 | |
| { 0,0,0,0,0 },
 | |
| } ;
 | |
| 
 | |
| static FIELD4INFO result_fields[] =
 | |
| {
 | |
| { "RESULT", 'C', 8,0 },
 | |
| { 0,0,0,0 },
 | |
| } ;
 | |
| 
 | |
| #ifdef S4LOG
 | |
| static FIELD4INFO  log_fields[] =
 | |
| {
 | |
| { "ID",   'C', 12,0 },
 | |
| { "LOG1", 'C', 20,0 },
 | |
| { "LOG2", 'C', 20,0 },
 | |
| { 0,0,0,0 },
 | |
| } ;
 | |
| #endif
 | |
| 
 | |
| D4DISPLAY  *disp ;
 | |
| CODE4     cb;
 | |
| DATA4     *co_ptr, *wo_ptr, *re_ptr ;
 | |
| DATA4     *log_ptr = 0 ;
 | |
| INDEX4    *w1_ptr, *w2_ptr ;
 | |
| FIELD4    *command_field, *parm, *work, *result, *log_id, *logic1, *logic2 ;
 | |
| char       *log_id_ptr = 0 ;
 | |
| char       seek_str[WORK_WIDTH+1] ;
 | |
| int        rc ;
 | |
| 
 | |
| static int   send_com( char *, char *) ;
 | |
| static int   int_ret( long, int ) ;
 | |
| static void  ch_base_locked( long,int);
 | |
| static int   command_sender(void) ;
 | |
| static int   work_doer(void) ;
 | |
| static void  d_lock(void) ;
 | |
| static void  d_seek(void) ;
 | |
| static void  d_skip(void) ;
 | |
| static void  d_write(void) ;
 | |
| static void  d_append(void) ;
 | |
| static void  d_unlock(void) ;
 | |
| static void  i_lock(void) ;
 | |
| static void  d_append_one(void) ;
 | |
| static int   seek_recs( long ) ;
 | |
| static int   write_recs( long ) ;
 | |
| static int   append_recs( long ) ;
 | |
| static int   skip_recs( long ) ;
 | |
| static int   result_int( int) ;
 | |
| int test_multi( void ) ;
 | |
| static int  test_with_mem_check( void ) ;
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* transfer control */
 | |
| static int t4sleep( long dummy )   
 | |
| {
 | |
|   if ( PeekMessage( &disp->msg, disp->hWnd, 0, 0, PM_NOREMOVE ) )
 | |
|   {
 | |
|     if ( disp->msg.message == 275 )  /* remove the timer messages */
 | |
|     {
 | |
|       if ( !GetMessage( &disp->msg, disp->hWnd, 0, 0 ) )
 | |
|         return 1 ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       if ( !GetMessage( &disp->msg, disp->hWnd, 0, 0 ) )
 | |
|         return 1 ;
 | |
|       TranslateMessage( (LPMSG)&disp->msg ) ;
 | |
|       if( disp->msg.message == WM_DESTROY )
 | |
|         return -1 ;
 | |
|       DispatchMessage( (LPMSG)&disp->msg ) ;
 | |
|     }
 | |
|   }
 | |
|   return 0 ;
 | |
| }
 | |
| #else
 | |
| static int  t4sleep(long) ;
 | |
| #endif
 | |
| 
 | |
| /* Number of Records per Buffer for T4MUL_WO.dbf */
 | |
| #define  REC_PER_BUF  2L
 | |
| 
 | |
| extern void  logger( char *, char * ) ;
 | |
| 
 | |
| int first = 1 ;
 | |
| int in_logger = 0 ;
 | |
| 
 | |
| 
 | |
| void logger( char *p1, char *p2 )
 | |
| {
 | |
|   if ( in_logger || log_ptr == 0 )
 | |
|     return ;
 | |
|   in_logger = 1 ;
 | |
| 
 | |
|   if ( d4lock_file( log_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( first )
 | |
|   {
 | |
|     first = 0 ;
 | |
|     if ( d4zap( log_ptr, 1L, d4reccount( log_ptr ) ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|   }
 | |
| 
 | |
|   if ( d4append_start(log_ptr, 0) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( log_id_ptr == (char *) 0 )
 | |
|     f4assign( log_id, "UNKNOWN" ) ;
 | |
|   else
 | |
|     f4assign( log_id, log_id_ptr ) ;
 | |
| 
 | |
|   f4assign( logic1, p1 ) ;
 | |
|   f4assign( logic2, p2 ) ;
 | |
| 
 | |
|   if ( d4append( log_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( d4flush( log_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
|   if ( d4unlock( log_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
|   in_logger = 0 ;
 | |
| }
 | |
| 
 | |
| #ifdef S4OS2
 | |
| extern unsigned far pascal DOSSLEEP ( unsigned long );
 | |
| 
 | |
| static int  t4sleep( long n_ms )
 | |
| {
 | |
|   DOSSLEEP( (unsigned long) n_ms ) ;
 | |
|   return 0 ;
 | |
| }
 | |
| #else
 | |
| #ifndef S4WINDOWS
 | |
| static int  t4sleep( long n_ms )
 | |
| {
 | |
|   while( n_ms-- > 0 ) ;
 | |
|   return 0 ;
 | |
| }
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| int test_multi()
 | |
| {
 | |
|   int  rc ;
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;     /* don't lock up a Window's application */
 | |
| #endif
 | |
| 
 | |
|   cb.open_error = 0 ;
 | |
| #ifdef N4OTHER
 | |
|   cb.auto_open = 0 ;
 | |
| #endif
 | |
| 
 | |
|   co_ptr = d4open( &cb, "T4MUL_CO" ) ;
 | |
|   if ( co_ptr == 0 )
 | |
|   {
 | |
|     if ( cb.error_code == r4no_open )
 | |
|     {
 | |
|       d4display_str( disp,  "        Creating T4MUL_CO . . .  ", 1 ) ;
 | |
|       co_ptr = d4create( &cb, "T4MUL_CO", co_fields, 0 ) ;
 | |
|       if ( co_ptr == 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|     }
 | |
|     else
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|   }
 | |
| 
 | |
|   command_field = d4field( co_ptr, "COMMAND" ) ;
 | |
|   parm = d4field( co_ptr, "PARM" ) ;
 | |
| 
 | |
|   if ( command_field == 0 || parm == 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   wo_ptr = d4open( &cb, "T4MUL_WO" ) ;
 | |
|   if (wo_ptr == 0 )
 | |
|   {
 | |
|     if ( cb.error_code == r4no_open )
 | |
|     {
 | |
|       d4display_str( disp,  "        Creating T4MUL_WO . . .  ", 1 ) ;
 | |
|       wo_ptr = d4create( &cb, "T4MUL_WO", wo_fields, 0 ) ;
 | |
|       if ( wo_ptr == 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|     }
 | |
|     else
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|   }
 | |
| 
 | |
|   work = d4field( wo_ptr, "WORK" ) ;
 | |
|   if ( work == 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   re_ptr = d4open( &cb, "T4MUL_RE" ) ;
 | |
|   if (re_ptr == 0 )
 | |
|   {
 | |
|     if ( cb.error_code == r4no_open )
 | |
|     {
 | |
|       re_ptr = d4create( &cb, "T4MUL_RE", result_fields, 0 ) ;
 | |
|       if ( re_ptr == 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|       d4display_str( disp,  "        Creating T4MUL_RE . . .  ", 1 ) ;
 | |
|     }
 | |
|     else
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|   }
 | |
| 
 | |
|   result = d4field( re_ptr, "RESULT" ) ;
 | |
|   if ( result == 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
| #ifdef S4LOG
 | |
|   if ( log_ptr = d4open( &cb, "T4MUL_LO" ) == 0 )
 | |
|   {
 | |
|     if ( cb.error_code == r4no_open )
 | |
|     {
 | |
|       d4display_str( disp,  "        Creating T4MUL_LO . . .  ", 1 ) ;
 | |
|       log_ptr = d4create( &cb, "T4MUL_LO", log_fields, 0 ) ;
 | |
|       if ( log_ptr == 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|     }
 | |
|     else
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|   }
 | |
| 
 | |
|   log_id = d4field( log_ptr, "ID" ) ;
 | |
|   logic1 = d4field( log_ptr, "LOG1" ) ;
 | |
|   logic2 = d4field( log_ptr, "LOG2" ) ;
 | |
| 
 | |
|   logger( "First Log", "" ) ;
 | |
| 
 | |
| #endif
 | |
| 
 | |
|   d4display_str( disp,  "        Databases Open.  ", 1 ) ;
 | |
| 
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
|   if ( (rc = d4lock_file( wo_ptr )) < 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = -1 ;
 | |
| #endif
 | |
| 
 | |
|   if ( rc == r4locked )
 | |
|   {
 | |
|     log_id_ptr = "Commander" ;
 | |
|     d4display_str( disp,  "        Commander Session.  ", 1 ) ;
 | |
| 
 | |
|     if ( d4zap( co_ptr, 1L, d4reccount( co_ptr ) ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     for (;;)
 | |
|     {
 | |
|       if ( d4refresh( re_ptr ) != 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|       if ( d4reccount( re_ptr ) == 0L )
 | |
|         break ;
 | |
|       if ( t4sleep( 50 ) < 0 )
 | |
|         return -1 ;
 | |
|     }
 | |
|     for (;;)
 | |
|     {
 | |
|       if ( d4refresh( re_ptr ) != 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|       if ( d4reccount( re_ptr ) > 0L )
 | |
|         break ;
 | |
|       if ( d4refresh( re_ptr ) != 0 )
 | |
|         e4severe( e4result, "t4mul.c" ) ;
 | |
|       if ( d4reccount( co_ptr ) == 0L )
 | |
|         if ( send_com("UNLOCK ALL", "-1" ) )
 | |
|           return 1 ;
 | |
|       if ( t4sleep( 50 ) < 0 )
 | |
|         return -1 ;
 | |
|     }
 | |
|     if ( command_sender() )
 | |
|       return 1 ;
 | |
|     d4display_str( disp,  "        Commander Finished.  ", 1 ) ;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     log_id_ptr = "Worker   " ;
 | |
|     d4display_str( disp,  "        Worker Session.  ", 1 ) ;
 | |
| 
 | |
|     if ( d4zap( wo_ptr, 1L, d4reccount( wo_ptr )) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if ( d4zap( re_ptr, 1L, d4reccount( re_ptr ) ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if (d4zap( co_ptr, 1L, d4reccount( co_ptr ) ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|     cb.safety = 0 ;
 | |
| 
 | |
|     w1_ptr = i4create( wo_ptr, "T4MUL_W1", wo_tags_one ) ;
 | |
|     if ( w1_ptr == 0 )
 | |
|       e4severe( e4result, "t4mul.c: i4create" ) ;
 | |
| 
 | |
|     w2_ptr = i4create( wo_ptr, "T4MUL_W2", wo_tags_two ) ;
 | |
|     if ( w2_ptr == 0 )
 | |
|       e4severe( e4result, "t4mul.c: i4create" ) ;
 | |
| 
 | |
|     cb.safety = 1 ;
 | |
| 
 | |
|     if ( d4unlock( re_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if ( d4unlock( co_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|     if ( work_doer() )
 | |
|       return 1 ;
 | |
|     d4display_str( disp,  "        Worker Finished.  ", 1 ) ;
 | |
|   }
 | |
| 
 | |
|   if ( d4close_all( &cb ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
| #ifdef L4LOCK_CHECK
 | |
|   if ( l4lock_check() != 0 )
 | |
|     e4severe( e4result, "Not everything was unlocked" ) ;
 | |
| #endif
 | |
|   if ( cb.error_code < 0 )
 | |
|     e4severe( e4result, "t4mul.c: cb.error_code" ) ;
 | |
| 
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int send_com( char *com, char *com_parm )
 | |
| {
 | |
|   if ( d4display_quit( disp ) )  return 1 ;
 | |
| 
 | |
|   d4display_str( disp,  "        Sending-  Command: ", 1 ) ;
 | |
|   d4display_str( disp, com, 0 ) ;
 | |
|   d4display_str( disp,  "        Parm: ", 1 ) ;
 | |
|   d4display_str( disp, com_parm, 0 ) ;
 | |
|   d4display_str( disp, "      ", 1 ) ;
 | |
| 
 | |
|   if ( d4lock_file( co_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( d4append_start( co_ptr, 0 ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
|   f4assign( command_field, com ) ;
 | |
|   f4assign( parm, com_parm ) ;
 | |
|   if ( d4append( co_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( d4flush( co_ptr ) != 0 )
 | |
|     e4severe( e4result, (char *) 0 ) ;
 | |
|   if ( d4unlock( co_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int int_ret(  long rec, int val )
 | |
| {
 | |
|   if ( d4display_quit( disp ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   d4display_str( disp, "        Getting Return Record . . . ", 1 ) ;
 | |
|   d4display_num( disp, rec, 0 ) ;
 | |
| 
 | |
|   if ( d4unlock( re_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( d4refresh( re_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
|   while ( d4reccount( re_ptr ) < rec )
 | |
|   {
 | |
|     if ( t4sleep(50) < 0 )
 | |
|       return -1 ;
 | |
|     if ( d4refresh( re_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|   }
 | |
| 
 | |
|   if ( d4go( re_ptr, (long)rec ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
|   if ( f4int( result ) != val )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( d4unlock( re_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   d4display_str( disp, "        Received.", 1 ) ;
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* Check the locks
 | |
| 
 | |
|    Ran on worker data file to determine what locks another station
 | |
|    has put on the worker data file.  This station none on the worker
 | |
|    data file when this routine is called.
 | |
| 
 | |
|    rec_cd -  That Record Should be Locked
 | |
|    -  If zero, no specific record is locked
 | |
|    -  If the entire file should be is locked, this must be zero
 | |
| 
 | |
|    file_cd - Neg one and the whole file should be locked.
 | |
|    - Zero and the reccount byte should be locked.
 | |
|    - One and nothing is locked except perhaps a record.
 | |
|    */
 | |
| static void ch_base_locked(  long rec_cd, int file_cd )
 | |
| {
 | |
|   int  rc ;
 | |
|   d4display_str( disp, "        Checking Database Locks . . .", 1 ) ;
 | |
| 
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
| 
 | |
|   rc = d4lock_file( wo_ptr ) ;
 | |
|   if ( rc < 0 )
 | |
|     e4severe( e4result, "t4mul.c:  d4lock_file" ) ;
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( rc == r4locked )
 | |
|   {
 | |
|     if ( rec_cd == 0  &&  file_cd == 1 )
 | |
|       e4severe( e4result, "t4mul.c:  Lock Error 0" ) ;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     if (rec_cd != 0L  ||  file_cd != 1 )
 | |
|       e4severe( e4result, "t4mul.c:  Lock Error 1" ) ;
 | |
|   }
 | |
| 
 | |
|   if ( (rc = d4lock_append( wo_ptr ) ) < 0 )
 | |
|     e4severe( e4result, "t4mul.c:  d4lock_append" ) ;
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   /* If record count bytes can be locked, 'worker' cannot have
 | |
|      the whole file locked.   In addition, if the record count
 | |
|      bytes cannot be locked, they better not be unlocked. */
 | |
| 
 | |
|   if ( rc == 0 && file_cd <= 0  ||   rc == r4locked && file_cd == 1 )
 | |
|     e4severe( e4result, "t4mul.c:  Lock Error 2" ) ;
 | |
| 
 | |
|   if ( d4reccount( wo_ptr ) > 0L )
 | |
|   {
 | |
|     if ( (rc = d4lock( wo_ptr, 1L)) < 0 )
 | |
|       e4severe( e4result, "t4mul.c:  d4lock" ) ;
 | |
|     if ( d4unlock( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|     /* If record one can be locked, 'worker' cannot have the whole
 | |
|        file locked.  If they cannot be locked, they better not be locked. */
 | |
|     if ( rc == 0 && (file_cd == -1 || rec_cd == 1L) || rc == r4locked && file_cd != -1 && rec_cd != 1L)
 | |
|       e4severe( e4result, "t4mul.c:  Lock Error 3" ) ;
 | |
|   }
 | |
| 
 | |
|   if ( rec_cd > 0L )
 | |
|   {
 | |
|     /* If 'worker' has locked the record, we better not be able to lock it. */
 | |
|     if ( (rc = d4lock( wo_ptr, rec_cd)) < 0 )
 | |
|       e4severe( e4result, "t4mul.c:  d4lock" ) ;
 | |
|     if ( d4unlock( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if ( rc == 0  )
 | |
|       e4severe( e4result, "t4mul: Lock Error 4" ) ;
 | |
|   }
 | |
| 
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = -1 ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| 
 | |
| static int command_sender()
 | |
| {
 | |
|   int  i ;
 | |
|   long count, r ;
 | |
| 
 | |
|   r = 1L ;
 | |
| 
 | |
|   if ( int_ret(r++, 0 ) ) return 1 ;
 | |
|   ch_base_locked(0L, 1) ;
 | |
| 
 | |
|   /* Lock the work database, it will not be unlocked until
 | |
|      the index files have been created. */
 | |
|   d4lock_file( wo_ptr ) ;
 | |
| 
 | |
|   if ( d4opt_suspend( &cb ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
|   w1_ptr = i4open( wo_ptr, "T4MUL_W1" ) ;
 | |
|   w2_ptr = i4open( wo_ptr, "T4MUL_W2" ) ;
 | |
|   if ( w1_ptr == 0 || w2_ptr == 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
|   d4opt_start( &cb ) ;
 | |
| 
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|   /* Lock an array of records */
 | |
|   if ( send_com("LOCK 1,3,8", "0" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(1L, 1 ) ;
 | |
|   ch_base_locked(3L, 1 ) ;
 | |
| 
 | |
|   if ( send_com("LOCK APPEN", "0" ) )
 | |
|     return 1;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 0) ;
 | |
| 
 | |
|   if ( send_com("UNLOCK APP", "0" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 1) ;
 | |
| 
 | |
|   if ( send_com("LOCK FILE", "-1" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, -1) ;
 | |
| 
 | |
|   if ( send_com("UNLOCK FIL", "-1" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked( 0L, 1 ) ;
 | |
| 
 | |
|   if ( send_com("I4LOCK", "" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) ) 
 | |
|     return 1 ;
 | |
| 
 | |
|   /* Check to make sure the index file is locked. */
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
|   if ( i4lock( w1_ptr ) != (int)r4locked  )
 | |
|     e4severe( e4result, "t4mul:  Index Locking" ) ;
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
| 
 | |
|   if ( send_com("UNLOCK ALL", "-1" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 1) ;
 | |
| 
 | |
|   /* Check to make sure the index file is unlocked. */
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
|   if ( i4lock( w1_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul:  Index Locking" ) ;
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|   for ( i=1; i<= 40; i++ )
 | |
|   {
 | |
|     if ( send_com("APPEND ONE", "1" ) )
 | |
|       return 1 ;
 | |
|     if ( int_ret(r++, i ) )
 | |
|       return 1 ;
 | |
| 
 | |
|     if ( d4refresh( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|     count = d4reccount( wo_ptr ) ;
 | |
|     if ( count != (long) i )
 | |
|       e4severe( e4result, "t4mul:  Count" ) ;
 | |
|   }
 | |
| 
 | |
|   if ( send_com("UNLOCK ALL", "0" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 1) ;
 | |
| 
 | |
|   if ( d4check( wo_ptr  ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c " ) ;
 | |
|   if ( d4unlock_data( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c " ) ;
 | |
| 
 | |
|   for ( i=1; i<= 40; i++ )
 | |
|   {
 | |
|     if ( d4go( wo_ptr, (long) i ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|     if ( f4long(work) != (long) i )
 | |
|       e4severe( e4result, "t4mul:  Append Check" ) ;
 | |
|   }
 | |
|   if ( d4zap( wo_ptr, 1L, d4reccount( wo_ptr ) ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|   if ( send_com("D4APPEND", "20" ) )
 | |
|     return 1 ;
 | |
|   append_recs(20L ) ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   if ( d4refresh( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
|   if ( d4reccount( wo_ptr ) != 40 )
 | |
|     e4severe( e4result, "t4mul:  Wrong Count" ) ;
 | |
| 
 | |
|   if ( send_com("LOCK APPEN", "0" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 0) ;
 | |
| 
 | |
|   if ( send_com("D4LOCK", "5" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(5L, 0 ) ;
 | |
| 
 | |
|   if ( send_com("LOCK APPEN", "0" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(5L, 0) ;
 | |
| 
 | |
|   if ( send_com("D4UNLOCK", "0" ) ) /* mean unlock records only */
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 0 ) ;
 | |
| 
 | |
|   if ( send_com("D4LOCK", "2" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(2L, 0 ) ;
 | |
| 
 | |
|   if ( send_com("D4UNLOCK", "1" ) ) /* mean unlock records only */
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 0 ) ;
 | |
| 
 | |
|   if ( send_com("D4LOCK", "5" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(5L, 0 ) ;
 | |
| 
 | |
|   if ( send_com("UNLOCK ALL", "-1" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, 1) ;
 | |
| 
 | |
| 
 | |
|   /* Test Dirty Read. */
 | |
|   if ( send_com("LOCK FILE", "-1" ) )
 | |
|     return 1 ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
|   ch_base_locked(0L, -1) ;
 | |
| 
 | |
|   cb.read_lock = 0 ;
 | |
|   if ( d4go( wo_ptr, 5L ) != 0 )
 | |
|     e4severe( e4result, "t4mul:  Dirty Read" ) ;
 | |
|   cb.read_lock = 1 ;
 | |
|   if ( f4long(work) != 5L )
 | |
|     e4severe( e4result, "t4mul:  Dirty Read 2" ) ;
 | |
| 
 | |
|   /* Test Lock Wait. */
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = 1 ;
 | |
| #endif
 | |
|   if ( d4go( wo_ptr, 5L ) != r4locked )
 | |
|     e4severe( e4result, "t4mul:  Lock Wait" ) ;
 | |
| #ifndef S4WINDOWS
 | |
|   cb.lock_attempts = -1 ;
 | |
| #endif
 | |
|   cb.read_lock = 0 ;
 | |
| 
 | |
|   if ( send_com("D4SKIP", "1" ) )
 | |
|     return 1 ;
 | |
|   skip_recs(-1L ) ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   if ( send_com("D4WRITE", "20" ) )  /* Write Records 1 through 4 many times. */
 | |
|     return 1 ;
 | |
|   write_recs(-20L ) ;       /* Write Records Backwards. */
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   if ( send_com("D4WRITE", "20" ) )  /* Write Records 1 through 4 many times. */
 | |
|     return 1 ;
 | |
|   skip_recs(-1L ) ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   if ( send_com("D4SEEK", "20" ) )
 | |
|     return 1 ;
 | |
|   skip_recs(-1L ) ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   if ( send_com("D4SEEK", "-20" ) )
 | |
|     return 1 ; 
 | |
|   write_recs( 20L ) ;
 | |
|   if ( int_ret(r++, 0 ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   if ( d4check( wo_ptr ) < 0 )
 | |
|     e4severe( e4result, "t4mul:  Check 1" ) ;
 | |
| 
 | |
|   if ( send_com("DONE", "" ) )
 | |
|     return 1 ;
 | |
| 
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int seek_recs( long n )
 | |
| {
 | |
|   long i ;
 | |
|   long on_rec, direc ;
 | |
| 
 | |
|   direc = 1L ;
 | |
|   if ( n < 0 )
 | |
|   {
 | |
|     direc = -1L ;
 | |
|     n = -n ;
 | |
|   }
 | |
| 
 | |
|   d4display_str( disp, "        Seek Number Recs: ", 1 ) ;
 | |
|   d4display_num( disp, n, 0 ) ;
 | |
|   d4display_str( disp, "        Seeking Record:  ", 1 ) ;
 | |
| 
 | |
|   for ( i = on_rec = 1L; i<= n; i++)
 | |
|   {
 | |
|     disp->x = (int) 0 ;
 | |
|     d4display_str( disp, "        Seeking Record:  ", 0 ) ;
 | |
|     d4display_num( disp, on_rec, 0 ) ;
 | |
| 
 | |
|     c4ltoa45( on_rec, seek_str, (int) WORK_WIDTH ) ;
 | |
|     seek_str[WORK_WIDTH] = 0 ;
 | |
|     if ( d4seek( wo_ptr, seek_str) != 0 )
 | |
|       e4severe( e4result, "t4mul.c:  d4seek" ) ;
 | |
| 
 | |
|     if ( d4recno( wo_ptr ) != on_rec )
 | |
|       e4severe( e4result, "t4mul: d4seek_double" ) ;
 | |
| 
 | |
|     on_rec += direc ;
 | |
|     if ( on_rec < 1L )
 | |
|       on_rec = d4reccount( wo_ptr ) ;
 | |
|     if ( on_rec > d4reccount( wo_ptr ))
 | |
|       on_rec = 1L ;
 | |
| 
 | |
|     if ( d4unlock( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|   }
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int  write_recs(  long n )
 | |
| {
 | |
|   long i ;
 | |
|   long on_rec, direc ;
 | |
| 
 | |
|   direc = 1L ;
 | |
|   if ( n < 0 )
 | |
|   {
 | |
|     direc = -1L ;
 | |
|     n = -n ;
 | |
|   }
 | |
|   d4display_str( disp, "        ", 1 ) ;
 | |
| 
 | |
|   for ( on_rec = i=1L; i<= n; on_rec += direc, i++)
 | |
|   {
 | |
|     if ( on_rec < 1L )  on_rec = 20L ;
 | |
|     if ( on_rec > 20L ) on_rec = 1L ;
 | |
| 
 | |
|     disp->x = (int) 0 ;
 | |
|     d4display_str( disp, "        Iteration: ", 0 ) ;
 | |
|     d4display_num( disp, i, 0 ) ;
 | |
|     d4display_str( disp, "    Record: ", 0 ) ;
 | |
|     d4display_num( disp, on_rec, 0 ) ;
 | |
|     d4display_str( disp, "        ", 1 ) ;
 | |
| 
 | |
|     if ( d4go( wo_ptr,  on_rec ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|     f4assign_long( work, on_rec ) ;
 | |
|     if ( d4flush( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, (char *) 0 ) ;
 | |
|     if ( d4unlock( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|   }
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static void  d_append_one()
 | |
| {
 | |
|   d4display_str( disp, "Append One Next", 1 ) ;
 | |
| 
 | |
|   if ( d4refresh( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|   if ( d4append_start( wo_ptr, 0 ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   f4assign_long( work, d4reccount(wo_ptr) + 1L) ;
 | |
|   if ( d4append( wo_ptr ) < 0 )
 | |
|     e4severe( e4result, "t4mul.c " ) ;
 | |
| 
 | |
|   if ( d4flush( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, (char *) 0 ) ;
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|   result_int( (int) d4reccount( wo_ptr ) ) ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int append_recs(  long n )
 | |
| {
 | |
|   long i ;
 | |
| 
 | |
|   d4display_str( disp, "        Appending Total:  ", 1 ) ;
 | |
|   d4display_num( disp, n, 0 ) ;
 | |
|   d4display_str( disp, "        Appending:  ", 1 ) ;
 | |
| 
 | |
|   for ( i=1L; i<= n; i++ )
 | |
|   {
 | |
|     disp->x = (int) 0 ;
 | |
|     d4display_str( disp, "        Appending:  ", 0 ) ;
 | |
|     d4display_num( disp, i, 0 ) ;
 | |
| 
 | |
|     if ( d4append_blank( wo_ptr ) < 0 ) 
 | |
|       e4severe( e4result, "t4mul.c " ) ;
 | |
| 
 | |
|     f4assign_long( work, d4recno(wo_ptr) ) ;
 | |
| 
 | |
|     if ( d4flush( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if ( d4unlock( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|     if ( t4sleep( 50 ) < 0 )
 | |
|       return -1 ;
 | |
|   }
 | |
| 
 | |
|   if ( d4check( wo_ptr  ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c " ) ;
 | |
|   if ( d4unlock_data( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c " ) ;
 | |
| 
 | |
|   if ( d4unlock( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int  skip_recs(  long direc )
 | |
| {
 | |
|   d4display_str( disp, "        Skipping Direction:  ", 1 ) ;
 | |
|   d4display_num( disp, direc, 0 ) ;
 | |
| 
 | |
|   if ( d4refresh( wo_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| #ifdef S4WINDOWS
 | |
|   while ( d4lock_file( wo_ptr ) == r4locked  )   /* until free */
 | |
|     if ( t4sleep(50) < 0 ) return - 1 ;
 | |
| #endif
 | |
| 
 | |
|   if ( direc < 0 )
 | |
|   {
 | |
|     direc = -1L ;
 | |
|     if ( d4bottom( wo_ptr  ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     direc = 1L ;
 | |
|     if ( d4top( wo_ptr  ) != 0 )
 | |
|       e4severe( e4result, "t4mul" ) ;
 | |
|   }
 | |
| 
 | |
|   d4display_str( disp, "        Record On:  ", 1 ) ;
 | |
|   for(;;)
 | |
|   {
 | |
|     disp->x = (int) 0 ;
 | |
|     d4display_str( disp, "        Record On:  ", 0 ) ;
 | |
|     d4display_num( disp, d4recno( wo_ptr ), 0 ) ;
 | |
| 
 | |
|     if ( d4skip( wo_ptr, direc ) < 0 )
 | |
|       if ( !d4bof( wo_ptr )  && !d4eof( wo_ptr )  )
 | |
|         e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|     if ( f4long(work) != d4recno( wo_ptr ) )
 | |
|       if ( ! d4eof( wo_ptr )  )
 | |
|         e4severe( e4result, "t4mul" ) ;
 | |
| 
 | |
|     if ( d4unlock( wo_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|     if ( d4bof( wo_ptr )  || d4eof( wo_ptr )  )
 | |
|     {
 | |
|       if ( d4recno( wo_ptr ) != 1L && d4recno( wo_ptr ) != d4reccount( wo_ptr )+1L )
 | |
|         e4severe( e4result, "t4mul" ) ;
 | |
|       return 0 ;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| static int result_int( int i )
 | |
| {
 | |
|   if ( d4lock_file( re_ptr ) < 0 )
 | |
|     e4severe( e4result, "t4mul.c " ) ;
 | |
| 
 | |
|   if ( d4append_start( re_ptr, 0 ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   f4assign_int( result, i ) ;
 | |
| 
 | |
|   if ( d4append( re_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   if ( d4flush( re_ptr ) != 0 )
 | |
|     e4severe( e4result, (char *) 0 ) ;
 | |
|   if ( d4unlock( re_ptr ) != 0 )
 | |
|     e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|   return i ;
 | |
| }
 | |
| 
 | |
| static void  d_lock()
 | |
| {
 | |
|   result_int( d4lock( wo_ptr, f4long(parm) ) ) ;
 | |
| }
 | |
| 
 | |
| static void d_lock_append()
 | |
| {
 | |
|   result_int( d4lock_append( wo_ptr )  ) ;
 | |
| }
 | |
| 
 | |
| static void d_lock_file()
 | |
| {
 | |
|   result_int( d4lock_file( wo_ptr ) ) ;
 | |
| }
 | |
| 
 | |
| static void d_lock_138()
 | |
| {
 | |
|   long a[3] ;
 | |
|   a[0] = 1L ;
 | |
|   a[1] = 3L ;
 | |
|   a[2] = 8L ;
 | |
|   result_int( d4lock_group( wo_ptr, a, 3) ) ;
 | |
| }
 | |
| 
 | |
| static void  d_unlock()
 | |
| {
 | |
|   result_int( d4unlock_records( wo_ptr ) ) ;
 | |
| }
 | |
| 
 | |
| static void  d_unlock_append()
 | |
| {
 | |
|   result_int( d4unlock_append( wo_ptr )  ) ;
 | |
| }
 | |
| 
 | |
| static void  d_unlock_all()
 | |
| {
 | |
|   result_int( d4unlock( wo_ptr ) ) ;
 | |
| }
 | |
| 
 | |
| static void  d_unlock_file()
 | |
| {
 | |
|   result_int( d4unlock_file( wo_ptr )  ) ;
 | |
| }
 | |
| 
 | |
| static void  d_seek()
 | |
| {
 | |
|   result_int( seek_recs( f4long(parm) )) ;
 | |
| }
 | |
| 
 | |
| static void  d_skip()
 | |
| {
 | |
|   result_int( skip_recs( f4long(parm) )) ;
 | |
| }
 | |
| 
 | |
| static void  d_write()
 | |
| {
 | |
|   result_int( write_recs( f4long(parm) )) ;
 | |
| }
 | |
| 
 | |
| static void  d_append()
 | |
| {
 | |
|   result_int( append_recs( f4long(parm) )) ;
 | |
| }
 | |
| 
 | |
| static void  i_lock()
 | |
| {
 | |
|   result_int( i4lock( w1_ptr )) ;
 | |
| }
 | |
| 
 | |
| typedef struct  list_st
 | |
| {
 | |
|   char work[WORK_WIDTH+1] ;
 | |
|   void  (*f)() ;
 | |
| }  LIST ;
 | |
| 
 | |
| 
 | |
| LIST list[] = 
 | |
| {
 | |
| { "D4LOCK    ", d_lock },
 | |
| { "LOCK APPEN", d_lock_append },
 | |
| { "LOCK FILE ", d_lock_file },
 | |
| { "LOCK 1,3,8", d_lock_138 },
 | |
| { "D4UNLOCK  ", d_unlock },
 | |
| { "UNLOCK ALL", d_unlock_all },
 | |
| { "UNLOCK FIL", d_unlock_file },
 | |
| { "UNLOCK APP", d_unlock_append },
 | |
| { "D4SEEK    ", d_seek },
 | |
| { "D4SKIP    ", d_skip },
 | |
| { "D4WRITE   ", d_write},
 | |
| { "D4APPEND  ", d_append},
 | |
| { "I4LOCK    ", i_lock},
 | |
| { "APPEND ONE", d_append_one},
 | |
| { "", 0 },
 | |
| } ;
 | |
| 
 | |
| 
 | |
| static int work_doer()
 | |
| {
 | |
|   long co_rec ;
 | |
|   int i ;
 | |
| 
 | |
|   d4opt_start( &cb ) ;
 | |
|   d4display_str( disp, "        Received Command: ", 1 ) ;
 | |
| 
 | |
|   for ( co_rec = 1L;;)
 | |
|   {
 | |
|     if ( d4display_quit( disp ) )
 | |
|       return 1 ;
 | |
| 
 | |
|     /* Get a Command */
 | |
|     if ( d4refresh( co_ptr ) != 0 ) 
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if ( d4reccount( co_ptr ) < co_rec )
 | |
|     {
 | |
|       if ( t4sleep( 50 ) < 0 )
 | |
|         return -1 ;
 | |
|       continue ;
 | |
|     }
 | |
| 
 | |
|     if ( d4go( co_ptr, co_rec++ ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
|     if ( d4unlock( co_ptr ) != 0 )
 | |
|       e4severe( e4result, "t4mul.c" ) ;
 | |
| 
 | |
|     disp->x = (int) 0 ;
 | |
|     d4display_str( disp, "        Received Command: ", 0 ) ;
 | |
|     d4display_str( disp, f4str(command_field), 1 ) ;
 | |
|     d4display_str( disp, "    Parameter: ", 0 ) ;
 | |
|     d4display_str( disp, f4str(parm), 1 ) ;
 | |
| 
 | |
|     for ( i=0;; i++ )
 | |
|     {
 | |
|       if ( list[i].work[0] == '\0' )
 | |
|       {
 | |
|         if ( memcmp( f4ptr(command_field), "DONE", 4 ) == 0 )
 | |
|           return 0 ;
 | |
|         e4severe( e4result, "Unrecognized Command" ) ;
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         if ( strcmp( f4str(command_field), list[i].work )  == 0 )
 | |
|         {
 | |
| #ifdef __TURBOC__
 | |
| #pragma warn -pro
 | |
| #endif
 | |
| 
 | |
|           (*list[i].f)() ;
 | |
| 
 | |
| #ifdef __TURBOC__
 | |
| #pragma warn .pro
 | |
| #endif
 | |
| 
 | |
|           break ;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| static int  test_with_mem_check()
 | |
| {
 | |
|   d4init( &cb ) ;
 | |
| 
 | |
|   cb.hWnd = (unsigned) disp->hWnd ;
 | |
| #ifdef S4DLL
 | |
|   cb.hInst = (unsigned) disp->hInst ;
 | |
| #endif
 | |
| 
 | |
|   if ( test_multi() )
 | |
|     return 1 ;
 | |
| 
 | |
|   d4init_undo( &cb ) ;
 | |
|   mem4reset() ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   mem4check_memory() ;
 | |
| 
 | |
| #ifndef S4DLL
 | |
|   if ( mem4free_check(100) != 0 )
 | |
|     e4severe( e4result, "t4mul.c:  Memory items not freed" ) ;
 | |
| #endif
 | |
| #endif
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| int S4FUNCTION t4test( D4DISPLAY *display )
 | |
| {
 | |
| #ifdef S4INDEX_OFF
 | |
|   display->y += 2 ;
 | |
|   d4display_str( display, "T4MUL:   REQUIRES INDEXING (S4INDEX_OFF DEFINED)", 1) ;
 | |
|   d4display_str( display, "", 1) ;
 | |
|   return 1 ;
 | |
| #else
 | |
|   d4display_str( display, "T4MUL Test  ", 1 ) ;
 | |
|   d4display_str( display, " ", 1 ) ;
 | |
| 
 | |
|   if ( test_with_mem_check() )
 | |
|     e4exit( &cb ) ;
 | |
|   display->y += 2 ;
 | |
|   d4display_str( display,"T4MUL:   SUCCESS", 1) ;
 | |
|   d4display_str( display, "", 1) ;
 | |
|   return 1 ;
 | |
| #endif
 | |
| }
 |