openbase 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/History.txt +50 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +53 -0
  4. data/README.txt +35 -0
  5. data/Rakefile +126 -0
  6. data/examples/example.rb +37 -0
  7. data/ext/CommAPI.c +643 -0
  8. data/ext/Headers/CommAPI.h +1 -0
  9. data/ext/Headers/NetClient.h +42 -0
  10. data/ext/Headers/NetClientLib.h +41 -0
  11. data/ext/Headers/OB_Memory.h +69 -0
  12. data/ext/Headers/OpenBaseAdmin.h +227 -0
  13. data/ext/Headers/OpenBaseConnection.h +337 -0
  14. data/ext/Headers/OpenBaseEncoding.h +302 -0
  15. data/ext/Headers/OpenBasePrepare.h +1 -0
  16. data/ext/Headers/OpenBaseSupport.h +1 -0
  17. data/ext/Headers/Platform_Carbon_Header.h +5 -0
  18. data/ext/Headers/Platform_Classic_Header.h +6 -0
  19. data/ext/Headers/Platform_Linux.h +4 -0
  20. data/ext/Headers/Platform_Mach_Header.h +4 -0
  21. data/ext/Headers/Platform_Windows.h +3 -0
  22. data/ext/Headers/conversion.h +1 -0
  23. data/ext/Headers/datetime.h +26 -0
  24. data/ext/Headers/longlong.h +46 -0
  25. data/ext/Headers/platform.h +67 -0
  26. data/ext/Headers/stringConversion.h +15 -0
  27. data/ext/NetClient.c +888 -0
  28. data/ext/OpenBaseAdmin.c +1884 -0
  29. data/ext/OpenBaseConnection.c +1841 -0
  30. data/ext/OpenBaseEncoding.c +993 -0
  31. data/ext/OpenBaseEncoding_DOS.c +1 -0
  32. data/ext/OpenBaseEncoding_ISO8859.c +1 -0
  33. data/ext/OpenBaseEncoding_MacOS.c +1 -0
  34. data/ext/OpenBaseEncoding_Windows.c +1150 -0
  35. data/ext/OpenBasePrepare.c +1 -0
  36. data/ext/OpenBaseSupport.c +1 -0
  37. data/ext/conversion.c +1 -0
  38. data/ext/datetime.c +816 -0
  39. data/ext/depend +1 -0
  40. data/ext/extconf.rb +10 -0
  41. data/ext/longlong.c +1 -0
  42. data/ext/openbase.c +980 -0
  43. data/ext/stringConversion.c +169 -0
  44. data/lib/ruby-openbase/version.rb +9 -0
  45. data/scripts/txt2html +67 -0
  46. data/setup.rb +1585 -0
  47. data/test/test_helper.rb +2 -0
  48. data/test/test_openbase.rb +241 -0
  49. data/website/index.html +114 -0
  50. data/website/index.txt +59 -0
  51. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  52. data/website/stylesheets/screen.css +133 -0
  53. data/website/template.rhtml +47 -0
  54. metadata +105 -0
@@ -0,0 +1,993 @@
1
+ /*
2
+ OB_Encoding.c
3
+ OpenBase Unified Client
4
+ �1996-2002 OpenBase International, Ltd.
5
+ All rights reserved
6
+
7
+ Theory of operation:
8
+
9
+ A client side driver often needs to convert character data from the client's
10
+ preferred encoding to the encoding of the database. The SQL 92 language is
11
+ all ASCII, so the client can safely convert all data. Only string literals
12
+ should be affected.
13
+
14
+ To do the conversion, these routines will get the database encoding from
15
+ a connection, then use a global map to do the conversion.
16
+
17
+ Here is a note about how UTF8 works:
18
+
19
+ http://lists.w3.org/Archives/Public/ietf-charsets/2002AprJun/att-0010/01-draft-yergeau-utf8-rev2-00.html
20
+
21
+ The table below summarizes the format of these different octet types.
22
+ The letter x indicates bits available for encoding bits of the character
23
+ number.
24
+
25
+
26
+ Char. number range | UTF-8 octet sequence
27
+ (hexadecimal) | (binary)
28
+ --------------------+---------------------------------------------
29
+ 0000 0000-0000 007F | 0xxxxxxx
30
+ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
31
+ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
32
+
33
+ (these would not be legal in the Unicode Standard, but they happen)
34
+ 0001 0000-001F FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
35
+ 0020 0000-03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
36
+ 0400 0000-7FFF FFFF | 1111110x 10xxxxxx ... 10xxxxxx
37
+
38
+
39
+ Disclaimer:
40
+ -----------
41
+ THIS SOFTWARE IS FURNISHED ON AN "AS-IS" BASIS. OPENBASE MAKES NO WARRANTIES OF
42
+ ANY KIND, EITHER EXPRESS OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
43
+ LIMITATION THE CONDITION, MERCHANTABILITY, OR FITNESS FOR ANY PARTICULAR PURPOSE OF
44
+ THIS SOFTWARE. OPENBASE DOES NOT ASSUME ANY LIABILITY REGARDING USE OF, OR ANY
45
+ DEFECT IN, THIS SOFTWARE. IN NO EVENT SHALL OPENBASE BE LIABLE FOR ANY INDIRECT,
46
+ SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, EVEN IF IT HAS BEEN ADVISED OF THE
47
+ POSSIBILITY OF SUCH DAMAGE.
48
+
49
+ WARNING: MODIFY THIS SOURCE CODE AT YOUR OWN RISK. IF YOU DON'T NEED TO MODIFY THE
50
+ OPENBASE API SOURCE, WE RECOMMEND THAT YOU USE THE COMPILED LIBRARIES.
51
+ */
52
+ #include "platform.h"
53
+
54
+ #ifdef __cplusplus
55
+ extern "C" {
56
+ #endif
57
+
58
+ //================================================================================
59
+ // Includes
60
+ //================================================================================
61
+ #include "OpenBaseEncoding.h"
62
+
63
+ #include <string.h>
64
+ #include <stdlib.h>
65
+
66
+
67
+ //================================================================================
68
+ // Functions
69
+ //================================================================================
70
+
71
+ int unicode_strlen(const unsigned short* string);
72
+ unsigned char map_from_unicode(unsigned short unicode_char, OpenBaseCharacterMap* map);
73
+ unsigned char* ob_encodeUTF8(const unsigned short* unicode, int* size);
74
+ unsigned short* ob_decodeUTF8(const unsigned char* utf8, int* size);
75
+ OpenBaseCharacterMap* ob_getCharacterMap(int map_code);
76
+
77
+
78
+ inline int unicode_strlen(const unsigned short* string)
79
+ {
80
+ int result = 0;
81
+
82
+ if (string != NULL)
83
+ {
84
+ while (*string != 0x0000)
85
+ {
86
+ string++;
87
+ result++;
88
+ }
89
+ }
90
+
91
+ return result;
92
+ }
93
+
94
+ unsigned char map_from_unicode(unsigned short unicode_char, OpenBaseCharacterMap* map)
95
+ {
96
+ char result = 0;
97
+
98
+ if (map != NULL)
99
+ {
100
+ int low = 0;
101
+ int high = 255;
102
+
103
+ result = map->defaultCharacter;
104
+
105
+ // binary search for index that maps to this character
106
+ while (low <= high)
107
+ {
108
+ int mid = (low + high) / 2;
109
+ if (map->mapToEncoding[mid].unicodeCharacter > unicode_char)
110
+ {
111
+ high = mid - 1;
112
+ }
113
+ else if (map->mapToEncoding[mid].unicodeCharacter < unicode_char)
114
+ {
115
+ low = mid + 1;
116
+ }
117
+ else
118
+ {
119
+ low = mid + 1;
120
+ high = mid;
121
+ result = map->mapToEncoding[mid].encodingCharacter;
122
+ }
123
+ }
124
+ }
125
+
126
+ return result;
127
+ }
128
+
129
+ unsigned char* ob_encodeUTF8(const unsigned short* unicode, int* size)
130
+ {
131
+ unsigned char* result = NULL;
132
+ int result_size = 0;
133
+
134
+ // strategy: (1) compute size, (2) do the conversion
135
+
136
+ if ((unicode != NULL) && (size != NULL))
137
+ {
138
+ int i;
139
+
140
+ // compute size
141
+ for (i = 0; i < *size; i++)
142
+ {
143
+ unsigned short curr_unicode = unicode[i];
144
+ if ((curr_unicode >= 0x0000) && (curr_unicode <= 0x007F))
145
+ {
146
+ result_size += 1;
147
+ }
148
+ else if ((curr_unicode >= 0x0080) && (curr_unicode <= 0x07FF))
149
+ {
150
+ result_size += 2;
151
+ }
152
+ else if ((curr_unicode >= 0x0800) && (curr_unicode <= 0xFFFF))
153
+ {
154
+ result_size += 3;
155
+ }
156
+ }
157
+
158
+ // allocate space and do the conversion
159
+ result = (unsigned char*) malloc(result_size);
160
+ if (result != NULL)
161
+ {
162
+ unsigned char* result_ptr = result;
163
+
164
+ for (i = 0; i < *size; i++)
165
+ {
166
+ unsigned short curr_unicode = unicode[i];
167
+ if ((curr_unicode >= 0x0000) && (curr_unicode <= 0x007F))
168
+ {
169
+ result_ptr[0] = curr_unicode;
170
+ result_ptr++;
171
+ }
172
+ else if ((curr_unicode >= 0x0080) && (curr_unicode <= 0x07FF))
173
+ {
174
+ result_ptr[0] = 0xC0 | ((curr_unicode >> 6) & 0x001F);
175
+ result_ptr[1] = 0x80 | (curr_unicode & 0x003F);
176
+ result_ptr += 2;
177
+ }
178
+ else if ((curr_unicode >= 0x0800) && (curr_unicode <= 0xFFFF))
179
+ {
180
+ result_ptr[0] = 0xE0 | ((curr_unicode >> 12) & 0x000F);
181
+ result_ptr[1] = 0x80 | ((curr_unicode >> 6) & 0x003F);
182
+ result_ptr[2] = 0x80 | (curr_unicode & 0x003F);
183
+ result_size += 3;
184
+ }
185
+ }
186
+
187
+ *size = result_size;
188
+ }
189
+ }
190
+
191
+ return result;
192
+ }
193
+
194
+ unsigned short* ob_decodeUTF8(const unsigned char* utf8, int* size)
195
+ {
196
+ unsigned short* result = NULL;
197
+ int result_size = 0;
198
+
199
+ // strategy: (1) compute size, (2) do the conversion
200
+ if ((utf8 != NULL) && (size != NULL))
201
+ {
202
+ int i;
203
+ const unsigned char* utf8_ptr = utf8;
204
+
205
+ // compute size
206
+ for (i = 0; i < *size;)
207
+ {
208
+ unsigned char curr_utf8 = ((unsigned char*) utf8)[i];
209
+
210
+ if ((curr_utf8 & 0x80) == 0)
211
+ {
212
+ result_size += 1;
213
+ i += 1;
214
+ }
215
+ else if ((curr_utf8 & 0xE0) == 0xC0)
216
+ {
217
+ result_size += 1;
218
+ i += 2;
219
+ }
220
+ else if ((curr_utf8 & 0xF0) == 0xE0)
221
+ {
222
+ result_size += 1;
223
+ i += 3;
224
+ }
225
+ else if ((curr_utf8 & 0xF8) == 0xF0)
226
+ {
227
+ result_size += 1;
228
+ i += 4;
229
+ }
230
+ else if ((curr_utf8 & 0xFC) == 0xF8)
231
+ {
232
+ result_size += 1;
233
+ i += 5;
234
+ }
235
+ else if ((curr_utf8 & 0xFE) == 0xFC)
236
+ {
237
+ result_size += 1;
238
+ i += 6;
239
+ }
240
+ else
241
+ {
242
+ // error condition! eat a character
243
+ result_size += 0;
244
+ i += 1;
245
+ }
246
+ }
247
+
248
+ result = (unsigned short*) malloc(2 * result_size);
249
+ if (result != NULL)
250
+ {
251
+ unsigned short* result_ptr = result;
252
+
253
+ for (i = 0; i < *size;)
254
+ {
255
+ unsigned char curr_utf8 = ((unsigned char*) utf8)[i];
256
+
257
+ if ((curr_utf8 & 0x80) == 0)
258
+ {
259
+ *result_ptr = curr_utf8;
260
+ result_ptr++;
261
+ i += 1;
262
+ }
263
+ else if ((curr_utf8 & 0xE0) == 0xC0)
264
+ {
265
+ unsigned short curr_utf8_0 = ((unsigned char*) utf8)[i];
266
+ unsigned short curr_utf8_1 = ((unsigned char*) utf8)[i+1];
267
+
268
+ *result_ptr = ((curr_utf8_0 & 0x001F) << 6) +
269
+ (curr_utf8_1 & 0x003F);
270
+ result_ptr++;
271
+ i += 2;
272
+ }
273
+ else if ((curr_utf8 & 0xF0) == 0xE0)
274
+ {
275
+ unsigned short curr_utf8_0 = ((unsigned char*) utf8)[i];
276
+ unsigned short curr_utf8_1 = ((unsigned char*) utf8)[i+1];
277
+ unsigned short curr_utf8_2 = ((unsigned char*) utf8)[i+2];
278
+
279
+ *result_ptr = ((curr_utf8_0 & 0x001F) << 12) +
280
+ ((curr_utf8_1 & 0x003F) << 6) +
281
+ (curr_utf8_2 & 0x003F);
282
+ result_ptr++;
283
+ i += 3;
284
+ }
285
+ else if ((curr_utf8 & 0xF8) == 0xF0)
286
+ {
287
+ *result_ptr = '?';
288
+ result_ptr++;
289
+ i += 4;
290
+ }
291
+ else if ((curr_utf8 & 0xFC) == 0xF8)
292
+ {
293
+ *result_ptr = '?';
294
+ result_ptr++;
295
+ i += 5;
296
+ }
297
+ else if ((curr_utf8 & 0xFE) == 0xFC)
298
+ {
299
+ *result_ptr = '?';
300
+ result_ptr++;
301
+ i += 6;
302
+ }
303
+ else
304
+ {
305
+ // error condition!
306
+ i += 1;
307
+ }
308
+ }
309
+
310
+ *size = result_size * 2;
311
+ }
312
+ }
313
+
314
+ return result;
315
+ }
316
+
317
+
318
+ //void dodo ();
319
+ //extern int xyz;
320
+
321
+
322
+ OpenBaseCharacterMap* ob_getCharacterMap(int map_code)
323
+ {
324
+ OpenBaseCharacterMap* result = NULL;
325
+
326
+ switch (map_code)
327
+ {
328
+ case OB_ENCODING_ASCII:
329
+ // use latin1 and strip off characters > 127
330
+ result = &kOpenBaseCharacterMap_ISO8859_1;
331
+ //xyz ++;
332
+ //dodo ();
333
+ break;
334
+
335
+ // ISO 8859 encodings
336
+ case OB_ENCODING_ISO8859_1:
337
+ result = &kOpenBaseCharacterMap_ISO8859_1;
338
+ break;
339
+ case OB_ENCODING_ISO8859_2:
340
+ result = &kOpenBaseCharacterMap_ISO8859_2;
341
+ break;
342
+ case OB_ENCODING_ISO8859_3:
343
+ result = &kOpenBaseCharacterMap_ISO8859_3;
344
+ break;
345
+ case OB_ENCODING_ISO8859_4:
346
+ result = &kOpenBaseCharacterMap_ISO8859_4;
347
+ break;
348
+ case OB_ENCODING_ISO8859_5:
349
+ result = &kOpenBaseCharacterMap_ISO8859_5;
350
+ break;
351
+ case OB_ENCODING_ISO8859_6:
352
+ result = &kOpenBaseCharacterMap_ISO8859_6;
353
+ break;
354
+ case OB_ENCODING_ISO8859_7:
355
+ result = &kOpenBaseCharacterMap_ISO8859_7;
356
+ break;
357
+ case OB_ENCODING_ISO8859_8:
358
+ result = &kOpenBaseCharacterMap_ISO8859_8;
359
+ break;
360
+ case OB_ENCODING_ISO8859_9:
361
+ result = &kOpenBaseCharacterMap_ISO8859_9;
362
+ break;
363
+ case OB_ENCODING_ISO8859_10:
364
+ result = &kOpenBaseCharacterMap_ISO8859_10;
365
+ break;
366
+ case OB_ENCODING_ISO8859_13:
367
+ result = &kOpenBaseCharacterMap_ISO8859_13;
368
+ break;
369
+ case OB_ENCODING_ISO8859_14:
370
+ result = &kOpenBaseCharacterMap_ISO8859_14;
371
+ break;
372
+ case OB_ENCODING_ISO8859_15:
373
+ result = &kOpenBaseCharacterMap_ISO8859_15;
374
+ break;
375
+ case OB_ENCODING_ISO8859_16:
376
+ result = &kOpenBaseCharacterMap_ISO8859_16;
377
+ break;
378
+
379
+ // Japanese encodings
380
+ case OB_ENCODING_ISO2022JP:
381
+ result = NULL;
382
+ break;
383
+ case OB_ENCODING_EUC:
384
+ result = NULL;
385
+ break;
386
+ case OB_ENCODING_SHIFTJIS:
387
+ result = NULL;
388
+ break;
389
+
390
+ // Mac OS Encodings
391
+ case OB_ENCODING_MACOS_ROMAN:
392
+ result = &kOpenBaseCharacterMap_MacOS_Roman;
393
+ break;
394
+ case OB_ENCODING_MACOS_ARABIC:
395
+ result = &kOpenBaseCharacterMap_MacOS_Arabic;
396
+ break;
397
+ case OB_ENCODING_MACOS_CENTEURO:
398
+ result = &kOpenBaseCharacterMap_MacOS_CentEuro;
399
+ break;
400
+ case OB_ENCODING_MACOS_CORPCHAR:
401
+ result = &kOpenBaseCharacterMap_MacOS_CorpChar;
402
+ break;
403
+ case OB_ENCODING_MACOS_CROATIAN:
404
+ result = &kOpenBaseCharacterMap_MacOS_Croatian;
405
+ break;
406
+ case OB_ENCODING_MACOS_CYRILLIC:
407
+ result = &kOpenBaseCharacterMap_MacOS_Cyrillic;
408
+ break;
409
+ case OB_ENCODING_MACOS_DEVANAGA:
410
+ result = &kOpenBaseCharacterMap_MacOS_Devanaga;
411
+ break;
412
+ case OB_ENCODING_MACOS_DINGBATS:
413
+ result = &kOpenBaseCharacterMap_MacOS_Dingbats;
414
+ break;
415
+ case OB_ENCODING_MACOS_FARSI:
416
+ result = &kOpenBaseCharacterMap_MacOS_Farsi;
417
+ break;
418
+ case OB_ENCODING_MACOS_GREEK:
419
+ result = &kOpenBaseCharacterMap_MacOS_Greek;
420
+ break;
421
+ case OB_ENCODING_MACOS_GUJARATI:
422
+ result = &kOpenBaseCharacterMap_MacOS_Gujarati;
423
+ break;
424
+ case OB_ENCODING_MACOS_GURMUKHI:
425
+ result = &kOpenBaseCharacterMap_MacOS_Gurmukhi;
426
+ break;
427
+ case OB_ENCODING_MACOS_HEBREW:
428
+ result = &kOpenBaseCharacterMap_MacOS_Hebrew;
429
+ break;
430
+ case OB_ENCODING_MACOS_ICELAND:
431
+ result = &kOpenBaseCharacterMap_MacOS_Iceland;
432
+ break;
433
+ case OB_ENCODING_MACOS_ROMANIAN:
434
+ result = &kOpenBaseCharacterMap_MacOS_Romanian;
435
+ break;
436
+ case OB_ENCODING_MACOS_SYMBOL:
437
+ result = &kOpenBaseCharacterMap_MacOS_Symbol;
438
+ break;
439
+ case OB_ENCODING_MACOS_THAI:
440
+ result = &kOpenBaseCharacterMap_MacOS_Thai;
441
+ break;
442
+ case OB_ENCODING_MACOS_TURKISH:
443
+ result = &kOpenBaseCharacterMap_MacOS_Turkish;
444
+ break;
445
+ case OB_ENCODING_MACOS_UKRAINE:
446
+ result = &kOpenBaseCharacterMap_MacOS_Ukraine;
447
+ break;
448
+
449
+ // DOS encodings
450
+ case OB_ENCODING_DOS_CP437_LATINUS:
451
+ result = &kOpenBaseCharacterMap_DOS_CP437_LatinUS;
452
+ break;
453
+ case OB_ENCODING_DOS_CP737_GREEK:
454
+ result = &kOpenBaseCharacterMap_DOS_CP737_Greek;
455
+ break;
456
+ case OB_ENCODING_DOS_CP775_BALTRIM:
457
+ result = &kOpenBaseCharacterMap_DOS_CP775_BaltRim;
458
+ break;
459
+ case OB_ENCODING_DOS_CP850_LATIN1:
460
+ result = &kOpenBaseCharacterMap_DOS_CP850_Latin1;
461
+ break;
462
+ case OB_ENCODING_DOS_CP852_LATIN2:
463
+ result = &kOpenBaseCharacterMap_DOS_CP852_Latin2;
464
+ break;
465
+ case OB_ENCODING_DOS_CP855_CYRILLIC:
466
+ result = &kOpenBaseCharacterMap_DOS_CP855_Cyrillic;
467
+ break;
468
+ case OB_ENCODING_DOS_CP857_TURKISH:
469
+ result = &kOpenBaseCharacterMap_DOS_CP857_Turkish;
470
+ break;
471
+ case OB_ENCODING_DOS_CP860_PORTUGUESE:
472
+ result = &kOpenBaseCharacterMap_DOS_CP860_Portuguese;
473
+ break;
474
+ case OB_ENCODING_DOS_CP861_ICELANDIC:
475
+ result = &kOpenBaseCharacterMap_DOS_CP861_Icelandic;
476
+ break;
477
+ case OB_ENCODING_DOS_CP862_HEBREW:
478
+ result = &kOpenBaseCharacterMap_DOS_CP862_Hebrew;
479
+ break;
480
+ case OB_ENCODING_DOS_CP863_CANADAF:
481
+ result = &kOpenBaseCharacterMap_DOS_CP863_CanadaF;
482
+ break;
483
+ case OB_ENCODING_DOS_CP864_ARABIC:
484
+ result = &kOpenBaseCharacterMap_DOS_CP864_Arabic;
485
+ break;
486
+ case OB_ENCODING_DOS_CP865_NORDIC:
487
+ result = &kOpenBaseCharacterMap_DOS_CP865_Nordic;
488
+ break;
489
+ case OB_ENCODING_DOS_CP866_CYRILLICRUSSIAN:
490
+ result = &kOpenBaseCharacterMap_DOS_CP866_CyrillicRussian;
491
+ break;
492
+ case OB_ENCODING_DOS_CP869_GREEK2:
493
+ result = &kOpenBaseCharacterMap_DOS_CP869_Greek2;
494
+ break;
495
+ case OB_ENCODING_DOS_CP874_THAI:
496
+ result = &kOpenBaseCharacterMap_DOS_CP874_Thai;
497
+ break;
498
+
499
+ // Windows encodings
500
+ case OB_ENCODING_WIN_CP874_THAI:
501
+ result = &kOpenBaseCharacterMap_Win_CP874_Thai;
502
+ break;
503
+
504
+ case OB_ENCODING_WIN_CP1250_LATIN2:
505
+ result = &kOpenBaseCharacterMap_Win_CP1250_Latin2;
506
+ break;
507
+
508
+ case OB_ENCODING_WIN_CP1251_CYRILLIC:
509
+ result = &kOpenBaseCharacterMap_Win_CP1251_Cyrillic;
510
+ break;
511
+
512
+ case OB_ENCODING_WIN_CP1252_LATIN1:
513
+ result = &kOpenBaseCharacterMap_Win_CP1252_Latin1;
514
+ break;
515
+
516
+ case OB_ENCODING_WIN_CP1253_GREEK:
517
+ result = &kOpenBaseCharacterMap_Win_CP1253_Greek;
518
+ break;
519
+
520
+ case OB_ENCODING_WIN_CP1254_TURKISH:
521
+ result = &kOpenBaseCharacterMap_Win_CP1254_Turkish;
522
+ break;
523
+
524
+ case OB_ENCODING_WIN_CP1255_HEBREW:
525
+ result = &kOpenBaseCharacterMap_Win_CP1255_Hebrew;
526
+ break;
527
+
528
+ case OB_ENCODING_WIN_CP1256_ARABIC:
529
+ result = &kOpenBaseCharacterMap_Win_CP1256_Arabic;
530
+ break;
531
+
532
+ case OB_ENCODING_WIN_CP1257_BALTRIM:
533
+ result = &kOpenBaseCharacterMap_Win_CP1257_BaltRim;
534
+ break;
535
+
536
+ case OB_ENCODING_WIN_CP1258_VIETNAMESE:
537
+ result = &kOpenBaseCharacterMap_Win_CP1258_Vietnamese;
538
+ break;
539
+
540
+
541
+ // NeXT encodings
542
+ case OB_ENCODING_NEXT:
543
+ result = &kOpenBaseCharacterMap_NeXT;
544
+ break;
545
+
546
+ }
547
+
548
+ return result;
549
+ }
550
+
551
+ const char* ob_getEncodingName(int encoding)
552
+ {
553
+ const char* result = NULL;
554
+
555
+ switch (encoding)
556
+ {
557
+ case OB_ENCODING_ASCII: result = "ASCII"; break;
558
+ case OB_ENCODING_UTF8: result = "UTF8"; break;
559
+ case OB_ENCODING_UNICODE: result = "Unicode (2 byte)"; break;
560
+
561
+ case OB_ENCODING_ISO8859_1: result = "ISO 8859-1 (Latin 1)"; break;
562
+ case OB_ENCODING_ISO8859_2: result = "ISO 8859-2 (Latin 2)"; break;
563
+ case OB_ENCODING_ISO8859_3: result = "ISO 8859-3 (Latin 3)"; break;
564
+ case OB_ENCODING_ISO8859_4: result = "ISO 8859-4 (Latin 4)"; break;
565
+ case OB_ENCODING_ISO8859_5: result = "ISO 8859-5 (Latin/Cyrillic)"; break;
566
+ case OB_ENCODING_ISO8859_6: result = "ISO 8859-6 (Arabic)"; break;
567
+ case OB_ENCODING_ISO8859_7: result = "ISO 8859-7 (Latin/Greek)"; break;
568
+ case OB_ENCODING_ISO8859_8: result = "ISO 8859-8 (Latin/Hebrew)"; break;
569
+ case OB_ENCODING_ISO8859_9: result = "ISO 8859-9 (Latin 5 - Turkish)"; break;
570
+ case OB_ENCODING_ISO8859_10: result = "ISO 8859-10 (Latin 6 - Nordic)"; break;
571
+ case OB_ENCODING_ISO8859_13: result = "ISO 8859-13 (Latin 7 - Baltic Rim)"; break;
572
+ case OB_ENCODING_ISO8859_14: result = "ISO 8859-14 (Latin 8 - Sami)"; break;
573
+ case OB_ENCODING_ISO8859_15: result = "ISO 8859-15 (Latin 9)"; break;
574
+ case OB_ENCODING_ISO8859_16: result = "ISO 8859-16 (Latin 10)"; break;
575
+
576
+ case OB_ENCODING_ISO2022JP: result = "ISO2022JP"; break;
577
+ case OB_ENCODING_EUC: result = "EUC"; break;
578
+ case OB_ENCODING_SHIFTJIS: result = "SHIFTJIS"; break;
579
+
580
+ case OB_ENCODING_MACOS_ROMAN: result = "Mac OS Roman"; break;
581
+ case OB_ENCODING_MACOS_ARABIC: result = "Mac OS Arabic"; break;
582
+ case OB_ENCODING_MACOS_CENTEURO: result = "Mac OS CentEuro"; break;
583
+ case OB_ENCODING_MACOS_CORPCHAR: result = "Mac OS CorpChar"; break;
584
+ case OB_ENCODING_MACOS_CROATIAN: result = "Mac OS Croatian"; break;
585
+ case OB_ENCODING_MACOS_CYRILLIC: result = "Mac OS Cyrillic"; break;
586
+ case OB_ENCODING_MACOS_DEVANAGA: result = "Mac OS Devanaga"; break;
587
+ case OB_ENCODING_MACOS_DINGBATS: result = "Mac OS Dingbats"; break;
588
+ case OB_ENCODING_MACOS_FARSI: result = "Mac OS Farsi"; break;
589
+ case OB_ENCODING_MACOS_GREEK: result = "Mac OS Greek"; break;
590
+ case OB_ENCODING_MACOS_GUJARATI: result = "Mac OS Gujarati"; break;
591
+ case OB_ENCODING_MACOS_GURMUKHI: result = "Mac OS Gurmukhi"; break;
592
+ case OB_ENCODING_MACOS_HEBREW: result = "Mac OS Hebrew"; break;
593
+ case OB_ENCODING_MACOS_ICELAND: result = "Mac OS Iceland"; break;
594
+ case OB_ENCODING_MACOS_ROMANIAN: result = "Mac OS Romanian"; break;
595
+ case OB_ENCODING_MACOS_SYMBOL: result = "Mac OS Symbol"; break;
596
+ case OB_ENCODING_MACOS_THAI: result = "Mac OS Thai"; break;
597
+ case OB_ENCODING_MACOS_TURKISH: result = "Mac OS Turkish"; break;
598
+ case OB_ENCODING_MACOS_UKRAINE: result = "Mac OS Ukraine"; break;
599
+
600
+
601
+ case OB_ENCODING_DOS_CP437_LATINUS: result = "DOS Latin US"; break;
602
+ case OB_ENCODING_DOS_CP737_GREEK: result = "DOS Greek"; break;
603
+ case OB_ENCODING_DOS_CP775_BALTRIM: result = "DOS Baltic Rim"; break;
604
+ case OB_ENCODING_DOS_CP850_LATIN1: result = "DOS Latin 2"; break;
605
+ case OB_ENCODING_DOS_CP852_LATIN2: result = "DOS Latin 1"; break;
606
+ case OB_ENCODING_DOS_CP855_CYRILLIC: result = "DOS Cyrillic"; break;
607
+ case OB_ENCODING_DOS_CP857_TURKISH: result = "DOS Turkish"; break;
608
+ case OB_ENCODING_DOS_CP860_PORTUGUESE: result = "DOS Portuguese"; break;
609
+ case OB_ENCODING_DOS_CP861_ICELANDIC: result = "DOS Icelandic"; break;
610
+ case OB_ENCODING_DOS_CP862_HEBREW: result = "DOS Hebrew"; break;
611
+ case OB_ENCODING_DOS_CP863_CANADAF: result = "DOS French Canadian"; break;
612
+ case OB_ENCODING_DOS_CP864_ARABIC: result = "DOS Arabic"; break;
613
+ case OB_ENCODING_DOS_CP865_NORDIC: result = "DOS Nordic"; break;
614
+ case OB_ENCODING_DOS_CP866_CYRILLICRUSSIAN: result = "DOS Cyrillic Russian"; break;
615
+ case OB_ENCODING_DOS_CP869_GREEK2: result = "DOS Greek 2"; break;
616
+ case OB_ENCODING_DOS_CP874_THAI: result = "DOS Thai"; break;
617
+
618
+ case OB_ENCODING_NEXT: result = "NeXT"; break;
619
+
620
+ default: result = "Unknown"; break;
621
+ }
622
+
623
+ return result;
624
+ }
625
+
626
+ /*
627
+ #define DEBUG
628
+ #ifdef DEBUG
629
+ #include <stdio.h>
630
+ extern void out ( const char* label, const char* msg );
631
+ #endif
632
+ */
633
+
634
+
635
+ // if you need to do conversions of your own, this is exposed
636
+ // caller owns result, must free()
637
+ unsigned char* ob_convertCharacters(int from_code, int to_code, const unsigned char* source, int* size)
638
+ {
639
+ unsigned char* result = NULL;
640
+ unsigned short* unicode = NULL;
641
+ int source_size;
642
+ int unicode_size = 0;
643
+ int result_size = 0;
644
+
645
+ #ifdef DEBUG
646
+ char s[1000];
647
+ sprintf ( s, "ob_convertCharacters from encoding %d to %d size %d", from_code, to_code, *size );
648
+ out ( "", s );
649
+ #endif
650
+
651
+ // out ( "convert", "1" );
652
+
653
+ if (from_code == to_code || from_code == OB_ENCODING_UNKNOWN || to_code == OB_ENCODING_UNKNOWN )
654
+ {
655
+ // out ( "convert", "2" );
656
+ // make a copy of the indicated number of bytes
657
+ if (source != NULL)
658
+ {
659
+ if (size != NULL)
660
+ {
661
+ source_size = *size;
662
+ result_size = source_size;
663
+ }
664
+ else
665
+ {
666
+ if (from_code == OB_ENCODING_UNICODE)
667
+ {
668
+ source_size = unicode_strlen((const unsigned short*) source) + 1;
669
+ result_size = 2 * source_size;
670
+ }
671
+ else
672
+ {
673
+ source_size = strlen((const char*) source) + 1;
674
+ result_size = source_size;
675
+ }
676
+ }
677
+
678
+ result = (unsigned char*) malloc(result_size);
679
+ if (result != NULL)
680
+ {
681
+ memcpy(result, source, result_size);
682
+ }
683
+ }
684
+ }
685
+ else
686
+ {
687
+ // out ( "convert", "3" );
688
+
689
+ // first convert to unicode
690
+ if (source != NULL)
691
+ {
692
+ if (size != NULL)
693
+ {
694
+ source_size = *size;
695
+ }
696
+ else
697
+ {
698
+ if (from_code == OB_ENCODING_UNICODE)
699
+ {
700
+ source_size = unicode_strlen((const unsigned short*) source) + 1;
701
+ }
702
+ else
703
+ {
704
+ source_size = strlen((const char*) source) + 1;
705
+ }
706
+ }
707
+
708
+ // out ( "convert", "4" );
709
+
710
+ if (from_code == OB_ENCODING_UNICODE)
711
+ {
712
+ // do nothing
713
+ unicode_size = 2 * source_size;
714
+ unicode = (unsigned short*) source;
715
+ }
716
+ else if (from_code == OB_ENCODING_UTF8)
717
+ {
718
+ // out ( "convert", "5" );
719
+ unicode_size = source_size;
720
+ unicode = ob_decodeUTF8(source, &unicode_size);
721
+ }
722
+ else
723
+ {
724
+ // out ( "convert", "6" );
725
+ OpenBaseCharacterMap* map = ob_getCharacterMap(from_code);
726
+ if (map != NULL)
727
+ {
728
+ unicode_size = 2 * source_size;
729
+ unicode = (unsigned short*) malloc(unicode_size);
730
+ if (unicode != NULL)
731
+ {
732
+ int i = 0;
733
+ while (i < source_size)
734
+ {
735
+ // out ( "convert", "7" );
736
+ unicode[i] = map->mapToUnicode[source[i]];
737
+ i++;
738
+ }
739
+ }
740
+ }
741
+ }
742
+ }
743
+ // out ( "convert", "8" );
744
+
745
+ // now convert to to_code
746
+ if (unicode != NULL)
747
+ {
748
+ if (to_code == OB_ENCODING_UNICODE)
749
+ {
750
+ result_size = unicode_size;
751
+ result = (unsigned char*) unicode;
752
+ }
753
+ else if (to_code == OB_ENCODING_UTF8)
754
+ {
755
+ // compress UTF8
756
+ // out ( "convert", "9" );
757
+ result_size = unicode_size / 2;
758
+ result = ob_encodeUTF8(unicode, &result_size);
759
+ free(unicode);
760
+ }
761
+ else
762
+ {
763
+ // out ( "convert", "10" );
764
+ OpenBaseCharacterMap* map = ob_getCharacterMap(to_code);
765
+ // out ( "convert", "11" );
766
+ if (map != NULL)
767
+ {
768
+
769
+ // out ( "convert", "12" );
770
+
771
+ char z[100];
772
+ sprintf ( z, "%d", unicode_size );
773
+ // out ( "unicode_size", z );
774
+
775
+ result_size = unicode_size / 2;
776
+ result = (unsigned char*) malloc(result_size);
777
+ // out ( "convert", "12.1" );
778
+ if (result != NULL)
779
+ {
780
+ // out ( "convert", "13" );
781
+ int i = 0;
782
+ while (i < result_size)
783
+ {
784
+ // out ( "convert", "13.1" );
785
+ // binary search the map for the character
786
+ result[i] = map_from_unicode(unicode[i], map);
787
+ i++;
788
+ }
789
+ // out ( "convert", "14" );
790
+
791
+ // ASCII should be restricted to characters 0-127
792
+ // Do this by hand since a mapping doesn't make complete sense
793
+ // and it can use the Latin1 mapping to get halfway there.
794
+ if (to_code == OB_ENCODING_ASCII)
795
+ {
796
+ // out ( "convert", "14.1" );
797
+ for (i = 0; i < result_size; i++)
798
+ {
799
+ if (((unsigned char) result[i]) > 127)
800
+ {
801
+ result[i] = '?';
802
+ }
803
+ }
804
+ }
805
+ }
806
+ else {
807
+ //out ("","malloc failure");
808
+ }
809
+ }
810
+ // out ( "convert", "15" );
811
+ free(unicode);
812
+ // out ( "convert", "15.1" );
813
+ }
814
+ }
815
+
816
+ // out ( "convert", "16" );
817
+ if (size != NULL)
818
+ {
819
+ // out ( "convert", "17" );
820
+ *size = (result != NULL) ? result_size : 0;
821
+ }
822
+ }
823
+ // out ( "convert", "18" );
824
+
825
+ return result;
826
+ }
827
+
828
+ // call this on SQL statements before sending to server
829
+ // caller owns result, must free()
830
+ /*
831
+ unsigned char* ob_convertSQLStatement(OB_Connection* connection, const unsigned char* source, int* size)
832
+ {
833
+ unsigned char* result = NULL;
834
+ int database_encoding = -1;
835
+ int client_encoding = -1;
836
+
837
+ if (connection != NULL)
838
+ {
839
+ database_encoding = ob_databaseEncoding(connection);
840
+ client_encoding = ob_clientEncoding(connection);
841
+ result = ob_convertCharacters(client_encoding, database_encoding, source, size);
842
+ }
843
+
844
+ return result;
845
+ }
846
+
847
+ // call this on character results restured from server
848
+ // caller owns result, must free()
849
+ unsigned char* ob_convertResult(OB_Connection* connection, const unsigned char* source, int* size)
850
+ {
851
+ unsigned char* result = NULL;
852
+ int database_encoding = -1;
853
+ int client_encoding = -1;
854
+
855
+ if (connection != NULL)
856
+ {
857
+ database_encoding = ob_databaseEncoding(connection);
858
+ client_encoding = ob_clientEncoding(connection);
859
+ result = ob_convertCharacters(database_encoding, client_encoding, source, size);
860
+ }
861
+
862
+ return result;
863
+ }
864
+
865
+ */
866
+
867
+ //================================================================================
868
+ // Character Maps
869
+ //================================================================================
870
+
871
+ #pragma mark -
872
+
873
+
874
+ OpenBaseCharacterMap kOpenBaseCharacterMap_ISO2022JP;
875
+ OpenBaseCharacterMap kOpenBaseCharacterMap_EUC;
876
+ OpenBaseCharacterMap kOpenBaseCharacterMap_SHIFTJIS;
877
+
878
+ #pragma mark kOpenBaseCharacterMap_NeXT
879
+ OpenBaseCharacterMap kOpenBaseCharacterMap_NeXT =
880
+ {
881
+ // _fMapToUnicode
882
+ {
883
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
884
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
885
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
886
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
887
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
888
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
889
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
890
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
891
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
892
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
893
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
894
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
895
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
896
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
897
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
898
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
899
+ 0x00A0, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7,
900
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
901
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D9,
902
+ 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00B5, 0x00D7, 0x00F7,
903
+ 0x00A9, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x00A5, 0x0192, 0x00A7,
904
+ 0x00A4, 0x2019, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02,
905
+ 0x00AE, 0x2013, 0x2020, 0x2021, 0x00B7, 0x00A6, 0x00B6, 0x2022,
906
+ 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00AC, 0x00BF,
907
+ 0x00B9, 0x02CB, 0x00B4, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9,
908
+ 0x00A8, 0x00B2, 0x02DA, 0x00B8, 0x00B3, 0x02DD, 0x02DB, 0x02C7,
909
+ 0x2014, 0x00B1, 0x00BC, 0x00BD, 0x00BE, 0x00E0, 0x00E1, 0x00E2,
910
+ 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB,
911
+ 0x00EC, 0x00C6, 0x00ED, 0x00AA, 0x00EE, 0x00EF, 0x00F0, 0x00F1,
912
+ 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00F2, 0x00F3, 0x00F4, 0x00F5,
913
+ 0x00F6, 0x00E6, 0x00F9, 0x00FA, 0x00FB, 0x0131, 0x00FC, 0x00FD,
914
+ 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x00FF, 0xFFFD, 0xFFFD
915
+ },
916
+
917
+ // mapFromUnicode
918
+ {
919
+ { 0x0000, 0x0000 }, { 0x0001, 0x0001 }, { 0x0002, 0x0002 }, { 0x0003, 0x0003 },
920
+ { 0x0004, 0x0004 }, { 0x0005, 0x0005 }, { 0x0006, 0x0006 }, { 0x0007, 0x0007 },
921
+ { 0x0008, 0x0008 }, { 0x0009, 0x0009 }, { 0x000A, 0x000A }, { 0x000B, 0x000B },
922
+ { 0x000C, 0x000C }, { 0x000D, 0x000D }, { 0x000E, 0x000E }, { 0x000F, 0x000F },
923
+ { 0x0010, 0x0010 }, { 0x0011, 0x0011 }, { 0x0012, 0x0012 }, { 0x0013, 0x0013 },
924
+ { 0x0014, 0x0014 }, { 0x0015, 0x0015 }, { 0x0016, 0x0016 }, { 0x0017, 0x0017 },
925
+ { 0x0018, 0x0018 }, { 0x0019, 0x0019 }, { 0x001A, 0x001A }, { 0x001B, 0x001B },
926
+ { 0x001C, 0x001C }, { 0x001D, 0x001D }, { 0x001E, 0x001E }, { 0x001F, 0x001F },
927
+ { 0x0020, 0x0020 }, { 0x0021, 0x0021 }, { 0x0022, 0x0022 }, { 0x0023, 0x0023 },
928
+ { 0x0024, 0x0024 }, { 0x0025, 0x0025 }, { 0x0026, 0x0026 }, { 0x0027, 0x0027 },
929
+ { 0x0028, 0x0028 }, { 0x0029, 0x0029 }, { 0x002A, 0x002A }, { 0x002B, 0x002B },
930
+ { 0x002C, 0x002C }, { 0x002D, 0x002D }, { 0x002E, 0x002E }, { 0x002F, 0x002F },
931
+ { 0x0030, 0x0030 }, { 0x0031, 0x0031 }, { 0x0032, 0x0032 }, { 0x0033, 0x0033 },
932
+ { 0x0034, 0x0034 }, { 0x0035, 0x0035 }, { 0x0036, 0x0036 }, { 0x0037, 0x0037 },
933
+ { 0x0038, 0x0038 }, { 0x0039, 0x0039 }, { 0x003A, 0x003A }, { 0x003B, 0x003B },
934
+ { 0x003C, 0x003C }, { 0x003D, 0x003D }, { 0x003E, 0x003E }, { 0x003F, 0x003F },
935
+ { 0x0040, 0x0040 }, { 0x0041, 0x0041 }, { 0x0042, 0x0042 }, { 0x0043, 0x0043 },
936
+ { 0x0044, 0x0044 }, { 0x0045, 0x0045 }, { 0x0046, 0x0046 }, { 0x0047, 0x0047 },
937
+ { 0x0048, 0x0048 }, { 0x0049, 0x0049 }, { 0x004A, 0x004A }, { 0x004B, 0x004B },
938
+ { 0x004C, 0x004C }, { 0x004D, 0x004D }, { 0x004E, 0x004E }, { 0x004F, 0x004F },
939
+ { 0x0050, 0x0050 }, { 0x0051, 0x0051 }, { 0x0052, 0x0052 }, { 0x0053, 0x0053 },
940
+ { 0x0054, 0x0054 }, { 0x0055, 0x0055 }, { 0x0056, 0x0056 }, { 0x0057, 0x0057 },
941
+ { 0x0058, 0x0058 }, { 0x0059, 0x0059 }, { 0x005A, 0x005A }, { 0x005B, 0x005B },
942
+ { 0x005C, 0x005C }, { 0x005D, 0x005D }, { 0x005E, 0x005E }, { 0x005F, 0x005F },
943
+ { 0x0060, 0x0060 }, { 0x0061, 0x0061 }, { 0x0062, 0x0062 }, { 0x0063, 0x0063 },
944
+ { 0x0064, 0x0064 }, { 0x0065, 0x0065 }, { 0x0066, 0x0066 }, { 0x0067, 0x0067 },
945
+ { 0x0068, 0x0068 }, { 0x0069, 0x0069 }, { 0x006A, 0x006A }, { 0x006B, 0x006B },
946
+ { 0x006C, 0x006C }, { 0x006D, 0x006D }, { 0x006E, 0x006E }, { 0x006F, 0x006F },
947
+ { 0x0070, 0x0070 }, { 0x0071, 0x0071 }, { 0x0072, 0x0072 }, { 0x0073, 0x0073 },
948
+ { 0x0074, 0x0074 }, { 0x0075, 0x0075 }, { 0x0076, 0x0076 }, { 0x0077, 0x0077 },
949
+ { 0x0078, 0x0078 }, { 0x0079, 0x0079 }, { 0x007A, 0x007A }, { 0x007B, 0x007B },
950
+ { 0x007C, 0x007C }, { 0x007D, 0x007D }, { 0x007E, 0x007E }, { 0x007F, 0x007F },
951
+ { 0x00A0, 0x0080 }, { 0x00A1, 0x00A1 }, { 0x00A2, 0x00A2 }, { 0x00A3, 0x00A3 },
952
+ { 0x00A4, 0x00A8 }, { 0x00A5, 0x00A5 }, { 0x00A6, 0x00B5 }, { 0x00A7, 0x00A7 },
953
+ { 0x00A8, 0x00C8 }, { 0x00A9, 0x00A0 }, { 0x00AA, 0x00E3 }, { 0x00AB, 0x00AB },
954
+ { 0x00AC, 0x00BE }, { 0x00AE, 0x00B0 }, { 0x00AF, 0x00C5 }, { 0x00B1, 0x00D1 },
955
+ { 0x00B2, 0x00C9 }, { 0x00B3, 0x00CC }, { 0x00B4, 0x00C2 }, { 0x00B5, 0x009D },
956
+ { 0x00B6, 0x00B6 }, { 0x00B7, 0x00B4 }, { 0x00B8, 0x00CB }, { 0x00B9, 0x00C0 },
957
+ { 0x00BA, 0x00EB }, { 0x00BB, 0x00BB }, { 0x00BC, 0x00D2 }, { 0x00BD, 0x00D3 },
958
+ { 0x00BE, 0x00D4 }, { 0x00BF, 0x00BF }, { 0x00C0, 0x0081 }, { 0x00C1, 0x0082 },
959
+ { 0x00C2, 0x0083 }, { 0x00C3, 0x0084 }, { 0x00C4, 0x0085 }, { 0x00C5, 0x0086 },
960
+ { 0x00C6, 0x00E1 }, { 0x00C7, 0x0087 }, { 0x00C8, 0x0088 }, { 0x00C9, 0x0089 },
961
+ { 0x00CA, 0x008A }, { 0x00CB, 0x008B }, { 0x00CC, 0x008C }, { 0x00CD, 0x008D },
962
+ { 0x00CE, 0x008E }, { 0x00CF, 0x008F }, { 0x00D0, 0x0090 }, { 0x00D1, 0x0091 },
963
+ { 0x00D2, 0x0092 }, { 0x00D3, 0x0093 }, { 0x00D4, 0x0094 }, { 0x00D5, 0x0095 },
964
+ { 0x00D6, 0x0096 }, { 0x00D7, 0x009E }, { 0x00D8, 0x00E9 }, { 0x00D9, 0x0097 },
965
+ { 0x00DA, 0x0098 }, { 0x00DB, 0x0099 }, { 0x00DC, 0x009A }, { 0x00DD, 0x009B },
966
+ { 0x00DE, 0x009C }, { 0x00DF, 0x00FB }, { 0x00E0, 0x00D5 }, { 0x00E1, 0x00D6 },
967
+ { 0x00E2, 0x00D7 }, { 0x00E3, 0x00D8 }, { 0x00E4, 0x00D9 }, { 0x00E5, 0x00DA },
968
+ { 0x00E6, 0x00F1 }, { 0x00E7, 0x00DB }, { 0x00E8, 0x00DC }, { 0x00E9, 0x00DD },
969
+ { 0x00EA, 0x00DE }, { 0x00EB, 0x00DF }, { 0x00EC, 0x00E0 }, { 0x00ED, 0x00E2 },
970
+ { 0x00EE, 0x00E4 }, { 0x00EF, 0x00E5 }, { 0x00F0, 0x00E6 }, { 0x00F1, 0x00E7 },
971
+ { 0x00F2, 0x00EC }, { 0x00F3, 0x00ED }, { 0x00F4, 0x00EE }, { 0x00F5, 0x00EF },
972
+ { 0x00F6, 0x00F0 }, { 0x00F7, 0x009F }, { 0x00F8, 0x00F9 }, { 0x00F9, 0x00F2 },
973
+ { 0x00FA, 0x00F3 }, { 0x00FB, 0x00F4 }, { 0x00FC, 0x00F6 }, { 0x00FD, 0x00F7 },
974
+ { 0x00FE, 0x00FC }, { 0x00FF, 0x00FD }, { 0x0131, 0x00F5 }, { 0x0141, 0x00E8 },
975
+ { 0x0142, 0x00F8 }, { 0x0152, 0x00EA }, { 0x0153, 0x00FA }, { 0x0192, 0x00A6 },
976
+ { 0x02C6, 0x00C3 }, { 0x02C7, 0x00CF }, { 0x02CB, 0x00C1 }, { 0x02D8, 0x00C6 },
977
+ { 0x02D9, 0x00C7 }, { 0x02DA, 0x00CA }, { 0x02DB, 0x00CE }, { 0x02DC, 0x00C4 },
978
+ { 0x02DD, 0x00CD }, { 0x2013, 0x00B1 }, { 0x2014, 0x00D0 }, { 0x2019, 0x00A9 },
979
+ { 0x201A, 0x00B8 }, { 0x201C, 0x00AA }, { 0x201D, 0x00BA }, { 0x201E, 0x00B9 },
980
+ { 0x2020, 0x00B2 }, { 0x2021, 0x00B3 }, { 0x2022, 0x00B7 }, { 0x2026, 0x00BC },
981
+ { 0x2030, 0x00BD }, { 0x2039, 0x00AC }, { 0x203A, 0x00AD }, { 0x2044, 0x00A4 },
982
+ { 0xFB01, 0x00AE }, { 0xFB02, 0x00AF }, { 0xFFFD, 0x00FE }, { 0xFFFD, 0x00FF }
983
+ },
984
+
985
+ // defaultCharacter
986
+ '?'
987
+ } ;
988
+
989
+
990
+ #ifdef __cplusplus
991
+ }
992
+ #endif
993
+