FreeCalypso > hg > freecalypso-tools
diff uptools/libcoding/decode_helpers.c @ 328:978571e23318
uptools started with libcoding
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 03 Feb 2018 20:07:05 +0000 (2018-02-03) |
parents | |
children | 1c599681fd60 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uptools/libcoding/decode_helpers.c Sat Feb 03 20:07:05 2018 +0000 @@ -0,0 +1,55 @@ +/* + * This library module implements the is_decoded_char_ok() and emit_utf8_char() + * functions used by gsm7_to_ascii_or_ext() and ucs2_to_ascii_or_ext(). + */ + +#include <sys/types.h> + +is_decoded_char_ok(uni, ascii_ext) + unsigned uni; +{ + unsigned upper_limit; + + /* weed out control chars first */ + if (uni < 0x20) + return(0); + if (uni >= 0x7F && uni <= 0x9F) + return(0); + /* see what range our output encoding allows */ + switch (ascii_ext) { + case 0: + upper_limit = 0x7F; + break; + case 1: + upper_limit = 0xFF; + break; + case 2: + upper_limit = 0xFFFF; + break; + default: + upper_limit = 0; + } + if (uni <= upper_limit) + return(1); + else + return(0); +} + +emit_utf8_char(uni, outp) + unsigned uni; + u_char *outp; +{ + if (uni < 0x80) { + *outp = uni; + return(1); + } + if (uni < 0x800) { + outp[0] = 0xC0 | (uni >> 6); + outp[1] = 0x80 | (uni & 0x3F); + return(2); + } + outp[0] = 0xE0 | (uni >> 12); + outp[1] = 0x80 | ((uni >> 6) & 0x3F); + outp[2] = 0x80 | (uni & 0x3F); + return(3); +}