home *** CD-ROM | disk | FTP | other *** search
- /*
- ** 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);
- }
-