e40029cef58442882c051a197fbb5c2bbdb8b6bb
[pspp-builds.git] / tests / formats / inexactify.c
1 /* inexactify.c - PSPP test program.
2    Copyright (C) 2006 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or
5    modify it under the terms of the GNU General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful, but
10    WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17    02110-1301, USA. */
18
19 #include <ctype.h>
20 #include <stdbool.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 /* Replaces insignificant digits by # to facilitate textual
26    comparisons.  Not a perfect solution to the general-purpose
27    comparison problem, because rounding that affects earlier
28    digits can still cause differences. */
29 int
30 main (void)
31 {
32   bool in_quotes = false;
33   bool in_exponent = false;
34   int digits = 0;
35   
36   for (;;) 
37     {
38       int c = getchar ();
39       if (c == EOF)
40         break;
41       else if (c == '\n') 
42         in_quotes = false;
43       else if (c == '"') 
44         {
45           in_quotes = !in_quotes;
46           in_exponent = false;
47           digits = 0;
48         }
49       else if (in_quotes && !in_exponent) 
50         {
51           if (strchr ("+dDeE", c) != NULL || (c == '-' && digits))
52             in_exponent = true;
53           else if (strchr ("0123456789}JKLMNOPQR", c) != NULL)
54             {
55               if (digits || c >= '1')
56                 digits++;
57               if (digits > 13)
58                 c = isdigit (c) ? '#' : '@';
59             }
60         }
61       putchar (c);
62     }
63   return EXIT_SUCCESS;
64 }