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
 |