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

#include "Popcorn:h.Popcorn"

#ifdef DESKLIB
#include "DeskLib:h.Core"
#include "DeskLib:h.File"
#include "DeskLib:h.Str"
#else
#include "PopFiles.h"
#endif

_kernel_oserror ERROR_OPEN = {0, "Couldn't open resource file"};

_kernel_oserror _err_returned;

_kernel_oserror *_err(char *msg, int line, FILE *handle) {
  sprintf(_err_returned.errmess, "LoadResourceFile: %s (line %d).", msg, line);
  if (handle != NULL) fclose(handle);
  return &_err_returned;
}

int get_resource_line(char *temp_name) {
  resource[resource_free]->file = malloc(1 + strlen(temp_name));
  strcpy(resource[resource_free]->file, temp_name);
  resource[resource_free]->addr = NULL;
  if (!file_exists(temp_name)) return FALSE;
  resource[resource_free]->size = file_size(temp_name);
  return TRUE;
}

_kernel_oserror *Popcorn_LoadResourceFile(char *filename) {
  FILE          *handle;
  char		temp_name[256];
  int		m, line = 0, from, to;

  if ((handle = fopen(filename, "rb")) == NULL) return(&ERROR_OPEN);

  while (!feof(handle)) {
    /* new bit added by rik - if resource name is "!!!!" then   */
    /* it describes a loop to be performed on the next line     */
    line++;
    fscanf(handle, "%s", temp_name);
    if (strcmp(temp_name, "!!!!") == 0) {
      char main_name[256], main_group[8];
      fscanf(handle, " %d %d\n", &from, &to);
      line++;
      fscanf(handle, "%s %s\n", main_group, main_name);
      for (m=from; m<=to; m++) {
        resource[resource_free] = malloc(sizeof(struct resource));
        resource[resource_free]->group = *((int *)main_group);
        sprintf(temp_name, main_name, m);
        if (get_resource_line(temp_name) == FALSE)
          return(_err("Couldn't find resource", line, handle));
        resource_free++;
      }
    } else {
      resource[resource_free] = malloc(sizeof(struct resource));
      resource[resource_free]->group = *((int *)temp_name);
      fscanf(handle, " %s\n", temp_name);
      if (get_resource_line(temp_name) == FALSE)
        return(_err("Couldn't find resource", line, handle));
      resource_free++;
    }
  }
  fclose(handle);
  return NULL;
}
