/*
 * $Id: config,v 1.5 1999/12/27 02:26:37 joseph Exp $
 *
 */

#include <ctype.h>
#include <stdlib.h>
#include "memleak.h"
#include <string.h>

#include "config.h"
#include "defines.h"
#include "err.h"
#include "log.h"
#include "msgs.h"

static const char config_FileName[] = TASK_CHOICESDIR".Choices";

static struct {
  MessagesFD fd;
  bool open;
  char *buffer;
} config_msgs;

static void config_close()
{
  if (config_msgs.open)
  {
    E(msgtrans_close(&config_msgs.fd));
    config_msgs.open = false;
  }
}

static bool config_load()
{
  /* Use of memset slightly evil */
  memset(&config_msgs, 0, sizeof(config_msgs));
  if (!msgtrans_load(config_FileName, &config_msgs.fd, &config_msgs.buffer))
    return (config_msgs.open = true);
  else
  {
#ifndef FEATURE_NOCHOICESOK
    xsyslog_logmessage(log_NAME, msgs_lookup("NoChoices"), log_MiscInfo);
#endif
  }
  return false;
}

void config_init()
{
  if (config_load())
    atexit(config_close);
}

const char *config_lookup(const char *token)
{
  if (config_msgs.open)
    return msgtrans_lookup(&config_msgs.fd, token);
  else
  {
    const char *result = strchr(token, ':');
    return result ? result + 1 : NULL;
  }
}

int config_lookup_num(const char *token)
{
  const char *str = config_lookup(token);
  return str ? atoi(str) : 0;
}

float config_lookup_float(const char *token)
{
  const char *str = config_lookup(token);
  return str ? (float) atof(str) : 0.0f;
}

bool config_lookup_bool(const char *token)
{
  const char *str = config_lookup(token);
  return str ? (toupper(str[0]) == 'Y') : false;
}

void config_reload()
{
  if (config_msgs.open)
  {
    E(msgtrans_close(&config_msgs.fd));
    config_msgs.open = false;
    free(config_msgs.buffer);
    config_msgs.buffer = 0;
  }
  config_load();
}
