#include <perms.h>
static int *Arguments;
static int *Environs;
void Impmain(void);
int Splitiolist(_imp_string Iolist);
void Initialiseiosystem(void);
void Terminateiosystem(void);
static void Selectimptype(void);
void Startimp(int *Envp, int *Argv, int Argc) {
  if (_imp_on_event(9, 10)) {
    int Eventno;
    int Sub;
    int Info;
    int Line;
    _imp_string Msg;
    Eventno = Event.Event();
    Sub = Event.Sub;
    Info = Event.Info;
    Line = Event.Line;
    Msg = Event.Message;
    Debugnewline;
    Debugstring;
    Debugstring;
    Debugstring;
    Debugnewline;
    Debugstring;
    Debugstring;
    Debugstring;
    Debugstring;
    Debugnewline;
    Debugstring;
    Debugnewline;
    if (Eventno == 6 && Sub == 2 && Info == 1) {
      Debugstring;
      Debugstring;
      Debugstring;
      Debugnewline;
    }
    if (Eventno == 9) {
      if ((Sub == 4) || (Sub == 5)) {
        Debugstring;
        Debugstring;
      }
      if (Sub == 4) {
        Debugstring;
        Debugnewline;
      }
      if (Sub == 5) {
        Debugstring;
        Debugnewline;
      }
      if ((Sub == 4) || (Sub == 5)) Debugstring;
    }
    if (Eventno == 10) {
      Debugstring;
      Debugstring;
      Debugnewline;
    }
    Debugnewline;
    exit(0);
  }
  Arguments = Argv;
  Environs = Envp;
  Setdebuglevel;
  if (*Length(Getenv) != 0) Setdebuglevel;
  Initialiseiosystem();
  Selectimptype();
  Terminateiosystem();
  Setdebuglevel;
  Exit;
}
int Getenvironment(void) { return (Environs); }
int Getarguments(void) { return (Arguments); }
static void Usage(void) {
  Debugstring;
  Debugnewline;
  Debugstring;
  Debugnewline;
  Debugstring;
  Debugnewline;
  Debugstring;
  Debugnewline;
  Exit;
}
static int /* boolean */ Runmode(_imp_string Arg1) {
  _imp_string S;
  _imp_string A;
  _imp_string B;
  _imp_string C;
  S = Arg1;
  *Length(A) = 0;
  B = Tostring(Filesep);
  *Length(C) = 0;
  if (!_imp_resolve(S, A, B, C)) _imp_signal(7, 0, 0);
  if (S == A) return (0);
  if (S == B) return (1);
  if (*Length(A) > 0) return (1);
  if (*Length(C) > 0) return (1);
  return (0);
}
static void Imptype1(void) {
  int Errcount = 0;
  int Argcount = Getargcount;
  if (Argcount > 1)
    if (Argcount > 3) {
      Usage();
      Errcount++;
    } else {
      if (Splitiolist(Getarg) != 0) Errcount++;
    }
  if (Errcount == 0) {
    if (Argcount > 2) Setdebuglevel;
    if ((Debugmode & Dbgmain) != 0) {
      Debugstring;
      Debugnewline;
    }
    Impmain();
    if ((Debugmode & Dbgmain) != 0) {
      Debugstring;
      Debugnewline;
    }
  }
}
static void Imptype2(void) {
  if ((Debugmode & Dbgmain) != 0) {
    Debugstring;
    Debugnewline;
  }
  Impmain();
  if ((Debugmode & Dbgmain) != 0) {
    Debugstring;
    Debugnewline;
  }
}
static void Selectimptype(void) {
  if (Runmode(Getarg))
    Imptype1();
  else
    Imptype2();
}
void Primexit(int Status);
int Primgeterr(void);
int Primgeterrhandle(void);
int Primgetinhandle(void);
int Primgetouthandle(void);
void Primwritedouble(int Handle, double D);
int Primopenfile(int Modeaddress, int Filenameaddress);
int Primtell(int Handle);
void Primfilerewind(int Handle);
void Primfileseek(int Handle, int Displacement, int Pos);
void Primclose(int Handle);
int Primreadbytes(int Handle, int Count, int Itemsz, unsigned char *Buffer);
int Primwritebytes(int Handle, int Count, int Itemsz, unsigned char *Buffer);
int Primgetchar(int Handle);
void Primputchar(int Handle, int Ch);
void Primflush(int Handle);
void Exit(int Status) { Primexit(Status); }
int Geterror(void) { return (Primgeterr()); }
int Getstderrhandle(void) { return (Primgeterrhandle()); }
int Getstdinhandle(void) { return (Primgetinhandle()); }
int Getstdouthandle(void) { return (Primgetouthandle()); }
void Putdouble(int Handle, double D) { Primwritedouble(Handle, D); }
int Openfile(int Modeaddress, int Filenameaddress) {
  return (Primopenfile(Modeaddress, Filenameaddress));
}
int Tell(int Handle) { return (Primtell(Handle)); }
void Filerewind(int Handle) { Primfilerewind(Handle); }
void Fileseek(int Handle, int Displacement, int Pos) {
  Primfileseek(Handle, Displacement, Pos);
}
void Close(int Handle) { Primclose(Handle); }
int Readbytes(int Handle, int Count, int Itemsz, unsigned char *Buffer) {
  return (Primreadbytes(Handle, Count, Itemsz, *Buffer));
}
int Writebytes(int Handle, int Count, int Itemsz, unsigned char *Buffer) {
  return (Primwritebytes(Handle, Count, Itemsz, *Buffer));
}
int Getchar(int Handle) { return (Primgetchar(Handle)); }
void Putchar(int Handle, int Ch) { Primputchar(Handle, Ch); }
void Flush(int Handle) { Primflush(Handle); }
