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