Browse Source

feat(gblibc): add string.h and stdio.h funcs

greatbridf 2 years ago
parent
commit
7b059e1a11

+ 1 - 0
gblibc/CMakeLists.txt

@@ -11,6 +11,7 @@ add_library(gblibc STATIC
     src/assert.c
     src/dirent.c
     src/ctype.c
+    src/stdlib.c
 )
 
 add_library(crt0 OBJECT

+ 4 - 0
gblibc/include/stdio.h

@@ -11,8 +11,12 @@
 extern "C" {
 #endif
 
+int puts(const char* str);
+char* gets(char* str);
+
 int vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args);
 int snprintf(char* buf, size_t bufsize, const char* fmt, ...);
+int sprintf(char* buf, const char* fmt, ...);
 
 #ifdef __cplusplus
 }

+ 16 - 0
gblibc/include/stdlib.h

@@ -0,0 +1,16 @@
+#ifndef __GBLIBC_STDLIB_H_
+#define __GBLIBC_STDLIB_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int atoi(const char* str);
+
+void __attribute__((noreturn)) exit(int status);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 10 - 0
gblibc/include/string.h

@@ -12,13 +12,23 @@
 extern "C" {
 #endif
 
+int memcmp(const void* ptr1, const void* ptr2, size_t num);
+
+void* memmove(void* dst, const void* src, size_t n);
 void* memcpy(void* dst, const void* src, size_t n);
+void* mempcpy(void* dst, const void* src, size_t n);
 void* memset(void* dst, int c, size_t n);
 
 int strcmp(const char* s1, const char* s2);
 size_t strlen(const char* str);
+char* strchr(const char* str, int character);
+char* strrchr(const char* str, int character);
+char* strchrnul(const char* str, int character);
 
+char* strcpy(char* dst, const char* src);
 char* strncpy(char* dst, const char* src, size_t n);
+char* stpcpy(char* dst, const char* src);
+char* stpncpy(char* dst, const char* src, size_t n);
 
 #ifdef __cplusplus
 }

+ 35 - 0
gblibc/src/stdio.c

@@ -2,6 +2,8 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
 
 // where n is in the range of [0, 9]
 static inline char d_to_c(int32_t n)
@@ -351,3 +353,36 @@ int vsnprintf(char* buf, size_t buf_size, const char* fmt, va_list arg)
 
     return n_write;
 }
+
+int sprintf(char* buf, const char* fmt, ...)
+{
+    va_list lst;
+    va_start(lst, fmt);
+
+    int ret = vsnprintf(buf, __SIZE_MAX__, fmt, lst);
+
+    va_end(lst);
+
+    return ret;
+}
+
+int puts(const char* str)
+{
+    int len = strlen(str);
+    write(STDOUT_FILENO, str, len);
+    write(STDOUT_FILENO, "\n", 1);
+    return len + 1;
+}
+
+char* gets(char* buf)
+{
+    int n = read(STDIN_FILENO, buf, __SIZE_MAX__);
+    if (n > 0) {
+      if (buf[n-1] == '\n')
+        buf[n-1] = 0;
+      else
+        buf[n] = 0;
+      return buf;
+    }
+    return NULL;
+}

+ 19 - 0
gblibc/src/stdlib.c

@@ -0,0 +1,19 @@
+#include <stdlib.h>
+#include <syscall.h>
+
+int atoi(const char* str)
+{
+    int ret = 0;
+    while (*str) {
+        ret *= 10;
+        ret += *str - '0';
+    }
+    return ret;
+}
+
+void __attribute__((noreturn)) exit(int status)
+{
+    syscall1(SYS_exit, status);
+    for (;;)
+        ;
+}

+ 78 - 0
gblibc/src/string.c

@@ -2,6 +2,25 @@
 
 #define BYTES_PER_MAX_COPY_UNIT (sizeof(uint32_t) / sizeof(uint8_t))
 
+int memcmp(const void* ptr1, const void* ptr2, size_t num)
+{
+    while (num--) {
+        if (*(const char*)ptr1 < *(const char*)ptr2)
+            return -1;
+        else if (*(const char*)ptr1 > *(const char*)ptr2)
+            return 1;
+    }
+    return 0;
+}
+
+void* memmove(void* dst, const void* src, size_t n)
+{
+    void* orig_dst = dst;
+    while (n--)
+        *(char*)(dst++) = *(const char*)(src++);
+    return orig_dst;
+}
+
 void* memcpy(void* _dst, const void* _src, size_t n)
 {
     void* orig_dst = _dst;
@@ -18,6 +37,11 @@ void* memcpy(void* _dst, const void* _src, size_t n)
     return orig_dst;
 }
 
+void* mempcpy(void* dst, const void* src, size_t n)
+{
+    return memcpy(dst, src, n) + n;
+}
+
 void* memset(void* _dst, int c, size_t n)
 {
     uint8_t* dst = (uint8_t*)_dst;
@@ -41,6 +65,41 @@ size_t strlen(const char* str)
     return n;
 }
 
+char* strchr(const char* str, int c)
+{
+    const char* p = str;
+    while (*p) {
+        if (*p == c)
+            return (char*)p;
+        ++p;
+    }
+    return NULL;
+}
+
+char* strrchr(const char* str, int c)
+{
+    const char* p = str + strlen(str) - 1;
+    while (p >= str) {
+        if (*p == c)
+            return (char*)p;
+        --p;
+    }
+    return NULL;
+}
+
+char* strchrnul(const char* str, int c)
+{
+    char* ret = strchr(str, c);
+    if (ret)
+        return ret;
+    return (char*)str + strlen(str);
+}
+
+char* strcpy(char* dst, const char* src)
+{
+    return memcpy(dst, src, strlen(src) + 1);
+}
+
 char* strncpy(char* dst, const char* src, size_t n)
 {
     size_t len = strlen(src);
@@ -55,6 +114,25 @@ char* strncpy(char* dst, const char* src, size_t n)
     return dst;
 }
 
+char* stpcpy(char* restrict dst, const char* restrict src)
+{
+    return memcpy(dst, src, strlen(src) + 1) + strlen(src);
+}
+
+char* stpncpy(char* restrict dst, const char* restrict src, size_t n)
+{
+    size_t len = strlen(src);
+
+    if (len < n) {
+        memset(dst + len, 0x00, n - len);
+        memcpy(dst, src, len);
+    } else {
+        memcpy(dst, src, n);
+    }
+
+    return dst + len;
+}
+
 int strcmp(const char* s1, const char* s2)
 {
     int c;

+ 0 - 7
user-space-program/lazybox.c

@@ -16,13 +16,6 @@ int putchar(int c)
     return c;
 }
 
-int puts(const char* str)
-{
-    size_t ret = write(STDOUT_FILENO, str, strlen(str));
-    ret += write(STDOUT_FILENO, "\n", 1);
-    return ret;
-}
-
 int printf(const char* fmt, ...)
 {
     va_list args;

+ 1 - 32
user-space-program/sh.c

@@ -21,37 +21,6 @@ int printf(const char* fmt, ...)
     return len;
 }
 
-char* strchr(const char* str, int c)
-{
-    const char* p = str;
-    while (*p) {
-        if (*p == c)
-            return (char*)p;
-        ++p;
-    }
-    return NULL;
-}
-
-char* gets(char* buf, int bufsize)
-{
-    int n = read(STDIN_FILENO, buf, bufsize);
-    if (n > 0) {
-      if (buf[n-1] == '\n')
-        buf[n-1] = 0;
-      else
-        buf[n] = 0;
-      return buf;
-    }
-    return NULL;
-}
-
-int puts(const char* str)
-{
-    int len = strlen(str);
-    write(STDOUT_FILENO, str, len);
-    return len + 1;
-}
-
 void* malloc(size_t n)
 {
     static char mems[1024];
@@ -194,7 +163,7 @@ getcmd(char *buf, int nbuf)
 {
   printf("$ ");
   memset(buf, 0, nbuf);
-  gets(buf, nbuf);
+  gets(buf);
   if(buf[0] == 0) // EOF
     return -1;
   return 0;