/** @file
* @brief Windows-only Enhanced Metafile input and output.
*/
/* Authors:
* David mathog <mathog@caltech.edu>
*
* Copyright (C) 2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*
* References:
* see unicode-convert.h
*
* v1.4 08/21/2012 Changed this so that the incoming routines use uint32_t and the outgoing use uint16_t. This gets rid
* of wchar_t, which was different sizes on windows/linux, and required lots of ifdef's elsewhere in the code.
* v1.3 04/03/2012 Bullets were a problem. Symbol bullet -> Times New Roman Bullet looks OK, but
* it looked bad going the other way. Changed mapping Symbol bullet to 2219 (Bullet operator, math
* symbol.) That way Symbol bullet can map in and out, while other font bullet an remain in that
* font's bullet glyph.
* v1.2 03/26/2012 Introduced bug into SingleUnicodeToNon repaired.
* v1.1 03/25/2012 Changed ampersand mapping on Wingdings (to avoid normal Ampersand mapping
* to Wingdings ampersand when not intended. Fixed access bugs for when no conversion is
* mapped in UnicodeToNon and SingleUnicodeToNon
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <string.h>
#include "symbol_convert.h"
static bool hold_symb=0; // if any of these change, (re)generate the map table
static bool hold_wing=0;
static bool hold_zdng=0;
static bool hold_pua=0;
static unsigned char *from_unicode=NULL;
static unsigned char *to_font=NULL;
/* The following tables were created from the files
adobe-dingbats.enc.gz
adobe-symbol.enc.gz
adobe-standard.enc.gz
which came as part of the X11-font-encodings rpm on Mandriva 2010.
The original source for the data must have been Adobe.
Some also from:
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt
http://www.csn.ul.ie/~caolan/wingdings/proposal/
www.renderx.com/Tests/zapf-dingbats.pdf
The intent is as follows:
on conversion from ASCII/extended -> Unicode use the appropriate table for
the font and change font + code (symbol, zapf dingbats, wingdings).
Going the other way, set up two transfer tables,
the first is unicode -> 0-FF values, and the seond is unicode -> cvt_to_font.
These tables are filled dingbats, wingdings, then symbols, so with the rightmost one getting
precedence if both contain the symbol.
Whereever possible do NOT map two input characters to the same output character, use a slightly
off character if it is somewhat close and disambiguates.
v 1.0.0 14-MAR-2012, David Mathog
*/
static unsigned int wingdings_convert[256]={
0xFFFD, // 0x00 no replacement
0xFFFD, // 0x01 no replacement
0xFFFD, // 0x02 no replacement
0xFFFD, // 0x03 no replacement
0xFFFD, // 0x04 no replacement
0xFFFD, // 0x05 no replacement
0xFFFD, // 0x06 no replacement
0xFFFD, // 0x07 no replacement
0xFFFD, // 0x08 no replacement
0xFFFD, // 0x09 no replacement
0xFFFD, // 0x0A no replacement
0xFFFD, // 0x0B no replacement
0xFFFD, // 0x0C no replacement
0xFFFD, // 0x0D no replacement
0xFFFD, // 0x0E no replacement
0xFFFD, // 0x0F no replacement
0xFFFD, // 0x10 no replacement
0xFFFD, // 0x11 no replacement
0xFFFD, // 0x12 no replacement
0xFFFD, // 0x13 no replacement
0xFFFD, // 0x14 no replacement
0xFFFD, // 0x15 no replacement
0xFFFD, // 0x16 no replacement
0xFFFD, // 0x17 no replacement
0xFFFD, // 0x18 no replacement
0xFFFD, // 0x19 no replacement
0xFFFD, // 0x1A no replacement
0xFFFD, // 0x1B no replacement
0xFFFD, // 0x1C no replacement
0xFFFD, // 0x1D no replacement
0xFFFD, // 0x1E no replacement
0xFFFD, // 0x1F no replacement
0x0020, // 0x20 SPACE
0x270E, // 0x21 LOWER RIGHT PENCIL (close, but not exact)
0x2702, // 0x22 BLACK SCISSORS
0x2701, // 0x23 UPPER BLADE SCISSORS
0xFFFD, // 0x24 no replacement
0xFFFD, // 0x25 no replacement
0xFFFD, // 0x26 no replacement
0xFFFD, // 0x27 no replacement
0x260E, // 0x28 BLACK TELEPHONE
0x2706, // 0x29 TELEPHONE LOCATION SIGN (close, but not exact)
0x2709, // 0x2A ENVELOPE
0x2709, // 0x2B ENVELOPE (close, but not exact)
0xFFFD, // 0x2C no replacement
0xFFFD, // 0x2D no replacement
0xFFFD, // 0x2E no replacement
0xFFFD, // 0x2F no replacement
0xFFFD, // 0x30 no replacement
0xFFFD, // 0x31 no replacement
0xFFFD, // 0x32 no replacement
0xFFFD, // 0x33 no replacement
0xFFFD, // 0x34 no replacement
0xFFFD, // 0x35 no replacement
0x231B, // 0x36 HOURGLASS
0x2328, // 0x37 KEYBOARD
0xFFFD, // 0x38 no replacement
0xFFFD, // 0x39 no replacement
0xFFFD, // 0x3A no replacement
0xFFFD, // 0x3B no replacement
0xFFFD, // 0x3C no replacement
0xFFFD, // 0x3D no replacement
0x2707, // 0x3E TAPE DRIVE
0x270D, // 0x3F WRITING HAND
0x270D, // 0x40 WRITING HAND (close, but not exact)
0x270C, // 0x41 VICTORY HAND
0xFFFD, // 0x42 3 FINGER UP HAND (no replacement)
0xFFFD, // 0x43 THUMBS UP HAND (no replacement)
0xFFFD, // 0x44 THUMBS DOWN HAND (no replacement)
0x261C, // 0x45 WHITE LEFT POINTING INDEX
0x261E, // 0x46 WHITE RIGHT POINTING INDEX
0x261D, // 0x47 WHITE UP POINTING INDEX
0x261F, // 0x48 WHITE DOWN POINTING INDEX
0xFFFD, // 0x49 OPEN HAND (no replacement)
0x263A, // 0x4A WHITE SMILING FACE
0x263A, // 0x4B WHITE SMILING FACE (close, but not exact)
0x2639, // 0x4C WHITE FROWNING FACE
0xFFFD, // 0x4D BOMB (no replacement. 1F4A3)
0x2620, // 0x4E SKULL AND CROSSBONES
0x2690, // 0x4F WHITE FLAG (not exact)
0x2691, // 0x50 WHITE PENANT (use BLACK FLAG)
0x2708, // 0x51 AIRPLANE
0x263C, // 0x52 WHITE SUN WITH RAYS (close, but not exact)
0x2602, // 0x53 RAINDROP (use UMBRELLA)
0x2744, // 0x54 SNOWFLAKE
0x271D, // 0x55 WHITE LATIN CROSS (use BLACK CROSS)
0x271E, // 0x56 SHADOWED WHITE LATIN CROSS
0x271F, // 0x57 CELTIC CROSS (use OUTLINED LATIN CROSS)
0x2720, // 0x58 MALTESE CROSS
0x2721, // 0x59 STAR OF DAVID
0x262A, // 0x5A STAR AND CRESCENT
0x262F, // 0x5B YIN YANG
0x0950, // 0x5C DEVANGARI OM CORRECT|CLOSE: Perhaps PROPOSE SACRED OM ?
0x2638, // 0x5D WHEEL OF DHARMA
0x2648, // 0x5E ARIES
0x2649, // 0x5F TAURUS
0x264A, // 0x60 GEMINI
0x264B, // 0x61 CANCER
0x264C, // 0x62 LEO
0x264D, // 0x63 VIRGO
0x264E, // 0x64 LIBRA
0x264F, // 0x65 SCORPIUS
0x2650, // 0x66 SAGITTARIUS
0x2651, // 0x67 CAPRICORN
0x2652, // 0x68 AQUARIUS
0x2653, // 0x69 PISCES
0xFFFD, // 0x6A LOWER CASE AMPERSAND)?) (no replacement)
0xFF06, // 0x6B AMPERSAND (use FULL WIDTH AMPERSAND, close, but not exact. Do NOT use 0026, or it maps normal Ampersands to Wingdings Ampersand)
0x25CF, // 0x6C BLACK CIRCLE
0x274D, // 0x6D SHADOWED WHITE CIRCLE (close, but not exact)
0x25A0, // 0x6E BLACK SQUARE
0x25A3, // 0x6F WHITE SQUARE IN BLACK RECTANGLE (use BLACK SQUSRE in WHITE SQUARE)
0x25A1, // 0x70 WHITE SQUARE (close, but not exact)
0x2751, // 0x71 LOWER RIGHT SHADOWED WHITE SQUARE
0x2752, // 0x72 UPPER RIGHT SHADOWED WHITE SQUARE
0x25CA, // 0x73 LOZENGE (close, but not exact)
0x25CA, // 0x74 LOZENGE (close, but not exact)
0x25C6, // 0x75 BLACK DIAMOND
0x2756, // 0x76 BLACK DIAMOND MINUS WHITE X
0x25C6, // 0x77 BLACK DIAMOND (close, but not exact)
0x2327, // 0x78 X IN A RECTANGLE BOX
0x2353, // 0x79 APL FUNCTIONAL SYMBOL QUAD UP CARET(close, but not exact)
0x2318, // 0x7A PLACE OF INTEREST SIGN
0x2740, // 0x7B WHITE FLORETTE (close, but not exact)
0x273F, // 0x7C BLACK FLORETTE (close, but not exact)
0x275D, // 0x7D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
0x275E, // 0x7E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
0xFFFD, // 0x7F unused
0x24EA, // 0x80 CIRCLED DIGIT ZERO
0x2460, // 0x81 CIRCLED DIGIT ONE
0x2461, // 0x82 CIRCLED DIGIT TWO
0x2462, // 0x83 CIRCLED DIGIT THREE
0x2463, // 0x84 CIRCLED DIGIT FOUR
0x2464, // 0x85 CIRCLED DIGIT FIVE
0x2465, // 0x86 CIRCLED DIGIT SIX
0x2466, // 0x87 CIRCLED DIGIT SEVEN
0x2467, // 0x88 CIRCLED DIGIT EIGHT
0x2468, // 0x89 CIRCLED DIGIT NINE
0x2469, // 0x8A CIRCLED NUMBER TEN
0xFFFD, // 0x8B no replacement
0x2776, // 0x8C DINGBAT NEGATIVE CIRCLED DIGIT ONE
0x2777, // 0x8D DINGBAT NEGATIVE CIRCLED DIGIT TWO
0x2778, // 0x8E DINGBAT NEGATIVE CIRCLED DIGIT THREE
0x2779, // 0x8F DINGBAT NEGATIVE CIRCLED DIGIT FOUR
0x277A, // 0x90 DINGBAT NEGATIVE CIRCLED DIGIT FIVE
0x277B, // 0x91 DINGBAT NEGATIVE CIRCLED DIGIT SIX
0x277C, // 0x92 DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
0x277D, // 0x93 DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
0x277E, // 0x94 DINGBAT NEGATIVE CIRCLED DIGIT NINE
0x277F, // 0x95 DINGBAT NEGATIVE CIRCLED NUMBER TEN
0xFFFD, // 0x96 ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x97 REVERSED ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x98 REVERSED ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x99 ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x9A ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x9B REVERSED ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x9C REVERSED ROTATED FLORAL HEART BULLET (no good replacement)
0xFFFD, // 0x9D ROTATED FLORAL HEART BULLET (no good replacement)
0x2219, // 0x9E BULLET (use BULLET operator, so normal font BULLET will not convert to Symbol BULLET)
0x25CF, // 0x9F BLACK CIRCLE (close, but not exact)
0x25AA, // 0xA0 BLACK VERY SMALL SQUARE
0x26AA, // 0xA1 WHITE CIRCLE (use MEDIUM WHITE CIRCLE)
0x25CB, // 0xA2 HEAVY WHITE CIRCLE (use WHITE CIRCLE)
0x25CD, // 0xA3 HEAVIEST CIRCLE (use CIRCLE WITH VERTICAL FILL)
0x25C9, // 0xA4 CIRCLE WITH A CENTRAL DOT (close, dot much bigger)
0x25CE, // 0xA5 BULLSEYE
0x274D, // 0xA6 SHADOWED WHITE CIRCLE (close, but not exact)
0xFFED, // 0xA7 BLACK SMALL SQUARE
0x2610, // 0xA8 WHITE SQUARE (close, but not exact, different fro 25A1)
0xFFFD, // 0xA9 no replacement
0x2726, // 0xAA BLACK FOUR POINTED STAR MAYBE
0x2605, // 0xAB BLACK STAR
0x2736, // 0xAC SIX POINTED BLACK STAR
0x2737, // 0xAD EIGHT POINTED RECTILINEAR BLACK STAR
0x2738, // 0xAE TWELVE POINTED BLACK STAR
0x2735, // 0xAF EIGHT POINTED PINWHEEL STAR
0xFFFD, // 0xB0 no replacement
0xFFFD, // 0xB1 no replacement
0x2727, // 0xB2 WHITE FOUR POINTED STAR
0x2726, // 0xB3 ROTATED WHITE FOUR POINTED STAR (use BLACK FOUR POINTED STAR)
0xFFFD, // 0xB4 REPLACEMENT CHARACTER (close, but not exact)
0x272A, // 0xB5 CIRCLED WHITE STAR
0x2730, // 0xB6 SHADOWED WHITE STAR
0xFFFD, // 0xB7 ANALOG CLOCK 1 (no replacement)
0xFFFD, // 0xB8 ANALOG CLOCK 2 (no replacement)
0xFFFD, // 0xB9 ANALOG CLOCK 3 (no replacement)
0xFFFD, // 0xBA ANALOG CLOCK 4 (no replacement)
0xFFFD, // 0xBB ANALOG CLOCK 5 (no replacement)
0xFFFD, // 0xBC ANALOG CLOCK 6 (no replacement)
0xFFFD, // 0xBD ANALOG CLOCK 7 (no replacement)
0xFFFD, // 0xBE ANALOG CLOCK 8 (no replacement)
0xFFFD, // 0xBF ANALOG CLOCK 9 (no replacement)
0xFFFD, // 0xC0 ANALOG CLOCK 10 (no replacement)
0xFFFD, // 0xC1 ANALOG CLOCK 11 (no replacement)
0xFFFD, // 0xC2 ANALOG CLOCK 12 (no replacement)
0x21B2, // 0xC3 TURN ARROW DOWN AND LEFT (Meaning close, shape differs)
0x21B3, // 0xC4 TURN ARROW DOWN AND RIGHT (Meaning close, shape differs)
0x21B0, // 0xC5 TURN ARROW UP AND LEFT (Meaning close, shape differs)
0x21B1, // 0xC6 TURN ARROW UP AND RIGHT (Meaning close, shape differs)
0x2B11, // 0xC7 TURN ARROW LEFT AND UP (Meaning close, shape differs)
0x2B0F, // 0xC8 TURN ARROW RIGHT AND UP (Meaning close, shape differs)
0x2B10, // 0xC9 TURN ARROW LEFT AND DOWN (Meaning close, shape differs)
0x2B0E, // 0xCA TURN ARROW RIGHT AND DOWN (Meaning close, shape differs)
0xFFFD, // 0xCB no replacement
0xFFFD, // 0xCC no replacement
0xFFFD, // 0xCD no replacement
0xFFFD, // 0xCE no replacement
0xFFFD, // 0xCF no replacement
0xFFFD, // 0xD0 no replacement
0xFFFD, // 0xD1 no replacement
0xFFFD, // 0xD2 no replacement
0xFFFD, // 0xD3 no replacement
0xFFFD, // 0xD4 no replacement
0x232B, // 0xD5 ERASE TO THE LEFT
0x2326, // 0xD6 ERASE TO THE RIGHT
0x25C0, // 0xD7 THREE-D LIGHTED LEFT ARROWHEAD (Use BLACK LEFT TRIANGLE)
0x25B6, // 0xD8 THREE-D LIGHTED RIGHT ARROWHEAD (Use BLACK RIGHT TRIANGLE, 27A2 is exact but has no other directions)
0x25B2, // 0xD9 THREE-D LIGHTED UP ARROWHEAD (Use BLACK UP TRIANGLE)
0x25BC, // 0xDA THREE-D LIGHTED DOWN ARROWHEAD (Use BLACK DOWN TRIANGLE)
0xFFFD, // 0xDB no replacement
0x27B2, // 0xDC CIRCLED HEAVY WHITE RIGHTWARDS ARROW
0xFFFD, // 0xDD no replacement
0xFFFD, // 0xDE no replacement
0x2190, // 0xDF LEFT ARROW
0x2192, // 0xE0 RIGHT ARROW
0x2191, // 0xE1 UP ARROW
0x2193, // 0xE2 DOWN ARROW
0x2196, // 0xE3 UPPER LEFT ARROW
0x2197, // 0xE4 UPPER RIGHT ARROW
0x2199, // 0xE5 LOWER LEFT ARROW
0x2198, // 0xE6 LOWER RIGHT ARROW
0x2B05, // 0xE7 HEAVY LEFT BLACK ARROW (same as regular BLACK ARROW)
0x2B08, // 0xE8 HEAVY RIGHT BLACK ARROW (same as regular BLACK ARROW)
0x2B06, // 0xE9 HEAVY UP BLACK ARROW (no equiv BLACK ARROW)
0x2B07, // 0xEA HEAVY DOWN BLACK ARROW (same as regular BLACK ARROW)
0x2B09, // 0xEB HEAVY UPPER LEFT BLACK ARROW same as regular BLACK ARROW)
0x2B08, // 0xEC HEAVY UPPER RIGHT BLACK ARROW same as regular BLACK ARROW)
0x2B0B, // 0xED HEAVY LOWER LEFT BLACK ARROW (same as regular BLACK ARROW)
0x2B0A, // 0xEE HEAVY LOWER RIGHT BLACK ARROW (same as regular BLACK ARROW)
0x21E6, // 0xEF LEFTWARDS WHITE ARROW
0x21E8, // 0xF0 RIGHTWARDS WHITE ARROW
0x21E7, // 0xF1 UPWARDS WHITE ARROW
0x21E9, // 0xF2 DOWNWARDS WHITE ARROW
0x21D4, // 0xF3 LEFT RIGHT DOUBLE ARROW
0x21D5, // 0xF4 UP DOWN DOUBLE ARROW
0x21D6, // 0xF5 NORTH WEST DOUBLE ARROW (close, but not exact)
0x21D7, // 0xF6 NORTH EAST DOUBLE ARROW (close, but not exact)
0x21D9, // 0xF7 SOUTH WEST DOUBLE ARROW (close, but not exact)
0x21D8, // 0xF8 SOUTH EAST DOUBLE ARROW (close, but not exact)
0xFFFD, // 0xF9 no replacement
0xFFFD, // 0xFA no replacement
0x2717, // 0xFB BALLOT X
0x2713, // 0xFC CHECK MARK
0x2612, // 0xFD BALLOT BOX WITH X
0x2611, // 0xFE BALLOT BOX WITH CHECK
0xFFFD // 0xFF no replacement
};
/* characters from zapf dingbat font, conversion to a unicode font. Change both the
code and the font on conversion. These are untested as the development machine did
not have the font installed. */
static unsigned int dingbats_convert[256]={
0xFFFD, // 0x00 no replacement
0xFFFD, // 0x01 no replacement
0xFFFD, // 0x02 no replacement
0xFFFD, // 0x03 no replacement
0xFFFD, // 0x04 no replacement
0xFFFD, // 0x05 no replacement
0xFFFD, // 0x06 no replacement
0xFFFD, // 0x07 no replacement
0xFFFD, // 0x08 no replacement
0xFFFD, // 0x09 no replacement
0xFFFD, // 0x0A no replacement
0xFFFD, // 0x0B no replacement
0xFFFD, // 0x0C no replacement
0xFFFD, // 0x0D no replacement
0xFFFD, // 0x0E no replacement
0xFFFD, // 0x0F no replacement
0xFFFD, // 0x10 no replacement
0xFFFD, // 0x11 no replacement
0xFFFD, // 0x12 no replacement
0xFFFD, // 0x13 no replacement
0xFFFD, // 0x14 no replacement
0xFFFD, // 0x15 no replacement
0xFFFD, // 0x16 no replacement
0xFFFD, // 0x17 no replacement
0xFFFD, // 0x18 no replacement
0xFFFD, // 0x19 no replacement
0xFFFD, // 0x1A no replacement
0xFFFD, // 0x1B no replacement
0xFFFD, // 0x1C no replacement
0xFFFD, // 0x1D no replacement
0xFFFD, // 0x1E no replacement
0xFFFD, // 0x1F no replacement
0x0020, // 0x20 SPACE
0x2701, // 0x21 UPPER BLADE SCISSORS
0x2702, // 0x22 BLACK SCISSORS
0x2703, // 0x23 LOWER BLADE SCISSORS
0x2704, // 0x24 WHITE SCISSORS
0x260E, // 0x25 BLACK TELEPHONE
0x2706, // 0x26 TELEPHONE LOCATION SIGN
0x2707, // 0x27 TAPE DRIVE
0x2708, // 0x28 AIRPLANE
0x2709, // 0x29 ENVELOPE
0x261B, // 0x2A BLACK RIGHT POINTING INDEX
0x261E, // 0x2B WHITE RIGHT POINTING INDEX
0x270C, // 0x2C VICTORY HAND
0x270D, // 0x2D WRITING HAND
0x270E, // 0x2E LOWER RIGHT PENCIL
0x270F, // 0x2F PENCIL
0x2710, // 0x30 UPPER RIGHT PENCIL
0x2711, // 0x31 WHITE NIB
0x2712, // 0x32 BLACK NIB
0x2713, // 0x33 CHECK MARK
0x2714, // 0x34 HEAVY CHECK MARK
0x2715, // 0x35 MULTIPLICATION X
0x2716, // 0x36 HEAVY MULTIPLICATION X
0x2717, // 0x37 BALLOT X
0x2718, // 0x38 HEAVY BALLOT X
0x2719, // 0x39 OUTLINED GREEK CROSS
0x271A, // 0x3A HEAVY GREEK CROSS
0x271B, // 0x3B OPEN CENTRE CROSS
0x271C, // 0x3C HEAVY OPEN CENTRE CROSS
0x271D, // 0x3D LATIN CROSS
0x271E, // 0x3E SHADOWED WHITE LATIN CROSS
0x271F, // 0x3F OUTLINED LATIN CROSS
0x2720, // 0x40 MALTESE CROSS
0x2721, // 0x41 STAR OF DAVID
0x2722, // 0x42 FOUR TEARDROP-SPOKED ASTERISK
0x2723, // 0x43 FOUR BALLOON-SPOKED ASTERISK
0x2724, // 0x44 HEAVY FOUR BALLOON-SPOKED ASTERISK
0x2725, // 0x45 FOUR CLUB-SPOKED ASTERISK
0x2726, // 0x46 BLACK FOUR POINTED STAR
0x2727, // 0x47 WHITE FOUR POINTED STAR
0x2605, // 0x48 BLACK STAR
0x2729, // 0x49 STRESS OUTLINED WHITE STAR
0x272A, // 0x4A CIRCLED WHITE STAR
0x272B, // 0x4B OPEN CENTRE BLACK STAR
0x272C, // 0x4C BLACK CENTRE WHITE STAR
0x272D, // 0x4D OUTLINED BLACK STAR
0x272E, // 0x4E HEAVY OUTLINED BLACK STAR
0x272F, // 0x4F PINWHEEL STAR
0x2730, // 0x50 SHADOWED WHITE STAR
0x2731, // 0x51 HEAVY ASTERISK
0x2732, // 0x52 OPEN CENTRE ASTERISK
0x2733, // 0x53 EIGHT SPOKED ASTERISK
0x2734, // 0x54 EIGHT POINTED BLACK STAR
0x2735, // 0x55 EIGHT POINTED PINWHEEL STAR
0x2736, // 0x56 SIX POINTED BLACK STAR
0x2737, // 0x57 EIGHT POINTED RECTILINEAR BLACK STAR
0x2738, // 0x58 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
0x2739, // 0x59 TWELVE POINTED BLACK STAR
0x273A, // 0x5A SIXTEEN POINTED ASTERISK
0x273B, // 0x5B TEARDROP-SPOKED ASTERISK
0x273C, // 0x5C OPEN CENTRE TEARDROP-SPOKED ASTERISK
0x273D, // 0x5D HEAVY TEARDROP-SPOKED ASTERISK
0x273E, // 0x5E SIX PETALLED BLACK AND WHITE FLORETTE
0x273F, // 0x5F BLACK FLORETTE
0x2740, // 0x60 WHITE FLORETTE
0x2741, // 0x61 EIGHT PETALLED OUTLINED BLACK FLORETTE
0x2742, // 0x62 CIRCLED OPEN CENTRE EIGHT POINTED STAR
0x2743, // 0x63 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
0x2744, // 0x64 SNOWFLAKE
0x2745, // 0x65 TIGHT TRIFOLIATE SNOWFLAKE
0x2746, // 0x66 HEAVY CHEVRON SNOWFLAKE
0x2747, // 0x67 SPARKLE
0x2748, // 0x68 HEAVY SPARKLE
0x2749, // 0x69 BALLOON-SPOKED ASTERISK
0x274A, // 0x6A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
0x274B, // 0x6B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
0x25CF, // 0x6C BLACK CIRCLE
0x274D, // 0x6D SHADOWED WHITE CIRCLE
0x25A0, // 0x6E BLACK SQUARE
0x274F, // 0x6F LOWER RIGHT DROP-SHADOWED WHITE SQUARE
0x2750, // 0x70 UPPER RIGHT DROP-SHADOWED WHITE SQUARE
0x2751, // 0x71 LOWER RIGHT SHADOWED WHITE SQUARE
0x2752, // 0x72 UPPER RIGHT SHADOWED WHITE SQUARE
0x25B2, // 0x73 BLACK UP-POINTING TRIANGLE
0x25BC, // 0x74 BLACK DOWN-POINTING TRIANGLE
0x25C6, // 0x75 BLACK DIAMOND
0x2756, // 0x76 BLACK DIAMOND MINUS WHITE X
0x25D7, // 0x77 RIGHT HALF BLACK CIRCLE
0x2758, // 0x78 LIGHT VERTICAL BAR
0x2759, // 0x79 MEDIUM VERTICAL BAR
0x275A, // 0x7A HEAVY VERTICAL BAR
0x275B, // 0x7B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
0x275C, // 0x7C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
0x275D, // 0x7D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
0x275E, // 0x7E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
0xFFFD, // 0x7F no replacement
0xF8D7, // 0x80 MEDIUM LEFT PARENTHESIS ORNAMENT
0xF8D8, // 0x81 MEDIUM RIGHT PARENTHESIS ORNAMENT
0xF8D9, // 0x82 MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
0xF8DA, // 0x83 MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
0xF8DB, // 0x84 MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
0xF8DC, // 0x85 MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
0xF8DD, // 0x86 HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
0xF8DE, // 0x87 HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
0xF8DF, // 0x88 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
0xF8E0, // 0x89 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
0xF8E1, // 0x8A LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
0xF8E2, // 0x8B LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
0xF8E3, // 0x8C MEDIUM LEFT CURLY BRACKET ORNAMENT
0xF8E4, // 0x8D MEDIUM RIGHT CURLY BRACKET ORNAMENT
0xFFFD, // 0x8E no replacement
0xFFFD, // 0x8F no replacement
0xFFFD, // 0x90 no replacement
0xFFFD, // 0x91 no replacement
0xFFFD, // 0x92 no replacement
0xFFFD, // 0x93 no replacement
0xFFFD, // 0x94 no replacement
0xFFFD, // 0x95 no replacement
0xFFFD, // 0x96 no replacement
0xFFFD, // 0x97 no replacement
0xFFFD, // 0x98 no replacement
0xFFFD, // 0x99 no replacement
0xFFFD, // 0x9A no replacement
0xFFFD, // 0x9B no replacement
0xFFFD, // 0x9C no replacement
0xFFFD, // 0x9D no replacement
0xFFFD, // 0x9E no replacement
0xFFFD, // 0x9F no replacement
0xFFFD, // 0xA0 no replacement
0x2761, // 0xA1 CURVED STEM PARAGRAPH SIGN ORNAMENT
0x2762, // 0xA2 HEAVY EXCLAMATION MARK ORNAMENT
0x2763, // 0xA3 HEAVY HEART EXCLAMATION MARK ORNAMENT
0x2764, // 0xA4 HEAVY BLACK HEART
0x2765, // 0xA5 ROTATED HEAVY BLACK HEART BULLET
0x2766, // 0xA6 FLORAL HEART
0x2767, // 0xA7 ROTATED FLORAL HEART BULLET
0x2663, // 0xA8 BLACK CLUB SUIT
0x2666, // 0xA9 BLACK DIAMOND SUIT
0x2665, // 0xAA BLACK HEART SUIT
0x2660, // 0xAB BLACK SPADE SUIT
0x2460, // 0xAC CIRCLED DIGIT ONE
0x2461, // 0xAD CIRCLED DIGIT TWO
0x2462, // 0xAE CIRCLED DIGIT THREE
0x2463, // 0xAF CIRCLED DIGIT FOUR
0x2464, // 0xB0 CIRCLED DIGIT FIVE
0x2465, // 0xB1 CIRCLED DIGIT SIX
0x2466, // 0xB2 CIRCLED DIGIT SEVEN
0x2467, // 0xB3 CIRCLED DIGIT EIGHT
0x2468, // 0xB4 CIRCLED DIGIT NINE
0x2469, // 0xB5 CIRCLED NUMBER TEN
0x2776, // 0xB6 DINGBAT NEGATIVE CIRCLED DIGIT ONE
0x2777, // 0xB7 DINGBAT NEGATIVE CIRCLED DIGIT TWO
0x2778, // 0xB8 DINGBAT NEGATIVE CIRCLED DIGIT THREE
0x2779, // 0xB9 DINGBAT NEGATIVE CIRCLED DIGIT FOUR
0x277A, // 0xBA DINGBAT NEGATIVE CIRCLED DIGIT FIVE
0x277B, // 0xBB DINGBAT NEGATIVE CIRCLED DIGIT SIX
0x277C, // 0xBC DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
0x277D, // 0xBD DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
0x277E, // 0xBE DINGBAT NEGATIVE CIRCLED DIGIT NINE
0x277F, // 0xBF DINGBAT NEGATIVE CIRCLED NUMBER TEN
0x2780, // 0xC0 DINGBAT CIRCLED SANS-SERIF DIGIT ONE
0x2781, // 0xC1 DINGBAT CIRCLED SANS-SERIF DIGIT TWO
0x2782, // 0xC2 DINGBAT CIRCLED SANS-SERIF DIGIT THREE
0x2783, // 0xC3 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
0x2784, // 0xC4 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
0x2785, // 0xC5 DINGBAT CIRCLED SANS-SERIF DIGIT SIX
0x2786, // 0xC6 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
0x2787, // 0xC7 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
0x2788, // 0xC8 DINGBAT CIRCLED SANS-SERIF DIGIT NINE
0x2789, // 0xC9 DINGBAT CIRCLED SANS-SERIF NUMBER TEN
0x278A, // 0xCA DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
0x278B, // 0xCB DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
0x278C, // 0xCC DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
0x278D, // 0xCD DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
0x278E, // 0xCE DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
0x278F, // 0xCF DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
0x2790, // 0xD0 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
0x2791, // 0xD1 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
0x2792, // 0xD2 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
0x2793, // 0xD3 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
0x2794, // 0xD4 HEAVY WIDE-HEADED RIGHTWARDS ARROW
0x2192, // 0xD5 RIGHTWARDS ARROW
0x2194, // 0xD6 LEFT RIGHT ARROW
0x2195, // 0xD7 UP DOWN ARROW
0x2798, // 0xD8 HEAVY SOUTH EAST ARROW
0x2799, // 0xD9 HEAVY RIGHTWARDS ARROW
0x279A, // 0xDA HEAVY NORTH EAST ARROW
0x279B, // 0xDB DRAFTING POINT RIGHTWARDS ARROW
0x279C, // 0xDC HEAVY ROUND-TIPPED RIGHTWARDS ARROW
0x279D, // 0xDD TRIANGLE-HEADED RIGHTWARDS ARROW
0x279E, // 0xDE HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
0x279F, // 0xDF DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
0x27A0, // 0xE0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
0x27A1, // 0xE1 BLACK RIGHTWARDS ARROW
0x27A2, // 0xE2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
0x27A3, // 0xE3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
0x27A4, // 0xE4 BLACK RIGHTWARDS ARROWHEAD
0x27A5, // 0xE5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
0x27A6, // 0xE6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
0x27A7, // 0xE7 SQUAT BLACK RIGHTWARDS ARROW
0x27A8, // 0xE8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
0x27A9, // 0xE9 RIGHT-SHADED WHITE RIGHTWARDS ARROW
0x27AA, // 0xEA LEFT-SHADED WHITE RIGHTWARDS ARROW
0x27AB, // 0xEB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
0x27AC, // 0xEC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
0x27AD, // 0xED HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
0x27AE, // 0xEE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
0x27AF, // 0xEF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
0xFFFD, // 0xF0 no replacement
0x27B1, // 0xF1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
0x27B2, // 0xF2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW
0x27B3, // 0xF3 WHITE-FEATHERED RIGHTWARDS ARROW
0x27B4, // 0xF4 BLACK-FEATHERED SOUTH EAST ARROW
0x27B5, // 0xF5 BLACK-FEATHERED RIGHTWARDS ARROW
0x27B6, // 0xF6 BLACK-FEATHERED NORTH EAST ARROW
0x27B7, // 0xF7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW
0x27B8, // 0xF8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
0x27B9, // 0xF9 HEAVY BLACK-FEATHERED NORTH EAST ARROW
0x27BA, // 0xFA TEARDROP-BARBED RIGHTWARDS ARROW
0x27BB, // 0xFB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
0x27BC, // 0xFC WEDGE-TAILED RIGHTWARDS ARROW
0x27BD, // 0xFD HEAVY WEDGE-TAILED RIGHTWARDS ARROW
0x27BE, // 0xFE OPEN-OUTLINED RIGHTWARDS ARROW
0xFFFD // 0xFF no replacement
};
/* characters from symbol font, conversion to a unicode font. Change both the
code and the font on conversion. */
static unsigned int symbol_convert[256]={
0xFFFD, // 0x00 no replacement
0xFFFD, // 0x01 no replacement
0xFFFD, // 0x02 no replacement
0xFFFD, // 0x03 no replacement
0xFFFD, // 0x04 no replacement
0xFFFD, // 0x05 no replacement
0xFFFD, // 0x06 no replacement
0xFFFD, // 0x07 no replacement
0xFFFD, // 0x08 no replacement
0xFFFD, // 0x09 no replacement
0xFFFD, // 0x0A no replacement
0xFFFD, // 0x0B no replacement
0xFFFD, // 0x0C no replacement
0xFFFD, // 0x0D no replacement
0xFFFD, // 0x0E no replacement
0xFFFD, // 0x0F no replacement
0xFFFD, // 0x10 no replacement
0xFFFD, // 0x11 no replacement
0xFFFD, // 0x12 no replacement
0xFFFD, // 0x13 no replacement
0xFFFD, // 0x14 no replacement
0xFFFD, // 0x15 no replacement
0xFFFD, // 0x16 no replacement
0xFFFD, // 0x17 no replacement
0xFFFD, // 0x18 no replacement
0xFFFD, // 0x19 no replacement
0xFFFD, // 0x1A no replacement
0xFFFD, // 0x1B no replacement
0xFFFD, // 0x1C no replacement
0xFFFD, // 0x1D no replacement
0xFFFD, // 0x1E no replacement
0xFFFD, // 0x1F no replacement
0x0020, // 0x20 SPACE
0x0021, // 0x21 EXCLAMATION MARK
0x2200, // 0x22 FOR ALL
0x0023, // 0x23 NUMBER SIGN
0x2203, // 0x24 THERE EXISTS
0x0025, // 0x25 PERCENT SIGN
0x0026, // 0x26 AMPERSAND
0x220B, // 0x27 CONTAINS AS MEMBER
0x0028, // 0x28 OPENING PARENTHESIS
0x0029, // 0x29 CLOSING PARENTHESIS
0x2217, // 0x2A ASTERISK OPERATOR
0x002B, // 0x2B PLUS SIGN
0x002C, // 0x2C COMMA
0x2212, // 0x2D MINUS SIGN
0x002E, // 0x2E PERIOD
0x002F, // 0x2F SLASH
0x0030, // 0x30 DIGIT ZERO
0x0031, // 0x31 DIGIT ONE
0x0032, // 0x32 DIGIT TWO
0x0033, // 0x33 DIGIT THREE
0x0034, // 0x34 DIGIT FOUR
0x0035, // 0x35 DIGIT FIVE
0x0036, // 0x36 DIGIT SIX
0x0037, // 0x37 DIGIT SEVEN
0x0038, // 0x38 DIGIT EIGHT
0x0039, // 0x39 DIGIT NINE
0x003A, // 0x3A COLON
0x003B, // 0x3B SEMICOLON
0x003C, // 0x3C LESS-THAN SIGN
0x003D, // 0x3D EQUALS SIGN
0x003E, // 0x3E GREATER-THAN SIGN
0x003F, // 0x3F QUESTION MARK
0x2245, // 0x40 APPROXIMATELY EQUAL TO
0x0391, // 0x41 GREEK CAPITAL LETTER ALPHA
0x0392, // 0x42 GREEK CAPITAL LETTER BETA
0x03A7, // 0x43 GREEK CAPITAL LETTER CHI
0x0394, // 0x44 GREEK CAPITAL LETTER DELTA
0x0395, // 0x45 GREEK CAPITAL LETTER EPSILON
0x03A6, // 0x46 GREEK CAPITAL LETTER PHI
0x0393, // 0x47 GREEK CAPITAL LETTER GAMMA
0x0397, // 0x48 GREEK CAPITAL LETTER ETA
0x0399, // 0x49 GREEK CAPITAL LETTER IOTA
0x03D1, // 0x4A GREEK SMALL LETTER SCRIPT THETA
0x039A, // 0x4B GREEK CAPITAL LETTER KAPPA
0x039B, // 0x4C GREEK CAPITAL LETTER LAMBDA
0x039C, // 0x4D GREEK CAPITAL LETTER MU
0x039D, // 0x4E GREEK CAPITAL LETTER NU
0x039F, // 0x4F GREEK CAPITAL LETTER OMICRON
0x03A0, // 0x50 GREEK CAPITAL LETTER PI
0x0398, // 0x51 GREEK CAPITAL LETTER THETA
0x03A1, // 0x52 GREEK CAPITAL LETTER RHO
0x03A3, // 0x53 GREEK CAPITAL LETTER SIGMA
0x03A4, // 0x54 GREEK CAPITAL LETTER TAU
0x03A5, // 0x55 GREEK CAPITAL LETTER UPSILON
0x03C2, // 0x56 GREEK SMALL LETTER FINAL SIGMA
0x03A9, // 0x57 GREEK CAPITAL LETTER OMEGA
0x039E, // 0x58 GREEK CAPITAL LETTER XI
0x03A8, // 0x59 GREEK CAPITAL LETTER PSI
0x0396, // 0x5A GREEK CAPITAL LETTER ZETA
0x005B, // 0x5B OPENING SQUARE BRACKET
0x2234, // 0x5C THEREFORE
0x005D, // 0x5D CLOSING SQUARE BRACKET
0x22A5, // 0x5E UP TACK
0x005F, // 0x5F SPACING UNDERSCORE
0x203E, // 0x60 SPACING OVERSCORE
0x03B1, // 0x61 GREEK SMALL LETTER ALPHA
0x03B2, // 0x62 GREEK SMALL LETTER BETA
0x03C7, // 0x63 GREEK SMALL LETTER CHI
0x03B4, // 0x64 GREEK SMALL LETTER DELTA
0x03B5, // 0x65 GREEK SMALL LETTER EPSILON
0x03C6, // 0x66 GREEK SMALL LETTER PHI
0x03B3, // 0x67 GREEK SMALL LETTER GAMMA
0x03B7, // 0x68 GREEK SMALL LETTER ETA
0x03B9, // 0x69 GREEK SMALL LETTER IOTA
0x03D5, // 0x6A GREEK SMALL LETTER SCRIPT PHI
0x03BA, // 0x6B GREEK SMALL LETTER KAPPA
0x03BB, // 0x6C GREEK SMALL LETTER LAMBDA
0x03BC, // 0x6D GREEK SMALL LETTER MU
0x03BD, // 0x6E GREEK SMALL LETTER NU
0x03BF, // 0x6F GREEK SMALL LETTER OMICRON
0x03C0, // 0x70 GREEK SMALL LETTER PI
0x03B8, // 0x71 GREEK SMALL LETTER THETA
0x03C1, // 0x72 GREEK SMALL LETTER RHO
0x03C3, // 0x73 GREEK SMALL LETTER SIGMA
0x03C4, // 0x74 GREEK SMALL LETTER TAU
0x03C5, // 0x75 GREEK SMALL LETTER UPSILON
0x03D6, // 0x76 GREEK SMALL LETTER OMEGA PI
0x03C9, // 0x77 GREEK SMALL LETTER OMEGA
0x03BE, // 0x78 GREEK SMALL LETTER XI
0x03C8, // 0x79 GREEK SMALL LETTER PSI
0x03B6, // 0x7A GREEK SMALL LETTER ZETA
0x007B, // 0x7B OPENING CURLY BRACKET
0x007C, // 0x7C VERTICAL BAR
0x007D, // 0x7D CLOSING CURLY BRACKET
0x223C, // 0x7E TILDE OPERATOR
0xFFFD, // 0x7F no replacement
0xFFFD, // 0x80 no replacement
0xFFFD, // 0x81 no replacement
0xFFFD, // 0x82 no replacement
0xFFFD, // 0x83 no replacement
0xFFFD, // 0x84 no replacement
0xFFFD, // 0x85 no replacement
0xFFFD, // 0x86 no replacement
0xFFFD, // 0x87 no replacement
0xFFFD, // 0x88 no replacement
0xFFFD, // 0x89 no replacement
0xFFFD, // 0x8A no replacement
0xFFFD, // 0x8B no replacement
0xFFFD, // 0x8C no replacement
0xFFFD, // 0x8D no replacement
0xFFFD, // 0x8E no replacement
0xFFFD, // 0x8F no replacement
0xFFFD, // 0x90 no replacement
0xFFFD, // 0x91 no replacement
0xFFFD, // 0x92 no replacement
0xFFFD, // 0x93 no replacement
0xFFFD, // 0x94 no replacement
0xFFFD, // 0x95 no replacement
0xFFFD, // 0x96 no replacement
0xFFFD, // 0x97 no replacement
0xFFFD, // 0x98 no replacement
0xFFFD, // 0x99 no replacement
0xFFFD, // 0x9A no replacement
0xFFFD, // 0x9B no replacement
0xFFFD, // 0x9C no replacement
0xFFFD, // 0x9D no replacement
0xFFFD, // 0x9E no replacement
0xFFFD, // 0x9F no replacement
0x20AC, // 0xA0 EURO SIGN
0x03D2, // 0xA1 GREEK CAPITAL LETTER UPSILON HOOK
0x2032, // 0xA2 PRIME
0x2264, // 0xA3 LESS THAN OR EQUAL TO
0x2044, // 0xA4 FRACTION SLASH
0x221E, // 0xA5 INFINITY
0x0192, // 0xA6 LATIN SMALL LETTER SCRIPT F
0x2663, // 0xA7 BLACK CLUB SUIT
0x2666, // 0xA8 BLACK DIAMOND SUIT
0x2665, // 0xA9 BLACK HEART SUIT
0x2660, // 0xAA BLACK SPADE SUIT
0x2194, // 0xAB LEFT RIGHT ARROW
0x2190, // 0xAC LEFT ARROW
0x2191, // 0xAD UP ARROW
0x2192, // 0xAE RIGHT ARROW
0x2193, // 0xAF DOWN ARROW
0x00B0, // 0xB0 DEGREE SIGN
0x00B1, // 0xB1 PLUS-OR-MINUS SIGN
0x2033, // 0xB2 DOUBLE PRIME
0x2265, // 0xB3 GREATER THAN OR EQUAL TO
0x00D7, // 0xB4 MULTIPLICATION SIGN
0x221D, // 0xB5 PROPORTIONAL TO
0x2202, // 0xB6 PARTIAL DIFFERENTIAL
0x2219, // 0xB7 BULLET (use BULLET operator, so normal font BULLET will not convert to Symbol BULLET)
0x00F7, // 0xB8 DIVISION SIGN
0x2260, // 0xB9 NOT EQUAL TO
0x2261, // 0xBA IDENTICAL TO
0x2248, // 0xBB ALMOST EQUAL TO
0x2026, // 0xBC HORIZONTAL ELLIPSIS
0xF8E6, // 0xBD VERTICAL ARROW EXTENDER
0xF8E7, // 0xBE HORIZONTAL ARROW EXTENDER
0x21B5, // 0xBF DOWN ARROW WITH CORNER LEFT
0x2135, // 0xC0 FIRST TRANSFINITE CARDINAL
0x2111, // 0xC1 BLACK-LETTER I
0x211C, // 0xC2 BLACK-LETTER R
0x2118, // 0xC3 SCRIPT P
0x2297, // 0xC4 CIRCLED TIMES
0x2295, // 0xC5 CIRCLED PLUS
0x2205, // 0xC6 EMPTY SET
0x2229, // 0xC7 INTERSECTION
0x222A, // 0xC8 UNION
0x2283, // 0xC9 SUPERSET OF
0x2287, // 0xCA SUPERSET OF OR EQUAL TO
0x2284, // 0xCB NOT A SUBSET OF
0x2282, // 0xCC SUBSET OF
0x2286, // 0xCD SUBSET OF OR EQUAL TO
0x2208, // 0xCE ELEMENT OF
0x2209, // 0xCF NOT AN ELEMENT OF
0x2220, // 0xD0 ANGLE
0x2207, // 0xD1 NABLA
0x00AE, // 0xD2 REGISTERED TRADE MARK SIGN
0x00A9, // 0xD3 COPYRIGHT SIGN
0x2122, // 0xD4 TRADEMARK
0x220F, // 0xD5 N-ARY PRODUCT
0x221A, // 0xD6 SQUARE ROOT
0x22C5, // 0xD7 DOT OPERATOR
0x00AC, // 0xD8 NOT SIGN
0x2227, // 0xD9 LOGICAL AND
0x2228, // 0xDA LOGICAL OR
0x21D4, // 0xDB LEFT RIGHT DOUBLE ARROW
0x21D0, // 0xDC LEFT DOUBLE ARROW
0x21D1, // 0xDD UP DOUBLE ARROW
0x21D2, // 0xDE RIGHT DOUBLE ARROW
0x21D3, // 0xDF DOWN DOUBLE ARROW
0x25CA, // 0xE0 LOZENGE
0x2329, // 0xE1 BRA
0x00AE, // 0xE2 REGISTERED TRADE MARK SIGN
0x00A9, // 0xE3 COPYRIGHT SIGN
0x2122, // 0xE4 TRADEMARK
0x2211, // 0xE5 N-ARY SUMMATION
0x239B, // 0xE6 LEFT PAREN TOP
0x239C, // 0xE7 LEFT PAREN EXTENDER
0x239D, // 0xE8 LEFT PAREN BOTTOM
0x23A1, // 0xE9 LEFT SQUARE BRACKET TOP
0x23A2, // 0xEA LEFT SQUARE BRACKET EXTENDER
0x23A3, // 0xEB LEFT SQUARE BRACKET BOTTOM
0x23A7, // 0xEC LEFT CURLY BRACKET TOP
0x23A8, // 0xED LEFT CURLY BRACKET MID
0x23A9, // 0xEE LEFT CURLY BRACKET BOTTOM
0x23AA, // 0xEF CURLY BRACKET EXTENDER
0xFFFD, // 0xF0 no replacement
0x232A, // 0xF1 KET
0x222B, // 0xF2 INTEGRAL
0x2320, // 0xF3 TOP HALF INTEGRAL
0x23AE, // 0xF4 INTEGRAL EXTENDER
0x2321, // 0xF5 BOTTOM HALF INTEGRAL
0x239E, // 0xF6 RIGHT PAREN TOP
0x239F, // 0xF7 RIGHT PAREN EXTENDER
0x23A0, // 0xF8 RIGHT PAREN BOTTOM
0x23A4, // 0xF9 RIGHT SQUARE BRACKET TOP
0x23A5, // 0xFA RIGHT SQUARE BRACKET EXTENDER
0x23A6, // 0xFB RIGHT SQUARE BRACKET BOTTOM
0x23AB, // 0xFC RIGHT CURLY BRACKET TOP
0x23AC, // 0xFD RIGHT CURLY BRACKET MID
0x23AD, // 0xFE RIGHT CURLY BRACKET BOTTOM
0xFFFD // 0xFF no replacement
};
/* Use this for debugging */
#include <stdio.h>
void UC_log_message(char *text){
FILE *fp;
fp=fopen("c:/temp/debug.txt","a");
fprintf(fp,"%s",text);
fclose(fp);
}
//if any character is in the MS private use area (F020 through F0FF) subtract F000, for use with Symbol and Wingdings* from older software
void msdepua (uint32_t *text)
{
while(*text){
if(*text >= 0xF020 && *text <= 0xF0FF){ *text -= 0xF000; }
text++;
}
}
//move characters up to MS private use area (F020 through F0FF)
void msrepua (uint16_t *text)
{
while(*text){
if(*text >= 0x20 && *text <= 0xFF){ *text += 0xF000; }
text++;
}
}
// Returns the font classification code
int isNon(char *font){
int retval;
if(!strcmp(font,"Symbol")){
retval=CVTSYM;
}
else if(!strcmp(font,"Wingdings")){
retval=CVTWDG;
}
else if(!strcmp(font,"ZapfDingbats")){
retval=CVTZDG;
}
else {
retval=CVTNON;
}
return retval;
}
// Returns the font name, given the classification code, or NULL
// The returned value must NOT be free'd
char *FontName(int code){
char *cptr;
static char name_symbol[]="Symbol";
static char name_wingdings[]="Wingdings";
static char name_zapfdingbats[]="ZapfDingbats";
switch(code){
case CVTSYM: cptr=&name_symbol[0]; break;
case CVTWDG: cptr=&name_wingdings[0]; break;
case CVTZDG: cptr=&name_zapfdingbats[0]; break;
default: cptr=NULL; break;
}
return(cptr);
}
// Goes through the uint32_t string converting as needed.
int NonToUnicode(uint32_t *text, char *font){
int retval;
unsigned int *convert_from=NULL;
retval=isNon(font);
switch(retval){
case CVTSYM: convert_from=symbol_convert; break;
case CVTWDG: convert_from=wingdings_convert; break;
case CVTZDG: convert_from=dingbats_convert; break;
default: return(retval); //no conversion
}
while(*text){
if(*text > 0xFF){ *text = 0xFFFD; } // out of range
else { *text = convert_from[*text]; }
text++;
}
return(retval);
}
//returns 1 if tables are defines for UnicodeToNon translation
int CanUTN(void){
if(from_unicode)return(1);
return(0);
}
//translates from Unicode to some non unicode font until the target font changes.
//A target font change is like symbol -> wingdings, or symbol -> no translation
//returns the number of characters changed in ecount
//returns the enum value for the destination value in edest
void UnicodeToNon(uint16_t *text, int *ecount, int *edest){
int count=0;
unsigned char target=0;
if(to_font){
if(text && (target=to_font[*text])){ //There is actually something here to convert
while(*text && target==to_font[*text]){
*text=from_unicode[*text] + (hold_pua ? 0xF000 : 0 );
text++;
count++;
}
}
*ecount=count;
*edest=target;
}
else { // no translation tables, so change nothing and return
*ecount=0;
*edest=CVTNON;
}
}
//Indicates the type of translation for a single character, Unicode to some non unicode
//returns the enum value for the destination value.
//If no translation tables are defined returns CVTNON (no conversions)
int SingleUnicodeToNon(uint16_t text){
if(to_font){return(to_font[text]); }
else { return(CVTNON); }
}
void table_filler(unsigned int *src, int code){
unsigned int i;
for(i=0;i<0x100;i++){
if(src[i] == 0xFFFD)continue; /* no mapping Unicode -> nonUnicode */
if(src[i] == i)continue; /* no remapping of spaces back to spaces, for instance */
from_unicode[src[i]] = i;
to_font[src[i]] = code;
}
}
//possibly (re)generate the tables
void TableGen(bool new_symb,bool new_wing, bool new_zdng, bool new_pua){
int i;
if(hold_symb != new_symb || hold_wing != new_wing
|| hold_zdng != new_zdng || hold_pua != new_pua ){ // must (re)generate tables
if(!from_unicode){ // create arrays
from_unicode = (unsigned char *) calloc(0x10000,sizeof(unsigned char));
to_font = (unsigned char *) calloc(0x10000,sizeof(unsigned char));
// should check here for malloc error
}
hold_symb = new_symb;
hold_wing = new_wing;
hold_zdng = new_zdng;
hold_pua = new_pua;
for(i=0;i<0x10000;i++){ from_unicode[i] = to_font[i] = 0; }
if(hold_zdng)table_filler(&dingbats_convert[0],CVTZDG);
if(hold_wing)table_filler(&wingdings_convert[0],CVTWDG);
if(hold_symb)table_filler(&symbol_convert[0],CVTSYM);
}
}
#ifdef __cplusplus
}
#endif