#ifndef lint
static char sccs_id[] = "%A%";
#endif
/*
 * charset.c -- support for different charsets
 *
 * Author: Pekka Nikander <pnr@innopoli.ajk.tele.fi>
 *
 * Copyright 1992 by Nixu Oy, Helsinki, Finland
 *
 * Created: Thu Nov  5 14:17:03 1992
 * Last modified: Thu Nov  5 16:30:35 1992 pnr
 */

#include "3270_enc.h" 

typedef unsigned char u_char;
#define NULL 0

extern u_char ebc2cg[256];
extern u_char cg2ebc[256];
extern u_char asc2cg[256];

typedef struct {
    u_char cg1;			/* First CG value to swap */
    u_char cg2;			/* Second CG value to swap */
} ReplaceCodes;

typedef struct {
    u_char inAsc;		/* Ascii input value to translate */
    u_char outAsc;		/* Ascii translation result */
} ReplaceKbd;

ReplaceCodes finnish[] = {
    { CG_NUMBER,	CG_CADIAERESIS, },
    { CG_AT,		CG_CODIAERESIS, },
    { CG_DOLLAR,	CG_CADOT,	},
    { CG_LBRACE,	CG_LADIAERESIS, },
    { CG_RBRACE,	CG_LADOT	},
    /* Don't know about CG_LODIAERESIS */
    { CG_SOLIDBAR,	CG_EXCLAMATION  },
    { 0,		0		}
};

ReplaceKbd finnish7kbd[] = {
    { '[',  '\304', },
    { ']',  '\305', },
    { '\\', '\326', },
    { '{',  '\344', },
    { '}',  '\345', },
    { '|',  '\366', },
    { 0,    0    }
};

struct { 
    char *name;
    ReplaceCodes *codes;
    ReplaceKbd *kbd;
} charsets[] = {
    { "default", NULL },
    { "finnish8", finnish, NULL },
    { "finnish7", finnish, finnish7kbd },
    { NULL, 	 NULL },
};

void
setup_charset(name)
char *name;
{
    int i, j;
    int ain, aout, c1, c2, e1, e2;

    for (i = 0; charsets[i].name != NULL; i++) {
	if (strcmp(name, charsets[i].name) == 0) {
	    break;
	}
    }
    if (charsets[i].codes != NULL) {
	for (j = 0; charsets[i].codes[j].cg1 != 0; j++) {
	    c1 = charsets[i].codes[j].cg1;
	    c2 = charsets[i].codes[j].cg2;
	    e1 = cg2ebc[c1];
	    e2 = cg2ebc[c2];

	    cg2ebc[c1] = e2;
	    cg2ebc[c2] = e1;
	    ebc2cg[e1] = c2;
	    ebc2cg[e2] = c1;
	}
    }
    if (charsets[i].kbd != NULL) {
	for (j = 0; charsets[i].kbd[j].inAsc != 0; j++) {
	    ain  = charsets[i].kbd[j].inAsc;
	    aout = charsets[i].kbd[j].outAsc;
	    c1 = asc2cg[ain];
	    asc2cg[ain] = asc2cg[aout];
	    asc2cg[aout] = c1;
	}
    }
}

	    
	

