Blame assert/test-assert-perr.c

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