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
562 lines
12 KiB
C
Executable File
562 lines
12 KiB
C
Executable File
/* t4test.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved. */
|
|
|
|
#ifdef S4OS2PM
|
|
#define INCL_WINSYS
|
|
#define INCL_WINWINDOWMGR
|
|
#define INCL_DOSPROCESS
|
|
#define INCL_GPIPRIMITIVES
|
|
#define INCL_GPILCIDS
|
|
#endif
|
|
|
|
#include "d4all.h"
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#include "t4test.h"
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __ZTC__
|
|
#ifndef NULL
|
|
#define NULL 0
|
|
#endif
|
|
#endif
|
|
#ifdef DLL
|
|
#define TEST_EXPORT _export
|
|
#endif
|
|
#else
|
|
#ifdef S4UNIX
|
|
#ifdef S4CURSES
|
|
/* #include <curses.h> */
|
|
#else
|
|
/* #include <tinfo.h> */
|
|
#endif
|
|
#else
|
|
#include <conio.h>
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4WINDOWS
|
|
HCURSOR hHourGlass, hSaveCursor ;
|
|
#endif
|
|
|
|
#ifdef S4WINDOWS
|
|
void S4FUNCTION d4display_init( D4DISPLAY *disp, HWND h )
|
|
{
|
|
HDC hdc ;
|
|
TEXTMETRIC tm ;
|
|
|
|
memset( disp, 0, sizeof(D4DISPLAY) ) ;
|
|
disp->hWnd = h ;
|
|
disp->lpmsg = &(disp->msg) ;
|
|
hdc = GetDC(disp->hWnd) ;
|
|
GetTextMetrics( hdc, &tm ) ;
|
|
disp->tm = tm ;
|
|
ReleaseDC(disp->hWnd,hdc) ;
|
|
disp->x = 0 ;
|
|
disp->y = 0 ;
|
|
disp->did_close = 0 ;
|
|
disp->did_quit = 0 ;
|
|
}
|
|
|
|
#ifdef S4MEDIUM
|
|
char pointer[100] ; /* argument list for medium memory model */
|
|
#endif
|
|
#endif
|
|
#ifdef S4OS2PM
|
|
void S4FUNCTION d4display_init( D4DISPLAY *disp, HWND h )
|
|
{
|
|
HPS hps ;
|
|
FONTMETRICS tm ;
|
|
LONG lmlen ;
|
|
|
|
|
|
memset( disp, 0, sizeof(D4DISPLAY) ) ;
|
|
disp->hWnd = h ;
|
|
hps = WinGetPS(disp->hWnd) ;
|
|
GpiQueryFontMetrics( hps, lmlen, &tm ) ;
|
|
disp->tm = tm ;
|
|
/* memcpy( &disp->tm, tm, sizeof( FONTMENTRICS ) ) ; */
|
|
WinReleasePS( hps ) ;
|
|
disp->x = 0 ;
|
|
disp->y = 0 ;
|
|
disp->did_close = 0 ;
|
|
disp->did_quit = 0 ;
|
|
}
|
|
#endif
|
|
|
|
void S4FUNCTION d4display_str( D4DISPLAY *disp, char *str, int is_new_line )
|
|
{
|
|
#ifndef S4NO_OUT
|
|
#ifdef S4OS2PM
|
|
HPS hps ;
|
|
RECTL rect ;
|
|
POINTL pt ;
|
|
SIZEL size ;
|
|
int len, height, width, i ;
|
|
char blank_line[180] ;
|
|
|
|
while ( disp->display_set == 1 ) /* a display message not processed is waiting */
|
|
;
|
|
|
|
disp->display_set = 1 ; /* mark a message as pending */
|
|
|
|
len = strlen( str ) ;
|
|
|
|
memcpy( disp->str, str, len ) ;
|
|
disp->len = len ;
|
|
disp->is_new_line = is_new_line ;
|
|
|
|
WinInvalidateRegion( disp->hWnd, (HRGN)NULL, FALSE );
|
|
|
|
return ;
|
|
#else
|
|
#ifdef S4WINDOWS
|
|
RECT rect ;
|
|
HDC hdc ;
|
|
int len, height, width ;
|
|
DWORD dword ;
|
|
char blank_line[180] ;
|
|
SIZE size;
|
|
|
|
memset(blank_line, 32, 179) ;
|
|
blank_line[179] = '\0' ;
|
|
|
|
hdc = GetDC(disp->hWnd) ;
|
|
len = strlen(str) ;
|
|
|
|
dword = GetTextExtentPoint( hdc, str, len, &size ) ;
|
|
height = size.cy ;
|
|
width = size.cx ;
|
|
|
|
if ( is_new_line )
|
|
{
|
|
disp->x = 0 ;
|
|
disp->y += height + disp->tm.tmExternalLeading ;
|
|
}
|
|
|
|
GetClientRect( disp->hWnd, &rect ) ;
|
|
|
|
if ( (disp->y+height) > rect.bottom )
|
|
{
|
|
disp->y = 0 ;
|
|
InvalidateRect( disp->hWnd, &rect, 1 ) ;
|
|
}
|
|
|
|
TextOut( hdc, disp->x,disp->y, str, len ) ;
|
|
|
|
if ( (disp->y+(2*height)) > rect.bottom )
|
|
TextOut( hdc, 0, 0, blank_line, strlen(blank_line) ) ;
|
|
else
|
|
TextOut( hdc, 0, (disp->y+height+disp->tm.tmExternalLeading), blank_line, strlen(blank_line) ) ;
|
|
|
|
disp->x += width ;
|
|
|
|
ReleaseDC(disp->hWnd,hdc) ;
|
|
#else
|
|
if ( is_new_line )
|
|
{
|
|
printf( "\n%s", str ) ;
|
|
disp->x = 1 ;
|
|
}
|
|
else
|
|
{
|
|
if (disp->x == 0)
|
|
{
|
|
printf( "\r%s", str ) ;
|
|
disp->x = 1 ;
|
|
}
|
|
else
|
|
{
|
|
printf( "%s", str ) ;
|
|
disp->x = 1 ;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION d4display_num( D4DISPLAY *disp, long num, int is_new_line )
|
|
{
|
|
#ifndef S4NO_OUT
|
|
char str[13] ;
|
|
char *ptr ;
|
|
|
|
ptr = str ;
|
|
c4ltoa45( num, ptr, sizeof(str)-1 ) ;
|
|
str[12] = '\0' ;
|
|
d4display_str( disp, str, is_new_line ) ;
|
|
#endif
|
|
}
|
|
|
|
int S4FUNCTION d4display_quit( D4DISPLAY *disp )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
/* If there is a message, the message is processed. */
|
|
/* If the message says quit, then TRUE is returned. */
|
|
if ( disp->did_quit ) return 1 ;
|
|
|
|
for (;;)
|
|
{
|
|
if ( ! disp->did_close )
|
|
if ( ! PeekMessage( disp->lpmsg, disp->hWnd, 0, 0, PM_NOREMOVE ) )
|
|
return 0 ;
|
|
|
|
if ( ! GetMessage( disp->lpmsg, disp->hWnd, 0, 0 ) )
|
|
{
|
|
#ifndef S4TESTING
|
|
MessageBox( disp->hWnd, "", "Program Completed", MB_OK ) ;
|
|
#endif
|
|
disp->did_quit = 1 ;
|
|
return 1 ;
|
|
}
|
|
|
|
TranslateMessage(disp->lpmsg);
|
|
DispatchMessage(disp->lpmsg);
|
|
}
|
|
#else
|
|
disp = disp ; /* avoid compiler warnings */
|
|
return 0 ;
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION d4display_wait( D4DISPLAY *disp )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
hHourGlass = LoadCursor( NULL, IDC_WAIT ) ;
|
|
|
|
SetCapture( disp->hWnd ) ;
|
|
hSaveCursor = SetCursor(hHourGlass) ;
|
|
#else
|
|
disp = disp ; /* avoid compiler warnings */
|
|
#endif
|
|
}
|
|
|
|
|
|
void S4FUNCTION d4display_start()
|
|
{
|
|
#ifdef S4WINDOWS
|
|
SetCursor(hSaveCursor) ;
|
|
ReleaseCapture() ;
|
|
#endif
|
|
}
|
|
|
|
|
|
#ifdef S4WINDOWS
|
|
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
|
|
}
|
|
#else
|
|
void S4FUNCTION d4parsestring_init( D4PARSE_STR *p_str, int n, char **p )
|
|
{
|
|
p_str->n_parms = n - 1 ;
|
|
p_str->parms = p ;
|
|
p_str->i_parm = 0 ;
|
|
}
|
|
#endif
|
|
|
|
|
|
char *S4FUNCTION d4parsestring_nparm( D4PARSE_STR *p_str )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
unsigned i ;
|
|
char *new_ptr ;
|
|
|
|
if ( p_str->ptr == 0 )
|
|
return (char *) p_str->ptr ;
|
|
|
|
while (p_str->ptr[0] == ' ' )
|
|
p_str->ptr++ ;
|
|
|
|
for ( i = 0; ; i++ )
|
|
if ( p_str->ptr[i] == 0 || p_str->ptr[i] == ' ' )
|
|
{
|
|
new_ptr = p_str->ptr ;
|
|
p_str->ptr += i ;
|
|
return (char *) new_ptr ;
|
|
}
|
|
#else
|
|
p_str->i_parm++ ;
|
|
if (p_str->i_parm > p_str->n_parms)
|
|
return (char *) "" ;
|
|
return (char *) p_str->parms[p_str->i_parm] ;
|
|
#endif
|
|
}
|
|
|
|
ERROR_DATA t4error_data[] =
|
|
{
|
|
{ t4err_field, "Field Error" },
|
|
{ t4err_append, "append failure" },
|
|
{ t4err_append_blank, "d4append_blank() failure" },
|
|
{ t4err_count, "d4reccount() returned an incorrect count" },
|
|
{ t4err_go, "d4go()/d4top()/d4bottom() failure" },
|
|
{ t4err_data, "open()/create() returned a null value" },
|
|
{ t4err_write, "d4write()/f4write() failed" },
|
|
{ t4err_close, "d4close() failed" },
|
|
{ t4err_lock, "locking failure" },
|
|
{ t4err_unlock, "unlocking failure" },
|
|
{ t4err_recno, "unexpected d4recno() value" },
|
|
{ t4err_deleted, "unexpected d4deleted() value" },
|
|
{ t4err_pack, "d4pack() failure" },
|
|
{ t4err_zap, "d4zap() failure" },
|
|
{ t4err_n_fields, "d4num_fields() failure" },
|
|
{ t4err_name, "Naming error" },
|
|
{ t4err_memory, "Memory error" },
|
|
{ t4err_general, "General test failure" },
|
|
{ t4err_sort, "Sorting failure" },
|
|
{ t4err_check, "d4check()/i4check()/..check() failed" },
|
|
{ t4err_tag, "tag function failure" },
|
|
{ t4err_seek, "seek failure" },
|
|
{ t4err_reindex, "reindex failure" },
|
|
{ t4err_skip, "skip failure" },
|
|
{ t4err_parm, "Missing command line parameter(s)" },
|
|
{ t4err_expr, "Expression error" },
|
|
{ t4err_memo, "Memo error" },
|
|
{ t4err_flush, "Flushing failure" },
|
|
{ t4err_opt, "Optimization error" },
|
|
{ t4err_date, "Date error" },
|
|
{ t4err_position, "Position function error" },
|
|
{ t4err_relate, "Relation error" },
|
|
{ t4err_read, "File Reading error" },
|
|
{ 0, 0 },
|
|
} ;
|
|
|
|
#ifdef S4WINDOWS
|
|
void S4FUNCTION t4warn( int err_code, char *desc )
|
|
{
|
|
char error_str[257] ;
|
|
int pos, i ;
|
|
|
|
strcpy( error_str, T4_ERROR_WAR ) ;
|
|
strcat( error_str, " #: " ) ;
|
|
c4ltoa45( err_code, (char far *)error_str+16, 4 ) ;
|
|
pos = 20 ;
|
|
|
|
error_str[pos++] = '\n' ;
|
|
|
|
for ( i=0; t4error_data[i].error_num != 0; i++ )
|
|
if ( t4error_data[i].error_num == err_code )
|
|
{
|
|
strcpy( error_str+pos, t4error_data[i].error_data ) ;
|
|
pos += strlen( t4error_data[i].error_data ) ;
|
|
error_str[pos++] = '\n' ;
|
|
break ;
|
|
}
|
|
|
|
if ( strlen(desc)+pos+4 < sizeof(error_str) )
|
|
{
|
|
strcpy( error_str+pos, desc ) ;
|
|
pos += strlen(desc) ;
|
|
error_str[pos++] = '\n' ;
|
|
}
|
|
|
|
error_str[pos] = 0 ;
|
|
|
|
OemToAnsi( error_str, error_str ) ;
|
|
|
|
#ifdef S4TESTING
|
|
u4write_err( error_str ) ;
|
|
#else
|
|
MessageBox( 0, error_str, E4_ERROR_CDS, MB_OK | MB_ICONSTOP ) ;
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION t4severe( int err_code, char *desc )
|
|
{
|
|
char error_str[257] ;
|
|
int pos, i ;
|
|
|
|
strcpy( error_str, T4_ERROR_SEV ) ;
|
|
strcat( error_str, " #: " ) ;
|
|
c4ltoa45( err_code, (char far *)error_str+16, 4 ) ;
|
|
pos = 20 ;
|
|
|
|
error_str[pos++] = '\n' ;
|
|
|
|
for ( i=0; t4error_data[i].error_num != 0; i++ )
|
|
if ( t4error_data[i].error_num == err_code )
|
|
{
|
|
strcpy( error_str+pos, t4error_data[i].error_data ) ;
|
|
pos += strlen( t4error_data[i].error_data ) ;
|
|
error_str[pos++] = '\n' ;
|
|
break ;
|
|
}
|
|
|
|
if ( strlen(desc)+pos+4 < sizeof(error_str) )
|
|
{
|
|
strcpy( error_str+pos, desc ) ;
|
|
pos += strlen(desc) ;
|
|
error_str[pos++] = '\n' ;
|
|
}
|
|
|
|
error_str[pos] = 0 ;
|
|
|
|
OemToAnsi( error_str, error_str ) ;
|
|
|
|
#ifdef S4TESTING
|
|
u4write_err( error_str ) ;
|
|
u4terminate() ;
|
|
#else
|
|
MessageBox( 0, error_str, E4_ERROR_CDS, MB_OK | MB_ICONSTOP ) ;
|
|
FatalAppExit( 0, error_str ) ;
|
|
#endif
|
|
}
|
|
#else
|
|
#ifdef S4OS2PM
|
|
|
|
/* uses the display object and d4display_str() function for boxing message */
|
|
void S4FUNCTION t4warn( int err_code, char *desc )
|
|
{
|
|
int pos, i ;
|
|
|
|
while ( display.display_set == 1 ) /* a display message not processed is waiting */
|
|
;
|
|
|
|
display.display_set = 1 ; /* mark a message as pending */
|
|
|
|
strcpy( display.str, T4_ERROR_WAR ) ;
|
|
strcat( display.str, " #: " ) ;
|
|
c4ltoa45( err_code, (char *)display.str+16, 4 ) ;
|
|
pos = 20 ;
|
|
|
|
display.str[pos++] = '\n' ;
|
|
|
|
for ( i=0; t4error_data[i].error_num != 0; i++ )
|
|
if ( t4error_data[i].error_num == err_code )
|
|
{
|
|
strcpy( display.str+pos, t4error_data[i].error_data ) ;
|
|
pos += strlen( t4error_data[i].error_data ) ;
|
|
display.str[pos++] = '\n' ;
|
|
break ;
|
|
}
|
|
|
|
if ( strlen(desc)+pos+4 < sizeof(display.str) )
|
|
{
|
|
strcpy( display.str+pos, desc ) ;
|
|
pos += strlen(desc) ;
|
|
display.str[pos++] = '\n' ;
|
|
}
|
|
|
|
display.str[pos] = 0 ; /* display routine will set back to 1 */
|
|
|
|
WinPostMsg(hwndMain, EM_CODEBASE_ERROR, (MPARAM)NULL, (MPARAM)NULL);
|
|
|
|
return ;
|
|
}
|
|
|
|
void S4FUNCTION t4severe( int err_code, char *desc )
|
|
{
|
|
int pos, i ;
|
|
|
|
while ( display.display_set == 1 ) /* a display message not processed is waiting */
|
|
;
|
|
|
|
display.display_set = 1 ; /* mark a message as pending */
|
|
|
|
strcpy( display.str, T4_ERROR_SEV ) ;
|
|
strcat( display.str, " #: " ) ;
|
|
#ifdef S4OS2PM
|
|
c4ltoa45( err_code, (char *)display.str+16, 4 ) ;
|
|
#else
|
|
c4ltoa45( err_code, (char far *)display.str+16, 4 ) ;
|
|
#endif
|
|
pos = 20 ;
|
|
|
|
display.str[pos++] = '\n' ;
|
|
|
|
for ( i=0; t4error_data[i].error_num != 0; i++ )
|
|
if ( t4error_data[i].error_num == err_code )
|
|
{
|
|
strcpy( display.str+pos, t4error_data[i].error_data ) ;
|
|
pos += strlen( t4error_data[i].error_data ) ;
|
|
display.str[pos++] = '\n' ;
|
|
break ;
|
|
}
|
|
|
|
if ( strlen(desc)+pos+4 < sizeof(display.str) )
|
|
{
|
|
strcpy( display.str+pos, desc ) ;
|
|
pos += strlen(desc) ;
|
|
display.str[pos++] = '\n' ;
|
|
}
|
|
|
|
display.str[pos] = 0 ;
|
|
WinPostMsg(hwndMain, EM_CODEBASE_ERROR, (MPARAM)NULL, (MPARAM)NULL);
|
|
DosExit(EXIT_THREAD, 0L);
|
|
}
|
|
#else
|
|
static void e4error_out( char *ptr )
|
|
{
|
|
#ifdef S4UNIX
|
|
printf("%s", ptr ) ;
|
|
#else
|
|
#ifdef S4TESTING
|
|
u4write_err( ptr ) ;
|
|
#else
|
|
write( 1, ptr, (unsigned int) strlen(ptr) ) ;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
static void display( int err_code )
|
|
{
|
|
char buf[11] ;
|
|
int i ;
|
|
|
|
c4ltoa45( (long) err_code, buf, 6 ) ;
|
|
buf[6] = 0 ;
|
|
e4error_out( buf ) ;
|
|
|
|
for ( i = 0; t4error_data[i].error_data != 0; i++ )
|
|
if ( t4error_data[i].error_num == err_code )
|
|
{
|
|
e4error_out( "\r\n" ) ;
|
|
e4error_out( t4error_data[i].error_data ) ;
|
|
break ;
|
|
}
|
|
}
|
|
|
|
void S4FUNCTION t4warn( int err_code, char *desc )
|
|
{
|
|
e4error_out( T4_ERROR_WAR ) ;
|
|
display( err_code ) ;
|
|
|
|
e4error_out( "\r\n" ) ;
|
|
e4error_out( desc ) ;
|
|
}
|
|
|
|
void S4FUNCTION t4severe( int err_code, char *desc )
|
|
{
|
|
e4error_out( T4_ERROR_SEV ) ;
|
|
display( err_code ) ;
|
|
|
|
e4error_out( "\r\n" ) ;
|
|
e4error_out( desc ) ;
|
|
|
|
#ifndef S4TESTING
|
|
#ifdef S4UNIX
|
|
getchar() ;
|
|
#else
|
|
getch() ;
|
|
#endif
|
|
#endif
|
|
exit(1) ;
|
|
}
|
|
#endif /* S4OS2PM */
|
|
#endif /* S4WINDOWS */
|
|
|
|
#ifdef S4ERROR_HOOK
|
|
void S4FUNCTION e4hook( CODE4 S4PTR *c4, int err_code, char *desc1, char *desc2, char *desc3 )
|
|
{
|
|
t4severe( err_code, desc1 ) ;
|
|
}
|
|
#endif
|