mescc: x86_64 support: Refactor to abstracted assembly, add x86_64.
[mes.git] / scaffold / tests / 70-printf.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * GNU Mes --- Maxwell Equations of Software
3  * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of GNU Mes.
6  *
7  * GNU Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * GNU Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <libmes.h>
22
23 #include <stdio.h>
24 #include <string.h>
25 #include <stdarg.h>
26
27 int
28 main ()
29 {
30 #if __GNUC__ && __x86_64__
31   return 0;
32 #endif
33   char *s = "mes";
34   char c = 'm';
35   int i = 3;
36   char buf[20];
37
38   printf ("c=%c\n", c);
39   sprintf (buf, "c=%c\n", c);
40   if (strcmp (buf, "c=m\n"))
41     return 1;
42
43   if (i != 3)
44     return 15;
45   printf ("i=%d\n", i);
46   sprintf (buf, "i=%d\n", i);
47   if (strcmp (buf, "i=3\n"))
48     return 2;
49
50   printf ("s=%s\n", s);
51   sprintf (buf, "s=%s\n", s);
52   if (strcmp (buf, "s=mes\n"))
53     return 3;
54
55   sprintf (buf, ">%3d<", 11);
56   eputs (buf); eputs ("\n");
57   if (strcmp (buf, "> 11<"))
58     return 4;
59
60   sprintf (buf, ">%03d<", 22);
61   eputs (buf); eputs ("\n");
62   if (strcmp (buf, ">022<"))
63     return 5;
64
65   sprintf (buf, ">%-10d<", 33);
66   eputs (buf); eputs ("\n");
67   if (strcmp (buf, ">33        <"))
68     return 6;
69
70   sprintf (buf, ">%0d<", 44);
71   eputs (buf); eputs ("\n");
72   if (strcmp (buf, ">44<"))
73     return 7;
74
75   printf (">>%.*s<<\n", 5, "hello, world");
76   printf (">>%.*s<<\n", 20, "hello, world");
77
78   printf (">>%.*s<<\n", 10, "foo");
79   printf (">>%*s<<\n", 10, "bar");
80   printf (">>%-*s<<\n", 10, "baz");
81
82   sprintf (buf, "%ld", 42);
83   eputs ("buf="); eputs (buf); eputs ("\n");
84   if (strcmp (buf, "42"))
85     return 8;
86
87   sprintf (buf, "%u", -1);
88   eputs ("buf="); eputs (buf); eputs ("\n");
89
90 #if __i386__
91   if (strcmp (buf, "4294967295"))
92     return 9;
93 #elif __x86_64__
94   if (strcmp (buf, "18446744073709551615"))
95     return 9;
96 #endif
97
98   sprintf (buf, ">>%.5s<<\n", "hello, world");
99   eputs ("buf="); eputs (buf);
100   if (strcmp (buf, ">>hello<<\n"))
101     return 10;
102
103   sprintf (buf, ">>%.*s<<\n", 5, "hello, world");
104   eputs ("buf="); eputs (buf);
105   if (strcmp (buf, ">>hello<<\n"))
106     return 11;
107
108   sprintf (buf, ">>%.*s<<\n", 20, "hello, world");
109   eputs ("buf="); eputs (buf);
110   if (strcmp (buf, ">>hello, world<<\n"))
111     return 12;
112
113   sprintf (buf, ">>%.*s<<\n", 10, "foo");
114   eputs ("buf="); eputs (buf);
115   if (strcmp (buf, ">>foo<<\n"))
116     return 13;
117
118   sprintf (buf, ">>%*s<<\n", 10, "bar");
119   eputs ("buf="); eputs (buf);
120   if (strcmp (buf, ">>       bar<<\n"))
121     return 14;
122
123   sprintf (buf, ">>%-*s<<\n", 10, "baz");
124   eputs ("buf="); eputs (buf);
125   if (strcmp (buf, ">>baz       <<\n"))
126     return 15;
127
128   sprintf (buf, ">>%ld<<\n", 12);
129   eputs ("buf="); eputs (buf);
130   if (strcmp (buf, ">>12<<\n"))
131     return 16;
132
133   sprintf (buf, ">>%o<<\n", 12);
134   eputs ("buf="); eputs (buf);
135   if (strcmp (buf, ">>14<<\n"))
136     return 17;
137
138   sprintf (buf, ">>%x<<\n", 12);
139   eputs ("buf="); eputs (buf);
140   if (strcmp (buf, ">>c<<\n"))
141     return 18;
142
143   sprintf (buf, ">>%X<<\n", 12);
144   eputs ("buf="); eputs (buf);
145   if (strcmp (buf, ">>C<<\n"))
146     return 19;
147
148   int n;
149 #if !__x86_64__
150   fprintf (stderr, "foo bar\n%n", &n);
151   if (n != 8)
152     return 20;
153 #endif
154
155   sprintf (buf, "foo%nbar\n", &n);
156   eputs ("buf="); eputs (buf); eputs ("\n");
157   if (strcmp (buf, "foobar\n"))
158     return 21;
159   if (n != 3)
160     return 22;
161
162 #if !__x86_64__
163   fprintf (stdout, "%12.8d\n", 12345);
164 #endif
165
166   sprintf (buf, "%12.8d\n", 12345);
167   eputs ("buf="); eputs (buf); eputs ("\n");
168   if (strcmp (buf, "    00012345\n"))
169     return 23;
170
171   return 0;
172 }