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

#include "kernel.h"
#include "swis.h"


#include "modversion.h"

static int _version_decode(char *vbase)
{
  int version,minor;
  int index=0;
  char *ptr;

  // decode version number (based on the kernel's code)

  while (*vbase && index<16) {
    if (*vbase==9) index=(index+8)&~7; else index++;
    vbase++;
  }

  if (index!=16) return 0;

  while (*vbase==9) vbase++;

  // now decode to number

  if (*vbase<'0' || *vbase>'9') return 0;

  version=atoi(vbase)*10000;
  if ((ptr=strchr((char *)vbase,'.'))==NULL) return version;
  ptr++;

  index=0;
  minor=0;
  while (*ptr>='0' && *ptr<='9' && index<4) {
    minor=minor*10;
    minor+=(*ptr-'0');
    index++;
    ptr++;
  }

  while (index<4) {
    minor=minor*10;
    index++;
  }

  return version+minor;
}

int module_version(char *module_title)
{
  int *module_base;

  if (_swix(OS_Module,_INR(0,1)|_OUT(3),18,module_title,&module_base)) return 0;

  return _version_decode((char *)module_base + (*(module_base+5)));
}
