59b74797fdddb797407905e9476b9fa20db236d5
[mes.git] / scaffold / t.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * 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  * 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #if __GNUC__
22 void
23 exit (int code)
24 {
25   asm (
26        "movl %0,%%ebx\n\t"
27        "movl $1,%%eax\n\t"
28        "int  $0x80"
29        : // no outputs "=" (r)
30        : "" (code)
31        );
32   // not reached
33   exit (0);
34 }
35
36 void
37 write (int fd, char const* s, int n)
38 {
39   int r;
40   //syscall (SYS_write, fd, s, n));
41   asm (
42        "mov %0,%%ebx\n\t"
43        "mov %1,%%ecx\n\t"
44        "mov %2,%%edx\n\t"
45
46        "mov $0x4,%%eax\n\t"
47        "int $0x80\n\t"
48        : // no outputs "=" (r)
49        : "" (fd), "" (s), "" (n)
50        : "eax", "ebx", "ecx", "edx"
51        );
52 }
53
54 #define STDOUT 1
55
56 typedef long size_t;
57 size_t
58 strlen (char const* s)
59 {
60   int i = 0;
61   while (s[i]) i++;
62   return i;
63 }
64
65 int
66 puts (char const* s)
67 {
68   //write (STDOUT, s, strlen (s));
69   //int i = write (STDOUT, s, strlen (s));
70   int i = strlen (s);
71   write (1, s, i);
72   return 0;
73 }
74
75 int
76 strcmp (char const* a, char const* b)
77 {
78   while (*a && *b && *a == *b) {a++;b++;}
79   return *a - *b;
80 }
81 int test ();
82 #endif
83
84 int
85 main (int argc, char *argv[])
86 {
87   puts ("t.c\n");
88   return test ();
89 }
90
91 int
92 test ()
93 {
94   int f = 0;
95   int t = 1;
96   int one = 1;
97
98   puts ("t: if (0)\n");
99   if (0) return 1;
100
101   puts ("t: if (f)\n");
102   if (f) return 1;
103
104   puts ("t: if (one > 1)\n");
105   if (one > 1) return 1;
106
107   puts ("t: if (one < 0)\n");
108   if (one < 0) return 1;
109
110   puts ("t: stlrlen (\"\")\n");
111   if (strlen ("")) return 1;
112
113   puts ("t: if (!1)\n");
114   if (!1) return 1;
115
116   puts ("t: if (one == 0)\n");
117   if (one == 0) return 1;
118
119   puts ("t: if (f != 0)\n");
120   if (one != 1) return 1;
121
122   puts ("t: if (1 && 0)\n");
123   if (1 && 0) return 1;
124
125   puts ("t: if (1)\n");
126   if (1) goto ok0;
127   return 1;
128  ok0:
129   
130   puts ("t: if (t)\n");
131   if (t) goto ok1;
132   return 1;
133  ok1:
134
135   puts ("t: if (one > 0)\n");
136   if (one > 0) goto ok2;
137   return 1;
138  ok2:
139
140   puts ("t: if (one < 2)\n");
141   if (one < 2) goto ok3;
142   return 1;
143  ok3:
144
145   puts ("t: if (strlen (\".\"))\n");
146   if (strlen (".")) goto ok4;
147   return 1;
148  ok4:
149
150   puts ("t: if (!0)\n");
151   if (!0) goto ok5;
152   return 1;
153  ok5:
154
155   puts ("t: if (one == 1)\n");
156   if (one == 1) goto ok6;
157   return 1;
158  ok6:
159
160   puts ("t: if (one != 0)\n");
161   if (one != 0) goto ok7;
162   return 1;
163  ok7:
164
165   puts ("t: if (1 && !0)\n");
166   if (1 && !0) goto ok8;
167   return 1;
168  ok8:
169
170   puts ("t: for (i=0; i<4; ++i)\n");
171   int i;
172   for (i=0; i<4; ++i);
173   if (i != 4) return i;
174
175   return 0;
176 }
177
178 #if __GNUC__
179 void
180 _start ()
181 {
182   // int r=main ();
183   // exit (r);
184   int r;
185   asm (
186        "mov %%ebp,%%eax\n\t"
187        "addl $8,%%eax\n\t"
188        "push %%eax\n\t"
189
190        "mov %%ebp,%%eax\n\t"
191        "addl $4,%%eax\n\t"
192        "movzbl (%%eax),%%eax\n\t"
193        "push %%eax\n\t"
194
195        "call main\n\t"
196        
197        "movl %%eax,%0\n\t"
198        : "=r" (r)
199        : //no inputs "" (&main)
200        );
201   exit (r);
202 }
203 #endif