#include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "wv.h"

/*
 * This is the unicode translation table for "MT Extra", which is 
 * part of Math Type, and for some reason shipped with Word 6.
 *
 * http://support.microsoft.com/support/kb/articles/Q106/3/41.asp
 *
 * The unicode translation table is here:
 * 
 * http://www.mathtype.com/support/tech/encodings/mtextra.htm
 * 
 * Copyright 2001, Sean Young <sean@msxnet.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

U16
wvConvertMTExtraToUnicode (U16 char16)
{
    if (char16 < ' ')
      return char16;

    switch (char16)
      {
      case 0x20: return 0x0020; /* Space */
      case 0x23: return 0x0300; /* Grave embellishment */
      case 0x24: return 0x0302; /* Hat embellishment */
      case 0x25: return 0x0303; /* Tilde embellishment */
      case 0x26: return 0x0307; /* Dot above embellishment */
      case 0x28: return 0x2323; /* Smile */
      case 0x29: return 0x2322; /* Frown */
      case 0x31: return 0xEC00; /* Down-pointing curly bracket left */
      case 0x32: return 0xEC01; /* Down-pointing curly bracket mid */
      case 0x33: return 0xEC02; /* Down-pointing curly bracket right */
      case 0x34: return 0xEC03; /* Horizontal curly bracket extender */
      case 0x35: return 0xEC0B; /* Horizontal square bracket extender */
      case 0x36: return 0xEC04; /* Up-pointing curly bracket left */
      case 0x37: return 0xEC05; /* Up-pointing curly bracket mid */
      case 0x38: return 0xEC06; /* Up-pointing curly bracket right */
      case 0x3A: return 0x223C; /* Tilde operator */
      case 0x3B: return 0x2243; /* Asymptotically equal to */
      case 0x3C: return 0x22B2; /* Normal subgroup of */
      case 0x3D: return 0x226A; /* Much less-than */
      case 0x3E: return 0x22B3; /* Contains as normal subgroup */
      case 0x3F: return 0x226B; /* Much greater-than */
      case 0x40: return 0x225C; /* Delta equal to */
      case 0x41: return 0x2259; /* Estimates */
      case 0x42: return 0x2250; /* Approaches the limit */
      case 0x43: return 0x2210; /* N-ary coproduct */
      case 0x44: return 0x019B; /* Latin small letter lambda with stroke */
      case 0x45: return 0xEC0E; /* Under square bracket left */
      case 0x46: return 0xEC0F; /* Under square bracket right */
      case 0x47: return 0xEC10; /* Over square bracket left */
      case 0x48: return 0xEC11; /* Over square bracket right */
      case 0x49: return 0x2229; /* Intersection */
      case 0x4A: return 0x2127; /* Inverted ohm sign */
      case 0x4B: return 0x2026; /* Horizontal ellipsis */
      case 0x4C: return 0x22EF; /* Math-axis ellipsis */
      case 0x4D: return 0x22EE; /* Vertical ellipsis */
      case 0x4E: return 0x22F0; /* Up right diagonal ellipsis */
      case 0x4F: return 0x22F1; /* Down right diagonal ellipsis */
      case 0x50: return 0x2225; /* Parallel to */
      case 0x51: return 0x2235; /* Because or since */
      case 0x52: return 0x2221; /* Measured angle */
      case 0x53: return 0x2222; /* Spherical angle */
      case 0x55: return 0x222A; /* Union */
      case 0x56: return 0x25B3; /* White up-pointing triangle */
      case 0x57: return 0x25A1; /* White square */
      case 0x58: return 0x25AD; /* White rectangle */
      case 0x59: return 0x25B1; /* White parallelogram */
      case 0x5A: return 0x2197; /* North east arrow */
      case 0x5B: return 0x2199; /* South west arrow */
      case 0x5C: return 0xEB05; /* Double arrow northeast southwest */
      case 0x5D: return 0x2198; /* South east arrow */
      case 0x5E: return 0x2196; /* North west arrow */
      case 0x5F: return 0xEB06; /* Double arrow northwest southeast */
      case 0x60: return 0x2035; /* Reversed prime */
      case 0x61: return 0x21A6; /* Rightwards arrow from bar */
      case 0x62: return 0x2195; /* Up down arrow */
      case 0x63: return 0x21D5; /* Up down double arrow */
      case 0x64: return 0x25CB; /* White circle */
      case 0x65: return 0x2299; /* Circled dot operator */
      case 0x66: return 0x227B; /* Succeeds */
      case 0x67: return 0xE98F; /* Medium dot operator (free radical) */
      case 0x68: return 0x210F; /* Planck constant over two pi */
      case 0x69: return 0xEE00; /* Anticlockwise contour integral loop */
      case 0x6A: return 0xEE01; /* Clockwise contour integral loop */
      case 0x6C: return 0x2113; /* Script small l */
      case 0x6D: return 0x2213; /* Minus-plus sign */
      case 0x6E: return 0xFFFD; /* Unknown or missing character */
      case 0x6F: return 0x2218; /* Composition */
      case 0x70: return 0x227A; /* Precedes */
      case 0x71: return 0xEB1A; /* Left harpoon (barb down) */
      case 0x72: return 0x20D7; /* Right arrow embellishment */
      case 0x73: return 0x20D6; /* Left arrow embellishment */
      case 0x74: return 0x20E1; /* Left right arrow embellishment */
      case 0x75: return 0xEB00; /* Arrow embellishment extender */
      case 0x76: return 0x20D1; /* Right harpoon embellishment (barb up) */
      case 0x77: return 0x20D0; /* Left harpoon embellishment (barb up) */
      case 0x78: return 0xEB19; /* Right harpoon (barb down) */
      case 0x7B: return 0xFE38; /* Under curly bracket */
      case 0x7C: return 0xEC0C; /* Under square bracket */
      case 0x7D: return 0xFE37; /* Over curly bracket */
      case 0x7E: return 0xEC0D; /* Over square bracket */
      case 0x80: return 0x21C4; /* Rightwards arrow over leftwards arrow */
      case 0x81: return 0xEB01; /* Arrow rightwards over small arrow leftwards */
      case 0x82: return 0xEB02; /* Small arrow rightwards over arrow leftwards */
      case 0x83: return 0x21CC; /* Right harpoon over left harpoon */
      case 0x84: return 0xEB03; /* Harpoon right over small harpoon left */
      case 0x85: return 0xEB04; /* Small harpoon right over harpoon left */
      case 0x86: return 0x21C0; /* Right harpoon (barb up) */
      case 0x87: return 0x21BD; /* Left harpoon (barb down) */
      case 0x88: return 0xF8E7; /* Horizontal arrow extender */
      case 0xA1: return 0x211D; /* Blackboard-bold capital R */
      case 0xA2: return 0x2124; /* Blackboard-bold capital Z */
      case 0xA3: return 0x2102; /* Blackboard-bold capital C */
      case 0xA4: return 0x211A; /* Blackboard-bold capital Q */
      case 0xA5: return 0x2115; /* Blackboard-bold capital N */
      case 0xA7: return 0x301A; /* Left white square bracket */
      case 0xA8: return 0x301B; /* Right white square bracket */
      case 0xA9: return 0xEC22; /* Left white square bracket top */
      case 0xAA: return 0xEC23; /* Left white square bracket extender */
      case 0xAB: return 0xEC24; /* Left white square bracket bottom */
      case 0xAC: return 0xEC25; /* Right white square bracket top */
      case 0xAD: return 0xEC26; /* Right white square bracket extender */
      case 0xAE: return 0xEC27; /* Right white square bracket bottom */
      case 0xB0: return 0xEE04; /* Tilde embellishment (two space) */
      case 0xB1: return 0xEE05; /* Tilde embellishment (three space) */
      case 0xB2: return 0xEE06; /* Tilde embellishment (four space) */
      case 0xB5: return 0xEE07; /* Hat embellishment (two space) */
      case 0xB6: return 0xEE08; /* Hat embellishment (three space) */
      case 0xB7: return 0xEE09; /* Hat embellishment (four space) */
      case 0xBA: return 0xEE0A; /* Arc embellishment (two space) */
      case 0xBB: return 0xEE0B; /* Arc embellishment (three space) */
      case 0xBC: return 0xEE0C; /* Arc embellishment (four space) */
      case 0xC0: return 0xEE0D; /* Joint status embellishment */
      case 0xC1: return 0xEE0E; /* Joint status embellishment (left) */
      case 0xC2: return 0xEE0F; /* Joint status embellishment (right) */
      case 0xC3: return 0xEE10; /* Joint status embellishment (extender) */
      case 0xD1: return 0xEE11; /* Integral loop */
      case 0xD2: return 0xEE12; /* Integral loop (double) */
      case 0xD3: return 0xEE13; /* Integral loop (triple) */
      case 0xD5: return 0xEE15; /* Expanding integral loop (double) */
      case 0xD6: return 0xEE16; /* Expanding integral loop (triple) */
      case 0xE7: return 0xF8FF; /* Apple logo */
      case 0xE8: return 0x0160; /* Latin capital letter S with caron */
      case 0xE9: return 0x00DD; /* Latin capital letter Y with acute */
      case 0xEA: return 0x00DE; /* Latin capital letter Thorn */
      case 0xEB: return 0x00D0; /* Latin capital letter Eth */
      case 0xEC: return 0x0161; /* Latin small letter s with caron */
      case 0xED: return 0x00FD; /* Latin small letter y with acute */
      case 0xEE: return 0x00FE; /* Latin small letter thorn */
      case 0xEF: return 0x00F0; /* Latin small letter eth */
      case 0xF0: return 0xFB01; /* Latin small ligature fi */
      case 0xF1: return 0xFB02; /* Latin small ligature fl */
      case 0xF2: return 0x0131; /* Latin small letter dotless i */
      case 0xF3: return 0x00B9; /* Superscript one */
      case 0xF4: return 0x00B2; /* Superscript two */
      case 0xF5: return 0x00B3; /* Superscript three */
      case 0xF6: return 0x00BD; /* Vulgar fraction one half */
      case 0xF7: return 0x00BC; /* Vulgar fraction one quarter */
      case 0xF8: return 0x00BE; /* Vulgar fraction three quarters */
      case 0xF9: return 0x2044; /* Fraction slash */
      case 0xFA: return 0x00A6; /* Broken bar */
      case 0xFB: return 0x02DD; /* Double acute accent */
      case 0xFC: return 0x02D8; /* Breve */
      case 0xFD: return 0x02C7; /* Caron */
      case 0xFE: return 0x02DA; /* Ring above */
      case 0xFF: return 0x02DB; /* Ogonek */
      default: return (0xffff);
      }
}
