static char rcsid[] = "@(#)$Id: cs_fallback.c,v 1.9 2006/04/09 07:37:07 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.9 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
 *****************************************************************************/

#include "headers.h"
#include "s_me.h"
#include "cs_imp.h"

DEBUG_VAR(Debug,__FILE__,"charset");

static struct {
    unsigned char c;
    uint16 c1;
} fallback_table[] = {
    { '\r', 0x000D },
    { '\n', 0x000A },
    { '\t', 0x0009 },
    /* This table defines mapping between charset used in string
     * constants and unicode. This includes only characters, which
     * are likely to be existed in all sets.
     */  
    { ' ', 0x0020        /* ;*;SPACE;;; */            },
    { '!', 0x0021        /* ;*;EXCLAMATION MARK;;; */ },
    { '"', 0x0022        /* ;*;QUOTATION MARK;;; */   },
    { '%', 0x0025        /* ;*;PERCENT SIGN;;; */     },
    { '&', 0x0026        /* ;*;AMPERSAND;;; */        },
    { '(', 0x0028        /* ;*;LEFT PARENTHESIS;;OPENING PARENTHESIS; */ },
    { ')', 0x0029        /* ;*;RIGHT PARENTHESIS;;CLOSING PARENTHESIS; */ },
    { '*', 0x002A        /* ;*;ASTERISK;;; */  },
    { '+', 0x002B        /* ;*;PLUS SIGN;;; */ },
    { ',', 0x002C        /* ;*;COMMA;;;  */ },
    { '-', 0x002D        /* ;*;HYPHEN-MINUS;;; */ },
    { '.', 0x002E        /* ;*;FULL STOP;;PERIOD; */ },
    { '/', 0x002F        /* ;*;SOLIDUS;;SLASH; */ },
    { '0', 0x0030        /* ;*;DIGIT ZERO;;; */ },
    { '1', 0x0031        /* ;*;DIGIT ONE;;; */ },
    { '2', 0x0032        /* ;*;DIGIT TWO;;; */ },
    { '3', 0x0033        /* ;*;DIGIT THREE;;; */ },
    { '4', 0x0034        /* ;*;DIGIT FOUR;;; */ },
    { '5', 0x0035        /* ;*;DIGIT FIVE;;; */ },
    { '6', 0x0036        /* ;*;DIGIT SIX;;; */ },
    { '7', 0x0037        /* ;*;DIGIT SEVEN;;; */ },
    { '8', 0x0038        /* ;*;DIGIT EIGHT;;; */ },
    { '9', 0x0039        /* ;*;DIGIT NINE;;; */ },
    { ':', 0x003A        /* ;*;COLON;;; */ },
    { ';', 0x003B        /* ;*;SEMICOLON;;; */ },
    { '<', 0x003C        /* ;*;LESS-THAN SIGN;;; */ },
    { '=', 0x003D        /* ;*;EQUALS SIGN;;; */ },
    { '>', 0x003E        /* ;*;GREATER-THAN SIGN;;; */ },
    { '?', 0x003F        /* ;*;QUESTION MARK;;; */ },
    { 'A', 0x0041        /* ;*;LATIN CAPITAL LETTER A;;; */ },
    { 'B', 0x0042        /* ;*;LATIN CAPITAL LETTER B;;; */ },
    { 'C', 0x0043        /* ;*;LATIN CAPITAL LETTER C;;; */ },
    { 'D', 0x0044        /* ;*;LATIN CAPITAL LETTER D;;; */ },
    { 'E', 0x0045        /* ;*;LATIN CAPITAL LETTER E;;; */ },
    { 'F', 0x0046        /* ;*;LATIN CAPITAL LETTER F;;; */ },
    { 'G', 0x0047        /* ;*;LATIN CAPITAL LETTER G;;; */ },
    { 'H', 0x0048        /* ;*;LATIN CAPITAL LETTER H;;; */ },
    { 'I', 0x0049        /* ;*;LATIN CAPITAL LETTER I;;; */ },
    { 'J', 0x004A        /* ;*;LATIN CAPITAL LETTER J;;; */ },
    { 'K', 0x004B        /* ;*;LATIN CAPITAL LETTER K;;; */ },
    { 'L', 0x004C        /* ;*;LATIN CAPITAL LETTER L;;; */ },
    { 'M', 0x004D        /* ;*;LATIN CAPITAL LETTER M;;; */ },
    { 'N', 0x004E        /* ;*;LATIN CAPITAL LETTER N;;; */ },
    { 'O', 0x004F        /* ;*;LATIN CAPITAL LETTER O;;; */ },
    { 'P', 0x0050        /* ;*;LATIN CAPITAL LETTER P;;; */ },
    { 'Q', 0x0051        /* ;*;LATIN CAPITAL LETTER Q;;; */ },
    { 'R', 0x0052        /* ;*;LATIN CAPITAL LETTER R;;; */ },
    { 'S', 0x0053        /* ;*;LATIN CAPITAL LETTER S;;; */ },
    { 'T', 0x0054        /* ;*;LATIN CAPITAL LETTER T;;; */ },
    { 'U', 0x0055        /* ;*;LATIN CAPITAL LETTER U;;; */ },
    { 'V', 0x0056        /* ;*;LATIN CAPITAL LETTER V;;; */ },
    { 'W', 0x0057        /* ;*;LATIN CAPITAL LETTER W;;; */ },
    { 'X', 0x0058        /* ;*;LATIN CAPITAL LETTER X;;; */ },
    { 'Y', 0x0059        /* ;*;LATIN CAPITAL LETTER Y;;; */ },
    { 'Z', 0x005A        /* ;*;LATIN CAPITAL LETTER Z;;; */ },
    
    { 'a', 0x0061        /* ;*;LATIN SMALL LETTER A;;; */ },
    { 'b', 0x0062        /* ;*;LATIN SMALL LETTER B;;; */ },
    { 'c', 0x0063        /* ;*;LATIN SMALL LETTER C;;; */ },
    { 'd', 0x0064        /* ;*;LATIN SMALL LETTER D;;; */ },
    { 'e', 0x0065        /* ;*;LATIN SMALL LETTER E;;; */ },
    { 'f', 0x0066        /* ;*;LATIN SMALL LETTER F;;; */ },
    { 'g', 0x0067        /* ;*;LATIN SMALL LETTER G;;; */ },
    { 'h', 0x0068        /* ;*;LATIN SMALL LETTER H;;; */ },
    { 'i', 0x0069        /* ;*;LATIN SMALL LETTER I;;; */ },
    { 'j', 0x006A        /* ;*;LATIN SMALL LETTER J;;; */ },
    { 'k', 0x006B        /* ;*;LATIN SMALL LETTER K;;; */ },
    { 'l', 0x006C        /* ;*;LATIN SMALL LETTER L;;; */ },
    { 'm', 0x006D        /* ;*;LATIN SMALL LETTER M;;; */ },
    { 'n', 0x006E        /* ;*;LATIN SMALL LETTER N;;; */ },
    { 'o', 0x006F        /* ;*;LATIN SMALL LETTER O;;; */ },
    { 'p', 0x0070        /* ;*;LATIN SMALL LETTER P;;; */ },
    { 'q', 0x0071        /* ;*;LATIN SMALL LETTER Q;;; */ },
    { 'r', 0x0072        /* ;*;LATIN SMALL LETTER R;;; */ },
    { 's', 0x0073        /* ;*;LATIN SMALL LETTER S;;; */ },
    { 't', 0x0074        /* ;*;LATIN SMALL LETTER T;;; */ },
    { 'u', 0x0075        /* ;*;LATIN SMALL LETTER U;;; */ },
    { 'v', 0x0076        /* ;*;LATIN SMALL LETTER V;;; */ },
    { 'w', 0x0077        /* ;*;LATIN SMALL LETTER W;;; */ },
    { 'x', 0x0078        /* ;*;LATIN SMALL LETTER X;;; */ },
    { 'y', 0x0079        /* ;*;LATIN SMALL LETTER Y;;; */ },
    { 'z', 0x007A        /* ;*;LATIN SMALL LETTER Z;;; */ }
};

static uint16 from_fallback_cs[256] = { 0 };
static int initialized = 0;

static void init_fallback P_((void));
static void init_fallback() {
    int i;

    for (i = 0; i < 256; i++)
	from_fallback_cs[i] = MAPPING_NONE;

    for (i = 0; i < sizeof fallback_table / sizeof fallback_table[0]; i++) {
	from_fallback_cs[fallback_table[i].c]  =  fallback_table[i].c1;
    }


    DPRINT(Debug,4,(&Debug, 
		    "Fallback map initialized\n"));

    initialized = 1;
}

uint16 map_fallback(c)
     unsigned int c;
{
    if (!initialized)
	init_fallback();
    return from_fallback_cs[c];
}


unsigned char map_fallback_rev(val, found)
     unsigned int val;
     int *found;
{
    int i;

    for (i = 0; i < sizeof fallback_table / sizeof fallback_table[0]; i++) {
	if (fallback_table[i].c1 == val) {
	    *found = 1;
	    return fallback_table[i].c;
	}
    }
    *found = 0;
    return '?';  /* Not found */
}


/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1