소스 검색

LibC: strtok is now implemented (string.h)

Jonah Alligood 5 년 전
부모
커밋
a544fded88
1개의 변경된 파일44개의 추가작업 그리고 3개의 파일을 삭제
  1. 44 3
      Libraries/LibC/string.cpp

+ 44 - 3
Libraries/LibC/string.cpp

@@ -457,9 +457,50 @@ char* strpbrk(const char* s, const char* accept)
 
 char* strtok(char* str, const char* delim)
 {
-    (void)str;
-    (void)delim;
-    ASSERT_NOT_REACHED();
+    static char* saved_str;
+    
+    if (!str) {
+        if (!saved_str)
+            return nullptr;
+        str = saved_str;
+    }
+    
+    size_t token_start = 0;
+    size_t token_end = 0;
+    
+    for (size_t i = 0; i < strlen(str); ++i) {
+        bool is_delim = false;
+        for (size_t j = 0; j < strlen(delim); ++j) {
+            if (str[i] == delim[j]) {
+                is_delim = true;
+                ++token_start;
+                break;
+            }
+        }
+        if (!is_delim) break;
+    }
+    
+    if (strlen(&str[token_start]) == 0)
+        return nullptr;
+    
+    for (size_t i = 0; i < strlen(delim); ++i) {
+        char* delim_ptr = strchr(&str[token_start], delim[i]);
+        if (!delim_ptr)
+            continue;
+        
+        size_t delim_offset = static_cast<size_t>(delim_ptr - str);
+        if (!token_end || token_end > delim_offset)
+            token_end = delim_offset;
+    }
+    
+    if (token_end == 0) {
+        saved_str = nullptr;
+        return &str[token_start];
+    }
+    
+    saved_str = &str[token_end + 1];
+    str[token_end] = '\0';
+    return &str[token_start];
 }
 
 int strcoll(const char* s1, const char* s2)