#define DEF_NDIR
#include <stat.h>
#include <osbind.h>
#include "ndir.h"
extern char *malloc();
#define MALLOC(x) (x *)malloc(sizeof(x))

DIR *opendir(name)char *name;
{

    DIR *directory;
    int status;
    char *p;

    if((directory=MALLOC(DIR))==NULL)
        return NULL;
    
    directory->FileFlags=D_FIRST;
    
    /* parse and construct full path name */
    if(index(name,':')!=NULL)
        strcpy(directory->FilePath,name);
    else
    {
        status=Dgetdrv();
        directory->FilePath[0]=status+'A';
        directory->FilePath[1]=':';
        Dgetpath(directory->FilePath+2,status+1);
        strcat(directory->FilePath,"\\");
        strcat(directory->FilePath,name);
    }
    
    for(p=directory->FilePath;*p;p++)
        if(*p=='/') *p='\\';
    if(index(directory->FilePath,'*') || index(directory->FilePath,'?'))
        ;
    else
    {
        p=directory->FilePath;
        if(p[strlen(p)-1])
            strcat(p,"\\*.*");
        else
            strcat(p,"*.*");
    }
    directory->FileDirect.d_ino=0;
    return directory;
}

static struct direct *getdent(dir)DIR *dir;
{
    struct direct *d_ans= &(dir->FileDirect);

    strcpy(d_ans->d_name,dir->FileName);
    d_ans->d_namlen=strlen(d_ans->d_name);
    d_ans->d_reclen=sizeof(struct direct);
    d_ans->d_ino++;
    return d_ans;
}

struct direct *readdir(dir)DIR *dir;
{
    int res;
    DMABUFFER *hold;

    struct direct *d_struct= &(dir->FileDirect);
    hold=Fgetdta();
    Fsetdta(dir);
    if(dir->FileFlags & D_FIRST)
    {
        res=Fsfirst(dir->FilePath,0xff);
        dir->FileFlags &= ~(D_FIRST);
    }
    else
        res=Fsnext();
    Fsetdta(hold);
    if(!res)
        return getdent(dir);
    else return NULL;
}

void closedir(dir)DIR *dir;
{
    free(dir);
}

void rewinddir(dir)DIR *dir;
{
    dir->FileFlags=D_FIRST;
    dir->FileDirect.d_ino=0;
}

void seekdir(dir,where)DIR *dir;long where;
{
    struct direct *w;
    rewind(dir);
    while(dir->FileDirect.d_ino!=(where-1))
        w=readdir(dir);
}

long telldir(dir)DIR *dir;
{
    return (long)(dir->FileDirect.d_ino);
}
