mescc: Support open, read.
authorJan Nieuwenhuizen <janneke@gnu.org>
Tue, 10 Jan 2017 19:35:52 +0000 (20:35 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Tue, 10 Jan 2017 19:35:52 +0000 (20:35 +0100)
* module/mes/libc-i386.mes (i386:write): Fix comment.
  (i386:open, i386:read): New functions.
* module/mes/libc-i386.scm: Export them.
* module/language/c99/compiler.mes (i386:libc): Add them.
  (getchar, putchar): New libc functions.
  (libc): Add them.

module/language/c99/compiler.mes
module/mes/libc-i386.mes
module/mes/libc-i386.scm

index df66d847b054cf36fcf65f24898bdb7cbb377e3c..f160dceac67c72e8a5e9878d204876fc6add47b2 100644 (file)
@@ -941,6 +941,39 @@ strlen (char const* s)
                 parse-c99)))
     ast))
 
+(define getchar
+  (let* ((ast (with-input-from-string
+                  "
+int
+getchar ()
+{
+  char c;
+  int r = read (g_stdin, &c, 1);
+  //int r = read (0, &c, 1);
+  if (r < 1) return -1;
+  return c;
+}
+"
+;;paredit:"
+                parse-c99)))
+    ast))
+
+(define putchar
+  (let* ((ast (with-input-from-string
+                  "
+int
+putchar (int c)
+{
+  //write (STDOUT, s, strlen (s));
+  //int i = write (STDOUT, s, strlen (s));
+  write (1, (char*)&c, 1);
+  return 0;
+}
+"
+;;paredit:"
+                parse-c99)))
+    ast))
+
 (define eputs
   (let* ((ast (with-input-from-string
                   "
@@ -964,7 +997,7 @@ eputs (char const* s)
 int
 fputs (char const* s, int fd)
 {
- int i = strlen (s);
 int i = strlen (s);
   write (fd, s, i);
   return 0;
 }
@@ -1010,11 +1043,15 @@ strcmp (char const* a, char const* b)
 (define i386:libc
   (list
    (cons "exit" (list i386:exit))
+   (cons "open" (list i386:open))
+   (cons "read" (list i386:read))
    (cons "write" (list i386:write))))
 
 (define libc
   (list
    strlen
+   getchar
+   putchar
    eputs
    fputs
    puts
index d5c07230fb7c8b650b4fe30681b9362b3807a4f1..7930b737cd2dd78e21aa9272f02b0a4468e3d374 100644 (file)
     #xcd #x80                           ; int    $0x80
     ))
 
+(define (i386:open f g t d)
+  `(
+    #x55                                ; push   %ebp
+    #x89 #xe5                           ; mov    %esp,%ebp
+
+    #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
+    #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
+
+    #xb8 #x05 #x00 #x00 #x00            ; mov    $0x5,%eax
+    #xcd #x80                           ; int    $0x80
+
+    #xc9                                ; leave
+    #xc3                                ; ret
+    ))
+
+(define (i386:read f g t d)
+  `(
+    #x55                                ; push   %ebp
+    #x89 #xe5                           ; mov    %esp,%ebp
+
+    #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
+    #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
+    #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
+
+    #xb8 #x03 #x00 #x00 #x00            ; mov    $0x3,%eax
+    #xcd #x80                           ; int    $0x80
+
+    #xc9                                ; leave
+    #xc3                                ; ret
+    ))
+
 (define (i386:write f g t d)
   `(
     #x55                                ; push   %ebp
     #x89 #xe5                           ; mov    %esp,%ebp
 
-    #x8b #x5d #x08                      ; mov    $0x8(%ebp),%ebx
-    #x8b #x4d #x0c                      ; mov    $0xc(%ebp),%ecx
-    #x8b #x55 #x10                      ; mov    $0x4(%ebp),%edx
+    #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
+    #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
+    #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
 
     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
     #xcd #x80                           ; int    $0x80
index f029eed012c27678d10716326e165b56aafccfcb..610d1747b539904f13adeccdcf9df144ecccdcb0 100644 (file)
@@ -83,6 +83,8 @@
 
             ;; libc
             i386:exit
+            i386:open
+            i386:read
             i386:write
             ))