mescc: Add getenv.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 17 Apr 2017 00:24:20 +0000 (02:24 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 17 Apr 2017 00:24:20 +0000 (02:24 +0200)
* module/mes/libc-i386.mes (i386:_start): Push environment pointer.
* module/mes/libc.mes (g_environment): New global.
  (_env): New function.
  (_start): Use it to set g_environment.
  (getenv): New function.
* lib/mlibc.c (strncmp): New function.
  (getenv): Implement.
* lib/mstart.c (_start): Set g_environment.
* module/mes/libc.mes (strncmp): New function.
  (libc): Add it.
* scaffold/t.c: (array_ref): Test it.

16 files changed:
GNUmakefile
libc/mlibc.c
libc/mstart.c
module/language/c99/compiler.mes
module/mes/libc-i386.mes
module/mes/libc.mes
scaffold/cons-mes.c
scaffold/hello.c
scaffold/m.c
scaffold/micro-mes.c
scaffold/mini-mes.c
scaffold/scaffold.make
scaffold/t.c
scaffold/tiny-mes.c
src/mes.c
src/posix.c

index 6d6ad425db4efd2a0f74d9e33325f0a0990091a6..96178863c7d15cf5c8ea11e4e3b4f20a0f84e34f 100644 (file)
@@ -1,4 +1,5 @@
 SHELL:=bash
+export SHELL
 QUIET:=@
 
 default: all
index c1ec677cc044e04529772670743c101dcbcbf5be..8688d7fd26f37eddd83b17d9985b163f2499d452 100644 (file)
@@ -18,6 +18,7 @@
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+char **g_environment = 0;
 int g_stdin = 0;
 
 #define EOF -1
@@ -51,12 +52,6 @@ exit (int code)
   exit (0);
 }
 
-char const*
-getenv (char const* p)
-{
-  return 0;
-}
-
 int
 read (int fd, void* buf, size_t n)
 {
@@ -290,6 +285,28 @@ ungetc (int c, int fd)
   return c;
 }
 
+char const* itoa (int);
+
+int
+strncmp (char const* a, char const* b, int length)
+{
+  while (*a && *b && *a == *b && --length) {a++;b++;}
+  return *a - *b;
+}
+
+char const*
+getenv (char const* s)
+{
+  char **p = g_environment;
+  int length = strlen (s);
+  while (*p)
+    {
+      if (!strncmp (s, *p, length) && *(*p + length) == '=') return (*p + length + 1);
+      p++;
+    }
+  return 0;
+}
+
 int
 isdigit (int c)
 {
index f50187a5da5a7f513a89ff499d5aa7a9176ba24b..6e6aaeb49ef69d4ca8fd4202bd4b4a8ac76a15af 100644 (file)
 void
 _start ()
 {
+  //  char **;
+  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"
+       : "=g_environment" (g_environment)
+       : //no inputs ""
+       );
   int r;
   asm (
-       "mov %%ebp,%%eax\n\t"
-       "addl $8,%%eax\n\t"
-       "push %%eax\n\t"
+       "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"
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "push     %%eax\n\t"
 
-       "call main\n\t"
-       "movl %%eax,%0\n\t"
+       "call    main\n\t"
+       "movl    %%eax,%0\n\t"
        : "=r" (r)
-       : //no inputs "" (&main)
+       : //no inputs ""
        );
   exit (r);
 }
index 3231f21cc99bd3ca98500cafb6ac5e2456f72fc7..331c7edca45de145cd82578f4424050dafb95984 100644 (file)
           (if global
               (let ((ptr (ident->pointer info o)))
                 (case ptr
-                  ((10)
-                   (list (lambda (f g ta t d)
-                           (i386:global->accu (+ (data-offset o g) d)))))
+                  ;; ((1)
+                  ;;  (list (lambda (f g ta t d)
+                  ;;          (i386:global->accu (+ (data-offset o g) d)))))
                   (else (list (lambda (f g ta t d)
                                 (append (i386:value->accu (+ (data-offset o g) d))))))))
               (error "TODO ident-address->accu" o))))))
 
-
 (define (ident-address->base info)
   (lambda (o)
     (let ((local (assoc-ref (.locals info) o))
index 06baffcc9e681ea3bdb0ed7287c71e3df7187346..eb70a900e05986c1419d2138cc47077fcbe075ef 100644 (file)
                 " 0x89 0xe8"      ; mov    %ebp,%eax
                 " 0x83 0xc0 0x08" ; add    $0x8,%eax
                 " 0x50"           ; push   %eax
+
                 " 0x89 0xe8"      ; mov    %ebp,%eax
                 " 0x83 0xc0 0x04" ; add    $0x4,%eax
                 " 0x0f 0xb6 0x00" ; movzbl (%eax),%eax
                 " 0x50"           ; push   %eax
+
+                " 0x89 0xe8"            ; mov    %ebp,%eax
+                " 0x83 0xc0 0x04"       ; add    $0x4,%eax
+                " 0x0f 0xb6 0x00"       ; movzbl (%eax),%eax
+                " 0x83 0xc0 0x03"       ; add    $0x3,%eax
+                " 0xc1 0xe0 0x02"       ; shl    $0x2,%eax
+                " 0x01 0xe8"            ; add    %ebp,%eax
+                " 0x50"                 ; push   %eax
                 ))
 
 (define i386:libc
index 62ca4d02a61c7f651ae23fda52a4cae7353b5594..993699fa241b3ef4bc77f7224db502b0cc4b0487 100644 (file)
 (define _start
   (let* ((argc-argv (i386:_start))
          (ast (with-input-from-string
-                  (string-append "int _start () {int i;asm(\"" argc-argv "\");i=main ();exit (i);}")
+                  (string-append "
+char **g_environment;
+char **
+_env (char **e)
+{
+  return e;
+}
+
+int
+_start ()
+{
+  asm(\"" argc-argv "\");
+  g_environment = _env ();
+  asm (\".byte 0x58\");
+  int r = main ();
+  exit (r);
+}
+")
                 parse-c99)))
     ast))
 
@@ -306,6 +323,43 @@ realloc (int *p, int size)
                 parse-c99)))
     ast))
 
+(define strncmp
+  (let* ((ast (with-input-from-string
+                  "
+int
+strncmp (char const* a, char const* b, int length)
+{
+  while (*a && *b && *a == *b && --length) {a++;b++;}
+  return *a - *b;
+}
+"
+;;paredit:"
+                parse-c99)))
+    ast))
+
+(define c:getenv
+  (let* ((ast (with-input-from-string
+                  "
+char **g_environment;
+char const*
+getenv (char const* s)
+{
+  char **p = g_environment;
+  p = *g_environment;
+  int length = strlen (s);
+  while (*p)
+    {
+      if (!strncmp (s, *p, length) && *(*p + length) == '=') return (*p + length + 1);
+      p++;
+    }
+  return 0;
+}
+"
+;;paredit:"
+                parse-c99)))
+    ast))
+
+
 (define libc
   (list
    strlen
@@ -322,4 +376,6 @@ realloc (int *p, int size)
    isdigit
    malloc
    realloc
+   strncmp
+   c:getenv
    ))
index 165944d234482ed94fe70d4c2173a70617ef4991..7e4784c6d9279a36d5b459e678488fcd0e9a7743 100644 (file)
@@ -23,6 +23,7 @@
 #endif
 
 #if  __MESC__
+char **g_environment;
 int g_stdin = 0;
 #define assert(x) ((x) ? (void)0 : assert_fail (#x))
 #endif
index 7cbb26c2c613e2180870217a9fcb86e790ca18fd..882f9c7b0cd3464d64e223e23432bd1692f49d26 100644 (file)
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#if  __MESC__
+char **g_environment;
+int g_stdin = 0;
+#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+#endif
+
 #if !__MESC__
 #include "mlibc.c"
 #endif
index 2d12be375bc399ee3601d935893a53742d7158aa..2702026160687242459693bd1d345b264444b1d7 100644 (file)
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#if  __MESC__
+char **g_environment;
+int g_stdin = 0;
+#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+#endif
+
 #if !__MESC__
 #include "mlibc.c"
 #endif
index 01d9b58961aa0c6dcf40f2b27240e54d1ee66c65..8cafd8dcf2d768245edb9668b3cd9d54ec74d4c8 100644 (file)
 #error "POSIX not supported"
 #endif
 
+#if  __MESC__
+char **g_environment;
+int g_stdin = 0;
+#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+#endif
+
 #if !__MESC__
 #include "mlibc.c"
 #endif
index 1399619feb68fc6606e5e1ad4c11b8a6afcb3eb5..6ba40f2328d8db0c427b34e7fdb79784f27bd658 100644 (file)
@@ -23,6 +23,7 @@
 #endif
 
 #if  __MESC__
+char **g_environment;
 int g_stdin = 0;
 #define assert(x) ((x) ? (void)0 : assert_fail (#x))
 #endif
index 7dda12f0090acbc26fa3b7feb9fe0f7e401de5eb..91e81b5b71d79e6e05a1b62fb30956dd6513fedb 100644 (file)
@@ -42,8 +42,8 @@ include make/check.make
 TARGET:=hello.mlibc
 C_FILES:=$(DIR)/hello.c
 INCLUDES:=libc
-C_FLAGS:=-nostdinc
-LD_FLAGS:=-nostdlib
+C_FLAGS:=-nostdinc -g
+LD_FLAGS:=-nostdlib -g
 CROSS:=$(CC32:%gcc=%)
 include make/bin.make
 
index 129605ab19e42ab402d0984412a01854452c0134..005503832f7cfb77e5c70cb0fd2538693a2cf39e 100644 (file)
@@ -245,6 +245,9 @@ array_test (char **e)
   puts ("t: *(p + 1)\n");
   if (*(*p + 1) != 'e') return 1;
 
+  puts ("t: getenv ()");
+  if (!getenv ("SHELL")) return 1;
+
   return read_test ();
 }
 
index 831aa0a97eb413ba0bf15abe06224e164d5c727b..8a8e4fac021533c8437f98bdbf6a3bb35068eea7 100644 (file)
 #error "POSIX not supported"
 #endif
 
+#if  __MESC__
+char **g_environment;
+int g_stdin = 0;
+#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+#endif
+
 #if !__MESC__
 #include "mlibc.c"
 #endif
index f1e2a387d6a52e2b40dc445de35797314d6b99a7..da8c201a837c888fc0196bd2b35cb22115b0fb9d 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -19,6 +19,7 @@
  */
 
 #if  __MESC__
+char **g_environment;
 int g_stdin = 0;
 #define assert(x) ((x) ? (void)0 : assert_fail (#x))
 #endif
index 3219c06f44d7c3aa1a1d1d3dff01c517e0c9c3e2..3c1cce95fbab6364a8816ba947bd063be4c19aa5 100644 (file)
@@ -87,12 +87,9 @@ string_to_cstring (SCM s)
 SCM
 getenv_ (SCM s) ///((name . "getenv"))
 {
-#if _POSIX_SOURCE
-  char *p = getenv (string_to_cstring (s));
+  char *p;
+  p = getenv (string_to_cstring (s));
   return p ? MAKE_STRING (cstring_to_list (p)) : cell_f;
-#else
-  return cell_t;
-#endif
 }
 
 SCM