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

#include "microc.h"
#include "microcerrs.h"


char *load_program(char *fname);
int unknown_function(char *name);
int poll(char *prog);



int main(int argc, char *argv[]) {

  char *ptr;
  int err;

  if (argc != 2) {
    printf("Usage: microc <filename>\n");
    exit(1);
  }

  ptr = load_program(argv[1]);
  if (!ptr) {
    printf("Unable to load program");
    exit(-1);
  }

  err = microc_start(ptr, unknown_function, poll);
  if (err) {
    printf("error code %d (%s) at offset %d\n", err &255, errortext[err], err>>8);
  }
}


// called when an unknown function is encountered
// int unknown_function(char *name, struct variable *args, int argc, char *prog) {
int unknown_function(char *name) {
// DOESN'T WORK
  return 0;
}


// called regularly by the interpreter
int poll(char *prog) {
// DOESN'T WORK
  return 0;
}



char *load_program(char *fname) {
  FILE *fp;
  int size;
  char *ptr;

  if ((fp=fopen(fname, "rb")) == NULL)  return NULL;
  fseek(fp, 0, SEEK_END);
  size = (int)ftell(fp);
  fseek(fp, 0, SEEK_SET);

  ptr = malloc(size+100);
  if (!ptr) {
    fclose(fp);
    return NULL;
  }

  fread(ptr, 1, size, fp);
  fclose(fp);
  memset(ptr+size, 0, 100);             // pad with lots of 0's

  return ptr;
}
