diff options
author | Rickard Green <[email protected]> | 2017-08-21 15:25:00 +0200 |
---|---|---|
committer | Rickard Green <[email protected]> | 2017-08-23 14:24:38 +0200 |
commit | 319eefea3b2097b543751c63cebbb4a92011dbbf (patch) | |
tree | 7bef11f08173d416a989eb196966e06f85e17203 /erts/emulator/beam/utils.c | |
parent | 7c9ea890cd2530bffeafa82abeeee876fd24a6ba (diff) | |
download | otp-319eefea3b2097b543751c63cebbb4a92011dbbf.tar.gz otp-319eefea3b2097b543751c63cebbb4a92011dbbf.tar.bz2 otp-319eefea3b2097b543751c63cebbb4a92011dbbf.zip |
Unicode support for erlang:display_string/1
Diffstat (limited to 'erts/emulator/beam/utils.c')
-rw-r--r-- | erts/emulator/beam/utils.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c index ba7596cde4..16523659d9 100644 --- a/erts/emulator/beam/utils.c +++ b/erts/emulator/beam/utils.c @@ -3704,6 +3704,52 @@ erts_unicode_list_to_buf(Eterm list, byte *buf, Sint len, Sint* written) return res; } +Sint +erts_unicode_list_to_buf_len(Eterm list) +{ + Eterm* listptr; + Sint sz = 0; + + if (is_nil(list)) { + return 0; + } + if (is_not_list(list)) { + return -1; + } + listptr = list_val(list); + + while (1) { + Sint val; + + if (is_not_small(CAR(listptr))) { + return -1; + } + val = signed_val(CAR(listptr)); + if (0 <= val && val < 0x80) { + sz++; + } else if (val < 0x800) { + sz += 2; + } else if (val < 0x10000UL) { + if (0xD800 <= val && val <= 0xDFFF) { + return -1; + } + sz += 3; + } else if (val < 0x110000) { + sz += 4; + } else { + return -1; + } + list = CDR(listptr); + if (is_nil(list)) { + return sz; + } + if (is_not_list(list)) { + return -1; + } + listptr = list_val(list); + } +} + /* ** Convert an integer to a byte list ** return pointer to converted stuff (need not to be at start of buf!) |