
/* Program to effectively perform an RMEnsure in the manner described
   in the docs. This does the appropriate 'soft' loading.

   by Rick Hudson, 1999

*/


#ifndef _playit_ensure_c
#define _playit_ensure_c

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

#include "os.h"
#include "wimp.h"

#include "playitap.h"


static playit_error serr;

static playit_error *MakeStaticError(char *mess)
{
  serr.errnum=0;
  strcpy(serr.errmess,mess);
  return &serr;
}


int main(int argc, char *argv[])
{
  int minver,version;
  playit_error *err = NULL;
  int par=1;
  bool errvar = FALSE;

  if (argv[par][0]=='-' && tolower(argv[par][1])=='e' && !argv[par][2]) {
    errvar=TRUE;
    par++;
  }
  if (par>=argc) err=MakeStaticError(
    "Syntax: Ensure [-e] <min version> [<driver leaf>]");
  else if (sscanf(argv[par],"%d.%d",&minver,&version)==2)
    minver = minver*100+version;
  if (!err) if (minver<0 || minver>299) err=MakeStaticError("Bad version number");
  if (!err) {
    wimp_t taskh;
    bool wimpok = getenv("Desk$State") != NULL;
    if (wimpok) if (!xwimp_initialise(wimp_VERSION_RO3,"PlayIt Ensure",NULL,NULL,&taskh))
      wimpok=TRUE;
    err=xplayit_ensure(minver,"PlayIt:",wimpok,&version);
    if (wimpok) xwimp_close_down(taskh);
  }
  if (err) version=0;
  else if (++par<argc) {
    char st[64];
    sprintf(st,"PlayIt:%s",argv[par]);
    err=xplayit_load_driver(st);
  }
  xos_set_var_val("PlayIt$Version",(byte*)&version,4,0,os_VARTYPE_NUMBER,NULL,NULL);
  if (err) {
    if (!errvar) fprintf(stderr,"%s\n",err->errmess);
    else xos_set_var_val("PlayIt$Error",(byte*)err->errmess,strlen(err->errmess),0,
      os_VARTYPE_STRING,NULL,NULL);
  }
  exit(err ? EXIT_FAILURE:EXIT_SUCCESS);
}


#endif
