which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@1014 c028cbd2-c16b-5b4b-a496-9718f37d4682
972 lines
26 KiB
C
Executable File
972 lines
26 KiB
C
Executable File
/* 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 */
|
||
|