Made use of dirent support in cc65 version 2.11.
diff --git a/contiki-apple2/lib/cfs.c b/contiki-apple2/lib/cfs.c
index 0c25713..be57120 100644
--- a/contiki-apple2/lib/cfs.c
+++ b/contiki-apple2/lib/cfs.c
@@ -30,14 +30,11 @@
*
* Author: Adam Dunkels <adam@sics.se>
*
- * $Id: cfs.c,v 1.3 2005/05/08 11:44:17 oliverschmidt Exp $
+ * $Id: cfs.c,v 1.4 2006/04/09 23:28:10 oliverschmidt Exp $
*/
-#include <fcntl.h>
-#include <unistd.h>
#include <string.h>
-#include <stdio.h>
#include "contiki.h"
#include "kfs.h"
@@ -45,61 +42,37 @@
#include "cfs.h"
-static char cwd[FILENAME_MAX];
-
/*---------------------------------------------------------------------------*/
int
cfs_opendir(struct cfs_dir *dirp, const char *name)
{
- if(strcmp(name, ".") == 0) {
- name = getcwd(cwd, sizeof(cwd));
- }
if(strcmp(name, "/") == 0) {
name = kfs_getdir();
}
- if((dirp->fd = cfs_open(name, CFS_READ)) != -1) {
- if(cfs_read(dirp->fd,
- dirp->block.bytes,
- sizeof(dirp->block)) == sizeof(dirp->block)) {
- dirp->entry_length = dirp->block.bytes[0x23];
- dirp->entries_per_block = dirp->block.bytes[0x24];
- dirp->current_entry = 1;
- return 0;
- }
- cfs_close(dirp->fd);
+ dirp->dir = opendir(name);
+ if(dirp->dir == NULL) {
+ return -1;
}
- return -1;
+ return 0;
}
/*---------------------------------------------------------------------------*/
int
-cfs_readdir(struct cfs_dir *dirp, struct cfs_dirent *dirent)
+cfs_readdir(struct cfs_dir *dirp, struct cfs_dirent *direntp)
{
- char *entry;
+ struct dirent *dirent = readdir(dirp->dir);
+ if(dirent == NULL) {
+ return -1;
+ }
- do {
- if(dirp->current_entry == dirp->entries_per_block) {
- if(cfs_read(dirp->fd,
- dirp->block.bytes,
- sizeof(dirp->block)) != sizeof(dirp->block)) {
- return -1;
- }
- dirp->current_entry = 0;
- }
- entry = dirp->block.content.entries +
- dirp->current_entry * dirp->entry_length;
- ++dirp->current_entry;
- } while (entry[0x00] == 0);
-
- entry[0x01 + (entry[0x00] & 15)] = '\0';
- strcpy(dirent->name, &entry[0x01]);
- dirent->size = *(unsigned int *)&entry[0x13];
+ strcpy(direntp->name, dirent->d_name);
+ direntp->size = 0;
return 0;
}
/*---------------------------------------------------------------------------*/
int
cfs_closedir(struct cfs_dir *dirp)
{
- return cfs_close(dirp->fd);
+ return closedir(dirp->dir);
}
/*---------------------------------------------------------------------------*/
diff --git a/contiki-apple2/lib/cfs.h b/contiki-apple2/lib/cfs.h
index d4f182b..bae94c5 100644
--- a/contiki-apple2/lib/cfs.h
+++ b/contiki-apple2/lib/cfs.h
@@ -30,13 +30,14 @@
*
* Author: Adam Dunkels <adam@sics.se>
*
- * $Id: cfs.h,v 1.3 2005/04/18 21:41:07 oliverschmidt Exp $
+ * $Id: cfs.h,v 1.4 2006/04/09 23:28:10 oliverschmidt Exp $
*/
#ifndef __CFS_H__
#define __CFS_H__
#include <fcntl.h>
#include <unistd.h>
+#include <dirent.h>
#define CFS_READ (O_RDONLY)
#define CFS_WRITE (O_WRONLY | O_CREAT | O_TRUNC)
@@ -47,18 +48,7 @@
#define cfs_write write
struct cfs_dir {
- int fd;
- unsigned char entry_length;
- unsigned char entries_per_block;
- unsigned char current_entry;
- union {
- unsigned char bytes[512];
- struct {
- unsigned prev_block;
- unsigned next_block;
- char entries[1];
- } content;
- } block;
+ DIR *dir;
};
struct cfs_dirent {
@@ -67,7 +57,7 @@
};
int cfs_opendir(struct cfs_dir *dirp, const char *name);
-int cfs_readdir(struct cfs_dir *dirp, struct cfs_dirent *dirent);
+int cfs_readdir(struct cfs_dir *dirp, struct cfs_dirent *direntp);
int cfs_closedir(struct cfs_dir *dirp);
#endif /* __CFS_H__ */