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

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

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

extern APTR DOSBase;
extern LONG __WarpIsInteractive(BPTR);


char *_open(char *f,const char *name,long mode)
{
  struct PPCArgs pa;
  char *fh;

  if (!f) {
#ifdef _ERRNO_
    errno = EBADF;
#endif
    return (NULL);
  }
  switch (mode) {
    case 0:
      mode = MODE_OLDFILE;
      break; 
    case 1:
      mode = MODE_NEWFILE;
      break; 
    case 2:
      mode = MODE_READWRITE;
      break; 
    default:
#ifdef _ERRNO_
      errno = EINVAL;
#endif
      return (NULL);
  }

  pa.PP_Code = DOSBase;
  pa.PP_Offset = -30;  /* _LVOOpen */
  pa.PP_Flags = pa.PP_StackSize = 0;
  pa.PP_Stack = NULL;
  pa.PP_Regs[PPREG_D1] = (ULONG)name;
  pa.PP_Regs[PPREG_D2] = (ULONG)mode;
  pa.PP_Regs[PPREG_A6] = (ULONG)DOSBase;
  Run68K(&pa);
  if (!(fh = (char *)pa.PP_Regs[PPREG_D0])) {
#ifdef _ERRNO_
    errno = ENOENT;
#endif
    return (NULL);
  }

  ((FILE *)f)->filehandle = fh;
  if (__WarpIsInteractive((BPTR)fh))
    ((FILE *)f)->flags |= _LINEBUF;
  return (fh);
}
