| /* |
| __ __ _ |
| ___\ \/ /_ __ __ _| |_ |
| / _ \\ /| '_ \ / _` | __| |
| | __// \| |_) | (_| | |_ |
| \___/_/\_\ .__/ \__,_|\__| |
| |_| XML parser |
| |
| Copyright (c) 1997-2000 Thai Open Source Software Center Ltd |
| Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> |
| Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> |
| Copyright (c) 2005-2006 Karl Waclawek <karl@waclawek.net> |
| Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org> |
| Copyright (c) 2019 David Loffredo <loffredo@steptools.com> |
| Licensed under the MIT license: |
| |
| Permission is hereby granted, free of charge, to any person obtaining |
| a copy of this software and associated documentation files (the |
| "Software"), to deal in the Software without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Software, and to permit |
| persons to whom the Software is furnished to do so, subject to the |
| following conditions: |
| |
| The above copyright notice and this permission notice shall be included |
| in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
| USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| #include "codepage.h" |
| #include "internal.h" /* for UNUSED_P only */ |
| |
| #if defined(_WIN32) |
| # define STRICT 1 |
| # define WIN32_LEAN_AND_MEAN 1 |
| |
| # include <windows.h> |
| #endif /* defined(_WIN32) */ |
| |
| int |
| codepageMap(int cp, int *map) { |
| #if defined(_WIN32) |
| int i; |
| CPINFO info; |
| if (! GetCPInfo(cp, &info) || info.MaxCharSize > 2) |
| return 0; |
| for (i = 0; i < 256; i++) |
| map[i] = -1; |
| if (info.MaxCharSize > 1) { |
| for (i = 0; i < MAX_LEADBYTES; i += 2) { |
| int j, lim; |
| if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0) |
| break; |
| lim = info.LeadByte[i + 1]; |
| for (j = info.LeadByte[i]; j <= lim; j++) |
| map[j] = -2; |
| } |
| } |
| for (i = 0; i < 256; i++) { |
| if (map[i] == -1) { |
| char c = (char)i; |
| unsigned short n; |
| if (MultiByteToWideChar(cp, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, &c, 1, |
| &n, 1) |
| == 1) |
| map[i] = n; |
| } |
| } |
| return 1; |
| #else |
| UNUSED_P(cp); |
| UNUSED_P(map); |
| return 0; |
| #endif |
| } |
| |
| int |
| codepageConvert(int cp, const char *p) { |
| #if defined(_WIN32) |
| unsigned short c; |
| if (MultiByteToWideChar(cp, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, p, 2, &c, |
| 1) |
| == 1) |
| return c; |
| return -1; |
| #else |
| UNUSED_P(cp); |
| UNUSED_P(p); |
| return -1; |
| #endif |
| } |