test-distrib.c 1.68 KB
Newer Older
1 2 3 4
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

Jim Blandy's avatar
Jim Blandy committed
5 6
#include <stdio.h>

7 8 9 10
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

11 12 13 14
#ifndef O_RDONLY
#define O_RDONLY 0
#endif

Jim Blandy's avatar
Jim Blandy committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
/* Break string in two parts to avoid buggy C compilers that ignore characters
   after nulls in strings.  */

char string1[] = "Testing distribution of nonprinting chars:\n\
Should be 0177: \177 Should be 0377: \377 Should be 0212: \212.\n\
Should be 0000: ";

char string2[] = ".\n\
This file is read by the `test-distribution' program.\n\
If you change it, you will make that program fail.\n";

char buf[300];
  
/* Like `read' but keeps trying until it gets SIZE bytes or reaches eof.  */
int
cool_read (fd, buf, size)
     int fd;
     char *buf;
     int size;
{
  int num, sofar = 0;

  while (1)
    {
      if ((num = read (fd, buf + sofar, size - sofar)) == 0)
	return sofar;
      else if (num < 0)
	return num;
      sofar += num;
    }
}

47
int
48 49 50
main (argc, argv)
     int argc;
     char **argv;
Jim Blandy's avatar
Jim Blandy committed
51
{
52
  int fd;
Jim Blandy's avatar
Jim Blandy committed
53

54 55 56 57 58
  if (argc != 2)
    {
      fprintf (stderr, "Usage: %s testfile\n", argv[0]);
      exit (2);
    }
59
  fd = open (argv[1], O_RDONLY);
Jim Blandy's avatar
Jim Blandy committed
60 61
  if (fd < 0)
    {
62
      perror (argv[1]);
Jim Blandy's avatar
Jim Blandy committed
63 64 65 66 67 68 69
      exit (2);
    }
  if (cool_read (fd, buf, sizeof string1) != sizeof string1 ||
      strcmp (buf, string1) ||
      cool_read (fd, buf, sizeof string2) != sizeof string2 - 1 ||
      strncmp (buf, string2, sizeof string2 - 1))
    {
70
      fprintf (stderr, "Data in file `%s' has been damaged.\n\
Jim Blandy's avatar
Jim Blandy committed
71
Most likely this means that many nonprinting characters\n\
72 73
have been corrupted in the files of Emacs, and it will not work.\n",
	       argv[1]);
Jim Blandy's avatar
Jim Blandy committed
74 75 76 77 78 79
      exit (2);
    }
  close (fd);
#ifdef VMS
  exit (1);			/* On VMS, success is 1.  */
#endif
80
  return (0);
Jim Blandy's avatar
Jim Blandy committed
81
}