/*->c2.fsx */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>


#include "h.swis"
#include "h.kernel"
#include "h.bbc"
#include "h.os"
#include "h.wimp"
#include "h.wimpt"
#include "h.werr"

#include "h.wos"

#include "h.fsx"






os_error * fs_eof(int fh,int * eof)
{
 os_error * err;
 os_regset  rx;

 rx.r[0]=5;
 rx.r[1]=fh;

 err=os_swix(OS_Args,&rx);

 *eof=rx.r[2];

 return(err);
}



os_error * fs_extent(int fh,int * fx)
{
 os_error * err;
 os_regset  rx;

 rx.r[0]=2;
 rx.r[1]=fh;

 err=os_swix(OS_Args,&rx);

 *fx=rx.r[2];

 return(err);
}



os_error * fs_tell(int fh,int * posn)
{
 os_regset  rx;
 os_error * err;

 rx.r[0]=0;
 rx.r[1]=fh;

 err=os_swix(OS_Args,&rx);

 *posn=rx.r[2];

 return(err);
}


os_error * fs_open(char * name,int mode,int * fh)
{
 os_regset  rx;
 os_error * err;
 fstat      f;

 if(mode=='r') rx.r[0]=0x4F;
 else
 if(mode=='w') rx.r[0]=0x8F;
 else
 if(mode=='u')
 {
  err=stat(name,&f);
  if(!err)
  {
   if(f.object) rx.r[0]=0xCF;
   else         rx.r[0]=0x8F;
  }
 }

 rx.r[1]=(int)name;

 err=os_swix(OS_Find,&rx);

 *fh=rx.r[0];

 return(err);
}



os_error * fs_close(int fh,os_error * ep)
{
 os_regset  rx;
 os_error * err;

 rx.r[0]=0;
 rx.r[1]=fh;

 err=os_swix(OS_Find,&rx);

 if(!ep) return(err);
 else    return(ep);
}




os_error * fs_readat(int fh,void * b,int n,int at)
{
 os_regset rx;

 rx.r[0]=3;
 rx.r[1]=fh;
 rx.r[2]=(int)b;
 rx.r[3]=n;
 rx.r[4]=at;

 return(os_swix(OS_GBPB,&rx));
}



os_error * fs_read(int fh,void * b,int n)
{
 os_regset rx;

 rx.r[0]=4;
 rx.r[1]=fh;
 rx.r[2]=(int)b;
 rx.r[3]=n;

 return(os_swix(OS_GBPB,&rx));
}



os_error * fs_readn(int fh,void * b,int n,int * read)
{
 os_error * err;
 os_regset  rx;

 rx.r[0]=4;
 rx.r[1]=fh;
 rx.r[2]=(int)b;
 rx.r[3]=n;

 err=os_swix(OS_GBPB,&rx);

 *read=n-rx.r[3];

 return(err);
}






os_error * fs_getc(int fh,int * c)
{
 os_error * err;
 int        eof;

 err=fs_eof(fh,&eof);
 if(!err)
 {
  if(eof) *c=-1;
  else
  {
   *c=0;
   err=fs_read(fh,c,1);
  }
 }

 return(err);
}





os_error * fs_writen(int fh,void * b,int n,int * write)
{
 os_regset rx;
 os_error * err;

 if(!n) return(NULL);

 rx.r[0]=2;
 rx.r[1]=fh;
 rx.r[2]=(int)b;
 rx.r[3]=n;

 err=os_swix(OS_GBPB,&rx);

 *write=n-rx.r[3];

 return(err);
}



os_error * fs_write(int fh,void * b,int n)
{
 os_regset rx;
 os_error * err;

 if(!n) return(NULL);

 rx.r[0]=2;
 rx.r[1]=fh;
 rx.r[2]=(int)b;
 rx.r[3]=n;

 err=os_swix(OS_GBPB,&rx);

 return(err);
}


os_error * fs_writeat(int fh,void * b,int n,int at)
{
 os_regset rx;

 if(!n) return(NULL);

 rx.r[0]=1;
 rx.r[1]=fh;
 rx.r[2]=(int)b;
 rx.r[3]=n;
 rx.r[4]=at;

 return(os_swix(OS_GBPB,&rx));
}



os_error * fs_seek(int fh,int posn)
{
 os_regset rx;

 rx.r[0]=1;
 rx.r[1]=fh;
 rx.r[2]=posn;

 return(os_swix(OS_Args,&rx));
}


os_error * fs_setfileextent(int fh,int ex)
{
 os_regset rx;

 rx.r[0]=3;
 rx.r[1]=fh;
 rx.r[2]=ex;

 return(os_swix(OS_Args,&rx));
}




os_error * fs_saveblock(char *name,int type,void * start,int len)
{
 os_regset rx;

 rx.r[0]=10;
 rx.r[1]=(int)name;
 rx.r[2]=type;
 rx.r[4]=(int)start;
 rx.r[5]=((int)start)+len;

 return(os_swix(OS_File,&rx));
}



os_error * fs_loadblock(char *name,void * start)
{
 os_regset rx;

 rx.r[0]=16;
 rx.r[1]=(int)name;
 rx.r[2]=(int)start;
 rx.r[3]=0;
 rx.r[4]=0;
 rx.r[5]=0;

 return(os_swix(OS_File,&rx));
}





os_error * fs_delete(char * name)
{
 os_regset rx;

 rx.r[0]=6;
 rx.r[1]=(int)name;

 return(os_swix(OS_File,&rx));
}



os_error * fs_rename(char * old,char * new)
{
 os_regset rx;

 rx.r[0]=25;
 rx.r[1]=(int)old;
 rx.r[2]=(int)new;

 return(os_swix(OS_FSControl,&rx));
}






