summaryrefslogtreecommitdiffstats
path: root/source/modules
diff options
context:
space:
mode:
authorAlexander Bokovoy <ab@samba.org>2003-08-26 19:48:16 +0000
committerAlexander Bokovoy <ab@samba.org>2003-08-26 19:48:16 +0000
commite855dc8c9115fa11d315eb34d57722ff612daa11 (patch)
tree293cfee49c52836aca9e0528dc11a163160c8184 /source/modules
parent5f41cd76b793305e1e9e4da76d58daa2d8438c63 (diff)
downloadsamba-e855dc8c9115fa11d315eb34d57722ff612daa11.tar.gz
samba-e855dc8c9115fa11d315eb34d57722ff612daa11.tar.xz
samba-e855dc8c9115fa11d315eb34d57722ff612daa11.zip
Fix for #150.
We now fallback to Samba-provided CP850 charset module if CP850 or IBM850 does not exist on target system at runtime. 1. Introduce CP850 charset module based on charmaps table from GNU libc 2.2.5 2. Make CP850 charset module shared and build it by default Should fix Solaris run-time
Diffstat (limited to 'source/modules')
-rw-r--r--source/modules/CP850.c414
1 files changed, 414 insertions, 0 deletions
diff --git a/source/modules/CP850.c b/source/modules/CP850.c
new file mode 100644
index 00000000000..a17015ffb6f
--- /dev/null
+++ b/source/modules/CP850.c
@@ -0,0 +1,414 @@
+/*
+ * Conversion table for CP850 charset also known as IBM850.
+ *
+ * Copyright (C) Alexander Bokovoy 2003
+ * Conversion tables are generated using GNU libc 2.2.5's
+ * localedata/charmaps/IBM850 table and iconvdata/gen-8bit-gap.sh script
+ *
+ * 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.
+ */
+
+#include "includes.h"
+
+struct gap
+{
+ uint16 start;
+ uint16 end;
+ int32 idx;
+};
+
+static const uint16 to_ucs2[256] = {
+ [0x01] = 0x0001,
+ [0x02] = 0x0002,
+ [0x03] = 0x0003,
+ [0x04] = 0x0004,
+ [0x05] = 0x0005,
+ [0x06] = 0x0006,
+ [0x07] = 0x0007,
+ [0x08] = 0x0008,
+ [0x09] = 0x0009,
+ [0x0a] = 0x000A,
+ [0x0b] = 0x000B,
+ [0x0c] = 0x000C,
+ [0x0d] = 0x000D,
+ [0x0e] = 0x000E,
+ [0x0f] = 0x000F,
+ [0x10] = 0x0010,
+ [0x11] = 0x0011,
+ [0x12] = 0x0012,
+ [0x13] = 0x0013,
+ [0x14] = 0x0014,
+ [0x15] = 0x0015,
+ [0x16] = 0x0016,
+ [0x17] = 0x0017,
+ [0x18] = 0x0018,
+ [0x19] = 0x0019,
+ [0x1a] = 0x001A,
+ [0x1b] = 0x001B,
+ [0x1c] = 0x001C,
+ [0x1d] = 0x001D,
+ [0x1e] = 0x001E,
+ [0x1f] = 0x001F,
+ [0x20] = 0x0020,
+ [0x21] = 0x0021,
+ [0x22] = 0x0022,
+ [0x23] = 0x0023,
+ [0x24] = 0x0024,
+ [0x25] = 0x0025,
+ [0x26] = 0x0026,
+ [0x27] = 0x0027,
+ [0x28] = 0x0028,
+ [0x29] = 0x0029,
+ [0x2a] = 0x002A,
+ [0x2b] = 0x002B,
+ [0x2c] = 0x002C,
+ [0x2d] = 0x002D,
+ [0x2e] = 0x002E,
+ [0x2f] = 0x002F,
+ [0x30] = 0x0030,
+ [0x31] = 0x0031,
+ [0x32] = 0x0032,
+ [0x33] = 0x0033,
+ [0x34] = 0x0034,
+ [0x35] = 0x0035,
+ [0x36] = 0x0036,
+ [0x37] = 0x0037,
+ [0x38] = 0x0038,
+ [0x39] = 0x0039,
+ [0x3a] = 0x003A,
+ [0x3b] = 0x003B,
+ [0x3c] = 0x003C,
+ [0x3d] = 0x003D,
+ [0x3e] = 0x003E,
+ [0x3f] = 0x003F,
+ [0x40] = 0x0040,
+ [0x41] = 0x0041,
+ [0x42] = 0x0042,
+ [0x43] = 0x0043,
+ [0x44] = 0x0044,
+ [0x45] = 0x0045,
+ [0x46] = 0x0046,
+ [0x47] = 0x0047,
+ [0x48] = 0x0048,
+ [0x49] = 0x0049,
+ [0x4a] = 0x004A,
+ [0x4b] = 0x004B,
+ [0x4c] = 0x004C,
+ [0x4d] = 0x004D,
+ [0x4e] = 0x004E,
+ [0x4f] = 0x004F,
+ [0x50] = 0x0050,
+ [0x51] = 0x0051,
+ [0x52] = 0x0052,
+ [0x53] = 0x0053,
+ [0x54] = 0x0054,
+ [0x55] = 0x0055,
+ [0x56] = 0x0056,
+ [0x57] = 0x0057,
+ [0x58] = 0x0058,
+ [0x59] = 0x0059,
+ [0x5a] = 0x005A,
+ [0x5b] = 0x005B,
+ [0x5c] = 0x005C,
+ [0x5d] = 0x005D,
+ [0x5e] = 0x005E,
+ [0x5f] = 0x005F,
+ [0x60] = 0x0060,
+ [0x61] = 0x0061,
+ [0x62] = 0x0062,
+ [0x63] = 0x0063,
+ [0x64] = 0x0064,
+ [0x65] = 0x0065,
+ [0x66] = 0x0066,
+ [0x67] = 0x0067,
+ [0x68] = 0x0068,
+ [0x69] = 0x0069,
+ [0x6a] = 0x006A,
+ [0x6b] = 0x006B,
+ [0x6c] = 0x006C,
+ [0x6d] = 0x006D,
+ [0x6e] = 0x006E,
+ [0x6f] = 0x006F,
+ [0x70] = 0x0070,
+ [0x71] = 0x0071,
+ [0x72] = 0x0072,
+ [0x73] = 0x0073,
+ [0x74] = 0x0074,
+ [0x75] = 0x0075,
+ [0x76] = 0x0076,
+ [0x77] = 0x0077,
+ [0x78] = 0x0078,
+ [0x79] = 0x0079,
+ [0x7a] = 0x007A,
+ [0x7b] = 0x007B,
+ [0x7c] = 0x007C,
+ [0x7d] = 0x007D,
+ [0x7e] = 0x007E,
+ [0x7f] = 0x007F,
+ [0x80] = 0x00C7,
+ [0x81] = 0x00FC,
+ [0x82] = 0x00E9,
+ [0x83] = 0x00E2,
+ [0x84] = 0x00E4,
+ [0x85] = 0x00E0,
+ [0x86] = 0x00E5,
+ [0x87] = 0x00E7,
+ [0x88] = 0x00EA,
+ [0x89] = 0x00EB,
+ [0x8a] = 0x00E8,
+ [0x8b] = 0x00EF,
+ [0x8c] = 0x00EE,
+ [0x8d] = 0x00EC,
+ [0x8e] = 0x00C4,
+ [0x8f] = 0x00C5,
+ [0x90] = 0x00C9,
+ [0x91] = 0x00E6,
+ [0x92] = 0x00C6,
+ [0x93] = 0x00F4,
+ [0x94] = 0x00F6,
+ [0x95] = 0x00F2,
+ [0x96] = 0x00FB,
+ [0x97] = 0x00F9,
+ [0x98] = 0x00FF,
+ [0x99] = 0x00D6,
+ [0x9a] = 0x00DC,
+ [0x9b] = 0x00F8,
+ [0x9c] = 0x00A3,
+ [0x9d] = 0x00D8,
+ [0x9e] = 0x00D7,
+ [0x9f] = 0x0192,
+ [0xa0] = 0x00E1,
+ [0xa1] = 0x00ED,
+ [0xa2] = 0x00F3,
+ [0xa3] = 0x00FA,
+ [0xa4] = 0x00F1,
+ [0xa5] = 0x00D1,
+ [0xa6] = 0x00AA,
+ [0xa7] = 0x00BA,
+ [0xa8] = 0x00BF,
+ [0xa9] = 0x00AE,
+ [0xaa] = 0x00AC,
+ [0xab] = 0x00BD,
+ [0xac] = 0x00BC,
+ [0xad] = 0x00A1,
+ [0xae] = 0x00AB,
+ [0xaf] = 0x00BB,
+ [0xb0] = 0x2591,
+ [0xb1] = 0x2592,
+ [0xb2] = 0x2593,
+ [0xb3] = 0x2502,
+ [0xb4] = 0x2524,
+ [0xb5] = 0x00C1,
+ [0xb6] = 0x00C2,
+ [0xb7] = 0x00C0,
+ [0xb8] = 0x00A9,
+ [0xb9] = 0x2563,
+ [0xba] = 0x2551,
+ [0xbb] = 0x2557,
+ [0xbc] = 0x255D,
+ [0xbd] = 0x00A2,
+ [0xbe] = 0x00A5,
+ [0xbf] = 0x2510,
+ [0xc0] = 0x2514,
+ [0xc1] = 0x2534,
+ [0xc2] = 0x252C,
+ [0xc3] = 0x251C,
+ [0xc4] = 0x2500,
+ [0xc5] = 0x253C,
+ [0xc6] = 0x00E3,
+ [0xc7] = 0x00C3,
+ [0xc8] = 0x255A,
+ [0xc9] = 0x2554,
+ [0xca] = 0x2569,
+ [0xcb] = 0x2566,
+ [0xcc] = 0x2560,
+ [0xcd] = 0x2550,
+ [0xce] = 0x256C,
+ [0xcf] = 0x00A4,
+ [0xd0] = 0x00F0,
+ [0xd1] = 0x00D0,
+ [0xd2] = 0x00CA,
+ [0xd3] = 0x00CB,
+ [0xd4] = 0x00C8,
+ [0xd5] = 0x0131,
+ [0xd6] = 0x00CD,
+ [0xd7] = 0x00CE,
+ [0xd8] = 0x00CF,
+ [0xd9] = 0x2518,
+ [0xda] = 0x250C,
+ [0xdb] = 0x2588,
+ [0xdc] = 0x2584,
+ [0xdd] = 0x00A6,
+ [0xde] = 0x00CC,
+ [0xdf] = 0x2580,
+ [0xe0] = 0x00D3,
+ [0xe1] = 0x00DF,
+ [0xe2] = 0x00D4,
+ [0xe3] = 0x00D2,
+ [0xe4] = 0x00F5,
+ [0xe5] = 0x00D5,
+ [0xe6] = 0x00B5,
+ [0xe7] = 0x00FE,
+ [0xe8] = 0x00DE,
+ [0xe9] = 0x00DA,
+ [0xea] = 0x00DB,
+ [0xeb] = 0x00D9,
+ [0xec] = 0x00FD,
+ [0xed] = 0x00DD,
+ [0xee] = 0x00AF,
+ [0xef] = 0x00B4,
+ [0xf0] = 0x00AD,
+ [0xf1] = 0x00B1,
+ [0xf2] = 0x2017,
+ [0xf3] = 0x00BE,
+ [0xf4] = 0x00B6,
+ [0xf5] = 0x00A7,
+ [0xf6] = 0x00F7,
+ [0xf7] = 0x00B8,
+ [0xf8] = 0x00B0,
+ [0xf9] = 0x00A8,
+ [0xfa] = 0x00B7,
+ [0xfb] = 0x00B9,
+ [0xfc] = 0x00B3,
+ [0xfd] = 0x00B2,
+ [0xfe] = 0x25A0,
+ [0xff] = 0x00A0,
+};
+
+static const struct gap from_idx[] = {
+ { start: 0x0000, end: 0x007f, idx: 0 },
+ { start: 0x00a0, end: 0x00ff, idx: -32 },
+ { start: 0x0131, end: 0x0131, idx: -81 },
+ { start: 0x0192, end: 0x0192, idx: -177 },
+ { start: 0x2017, end: 0x2017, idx: -7989 },
+ { start: 0x2500, end: 0x2502, idx: -9245 },
+ { start: 0x250c, end: 0x251c, idx: -9254 },
+ { start: 0x2524, end: 0x2524, idx: -9261 },
+ { start: 0x252c, end: 0x252c, idx: -9268 },
+ { start: 0x2534, end: 0x2534, idx: -9275 },
+ { start: 0x253c, end: 0x253c, idx: -9282 },
+ { start: 0x2550, end: 0x256c, idx: -9301 },
+ { start: 0x2580, end: 0x2588, idx: -9320 },
+ { start: 0x2591, end: 0x2593, idx: -9328 },
+ { start: 0x25a0, end: 0x25a0, idx: -9340 },
+ { start: 0xffff, end: 0xffff, idx: 0 }
+};
+static const unsigned char from_ucs2[] = {
+
+ '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
+ '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
+ '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
+ '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f',
+ '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27',
+ '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f',
+ '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37',
+ '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f',
+ '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47',
+ '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f',
+ '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57',
+ '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f',
+ '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67',
+ '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f',
+ '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77',
+ '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f',
+ '\xff', '\xad', '\xbd', '\x9c', '\xcf', '\xbe', '\xdd', '\xf5',
+ '\xf9', '\xb8', '\xa6', '\xae', '\xaa', '\xf0', '\xa9', '\xee',
+ '\xf8', '\xf1', '\xfd', '\xfc', '\xef', '\xe6', '\xf4', '\xfa',
+ '\xf7', '\xfb', '\xa7', '\xaf', '\xac', '\xab', '\xf3', '\xa8',
+ '\xb7', '\xb5', '\xb6', '\xc7', '\x8e', '\x8f', '\x92', '\x80',
+ '\xd4', '\x90', '\xd2', '\xd3', '\xde', '\xd6', '\xd7', '\xd8',
+ '\xd1', '\xa5', '\xe3', '\xe0', '\xe2', '\xe5', '\x99', '\x9e',
+ '\x9d', '\xeb', '\xe9', '\xea', '\x9a', '\xed', '\xe8', '\xe1',
+ '\x85', '\xa0', '\x83', '\xc6', '\x84', '\x86', '\x91', '\x87',
+ '\x8a', '\x82', '\x88', '\x89', '\x8d', '\xa1', '\x8c', '\x8b',
+ '\xd0', '\xa4', '\x95', '\xa2', '\x93', '\xe4', '\x94', '\xf6',
+ '\x9b', '\x97', '\xa3', '\x96', '\x81', '\xec', '\xe7', '\x98',
+ '\xd5', '\x9f', '\xf2', '\xc4', '\x00', '\xb3', '\xda', '\x00',
+ '\x00', '\x00', '\xbf', '\x00', '\x00', '\x00', '\xc0', '\x00',
+ '\x00', '\x00', '\xd9', '\x00', '\x00', '\x00', '\xc3', '\xb4',
+ '\xc2', '\xc1', '\xc5', '\xcd', '\xba', '\x00', '\x00', '\xc9',
+ '\x00', '\x00', '\xbb', '\x00', '\x00', '\xc8', '\x00', '\x00',
+ '\xbc', '\x00', '\x00', '\xcc', '\x00', '\x00', '\xb9', '\x00',
+ '\x00', '\xcb', '\x00', '\x00', '\xca', '\x00', '\x00', '\xce',
+ '\xdf', '\x00', '\x00', '\x00', '\xdc', '\x00', '\x00', '\x00',
+ '\xdb', '\xb0', '\xb1', '\xb2', '\xfe',
+};
+
+
+static size_t cp850_push(void *cd, char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ while (*inbytesleft >= 2 && *outbytesleft >= 1) {
+ int i;
+ int done = 0;
+
+ uint16 ch = SVAL(*inbuf,0);
+
+ for (i=0; from_idx[i].start != 0xffff; i++) {
+ if ((from_idx[i].start <= ch) && (from_idx[i].end >= ch)) {
+ ((unsigned char*)(*outbuf))[0] = from_ucs2[from_idx[i].idx+ch];
+ (*inbytesleft) -= 2;
+ (*outbytesleft) -= 1;
+ (*inbuf) += 2;
+ (*outbuf) += 1;
+ done = 1;
+ break;
+ }
+ }
+ if (!done) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ }
+
+ if (*inbytesleft == 1) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (*inbytesleft > 1) {
+ errno = E2BIG;
+ return -1;
+ }
+
+ return 0;
+}
+
+static size_t cp850_pull(void *cd, char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ while (*inbytesleft >= 1 && *outbytesleft >= 2) {
+ *(uint16*)(*outbuf) = to_ucs2[((unsigned char*)(*inbuf))[0]];
+ (*inbytesleft) -= 1;
+ (*outbytesleft) -= 2;
+ (*inbuf) += 1;
+ (*outbuf) += 2;
+ }
+
+ if (*inbytesleft > 0) {
+ errno = E2BIG;
+ return -1;
+ }
+
+ return 0;
+}
+
+struct charset_functions cp850_functions = {"CP850", cp850_pull, cp850_push};
+
+NTSTATUS charset_cp850_init(void)
+{
+ return smb_register_charset(&cp850_functions);
+}