campo-sirio/cb5/e4error.c

972 lines
26 KiB
C
Raw Normal View History

/* e4error.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
#include "d4all.h"
#ifndef S4UNIX
#ifdef __TURBOC__
#pragma hdrstop
#endif /* __TUROBC__ */
#endif /* S4UNIX */
#ifndef S4WINDOWS
#ifndef S4UNIX
#include <conio.h>
#endif /* S4UNIX */
#endif /* not S4WINDOWS */
#ifdef S4OS2PM
#define E4MSGBOXID 9513
static void do_error_box( void ) ;
#endif
#ifdef S4VB_DOS
#define V4ERROR 1
#define V4SEVERE 2
#endif
#ifndef S4TEST
/* Add alternative error display code here.
Function e4hook() may be placed in your own separate source code
file, but ensure that the same function prototype as below is used.
void S4FUNCTION e4hook( CODE4 S4PTR *c4, int err_code, char *desc1, char *desc2, char *desc3 )
{
return ;
}
*/
#endif
#ifdef S4TESTING
extern int s4test_handle ;
#endif
#ifdef S4WINDOWS
#ifdef __TURBOC__
#if __TURBOC__ == 0x297 /* if Borland C++ 2.0 */
#ifdef __cplusplus
extern "C"{ void FAR PASCAL FatalAppExit(WORD,LPSTR) ; }
#else
void FAR PASCAL FatalAppExit(WORD,LPSTR) ;
#endif /* __cplusplus */
#endif /* __TUROBC__ == 0x297 */
#endif /* __TUROBC__ */
#ifndef __SC__
#ifdef __ZTC__
#ifdef __cplusplus
extern "C"{ void FAR PASCAL FatalAppExit(unsigned short,LPSTR) ; }
#else
void FAR PASCAL FatalAppExit(unsigned short,LPSTR) ;
#endif /* __cplusplus */
#endif /* __ZTC__ */
#endif /* __SC__ */
#ifdef _MSC_VER
#if _MSC_VER == 600
#ifdef __cplusplus
extern "C"{ void FAR PASCAL FatalAppExit(WORD,LPSTR) ; }
#else
void FAR PASCAL FatalAppExit(WORD,LPSTR) ;
#endif /* __cplusplus */
#endif /* _MSC_VER == 600 */
#endif /* _MSC_VER */
#endif /* S4WINDOWS */
#ifndef S4OFF_ERROR
#ifndef S4LANGUAGE
ERROR_DATA e4error_data[] =
{
/* General Disk Access Errors */
{ e4create, "Creating File" },
{ e4open, "Opening File" },
{ e4read, "Reading File" },
{ e4seek, "Seeking to File Position" },
{ e4write, "Writing to File" },
{ e4close, "Closing File" },
{ e4remove, "Removing File" },
{ e4lock, "Locking File" },
{ e4unlock, "Unlocking File" },
{ e4len, "Determining File Length" },
{ e4len_set, "Setting File Length" },
{ e4rename, "Renaming File" },
/* Database Specific Errors */
{ e4data, "File is not a Data File" },
{ e4record_len, "Record Length is too Large" },
{ e4field_name, "Unrecognized Field Name" },
{ e4field_type, "Unrecognized Field Type" },
/* Index File Specific Errors */
{ e4index, "Not a Correct Index File" },
{ e4entry, "Tag Entry Missing" },
{ e4unique, "Unique Key Error" },
{ e4tag_name, "Tag Name not Found" },
/* Expression Evaluation Errors */
{ e4comma_expected, "Comma or Bracket Expected" },
{ e4complete, "Expression not Complete" },
{ e4data_name, "Data File Name not Located" },
{ e4length_err, "IIF() Needs Parameters of Same Length" },
{ e4not_constant, "SUBSTR() and STR() need Constant Parameters" },
{ e4num_parms, "Number of Parameters is Wrong" },
{ e4overflow, "Overflow while Evaluating Expression" },
{ e4right_missing, "Right Bracket Missing" },
{ e4type_sub, "Sub-expression Type is Wrong" },
{ e4unrec_function, "Unrecognized Function" },
{ e4unrec_operator, "Unrecognized Operator" },
{ e4unrec_value, "Unrecognized Value"} ,
{ e4unterminated, "Unterminated String"} ,
/* Optimization Errors */
{ e4opt, "Optimization Error"} ,
{ e4opt_suspend, "Optimization Removal Failure"} ,
{ e4opt_flush, "Optimization File Flushing Failure"} ,
/* Relation Errors */
{ e4relate, "Relation Error"} ,
{ e4lookup_err, "Matching Slave Record Not Located"} ,
/* Report Errors */
{ e4report, "Report Error"} ,
{ e4style_create, "Error Creating Style"},
{ e4style_select, "Error Selecting Style"},
{ e4style_index, "Error Finding Style"},
{ e4area_create, "Error Creating Area"},
{ e4group_create, "Error Creating Group"},
{ e4group_expr, "Error Setting Group Reset-Expression"},
{ e4total_create, "Error Creating Total"},
{ e4obj_create, "Error Creating Object"},
{ e4rep_win, "Error In Windows Output"},
{ e4rep_out, "Error In Report Output"},
{ e4rep_save, "Error Saving Report"},
{ e4rep_ret, "Error Retrieving Report"},
{ e4rep_data, "Error In Sending Report to Data File"},
/* Critical Errors */
{ e4memory, "Out of Memory"} ,
{ e4info, "Unexpected Information"} ,
{ e4parm, "Unexpected Parameter"} ,
{ e4demo, "Exceeded Maximum Record Number for Demonstration"} ,
{ e4result, "Unexpected Result"} ,
/* Not Supported Errors */
{ e4not_memo, "Function unsupported: library compiled with S4OFF_MEMO" },
{ e4not_write, "Function unsupported: library compiled with S4OFF_WRITE" },
{ e4not_index, "Function unsupported: library compiled with S4OFF_INDEX" },
{ e4not_rename, "Function unsupported: library compiled with S4NO_RENAME" },
{ e4not_clipper, "Function unsupported: library not compiled with S4CLIPPER" },
{ e4not_lock, "Function unsupported: library not compiled with S4LOCK_HOOK" },
{ e4not_hook, "Function unsupported: library not compiled with S4ERROR_HOOK" },
{ 0, 0 },
} ;
#endif /* not S4LANGUAGE */
#ifdef S4LANGUAGE
#ifdef S4GERMAN
ERROR_DATA e4error_data[] =
{
/* Allgemeine Fehler beim Diskzugriff (General Disk Access Errors) */
{ e4create, "Anlegen einer Datei" },
{ e4open, "<EFBFBD>ffnen einer Datei" },
{ e4read, "Lesen einer Datei" },
{ e4seek, "Suchen einer Position in der Datei " },
{ e4write, "Schreiben einer Datei" },
{ e4close, "Schlie<EFBFBD>en einer Datei" },
{ e4remove, "L<EFBFBD>schen einer Datei" },
{ e4lock, "Locken einer Datei" },
{ e4unlock, "Freigeben einer Datei" },
{ e4len, "Festlegen der L<>nge einer Datei" },
{ e4len_set, "Einstellen der L<>nge einer Datei" },
{ e4rename, "Umnennen einer Datei" },
/* Datenbank spezifische Fehler (Database Specific Errors) */
{ e4data, "Datei is keiner DatenBank" },
{ e4record_len, "Datensatzl<EFBFBD>nge zu gro<72>" },
{ e4field_name, "Unbekannter Feldname" },
{ e4field_type, "Feldtyp" },
/* Indexdatei spezifische Fehler (Index File Specific Errors) */
{ e4index, "Datei is keine Indexdatei" },
{ e4entry, "Indexdatei is veraltet" },
{ e4unique, "Schul<EFBFBD>sel ist schon einmal vorhanden" },
{ e4tag_name, "Name des 'Tag'"},
/* Fehler bei der Bewertung von Ausdr<64>cken (Expressions Evaluation Errors) */
{ e4comma_expected, "\",\" oder \")\" erwartet" },
{ e4complete, "Ausdruck ist nich vollst<73>ndig" },
{ e4data_name, "Keine offene Datenbank" },
{ e4num_parms, "Ung<EFBFBD>ltige Anzahl von Parametern im Ausdruck"},
{ e4overflow, "<EFBFBD>berlauf bei der Auswertung eines Ausdrucks" },
{ e4right_missing, "Rechte Klammer im Ausdruck fehlt" },
{ e4unrec_function, "Unbekannte Funktion im Ausdruck" },
{ e4unrec_operator, "Unbekannter Operator im Ausdruck" },
{ e4unrec_value, "Unbekannter Wert im Ausdruck"} ,
{ e4unterminated, "Nicht abgeschlossene Zeichenkette im Ausdruck"} ,
/* Optimization Errors */
{ e4opt, "Optimization Error"} , /*!!!GERMAN*/
{ e4opt_suspend, "Optimization Removal Failure"} , /*!!!GERMAN*/
{ e4opt_flush, "Optimization File Flushing Failure"} , /*!!!GERMAN*/
/* Relation Errors */
{ e4lookup_err, "Matching Slave Record Not Located"} ,
/* Kritische Fehler (Critical Errors) */
{ e4memory, "Kein Speicher mehr verf<72>gbar"} ,
{ e4info, "Unerwartete Information" },
{ e4parm, "Unerwarteter Parameter"},
{ e4demo, "Exceeded Maximum Record Number for Demonstration"} , /*!!!GERMAN*/
{ e4result, "Unerwartetes Ergebnis"},
{ 0, 0 },
} ;
#endif /* S4GERMAN */
#ifdef S4FRENCH
ERROR_DATA e4error_data[] =
{
/* General Disk Access Errors */
{ e4create, "En cr<63>ant le fichier" },
{ e4open, "En engageant le fichier" },
{ e4read, "En lisant le fichier" },
{ e4seek, "En se pla<6C>ant dans le fichier" },
{ e4write, "En <20>crivant dans le fichier" },
{ e4close, "En lib<69>rant le fichier" },
{ e4remove, "En effa<66>ant le fichier" },
{ e4lock, "En bloquant le fichier" },
{ e4unlock, "En d<>bloquant le fichier" },
{ e4len, "En d<>terminant la longueur du fichier" },
{ e4len_set, "Mise <20> jour de la longueur du fichier" },
{ e4rename, "D<EFBFBD>nomination du fichier" },
/* Database Specific Errors */
{ e4data, "Le fichier n'est pas une base de donn<6E>es:" },
{ e4record_len, "La fiche est trop grande" },
{ e4field_name, "Champ inconnu" },
{ e4field_type, "Type de champ inconnu" },
/* Index File Specific Errors */
{ e4index, "Ce n'est pas un fichier d'indice" },
{ e4entry, "Le fichier d'indice n'est pas <20> jour" },
{ e4unique, "La clef n'est pas unique" },
{ e4tag_name, "L'article d<>sign<67> par l'indice n'existe pas" },
/* Expression Evaluation Errors */
{ e4comma_expected, "\",\" ou \")\" manquant dans l'expression" },
{ e4complete, "Expression incompl<70>te" },
{ e4data_name, "La base r<>f<EFBFBD>r<EFBFBD>e dans l'expression n'est pas pr<70>sente" },
{ e4num_parms, "Nombre ill<6C>gal de crit<69>res dans l'expression"},
{ e4overflow, "L'expression donne un r<>sultat trop grand" },
{ e4right_missing, "Parenth<EFBFBD>se manquante dans l'expression" },
{ e4type_sub, "Un param<61>tre est de la mauvaise sorte" },
{ e4unrec_function, "L'expression contient une fonction inconnue" },
{ e4unrec_operator, "L'expression contient un op<6F>rateur inconnu" },
{ e4unrec_value, "L'expression contient une valeur inconnue"} ,
{ e4unterminated, "Apostrophe manquante dans l'expression"} ,
/* Optimization Errors */
{ e4opt, "Optimization Error"} ,
{ e4opt_suspend, "Optimization Removal Failure"} ,
{ e4opt_flush, "Optimization File Flushing Failure"} ,
/* Relation Errors */
{ e4lookup_err, "Matching Slave Record Not Located"} ,
/* Critical Errors */
{ e4memory, "Plus de m<>moire disponible" } ,
{ e4info, "Information inexpect<63>e"} ,
{ e4parm, "Param<EFBFBD>tre inexpect<63>"} ,
{ e4demo, "Au maximum d'articles dans la version de d<>monstration" } ,
{ e4result, "R<EFBFBD>sultat inexpect<63>"} ,
{ 0, 0 },
} ;
#endif /* S4FRENCH */
#ifdef S4SCANDINAVIAN
ERROR_DATA e4error_data[] =
{
/* General Disk Access Errors */
{ e4create, "Creating File" },
{ e4open, "Opening File" },
{ e4read, "Reading File" },
{ e4seek, "Seeking to File Position" },
{ e4write, "Writing to File" },
{ e4close, "Closing File" },
{ e4remove, "Removing File" },
{ e4lock, "Locking File" },
{ e4unlock, "Unlocking File" },
{ e4len, "Determining File Length" },
{ e4len_set, "Setting File Length" },
{ e4rename, "Renaming File" },
/* Database Specific Errors */
{ e4data, "File is not a Data File" },
{ e4record_len, "Record Length is too Large" },
{ e4field_name, "Unrecognized Field Name" },
{ e4field_type, "Unrecognized Field Type" },
/* Index File Specific Errors */
{ e4index, "Not a Correct Index File" },
{ e4entry, "Tag Entry Missing" },
{ e4unique, "Unique Key Error" },
{ e4tag_name, "Tag Name not Found" },
/* Expression Evaluation Errors */
{ e4comma_expected, "Comma or Bracket Expected" },
{ e4complete, "Expression not Complete" },
{ e4data_name, "Data File Name not Located" },
{ e4length_err, "IIF() Needs Parameters of Same Length" },
{ e4not_constant, "SUBSTR() and STR() need Constant Parameters" },
{ e4num_parms, "Number of Parameters is Wrong" },
{ e4overflow, "Overflow while Evaluating Expression" },
{ e4right_missing, "Right Bracket Missing" },
{ e4type_sub, "Sub-expression Type is Wrong" },
{ e4unrec_function, "Unrecognized Function" },
{ e4unrec_operator, "Unrecognized Operator" },
{ e4unrec_value, "Unrecognized Value"} ,
{ e4unterminated, "Unterminated String"} ,
/* Optimization Errors */
{ e4opt, "Optimization Error"} ,
{ e4opt_suspend, "Optimization Removal Failure"} ,
{ e4opt_flush, "Optimization File Flushing Failure"} ,
/* Relation Errors */
{ e4relate, "Relation Error"} ,
{ e4lookup_err, "Matching Slave Record Not Located"} ,
/* Report Errors */
{ e4report, "Report Error"} ,
/* Critical Errors */
{ e4memory, "Out of Memory"} ,
{ e4info, "Unexpected Information"} ,
{ e4parm, "Unexpected Parameter"} ,
{ e4demo, "Exceeded Maximum Record Number for Demonstration"} ,
{ e4result, "Unexpected Result"} ,
{ 0, 0 },
} ;
#endif /* S4SCANDINAVIAN */
#endif /* S4LANGUAGE */
#endif /* S4ERROR_OFF */
int S4FUNCTION e4code( CODE4 S4PTR *c4 )
{
return c4->error_code ;
}
int S4FUNCTION e4set( CODE4 S4PTR *c4, int new_err_code )
{
int old_err_code ;
old_err_code = c4->error_code ;
c4->error_code = new_err_code ;
return old_err_code ;
}
char S4PTR * S4FUNCTION e4text( int err_code )
{
#ifndef S4OFF_ERROR
int i ;
for ( i=0; (int) e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
return e4error_data[i].error_data ;
#endif
return (char *)0 ; /* err_code not matched */
}
void S4FUNCTION e4exit_test( CODE4 S4PTR *c4 )
{
if ( c4->error_code < 0 ) e4exit(c4) ;
}
#ifdef S4OS2PM
#ifndef S4ERROR_HOOK
static void e4do_err_out( int err_code, char *desc1, char *desc2, char *desc3 )
{
int i, pos, desc_number = 1 ;
char *ptr ;
HAB e4hab ;
HMQ e4hmq ;
char e4error_str[100] ;
strcpy( e4error_str, E4_ERROR ) ;
strcat( e4error_str, " #: " ) ;
c4ltoa45( err_code, (char *)e4error_str+9, 4 ) ;
pos = 13 ;
e4error_str[pos++] = '\n' ;
for ( i=0; (int) e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( e4error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_data[i].error_data ) ;
e4error_str[pos++] = '\n' ;
break ;
}
ptr = desc1 ;
while ( (ptr != (char *) 0) && (desc_number <= 3 ) )
{
if ( strlen(desc1)+pos+3 >= sizeof(e4error_str) )
break ;
strcpy( e4error_str + pos, ptr ) ;
pos += strlen(ptr) ;
e4error_str[pos++] = '\n' ;
if ( desc_number++ == 1 )
ptr = desc2 ;
else
ptr = desc3 ;
}
e4error_str[pos] = 0 ;
/* In case the application has done no PM Initialization, set up an
instance to allow for the error output to occur */
e4hab = WinInitialize(0) ;
if ( e4hab == NULLHANDLE )
return ;
e4hmq = WinCreateMsgQueue(e4hab, 0) ;
if ( e4hmq == NULLHANDLE )
{
WinTerminate(e4hab) ;
return ;
}
/* And print out the error via a desktop message box */
WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, e4error_str, "Error", E4MSGBOXID, MB_OK | MB_MOVEABLE | MB_CUACRITICAL ) ;
WinDestroyMsgQueue( e4hmq );
WinTerminate(e4hab) ;
}
#endif
void S4FUNCTION e4exit( CODE4 S4PTR *c4 )
{
exit( 0 ) ;
}
int S4FUNCTION e4( CODE4 S4PTR *c4, int err_code, char *desc )
{
return e4describe( c4, err_code, desc, 0, 0 ) ;
}
int S4FUNCTION e4describe( CODE4 S4PTR *c4, int err_code, char *desc1, char *desc2, char *desc3 )
{
#ifdef S4ERROR_HOOK
c4->error_code = err_code ;
e4hook( c4, err_code, desc1, desc2, desc3 ) ;
#else
c4->error_code = err_code ;
#ifndef S4OFF_ERROR
if ( c4->off_error == 0 )
e4do_err_out( err_code, desc1, desc2, desc3 ) ;
#endif
#endif /* ifdef S4ERROR_HOOK */
return err_code ;
}
void S4FUNCTION e4severe( int err_code, char *desc )
{
#ifdef S4ERROR_HOOK
e4hook( (char *)0, err_code, desc, (char *)0, (char *)0 ) ;
FatalAppExit( 0, desc ) ;
#else
e4do_err_out( err_code, desc, 0, 0 ) ;
e4exit( 0 ) ; ;
#endif
}
#endif /* S4OS2PM */
#ifndef S4OS2PM
#ifdef S4WINDOWS
/* S4WINDOWS */
void S4FUNCTION e4exit( CODE4 S4PTR *c4 )
{
FatalAppExit( 0, E4_MESSAG_EXI ) ;
}
/* S4WINDOWS */
int S4FUNCTION e4( CODE4 S4PTR *c4, int err_code, char *desc )
{
return e4describe( c4, err_code, desc, 0, 0 ) ;
}
/* S4WINDOWS */
int S4FUNCTION e4describe( CODE4 S4PTR *c4, int err_code, char *desc1, char *desc2, char *desc3 )
{
#ifdef S4ERROR_HOOK
c4->error_code = err_code ;
e4hook( c4, err_code, desc1, desc2, desc3 ) ;
#else
char error_str[257], *ptr ;
int i, pos, desc_number = 1 ;
WORD wType ;
c4->error_code = err_code ;
#ifndef S4OFF_ERROR
if ( c4->off_error == 0 )
{
strcpy( error_str, E4_ERROR ) ;
strcat( error_str, " #: " ) ;
c4ltoa45( err_code, (char S4PTR *)error_str+9, 4 ) ;
pos = 13 ;
error_str[pos++] = '\n' ;
for ( i=0; (int) e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_data[i].error_data ) ;
error_str[pos++] = '\n' ;
break ;
}
ptr = desc1 ;
while ( (ptr != (char *) 0) && (desc_number <= 3 ) )
{
if ( strlen(desc1)+pos+3 >= sizeof(error_str) )
break ;
strcpy( error_str+pos, ptr ) ;
pos += strlen(ptr) ;
error_str[pos++] = '\n' ;
if ( desc_number++ == 1 )
ptr = desc2 ;
else
ptr = desc3 ;
}
error_str[pos] = 0 ;
OemToAnsi( error_str, error_str ) ;
wType = MB_OK | MB_ICONSTOP ;
if ( err_code == e4memory )
wType |= MB_SYSTEMMODAL ;
#ifndef S4TESTING
#ifdef S4VBASIC
if ( MessageBox( 0, error_str, E4_ERROR_BAS, wType ) == 0 )
#else
if ( MessageBox( 0, error_str, E4_ERROR_COD, wType ) == 0 )
#endif
FatalAppExit( 0, E4_MEMORY_ERR ) ;
#else
if( s4test_handle )
write( s4test_handle, error_str, (unsigned) strlen(error_str) ) ;
#endif
}
#endif
#endif /* ifdef S4ERROR_HOOK */
return err_code ;
}
/* S4WINDOWS */
void S4FUNCTION e4severe( int err_code, char *desc )
{
#ifdef S4ERROR_HOOK
e4hook( (char *)0, err_code, desc, (char *)0, (char *)0 ) ;
FatalAppExit( 0, desc ) ;
#else
#ifndef S4OFF_ERROR
char error_str[257] ;
int pos, i ;
strcpy( error_str, E4_ERROR_SEV ) ;
strcat( error_str, " #: " ) ;
c4ltoa45( err_code, (char S4PTR *)error_str+27, 4 ) ;
pos = 31 ;
error_str[pos++] = '\n' ;
for ( i=0; e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_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 ) ;
#ifndef S4TESTING
MessageBox( 0, error_str, E4_ERROR_CDS, MB_OK | MB_ICONSTOP ) ;
FatalAppExit( 0, error_str ) ;
#else
if( s4test_handle )
write( s4test_handle, error_str, (unsigned) strlen(error_str) ) ;
#ifdef S4WIN32
ExitProcess(-1) ;
#else
u4terminate() ;
#endif
#endif
#else
FatalAppExit( 0, "" ) ;
#endif
#endif /* ifdef S4ERROR_HOOK */
}
/* S4WINDOWS */
#ifdef S4VBASIC
void S4FUNCTION e4severe_vbasic( int err_code, char *desc )
{
char error_str[257] ;
int i, pos ;
strcpy( error_str, E4_ERROR_SEV ) ;
strcat( error_str, " #: " ) ;
c4ltoa45( err_code, (char S4PTR *)error_str+27, 4 ) ;
pos = 31 ;
error_str[pos++] = '\n' ;
for ( i=0; e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_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 ) ;
#ifndef S4TESTING
MessageBox( 0, error_str, E4_ERROR_BAS, MB_OK | MB_ICONSTOP ) ;
#else
if( s4test_handle )
write( s4test_handle, error_str, (unsigned) strlen(error_str) ) ;
#endif
}
#endif /* S4VBASIC */
#endif /* S4WINDOWS */
#ifndef S4WINDOWS
#ifdef S4VB_DOS
/* S4VB_DOS */
int S4FUNCTION e4( CODE4 S4PTR *c4, int err_code, char *desc )
{
return e4describe( c4, err_code, desc, 0, 0 ) ;
}
/* S4VB_ DOS */
int S4FUNCTION e4describe( CODE4 S4PTR *c4, int err_code, char *desc1, char *desc2, char *desc3 )
{
char error_str[257], *ptr ;
int i, pos, desc_number = 1 ;
int err_type = V4ERROR ;
c4->error_code = err_code ;
strcpy( error_str, E4_ERROR ) ;
strcat( error_str, " #: " ) ;
c4ltoa45( err_code, (char far *)error_str+9, 4 ) ;
pos = 13 ;
error_str[pos++] = '\n' ;
for ( i=0; (int) e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_data[i].error_data ) ;
error_str[pos++] = '\n' ;
break ;
}
ptr = desc1 ;
while ( (ptr != (char *) 0) && (desc_number <= 3 ) )
{
if ( strlen(desc1)+pos+3 >= sizeof(error_str) ) break ;
strcpy( error_str+pos, ptr ) ;
pos += strlen(ptr) ;
error_str[pos++] = '\n' ;
if ( desc_number++ == 1 )
ptr = desc2 ;
else
ptr = desc3 ;
}
error_str[pos] = 0 ;
#ifndef S4TESTING
u4MsgBox( v4str(error_str), (int near *)&err_type);
#else
if( s4test_handle )
write( s4test_handle, error_str, (unsigned) strlen(error_str) ) ;
#endif
return err_code ;
}
/* S4VB_DOS */
void S4FUNCTION e4severe( int err_code, char *desc )
{
char error_str[257] ;
int pos, i ,err_type = V4SEVERE ;
strcpy( error_str, E4_ERROR_SEV ) ;
strcat( error_str, " #: " ) ;
c4ltoa45( err_code, (char far *)error_str+27, 4 ) ;
pos = 31 ;
error_str[pos++] = '\n' ;
for ( i=0; e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_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 ;
#ifndef S4TESTING
u4MsgBox( v4str(error_str), (int near *)&err_type);
#else
if( s4test_handle )
write( s4test_handle, error_str, (unsigned) strlen(error_str) ) ;
#endif
exit(err_code) ;
}
/* S4VB_DOS */
void S4FUNCTION e4severe_vbasic( int err_code, char *desc )
{
char error_str[257] ;
int i, pos, err_type = V4SEVERE ;
strcpy( error_str, E4_ERROR_SEV ) ;
strcat( error_str, " #: " ) ;
c4ltoa45( err_code, (char far *)error_str+27, 4 ) ;
pos = 31 ;
error_str[pos++] = '\n' ;
for ( i=0; e4error_data[i].error_num != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
strcpy( error_str+pos, e4error_data[i].error_data ) ;
pos += strlen( e4error_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 ;
#ifndef S4TESTING
u4MsgBox( v4str(error_str), (int near *)&err_type);
#else
if( s4test_handle )
write( s4test_handle, error_str, (unsigned) strlen(error_str) ) ;
#endif
}
/* S4VB_DOS */
void S4FUNCTION e4exit( CODE4 S4PTR *c4 )
{
if ( c4 == 0 )
exit(0) ;
else
exit( c4->error_code ) ;
}
#else /* S4VB_DOS */
/* not S4WINDOWS */
void S4FUNCTION e4exit( CODE4 S4PTR *c4 )
{
if ( c4 == 0 )
exit(0) ;
else
exit( c4->error_code ) ;
}
/* not S4WINDOWS */
#ifndef S4OFF_ERROR
static void e4error_out( char *ptr )
{
#ifdef S4UNIX
printf("%s", ptr ) ;
#else
#ifdef S4TESTING
if( s4test_handle )
write( s4test_handle, ptr, (unsigned int) strlen(ptr) ) ;
#endif
write( 1, ptr, (unsigned int) strlen(ptr) ) ;
#endif
}
/* not S4WINDOWS */
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; e4error_data[i].error_data != 0; i++ )
if ( e4error_data[i].error_num == err_code )
{
e4error_out( "\r\n" ) ;
e4error_out( e4error_data[i].error_data ) ;
break ;
}
}
#endif
/* not S4WINDOWS */
int S4FUNCTION e4( CODE4 S4PTR *c4, int err_code, char *desc )
{
return e4describe( c4, err_code, desc, 0, 0 ) ;
}
int S4FUNCTION e4describe( CODE4 S4PTR *c4, int err_code, char *desc1, char *desc2, char *desc3 )
{
#ifdef S4ERROR_HOOK
e4hook( c4, err_code, desc1, desc2, desc3 ) ;
#else
char *ptr ;
int desc_number = 1 ;
c4->error_code = err_code ;
#ifndef S4OFF_ERROR
if ( c4->off_error == 0 )
{
e4error_out( E4_ERROR_NUM ) ;
display ( err_code ) ;
ptr = desc1 ;
while ( (ptr != (char *) 0) && (desc_number <= 3 ) )
{
e4error_out( "\r\n" ) ;
e4error_out( ptr ) ;
if ( desc_number++ == 1 )
ptr = desc2 ;
else
ptr = desc3 ;
}
#ifdef S4UNIX
e4error_out( E4_ERROR_ENT ) ;
getchar() ;
#else
e4error_out( E4_ERROR_KEY ) ;
#ifndef S4TESTING
#ifndef S4PASCAL
getch() ;
#endif
#endif
#endif
}
#endif
#endif /* ifdef S4ERROR_HOOK */
return( err_code ) ;
}
void S4FUNCTION e4severe( int err_code, char *desc )
{
#ifdef S4ERROR_HOOK
e4hook( 0, err_code, desc, (char *)0, (char *)0 ) ;
#else
#ifndef S4OFF_ERROR
e4error_out( E4_ERROR_SEV ) ;
display( err_code ) ;
e4error_out( "\r\n" ) ;
e4error_out( desc ) ;
#ifdef S4UNIX
e4error_out( E4_ERROR_ENT ) ;
getchar() ;
#else
e4error_out( E4_ERROR_KEY ) ;
#ifndef S4TESTING
#ifndef S4PASCAL
getch() ;
#endif
#endif
#endif
#endif
#endif /* ifdef S4ERROR_HOOK */
exit(1) ;
}
#endif /* S4VB_DOS */
#endif /* S4WINDOWS */
#endif /* S4OS2PM */