X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=libgo%2Fgo%2Fos%2Fdir.go;h=c693aebf3775861334f170c879a62e727ee99df5;hp=a5909ff5fbb9e063c3bd55d1419b7c269dd72312;hb=c4151dadacd2e0f8c9f756741af5b1f4b8e045ad;hpb=e440a3286bc89368b8d3a8fd6accd47191790bf2;ds=sidebyside diff --git a/libgo/go/os/dir.go b/libgo/go/os/dir.go index a5909ff5fbb..c693aebf377 100644 --- a/libgo/go/os/dir.go +++ b/libgo/go/os/dir.go @@ -5,17 +5,20 @@ package os import ( + "io" "syscall" "unsafe" ) -func libc_dup(fd int) int __asm__ ("dup") -func libc_opendir(*byte) *syscall.DIR __asm__ ("opendir") -func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) int __asm__ ("readdir_r") -func libc_closedir(*syscall.DIR) int __asm__ ("closedir") +//extern opendir +func libc_opendir(*byte) *syscall.DIR + +//extern closedir +func libc_closedir(*syscall.DIR) int // FIXME: pathconf returns long, not int. -func libc_pathconf(*byte, int) int __asm__ ("pathconf") +//extern pathconf +func libc_pathconf(*byte, int) int func clen(n []byte) int { for i := 0; i < len(n); i++ { @@ -26,15 +29,14 @@ func clen(n []byte) int { return len(n) } -var elen int; +var elen int -// Negative count means read until EOF. -func (file *File) Readdirnames(count int) (names []string, err Error) { +func (file *File) readdirnames(n int) (names []string, err error) { if elen == 0 { - var dummy syscall.Dirent; - elen = (unsafe.Offsetof(dummy.Name) + - libc_pathconf(syscall.StringBytePtr(file.name), syscall.PC_NAME_MAX) + - 1); + var dummy syscall.Dirent + elen = (int(unsafe.Offsetof(dummy.Name)) + + libc_pathconf(syscall.StringBytePtr(file.name), syscall.PC_NAME_MAX) + + 1) } if file.dirinfo == nil { @@ -45,29 +47,37 @@ func (file *File) Readdirnames(count int) (names []string, err Error) { entry_dirent := unsafe.Pointer(&file.dirinfo.buf[0]).(*syscall.Dirent) - size := count + size := n if size < 0 { size = 100 + n = -1 } + names = make([]string, 0, size) // Empty with room to grow. dir := file.dirinfo.dir if dir == nil { return names, NewSyscallError("opendir", syscall.GetErrno()) - } + } - for count != 0 { + for n != 0 { var result *syscall.Dirent i := libc_readdir_r(dir, entry_dirent, &result) + if i != 0 { + return names, NewSyscallError("readdir_r", i) + } if result == nil { - break + break // EOF } var name = string(result.Name[0:clen(result.Name[0:])]) - if name == "." || name == ".." { // Useless names + if name == "." || name == ".." { // Useless names continue } - count-- names = append(names, name) + n-- + } + if n >= 0 && len(names) == 0 { + return names, io.EOF } return names, nil }