skip the tests which use floating point instructions (as their emulators don't support them).
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <setjmp.h>
 | |
| #include "test.h"
 | |
| 
 | |
| /*
 | |
|  * Sets i = 2 * i for each i in nums, until i == 0, but stops if
 | |
|  * 2 * i >= 1000.
 | |
|  *
 | |
|  * Uses setjmp() and longjmp() in libc.  For ACK's libc, the back end
 | |
|  * must provides EM's _gto_, and _gto_ must preserve the function
 | |
|  * return area.
 | |
|  */
 | |
| int nums1[]         = { 79, 245, 164, 403, 0};
 | |
| const int expect1[] = {158, 490, 328, 806, 0};
 | |
| int nums2[]         = {20, 221, 411, 643, 48, 272, 448, 0};
 | |
| const int expect2[] = {40, 442, 822, 643, 48, 272, 448, 0};
 | |
| int nums3[]         = {371, 265, 500, 124, 117, 0};
 | |
| const int expect3[] = {742, 530, 500, 124, 117, 0};
 | |
| int docount = 0;
 | |
| 
 | |
| int twice(int i, jmp_buf esc) {
 | |
| 	if (i >= 500)
 | |
| 		longjmp(esc, i);
 | |
| 	return 2 * i;
 | |
| }
 | |
| 
 | |
| void donums(int *nums, jmp_buf esc) {
 | |
| 	int *p;
 | |
| 
 | |
| 	docount++;
 | |
| 	for (p = nums; *p != 0; p++) {
 | |
| 		*p = twice(*p, esc);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int cknums(int *nums, const int *expect) {
 | |
| 	jmp_buf env;
 | |
| 	int ret;
 | |
| 
 | |
| 	ret = setjmp(env);
 | |
| 	if (ret == 0)
 | |
| 		donums(nums, env);
 | |
| 	for (;;) {
 | |
| 		ASSERT(*nums == *expect);
 | |
| 		if (*expect == 0)
 | |
| 			break;
 | |
| 		nums++;
 | |
| 		expect++;
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| int main(void) {
 | |
| 	ASSERT(cknums(nums1, expect1) == 0);
 | |
| 	ASSERT(cknums(nums2, expect2) == 643);
 | |
| 	ASSERT(cknums(nums3, expect3) == 500);
 | |
| 	ASSERT(docount == 3);
 | |
| 	finished();
 | |
| }
 |