%% 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 #endif #endif #ifndef DK4TYPES_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" #else #include #endif #endif #ifndef DK4ERROR_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" #else #include #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 : */