/*  VERY SIMPLE stub-routines to emulate some unix-io   */

#include <clib/dos_protos.h>


#define MAX_FILES 50

extern BPTR _stdin,_stdout,_stderr;

static BPTR descr[MAX_FILES];
static char dupped[MAX_FILES];

static _close_added;

static void _close_all(void)
/*  closes files; will be called at exit    */
{
    int i;BPTR p;
    for(i=0;i<MAX_FILES;i++){
        p=descr[i];
        if(!dupped[i]&&p&&p!=_stdin&&p!=_stdout&&p!=_stderr)
            close(i);
    }
}
int open(char *name,int bla)
{
    int d;
    if(!_close_added){
        if(atexit(_close_all)) return(-1);
        _close_added=1;
    }
    d=3;
    while(d<MAX_FILES&&descr[d]) d++;
    if(d<MAX_FILES&&(descr[d]=Open(name,MODE_OLDFILE))) return(d);
        else return(-1);
}
int creat(char *name,int bla)
{
    int d;
    if(!_close_added){
        if(atexit(_close_all)) return(-1);
        _close_added=1;
    }
    d=3;
    while(d<MAX_FILES&&descr[d]) d++;
    if(d<MAX_FILES&&(descr[d]=Open(name,MODE_NEWFILE))) return(d);
        else return(-1);
}
void close(int d)
{
    if(d<MAX_FILES&&descr[d]){
        if(dupped[d]) dupped[d]=0;
            else      Close(descr[d]);
        descr[d]=0;
    }
}
int read(int d,char *buf,long l)
{
    if(!descr[0]) descr[0]=_stdin;
    if(!descr[1]) descr[1]=_stdout;
    if(!descr[2]) descr[2]=_stderr;
    return Read(descr[d],buf,l);
}
int write(int d,char *buf,long l)
{
    if(!descr[0]) descr[0]=_stdin;
    if(!descr[1]) descr[1]=_stdout;
    if(!descr[2]) descr[2]=_stderr;
    return Write(descr[d],buf,l);
}
int dup2(int old,int new)
{
    if(!descr[0]) descr[0]=_stdin;
    if(!descr[1]) descr[1]=_stdout;
    if(!descr[2]) descr[2]=_stderr;
    descr[new]=descr[old];
    dupped[new]=1;
    return(0);
}

