/*
** vbcc-PowerOpen/WarpOS Lowlevel seek() function
**
** v0.2 29.10.98 phx
**      disabled errno usage
** v0.1 01.08.98 phx
*/

#include <stdio.h>
#ifdef _ERRNO_
#include <errno.h>
#endif

#include <dos/dos.h>
#include <dos/dos.h>
#include <powerpc/powerpc.h>
#include <clib/powerpc_protos.h>

extern APTR DOSBase;


long _seek(char *fh,long offs,int orig)
{
  struct PPCArgs pa;
  long r;

#ifdef _ERRNO_
  if (!fh) {
    errno = EBADF;
    return (-1);
  }
  if (orig<OFFSET_BEGINNING || orig>OFFSET_END) {
    errno = EINVAL;
    return (-1);
  }
#endif

  pa.PP_Code = DOSBase;
  pa.PP_Offset = -66;  /* _LVOSeek */
  pa.PP_Flags = pa.PP_StackSize = 0;
  pa.PP_Stack = NULL;
  pa.PP_Regs[PPREG_D1] = (ULONG)fh;
  pa.PP_Regs[PPREG_D2] = (ULONG)offs;
  pa.PP_Regs[PPREG_D3] = (ULONG)orig;
  pa.PP_Regs[PPREG_A6] = (ULONG)DOSBase;
  Run68K(&pa);
#ifdef _ERRNO_
  if ((r = (long)pa.PP_Regs[PPREG_D0]) == -1)
    errno = EIO;
  return (r);
#else
  return ((long)pa.PP_Regs[PPREG_D0]);
#endif
}
