From 08b4ed1035a46d9b36dc10469100a38c97005287 Mon Sep 17 00:00:00 2001 From: uz Date: Wed, 30 May 2012 19:37:57 +0000 Subject: [PATCH] Added the POSIX functions opendir() and closedir(). git-svn-id: svn://svn.cc65.org/cc65/trunk@5666 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/cbm/Makefile | 14 +++++++----- libsrc/cbm/closedir.s | 53 +++++++++++++++++++++++++++++++++++++++++++ libsrc/cbm/dir.inc | 27 ++++++++++++++++++++++ libsrc/cbm/opendir.c | 52 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 libsrc/cbm/closedir.s create mode 100644 libsrc/cbm/dir.inc create mode 100644 libsrc/cbm/opendir.c diff --git a/libsrc/cbm/Makefile b/libsrc/cbm/Makefile index a650381df..cc8fc7b17 100644 --- a/libsrc/cbm/Makefile +++ b/libsrc/cbm/Makefile @@ -31,7 +31,8 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include C_OBJS = cbm_dir.o \ cbm_load.o \ - cbm_save.o + cbm_save.o \ + opendir.o S_OBJS = c_acptr.o \ c_basin.o \ @@ -44,13 +45,13 @@ S_OBJS = c_acptr.o \ c_clrch.o \ c_iobase.o \ c_listen.o \ - c_load.o \ + c_load.o \ c_open.o \ c_readst.o \ - c_save.o \ + c_save.o \ c_setlfs.o \ c_setnam.o \ - c_talk.o \ + c_talk.o \ c_unlsn.o \ c_untlk.o \ cbm_close.o \ @@ -59,9 +60,10 @@ S_OBJS = c_acptr.o \ cbm_write.o \ cclear.o \ chline.o \ - clock.o \ + clock.o \ close.o \ - ctype.o \ + closedir.o \ + ctype.o \ cvline.o \ diskcmd.o \ exehdr.o \ diff --git a/libsrc/cbm/closedir.s b/libsrc/cbm/closedir.s new file mode 100644 index 000000000..500661229 --- /dev/null +++ b/libsrc/cbm/closedir.s @@ -0,0 +1,53 @@ +; +; Ullrich von Bassewitz, 2012-05-30 +; +; Based on C code by Groepaz +; +; int __fastcall__ closedir(DIR *dir); +; + + + .include "dir.inc" + .include "zeropage.inc" + + .import _close, _free + + +.proc _closedir + + sta ptr1 + stx ptr1+1 + +; Load dir->fd + + ldy #DIR::fd+1 + lda (ptr1),y + tax + dey + lda (ptr1),y + +; Close the file + + jsr _close + +; Save the error code + + pha + txa + pha + +; Free the memory block + + lda ptr1 + ldx ptr1+1 + jsr _free + +; Return the error code from close() + + pla + tax + pla + rts + +.endproc + diff --git a/libsrc/cbm/dir.inc b/libsrc/cbm/dir.inc new file mode 100644 index 000000000..447b35c8f --- /dev/null +++ b/libsrc/cbm/dir.inc @@ -0,0 +1,27 @@ +; +; Internal include file, do not use directly. +; Written by Ullrich von Bassewitz. Based on C code by Groepaz. +; + + + +;------------------------------------------------------------------------------ +; Data structures + +.struct DIR + fd .word + offs .word + name .byte 16+1 +.endstruct + + +;------------------------------------------------------------------------------ +; C callable functions + + .global _opendir + .global _closedir + .global _readdir + .global _telldir + .global _rewinddir + + diff --git a/libsrc/cbm/opendir.c b/libsrc/cbm/opendir.c new file mode 100644 index 000000000..cf8cfb631 --- /dev/null +++ b/libsrc/cbm/opendir.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include +#include +#include "dir.h" + + + +DIR* __fastcall__ opendir (const char*) +{ + unsigned char buffer[8+16+1+7]; + int count; + DIR d; + DIR* dir = 0; + + /* Setup file name and offset */ + d.name[0] = '$'; + d.name[1] = '\0'; + d.offs = 0; + + /* Open the directory on disk for reading */ + d.fd = open (d.name, O_RDONLY); + if (d.fd >= 0) { + + /* Skip the disk header */ + count = read (d.fd, buffer, sizeof (buffer)); + if (count == sizeof (buffer)) { + + /* Allocate memory for the DIR structure returned */ + dir = malloc (sizeof (*dir)); + + /* Copy the contents of d */ + if (dir) { + memcpy (dir, &d, sizeof (d)); + } else { + /* Set an appropriate error code */ + errno = ENOMEM; + } + } else if (count >= 0) { + /* Short read - need to set an error code */ + errno = EIO; + } + } + + /* Done */ + return dir; +} + + +