mescc: Scaffolding of Nyacc compile experiments.
[mes.git] / scaffold / micro-mes.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016 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 #define MES_MINI 1
22
23 #if __GNUC__
24 #define  __NYACC__ 0
25 #define NYACC
26 #define NYACC2
27 #else
28 #define  __NYACC__ 1
29 #define NYACC nyacc
30 #define NYACC2 nyacc2
31 #endif
32
33 typedef long size_t;
34 void *malloc (size_t i);
35 int open (char const *s, int mode);
36 int read (int fd, int n);
37 void write (int fd, char const* s, int n);
38
39 #if __GNUC__
40 void
41 exit (int code)
42 {
43   asm (
44        "movl %0, %%ebx\n\t"
45        "movl $1,  %%eax\n\t"
46        "int  $0x80"
47        : // no outputs "=" (r)
48        : "" (code)
49        );
50   // not reached
51   exit (0);
52 }
53
54 int
55 open (char const *s, int mode)
56 {
57   //return syscall (SYS_open, s, mode);
58   return 0;
59 }
60
61 int
62 read (int fd, int n)
63 {
64   //syscall (SYS_read, 1, 1);
65   return 0;
66 }
67
68 void
69 write (int fd, char const* s, int n)
70 {
71   int r;
72   //syscall (SYS_write, fd, s, n));
73   asm (
74        "mov %0, %%ebx\n\t"
75        "mov %1, %%ecx\n\t"
76        "mov %2, %%edx\n\t"
77
78        "mov $0x4, %%eax\n\t"
79        "int $0x80\n\t"
80        : // no outputs "=" (r)
81        : "" (fd), "" (s), "" (n)
82        : "eax", "ebx", "ecx", "edx"
83        );
84 }
85
86 void *
87 malloc (size_t size)
88 {
89   int *n;
90   int len = size + sizeof (size);
91   //n = mmap (0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
92   *n = len;
93   return (void*)(n+1);
94 }
95
96 void
97 free (void *p)
98 {
99   int *n = (int*)p-1;
100   //munmap ((void*)p, *n);
101 }
102 #endif
103
104 #define EOF -1
105 #define STDIN 0
106 #define STDOUT 1
107 #define STDERR 2
108
109 //#include <stdio.h>
110 //#include <string.h>
111 //#include <stdlib.h>
112
113 int g_stdin;
114
115 #if __GNUC__
116 size_t
117 strlen (char const* s)
118 {
119   int i = 0;
120   while (s[i]) i++;
121   return i;
122 }
123
124 int
125 strcmp (char const* a, char const* b)
126 {
127   while (*a && *b && *a == *b) {*a++;b++;}
128   return *a == *b;
129 }
130
131 int
132 getc ()
133 {
134   return read (g_stdin, 1);
135 }
136
137 int
138 puts (char const* s)
139 {
140   write (STDOUT, s, strlen (s));
141   return 0;
142 }
143
144 int
145 eputs (char const* s)
146 {
147   write (STDERR, s, strlen (s));
148   return 0;
149 }
150
151 char const*
152 itoa (int x)
153 {
154   static char buf[10];
155   char *p = buf+9;
156   *p-- = 0;
157
158   int sign = x < 0;
159   if (sign)
160     x = -x;
161   
162   do
163     {
164       *p-- = '0' + (x % 10);
165       x = x / 10;
166     } while (x);
167
168   if (sign)
169     *p-- = '-';
170
171   return p+1;
172 }
173
174 void
175 assert_fail (char* s)
176 {
177   eputs ("assert fail:");
178   eputs (s);
179   eputs ("\n");
180   *((int*)0) = 0;
181 }
182
183 #endif
184
185 #define assert(x) ((x) ? (void)0 : assert_fail(#x))
186 #define false 0
187 #define true 1
188 typedef int bool;
189
190 int
191 main (int argc, char *argv[])
192 {
193   puts ("Hello main!\n");
194   //eputs (itoa (123));
195   eputs ("\n");
196   puts ("Bye micro!!\n");
197   //assert(!"boo");
198   return 41;
199 }
200
201 #if __GNUC__
202 void
203 _start ()
204 {
205   puts ("Hello micro-mes!\n");
206   int r;
207   asm (
208        "push $0\n\t"
209        "push $0\n\t"
210        "call main\n\t"
211        "movl %%eax,%0\n\t"
212        : "=r" (r)
213        : //no inputs "" (&main)
214        );
215
216   exit (r);
217 }
218 #endif