FreeCalypso > hg > freecalypso-tools
view uptools/libcoding/decode_helpers.c @ 915:71edc12b1aa7
doc/Rvinterf-tools: document new rvinterf -v option
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 29 Dec 2022 23:59:00 +0000 |
parents | 1c599681fd60 |
children |
line wrap: on
line source
/* * 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); } if (uni < 0x10000) { outp[0] = 0xE0 | (uni >> 12); outp[1] = 0x80 | ((uni >> 6) & 0x3F); outp[2] = 0x80 | (uni & 0x3F); return(3); } outp[0] = 0xF0 | (uni >> 18); outp[1] = 0x80 | ((uni >> 12) & 0x3F); outp[2] = 0x80 | ((uni >> 6) & 0x3F); outp[3] = 0x80 | (uni & 0x3F); return(4); }