Browse Source

fix(gblibc): change NDINSERT and NDERASE to func

greatbridf 2 years ago
parent
commit
8eab661b1a
4 changed files with 29 additions and 16 deletions
  1. 1 0
      gblibc/CMakeLists.txt
  2. 5 13
      gblibc/private-include/list.h
  3. 3 3
      gblibc/src/init.c
  4. 20 0
      gblibc/src/internal.c

+ 1 - 0
gblibc/CMakeLists.txt

@@ -14,6 +14,7 @@ add_library(gblibc STATIC
     src/stdlib.c
     src/errno.c
     src/init.c
+    src/internal.c
 )
 
 add_library(crt0 OBJECT

+ 5 - 13
gblibc/private-include/list.h

@@ -21,19 +21,11 @@ typedef list_node list_head;
 #define NEWNODE(type) ((struct list_node*)malloc(sizeof(list_node) + sizeof(type)))
 #define NDPTR(p_data) ((list_node*)((char*)p_data - sizeof(list_node)))
 
-#define NDINSERT(node, newnode)          \
-    NDNEXT(*newnode) = NDNEXT(node);     \
-    if (NDNEXT(node))                    \
-        NDPREV(*NDNEXT(node)) = newnode; \
-    NDNEXT(node) = newnode;              \
-    NDPREV(*newnode) = &node
-
-#define NDERASE(p_node)                             \
-    if (NDPREV(*p_node))                            \
-        NDNEXT(*NDPREV(*p_node)) = NDNEXT(*p_node); \
-    if (NDNEXT(*p_node))                            \
-        NDPREV(*NDNEXT(*p_node)) = NDPREV(*p_node); \
-    free(p_node)
+void __node_insert(list_node* node, list_node* new_node);
+void __node_erase(list_node* node);
+
+#define NDINSERT(node, newnode) __node_insert(node, newnode)
+#define NDERASE(p_node) __node_erase(p_node)
 
 #ifdef __cplusplus
 }

+ 3 - 3
gblibc/src/init.c

@@ -34,7 +34,7 @@ void __init_gblibc(void)
     stdout->wbuf = malloc(BUFSIZ);
     stdout->wbsz = BUFSIZ;
 
-    NDINSERT(iofiles, node);
+    NDINSERT(&iofiles, node);
 
     // stdin
     node = NEWNODE(FILE);
@@ -46,7 +46,7 @@ void __init_gblibc(void)
     stdin->rbuf = malloc(BUFSIZ);
     stdin->rbsz = BUFSIZ;
 
-    NDINSERT(iofiles, node);
+    NDINSERT(&iofiles, node);
 
     // stderr
     node = NEWNODE(FILE);
@@ -56,5 +56,5 @@ void __init_gblibc(void)
     stderr->fd = STDERR_FILENO;
     stderr->flags = FILE_WRITE;
 
-    NDINSERT(iofiles, node);
+    NDINSERT(&iofiles, node);
 }

+ 20 - 0
gblibc/src/internal.c

@@ -0,0 +1,20 @@
+#include <list.h>
+#include <stdlib.h>
+
+void __node_insert(list_node* node, list_node* newnode)
+{
+    NDNEXT(*newnode) = NDNEXT(*node);
+    if (NDNEXT(*node))
+        NDPREV(*NDNEXT(*node)) = newnode;
+    NDNEXT(*node) = newnode;
+    NDPREV(*newnode) = node;
+}
+
+void __node_erase(list_node* node)
+{
+    if (NDPREV(*node))
+        NDNEXT(*NDPREV(*node)) = NDNEXT(*node);
+    if (NDNEXT(*node))
+        NDPREV(*NDNEXT(*node)) = NDPREV(*node);
+    free(node);
+}