1/* test-distrib.c --- testing distribution of nonprinting chars
2
3   Copyright (C) 1987, 1993, 1994, 1995, 1999, 2001, 2002, 2003,
4                 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5
6   This file is part of GNU Emacs.
7
8   GNU Emacs is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13   GNU Emacs is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with GNU Emacs; see the file COPYING.  If not, write to the
20   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21   Boston, MA 02110-1301, USA.  */
22
23#ifdef HAVE_CONFIG_H
24#include <config.h>
25#endif
26
27#include <stdio.h>
28
29#ifdef HAVE_FCNTL_H
30#include <fcntl.h>
31#endif
32
33#ifdef HAVE_UNISTD_H
34#include <unistd.h>
35#endif
36
37#ifndef O_RDONLY
38#define O_RDONLY 0
39#endif
40
41/* Break string in two parts to avoid buggy C compilers that ignore characters
42   after nulls in strings.  */
43
44char string1[] = "Testing distribution of nonprinting chars:\n\
45Should be 0177: \177 Should be 0377: \377 Should be 0212: \212.\n\
46Should be 0000: ";
47
48char string2[] = ".\n\
49This file is read by the `test-distribution' program.\n\
50If you change it, you will make that program fail.\n";
51
52char buf[300];
53
54/* Like `read' but keeps trying until it gets SIZE bytes or reaches eof.  */
55int
56cool_read (fd, buf, size)
57     int fd;
58     char *buf;
59     int size;
60{
61  int num, sofar = 0;
62
63  while (1)
64    {
65      if ((num = read (fd, buf + sofar, size - sofar)) == 0)
66	return sofar;
67      else if (num < 0)
68	return num;
69      sofar += num;
70    }
71}
72
73int
74main (argc, argv)
75     int argc;
76     char **argv;
77{
78  int fd;
79
80  if (argc != 2)
81    {
82      fprintf (stderr, "Usage: %s testfile\n", argv[0]);
83      exit (EXIT_FAILURE);
84    }
85  fd = open (argv[1], O_RDONLY);
86  if (fd < 0)
87    {
88      perror (argv[1]);
89      exit (EXIT_FAILURE);
90    }
91  if (cool_read (fd, buf, sizeof string1) != sizeof string1 ||
92      strcmp (buf, string1) ||
93      cool_read (fd, buf, sizeof string2) != sizeof string2 - 1 ||
94      strncmp (buf, string2, sizeof string2 - 1))
95    {
96      fprintf (stderr, "Data in file `%s' has been damaged.\n\
97Most likely this means that many nonprinting characters\n\
98have been corrupted in the files of Emacs, and it will not work.\n",
99	       argv[1]);
100      exit (EXIT_FAILURE);
101    }
102  close (fd);
103  return EXIT_SUCCESS;
104}
105
106/* arch-tag: 3a89005d-df98-4c32-aa9f-33570e16a26a
107   (do not change this comment) */
108
109/* test-distrib.c ends here */
110