|  | /* Test assert(). | 
|  | * | 
|  | * This is hairier than you'd think, involving games with | 
|  | * stdio and signals. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <signal.h> | 
|  | #include <stdlib.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <setjmp.h> | 
|  |  | 
|  | jmp_buf rec; | 
|  | char buf[160]; | 
|  |  | 
|  | static void | 
|  | sigabrt (int unused) | 
|  | { | 
|  | longjmp (rec, 1);  /* recover control */ | 
|  | } | 
|  |  | 
|  | #undef NDEBUG | 
|  | #include <assert.h> | 
|  | static void | 
|  | assert1 (void) | 
|  | { | 
|  | assert (1 == 2); | 
|  | } | 
|  |  | 
|  | static void | 
|  | assert2 (void) | 
|  | { | 
|  | assert (1 == 1); | 
|  | } | 
|  |  | 
|  |  | 
|  | #define NDEBUG | 
|  | #include <assert.h> | 
|  | static void | 
|  | assert3 (void) | 
|  | { | 
|  | assert (2 == 3); | 
|  | } | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | { | 
|  |  | 
|  | volatile int failed = 1; | 
|  |  | 
|  | fclose (stderr); | 
|  | stderr = tmpfile (); | 
|  | if(!stderr) | 
|  | abort (); | 
|  |  | 
|  | signal (SIGABRT, sigabrt); | 
|  |  | 
|  | if (!setjmp (rec)) | 
|  | assert1 (); | 
|  | else | 
|  | failed = 0;  /* should happen */ | 
|  |  | 
|  | if (!setjmp (rec)) | 
|  | assert2 (); | 
|  | else | 
|  | failed = 1; /* should not happen */ | 
|  |  | 
|  | if (!setjmp (rec)) | 
|  | assert3 (); | 
|  | else | 
|  | failed = 1; /* should not happen */ | 
|  |  | 
|  | rewind (stderr); | 
|  | fgets (buf, 160, stderr); | 
|  | if (!strstr (buf, "1 == 2")) | 
|  | failed = 1; | 
|  |  | 
|  | fgets (buf, 160, stderr); | 
|  | if (strstr (buf, "1 == 1")) | 
|  | failed = 1; | 
|  |  | 
|  | fgets (buf, 160, stderr); | 
|  | if (strstr (buf, "2 == 3")) | 
|  | failed = 1; | 
|  |  | 
|  | return failed; | 
|  | } |