/* $Id: national.c,v 1.5 1993/11/19 02:11:10 ppessi Exp $
 * 
 * national.c --- handle national fonts and keyboard layouts
 *
 * Author: ppessi <Pekka.Pessi@hut.fi>
 *
 * Copyright (c) 1993 Pekka Pessi
 *
 * Created      : Mon Mar 29 06:32:31 1993 ppessi
 * Last modified: Fri Nov 19 04:08:36 1993 ppessi
 *
 */

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

#include "nifty.h"
#include "amiga.h"
#include "national.h"

#define CHARSETSIZE 256

struct KeyMap *myKeyMap = NULL;

unsigned char national_table[CHARSETSIZE];
unsigned char national_kmap[CHARSETSIZE];

struct nation nations[MAX_NATIONS] = 
{ 
  { "ASCII", "usa1", NULL, NULL },
  { "Danish", "dk", NULL, 
      /* Danish I [Æ]Å\Ø{æ}å|ø */  
      "[\306]\305\\\330{\346}\345|\370" }, 
  { "Finnish", "s", NULL, 
      /* [Ä]Å\Ö{ä}å|ö */  
      "[\304]\305\\\326{\344}\345|\366" }, 
  { "French", "f", NULL, 
      /* @à[°\ç]§{é|ù}è~¨ */  
      "@\340[\227\\\337]\305{\351|\371}\350~\250" }, 
  { "German", "d", NULL,
      /* @§[Ä]Ü\Ö{ä}ü|ö~ß */
      "@\247[\304]\334\\\326{\344}\374|\366~\337" },
  { "Norwegian", "n", NULL, 
      /* $¤@É[Æ]Å\Ø^Ü`é{æ}å|ø~ü */
      "$\244@\311[\306]\305\\\330^\334`\351{\346}\345|\370~\374" },
  { "Swedish", "s", NULL, 
      /* $¤@É[Ä]Å\Ö^Ü`é{ä}å|ö~ü */
      "$\244@\311[\304]\305\\\326^\334`\351{\344}\345|\366~\374" },
  { "UK", "gb", NULL,
      /* british #£*/ 
      "#\243" }
}; /* ASCII */

struct nation *used_nation = NULL;
short no_nation = 7;

unsigned char *kmap_template =
"\000\001\002\003\004\005\006\007"
"\010\011\012\013\014\015\016\017"
"\020\021\022\023\024\025\026\027"
"\030\031\032\033\034\035\036\037"
" !c#$Y|#@ca\"--r-o+23'uP.,1o\"   ?"
"AAAAAAACEEEEIIIIDNOOOOO*OUUUUYTs"
"aaaaaaaceeeeiiiidnooooo/ouuuuyty";

/*
 * initialize current mapping
 */
void
init_national(unsigned int n)
{
  int i;
  const unsigned char *patch;

  if (n >= no_nation)
    return;

  if (used_nation == nations + n)
    return;

  used_nation = nations + n;

  for (i = 0; i < CHARSETSIZE; i++) {
    national_kmap[i] = national_table[i] = i;
  }

  /* Set the keymap */
  if (used_nation->n_kmap) 
    myKeyMap = used_nation->n_kmap;
  else if (used_nation->n_kmapname)
    myKeyMap = used_nation->n_kmap = FindKeyMap(used_nation->n_kmapname);

  /* patch send & receive tables */
  memcpy(national_kmap + 128, kmap_template, 128);
  for (patch = used_nation->n_patches; patch && *patch; patch += 2) {
    national_kmap[patch[1]] = patch[0];
    national_table[patch[0]] = patch[1];
  }
}

/*
 * Set the nation by name 
 */
void
setnationbyname(char *name)
{
  int i = no_nation - 1;
  while(i >= 0) { 
    if (!Stricmp(nations[i].n_name, name)) {
      init_national(i);
      return;
    }
    i--;
  }
  if (i < 0)
    puts("National code not found");
}

/*
 * Parse national resources
 */
void
natinit(void)
{
  char *temp;

  if ((temp = getprofile(PROGNAME ".nation")) != NULL) {
    setnationbyname(temp);
  } else {
    init_national(0);
  }
 
 if ((temp = getprofile(PROGNAME ".keymap")) != NULL ||
     (temp = getprofile(PROGNAME ".keyboard")) != NULL) {
    used_nation->n_kmapname = temp;
    used_nation->n_kmap = myKeyMap = FindKeyMap(temp);
  }
}
