mescc: Have micro-mes use strcmp to print help.
[mes.git] / scaffold / micro-mes.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 #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 #if __GNUC__
34 typedef long size_t;
35 void *malloc (size_t i);
36 int open (char const *s, int mode);
37 int read (int fd, int n);
38 void write (int fd, char const* s, int n);
39
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
103 #define EOF -1
104 #define STDIN 0
105 #define STDOUT 1
106 #define STDERR 2
107
108 //#include <stdio.h>
109 //#include <string.h>
110 //#include <stdlib.h>
111
112 int g_stdin;
113
114 size_t
115 strlen (char const* s)
116 {
117   int i = 0;
118   while (s[i]) i++;
119   return i;
120 }
121
122 int
123 strcmp (char const* a, char const* b)
124 {
125   while (*a && *b && *a == *b) {a++;b++;}
126   return *a - *b;
127 }
128
129 int
130 getc ()
131 {
132   return read (g_stdin, 1);
133 }
134
135 int
136 puts (char const* s)
137 {
138   //write (STDOUT, s, strlen (s));
139   //int i = write (STDOUT, s, strlen (s));
140   int i = strlen (s);
141   write (1, s, i);
142   return 0;
143 }
144
145 int
146 eputs (char const* s)
147 {
148   //write (STDERR, s, strlen (s));
149   //int i = write (STDERR, s, strlen (s));
150   int i = strlen (s);
151   write (2, s, i);
152   return 0;
153 }
154
155 int g_a;
156 int g_b;
157
158 #if 0
159 void
160 eputs2 (char const* s, int a)
161 {
162   g_a = a;
163   write (STDERR, s, strlen (s));
164   //return 0;
165 }
166
167 void
168 eputs3 (char const* s, int a, int b)
169 {
170   g_a = a;
171   g_b = b;
172   write (STDERR, s, strlen (s));
173   //return 0;
174 }
175
176 char const*
177 itoa (int x)
178 {
179   static char buf[10];
180   char *p = buf+9;
181   *p-- = 0;
182
183   int sign = x < 0;
184   if (sign)
185     x = -x;
186   
187   do
188     {
189       *p-- = '0' + (x % 10);
190       x = x / 10;
191     } while (x);
192
193   if (sign)
194     *p-- = '-';
195
196   return p+1;
197 }
198 #endif
199
200 void
201 assert_fail (char* s)
202 {
203   eputs ("assert fail:");
204   eputs (s);
205   eputs ("\n");
206   *((int*)0) = 0;
207 }
208
209 #endif
210
211 #define assert(x) ((x) ? (void)0 : assert_fail(#x))
212 #define false 0
213 #define true 1
214 typedef int bool;
215
216 int
217 main (int argc, char *argv[])
218 {
219   puts ("arg0=");
220   puts (argv[0]);
221   if (argc > 1)
222     {
223       puts ("\narg1=");
224       puts (argv[1]);
225       if (!strcmp (argv[1], "--help")) return puts ("Usage: mes [--dump|--load] < FILE");
226     }
227   puts ("\n");
228   eputs ("Strlen...\n");
229   puts ("Bye micro\n");
230   int i = argc;
231   //int i = strcmp (argv[1], "1");
232   return i;
233 }
234
235 #if __GNUC__
236 void
237 _start ()
238 {
239   int r;
240   asm (
241        "mov %%ebp,%%eax\n\t"
242        "addl $8,%%eax\n\t"
243        "push %%eax\n\t"
244
245        "mov %%ebp,%%eax\n\t"
246        "addl $4,%%eax\n\t"
247        "movzbl (%%eax),%%eax\n\t"
248        "push %%eax\n\t"
249
250        "call main\n\t"
251        "movl %%eax,%0\n\t"
252        : "=r" (r)
253        : //no inputs "" (&main)
254        );
255   exit (r);
256 }
257 #endif