|
|
/***
** ** Module: Encoding ** ** Description: ** This is a module of the T1 to TT font converter. The module ** contains interface functions for the global encoding table, ** i.e. this is an abstract data type. ** ** Author: Michael Jansson ** ** Created: 6/13/93 ** ***/
/**** INCLUDES */ #include <string.h>
#include "types.h"
#include "encoding.h"
#include "safemem.h"
/***** LOCAL TYPES */ struct encoding { const char *name; /* Postscript name of a glyph. */ USHORT codes[ENC_MAXCODES]; /* Character codes for each encoding scheme. */ };
/***** CONSTANTS */ static const struct encoding StdEncoding[] = { {".notdef", {0xffff, 0xffff, 0xffff, 0xffff}}, {"A", {0x0041, 0x0041, 0x0041, 0x0041}}, {"AE", {0x00c6, 0x00c6, 0x00e1, 174 }}, {"Aacute", {0x00c1, 0x00c1, 0xffff, 231 }}, {"Abreve", {0x0102, 0xffff, 0xffff, 0xffff}}, {"Acircumflex", {0x00c2, 0x00c2, 0xffff, 229 }}, {"Adieresis", {0x00c4, 0x00c4, 0xffff, 128 }}, {"Agrave", {0x00c0, 0x00c0, 0xffff, 203 }}, {"Aogonek", {0x0104, 0xffff, 0xffff, 0xffff}}, {"Aring", {0x00c5, 0x00c5, 0xffff, 129 }}, {"Atilde", {0x00c3, 0x00c3, 0xffff, 204 }}, {"B", {0x0042, 0x0042, 0x0042, 0x0042}}, {"C", {0x0043, 0x0043, 0x0043, 0x0043}}, {"Cacute", {0x0106, 0xffff, 0xffff, 0xffff}}, {"Ccaron", {0x010c, 0xffff, 0xffff, 0xffff}}, {"Ccedilla", {0x00c7, 0x00c7, 0xffff, 130 }}, {"D", {0x0044, 0x0044, 0x0044, 0x0044}}, {"Dcaron", {0x010e, 0xffff, 0xffff, 0xffff}}, {"Delta", {0x2206, 0xffff, 0xffff, 198 }}, {"Dslash", {0x0110, 0xffff, 0xffff, 0xffff}}, {"E", {0x0045, 0x0045, 0x0045, 0x0045}}, {"Eacute", {0x00c9, 0x00c9, 0xffff, 131 }}, {"Ecaron", {0x011a, 0xffff, 0xffff, 0xffff}}, {"Ecircumflex", {0x00ca, 0x00ca, 0xffff, 230 }}, {"Edieresis", {0x00cb, 0x00cb, 0xffff, 232 }}, {"Egrave", {0x00c8, 0x00c8, 0xffff, 233 }}, {"Eogonek", {0x0118, 0xffff, 0xffff, 0xffff}}, {"Eth", {0x00d0, 0x00d0, 0xffff, 0xffff}}, {"F", {0x0046, 0x0046, 0x0046, 0x0046}}, {"G", {0x0047, 0x0047, 0x0047, 0x0047}}, {"Gamma", {0x0393, 0xffff, 0xffff, 0xffff}}, {"Gbreve", {0x011e, 0xffff, 0xffff, 0xffff}}, {"H", {0x0048, 0x0048, 0x0048, 0x0048}}, {"I", {0x0049, 0x0049, 0x0049, 0x0049}}, {"Iacute", {0x00cd, 0x00cd, 0xffff, 234 }}, {"Icircumflex", {0x00ce, 0x00ce, 0xffff, 235 }}, {"Idieresis", {0x00cf, 0x00cf, 0xffff, 236 }}, {"Idot", {0x0130, 0xffff, 0xffff, 0xffff}}, {"Igrave", {0x00cc, 0x00cc, 0xffff, 237 }}, {"J", {0x004a, 0x004a, 0x004a, 0x004a}}, {"K", {0x004b, 0x004b, 0x004b, 0x004b}}, {"L", {0x004c, 0x004c, 0x004c, 0x004c}}, {"Lacute", {0x0139, 0xffff, 0xffff, 0xffff}}, {"Lcaron", {0x013d, 0xffff, 0xffff, 0xffff}}, {"Ldot", {0x013f, 0xffff, 0xffff, 0xffff}}, {"Lslash", {0x0141, 0xffff, 0x00e8, 0xffff}}, {"M", {0x004d, 0x004d, 0x004d, 0x004d}}, {"N", {0x004e, 0x004e, 0x004e, 0x004e}}, {"Nacute", {0x0143, 0xffff, 0xffff, 0xffff}}, {"Ncaron", {0x0147, 0xffff, 0xffff, 0xffff}}, {"Ntilde", {0x00d1, 0x00d1, 0xffff, 132 }}, {"O", {0x004f, 0x004f, 0x004f, 0x004f}}, {"OE", {0x0152, 0x008c, 0x00ea, 206 }}, {"Oacute", {0x00d3, 0x00d3, 0xffff, 238 }}, {"Ocircumflex", {0x00d4, 0x00d4, 0xffff, 239 }}, {"Odblacute", {0x0150, 0xffff, 0xffff, 0xffff}}, {"Odieresis", {0x00d6, 0x00d6, 0xffff, 133 }}, {"Ograve", {0x00d2, 0x00d2, 0xffff, 241 }}, {"Oslash", {0x00d8, 0x00d8, 0x00e9, 175 }}, {"Otilde", {0x00d5, 0x00d5, 0xffff, 205 }}, {"P", {0x0050, 0x0050, 0x0050, 0x0050}}, {"Phi", {0x03a6, 0xffff, 0xffff, 0xffff}}, {"Q", {0x0051, 0x0051, 0x0051, 0x0051}}, {"R", {0x0052, 0x0052, 0x0052, 0x0052}}, {"Racute", {0x0154, 0xffff, 0xffff, 0xffff}}, {"Rcaron", {0x0158, 0xffff, 0xffff, 0xffff}}, {"S", {0x0053, 0x0053, 0x0053, 0x0053}}, {"Sacute", {0x015a, 0xffff, 0xffff, 0xffff}}, {"Scaron", {0x0160, 0x008A, 0xffff, 0xffff}}, {"Scedilla", {0x015e, 0xffff, 0xffff, 0xffff}}, {"T", {0x0054, 0x0054, 0x0054, 0x0054}}, {"Tcaron", {0x0164, 0xffff, 0xffff, 0xffff}}, {"Tcedilla", {0x0162, 0xffff, 0xffff, 0xffff}}, {"Theta", {0x0398, 0xffff, 0xffff, 0xffff}}, {"Thorn", {0x00de, 0x00de, 0xffff, 0xffff}}, {"U", {0x0055, 0x0055, 0x0055, 0x0055}}, {"Uacute", {0x00da, 0x00da, 0xffff, 242 }}, {"Ucircumflex", {0x00db, 0x00db, 0xffff, 243 }}, {"Udblacute", {0x0170, 0xffff, 0xffff, 0xffff}}, {"Udieresis", {0x00dc, 0x00dc, 0xffff, 134 }}, {"Ugrave", {0x00d9, 0x00d9, 0xffff, 244 }}, {"Uring", {0x016e, 0xffff, 0xffff, 0xffff}}, {"V", {0x0056, 0x0056, 0x0056, 0x0056}}, {"W", {0x0057, 0x0057, 0x0057, 0x0057}}, {"X", {0x0058, 0x0058, 0x0058, 0x0058}}, {"Y", {0x0059, 0x0059, 0x0059, 0x0059}}, {"Yacute", {0x00dd, 0x00dd, 0xffff, 0xffff}}, {"Ydieresis", {0x0178, 0x009f, 0xffff, 217 }}, {"Z", {0x005a, 0x005a, 0x005a, 0x005a}}, {"Zacute", {0x0179, 0xffff, 0xffff, 0xffff}}, {"Zcaron", {0x017d, 0xffff, 0xffff, 0xffff}}, {"Zdot", {0x017b, 0xffff, 0xffff, 0xffff}}, {"a", {0x0061, 0x0061, 0x0061, 0x0061}}, {"aacute", {0x00e1, 0x00e1, 0xffff, 135 }}, {"abreve", {0x0103, 0xffff, 0xffff, 0xffff}}, {"acircumflex", {0x00e2, 0x00e2, 0xffff, 137 }}, {"acute", {0x00b4, 0x00b4, 0x00c2, 171 }}, {"adieresis", {0x00e4, 0x00e4, 0xffff, 138 }}, {"ae", {0x00e6, 0x00e6, 0x00f1, 190 }}, {"agrave", {0x00e0, 0x00e0, 0xffff, 136 }}, {"alpha", {0x03b1, 0xffff, 0xffff, 0xffff}}, {"ampersand", {0x0026, 0x0026, 0x0026, 0x0026}}, {"aogonek", {0x0105, 0xffff, 0xffff, 0xffff}}, {"apple", {0xf000, 0x000, 0xffff, 240 }}, {"approxequal", {0x2248, 0xffff, 0xffff, 197 }}, {"aring", {0x00e5, 0x00e5, 0xffff, 140 }}, {"arrowboth", {0x2194, 0xffff, 0xffff, 0xffff}}, {"arrowdown", {0x2193, 0xffff, 0xffff, 0xffff}}, {"aroowleft", {0x2190, 0xffff, 0xffff, 0xffff}}, {"arrowright", {0x2192, 0xffff, 0xffff, 0xffff}}, {"arrowup", {0x2191, 0xffff, 0xffff, 0xffff}}, {"arrowupdn", {0x2195, 0xffff, 0xffff, 0xffff}}, {"arrowupdnbse", {0x21a8, 0xffff, 0xffff, 0xffff}}, {"asciicircum", {0x005e, 0x005e, 0x005e, 0x005e}}, {"asciitilde", {0x007e, 0x007e, 0x007e, 0x007e}}, {"asterisk", {0x002a, 0x002a, 0x002a, 0x002a}}, {"at", {0x0040, 0x0040, 0x0040, 0x0040}}, {"atilde", {0x00e3, 0x00e3, 0xffff, 139 }}, {"b", {0x0062, 0x0062, 0x0062, 0x0062}}, {"backslash", {0x005c, 0x005c, 0x005c, 0x005c}}, {"bar", {0x007c, 0x007c, 0x007c, 0x007c}}, {"block", {0x2588, 0xffff, 0xffff, 0xffff}}, {"braceleft", {0x007b, 0x007b, 0x007b, 0x007b}}, {"braceright", {0x007d, 0x007d, 0x007d, 0x007d}}, {"bracketleft", {0x005b, 0x005b, 0x005b, 0x005b}}, {"bracketright", {0x005d, 0x005d, 0x005d, 0x005d}}, {"breve", {0x02d8, 0xffff, 0x00c6, 249 }}, {"brokenbar", {0x00a6, 0x00a6, 0xffff, 0xffff}}, {"bullet", {0x2022, 0x0095, 0x00b7, 165 }}, {"c", {0x0063, 0x0063, 0x0063, 0x0063}}, {"cacute", {0x0107, 0xffff, 0xffff, 0xffff}}, {"caron", {0x02c7, 0xffff, 0x00cf, 255 }}, {"ccaron", {0x010d, 0xffff, 0xffff, 0xffff}}, {"ccedilla", {0x00e7, 0x00e7, 0xffff, 141 }}, {"cedilla", {0x00b8, 0x00b8, 0x00cb, 252 }}, {"cent", {0x00a2, 0x00a2, 0x00a2, 162 }}, {"circle", {0x25cb, 0xffff, 0xffff, 0xffff}}, {"circumflex", {0x02c6, 0x0088, 0x00c3, 246 }}, {"club", {0x2663, 0xffff, 0xffff, 0xffff}}, {"colon", {0x003a, 0x003a, 0x003a, 0x003a}}, {"comma", {0x002c, 0x002c, 0x002c, 0x002c}}, {"copyright", {0x00a9, 0x00a9, 0xffff, 169 }}, {"currency", {0x00a4, 0x00a4, 0x00a8, 219 }}, {"d", {0x0064, 0x0064, 0x0064, 0x0064}}, {"dagger", {0x2020, 0x0086, 0x00b2, 160 }}, {"daggerdbl", {0x2021, 0x0087, 0x00b3, 224 }}, {"dcaron", {0x010f, 0xffff, 0xffff, 0xffff}}, {"degree", {0x00b0, 0x00b0, 0xffff, 161 }}, {"delta", {0x03b4, 0xffff, 0xffff, 0xffff}}, {"diamond", {0x2666, 0xffff, 0xffff, 0xffff}}, {"dieresis", {0x00a8, 0x00a8, 0x00c8, 172 }}, {"divide", {0x00f7, 0x00f7, 0xffff, 214 }}, {"dkshade", {0x2593, 0xffff, 0xffff, 0xffff}}, {"dmacron", {0x0111, 0xffff, 0xffff, 0xffff}}, {"dnblock", {0x2584, 0xffff, 0xffff, 0xffff}}, {"dollar", {0x0024, 0x0024, 0x0024, 0x0024}}, {"dotaccent", {0x02d9, 0xffff, 0x00c7, 250 }}, {"dotlessi", {0x0131, 0xffff, 0x00f5, 245 }}, {"e", {0x0065, 0x0065, 0x0065, 0x0065}}, {"eacute", {0x00e9, 0x00e9, 0xffff, 142 }}, {"ecaron", {0x011b, 0xffff, 0xffff, 0xffff}}, {"ecircumflex", {0x00ea, 0x00ea, 0xffff, 144 }}, {"edieresis", {0x00eb, 0x00eb, 0xffff, 145 }}, {"egrave", {0x00e8, 0x00e8, 0xffff, 143 }}, {"eight", {0x0038, 0x0038, 0x0038, 0x0038}}, {"ellipsis", {0x2026, 0x0085, 0x00bc, 201 }}, {"emdash", {0x2014, 0x0097, 0x00d0, 209 }}, {"endash", {0x2013, 0x0096, 0x00b1, 208 }}, {"eogonek", {0x0119, 0xffff, 0xffff, 0xffff}}, {"epsilon", {0x03b4, 0xffff, 0xffff, 0xffff}}, {"equal", {0x003d, 0x003d, 0x003d, 0x003d}}, {"equivalence", {0x2261, 0xffff, 0xffff, 0xffff}}, {"eth", {0x00f0, 0x00f0, 0xffff, 0xffff}}, {"exclam", {0x0021, 0x0021, 0x0021, 0x0021}}, {"exclamdbl", {0x203c, 0xffff, 0xffff, 0xffff}}, {"exclamdown", {0x00a1, 0x00a1, 0x00a1, 193 }}, {"f", {0x0066, 0x0066, 0x0066, 0x0066}}, {"female", {0x2640, 0xffff, 0xffff, 0xffff}}, {"fi", {0xf001, 0xffff, 0x00ae, 222 }}, {"filledbox", {0x25a0, 0xffff, 0xffff, 0xffff}}, {"filledrect", {0x25ac, 0xffff, 0xffff, 0xffff}}, {"five", {0x0035, 0x0035, 0x0035, 0x0035}}, {"fl", {0xf002, 0xffff, 0x00af, 223 }}, {"florin", {0x0192, 0x0083, 0x00a6, 196 }}, {"four", {0x0034, 0x0034, 0x0034, 0x0034}}, {"fraction", {0x2215, 0xffff, 0x00a4, 218 }}, {"franc", {0x20a3, 0xffff, 0xffff, 0xffff}}, {"g", {0x0067, 0x0067, 0x0067, 0x0067}}, {"gbreve", {0x011f, 0xffff, 0xffff, 0xffff}}, {"germandbls", {0x00df, 0x00df, 0x00fb, 167 }}, {"grave", {0x0060, 0x0060, 0x00c1, 0x0060}}, {"greater", {0x003e, 0x003e, 0x003e, 0x003e}}, {"greaterequal", {0x2265, 0xffff, 0xffff, 179 }}, {"guillemotleft", {0x00ab, 0x00ab, 0x00ab, 199 }}, {"guillemotright",{0x00bb, 0x00bb, 0x00bb, 200 }}, {"guilsinglleft", {0x2039, 0x008b, 0x00ac, 220 }}, {"guilsinglright",{0x203a, 0x009b, 0x00ad, 221 }}, {"h", {0x0068, 0x0068, 0x0068, 0x0068}}, {"heart", {0x2665, 0xffff, 0xffff, 0xffff}}, {"house", {0x2302, 0xffff, 0xffff, 0xffff}}, {"hungarumlaut", {0x02dd, 0xffff, 0x00cd, 0xffff}}, {"hyphen", {0x002d, 0x002d, 0x002d, 0x002d}}, {"i", {0x0069, 0x0069, 0x0069, 0x0069}}, {"iacute", {0x00ed, 0x00ed, 0xffff, 146 }}, {"icircumflex", {0x00ee, 0x00ee, 0xffff, 148 }}, {"idieresis", {0x00ef, 0x00ef, 0xffff, 149 }}, {"igrave", {0x00ec, 0x00ec, 0xffff, 147 }}, {"infinity", {0x221e, 0xffff, 0xffff, 176 }}, {"integral", {0x222b, 0xffff, 0xffff, 186 }}, {"integralbt", {0x2321, 0xffff, 0xffff, 0xffff}}, {"integraltp", {0x2320, 0xffff, 0xffff, 0xffff}}, {"intersection", {0x2229, 0xffff, 0xffff, 0xffff}}, {"invbullet", {0x25d8, 0xffff, 0xffff, 0xffff}}, {"invcircle", {0x25d9, 0xffff, 0xffff, 0xffff}}, {"invsmileface", {0x263b, 0xffff, 0xffff, 0xffff}}, {"j", {0x006a, 0x006a, 0x006a, 0x006a}}, {"k", {0x006b, 0x006b, 0x006b, 0x006b}}, {"l", {0x006c, 0x006c, 0x006c, 0x006c}}, {"lacute", {0x013a, 0xffff, 0xffff, 0xffff}}, {"lcaron", {0x013e, 0xffff, 0xffff, 0xffff}}, {"ldot", {0x0140, 0xffff, 0xffff, 0xffff}}, {"less", {0x003c, 0x003c, 0x003c, 0x003c}}, {"lessequal", {0x2264, 0xffff, 0xffff, 178 }}, {"lfblock", {0x258c, 0xffff, 0xffff, 0xffff}}, {"logicalnot", {0x00ac, 0x00ac, 0xffff, 194 }}, {"lozenge", {0x25ca, 0xffff, 0xffff, 215 }}, {"lslash", {0x0142, 0xffff, 0x00f8, 0xffff}}, {"ltshade", {0x2591, 0xffff, 0xffff, 0xffff}}, {"m", {0x006d, 0x006d, 0x006d, 0x006d}}, {"macron", {0x00af, 0xffff, 0x00c5, 248 }}, {"male", {0x2642, 0xffff, 0xffff, 0xffff}}, {"middot", {0x00b7, 0x00b7, 0xffff, 0xffff}}, {"minus", {0x2212, 0xffff, 0xffff, 0xffff}}, {"mu", {0x00b5, 0x00b5, 0xffff, 181 }}, {"multiply", {0x00d7, 0x00d7, 0xffff, 0xffff}}, {"musicalnote", {0x266a, 0xffff, 0xffff, 0xffff}}, {"musicalnotedbl",{0x266b, 0xffff, 0xffff, 0xffff}}, {"n", {0x006e, 0x006e, 0x006e, 0x006e}}, {"nacute", {0x0144, 0xffff, 0xffff, 0xffff}}, {"nbspace", {0x00a0, 0x00a0, 0xffff, 0xffff}}, {"ncaron", {0x0148, 0xffff, 0xffff, 0xffff}}, {"nine", {0x0039, 0x0039, 0x0039, 0x0039}}, {"notequal", {0x2260, 0xffff, 0xffff, 173 }}, {"nsuperior", {0x207f, 0xffff, 0xffff, 0xffff}}, {"ntilde", {0x00f1, 0x00f1, 0xffff, 150 }}, {"numbersign", {0x0023, 0x0023, 0x0023, 0x0023}}, {"o", {0x006f, 0x006f, 0x006f, 0x006f}}, {"oacute", {0x00f3, 0x00f3, 0xffff, 151 }}, {"ocircumflex", {0x00f4, 0x00f4, 0xffff, 153 }}, {"odblacute", {0x0151, 0xffff, 0xffff, 0xffff}}, {"odieresis", {0x00f6, 0x00f6, 0xffff, 154 }}, {"oe", {0x0153, 0x009c, 0x00fa, 207 }}, {"ogonek", {0x02db, 0xffff, 0x00ce, 254 }}, {"ograve", {0x00f2, 0x00f2, 0xffff, 152 }}, {"ohm", {0x2126, 0xffff, 0xffff, 189 }}, {"one", {0x0031, 0x0031, 0x0031, 0x0031}}, {"onehalf", {0x00bd, 0x00bd, 0xffff, 0xffff}}, {"onequarter", {0x00bc, 0x00bc, 0xffff, 0xffff}}, {"onesuperior", {0x00b9, 0x00b9, 0xffff, 0xffff}}, {"ordfeminine", {0x00aa, 0x00aa, 0x00e3, 187 }}, {"ordmasculine", {0x00ba, 0x00ba, 0x00eb, 188 }}, {"orthogonal", {0x221f, 0xffff, 0xffff, 0xffff}}, {"oslash", {0x00f8, 0x00f8, 0x00f9, 191 }}, {"otilde", {0x00f5, 0x00f5, 0xffff, 155 }}, {"overscore", {0x00af, 0x00af, 0xffff, 0xffff}}, {"p", {0x0070, 0x0070, 0x0070, 0x0070}}, {"paragraph", {0x00b6, 0x00b6, 0x00b6, 166 }}, {"parenleft", {0x0028, 0x0028, 0x0028, 0x0028}}, {"parenright", {0x0029, 0x0029, 0x0029, 0x0029}}, {"partialdiff", {0x2202, 0xffff, 0xffff, 182 }}, {"percent", {0x0025, 0x0025, 0x0025, 0x0025}}, {"period", {0x002e, 0x002e, 0x002e, 0x002e}}, {"periodcentered",{0x2219, 0xffff, 0x00b4, 225 }}, {"perthousand", {0x2030, 0x0089, 0x00bd, 228 }}, {"peseta", {0x20a7, 0xffff, 0xffff, 0xffff}}, {"phi", {0x03c6, 0xffff, 0xffff, 0xffff}}, {"pi", {0x03c0, 0xffff, 0xffff, 185 }}, {"plus", {0x002b, 0x002b, 0x002b, 0x002b}}, {"plusminus", {0x00b1, 0x00b1, 0xffff, 177 }}, {"product", {0x220f, 0xffff, 0xffff, 184 }}, {"q", {0x0071, 0x0071, 0x0071, 0x0071}}, {"question", {0x003f, 0x003f, 0x003f, 0x003f}}, {"questiondown", {0x00bf, 0x00bf, 0x00bf, 192 }}, {"quotedbl", {0x0022, 0x0022, 0x0022, 0x0022}}, {"quotedblbase", {0x201e, 0x0084, 0x00b9, 227 }}, {"quotedblleft", {0x201c, 0x0093, 0x00aa, 210 }}, {"quotedblright", {0x201d, 0x0094, 0x00ba, 211 }}, {"quoteleft", {0x2018, 0x0091, 0x0060, 212 }}, {"quoteright", {0x2019, 0x0092, 0x0027, 213 }}, {"quotesinglbase",{0x201a, 0x0082, 0x00b8, 226 }}, {"quotesingle", {0x0027, 0x0027, 0x00a9, 0x0027}}, {"r", {0x0072, 0x0072, 0x0072, 0x0072}}, {"racute", {0x0155, 0xffff, 0xffff, 0xffff}}, {"radical", {0x221a, 0xffff, 0xffff, 195 }}, {"rcaron", {0x0159, 0xffff, 0xffff, 0xffff}}, {"registered", {0x00ae, 0x00ae, 0xffff, 168 }}, {"revlogicalnot", {0x2310, 0xffff, 0xffff, 0xffff}}, {"ring", {0x02da, 0xffff, 0x00ca, 251 }}, {"rtblock", {0x2590, 0xffff, 0xffff, 0xffff}}, {"s", {0x0073, 0x0073, 0x0073, 0x0073}}, {"sacute", {0x015b, 0xffff, 0xffff, 0xffff}}, {"scaron", {0x0161, 0x009a, 0xffff, 0xffff}}, {"scedilla", {0x015f, 0xffff, 0xffff, 0xffff}}, {"section", {0x00a7, 0x00a7, 0x00a7, 164 }}, {"semicolon", {0x003b, 0x003b, 0x003b, 0x003b}}, {"seven", {0x0037, 0x0037, 0x0037, 0x0037}}, {"sfthyphen", {0x00ad, 0x00ad, 0xffff, 0xffff}}, {"shade", {0x2592, 0xffff, 0xffff, 0xffff}}, {"sigma", {0x03c3, 0xffff, 0xffff, 0xffff}}, {"six", {0x0036, 0x0036, 0x0036, 0x0036}}, {"slash", {0x002f, 0x002f, 0x002f, 0x002f}}, {"smileface", {0x263a, 0xffff, 0xffff, 0xffff}}, {"space", {0x0020, 0x0020, 0x0020, 0x0020}}, {"spade", {0x2660, 0xffff, 0xffff, 0xffff}}, {"sterling", {0x00a3, 0x00a3, 0x00a3, 163 }}, {"summation", {0x2211, 0xffff, 0xffff, 183 }}, {"sun", {0x263c, 0xffff, 0xffff, 0xffff}}, {"t", {0x0074, 0x0074, 0x0074, 0x0074}}, {"tau", {0x03c4, 0xffff, 0xffff, 0xffff}}, {"tcaron", {0x0165, 0xffff, 0xffff, 0xffff}}, {"tcedilla", {0x0163, 0xffff, 0xffff, 0xffff}}, {"thorn", {0x00fe, 0x00fe, 0xffff, 0xffff}}, {"three", {0x0033, 0x0033, 0x0033, 0x0033}}, {"threequarters", {0x00be, 0x00be, 0xffff, 0xffff}}, {"threesuperior", {0x00b3, 0x00b3, 0xffff, 0xffff}}, {"tilde", {0x02dc, 0x0098, 0x00c4, 245 }}, {"trademark", {0x2122, 0x0099, 0xffff, 170 }}, {"triagdn", {0x25bc, 0xffff, 0xffff, 0xffff}}, {"triagrt", {0x25ba, 0xffff, 0xffff, 0xffff}}, {"triagup", {0x25b2, 0xffff, 0xffff, 0xffff}}, {"traglf", {0x25c4, 0xffff, 0xffff, 0xffff}}, {"two", {0x0032, 0x0032, 0x0032, 0x0032}}, {"twosuperior", {0x00b2, 0x00b2, 0xffff, 0xffff}}, {"u", {0x0075, 0x0075, 0x0075, 0x0075}}, {"uacute", {0x00fa, 0x00fa, 0xffff, 156 }}, {"ucircumflex", {0x00fb, 0x00fb, 0xffff, 158 }}, {"udblacute", {0x0171, 0xffff, 0xffff, 0xffff}}, {"udieresis", {0x00fc, 0x00fc, 0xffff, 159 }}, {"ugrave", {0x00f9, 0x00f9, 0xffff, 157 }}, {"underscore", {0x005f, 0x005f, 0x005f, 0x005f}}, {"underscoredbl", {0x2017, 0xffff, 0xffff, 0xffff}}, {"upblock", {0x2580, 0xffff, 0xffff, 0xffff}}, {"uring", {0x016f, 0xffff, 0xffff, 0xffff}}, {"v", {0x0076, 0x0076, 0x0076, 0x0076}}, {"w", {0x0077, 0x0077, 0x0077, 0x0077}}, {"x", {0x0078, 0x0078, 0x0078, 0x0078}}, {"y", {0x0079, 0x0079, 0x0079, 0x0079}}, {"yacute", {0x00fd, 0x00fd, 0xffff, 0xffff}}, {"ydieresis", {0x00ff, 0x00ff, 0xffff, 216 }}, {"yen", {0x00a5, 0x00a5, 0x00a5, 180 }}, {"z", {0x007a, 0x007a, 0x007a, 0x007a}}, {"zacute", {0x017a, 0xffff, 0xffff, 0xffff}}, {"zcaron", {0x017e, 0xffff, 0xffff, 0xffff}}, {"zdot", {0x017c, 0xffff, 0xffff, 0xffff}}, {"zero", {0x0030, 0x0030, 0x0030, 0x0030}}, };
static const struct encoding SeacEncoding[] = { {"A", {0xf041, 0x0041, 0x0041, 0x0041}}, {"AE", {0xf0c6, 0x00c6, 0x00e1, 174 }}, {"B", {0xf042, 0x0042, 0x0042, 0x0042}}, {"C", {0xf043, 0x0043, 0x0043, 0x0043}}, {"D", {0xf044, 0x0044, 0x0044, 0x0044}}, {"E", {0xf045, 0x0045, 0x0045, 0x0045}}, {"F", {0xf046, 0x0046, 0x0046, 0x0046}}, {"G", {0xf047, 0x0047, 0x0047, 0x0047}}, {"H", {0xf048, 0x0048, 0x0048, 0x0048}}, {"I", {0xf049, 0x0049, 0x0049, 0x0049}}, {"J", {0xf04a, 0x004a, 0x004a, 0x004a}}, {"K", {0xf04b, 0x004b, 0x004b, 0x004b}}, {"L", {0xf04c, 0x004c, 0x004c, 0x004c}}, {"Lslash", {0xf141, 0xffff, 0x00e8, 0xffff}}, {"M", {0xf04d, 0x004d, 0x004d, 0x004d}}, {"N", {0xf04e, 0x004e, 0x004e, 0x004e}}, {"O", {0xf04f, 0x004f, 0x004f, 0x004f}}, {"OE", {0xf152, 0x008c, 0x00ea, 206 }}, {"Oslash", {0xf0d8, 0x00d8, 0x00e9, 175 }}, {"P", {0xf050, 0x0050, 0x0050, 0x0050}}, {"Q", {0xf051, 0x0051, 0x0051, 0x0051}}, {"R", {0xf052, 0x0052, 0x0052, 0x0052}}, {"S", {0xf053, 0x0053, 0x0053, 0x0053}}, {"T", {0xf054, 0x0054, 0x0054, 0x0054}}, {"U", {0xf055, 0x0055, 0x0055, 0x0055}}, {"V", {0xf056, 0x0056, 0x0056, 0x0056}}, {"W", {0xf057, 0x0057, 0x0057, 0x0057}}, {"X", {0xf058, 0x0058, 0x0058, 0x0058}}, {"Y", {0xf059, 0x0059, 0x0059, 0x0059}}, {"Z", {0xf05a, 0x005a, 0x005a, 0x005a}}, {"a", {0xf061, 0x0061, 0x0061, 0x0061}}, {"acute", {0xf0b4, 0x00b4, 0x00c2, 171 }}, {"ae", {0xf0e6, 0x00e6, 0x00f1, 190 }}, {"ampersand", {0xf026, 0x0026, 0x0026, 0x0026}}, {"asciicircum", {0xf05e, 0x005e, 0x005e, 0x005e}}, {"asciitilde", {0xf07e, 0x007e, 0x007e, 0x007e}}, {"asterisk", {0xf02a, 0x002a, 0x002a, 0x002a}}, {"at", {0xf040, 0x0040, 0x0040, 0x0040}}, {"b", {0xf062, 0x0062, 0x0062, 0x0062}}, {"backslash", {0xf05c, 0x005c, 0x005c, 0x005c}}, {"bar", {0xf07c, 0x007c, 0x007c, 0x007c}}, {"braceleft", {0xf07b, 0x007b, 0x007b, 0x007b}}, {"braceright", {0xf07d, 0x007d, 0x007d, 0x007d}}, {"bracketleft", {0xf05b, 0x005b, 0x005b, 0x005b}}, {"bracketright", {0xf05d, 0x005d, 0x005d, 0x005d}}, {"breve", {0xf2d8, 0xffff, 0x00c6, 249 }}, {"bullet", {0x2022, 0x0095, 0x00b7, 165 }}, {"c", {0xf063, 0x0063, 0x0063, 0x0063}}, {"caron", {0xf2c7, 0xffff, 0x00cf, 255 }}, {"cedilla", {0xf0b8, 0x00b8, 0x00cb, 252 }}, {"cent", {0xf0a2, 0x00a2, 0x00a2, 162 }}, {"circumflex", {0xf2c6, 0x0088, 0x00c3, 246 }}, {"colon", {0xf03a, 0x003a, 0x003a, 0x003a}}, {"comma", {0xf02c, 0x002c, 0x002c, 0x002c}}, {"currency", {0xf0a4, 0x00a4, 0x00a8, 219 }}, {"d", {0xf064, 0x0064, 0x0064, 0x0064}}, {"dagger", {0x2020, 0x0086, 0x00b2, 160 }}, {"daggerdbl", {0x2021, 0x0087, 0x00b3, 224 }}, {"dieresis", {0xf0a8, 0x00a8, 0x00c8, 172 }}, {"dollar", {0xf024, 0x0024, 0x0024, 0x0024}}, {"dotaccent", {0xf2d9, 0xffff, 0x00c7, 250 }}, {"dotlessi", {0xf131, 0xffff, 0x00f5, 245 }}, {"e", {0xf065, 0x0065, 0x0065, 0x0065}}, {"eight", {0xf038, 0x0038, 0x0038, 0x0038}}, {"ellipsis", {0x2026, 0x0085, 0x00bc, 201 }}, {"emdash", {0x2014, 0x0097, 0x00d0, 209 }}, {"endash", {0x2013, 0x0096, 0x00b1, 208 }}, {"equal", {0xf03d, 0x003d, 0x003d, 0x003d}}, {"exclam", {0xf021, 0x0021, 0x0021, 0x0021}}, {"exclamdown", {0xf0a1, 0x00a1, 0x00a1, 193 }}, {"f", {0xf066, 0x0066, 0x0066, 0x0066}}, {"fi", {0xf001, 0xffff, 0x00ae, 222 }}, {"five", {0xf035, 0x0035, 0x0035, 0x0035}}, {"fl", {0xf002, 0xffff, 0x00af, 223 }}, {"florin", {0xf192, 0x0083, 0x00a6, 196 }}, {"four", {0xf034, 0x0034, 0x0034, 0x0034}}, {"fraction", {0x2215, 0xffff, 0x00a4, 218 }}, {"g", {0xf067, 0x0067, 0x0067, 0x0067}}, {"germandbls", {0xf0df, 0x00df, 0x00fb, 167 }}, {"grave", {0xf060, 0x0060, 0x00c1, 0x0060}}, {"greater", {0xf03e, 0x003e, 0x003e, 0x003e}}, {"guillemotleft", {0xf0ab, 0x00ab, 0x00ab, 199 }}, {"guillemotright",{0xf0bb, 0x00bb, 0x00bb, 200 }}, {"guilsinglleft", {0x2039, 0x008b, 0x00ac, 220 }}, {"guilsinglright",{0x203a, 0x009b, 0x00ad, 221 }}, {"h", {0xf068, 0x0068, 0x0068, 0x0068}}, {"hungarumlaut", {0xf2dd, 0xffff, 0x00cd, 0xffff}}, {"hyphen", {0xf02d, 0x002d, 0x002d, 0x002d}}, {"i", {0xf069, 0x0069, 0x0069, 0x0069}}, {"j", {0xf06a, 0x006a, 0x006a, 0x006a}}, {"k", {0xf06b, 0x006b, 0x006b, 0x006b}}, {"l", {0xf06c, 0x006c, 0x006c, 0x006c}}, {"less", {0xf03c, 0x003c, 0x003c, 0x003c}}, {"lslash", {0xf142, 0xffff, 0x00f8, 0xffff}}, {"m", {0xf06d, 0x006d, 0x006d, 0x006d}}, {"macron", {0xf0af, 0xffff, 0x00c5, 248 }}, {"n", {0xf06e, 0x006e, 0x006e, 0x006e}}, {"nine", {0xf039, 0x0039, 0x0039, 0x0039}}, {"numbersign", {0xf023, 0x0023, 0x0023, 0x0023}}, {"o", {0xf06f, 0x006f, 0x006f, 0x006f}}, {"oe", {0xf153, 0x009c, 0x00fa, 207 }}, {"ogonek", {0xf2db, 0xffff, 0x00ce, 254 }}, {"one", {0xf031, 0x0031, 0x0031, 0x0031}}, {"ordfeminine", {0xf0aa, 0x00aa, 0x00e3, 187 }}, {"ordmasculine", {0xf0ba, 0x00ba, 0x00eb, 188 }}, {"oslash", {0xf0f8, 0x00f8, 0x00f9, 191 }}, {"p", {0xf070, 0x0070, 0x0070, 0x0070}}, {"paragraph", {0xf0b6, 0x00b6, 0x00b6, 166 }}, {"parenleft", {0xf028, 0x0028, 0x0028, 0x0028}}, {"parenright", {0xf029, 0x0029, 0x0029, 0x0029}}, {"percent", {0xf025, 0x0025, 0x0025, 0x0025}}, {"period", {0xf02e, 0x002e, 0x002e, 0x002e}}, {"periodcentered",{0x2219, 0xffff, 0x00b4, 225 }}, {"perthousand", {0x2030, 0x0089, 0x00bd, 228 }}, {"plus", {0xf02b, 0x002b, 0x002b, 0x002b}}, {"q", {0xf071, 0x0071, 0x0071, 0x0071}}, {"question", {0xf03f, 0x003f, 0x003f, 0x003f}}, {"questiondown", {0xf0bf, 0x00bf, 0x00bf, 192 }}, {"quotedbl", {0xf022, 0x0022, 0x0022, 0x0022}}, {"quotedblbase", {0x201e, 0x0084, 0x00b9, 227 }}, {"quotedblleft", {0x201c, 0x0093, 0x00aa, 210 }}, {"quotedblright", {0x201d, 0x0094, 0x00ba, 211 }}, {"quoteleft", {0x2018, 0x0091, 0x0060, 212 }}, {"quoteright", {0x2019, 0x0092, 0x0027, 213 }}, {"quotesinglbase",{0x201a, 0x0082, 0x00b8, 226 }}, {"quotesingle", {0xf027, 0x0027, 0x00a9, 0x0027}}, {"r", {0xf072, 0x0072, 0x0072, 0x0072}}, {"ring", {0xf2da, 0xffff, 0x00ca, 251 }}, {"s", {0xf073, 0x0073, 0x0073, 0x0073}}, {"section", {0xf0a7, 0x00a7, 0x00a7, 164 }}, {"semicolon", {0xf03b, 0x003b, 0x003b, 0x003b}}, {"seven", {0xf037, 0x0037, 0x0037, 0x0037}}, {"six", {0xf036, 0x0036, 0x0036, 0x0036}}, {"slash", {0xf02f, 0x002f, 0x002f, 0x002f}}, {"space", {0xf020, 0x0020, 0x0020, 0x0020}}, {"sterling", {0xf0a3, 0x00a3, 0x00a3, 163 }}, {"t", {0xf074, 0x0074, 0x0074, 0x0074}}, {"three", {0xf033, 0x0033, 0x0033, 0x0033}}, {"tilde", {0xf2dc, 0x0098, 0x00c4, 245 }}, {"two", {0xf032, 0x0032, 0x0032, 0x0032}}, {"u", {0xf075, 0x0075, 0x0075, 0x0075}}, {"underscore", {0xf05f, 0x005f, 0x005f, 0x005f}}, {"v", {0xf076, 0x0076, 0x0076, 0x0076}}, {"w", {0xf077, 0x0077, 0x0077, 0x0077}}, {"x", {0xf078, 0x0078, 0x0078, 0x0078}}, {"y", {0xf079, 0x0079, 0x0079, 0x0079}}, {"yen", {0xf0a5, 0x00a5, 0x00a5, 180 }}, {"z", {0xf07a, 0x007a, 0x007a, 0x007a}}, {"zero", {0xf030, 0x0030, 0x0030, 0x0030}}, };
/***** MACROS */ /*-none-*/
/***** STATIC FUNCTIONS */ /*-none-*/
/***** FUNCTIONS */
/***
** Function: AllocEncodingTable ** ** Description: ** Create a new encoding ADT. ***/ struct encoding *AllocEncodingTable(const USHORT num) { struct encoding *enc; if ((enc = Malloc(sizeof(struct encoding)*num))!=NULL) memset(enc, NOTDEFINIT, sizeof(struct encoding)*num); return enc; }
/***
** Function: RehashEncodingTable ** ** Description: ** Prepare an encoding ADT so that entries can be ** located in it. ***/ void RehashEncodingTable(struct encoding *Encoding, const USHORT num) { USHORT i; short j; struct encoding entry;
for (i=1; i<num; i++) { j=(short)(i-1); entry = Encoding[i]; while(j>=0 && strcmp(Encoding[j].name, entry.name)>0) { memcpy(&Encoding[j+1], &Encoding[j], sizeof(struct encoding)); j--; } Encoding[j+1] = entry; } }
/***
** Function: SetEncodingEntry ** ** Description: ** Set the mapping from a glyph name to character ** codes for various platforms. ***/ void SetEncodingEntry(struct encoding *Encoding, const USHORT entry, const char *name, const USHORT num, const USHORT *codes) { USHORT i;
Encoding[entry].name = name; for (i=0; i<num; i++) { Encoding[entry].codes[i] = codes[i]; } }
static int CDECL compare(const void *arg1, const void *arg2) { return strcmp( *((const char **)arg1), ((const struct encoding *)arg2)->name ); }
/***
** Function: LookupPSName ** ** Description: ** Do a binary search for a postscript name, and return ** a handle that can be used to look up a the character ** code for a specific encoding schema. ** ** If a custom encoding array is used and a glyph is not ** encoded by that array, though it is recognized by the ** StandardEncoding array, then use the SeacEncoding. ** This is needed in order to support bogus "seac" calls. ***/ struct encoding *LookupPSName(const struct encoding *Encoding, USHORT size, const char *name) { #ifndef BSEARCH
struct encoding *result; #else
USHORT low, mid, high; short diff;
/* Initiate. */ low = 0; high = size; #endif
/* Use default encoding? */ if (Encoding==NULL) { Encoding = StdEncoding; size = sizeof(StdEncoding)/sizeof(StdEncoding[0]); }
#ifndef BSEARCH
result = (struct encoding *)bsearch((char *)&name, (char *)Encoding, size, sizeof(struct encoding), compare); #else
do {
mid = (low+high)>>1; diff = (short)strcmp(Encoding[mid].name, name);
if (diff>0) { high = (low+high)>>1; } else if (diff<0) { low = (short)((low+high+1)>>1); } else if (diff==0) { result = &Encoding[mid]; }
} while (low<high && result==NULL); #endif
if ((result==NULL) && (Encoding!=SeacEncoding) && (Encoding!=StdEncoding)) result = LookupPSName(SeacEncoding, sizeof(SeacEncoding)/sizeof(SeacEncoding[0]), name);
return result; }
/***
** Function: LookupCharCode ** ** Description: ** look up a the character code for a ** specific encoding scheme. ***/ USHORT LookupCharCode(const struct encoding *enc, const USHORT type) { USHORT code = 0;
if (enc) code = enc->codes[type]; return code; }
/***
** Function: LookupCharName ** ** Description: ** look up a the character name for a ** specific encoding scheme. ***/ const char *LookupCharName(const struct encoding *enc) { return enc->name; }
/***
** Function: LookupNotDef ** ** Description: ** look up a the .notdef character ***/ const struct encoding *LookupNotDef(void) { return &StdEncoding[0]; }
/***
** Function: DecodeChar ** ** Description: ** look up an encoding record for a character code in some ** known encoding. ***/ const struct encoding *DecodeChar(const struct encoding *Encoding, const USHORT max, const USHORT type, const USHORT code) { const struct encoding *enc = &StdEncoding[0]; USHORT i, high;
/* Use default encoding? */ if (Encoding==NULL) { Encoding = StdEncoding; high = sizeof(StdEncoding)/sizeof(StdEncoding[0]); } else { high = max; }
for (i=0; i<high; i++) { if (Encoding[i].codes[type]==code) { enc = &Encoding[i]; break; } }
return enc; }
/***
** Function: FreeEncoding ** ** Description: ** Deallocate memory associated to the encoding array. ***/ void FreeEncoding(struct encoding *enc, const USHORT size) { USHORT i;
if (enc) { for (i=0; i<size; i++) { if (enc[i].name) Free((char *)enc[i].name); } Free(enc); } }
/***
** Function: LookupFirstEnc ** ** Description: ** Locate the first encoding for a given glyph. ***/ const struct encoding *LookupFirstEnc( const struct encoding *encRoot, const int encSize, const struct encoding *encItem ) { /* Back up to the first item with the same glyph name. */ while (encItem>encRoot && !strcmp(encItem[-1].name, encItem[0].name)) encItem--;
return encItem; }
/***
** Function: LookupNextEnc ** ** Description: ** Locate the first encoding for a given glyph. ***/ const struct encoding *LookupNextEnc( const struct encoding *encRoot, const int encSize, const struct encoding *encItem ) { /* Back up to the first item with the same glyph name. */ if (encItem<(&encRoot[encSize-1]) && !strcmp(encItem[0].name, encItem[1].name)) return ++encItem;
return NULL; }
|