home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
excptn.zip
/
excptn
/
EXCPT.C
next >
Wrap
C/C++ Source or Header
|
1994-11-23
|
5KB
|
158 lines
#include "bas_incl.h"
#ifdef __OS2__
#pragma off (unreferenced)
static char exceptions_off;
ULONG APIENTRY ExcptHndlr(PEXCEPTIONREPORTRECORD p1,
PEXCEPTIONREGISTRATIONRECORD p2,
PCONTEXTRECORD p3,
PVOID p4)
{ pEXCPT_INFO exi, zexi;
if(!exceptions_off)
{ zexi = NULL;
for(exi = ((pEXCPT_STRUCT)p2)->excpt_info; exi; exi = exi->next)
{ if(p1->ExceptionNum == exi->exception_code)
{ (*(exi->hndlr))((const char *)(p1->ExceptionInfo),p1->ExceptionNum);
return XCPT_CONTINUE_EXECUTION;
}
else if(!exi->exception_code && (p1->ExceptionNum & 0x60000000))
zexi = exi;
}
if(zexi)
{ switch ((*(zexi->hndlr))((const char *)(p1->ExceptionInfo),p1->ExceptionNum)){
case EXCPT_UNLINK: zexi->exception_code = 0xFFFFFFFF;
case EXCPT_CONT: return XCPT_CONTINUE_EXECUTION;
} } }
return XCPT_CONTINUE_SEARCH;
}
void COMMON ExcptPost(unsigned long excpt, unsigned len,
const char *info, unsigned long flags)
{ char buff[500];
PEXCEPTIONREPORTRECORD pERR = (PEXCEPTIONREPORTRECORD)buff;
if(info && len)
memcpy(pERR->ExceptionInfo,info,len);
pERR->cParameters = len;
pERR->fHandlerFlags = (flags == NON_CONTINUABLE ? EH_NONCONTINUABLE : 0);
pERR->ExceptionNum = excpt;
(void)DosRaiseException(pERR);
}
void COMMON _ExcptLinkHandler(ULONG expt_code, void (_System *hndlr)(), pEXCPT_INFO *exi)
{ pEXCPT_INFO cur, prev;
APIRET err;
if((err = DosEnterCritSec()) != NO_ERROR)
ExcptPost(EXCPT_SYS_ERR,sizeof(err),(const char *)&err,NON_CONTINUABLE);
for(prev=NULL,cur=*exi; cur; prev=cur,cur=cur->next)
{ if(expt_code == cur->exception_code)
{ if(hndlr)
cur->hndlr = hndlr;
else
{ if(prev)
prev->next = cur->next;
else
*exi = cur->next;
MemoryRls(cur,sizeof(EXCPT_INFO));
}
goto gof;
} }
cur = MemoryAlloc(sizeof(EXCPT_INFO),1);
cur->next = *exi;
*exi = cur;
cur->hndlr = hndlr;
cur->exception_code = expt_code;
gof:
if((err = DosExitCritSec()) != NO_ERROR)
ExcptPost(EXCPT_SYS_ERR,sizeof(err),(const char *)&err,NON_CONTINUABLE);
}
void COMMON ExcptInitialize(pEXCPT_STRUCT exs)
{ exs->exrr.ExceptionHandler = ExcptHndlr;
(void)DosSetExceptionHandler(&exs->exrr);
exs->excpt_info = NULL;
exceptions_off = 0;
}
void COMMON ExcptTerminate(pEXCPT_STRUCT exs)
{ while(exs->excpt_info)
{ pEXCPT_INFO temp = exs->excpt_info;
exs->excpt_info = temp->next;
MemoryRls(temp,sizeof(EXCPT_INFO));
}
(void)DosUnsetExceptionHandler(&exs->exrr);
exceptions_off = 1;
}
void COMMON Fail(const char *s1, const char *s2, const char *s3, int num_par)
{ char buff[500];
pFAIL_EXCPT pfe = (pFAIL_EXCPT)buff;
int tot_len;
pfe->num_par = num_par;
tot_len = 0;
if(pfe->len1 = (s1 ? strlen(s1) : 0))
{ memcpy(pfe->texts+tot_len,s1,pfe->len1);
tot_len += pfe->len1;
}
if(pfe->len2 = (s2 ? strlen(s2): 0))
{ memcpy(pfe->texts+tot_len,s2,pfe->len2);
tot_len += pfe->len2;
}
if(pfe->len3 = (s3 ? strlen(s3) : 0))
{ memcpy(pfe->texts+tot_len,s3,pfe->len3);
tot_len += pfe->len3;
}
ExcptPost(EXCPT_FAILURE,tot_len + (sizeof(FAIL_EXCPT) - 1),buff,
NON_CONTINUABLE);
}
#else
#include "system.h"
#include "excptn.h"
#include <stdio.h>
#ifdef __WINDOWS__
#include <string.h>
void COMMON Fail(const char *str1,const char *str2, const char *str3,int stat)
{
int Length;
char *Message;
MessageBeep(MB_ICONEXCLAMATION);
Length = strlen(str1) + strlen(str2) + strlen(str3) + 16;
Message = malloc(Length);
wsprintf(Message,"%s %s %s Status=%d",str1,str2,str3,stat);
MessageBox(NULL,Message,"Sirius Failure",MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
free(Message);
}
#else
void COMMON Fail(const char *str1,const char *str2, const char *str3,int stat)
{
printf("\nFail SIGNAL occured!\n");
if (str1)
printf("%s\n",str1);
if (str2)
printf("%s\n",str2);
if (str3)
printf("%s\n",str3);
if (stat)
printf("%d\n",stat);
DioBeep();
exit(99);
}
#endif
void COMMON ExcptPost(unsigned long excpt, unsigned len,
const char *info, unsigned long flags)
{
char str[20];
sprintf(str,"\n EXCEPTION: %x \n",excpt);
Fail(str,NULL,NULL,0);
return;
}
#endif