// Copyright 2009 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 os

import (
	"syscall"
	"unsafe"
)

const (
	blockSize = 4096
)

// Readdirnames reads the contents of the directory associated with file and
// returns an array of up to count names, in directory order.  Subsequent
// calls on the same file will yield further names.
// A negative count means to read until EOF.
// Readdirnames returns the array and an Error, if any.
func (file *File) Readdirnames(count int) (names []string, err Error) {
	// If this file has no dirinfo, create one.
	if file.dirinfo == nil {
		file.dirinfo = new(dirInfo)
		// The buffer must be at least a block long.
		file.dirinfo.buf = make([]byte, blockSize)
	}
	d := file.dirinfo
	size := count
	if size < 0 {
		size = 100
	}
	names = make([]string, 0, size) // Empty with room to grow.
	for count != 0 {
		// Refill the buffer if necessary
		if d.bufp >= d.nbuf {
			var errno int
			d.bufp = 0
			// Final argument is (basep *uintptr) and the syscall doesn't take nil.
			d.nbuf, errno = syscall.Getdirentries(file.fd, d.buf, new(uintptr))
			if errno != 0 {
				d.nbuf = 0
				return names, NewSyscallError("getdirentries", errno)
			}
			if d.nbuf <= 0 {
				break // EOF
			}
		}
		// Drain the buffer
		for count != 0 && d.bufp < d.nbuf {
			dirent := (*syscall.Dirent)(unsafe.Pointer(&d.buf[d.bufp]))
			if dirent.Reclen == 0 {
				d.bufp = d.nbuf
				break
			}
			d.bufp += int(dirent.Reclen)
			if dirent.Ino == 0 { // File absent in directory.
				continue
			}
			bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0]))
			var name = string(bytes[0:dirent.Namlen])
			if name == "." || name == ".." { // Useless names
				continue
			}
			count--
			names = append(names, name)
		}
	}
	return names, nil
}
