core: Prepare for the Hurd.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 30 Jun 2018 11:11:03 +0000 (13:11 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 30 Jun 2018 11:11:03 +0000 (13:11 +0200)
* lib/linux/libc.c: Move from lib/linux.c.
* lib/linux/gcc.c: Move from lib/linux-gcc.c.
* lib/linux/gnu.c: Move from lib/linux+gnu.c.
* lib/linux/libc.c: Move from lib/linux.c.
* lib/linux/mes.c: Move from lib/linux-mes.c.
* lib/linux/mini-gcc.c: Move from lib/linux-mini-gcc.c.
* lib/linux/mini-mes.c: Move from lib/linux-mini-mes.c.
* lib/linux/tcc.c: Move from lib/linux+tcc.c.
* lib/linux/crt0.c: Move from lib/crt0.c.
* lib/linux/crt1.c: Move from lib/crt1.c.
* lib/linux/crti.c: Move from lib/crti.c.
* lib/linux/crtn.c: Move from lib/crtn.c.
* build-aux/build-cc.sh: Update for new layout.
* build-aux/build-cc32.sh: Likewise.
* build-aux/build-mes.sh: Likewise.
* build-aux/cc-mes.sh: Likewise.
* build-aux/cc32-mes.sh: Likewise.
* lib/string/argz-count.c: New file taken from GNU C Library,
  relicensed.
* lib/string/argz-extract.c: New file taken from GNU C Library,
  relicensed.
* include/argz.h: New file.
* lib/string/memcpy.c: New file, extract from libc.
* lib/assert/assert.c: Likewise.

45 files changed:
AUTHORS
build-aux/build-cc32.sh
build-aux/build-mes.sh
build-aux/cc-mes.sh
build-aux/cc32-mes.sh
include/argz.h [new file with mode: 0644]
include/errno.h
lib/alloca.c [deleted file]
lib/assert/assert.c [new file with mode: 0644]
lib/binutils.c
lib/crt0.c [deleted file]
lib/crt1.c [deleted file]
lib/crti.c [deleted file]
lib/crtn.c [deleted file]
lib/libc+gnu.c
lib/libc+tcc.c
lib/libc-mini.c
lib/libc.c
lib/libg.c
lib/linux+gnu.c [deleted file]
lib/linux+tcc.c [deleted file]
lib/linux-gcc.c [deleted file]
lib/linux-mes.c [deleted file]
lib/linux-mini-gcc.c [deleted file]
lib/linux-mini-mes.c [deleted file]
lib/linux.c [deleted file]
lib/linux/crt0.c [new file with mode: 0644]
lib/linux/crt1.c [new file with mode: 0644]
lib/linux/crti.c [new file with mode: 0644]
lib/linux/crtn.c [new file with mode: 0644]
lib/linux/gcc.c [new file with mode: 0644]
lib/linux/gnu.c [new file with mode: 0644]
lib/linux/libc-mini.c [new file with mode: 0644]
lib/linux/libc.c [new file with mode: 0644]
lib/linux/mes.c [new file with mode: 0644]
lib/linux/mini-gcc.c [new file with mode: 0644]
lib/linux/mini-mes.c [new file with mode: 0644]
lib/linux/tcc.c [new file with mode: 0644]
lib/m4.c
lib/stdlib/abort.c [new file with mode: 0644]
lib/stdlib/alloca.c [new file with mode: 0644]
lib/stdlib/malloc.c [new file with mode: 0644]
lib/string/argz-count.c [new file with mode: 0644]
lib/string/argz-extract.c [new file with mode: 0644]
lib/string/memcpy.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index fdad0bd24a8ee82a5693166ddbc1514b8c7e2fbc..dad7087ff1c80270768f2b6e26f6fc9c32670986 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,7 +3,7 @@ Main author
 All files except the imported files listed below
 
 Jeremiah Orians <jeremiah@pdp10.guru>
-lib/libc.c (fopen)
+lib/libc+tcc.c (fopen)
 scaffold/tests/98-fopen.c
 
 Han-Wen Nienhuys <hanwen@xs4all.nl>
index bec1fdd3ff37cdd83186169dfa3492f532c64370..3df24aa97a43290d40f19d4e59f9c592b6876aae 100755 (executable)
@@ -71,10 +71,10 @@ CC32_CFLAGS=${CC32_CFLAGS-"
 -Wno-incompatible-pointer-types
 "}
 
-ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crt0
-ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crt1
-ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crti
-ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crtn
+ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/linux/crt0
+ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/linux/crt1
+ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/linux/crti
+ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/linux/crtn
 ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libc-mini
 ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libc
 ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libgetopt
index cca170da5d534ea133f85929b32076a74d7db9f7..1461fdc1b2a4ae60d104c87aecdbc385ede8fd57 100755 (executable)
@@ -105,10 +105,10 @@ if [ ! -d "$MES_SEED" ] \
 fi
 
 MES_ARENA=100000000
-ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/crt0
-ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/crt1
-ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/crti
-ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/crtn
+ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/linux/crt0
+ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/linux/crt1
+ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/linux/crti
+ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/linux/crtn
 ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/libc-mini
 ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/libc
 ARCHDIR=1 NOLINK=1 bash build-aux/cc-mes.sh lib/libgetopt
index 2553760892b0e684131089822387e3fd33f6082a..079212f1b391f5c655ae4597d425ae9d5e7f8f1b 100755 (executable)
@@ -57,7 +57,7 @@ if [ -z "$ARCHDIR" ]; then
     p="mes-"
 else
     b=${c##*/}
-    d=${c%/*}
+    d=${c%%/*}
     o="$d/x86-mes/$b"
     mkdir -p $d/x86-mes
 fi
index a6066a13489c25065d1c23e731a330c4dc417c5d..2ac327d9b598a130745890d14705bf1327e3cb2e 100755 (executable)
@@ -63,7 +63,7 @@ if [ -z "$ARCHDIR" ]; then
     p="$a-"
 else
     b=${c##*/}
-    d=${c%/*}
+    d=${c%%/*}
     o="$d/$arch/$b"
     mkdir -p $d/$arch
 fi
diff --git a/include/argz.h b/include/argz.h
new file mode 100644 (file)
index 0000000..2904ee2
--- /dev/null
@@ -0,0 +1,42 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __MES_ARGZ_H
+#define __MES_ARGZ_H 1
+
+#if WITH_GLIBC
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#undef __MES_ARGZ_H
+#include_next <argz.h>
+
+#else // ! WITH_GLIBC
+
+#ifndef libc_hidden_def
+#define libc_hidden_def(x)
+#define weak_alias(x,y)
+#endif
+
+size_t __argz_count (char const *argz, size_t len);
+void __argz_extract (char const *argz, size_t len, char **argv);
+
+#endif // ! WITH_GLIBC
+
+#endif // __MES_ARGZ_H
index 49c515c713fc888528b0067000db4a61dac45473..78ceabe73e2d1dc07f4ac80cadb00db0fa6e54c2 100644 (file)
@@ -27,6 +27,9 @@
 #undef __MES_ERRNO_H
 #include_next <errno.h>
 #else // ! WITH_GLIBC
+
+typedef int error_t;
+
 int errno;
 #define ENOENT   2
 #define EINTR    4
diff --git a/lib/alloca.c b/lib/alloca.c
deleted file mode 100644 (file)
index 53dbdc8..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* alloca.c -- allocate automatically reclaimed memory
-   (Mostly) portable public-domain implementation -- D A Gwyn
-
-   This implementation of the PWB library alloca function,
-   which is used to allocate space off the run-time stack so
-   that it is automatically reclaimed upon procedure exit,
-   was inspired by discussions with J. Q. Johnson of Cornell.
-
-   There are some preprocessor constants that can
-   be defined when compiling for your specific system, for
-   improved efficiency; however, the defaults should be okay.
-
-   The general concept of this implementation is to keep
-   track of all alloca-allocated blocks, and reclaim any
-   that are found to be deeper in the stack than the current
-   invocation.  This heuristic does not reclaim storage as
-   soon as it becomes invalid, but it will do so eventually.
-
-   As a special case, alloca(0) reclaims storage without
-   allocating any.  It is a good idea to use alloca(0) in
-   your main control loop, etc. to force garbage collection.  */
-
-#include <unistd.h>
-
-#define ALIGN_SIZE 4
-#define ADDRESS_FUNCTION(arg) &(arg)
-#define STACK_DIR -1
-
-union alloca_header
-{
-  char align[ALIGN_SIZE];      /* To force sizeof(union alloca_header).  */
-  struct
-    {
-      union alloca_header *next;               /* For chaining headers.  */
-      char *deep;              /* For stack depth measure.  */
-    } h;
-};
-
-static union alloca_header *last_alloca_header = NULL; /* -> last alloca header.  */
-
-/* Return a void * to at least SIZE bytes of storage,
-   which will be automatically reclaimed upon exit from
-   the procedure that called alloca.  Originally, this space
-   was supposed to be taken from the current stack frame of the
-   caller, but that method cannot be made to work for some
-   implementations of C, for example under Gould's UTX/32.  */
-
-void *
-alloca (size_t size)
-{
-  char probe;          /* Probes stack depth: */
-  char *depth = ADDRESS_FUNCTION (probe);
-
-  /* Reclaim garbage, defined as all alloca'd storage that
-     was allocated from deeper in the stack than currently.  */
-
-  {
-    union alloca_header *hp;   /* Traverses linked list.  */
-
-    for (hp = last_alloca_header; hp != NULL;)
-      if ((STACK_DIR > 0 && hp->h.deep > depth)
-         || (STACK_DIR < 0 && hp->h.deep < depth))
-       {
-         union alloca_header *np = hp->h.next;
-
-         free ((void *) hp);   /* Collect garbage.  */
-
-         hp = np;              /* -> next header.  */
-       }
-      else
-       break;                  /* Rest are not deeper.  */
-
-    last_alloca_header = hp;   /* -> last valid storage.  */
-
-  }
-
-  if (size == 0)
-    return NULL;               /* No allocation required.  */
-
-  /* Allocate combined header + user data storage.  */
-
-  {
-    void * new = malloc (sizeof (union alloca_header) + size);
-    /* Address of header.  */
-
-    if (new == 0)
-      abort();
-
-    ((union alloca_header *) new)->h.next = last_alloca_header;
-    ((union alloca_header *) new)->h.deep = depth;
-
-    last_alloca_header = (union alloca_header *) new;
-
-    /* User storage begins just after header.  */
-
-    return (void *) ((char *) new + sizeof (union alloca_header));
-  }
-}
diff --git a/lib/assert/assert.c b/lib/assert/assert.c
new file mode 100644 (file)
index 0000000..c72177b
--- /dev/null
@@ -0,0 +1,10 @@
+void
+assert_fail (char* s)
+{
+  eputs ("assert fail: ");
+  eputs (s);
+  eputs ("\n");
+  char *fail = s;
+  fail = 0;
+  *fail = 0;
+}
index f05869e3d0469222b4c5f09903e173a7ae58e224..857b2ff693f863044d83dfbdfa0333502731b88b 100644 (file)
@@ -244,7 +244,7 @@ sbrk (intptr_t delta)
 {
   if (delta >= 0)
     return malloc (delta);
-  return g_brk;
+  return __brk;
 }
 
 // binutils 2.30
diff --git a/lib/crt0.c b/lib/crt0.c
deleted file mode 100644 (file)
index 5a34f35..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-// no clue what crt0.o is and why gcc-2.6.3 needs it
-
-// instead of calling main, it seems to call either _main or ___main,
-// let's try _main first
-
-char **environ = 0;
-int _main (int argc, char *argv[]);
-
-#if __GNUC__
-
-void
-_start ()
-{
-  asm (
-       "mov     %%ebp,%%eax\n\t"
-       "addl    $4,%%eax\n\t"
-       "movzbl  (%%eax),%%eax\n\t"
-       "addl    $3,%%eax\n\t"
-       "shl     $2,%%eax\n\t"
-       "add     %%ebp,%%eax\n\t"
-       "movl    %%eax,%0\n\t"
-       : "=environ" (environ)
-       : //no inputs ""
-       );
-  asm (
-       "mov     %%ebp,%%eax\n\t"
-       "addl    $8,%%eax\n\t"
-       "push    %%eax\n\t"
-
-       "mov     %%ebp,%%eax\n\t"
-       "addl    $4,%%eax\n\t"
-       "movzbl  (%%eax),%%eax\n\t"
-       "push    %%eax\n\t"
-
-       "call    _main\n\t"
-
-       "mov     %%eax,%%ebx\n\t"
-       "mov     $1,%%eax\n\t"
-       "int     $0x80\n\t"
-       "hlt      \n\t"
-       :
-       );
-}
-
-#elif __MESC__
-
-int
-_start ()
-{
-  asm ("mov____%ebp,%eax");
-  asm ("add____$i8,%eax !4");
-
-  asm ("movzbl_(%eax),%eax");
-  asm ("add____$i8,%eax !3");
-
-  asm ("shl____$i8,%eax !0x02");
-  asm ("add____%ebp,%eax");
-  asm ("mov____%eax,0x32 &environ");
-
-  asm ("mov____%ebp,%eax");
-  asm ("add____$i8,%eax !8");
-  asm ("push___%eax");
-
-  asm ("mov____%ebp,%eax");
-  asm ("add____$i8,%eax !4");
-  asm ("movzbl_(%eax),%eax");
-  asm ("push___%eax");
-
-  _main ();
-
-  asm ("mov____%eax,%ebx");
-  asm ("mov____$i32,%eax %1");
-  asm ("int____$0x80");
-  asm ("hlt");
-}
-
-#endif
diff --git a/lib/crt1.c b/lib/crt1.c
deleted file mode 100644 (file)
index a399958..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-char **environ = 0;
-int main (int argc, char *argv[]);
-
-#if __MESC__
-
-int
-_start ()
-{
-  asm ("mov____%ebp,%eax");
-  asm ("add____$i8,%eax !4");
-
-  asm ("movzbl_(%eax),%eax");
-  asm ("add____$i8,%eax !3");
-
-  asm ("shl____$i8,%eax !0x02");
-  asm ("add____%ebp,%eax");
-  asm ("mov____%eax,0x32 &environ");
-
-  asm ("mov____%ebp,%eax");
-  asm ("add____$i8,%eax !8");
-  asm ("push___%eax");
-
-  asm ("mov____%ebp,%eax");
-  asm ("add____$i8,%eax !4");
-  asm ("movzbl_(%eax),%eax");
-  asm ("push___%eax");
-
-  main ();
-
-  asm ("mov____%eax,%ebx");
-  asm ("mov____$i32,%eax %1");
-  asm ("int____$0x80");
-  asm ("hlt");
-}
-
-#else // !__MESC__
-
-void
-_start ()
-{
-  asm (
-       "mov     %%ebp,%%eax\n\t"
-       "add     $4,%%eax\n\t"
-       "movzbl  (%%eax),%%eax\n\t"
-       "add     $3,%%eax\n\t"
-       "shl     $2,%%eax\n\t"
-       "add     %%ebp,%%eax\n\t"
-       "mov     %%eax,%0\n\t"
-       : "=r" (environ)
-       : //no inputs ""
-       );
-  asm (
-       "mov     %ebp,%eax\n\t"
-       "add     $8,%eax\n\t"
-       "push    %eax\n\t"
-
-       "mov     %ebp,%eax\n\t"
-       "add     $4,%eax\n\t"
-       "movzbl  (%eax),%eax\n\t"
-       "push    %eax\n\t"
-
-       "call    main\n\t"
-
-       "mov     %eax,%ebx\n\t"
-       "mov     $1,%eax\n\t"
-       "int     $0x80\n\t"
-       "hlt      \n\t"
-       );
-}
-
-#endif // !__MESC__
diff --git a/lib/crti.c b/lib/crti.c
deleted file mode 100644 (file)
index 1038f49..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
diff --git a/lib/crtn.c b/lib/crtn.c
deleted file mode 100644 (file)
index 1038f49..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
index abdedd344a8672872f523c24f0114ec323dcf5b2..98160b0b74f587e4fbdbaa925d2c9a1f1bd92fcd 100644 (file)
  */
 
 #include <libc+tcc.c>
-#include <linux+gnu.c>
+
+#if __GNU__
+#include <linux/gnu.c>
+#elif __linux__
+#include <linux/gnu.c>
+#else
+#error both __GNU__ and _linux__ are undefined, choose one
+#endif
+
 #include <m4.c>
 #include <binutils.c>
 #include <gcc.c>
-#include <alloca.c>
+#if !__GNU__
+#include <stdlib/alloca.c>
+#endif
 #include <glibc.c>
index 9ae8855820cbb839129481f7f45d6860c2bff8d9..877fed81d16312315c28b751b01aa39bfc3cbbc1 100644 (file)
 #include <unistd.h>
 
 #include <libc.c>
-#include <linux+tcc.c>
+
+#if __GNU__
+#include <hurd/tcc.c>
+#elif __linux__
+#include <linux/tcc.c>
+#else
+#error both __GNU__ and _linux__ are undefined, choose one
+#endif
 
 #if __MESC__
 
index 2e9539cea62cebaa7aeb54a7e423459d23fc22ef..aa7a2b5c5cec53499967e3b6336912d8abe3803e 100644 (file)
 
 #include <errno.h>
 
+#ifndef _SIZE_T
+#define _SIZE_T
+#ifndef __SIZE_T
+#define __SIZE_T
 #ifndef __MES_SIZE_T
 #define __MES_SIZE_T
 #undef size_t
 typedef unsigned long size_t;
 #endif
+#endif
+#endif
 
+#ifndef _SSIZE_T
+#define _SSIZE_T
+#ifndef __SSIZE_T
+#define __SSIZE_T
 #ifndef __MES_SSIZE_T
 #define __MES_SSIZE_T
 #undef ssize_t
 typedef long ssize_t;
 #endif
+#endif
+#endif
 
 ssize_t write (int filedes, void const *buffer, size_t size);
 
@@ -65,15 +77,13 @@ puts (char const* s)
   return oputs ("\n");
 }
 
-#if __MESC__
-
-#include <linux-mini-mes.c>
-
-#else // !__MESC__
-
-#include <linux-mini-gcc.c>
-
-#endif // !__MESC__
+#if __GNU__
+#include <hurd/libc-mini.c>
+#elif __linux__
+#include <linux/libc-mini.c>
+#else
+#error both __GNU__ and _linux__ are undefined, choose one
+#endif
 
 void (*__call_at_exit) (void);
 
@@ -84,17 +94,3 @@ exit (int code)
     (*__call_at_exit) ();
   _exit (code);
 }
-
-ssize_t
-write (int filedes, void const *buffer, size_t size)
-{
-  int r = _write (filedes, buffer, size);
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
index 4c53ba2c5b73c1ceca8b6c3aa6f699bf68d6312a..3efe18e6cccfa94568f9a150558f824f1d9dee28 100644 (file)
 #include <stdlib.h>
 #include <unistd.h>
 
-#if __MESC__
-
-#include <linux-mes.c>
-
-#else // !__MESC__
-
-#include <assert.h>
-
-#include <linux-gcc.c>
-
-#endif // !__MESC__
-
 #include <libc-mini.c>
 #include <libmes.c>
-#include <linux.c>
+
+#if __GNU__
+#include <hurd/libc.c>
+#elif __linux__
+#include <linux/libc.c>
+#else
+#error both __GNU__ and _linux__ are undefined, choose one
+#endif
 
 int g_stdin = 0;
 
@@ -63,6 +58,13 @@ __mes_debug ()
   return __mes_debug;
 }
 
+
+#if !___GNU__
+#include <string/memcpy.c>
+#include <stdlib/malloc.c>
+#include <assert/assert.c>
+#endif
+
 int
 getchar ()
 {
@@ -94,17 +96,6 @@ putc (int c, FILE* stream)
   return fdputc (c, (int)stream);
 }
 
-void
-assert_fail (char* s)
-{
-  eputs ("assert fail: ");
-  eputs (s);
-  eputs ("\n");
-  char *fail = s;
-  fail = 0;
-  *fail = 0;
-}
-
 int
 getc (FILE *stream)
 {
@@ -147,29 +138,6 @@ strcpy (char *dest, char const *src)
   return dest;
 }
 
-char *g_brk = 0;
-
-void *
-malloc (size_t size)
-{
-  if (!g_brk)
-    g_brk = brk (0);
-  if (brk (g_brk + size) == (void*)-1)
-    return 0;
-  char *p = g_brk;
-  g_brk += size;
-  return p;
-}
-
-void *
-memcpy (void *dest, void const *src, size_t n)
-{
-  char* p = dest;
-  char const* q = src;
-  while (n--) *p++ = *q++;
-  return dest;
-}
-
 void *
 realloc (void *ptr, size_t size)
 {
index b892ca06b2667105a49ce4458e97fd5256927cb3..7628c8b68ccb72a61358221e5ecfaf82afbf1809 100644 (file)
 #define sscanf _sscanf
 
 #include <libc+tcc.c>
-#include <linux+gnu.c>
+
+#if __GNU__
+#include <linux/gnu.c>
+#elif __linux__
+#include <linux/gnu.c>
+#else
+#error both __GNU__ and _linux__ are undefined, choose one
+#endif
+
 #include <m4.c>
 #include <binutils.c>
 #include <gcc.c>
diff --git a/lib/linux+gnu.c b/lib/linux+gnu.c
deleted file mode 100644 (file)
index 80eb874..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#define SYS_link      0x09
-#define SYS_getpid    0x14
-#define SYS_getuid    0x18
-#define SYS_kill      0x25
-#define SYS_rename    0x26
-#define SYS_mkdir     0x27
-#define SYS_dup       0x29
-#define SYS_pipe      0x2a
-#define SYS_getgid    0x2f
-#define SYS_signal    0x30
-#define SYS_fcntl     0x37
-#define SYS_dup2      0x3f
-#define SYS_getrusage 0x4d
-#define SYS_lstat     0x6b
-#define SYS_setitimer 0x68
-#define SYS_fstat     0x6c
-#define SYS_nanosleep 0xa2
-
-#include <sys/resource.h>
-
-int
-link (char const *old_name, char const *new_name)
-{
-  return _sys_call2 (SYS_link, (int)old_name, (int)new_name);
-}
-
-pid_t
-getpid ()
-{
-  return _sys_call (SYS_getpid);
-}
-
-uid_t
-getuid ()
-{
-  return _sys_call (SYS_getuid);
-}
-
-int
-kill (pid_t pid, int signum)
-{
-  return _sys_call2 (SYS_kill, (int)pid, (int)signum);
-}
-
-int
-rename (char const *old_name, char const *new_name)
-{
-  return _sys_call2 (SYS_rename, (int)old_name, (int)new_name);
-}
-
-int
-mkdir (char const *file_name, mode_t mode)
-{
-  return _sys_call2 (SYS_mkdir, (int)file_name, (int)mode);
-}
-
-int
-dup (int old)
-{
-  return _sys_call1 (SYS_dup, (int)old);
-}
-
-gid_t
-getgid ()
-{
-  return _sys_call (SYS_getgid);
-}
-
-#if __MESC__
-void *
-signal (int signum, void * action)
-#else
-sighandler_t
-signal (int signum, sighandler_t action)
-#endif
-{
-  return _sys_call2 (SYS_signal, signum, action);
-}
-
-int
-fcntl (int filedes, int command, ...)
-{
-  va_list ap;
-  va_start (ap, command);
-  int data = va_arg (ap, int);
-  int r = _sys_call3 (SYS_fcntl, (int)filedes, (int)command, (int)data);
-  va_end (ap);
-  return r;
-}
-
-int
-pipe (int filedes[2])
-{
-  return _sys_call1 (SYS_pipe, (int)filedes);
-}
-
-int
-dup2 (int old, int new)
-{
-  return _sys_call2 (SYS_dup2, (int)old, (int)new);
-}
-
-int
-getrusage (int processes, struct rusage *rusage)
-{
-  return _sys_call2 (SYS_getrusage, (int)processes, (int)rusage);
-}
-
-int
-lstat (char const *file_name, struct stat *statbuf)
-{
-  return _sys_call2 (SYS_lstat, (int)file_name, (int)statbuf);
-}
-
-int
-nanosleep (const struct timespec *requested_time,
-           struct timespec *remaining)
-{
-  return _sys_call2 (SYS_nanosleep, (int)requested_time, (int)remaining);
-}
-
-int
-setitimer (int which, struct itimerval const *new,
-          struct itimerval *old)
-{
-  return _sys_call3 (SYS_setitimer, (int)which, (int)new, (int)old);
-}
-
-int
-fstat (int fd, struct stat *statbuf)
-{
-  return _sys_call2 (SYS_fstat, (int)fd, (int)statbuf);
-}
diff --git a/lib/linux+tcc.c b/lib/linux+tcc.c
deleted file mode 100644 (file)
index 092d65d..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#define SYS_close  0x06
-#define SYS_lseek  0x13
-#define SYS_unlink 0x0a
-#define SYS_rmdir  0x28
-#define SYS_stat   0x6a
-#define SYS_getcwd 0xb7
-
-int
-close (int filedes)
-{
-  if (_ungetc_fd == filedes)
-    {
-      _ungetc_pos = -1;
-      _ungetc_fd = -1;
-    }
-  return _sys_call1 (SYS_close, (int)filedes);
-}
-
-off_t
-lseek (int filedes, off_t offset, int whence)
-{
-  return _sys_call3 (SYS_lseek, (int)filedes, (int)offset, (int)whence);
-}
-
-int
-unlink (char const *file_name)
-{
-  return _sys_call1 (SYS_unlink, (int)file_name);
-}
-
-int
-rmdir (char const *file_name)
-{
-  return _sys_call1 (SYS_rmdir, (int)file_name);
-}
-
-int
-stat (char const *file_name, struct stat *statbuf)
-{
-  return _sys_call2 (SYS_stat, (int)file_name, (int)statbuf);
-}
-
-char *
-getcwd (char *buffer, size_t size)
-{
-  return _sys_call2 (SYS_getcwd, (int)buffer, (int)size);
-}
diff --git a/lib/linux-gcc.c b/lib/linux-gcc.c
deleted file mode 100644 (file)
index fd61778..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <errno.h>
-
-int
-_sys_call (int sys_call)
-{
-  int r;
-  asm (
-       "mov    %1,%%eax\n\t"
-       "int    $0x80\n\t"
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "rm" (sys_call)
-       : "eax"
-       );
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
-
-int
-_sys_call1 (int sys_call, int one)
-{
-  int r;
-  asm (
-       "mov    %1,%%eax\n\t"
-       "mov    %2,%%ebx\n\t"
-       "int    $0x80\n\t"
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "rm" (sys_call), "rm" (one)
-       : "eax", "ebx"
-       );
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
-
-int
-_sys_call2 (int sys_call, int one, int two)
-{
-  int r;
-  asm (
-       "mov    %1,%%eax\n\t"
-       "mov    %2,%%ebx\n\t"
-       "mov    %3,%%ecx\n\t"
-       "int    $0x80\n\t"
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "rm" (sys_call), "rm" (one), "rm" (two)
-       : "eax", "ebx", "ecx"
-       );
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
-
-int
-_sys_call3 (int sys_call, int one, int two, int three)
-{
-  int r;
-  asm (
-       "mov    %2,%%ebx\n\t"
-       "mov    %3,%%ecx\n\t"
-       "mov    %4,%%edx\n\t"
-       "mov    %1,%%eax\n\t"
-       "int    $0x80\n\t"
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "rm" (sys_call), "rm" (one), "rm" (two), "rm" (three)
-       : "eax", "ebx", "ecx", "edx"
-       );
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
diff --git a/lib/linux-mes.c b/lib/linux-mes.c
deleted file mode 100644 (file)
index 4063378..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <errno.h>
-
-int
-__sys_call (int sys_call)
-{
-  asm ("mov____0x8(%ebp),%eax !8");
-  asm ("int____$0x80");
-}
-
-int
-__sys_call1 (int sys_call, int one)
-{
-  asm ("mov____0x8(%ebp),%eax !8");
-  asm ("mov____0x8(%ebp),%ebx !12");
-  asm ("int____$0x80");
-}
-
-int
-__sys_call2 (int sys_call, int one, int two)
-{
-  asm ("mov____0x8(%ebp),%eax !8");
-  asm ("mov____0x8(%ebp),%ebx !12");
-  asm ("mov____0x8(%ebp),%ecx !16");
-  asm ("int____$0x80");
-}
-
-int
-__sys_call3 (int sys_call, int one, int two, int three)
-{
-  asm ("mov____0x8(%ebp),%eax !8");
-  asm ("mov____0x8(%ebp),%ebx !12");
-  asm ("mov____0x8(%ebp),%ecx !16");
-  asm ("mov____0x8(%ebp),%edx !20");
-  asm ("int____$0x80");
-}
-
-int
-_sys_call (int sys_call)
-{
-  int r = __sys_call (sys_call);
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
-
-int
-_sys_call1 (int sys_call, int one)
-{
-  int r = __sys_call1 (sys_call, one);
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
-
-int
-_sys_call2 (int sys_call, int one, int two)
-{
-  int r = __sys_call2 (sys_call, one, two);
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
-
-int
-_sys_call3 (int sys_call, int one, int two, int three)
-{
-  int r = __sys_call3 (sys_call, one, two, three);
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
diff --git a/lib/linux-mini-gcc.c b/lib/linux-mini-gcc.c
deleted file mode 100644 (file)
index 40a7961..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#define SYS_exit   "0x01"
-#define SYS_write  "0x04"
-
-void
-_exit (int code)
-{
-  asm (
-       "mov    $"SYS_exit",%%eax\n\t"
-       "mov    %0,%%ebx\n\t"
-       "int    $0x80\n\t"
-       : // no outputs "=" (r)
-       : "rm" (code)
-       );
-  // not reached
-  _exit (0);
-}
-
-ssize_t
-_write (int filedes, void const *buffer, size_t size)
-{
-  int r;
-  asm (
-       "mov    $"SYS_write",%%eax\n\t"
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-       "mov    %3,%%edx\n\t"
-       "int    $0x80\n\t"
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "rm" (filedes), "rm" (buffer), "rm" (size)
-       : "eax", "ebx", "ecx", "edx"
-       );
-  return r;
-}
diff --git a/lib/linux-mini-mes.c b/lib/linux-mini-mes.c
deleted file mode 100644 (file)
index ef57ac1..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-void
-_exit ()
-{
-  asm ("mov____$i32,%eax SYS_exit");
-  asm ("mov____0x8(%ebp),%ebx !8");
-  asm ("int____$0x80");
-}
-
-void
-_write ()
-{
-  asm ("mov____$i32,%eax SYS_write");
-  asm ("mov____0x8(%ebp),%ebx !8");
-  asm ("mov____0x8(%ebp),%ecx !12");
-  asm ("mov____0x8(%ebp),%edx !16");
-  asm ("int____$0x80");
-}
diff --git a/lib/linux.c b/lib/linux.c
deleted file mode 100644 (file)
index 454aa7b..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of Mes.
- *
- * Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <fcntl.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <libmes.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-
-#define SYS_fork    0x02
-#define SYS_read    0x03
-#define SYS_open    0x05
-#define SYS_waitpid 0x07
-#define SYS_execve  0x0b
-#define SYS_chmod   0x0f
-#define SYS_access  0x21
-#define SYS_brk     0x2d
-#define SYS_ioctl   0x36
-#define SYS_fsync   0x76
-
-int
-fork ()
-{
-  return _sys_call (SYS_fork);
-}
-
-ssize_t
-read (int filedes, void *buffer, size_t size)
-{
-  return _sys_call3 (SYS_read, (int)filedes, (int)buffer, (int)size);
-}
-
-int
-open (char const *file_name, int flags, ...)
-{
-  va_list ap;
-  va_start (ap, flags);
-  int mask = va_arg (ap, int);
-#if !MES_BOOTSTRAP
-  if (!flags)
-    {
-      _ungetc_pos = -1;
-      _ungetc_fd = -1;
-    }
-#endif
-  int r = _sys_call3 (SYS_open, (int)file_name, (int)flags, (int)mask);
-  va_end (ap);
-  return r;
-}
-
-pid_t
-waitpid (pid_t pid, int *status_ptr, int options)
-{
-  return _sys_call3 (SYS_waitpid, (int)pid, (int)status_ptr, (int)options);
-}
-
-int
-execve (char const* file_name, char *const argv[], char *const env[])
-{
-  return _sys_call3 (SYS_execve, (int)file_name, (int)argv, (int)env);
-}
-
-int
-chmod (char const *file_name, mode_t mask)
-{
-  return _sys_call2 (SYS_chmod, (int)file_name, (int)mask);
-}
-
-int
-access (char const *file_name, int how)
-{
-  return _sys_call2 (SYS_access, (int)file_name, (int)how);
-}
-
-int
-brk (void *addr)
-{
-  return _sys_call1 (SYS_brk, (int)addr);
-}
-
-int
-ioctl (int filedes, unsigned long command, ...)
-{
-  va_list ap;
-  va_start (ap, command);
-  int data = va_arg (ap, int);
-  int r = _sys_call3 (SYS_ioctl, (int)filedes, (int)command, (int)data);
-  va_end (ap);
-  return r;
-}
-
-int
-fsync (int filedes)
-{
-  return _sys_call1 (SYS_fsync, (int)filedes);
-}
diff --git a/lib/linux/crt0.c b/lib/linux/crt0.c
new file mode 100644 (file)
index 0000000..5a34f35
--- /dev/null
@@ -0,0 +1,97 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// no clue what crt0.o is and why gcc-2.6.3 needs it
+
+// instead of calling main, it seems to call either _main or ___main,
+// let's try _main first
+
+char **environ = 0;
+int _main (int argc, char *argv[]);
+
+#if __GNUC__
+
+void
+_start ()
+{
+  asm (
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "addl    $3,%%eax\n\t"
+       "shl     $2,%%eax\n\t"
+       "add     %%ebp,%%eax\n\t"
+       "movl    %%eax,%0\n\t"
+       : "=environ" (environ)
+       : //no inputs ""
+       );
+  asm (
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $8,%%eax\n\t"
+       "push    %%eax\n\t"
+
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "push    %%eax\n\t"
+
+       "call    _main\n\t"
+
+       "mov     %%eax,%%ebx\n\t"
+       "mov     $1,%%eax\n\t"
+       "int     $0x80\n\t"
+       "hlt      \n\t"
+       :
+       );
+}
+
+#elif __MESC__
+
+int
+_start ()
+{
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !4");
+
+  asm ("movzbl_(%eax),%eax");
+  asm ("add____$i8,%eax !3");
+
+  asm ("shl____$i8,%eax !0x02");
+  asm ("add____%ebp,%eax");
+  asm ("mov____%eax,0x32 &environ");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !8");
+  asm ("push___%eax");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !4");
+  asm ("movzbl_(%eax),%eax");
+  asm ("push___%eax");
+
+  _main ();
+
+  asm ("mov____%eax,%ebx");
+  asm ("mov____$i32,%eax %1");
+  asm ("int____$0x80");
+  asm ("hlt");
+}
+
+#endif
diff --git a/lib/linux/crt1.c b/lib/linux/crt1.c
new file mode 100644 (file)
index 0000000..a399958
--- /dev/null
@@ -0,0 +1,91 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+char **environ = 0;
+int main (int argc, char *argv[]);
+
+#if __MESC__
+
+int
+_start ()
+{
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !4");
+
+  asm ("movzbl_(%eax),%eax");
+  asm ("add____$i8,%eax !3");
+
+  asm ("shl____$i8,%eax !0x02");
+  asm ("add____%ebp,%eax");
+  asm ("mov____%eax,0x32 &environ");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !8");
+  asm ("push___%eax");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !4");
+  asm ("movzbl_(%eax),%eax");
+  asm ("push___%eax");
+
+  main ();
+
+  asm ("mov____%eax,%ebx");
+  asm ("mov____$i32,%eax %1");
+  asm ("int____$0x80");
+  asm ("hlt");
+}
+
+#else // !__MESC__
+
+void
+_start ()
+{
+  asm (
+       "mov     %%ebp,%%eax\n\t"
+       "add     $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "add     $3,%%eax\n\t"
+       "shl     $2,%%eax\n\t"
+       "add     %%ebp,%%eax\n\t"
+       "mov     %%eax,%0\n\t"
+       : "=r" (environ)
+       : //no inputs ""
+       );
+  asm (
+       "mov     %ebp,%eax\n\t"
+       "add     $8,%eax\n\t"
+       "push    %eax\n\t"
+
+       "mov     %ebp,%eax\n\t"
+       "add     $4,%eax\n\t"
+       "movzbl  (%eax),%eax\n\t"
+       "push    %eax\n\t"
+
+       "call    main\n\t"
+
+       "mov     %eax,%ebx\n\t"
+       "mov     $1,%eax\n\t"
+       "int     $0x80\n\t"
+       "hlt      \n\t"
+       );
+}
+
+#endif // !__MESC__
diff --git a/lib/linux/crti.c b/lib/linux/crti.c
new file mode 100644 (file)
index 0000000..1038f49
--- /dev/null
@@ -0,0 +1,19 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
diff --git a/lib/linux/crtn.c b/lib/linux/crtn.c
new file mode 100644 (file)
index 0000000..1038f49
--- /dev/null
@@ -0,0 +1,19 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
diff --git a/lib/linux/gcc.c b/lib/linux/gcc.c
new file mode 100644 (file)
index 0000000..fd61778
--- /dev/null
@@ -0,0 +1,115 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <errno.h>
+
+int
+_sys_call (int sys_call)
+{
+  int r;
+  asm (
+       "mov    %1,%%eax\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "rm" (sys_call)
+       : "eax"
+       );
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
+
+int
+_sys_call1 (int sys_call, int one)
+{
+  int r;
+  asm (
+       "mov    %1,%%eax\n\t"
+       "mov    %2,%%ebx\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "rm" (sys_call), "rm" (one)
+       : "eax", "ebx"
+       );
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
+
+int
+_sys_call2 (int sys_call, int one, int two)
+{
+  int r;
+  asm (
+       "mov    %1,%%eax\n\t"
+       "mov    %2,%%ebx\n\t"
+       "mov    %3,%%ecx\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "rm" (sys_call), "rm" (one), "rm" (two)
+       : "eax", "ebx", "ecx"
+       );
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
+
+int
+_sys_call3 (int sys_call, int one, int two, int three)
+{
+  int r;
+  asm (
+       "mov    %2,%%ebx\n\t"
+       "mov    %3,%%ecx\n\t"
+       "mov    %4,%%edx\n\t"
+       "mov    %1,%%eax\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "rm" (sys_call), "rm" (one), "rm" (two), "rm" (three)
+       : "eax", "ebx", "ecx", "edx"
+       );
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
diff --git a/lib/linux/gnu.c b/lib/linux/gnu.c
new file mode 100644 (file)
index 0000000..80eb874
--- /dev/null
@@ -0,0 +1,153 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define SYS_link      0x09
+#define SYS_getpid    0x14
+#define SYS_getuid    0x18
+#define SYS_kill      0x25
+#define SYS_rename    0x26
+#define SYS_mkdir     0x27
+#define SYS_dup       0x29
+#define SYS_pipe      0x2a
+#define SYS_getgid    0x2f
+#define SYS_signal    0x30
+#define SYS_fcntl     0x37
+#define SYS_dup2      0x3f
+#define SYS_getrusage 0x4d
+#define SYS_lstat     0x6b
+#define SYS_setitimer 0x68
+#define SYS_fstat     0x6c
+#define SYS_nanosleep 0xa2
+
+#include <sys/resource.h>
+
+int
+link (char const *old_name, char const *new_name)
+{
+  return _sys_call2 (SYS_link, (int)old_name, (int)new_name);
+}
+
+pid_t
+getpid ()
+{
+  return _sys_call (SYS_getpid);
+}
+
+uid_t
+getuid ()
+{
+  return _sys_call (SYS_getuid);
+}
+
+int
+kill (pid_t pid, int signum)
+{
+  return _sys_call2 (SYS_kill, (int)pid, (int)signum);
+}
+
+int
+rename (char const *old_name, char const *new_name)
+{
+  return _sys_call2 (SYS_rename, (int)old_name, (int)new_name);
+}
+
+int
+mkdir (char const *file_name, mode_t mode)
+{
+  return _sys_call2 (SYS_mkdir, (int)file_name, (int)mode);
+}
+
+int
+dup (int old)
+{
+  return _sys_call1 (SYS_dup, (int)old);
+}
+
+gid_t
+getgid ()
+{
+  return _sys_call (SYS_getgid);
+}
+
+#if __MESC__
+void *
+signal (int signum, void * action)
+#else
+sighandler_t
+signal (int signum, sighandler_t action)
+#endif
+{
+  return _sys_call2 (SYS_signal, signum, action);
+}
+
+int
+fcntl (int filedes, int command, ...)
+{
+  va_list ap;
+  va_start (ap, command);
+  int data = va_arg (ap, int);
+  int r = _sys_call3 (SYS_fcntl, (int)filedes, (int)command, (int)data);
+  va_end (ap);
+  return r;
+}
+
+int
+pipe (int filedes[2])
+{
+  return _sys_call1 (SYS_pipe, (int)filedes);
+}
+
+int
+dup2 (int old, int new)
+{
+  return _sys_call2 (SYS_dup2, (int)old, (int)new);
+}
+
+int
+getrusage (int processes, struct rusage *rusage)
+{
+  return _sys_call2 (SYS_getrusage, (int)processes, (int)rusage);
+}
+
+int
+lstat (char const *file_name, struct stat *statbuf)
+{
+  return _sys_call2 (SYS_lstat, (int)file_name, (int)statbuf);
+}
+
+int
+nanosleep (const struct timespec *requested_time,
+           struct timespec *remaining)
+{
+  return _sys_call2 (SYS_nanosleep, (int)requested_time, (int)remaining);
+}
+
+int
+setitimer (int which, struct itimerval const *new,
+          struct itimerval *old)
+{
+  return _sys_call3 (SYS_setitimer, (int)which, (int)new, (int)old);
+}
+
+int
+fstat (int fd, struct stat *statbuf)
+{
+  return _sys_call2 (SYS_fstat, (int)fd, (int)statbuf);
+}
diff --git a/lib/linux/libc-mini.c b/lib/linux/libc-mini.c
new file mode 100644 (file)
index 0000000..cd9e2d8
--- /dev/null
@@ -0,0 +1,43 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if __MESC__
+
+#include <linux/mini-mes.c>
+
+#else // !__MESC__
+
+#include <linux/mini-gcc.c>
+
+#endif // !__MESC__
+
+ssize_t
+write (int filedes, void const *buffer, size_t size)
+{
+  int r = _write (filedes, buffer, size);
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
diff --git a/lib/linux/libc.c b/lib/linux/libc.c
new file mode 100644 (file)
index 0000000..0b6ad18
--- /dev/null
@@ -0,0 +1,128 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <libmes.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#define SYS_fork    0x02
+#define SYS_read    0x03
+#define SYS_open    0x05
+#define SYS_waitpid 0x07
+#define SYS_execve  0x0b
+#define SYS_chmod   0x0f
+#define SYS_access  0x21
+#define SYS_brk     0x2d
+#define SYS_ioctl   0x36
+#define SYS_fsync   0x76
+
+#if __MESC__
+
+#include <linux/mes.c>
+
+#else // !__MESC__
+
+#include <assert.h>
+
+#include <linux/gcc.c>
+
+#endif // !__MESC__
+
+int
+fork ()
+{
+  return _sys_call (SYS_fork);
+}
+
+ssize_t
+read (int filedes, void *buffer, size_t size)
+{
+  return _sys_call3 (SYS_read, (int)filedes, (int)buffer, (int)size);
+}
+
+int
+open (char const *file_name, int flags, ...)
+{
+  va_list ap;
+  va_start (ap, flags);
+  int mask = va_arg (ap, int);
+#if !MES_BOOTSTRAP
+  if (!flags)
+    {
+      _ungetc_pos = -1;
+      _ungetc_fd = -1;
+    }
+#endif
+  int r = _sys_call3 (SYS_open, (int)file_name, (int)flags, (int)mask);
+  va_end (ap);
+  return r;
+}
+
+pid_t
+waitpid (pid_t pid, int *status_ptr, int options)
+{
+  return _sys_call3 (SYS_waitpid, (int)pid, (int)status_ptr, (int)options);
+}
+
+int
+execve (char const* file_name, char *const argv[], char *const env[])
+{
+  return _sys_call3 (SYS_execve, (int)file_name, (int)argv, (int)env);
+}
+
+int
+chmod (char const *file_name, mode_t mask)
+{
+  return _sys_call2 (SYS_chmod, (int)file_name, (int)mask);
+}
+
+int
+access (char const *file_name, int how)
+{
+  return _sys_call2 (SYS_access, (int)file_name, (int)how);
+}
+
+int
+brk (void *addr)
+{
+  return _sys_call1 (SYS_brk, (int)addr);
+}
+
+int
+ioctl (int filedes, unsigned long command, ...)
+{
+  va_list ap;
+  va_start (ap, command);
+  int data = va_arg (ap, int);
+  int r = _sys_call3 (SYS_ioctl, (int)filedes, (int)command, (int)data);
+  va_end (ap);
+  return r;
+}
+
+int
+fsync (int filedes)
+{
+  return _sys_call1 (SYS_fsync, (int)filedes);
+}
diff --git a/lib/linux/mes.c b/lib/linux/mes.c
new file mode 100644 (file)
index 0000000..4063378
--- /dev/null
@@ -0,0 +1,111 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <errno.h>
+
+int
+__sys_call (int sys_call)
+{
+  asm ("mov____0x8(%ebp),%eax !8");
+  asm ("int____$0x80");
+}
+
+int
+__sys_call1 (int sys_call, int one)
+{
+  asm ("mov____0x8(%ebp),%eax !8");
+  asm ("mov____0x8(%ebp),%ebx !12");
+  asm ("int____$0x80");
+}
+
+int
+__sys_call2 (int sys_call, int one, int two)
+{
+  asm ("mov____0x8(%ebp),%eax !8");
+  asm ("mov____0x8(%ebp),%ebx !12");
+  asm ("mov____0x8(%ebp),%ecx !16");
+  asm ("int____$0x80");
+}
+
+int
+__sys_call3 (int sys_call, int one, int two, int three)
+{
+  asm ("mov____0x8(%ebp),%eax !8");
+  asm ("mov____0x8(%ebp),%ebx !12");
+  asm ("mov____0x8(%ebp),%ecx !16");
+  asm ("mov____0x8(%ebp),%edx !20");
+  asm ("int____$0x80");
+}
+
+int
+_sys_call (int sys_call)
+{
+  int r = __sys_call (sys_call);
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
+
+int
+_sys_call1 (int sys_call, int one)
+{
+  int r = __sys_call1 (sys_call, one);
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
+
+int
+_sys_call2 (int sys_call, int one, int two)
+{
+  int r = __sys_call2 (sys_call, one, two);
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
+
+int
+_sys_call3 (int sys_call, int one, int two, int three)
+{
+  int r = __sys_call3 (sys_call, one, two, three);
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
diff --git a/lib/linux/mini-gcc.c b/lib/linux/mini-gcc.c
new file mode 100644 (file)
index 0000000..40a7961
--- /dev/null
@@ -0,0 +1,54 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define SYS_exit   "0x01"
+#define SYS_write  "0x04"
+
+void
+_exit (int code)
+{
+  asm (
+       "mov    $"SYS_exit",%%eax\n\t"
+       "mov    %0,%%ebx\n\t"
+       "int    $0x80\n\t"
+       : // no outputs "=" (r)
+       : "rm" (code)
+       );
+  // not reached
+  _exit (0);
+}
+
+ssize_t
+_write (int filedes, void const *buffer, size_t size)
+{
+  int r;
+  asm (
+       "mov    $"SYS_write",%%eax\n\t"
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+       "mov    %3,%%edx\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "rm" (filedes), "rm" (buffer), "rm" (size)
+       : "eax", "ebx", "ecx", "edx"
+       );
+  return r;
+}
diff --git a/lib/linux/mini-mes.c b/lib/linux/mini-mes.c
new file mode 100644 (file)
index 0000000..ef57ac1
--- /dev/null
@@ -0,0 +1,37 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+void
+_exit ()
+{
+  asm ("mov____$i32,%eax SYS_exit");
+  asm ("mov____0x8(%ebp),%ebx !8");
+  asm ("int____$0x80");
+}
+
+void
+_write ()
+{
+  asm ("mov____$i32,%eax SYS_write");
+  asm ("mov____0x8(%ebp),%ebx !8");
+  asm ("mov____0x8(%ebp),%ecx !12");
+  asm ("mov____0x8(%ebp),%edx !16");
+  asm ("int____$0x80");
+}
diff --git a/lib/linux/tcc.c b/lib/linux/tcc.c
new file mode 100644 (file)
index 0000000..092d65d
--- /dev/null
@@ -0,0 +1,67 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define SYS_close  0x06
+#define SYS_lseek  0x13
+#define SYS_unlink 0x0a
+#define SYS_rmdir  0x28
+#define SYS_stat   0x6a
+#define SYS_getcwd 0xb7
+
+int
+close (int filedes)
+{
+  if (_ungetc_fd == filedes)
+    {
+      _ungetc_pos = -1;
+      _ungetc_fd = -1;
+    }
+  return _sys_call1 (SYS_close, (int)filedes);
+}
+
+off_t
+lseek (int filedes, off_t offset, int whence)
+{
+  return _sys_call3 (SYS_lseek, (int)filedes, (int)offset, (int)whence);
+}
+
+int
+unlink (char const *file_name)
+{
+  return _sys_call1 (SYS_unlink, (int)file_name);
+}
+
+int
+rmdir (char const *file_name)
+{
+  return _sys_call1 (SYS_rmdir, (int)file_name);
+}
+
+int
+stat (char const *file_name, struct stat *statbuf)
+{
+  return _sys_call2 (SYS_stat, (int)file_name, (int)statbuf);
+}
+
+char *
+getcwd (char *buffer, size_t size)
+{
+  return _sys_call2 (SYS_getcwd, (int)buffer, (int)size);
+}
index b9c79ac0667ff5d45b3740ee13cf91cfae04080f..f29a4c73e578846ee3cb9664d0a7aced81b1fc93 100644 (file)
--- a/lib/m4.c
+++ b/lib/m4.c
 
 #include <ctype.h>
 
-int
-abort ()
-{
-  static int stub = 0;
-  if (__mes_debug () && !stub)
-    eputs ("abort stub\n");
-  stub = 1;
-  return 0;
-}
+#include "stdlib/abort.c"
 
 int
 atof (int x)
diff --git a/lib/stdlib/abort.c b/lib/stdlib/abort.c
new file mode 100644 (file)
index 0000000..2231c51
--- /dev/null
@@ -0,0 +1,29 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+void
+abort (void)
+{
+#if __i386__
+  asm ("hlt");
+#else
+  asm ("break  0");
+#endif
+}
diff --git a/lib/stdlib/alloca.c b/lib/stdlib/alloca.c
new file mode 100644 (file)
index 0000000..53dbdc8
--- /dev/null
@@ -0,0 +1,98 @@
+/* alloca.c -- allocate automatically reclaimed memory
+   (Mostly) portable public-domain implementation -- D A Gwyn
+
+   This implementation of the PWB library alloca function,
+   which is used to allocate space off the run-time stack so
+   that it is automatically reclaimed upon procedure exit,
+   was inspired by discussions with J. Q. Johnson of Cornell.
+
+   There are some preprocessor constants that can
+   be defined when compiling for your specific system, for
+   improved efficiency; however, the defaults should be okay.
+
+   The general concept of this implementation is to keep
+   track of all alloca-allocated blocks, and reclaim any
+   that are found to be deeper in the stack than the current
+   invocation.  This heuristic does not reclaim storage as
+   soon as it becomes invalid, but it will do so eventually.
+
+   As a special case, alloca(0) reclaims storage without
+   allocating any.  It is a good idea to use alloca(0) in
+   your main control loop, etc. to force garbage collection.  */
+
+#include <unistd.h>
+
+#define ALIGN_SIZE 4
+#define ADDRESS_FUNCTION(arg) &(arg)
+#define STACK_DIR -1
+
+union alloca_header
+{
+  char align[ALIGN_SIZE];      /* To force sizeof(union alloca_header).  */
+  struct
+    {
+      union alloca_header *next;               /* For chaining headers.  */
+      char *deep;              /* For stack depth measure.  */
+    } h;
+};
+
+static union alloca_header *last_alloca_header = NULL; /* -> last alloca header.  */
+
+/* Return a void * to at least SIZE bytes of storage,
+   which will be automatically reclaimed upon exit from
+   the procedure that called alloca.  Originally, this space
+   was supposed to be taken from the current stack frame of the
+   caller, but that method cannot be made to work for some
+   implementations of C, for example under Gould's UTX/32.  */
+
+void *
+alloca (size_t size)
+{
+  char probe;          /* Probes stack depth: */
+  char *depth = ADDRESS_FUNCTION (probe);
+
+  /* Reclaim garbage, defined as all alloca'd storage that
+     was allocated from deeper in the stack than currently.  */
+
+  {
+    union alloca_header *hp;   /* Traverses linked list.  */
+
+    for (hp = last_alloca_header; hp != NULL;)
+      if ((STACK_DIR > 0 && hp->h.deep > depth)
+         || (STACK_DIR < 0 && hp->h.deep < depth))
+       {
+         union alloca_header *np = hp->h.next;
+
+         free ((void *) hp);   /* Collect garbage.  */
+
+         hp = np;              /* -> next header.  */
+       }
+      else
+       break;                  /* Rest are not deeper.  */
+
+    last_alloca_header = hp;   /* -> last valid storage.  */
+
+  }
+
+  if (size == 0)
+    return NULL;               /* No allocation required.  */
+
+  /* Allocate combined header + user data storage.  */
+
+  {
+    void * new = malloc (sizeof (union alloca_header) + size);
+    /* Address of header.  */
+
+    if (new == 0)
+      abort();
+
+    ((union alloca_header *) new)->h.next = last_alloca_header;
+    ((union alloca_header *) new)->h.deep = depth;
+
+    last_alloca_header = (union alloca_header *) new;
+
+    /* User storage begins just after header.  */
+
+    return (void *) ((char *) new + sizeof (union alloca_header));
+  }
+}
diff --git a/lib/stdlib/malloc.c b/lib/stdlib/malloc.c
new file mode 100644 (file)
index 0000000..ca15261
--- /dev/null
@@ -0,0 +1,33 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+char *__brk = 0;
+
+void *
+malloc (size_t size)
+{
+  if (!__brk)
+    __brk = brk (0);
+  if (brk (__brk + size) == (void*)-1)
+    return 0;
+  char *p = __brk;
+  __brk += size;
+  return p;
+}
diff --git a/lib/string/argz-count.c b/lib/string/argz-count.c
new file mode 100644 (file)
index 0000000..2cd0175
--- /dev/null
@@ -0,0 +1,44 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright (C) 1995-2018 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Taken from GNU C Library
+ * Routines for dealing with '\0' separated arg vectors.
+ * Written by Miles Bader <miles@gnu.ai.mit.edu>
+*/
+
+#include <argz.h>
+#include <string.h>
+
+/* Returns the number of strings in ARGZ.  */
+size_t
+__argz_count (const char *argz, size_t len)
+{
+  size_t count = 0;
+  while (len > 0)
+    {
+      size_t part_len = strlen(argz);
+      argz += part_len + 1;
+      len -= part_len + 1;
+      count++;
+    }
+  return count;
+}
+libc_hidden_def (__argz_count)
+weak_alias (__argz_count, argz_count)
diff --git a/lib/string/argz-extract.c b/lib/string/argz-extract.c
new file mode 100644 (file)
index 0000000..163a275
--- /dev/null
@@ -0,0 +1,42 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright (C) 1995-2018 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Taken from GNU C Library
+ * Routines for dealing with '\0' separated arg vectors.
+ * Written by Miles Bader <miles@gnu.org>
+*/
+
+#include <argz.h>
+
+/* Puts pointers to each string in ARGZ, plus a terminating 0 element, into
+   ARGV, which must be large enough to hold them all.  */
+void
+__argz_extract (const char *argz, size_t len, char **argv)
+{
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      *argv++ = (char *) argz;
+      argz += part_len + 1;
+      len -= part_len + 1;
+    }
+  *argv = 0;
+}
+weak_alias (__argz_extract, argz_extract)
diff --git a/lib/string/memcpy.c b/lib/string/memcpy.c
new file mode 100644 (file)
index 0000000..330311f
--- /dev/null
@@ -0,0 +1,29 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+void *
+memcpy (void *dest, void const *src, size_t n)
+{
+  char* p = dest;
+  char const* q = src;
+  while (n--)
+    *p++ = *q++;
+  return dest;
+}