Mercurial > ecos
diff packages/language/c/libc/current/tests/setjmp/setjmp.c @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/language/c/libc/current/tests/setjmp/setjmp.c @@ -0,0 +1,250 @@ +//=========================================================================== +// +// setjmp.c +// +// Tests for ANSI standard setjmp() and longjmp() functions +// +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Cygnus eCos Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://sourceware.cygnus.com/ecos +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Cygnus Operating System, released +// September 30, 1998. +// +// The Initial Developer of the Original Code is Cygnus. Portions created +// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): jlarmour@cygnus.co.uk +// Contributors: jlarmour@cygnus.co.uk +// Date: 1998-02-13 +// Purpose: +// Description: Contains test code for C library setjmp() and longjmp() +// functions +// The ANSI standard allows setjmp calls to be used ONLY in the +// forms: +// while (setjmp (jumpbuf)) +// while (setjmp (jumpbuf) < 42) +// while (!setjmp (jumpbuf)) +// setjmp (jumpbuf); +// result = setjmp(jumpbuf); +// +// Or "while" can also be "if" or "switch" or the implicit +// while of "for". +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +// Declarations for test system: +// +// TESTCASE_TYPE=CYG_TEST_MODULE +// COMPOUND_TESTCASE + +// CONFIGURATION + +#include <pkgconf/libc.h> // Configuration header + +// INCLUDES + +#include <cyg/infra/testcase.h> // Test infrastructure header +#include <setjmp.h> // Header for what we're testing +#include <sys/cstartup.h> // C library initialisation + +// GLOBALS + +#ifdef CYGPKG_LIBC + +static jmp_buf jbuf, jbuf2, jbuf3; + + +// FUNCTIONS + +static int +test_fun( void ) +{ + volatile int i=0; // add something to the stack to confuse things + + longjmp( jbuf, 5 ); + i+=5; + + return i; +} // test_fun(); + +#endif // ifdef CYGPKG_LIBC + +externC void +cyg_package_start( void ) +{ +#ifdef CYGPKG_LIBC + cyg_iso_c_start(); +#else + (void)main(0, NULL); +#endif +} // cyg_package_start() + + +int +main( int argc, char *argv[] ) +{ +#ifdef CYGPKG_LIBC + static int static_i=0; // temporary variable + int j=0; // ditto + volatile int vol_k=0, vol_l=0; // ditto +#endif + + CYG_TEST_INIT(); + + CYG_TEST_INFO("Starting tests from testcase " __FILE__ " for C library " + "setjmp()/longjmp() functions"); + +#ifdef CYGPKG_LIBC + // Test 1 + if ( setjmp(jbuf) == 0 ) + { + static_i=1; + longjmp(jbuf, 1); + static_i=2; + } // if + + CYG_TEST_PASS_FAIL( static_i==1, "Simple test 1" ); + + // Test 2 + j=2; + + if ( !setjmp(jbuf) ) + { + static_i=3; + longjmp(jbuf, 1); + static_i=4; + j=3; + } // if + + CYG_TEST_PASS_FAIL( (static_i==3) && (j==2), "Simple test 2" ); + + // Test 3 + + static_i=0; + switch (setjmp(jbuf)) + { + case 0: + static_i++; + if (static_i!=1) + CYG_TEST_FAIL("Test of value passed to longjmp()"); + else + longjmp(jbuf, 5); + break; + case 5: + static_i++; + CYG_TEST_PASS_FAIL( (static_i==2),"Test of value passed to longjmp()"); + break; + default: + CYG_TEST_FAIL( "Test of value passed to longjmp()"); + break; + } // switch + + // Test 3 + + static_i=0; + switch (setjmp(jbuf)) + { + case 0: + static_i++; + if (static_i!=1) + CYG_TEST_FAIL("Test of value passed to longjmp() being 0"); + else + longjmp(jbuf, 0); + break; + case 1: + static_i++; + CYG_TEST_PASS_FAIL( (static_i==2), + "Test of value passed to longjmp() being 0"); + break; + default: + CYG_TEST_FAIL( "Test of value passed to longjmp() being 0"); + break; + } // switch + + + // Test 4 + + vol_k=0; + static_i=0; + setjmp( jbuf ); + + static_i++; + setjmp( jbuf2 ); + + static_i++; + setjmp( jbuf3 ); + + if (vol_k==0) + { + vol_k++; + longjmp( jbuf2, 1 ); + } + else + { + CYG_TEST_PASS_FAIL( (vol_k==1) && (static_i==3), "Multiple setjmp's" ); + } + + // Test 5 + + vol_k=3; + if ( (j=setjmp(jbuf)) == 0 ) + { + volatile int l; // put something extra on the stack to confuse things + + vol_k++; + l=test_fun(); + l++; + vol_k=l; + } // if + + CYG_TEST_PASS_FAIL( (j==5) && (vol_k==4), "longjmp from a function" ); + + // Test 6 + + vol_k=0; + + vol_l=setjmp(jbuf); + + vol_k += 3; + + if (!vol_l) + test_fun(); + + vol_l=setjmp(jbuf); + + vol_k += 7; + + if (!vol_l) + test_fun(); + + CYG_TEST_PASS_FAIL ( (vol_k == 20), "Repeated longjmps from a function" ); + +#else // ifndef CYGPKG_LIBC + CYG_TEST_PASS("Testing is not applicable to this configuration"); +#endif // ifndef CYGPKG_LIBC + + CYG_TEST_FINISH("Finished tests from testcase " __FILE__ " for C library " + "setjmp()/longjmp() functions"); + +} // main() + +// EOF setjmp.c
