diff options
Diffstat (limited to 'support/dktools/dk4cp850.ctr')
-rw-r--r-- | support/dktools/dk4cp850.ctr | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/support/dktools/dk4cp850.ctr b/support/dktools/dk4cp850.ctr new file mode 100644 index 0000000000..bc5ff1a909 --- /dev/null +++ b/support/dktools/dk4cp850.ctr @@ -0,0 +1,183 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2015-xxxx +SPDX-License-Identifier: BSD-3-Clause + + + +%% header + +/** @file + Character conversion from CP850 to UNICODE + and vice versa. + + CRT on Windows: Not used. +*/ + +#ifndef DK4CONF_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 +#include "dk4conf.h" +#else +#include <dktools-4/dk4conf.h> +#endif +#endif + +#ifndef DK4TYPES_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 +#include "dk4types.h" +#else +#include <dktools-4/dk4types.h> +#endif +#endif + +#ifndef DK4ERROR_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 +#include "dk4error.h" +#else +#include <dktools-4/dk4error.h> +#endif +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/** Encode 32 bit character as CP850 character if possible. + @param dptr Pointer to result variable. + @param c32 Character to convert. + @return 1 on success, 0 on error (character c32 out of range). +*/ +int +dk4cp850_encode(unsigned char *dptr, dk4_c32_t c32); + +/** Retrieve 32 bit character from CP850 encoded character. + @param dptr Pointer to result variable. + @param uc CP850 character to convert. + @return 1 on success, 0 on error. +*/ +int +dk4cp850_decode(dk4_c32_t *dptr, unsigned char uc); + +#ifdef __cplusplus +} +#endif + + +%% module + +#include "dk4cp850.h" +#include "dk4numco.h" + + + +/** Conversion table from char:CP850 to C32. +*/ +static const unsigned long dk4cp850_table[] = { +/* 00 */ +0x0000UL, 0x263AUL, 0x263BUL, 0x2665UL, 0x2666UL, 0x2663UL, 0x2660UL, 0x2022UL, +0x25D8UL, 0x25CBUL, 0x25D9UL, 0x2642UL, 0x2640UL, 0x266AUL, 0x266BUL, 0x263CUL, + +/* 10 */ +0x25BAUL, 0x25C4UL, 0x2195UL, 0x203CUL, 0x00B6UL, 0x00A7UL, 0x25ACUL, 0x21A8UL, +0x2191UL, 0x2193UL, 0x2192UL, 0x2190UL, 0x221FUL, 0x2194UL, 0x25B2UL, 0x25BCUL, + +/* 20 */ +0x0020UL, 0x0021UL, 0x0022UL, 0x0023UL, 0x0024UL, 0x0025UL, 0x0026UL, 0x0027UL, +0x0028UL, 0x0029UL, 0x002AUL, 0x002BUL, 0x002CUL, 0x002DUL, 0x002EUL, 0x002FUL, + +/* 30 */ +0x0030UL, 0x0031UL, 0x0032UL, 0x0033UL, 0x0034UL, 0x0035UL, 0x0036UL, 0x0037UL, +0x0038UL, 0x0039UL, 0x003AUL, 0x003BUL, 0x003CUL, 0x003DUL, 0x003EUL, 0x003FUL, + +/* 40 */ +0x0040UL, 0x0041UL, 0x0042UL, 0x0043UL, 0x0044UL, 0x0045UL, 0x0046UL, 0x0047UL, +0x0048UL, 0x0049UL, 0x004AUL, 0x004BUL, 0x004CUL, 0x004DUL, 0x004EUL, 0x004FUL, + +/* 50 */ +0x0050UL, 0x0051UL, 0x0052UL, 0x0053UL, 0x0054UL, 0x0055UL, 0x0056UL, 0x0057UL, +0x0058UL, 0x0059UL, 0x005AUL, 0x005BUL, 0x005CUL, 0x005DUL, 0x005EUL, 0x005FUL, + +/* 60 */ +0x0060UL, 0x0061UL, 0x0062UL, 0x0063UL, 0x0064UL, 0x0065UL, 0x0066UL, 0x0067UL, +0x0068UL, 0x0069UL, 0x006AUL, 0x006BUL, 0x006CUL, 0x006DUL, 0x006EUL, 0x006FUL, + +/* 70 */ +0x0070UL, 0x0071UL, 0x0072UL, 0x0073UL, 0x0074UL, 0x0075UL, 0x0076UL, 0x0077UL, +0x0078UL, 0x0079UL, 0x007AUL, 0x007BUL, 0x007CUL, 0x007DUL, 0x007EUL, 0x2302UL, + +/* 80 */ +0x00C7UL, 0x00FCUL, 0x00E9UL, 0x00E2UL, 0x00E4UL, 0x00E0UL, 0x00E5UL, 0x00E7UL, +0x00EAUL, 0x00EBUL, 0x00E8UL, 0x00EFUL, 0x00EEUL, 0x00ECUL, 0x00C4UL, 0x00C5UL, + +/* 90 */ +0x00C9UL, 0x00E6UL, 0x00C6UL, 0x00F4UL, 0x00F6UL, 0x00F2UL, 0x00FBUL, 0x00F9UL, +0x00FFUL, 0x00D6UL, 0x00DCUL, 0x00F8UL, 0x00A3UL, 0x00D8UL, 0x00D7UL, 0x0192UL, + +/* A0 */ +0x00E1UL, 0x00EDUL, 0x00F3UL, 0x00FAUL, 0x00F1UL, 0x00D1UL, 0x00AAUL, 0x00BAUL, +0x00BFUL, 0x00AEUL, 0x00ACUL, 0x00BDUL, 0x00BCUL, 0x00A1UL, 0x00ABUL, 0x00BBUL, + +/* B0 */ +0x2591UL, 0x2592UL, 0x2593UL, 0x2502UL, 0x2524UL, 0x00C1UL, 0x00C2UL, 0x00C0UL, +0x00A9UL, 0x2563UL, 0x2551UL, 0x2557UL, 0x255DUL, 0x00A2UL, 0x00A5UL, 0x2510UL, + +/* C0 */ +0x2514UL, 0x2534UL, 0x252CUL, 0x251CUL, 0x2500UL, 0x253CUL, 0x00E3UL, 0x00C3UL, +0x255AUL, 0x2554UL, 0x2569UL, 0x2566UL, 0x2560UL, 0x2550UL, 0x256CUL, 0x00A4UL, + +/* D0 */ +0x00F0UL, 0x00D0UL, 0x00CAUL, 0x00CBUL, 0x00C8UL, 0x0131UL, 0x00CDUL, 0x00CEUL, +0x00CFUL, 0x2518UL, 0x250CUL, 0x2588UL, 0x2584UL, 0x00A6UL, 0x00CCUL, 0x2580UL, + +/* E0 */ +0x00D3UL, 0x00DFUL, 0x00D4UL, 0x00D2UL, 0x00F5UL, 0x00D5UL, 0x00B5UL, 0x00FEUL, +0x00DEUL, 0x00DAUL, 0x00DBUL, 0x00D9UL, 0x00FDUL, 0x00DDUL, 0x00AFUL, 0x00B4UL, + +/* F0 */ +0x00ADUL, 0x00B1UL, 0x2017UL, 0x00BEUL, 0x00B6UL, 0x00A7UL, 0x00F7UL, 0x00B8UL, +0x00B0UL, 0x00A8UL, 0x00B7UL, 0x00B9UL, 0x00B3UL, 0x00B2UL, 0x25A0UL, 0x00A0UL +}; + + + +/** Table size (number of elements). +*/ +static const size_t dk4cp850_sz_table = +sizeof(dk4cp850_table)/sizeof(unsigned long); + + +int +dk4cp850_encode(unsigned char *dptr, dk4_c32_t c32) +{ + size_t i; + int back = 0; + if (NULL != dptr) { + for (i = 0; ((0 == back) && (i < dk4cp850_sz_table)); i++) { + if ( (dk4_c32_t)(dk4cp850_table[i]) == c32 ) { + *dptr = (unsigned char)i; + back = 1; + } + } + } + return back; +} + + + +int +dk4cp850_decode(dk4_c32_t *dptr, unsigned char uc) +{ + int back = 0; + if (NULL != dptr) { + *dptr = (dk4_c32_t)( + dk4cp850_table[((size_t)uc) & ((size_t)0x000000FFUL)] + ); + back = 1; + } + return back; +} + + +/* vim: set ai sw=4 ts=4 : */ |