aboutsummaryrefslogtreecommitdiffstats
path: root/minimise_number_string.c
blob: 59935641fd555e401a54923be473d6e23e7d7547 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* See LICENSE file for copyright and license details. */
#include "libsimple.h"
#ifndef TEST


char *
libsimple_minimise_number_string(char *s)
{
	char *p, *ret = s;
	size_t n;

	if (*s == '+')
		memmove(s, &s[1], strlen(s));

	p = strchr(s, '.');
	if (p) {
		p = strchr(p, '\0');
		while (p[-1] == '0')
			*--p = '\0';
		if (p[-1] == '.') {
			if (s[0] == '.') {
				s[0] = '0';
				return ret;
			} else if (s[0] == '-' && s[1] == '.') {
				s[1] = '0';
				return ret;
			}
			*--p = '\0';
		}
	}

	if (*s == '-')
		s = &s[1];

	for (p = s; *p == '0'; p++);
	n = (size_t)(p - s);
	if (!*p || *p == '.')
		n -= !!n;
	memmove(s, &s[n], strlen(&s[n]) + 1);

	return ret;
}


#else
#include "test.h"

int
main(void)
{
	char buf[1000];

	/* Some aspects are tested in libsimple.c */

	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "00100.00000")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "00100.1")), "100.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "00100.000001")), "100.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "00100.1000001")), "100.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "00100.0")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "00100.")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "100.00000")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "100.1")), "100.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "100.000001")), "100.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "100.1000001")), "100.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "100.0")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "100.")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "0.00000")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "0.1")), "0.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "0.000001")), "0.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "0.1000001")), "0.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "0.0")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "0.")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, ".00000")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, ".1")), ".1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, ".000001")), ".000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, ".1000001")), ".1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, ".0")), "0"));

	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+00100.00000")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+00100.1")), "100.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+00100.000001")), "100.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+00100.1000001")), "100.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+00100.0")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+00100.")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+100.00000")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+100.1")), "100.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+100.000001")), "100.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+100.1000001")), "100.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+100.0")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+100.")), "100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+0.00000")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+0.1")), "0.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+0.000001")), "0.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+0.1000001")), "0.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+0.0")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+0.")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+.00000")), "0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+.1")), ".1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+.000001")), ".000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+.1000001")), ".1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "+.0")), "0"));

	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-00100.00000")), "-100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-00100.1")), "-100.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-00100.000001")), "-100.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-00100.1000001")), "-100.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-00100.0")), "-100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-00100.")), "-100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-100.00000")), "-100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-100.1")), "-100.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-100.000001")), "-100.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-100.1000001")), "-100.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-100.0")), "-100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-100.")), "-100"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-0.00000")), "-0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-0.1")), "-0.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-0.000001")), "-0.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-0.1000001")), "-0.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-0.0")), "-0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-0.")), "-0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-.00000")), "-0"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-.1")), "-.1"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-.000001")), "-.000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-.1000001")), "-.1000001"));
	assert(!strcmp(libsimple_minimise_number_string(strcpy(buf, "-.0")), "-0"));

	return 0;
}

#endif