shithub: libtags

ref: b9872910ce781e5818322af3e31c655ca8d87821
dir: /437.c/

View raw version
/* https://en.wikipedia.org/wiki/Code_page_437 */
#include "tagspriv.h"

static const uint8_t rh[129*3] = {
	0xce, 0x94, 0x00,
	0xc3, 0x87, 0x00,
	0xc3, 0xbc, 0x00,
	0xc3, 0xa9, 0x00,
	0xc3, 0xa2, 0x00,
	0xc3, 0xa4, 0x00,
	0xc3, 0xa0, 0x00,
	0xc3, 0xa5, 0x00,
	0xc3, 0xa7, 0x00,
	0xc3, 0xaa, 0x00,
	0xc3, 0xab, 0x00,
	0xc3, 0xa8, 0x00,
	0xc3, 0xaf, 0x00,
	0xc3, 0xae, 0x00,
	0xc3, 0xac, 0x00,
	0xc3, 0x84, 0x00,
	0xc3, 0x85, 0x00,
	0xc3, 0x89, 0x00,
	0xc3, 0xa6, 0x00,
	0xc3, 0x86, 0x00,
	0xc3, 0xb4, 0x00,
	0xc3, 0xb6, 0x00,
	0xc3, 0xb2, 0x00,
	0xc3, 0xbb, 0x00,
	0xc3, 0xb9, 0x00,
	0xc3, 0xbf, 0x00,
	0xc3, 0x96, 0x00,
	0xc3, 0x9c, 0x00,
	0xc2, 0xa2, 0x00,
	0xc2, 0xa3, 0x00,
	0xc2, 0xa5, 0x00,
	0xe2, 0x82, 0xa7,
	0xc6, 0x92, 0x00,
	0xc3, 0xa1, 0x00,
	0xc3, 0xad, 0x00,
	0xc3, 0xb3, 0x00,
	0xc3, 0xba, 0x00,
	0xc3, 0xb1, 0x00,
	0xc3, 0x91, 0x00,
	0xc2, 0xaa, 0x00,
	0xc2, 0xba, 0x00,
	0xc2, 0xbf, 0x00,
	0xe2, 0x8c, 0x90,
	0xc2, 0xac, 0x00,
	0xc2, 0xbd, 0x00,
	0xc2, 0xbc, 0x00,
	0xc2, 0xa1, 0x00,
	0xc2, 0xab, 0x00,
	0xc2, 0xbb, 0x00,
	0xe2, 0x96, 0x91,
	0xe2, 0x96, 0x92,
	0xe2, 0x96, 0x93,
	0xe2, 0x94, 0x82,
	0xe2, 0x94, 0xa4,
	0xe2, 0x95, 0xa1,
	0xe2, 0x95, 0xa2,
	0xe2, 0x95, 0x96,
	0xe2, 0x95, 0x95,
	0xe2, 0x95, 0xa3,
	0xe2, 0x95, 0x91,
	0xe2, 0x95, 0x97,
	0xe2, 0x95, 0x9d,
	0xe2, 0x95, 0x9c,
	0xe2, 0x95, 0x9b,
	0xe2, 0x94, 0x90,
	0xe2, 0x94, 0x94,
	0xe2, 0x94, 0xb4,
	0xe2, 0x94, 0xac,
	0xe2, 0x94, 0x9c,
	0xe2, 0x94, 0x80,
	0xe2, 0x94, 0xbc,
	0xe2, 0x95, 0x9e,
	0xe2, 0x95, 0x9f,
	0xe2, 0x95, 0x9a,
	0xe2, 0x95, 0x94,
	0xe2, 0x95, 0xa9,
	0xe2, 0x95, 0xa6,
	0xe2, 0x95, 0xa0,
	0xe2, 0x95, 0x90,
	0xe2, 0x95, 0xac,
	0xe2, 0x95, 0xa7,
	0xe2, 0x95, 0xa8,
	0xe2, 0x95, 0xa4,
	0xe2, 0x95, 0xa5,
	0xe2, 0x95, 0x99,
	0xe2, 0x95, 0x98,
	0xe2, 0x95, 0x92,
	0xe2, 0x95, 0x93,
	0xe2, 0x95, 0xab,
	0xe2, 0x95, 0xaa,
	0xe2, 0x94, 0x98,
	0xe2, 0x94, 0x8c,
	0xe2, 0x96, 0x88,
	0xe2, 0x96, 0x84,
	0xe2, 0x96, 0x8c,
	0xe2, 0x96, 0x90,
	0xe2, 0x96, 0x80,
	0xce, 0xb1, 0x00,
	0xc3, 0x9f, 0x00,
	0xce, 0x93, 0x00,
	0xcf, 0x80, 0x00,
	0xce, 0xa3, 0x00,
	0xcf, 0x83, 0x00,
	0xc2, 0xb5, 0x00,
	0xcf, 0x84, 0x00,
	0xce, 0xa6, 0x00,
	0xce, 0x98, 0x00,
	0xce, 0xa9, 0x00,
	0xce, 0xb4, 0x00,
	0xe2, 0x88, 0x9e,
	0xcf, 0x86, 0x00,
	0xce, 0xb5, 0x00,
	0xe2, 0x88, 0xa9,
	0xe2, 0x89, 0xa1,
	0xc2, 0xb1, 0x00,
	0xe2, 0x89, 0xa5,
	0xe2, 0x89, 0xa4,
	0xe2, 0x8c, 0xa0,
	0xe2, 0x8c, 0xa1,
	0xc3, 0xb7, 0x00,
	0xe2, 0x89, 0x88,
	0xc2, 0xb0, 0x00,
	0xe2, 0x88, 0x99,
	0xc2, 0xb7, 0x00,
	0xe2, 0x88, 0x9a,
	0xe2, 0x81, 0xbf,
	0xc2, 0xb2, 0x00,
	0xe2, 0x96, 0xa0,
	0xc2, 0xa0, 0x00,
};

int
cp437toutf8(uint8_t *o, int osz, const uint8_t *s, int sz)
{
	int i, n;

	for(i = 0; i < sz && osz > 1 && s[i] != 0; i++){
		if(s[i] < 127){
			*o++ = s[i];
			osz--;
			continue;
		}
		if(osz < UTFmax)
			break;
		n = (s[i] - 127) * 3;
		*o++ = rh[n++];
		*o++ = rh[n++];
		osz -= 2;
		if(rh[n] != 0){
			*o++ = rh[n];
			osz--;
		}
	}

	*o = 0;
	return i;
}