mescc: Add strcpy.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 8 May 2017 19:15:53 +0000 (21:15 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 8 May 2017 19:15:53 +0000 (21:15 +0200)
* libc/include/string.h (strcpy): Declare.
* libc/mlibc.c (strcpy): New function.
* module/mes/libc.mes (strcpy): New function.
  (libc): Add it.
* scaffold/t.c (string_test): Test it.

libc/include/string.h
libc/mlibc.c
module/language/c99/compiler.mes
module/mes/libc.mes
scaffold/t.c

index 91e2010c9af0cf4f7acca94da8cd48702d8c0af8..932be14233352b10ca8a42ecb4552c637ab81952 100644 (file)
@@ -36,6 +36,7 @@ typedef long size_t;
 size_t strlen (char const*);
 int strcmp (char const*, char const*);
 int strncmp (char const*, char const*, size_t);
+char *strcpy (char *dest, char const *src);
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __STRING_H
index 44530e2c53113df945cf9d5ab6b4d8c47fe221bd..fd9ee0a9d1f308ad4c156e8c57e553c62041deb0 100644 (file)
@@ -210,6 +210,15 @@ strcmp (char const* a, char const* b)
   return *a - *b;
 }
 
+char *
+strcpy (char *dest, char const *src)
+{
+  char *p = dest;
+  while (*src) *p++ = *src++;
+  *p = 0;
+  return dest;
+}
+
 int
 eputs (char const* s)
 {
index 62c7ee5751a594637b715f1cf2803fe58f7e00e8..4a9aa26c01e6298c8a6ebec671e8c9da7e4afa09 100644 (file)
         ((decl (decl-spec-list (type-spec (fixed-type ,type)) (type-qual ,qual)) (init-declr-list (init-declr (ptr-declr (pointer) (ftn-declr (ident ,name) (param-list . ,param-list))))))
          info)
 
+        ;; char *strcpy ();
+        ((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ptr-declr (pointer) (ftn-declr (ident ,name) (param-list . ,param-list))))))
+         info)
+
         ;; printf (char const* format, ...)
         ((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ftn-declr (ident ,name) (param-list ,param-list . (ellipsis))))))
          info)
index abba827b488bcc70f4d4b18584d37b4d0d6c399a..d0282686129683a693b28dfc02f66b3d78137dcc 100644 (file)
@@ -214,6 +214,20 @@ strcmp (char const* a, char const* b)
 }
 " parse-c99))
 
+(define (strcpy)
+  (format (current-error-port) "parsing: strcpy\n")
+  (with-input-from-string
+               "
+char *
+strcpy (char *dest, char const *src)
+{
+  char *p = dest;
+  while (*src) *p++ = *src++;
+  *p = 0;
+  return dest;
+}
+" parse-c99))
+
 (define (itoa)
   (format (current-error-port) "parsing: itoa\n")
   (with-input-from-string
@@ -395,6 +409,7 @@ printf (char const* format, int va_args)
    fputs
    puts
    strcmp
+   strcpy
    itoa
    isdigit
    atoi
index 015c934d90310b78f05510338a5ffac510ced5ce..ae98cd48a1b022e6910d40060f8e3353d2f4c445 100644 (file)
@@ -567,6 +567,17 @@ struct_test ()
   return make_tmps_test  (g_cells);
 }
 
+int
+string_test ()
+{
+  puts ("t: strcpy (buf, \"hallo\")\n");
+  char buf[10];
+  strcpy (buf, "hallo");
+  if (strcmp (buf, "hallo")) return 1;
+
+  return struct_test ();
+}
+
 void
 void_func ()
 {
@@ -946,7 +957,7 @@ test (char *p)
   puts ("void_func ()\n");
   void_func ();
 
-  return struct_test ();
+  return string_test ();
 }
 #endif