ref: 0f97547851c6eca1582494ffb1817fc25bd100de
dir: /437.c/
/* https://en.wikipedia.org/wiki/Code_page_437 */ #include "tagspriv.h" #ifdef __unix__ int cp437toutf8(char *o, int osz, const char *s, int sz) { /* FIXME somebody come up with portable code */ return snprintf(o, osz, "%.*s", sz, s); } #else static Rune rh[] = L"ΔÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧" L"ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│d┤╡╢╖╕╣║╗╝╜" L"╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌" L"▐▀αßeΓπfΣgσµhτΦΘΩiδj∞φkεl∩≡±≥≤⌠m" L"⌡÷≈°∙n·√oⁿ²■ "; int cp437toutf8(char *o, int osz, const char *s, int sz) { char c[UTFmax]; int i, n; Rune r; for(i = 0; i < sz && osz > 1 && s[i] != 0; i++){ if((uint8_t)s[i] < 127){ *o++ = s[i]; osz--; continue; } r = rh[(uint8_t)s[i] - 127]; if((n = runetochar(c, &r)) >= osz) break; memmove(o, c, n); o += n; osz -= n; } *o = 0; return i; } #endif