diff --git a/internal/lib/internal/filepathlite/path.go b/internal/lib/internal/filepathlite/path.go deleted file mode 100644 index 2aaed533..00000000 --- a/internal/lib/internal/filepathlite/path.go +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package filepathlite - -import ( - "github.com/goplus/llgo/internal/lib/internal/stringslite" -) - -// FromSlash is filepath.ToSlash. -func FromSlash(path string) string { - if Separator == '/' { - return path - } - return replaceStringByte(path, '/', Separator) -} - -func replaceStringByte(s string, old, new byte) string { - if stringslite.IndexByte(s, old) == -1 { - return s - } - n := []byte(s) - for i := range n { - if n[i] == old { - n[i] = new - } - } - return string(n) -} - -// VolumeName is filepath.VolumeName. -func VolumeName(path string) string { - return FromSlash(path[:volumeNameLen(path)]) -} - -// VolumeNameLen returns the length of the leading volume name on Windows. -// It returns 0 elsewhere. -func VolumeNameLen(path string) int { - return volumeNameLen(path) -} diff --git a/internal/lib/internal/filepathlite/path_unix.go b/internal/lib/internal/filepathlite/path_unix.go deleted file mode 100644 index e2f25598..00000000 --- a/internal/lib/internal/filepathlite/path_unix.go +++ /dev/null @@ -1,30 +0,0 @@ -//go:build unix || (js && wasm) || wasip1 - -/* - * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package filepathlite - -const ( - Separator = '/' // OS-specific path separator - ListSeparator = ':' // OS-specific path list separator -) - -// volumeNameLen returns length of the leading volume name on Windows. -// It returns 0 elsewhere. -func volumeNameLen(path string) int { - return 0 -} diff --git a/internal/lib/internal/stringslite/strings.go b/internal/lib/internal/stringslite/strings.go deleted file mode 100644 index 4ad916cc..00000000 --- a/internal/lib/internal/stringslite/strings.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2024 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package stringslite implements a subset of strings, -// only using packages that may be imported by "os". -// -// Tests for these functions are in the strings package. -package stringslite - -import ( - "github.com/goplus/llgo/internal/lib/internal/bytealg" -) - -func IndexByte(s string, c byte) int { - return bytealg.IndexByteString(s, c) -} diff --git a/internal/lib/os/path.go b/internal/lib/os/path.go index a0bbb720..aee2266c 100644 --- a/internal/lib/os/path.go +++ b/internal/lib/os/path.go @@ -2,8 +2,6 @@ package os import ( "syscall" - - "github.com/goplus/llgo/internal/lib/internal/filepathlite" ) // MkdirAll creates a directory named path, @@ -24,25 +22,19 @@ func MkdirAll(path string, perm FileMode) error { } // Slow path: make sure parent exists and then call Mkdir for path. - - // Extract the parent folder from path by first removing any trailing - // path separator and then scanning backward until finding a path - // separator or reaching the beginning of the string. - i := len(path) - 1 - for i >= 0 && IsPathSeparator(path[i]) { + i := len(path) + for i > 0 && IsPathSeparator(path[i-1]) { // Skip trailing path separator. i-- } - for i >= 0 && !IsPathSeparator(path[i]) { - i-- - } - if i < 0 { - i = 0 + + j := i + for j > 0 && !IsPathSeparator(path[j-1]) { // Scan backward over element. + j-- } - // If there is a parent directory, and it is not the volume name, - // recurse to ensure parent directory exists. - if parent := path[:i]; len(parent) > len(filepathlite.VolumeName(path)) { - err = MkdirAll(parent, perm) + if j > 1 { + // Create parent. + err = MkdirAll(fixRootDirectory(path[:j-1]), perm) if err != nil { return err }