Skip to content

Commit 2b9db50

Browse files
bgoulddeadprogram
authored andcommitted
Adding io.Seeker interface to tinyfs.File
1 parent cee98a6 commit 2b9db50

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

examples/simple-fatfs/main.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,20 @@ func main() {
146146
fmt.Printf("read %d bytes from file: `%s`\n", n, string(buf[:n]))
147147
}
148148

149+
offset, err := f.Seek(8, io.SeekStart)
150+
if err != nil {
151+
fmt.Println("Could not Seek(): ", err)
152+
} else {
153+
fmt.Println("new offset:", offset)
154+
n, err := f.Read(buf)
155+
if err != nil {
156+
if err != io.EOF {
157+
fmt.Printf("f.Read() error: %v\n", err.Error())
158+
}
159+
}
160+
fmt.Printf("read %d bytes from file: `%s`\n", n, string(buf[:n]))
161+
}
162+
149163
size, err = fat.Free()
150164
if err != nil {
151165
fmt.Println("Could not get filesystem free:", err.Error())

fatfs/go_fatfs.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const (
3838
FileResultTooManyOpenFiles FileResult = C.FR_TOO_MANY_OPEN_FILES
3939
FileResultInvalidParameter FileResult = C.FR_INVALID_PARAMETER
4040
FileResultReadOnly FileResult = 99
41+
FileResultNotImplemented FileResult = 0xe0 // tinyfs custom error
4142

4243
TypeFAT12 Type = C.FS_FAT12
4344
TypeFAT16 Type = C.FS_FAT16
@@ -125,6 +126,8 @@ func (r FileResult) Error() string {
125126
msg = "(19) Given parameter is invalid"
126127
case FileResultReadOnly:
127128
msg = "(99) Read-only filesystem"
129+
case FileResultNotImplemented:
130+
msg = "(e0) Feature Not Implemented"
128131
default:
129132
msg = "unknown file result error"
130133
}
@@ -375,19 +378,32 @@ func (f *File) Read(buf []byte) (n int, err error) {
375378
return int(br), nil
376379
}
377380

378-
/*
379381
// Seek changes the position of the file
380382
func (f *File) Seek(offset int64, whence int) (ret int64, err error) {
381-
errno := C.int(C.lfs_file_seek(f.lfs.lfs, &f.fptr, C.lfs_soff_t(offset), C.int(whence)))
382-
if errno < 0 {
383-
return -1, errval(errno)
383+
// FRESULT f_lseek (
384+
// FIL* fp, /* Pointer to the file object */
385+
// FSIZE_t ofs /* File pointer from top of file */
386+
// )
387+
switch whence {
388+
case io.SeekStart:
389+
case io.SeekCurrent:
390+
return -1, FileResultNotImplemented // FIXME: support these options
391+
case io.SeekEnd:
392+
return -1, FileResultNotImplemented // FIXME: support these options
393+
default:
394+
return -1, FileResultInvalidParameter
384395
}
385-
return int64(errno), nil
396+
errno := C.f_lseek(f.fileptr(), C.FSIZE_t(offset))
397+
if err := errval(errno); err != nil {
398+
return -1, err
399+
}
400+
return offset, nil
386401
}
387402

403+
/*
388404
// Tell returns the position of the file
389405
func (f *File) Tell() (ret int64, err error) {
390-
errno := C.int(C.lfs_file_tell(f.lfs.lfs, &f.fptr))
406+
errno := C.int(C.f_tell(f.fileptr(), &f.fptr))
391407
if errno < 0 {
392408
return -1, errval(errno)
393409
}

tinyfs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type Filesystem interface {
2323
// if/when that is merged and standardized.
2424
type File interface {
2525
FileHandle
26+
io.Seeker
2627
IsDir() bool
2728
Readdir(n int) (infos []os.FileInfo, err error)
2829
Stat() (info os.FileInfo, err error)

0 commit comments

Comments
 (0)