/*
** vbcc-Amiga-PowerPC version of fopen.c
**
** v0.2 18.10.97 phx
**      IsInteractive() included.
** v0.1 04.10.97 phx
*/

#include <stddef.h>
#include <stdio.h>
#include <limits.h>
#include <stdarg.h>
#include <stdlib.h>
#include <powerup/gcclib/powerup_protos.h>

extern FILE *_firstfile,*_lastfile;
extern ULONG DOSBase;


static LONG IsInteractive(BPTR file)
{
  struct Caos MyCaos;

  MyCaos.d1 = (ULONG)file;
  MyCaos.M68kCacheMode = IF_CACHEFLUSHALL;
  MyCaos.PPCCacheMode = IF_CACHEFLUSHALL;
  MyCaos.caos_Un.Offset = -216;
  MyCaos.a6 = DOSBase;
  return((LONG)PPCCallOS(&MyCaos));
}


/* opens files */
/* still very limited functionality */
FILE *fopen(const char *name,const char *mode)
{
    FILE *f;long amigamode=0;int append;
    if(*mode=='w') amigamode=MODE_NEWFILE; else amigamode=MODE_OLDFILE;
    if(*mode=='a') append=1; else append=0;
    if(!(f=malloc(sizeof(FILE)))) return(0);
    f->count=0;
    f->base=0;
    f->bufsize=0;
    f->next=0;
    if(*mode=='r') f->flags=_READABLE; else f->flags=_WRITEABLE;
    if(*mode=='b') mode++;
    if(*mode=='+') {f->flags|=_READABLE|_WRITEABLE;amigamode=MODE_READWRITE;}
    f->filehandle=(char *)PPCOpen((STRPTR)name,amigamode);
    if(!f->filehandle){free(f);return(0);}
    if(IsInteractive((BPTR)f->filehandle)) f->flags|=_LINEBUF;
    if(_lastfile){
        _lastfile->next=f;f->prev=_lastfile;_lastfile=f;
    }else{
        _firstfile=_lastfile=f;
    }
    if(append) fseek(f,0,SEEK_END);
    return(f);
}
