ea50d71feb
prevents doing this in one pass.
146 lines
2.8 KiB
C
146 lines
2.8 KiB
C
/*
|
|
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
|
|
* All rights reserved.
|
|
*
|
|
* By using this file, you agree to the terms and conditions set
|
|
* forth in the LICENSE file which can be found at the top level of
|
|
* the sendmail distribution.
|
|
*/
|
|
|
|
#include <sm/gen.h>
|
|
SM_IDSTR(id, "@(#)$Id: t-exc.c,v 1.20 2001/09/11 04:04:49 gshapiro Exp $")
|
|
|
|
#include <string.h>
|
|
#include <sm/heap.h>
|
|
#include <sm/io.h>
|
|
#include <sm/test.h>
|
|
|
|
const SM_EXC_TYPE_T EtypeTest1 =
|
|
{
|
|
SmExcTypeMagic,
|
|
"E:test1",
|
|
"i",
|
|
sm_etype_printf,
|
|
"test1 exception argv[0]=%0",
|
|
};
|
|
|
|
const SM_EXC_TYPE_T EtypeTest2 =
|
|
{
|
|
SmExcTypeMagic,
|
|
"E:test2",
|
|
"i",
|
|
sm_etype_printf,
|
|
"test2 exception argv[0]=%0",
|
|
};
|
|
|
|
int
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
void *p;
|
|
int volatile x;
|
|
char *unknown, *cant;
|
|
|
|
sm_test_begin(argc, argv, "test exception handling");
|
|
|
|
/*
|
|
** SM_TRY
|
|
*/
|
|
|
|
cant = "can't happen";
|
|
x = 0;
|
|
SM_TRY
|
|
x = 1;
|
|
SM_END_TRY
|
|
SM_TEST(x == 1);
|
|
|
|
/*
|
|
** SM_FINALLY-0
|
|
*/
|
|
|
|
x = 0;
|
|
SM_TRY
|
|
x = 1;
|
|
SM_FINALLY
|
|
x = 2;
|
|
SM_END_TRY
|
|
SM_TEST(x == 2);
|
|
|
|
/*
|
|
** SM_FINALLY-1
|
|
*/
|
|
|
|
x = 0;
|
|
SM_TRY
|
|
SM_TRY
|
|
x = 1;
|
|
sm_exc_raisenew_x(&EtypeTest1, 17);
|
|
SM_FINALLY
|
|
x = 2;
|
|
sm_exc_raisenew_x(&EtypeTest2, 42);
|
|
SM_END_TRY
|
|
SM_EXCEPT(exc, "E:test2")
|
|
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
|
|
"got exception test2: can't happen\n");
|
|
SM_EXCEPT(exc, "E:test1")
|
|
SM_TEST(x == 2 && exc->exc_argv[0].v_int == 17);
|
|
if (!(x == 2 && exc->exc_argv[0].v_int == 17))
|
|
{
|
|
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
|
|
"can't happen: x=%d argv[0]=%d\n",
|
|
x, exc->exc_argv[0].v_int);
|
|
}
|
|
SM_EXCEPT(exc, "*")
|
|
{
|
|
unknown = "unknown exception: ";
|
|
SM_TEST(strcmp(unknown, cant) == 0);
|
|
}
|
|
SM_END_TRY
|
|
|
|
x = 3;
|
|
SM_TRY
|
|
x = 4;
|
|
sm_exc_raisenew_x(&EtypeTest1, 94);
|
|
SM_FINALLY
|
|
x = 5;
|
|
sm_exc_raisenew_x(&EtypeTest2, 95);
|
|
SM_EXCEPT(exc, "E:test2")
|
|
{
|
|
unknown = "got exception test2: ";
|
|
SM_TEST(strcmp(unknown, cant) == 0);
|
|
}
|
|
SM_EXCEPT(exc, "E:test1")
|
|
SM_TEST(x == 5 && exc->exc_argv[0].v_int == 94);
|
|
if (!(x == 5 && exc->exc_argv[0].v_int == 94))
|
|
{
|
|
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
|
|
"can't happen: x=%d argv[0]=%d\n",
|
|
x, exc->exc_argv[0].v_int);
|
|
}
|
|
SM_EXCEPT(exc, "*")
|
|
{
|
|
unknown = "unknown exception: ";
|
|
SM_TEST(strcmp(unknown, cant) == 0);
|
|
}
|
|
SM_END_TRY
|
|
|
|
SM_TRY
|
|
sm_exc_raisenew_x(&SmEtypeErr, "test %d", 0);
|
|
SM_EXCEPT(exc, "*")
|
|
#if DEBUG
|
|
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
|
|
"test 0 got an exception, as expected:\n");
|
|
sm_exc_print(exc, smioout);
|
|
#endif /* DEBUG */
|
|
return sm_test_end();
|
|
SM_END_TRY
|
|
|
|
p = sm_malloc_x((size_t)(-1));
|
|
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
|
|
"sm_malloc_x unexpectedly succeeded, returning %p\n", p);
|
|
unknown = "sm_malloc_x unexpectedly succeeded";
|
|
SM_TEST(strcmp(unknown, cant) == 0);
|
|
return sm_test_end();
|
|
}
|