libgrapheme

unicode string library
git clone git://git.suckless.org/libgrapheme
Log | Files | Refs | README | LICENSE

grapheme_encode_utf8.sh (1915B)


      1 cat << EOF
      2 .Dd ${MAN_DATE}
      3 .Dt GRAPHEME_ENCODE_UTF8 3
      4 .Os suckless.org
      5 .Sh NAME
      6 .Nm grapheme_encode_utf8
      7 .Nd encode codepoint into UTF-8 string
      8 .Sh SYNOPSIS
      9 .In grapheme.h
     10 .Ft size_t
     11 .Fn grapheme_encode_utf8 "uint_least32_t cp" "char *str" "size_t len"
     12 .Sh DESCRIPTION
     13 The
     14 .Fn grapheme_encode_utf8
     15 function encodes the codepoint
     16 .Va cp
     17 into a UTF-8-string.
     18 If
     19 .Va str
     20 is not
     21 .Dv NULL
     22 and
     23 .Va len
     24 is large enough it writes the UTF-8-string to the memory pointed to by
     25 .Va str .
     26 Otherwise no data is written.
     27 .Sh RETURN VALUES
     28 The
     29 .Fn grapheme_encode_utf8
     30 function returns the length (in bytes) of the UTF-8-string resulting
     31 from encoding
     32 .Va cp ,
     33 even if
     34 .Va len
     35 is not large enough or
     36 .Va str
     37 is
     38 .Dv NULL .
     39 .Sh EXAMPLES
     40 .Bd -literal
     41 /* cc (-static) -o example example.c -lgrapheme */
     42 #include <grapheme.h>
     43 #include <stddef.h>
     44 #include <stdlib.h>
     45 
     46 size_t
     47 cps_to_utf8(const uint_least32_t *cp, size_t cplen, char *str, size_t len)
     48 {
     49 	size_t i, off, ret;
     50 
     51 	for (i = 0, off = 0; i < cplen; i++, off += ret) {
     52 		if ((ret = grapheme_encode_utf8(cp[i], str + off,
     53 		                                len - off)) > (len - off)) {
     54 			/* buffer too small */
     55 			break;
     56 		}
     57 	}
     58 
     59 	return off;
     60 }
     61 
     62 size_t
     63 cps_bytelen(const uint_least32_t *cp, size_t cplen)
     64 {
     65 	size_t i, len;
     66 
     67 	for (i = 0, len = 0; i < cplen; i++) {
     68 		len += grapheme_encode_utf8(cp[i], NULL, 0);
     69 	}
     70 
     71 	return len;
     72 }
     73 
     74 char *
     75 cps_to_utf8_alloc(const uint_least32_t *cp, size_t cplen)
     76 {
     77 	char *str;
     78 	size_t len, i, ret, off;
     79 
     80 	len = cps_bytelen(cp, cplen);
     81 
     82 	if (!(str = malloc(len))) {
     83 		return NULL;
     84 	}
     85 
     86 	for (i = 0, off = 0; i < cplen; i++, off += ret) {
     87 		if ((ret = grapheme_encode_utf8(cp[i], str + off,
     88 		                                len - off)) > (len - off)) {
     89 			/* buffer too small */
     90 			break;
     91 		}
     92 	}
     93 	str[off] = '\\\\0';
     94 
     95 	return str;
     96 }
     97 .Ed
     98 .Sh SEE ALSO
     99 .Xr grapheme_decode_utf8 3 ,
    100 .Xr libgrapheme 7
    101 .Sh AUTHORS
    102 .An Laslo Hunhold Aq Mt dev@frign.de
    103 EOF