Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

631 lines
16 KiB

/******************************Module*Header*******************************\
* Module Name: service.c
*
* set of service routines for converting between ascii and unicode strings
*
* Created: 15-Nov-1990 11:38:31
* Author: Bodin Dresevic [BodinD]
*
* Copyright (c) 1990 Microsoft Corporation
*
\**************************************************************************/
#include "fd.h"
/******************************Public*Routine******************************\
*
* vCpyBeToLeUnicodeString,
*
* convert (c - 1) WCHAR's in big endian format to little endian and
* put a terminating zero at the end of the dest string
*
* History:
* 11-Dec-1991 -by- Bodin Dresevic [BodinD]
* Wrote it.
\**************************************************************************/
VOID vCpyBeToLeUnicodeString(LPWSTR pwcLeDst, LPWSTR pwcBeSrc, ULONG c)
{
LPWSTR pwcBeSrcEnd;
ASSERTDD(c > 0, "vCpyBeToLeUnicodeString: c == 0\n");
for
(
pwcBeSrcEnd = pwcBeSrc + (c - 1);
pwcBeSrc < pwcBeSrcEnd;
pwcBeSrc++, pwcLeDst++
)
{
*pwcLeDst = BE_UINT16(pwcBeSrc);
}
*pwcLeDst = (WCHAR)(UCHAR)'\0';
}
/******************************Public*Routine******************************\
*
* VOID vCvtMacToUnicode
*
* Effects:
*
* Warnings:
*
* History:
* 07-Mar-1992 -by- Bodin Dresevic [BodinD]
* Wrote it.
\**************************************************************************/
VOID vCvtMacToUnicode
(
ULONG ulLangId,
LPWSTR pwcLeDst,
PBYTE pjSrcMac,
ULONG c
)
{
PBYTE pjSrcEnd;
//!!! I believe that LangId should be used to select the proper conversion
//!!! routine, this is a stub [bodind]
ulLangId;
for
(
pjSrcEnd = pjSrcMac + c;
pjSrcMac < pjSrcEnd;
pjSrcMac++, pwcLeDst++
)
{
*pwcLeDst = (WCHAR)(*pjSrcMac);
}
}
/******************************Public*Routine******************************\
*
* VOID vCpyMacToLeUnicodeString
*
*
* Ensures that string is zero terminated so that other cool things can be
* done to it such as wcscpy, wcslen e.t.c.
*
* History:
* 13-Jan-1992 -by- Bodin Dresevic [BodinD]
* Wrote it.
\**************************************************************************/
VOID vCpyMacToLeUnicodeString
(
ULONG ulLangId,
LPWSTR pwcLeDst,
PBYTE pjSrcMac,
ULONG c
)
{
ASSERTDD(c > 0, "vCpyMacToLeUnicodeString: c == 0\n");
c -= 1;
vCvtMacToUnicode (ulLangId, pwcLeDst, pjSrcMac, c);
pwcLeDst[c] = (WCHAR)(UCHAR)'\0';
}
/**************************************************************************\
* The rest of the file is stolen from JeanP's win31 code in fd_mac.c
*
* Conversion routines from Mac character code and Mac langageID to
* Unicode character code and OS2 langage ID
*
* This routines are in a separate segment. The data tables are setup within
* the code segment in order to have the tables discardable. Puting the table
* within a data segment would have been made them preload moveable.
*
* Public routines:
* Unicode2Mac
* Mac2Lang
*
\**************************************************************************/
/*
** Easy case, a Unicode character code is whithin the range [160..255]
** This table gives: Mac = achUnicode2Mac [Unicode].
*/
STATIC BYTE ajUnicodeToMac [96] =
{
202, 193, 162, 163, 219, 180, 124, 164,
172, 169, 187, 199, 194, 45, 168, 248,
161, 177, 0, 0, 171, 181, 166, 225,
252, 0, 188, 200, 0, 0, 0, 192,
203, 231, 229, 204, 128, 129, 174, 130,
233, 131, 230, 232, 237, 234, 235, 236,
0, 132, 241, 238, 239, 205, 133, 0,
175, 244, 242, 243, 134, 0, 0, 167,
136, 135, 137, 139, 138, 140, 190, 141,
143, 142, 144, 145, 147, 146, 148, 149,
0, 150, 152, 151, 153, 155, 154, 214,
191, 157, 156, 158, 159, 0, 0, 216
};
/*
** Bad case, this is to handle Unicode character value beyond 255
**
** To find a Mac chacter code for a char > 255, first scan the first
** table comparing a Unicode code to each entry in the table till
** one entry match.
** The position in the first table is the index into the second table
** to where the mac character code can be found.
*/
STATIC WCHAR awcExtraUnicodeInMac [] =
{
0x2020, 0x2022, 0x2122, 0x192, 0x2026, 0x2013, 0x2014,
0x201c, 0x201d, 0x2018, 0x2019, 0x178, 0x2039, 0x203a,
0x2021, 0x201a, 0x201e, 0x2030, 0x152, 0x153
};
STATIC BYTE ajMacCharExtra [] =
{
160, 165, 170, 196, 201, 208, 209,
210, 211, 212, 213, 217, 220, 221,
224, 226, 227, 228, 206, 207
};
/*
** Converts the OS2 langageID to the to the Mac langage ID
*/
#ifdef JEANP_IS_WRONG
// JEANp screwed up danish and german, else my conversion table is the
// same as mine [bodind]
uint16 aCvLang [32] =
{
0, 12, 0, 0, 0, 0, 0, 7,
14, 0, 6, 13, 1, 10, 0, 15,
3, 11, 21, 4, 9, 0, 8, 0,
0, 0, 18, 0, 0, 5, 22, 17
};
#endif // JEANP_IS_WRONG
uint16 aCvLang [32] =
{
0, // 0 -> 0 (0 -> english == default)
12, // 1 -> 12 (arabic -> arabic)
0, // 2 -> 0 (bulgarian -> english == default)
0, // 3 -> 0 (catalon -> english == default)
0, // 4 -> 0 (Chinese -> english == default)
0, // 5 -> 0 (Czeh -> english == default)
7, // 6 -> 7 (Danish -> Danish)
2, // 7 -> 2 (German -> German)
14, // 8 -> 14 (Greek -> Greek)
0, // 9 -> 0 (English -> english)
6, // a -> 6 (spanish -> spanish)
13, // b -> 13 (finnish -> finnish)
1, // c -> 1 (french -> french)
10, // d -> 10 (hebrew -> hebrew)
0, // e -> 0 (hungarian -> english == default)
15, // f -> 15 (icelandic -> icelandic)
3, // 10 -> 3 (Italian -> italian)
11, // 11 -> 11 (japanese -> japanese)
21, // 12 -> 21 (korean -> hindi, this seems to be a bug?????????)
4, // 13 -> 4 (dutch -> dutch)
9, // 14 -> 9 (norweign -> norweign)
0, // 15 -> 0 (Polish -> english == default)
8, // 16 -> 8 (portugese -> portugese)
0, // 17 -> 0 (rhaeto-romanic -> english == default)
0, // 18 -> 0 (romanian -> english == default)
0, // 19 -> 0 (russian -> english == default)
18, // 1a -> 18 (Yugoslavian -> Yugoslavian), lat or cyr ????
0, // 1b -> 0 (slovakian -> english == default)
0, // 1c -> 0 (albanian -> english == default)
5, // 1d -> 5 (swedish -> swedish)
22, // 1e -> 22 (thai -> thai)
17 // 1f -> 17 (turkish -> turkish)
};
/************************** Public Routine *****************************\
* Unicode2Mac (int ch)
*
* Map a Unicode code point to a Mac code point.
*
* History:
* Fri Dec 08 11:28:35 1990 -by- Jean-Francois Peyroux [jeanp]
* Wrote it.
\***********************************************************************/
uint16 ui16UnicodeToMac (uint16 wc)
{
// easy case Unicode == Mac
if (wc >= 160)
{
// Not to bad 160 <= Unicode < 256, Mac = ajUnicodeToMac [Unicode]
if (wc < 256)
{
wc = ajUnicodeToMac [wc-160];
}
else
{
// Worst case Unicode >=256
register i;
for (i = 0; i < sizeof(ajMacCharExtra) / sizeof(ajMacCharExtra[0]); i++)
{
if (awcExtraUnicodeInMac[i] == (WCHAR) wc)
{
wc = ajMacCharExtra[i];
goto U2M_Exit;
}
}
wc = 127;
}
}
U2M_Exit:
return wc;
}
/************************** Public Routine *****************************\
* Mac2Lang
*
* Converts the OS2 langageID to the to the Mac langage ID
*
* History:
* Fri Dec 08 11:28:35 1990 -by- Jean-Francois Peyroux [jeanp]
* Wrote it.
\***********************************************************************/
uint16 ui16Mac2Lang (uint16 Id)
{
// this is just a way to bail out if an incorrect lang id is passed to
// this routine [bodind]
// Note that Id & 1f < 32 == sizeof(aCvLang)/sizeof(aCvLang[0]), no gp-fault
return aCvLang[Id & 0x1f];
}
//!!! set of runs for the mac us char set.
//!!! We may need the same thing for other mac char sets [bodind]
// This set of ranges is produced from the ifdefed table below.
// where the holes i.e.
// "unicode code points that are not supported in the mac char set"
// consisted of only a few chars, the runs were sawn up together
// to reduce their number. For instance in the range a0-7f about
// 10 scattered chars are really not supported. but that is ok,
// the rasterizer will put put a default char in place.
#define C_RUNS_MAC_ROMAN 29
WCRANGE gawcrgMacRoman[C_RUNS_MAC_ROMAN] =
{
0x0020, 0x007F, // this range is truly contiguous
0x00A0, 0x00FF, // here lying about several small holes
0x0131, 0x0131,
0x0152, 0x0153,
0x0178, 0x0178,
0x0192, 0x0192,
0x02C6, 0x02C7,
0x02D8, 0x02DD,
0x03C0, 0x03C0,
0x2010, 0x2030,
0x2039, 0x203A,
0x2044, 0x2044,
0x2122, 0x2122,
0x2126, 0x2126,
0x2202, 0x2202,
0x2206, 0x2206,
0x220F, 0x220F,
0x2211, 0x2211,
0x221A, 0x221A,
0x221E, 0x221E,
0x222B, 0x222B,
0x2248, 0x2248,
0x2260, 0x2260,
0x2264, 0x2265,
0x2318, 0x2318,
0x25C6, 0x25C6,
0x25CA, 0x25CA,
0x2713, 0x2713,
0xFDFF, 0xFDFF
};
#ifdef UNIC_TO_MAC_PROPER
// "PROPER" stands for not connecting runs to reduce their number
// and increase performance
Unicode Encoding to Macintosh Listing
UNIC ROM NAME
0020 20 SPACE
0021 21 EXCLAMATION MARK
0022 22 QUOTATION MARK
0023 23 NUMBER SIGN
0024 24 DOLLAR SIGN
0025 25 PERCENT SIGN
0026 26 AMPERSAND
0027 27 APOSTROPHE-QUOTE
0028 28 OPENING PARENTHESIS
0029 29 CLOSING PARENTHESIS
002A 2A ASTERISK
002B 2B PLUS SIGN
002C 2C COMMA
002D 2D HYPHEN-MINUS
002E 2E PERIOD
002F 2F SLASH
0030 30 DIGIT ZERO
0031 31 DIGIT ONE
0032 32 DIGIT TWO
0033 33 DIGIT THREE
0034 34 DIGIT FOUR
0035 35 DIGIT FIVE
0036 36 DIGIT SIX
0037 37 DIGIT SEVEN
0038 38 DIGIT EIGHT
0039 39 DIGIT NINE
003A 3A COLON
003B 3B SEMICOLON
003C 3C LESS-THAN SIGN
003D 3D EQUALS SIGN
003E 3E GREATER-THAN SIGN
003F 3F QUESTION MARK
0040 40 COMMERCIAL AT
0041 41 LATIN CAPITAL LETTER A
0042 42 LATIN CAPITAL LETTER B
0043 43 LATIN CAPITAL LETTER C
0044 44 LATIN CAPITAL LETTER D
0045 45 LATIN CAPITAL LETTER E
0046 46 LATIN CAPITAL LETTER F
0047 47 LATIN CAPITAL LETTER G
0048 48 LATIN CAPITAL LETTER H
0049 49 LATIN CAPITAL LETTER I
004A 4A LATIN CAPITAL LETTER J
004B 4B LATIN CAPITAL LETTER K
004C 4C LATIN CAPITAL LETTER L
004D 4D LATIN CAPITAL LETTER M
004E 4E LATIN CAPITAL LETTER N
004F 4F LATIN CAPITAL LETTER O
0050 50 LATIN CAPITAL LETTER P
0051 51 LATIN CAPITAL LETTER Q
0052 52 LATIN CAPITAL LETTER R
0053 53 LATIN CAPITAL LETTER S
0054 54 LATIN CAPITAL LETTER T
0055 55 LATIN CAPITAL LETTER U
0056 56 LATIN CAPITAL LETTER V
0057 57 LATIN CAPITAL LETTER W
0058 58 LATIN CAPITAL LETTER X
0059 59 LATIN CAPITAL LETTER Y
005A 5A LATIN CAPITAL LETTER Z
005B 5B OPENING SQUARE BRACKET
005C 5C BACKSLASH
005D 5D CLOSING SQUARE BRACKET
005E 5E SPACING CIRCUMFLEX
005F 5F SPACING UNDERSCORE
0060 60 SPACING GRAVE
0061 61 LATIN SMALL LETTER A
0062 62 LATIN SMALL LETTER B
0063 63 LATIN SMALL LETTER C
0064 64 LATIN SMALL LETTER D
0065 65 LATIN SMALL LETTER E
0066 66 LATIN SMALL LETTER F
0067 67 LATIN SMALL LETTER G
0068 68 LATIN SMALL LETTER H
0069 69 LATIN SMALL LETTER I
006A 6A LATIN SMALL LETTER J
006B 6B LATIN SMALL LETTER K
006C 6C LATIN SMALL LETTER L
006D 6D LATIN SMALL LETTER M
006E 6E LATIN SMALL LETTER N
006F 6F LATIN SMALL LETTER O
0070 70 LATIN SMALL LETTER P
0071 71 LATIN SMALL LETTER Q
0072 72 LATIN SMALL LETTER R
0073 73 LATIN SMALL LETTER S
0074 74 LATIN SMALL LETTER T
0075 75 LATIN SMALL LETTER U
0076 76 LATIN SMALL LETTER V
0077 77 LATIN SMALL LETTER W
0078 78 LATIN SMALL LETTER X
0079 79 LATIN SMALL LETTER Y
007A 7A LATIN SMALL LETTER Z
007B 7B OPENING CURLY BRACKET
007C 7C VERTICAL BAR
007D 7D CLOSING CURLY BRACKET
007E 7E TILDE
007F 7F DELETE
00A0 CA NON-BREAKING SPACE
00A1 C1 INVERTED EXCLAMATION MARK
00A2 A2 CENT SIGN
00A3 A3 POUND SIGN
00A4 DB CURRENCY SIGN
00A5 B4 YEN SIGN
00A7 A4 SECTION SIGN
00A8 AC SPACING DIAERESIS
00A9 A9 COPYRIGHT SIGN
00AA BB FEMININE ORDINAL INDICATOR
00AB C7 LEFT POINTING GUILLEMET
00AC C2 NOT SIGN
00AE A8 REGISTERED TRADE MARK SIGN
00AF F8 SPACING MACRON
00B0 A1 DEGREE SIGN
00B1 B1 PLUS-OR-MINUS SIGN
00B4 AB SPACING ACUTE
00B5 B5 MICRO SIGN
00B6 A6 PARAGRAPH SIGN
00B7 E1 MIDDLE DOT
00B8 FC SPACING CEDILLA
00BA BC MASCULINE ORDINAL INDICATOR
00BB C8 RIGHT POINTING GUILLEMET
00BF C0 INVERTED QUESTION MARK
00C0 CB LATIN CAPITAL LETTER A GRAVE
00C1 E7 LATIN CAPITAL LETTER A ACUTE
00C2 E5 LATIN CAPITAL LETTER A CIRCUMFLEX
00C3 CC LATIN CAPITAL LETTER A TILDE
00C4 80 LATIN CAPITAL LETTER A DIAERESIS
00C5 81 LATIN CAPITAL LETTER A RING
00C6 AE LATIN CAPITAL LETTER A E
00C7 82 LATIN CAPITAL LETTER C CEDILLA
00C8 E9 LATIN CAPITAL LETTER E GRAVE
00C9 83 LATIN CAPITAL LETTER E ACUTE
00CA E6 LATIN CAPITAL LETTER E CIRCUMFLEX
00CB E8 LATIN CAPITAL LETTER E DIAERESIS
00CC ED LATIN CAPITAL LETTER I GRAVE
00CD EA LATIN CAPITAL LETTER I ACUTE
00CE EB LATIN CAPITAL LETTER I CIRCUMFLEX
00CF EC LATIN CAPITAL LETTER I DIAERESIS
00D1 84 LATIN CAPITAL LETTER N TILDE
00D2 F1 LATIN CAPITAL LETTER O GRAVE
00D3 EE LATIN CAPITAL LETTER O ACUTE
00D4 EF LATIN CAPITAL LETTER O CIRCUMFLEX
00D5 CD LATIN CAPITAL LETTER O TILDE
00D6 85 LATIN CAPITAL LETTER O DIAERESIS
00D8 AF LATIN CAPITAL LETTER O SLASH
00D9 F4 LATIN CAPITAL LETTER U GRAVE
00DA F2 LATIN CAPITAL LETTER U ACUTE
00DB F3 LATIN CAPITAL LETTER U CIRCUMFLEX
00DC 86 LATIN CAPITAL LETTER U DIAERESIS
00DF A7 LATIN SMALL LETTER SHARP S
00E0 88 LATIN SMALL LETTER A GRAVE
00E1 87 LATIN SMALL LETTER A ACUTE
00E2 89 LATIN SMALL LETTER A CIRCUMFLEX
00E3 8B LATIN SMALL LETTER A TILDE
00E4 8A LATIN SMALL LETTER A DIAERESIS
00E5 8C LATIN SMALL LETTER A RING
00E6 BE LATIN SMALL LETTER A E
00E7 8D LATIN SMALL LETTER C CEDILLA
00E8 8F LATIN SMALL LETTER E GRAVE
00E9 8E LATIN SMALL LETTER E ACUTE
00EA 90 LATIN SMALL LETTER E CIRCUMFLEX
00EB 91 LATIN SMALL LETTER E DIAERESIS
00EC 93 LATIN SMALL LETTER I GRAVE
00ED 92 LATIN SMALL LETTER I ACUTE
00EE 94 LATIN SMALL LETTER I CIRCUMFLEX
00EF 95 LATIN SMALL LETTER I DIAERESIS
00F1 96 LATIN SMALL LETTER N TILDE
00F2 98 LATIN SMALL LETTER O GRAVE
00F3 97 LATIN SMALL LETTER O ACUTE
00F4 99 LATIN SMALL LETTER O CIRCUMFLEX
00F5 9B LATIN SMALL LETTER O TILDE
00F6 9A LATIN SMALL LETTER O DIAERESIS
00F7 D6 DIVISION SIGN
00F8 BF LATIN SMALL LETTER O SLASH
00F9 9D LATIN SMALL LETTER U GRAVE
00FA 9C LATIN SMALL LETTER U ACUTE
00FB 9E LATIN SMALL LETTER U CIRCUMFLEX
00FC 9F LATIN SMALL LETTER U DIAERESIS
00FF D8 LATIN SMALL LETTER Y DIAERESIS
0131 F5 LATIN SMALL LETTER DOTLESS I
0152 CE LATIN CAPITAL LETTER O E
0153 CF LATIN SMALL LETTER O E
0178 D9 LATIN CAPITAL LETTER Y DIAERESIS
0192 C4 LATIN SMALL LETTER SCRIPT F
02C6 F6 MODIFIER LETTER CIRCUMFLEX
02C7 FF MODIFIER LETTER HACEK
02D8 F9 SPACING BREVE
02D9 FA SPACING DOT ABOVE
02DA FB SPACING RING ABOVE
02DB FE SPACING OGONEK
02DC F7 SPACING TILDE
02DD FD SPACING DOUBLE ACUTE
03C0 B9 GREEK SMALL LETTER PI
2010 D0 HYPHEN
2011 D0 NON-BREAKING HYPHEN
2012 D0 FIGURE DASH
2013 D0 EN DASH
2014 D1 EM DASH
2018 D4 SINGLE TURNED COMMA QUOTATION MARK
2019 D5 SINGLE COMMA QUOTATION MARK
201A E2 LOW SINGLE COMMA QUOTATION MARK
201C D2 DOUBLE TURNED COMMA QUOTATION MARK
201D D3 DOUBLE COMMA QUOTATION MARK
201E E3 LOW DOUBLE COMMA QUOTATION MARK
2020 A0 DAGGER
2021 E0 DOUBLE DAGGER
2022 A5 BULLET
2026 C9 HORIZONTAL ELLIPSIS
2028 0A LINE SEPARATOR
2029 0D PARAGRAPH SEPARATOR
2030 E4 PER MILLE SIGN
2039 DC LEFT POINTING SINGLE GUILLEMET
203A DD RIGHT POINTING SINGLE GUILLEMET
2044 DA FRACTION SLASH
2122 AA TRADEMARK
2126 BD OHM
2202 B6 PARTIAL DIFFERENTIAL
2206 C6 INCREMENT
220F B8 N-ARY PRODUCT
2211 B7 N-ARY SUMMATION
221A C3 SQUARE ROOT
221E B0 INFINITY
222B BA INTEGRAL
2248 C5 ALMOST EQUAL TO
2260 AD NOT EQUAL TO
2264 B2 LESS THAN OR EQUAL TO
2265 B3 GREATER THAN OR EQUAL TO
2318 11 COMMAND KEY
25C6 13 BLACK DIAMOND
25CA D7 LOZENGE
2713 12 CHECK MARK
FDFF F0 APPLE LOGO
#endif // UNIC_TO_MAC_PROPER