diff options
author | Thijs Schreijer <thijs@thijsschreijer.nl> | 2025-02-06 16:52:08 +0100 |
---|---|---|
committer | Thijs Schreijer <thijs@thijsschreijer.nl> | 2025-02-10 09:01:35 +0100 |
commit | 4a128b8969fe4d720f50c1fdb68f0265af8a7117 (patch) | |
tree | 771c9ea7e694f6c18d76e76e5a7160f371453db1 /src | |
parent | 3c1fdbcc844a55f94dde41591f487ded73eab012 (diff) | |
download | luasystem-4a128b8969fe4d720f50c1fdb68f0265af8a7117.tar.gz luasystem-4a128b8969fe4d720f50c1fdb68f0265af8a7117.tar.bz2 luasystem-4a128b8969fe4d720f50c1fdb68f0265af8a7117.zip |
feat(terminal): also accept codepoint integers for width check
Lua utf8 functions return codepoints, hence it makes sense to accept
those, instead of having to convert to utf8 string and back again.
Diffstat (limited to 'src')
-rw-r--r-- | src/term.c | 47 |
1 files changed, 32 insertions, 15 deletions
@@ -953,30 +953,47 @@ int utf8_to_wchar(const char *utf8, size_t len, mk_wchar_t *codepoint) { | |||
953 | /*** | 953 | /*** |
954 | Get the width of a utf8 character for terminal display. | 954 | Get the width of a utf8 character for terminal display. |
955 | @function utf8cwidth | 955 | @function utf8cwidth |
956 | @tparam string utf8_char the utf8 character to check, only the width of the first character will be returned | 956 | @tparam string|int utf8_char the utf8 character, or unicode codepoint, to check, only the width of the first character will be returned |
957 | @treturn[1] int the display width in columns of the first character in the string (0 for an empty string) | 957 | @treturn[1] int the display width in columns of the first character in the string (0 for an empty string) |
958 | @treturn[2] nil | 958 | @treturn[2] nil |
959 | @treturn[2] string error message | 959 | @treturn[2] string error message |
960 | */ | 960 | */ |
961 | int lst_utf8cwidth(lua_State *L) { | 961 | int lst_utf8cwidth(lua_State *L) { |
962 | const char *utf8_char; | ||
963 | size_t utf8_len; | ||
964 | utf8_char = luaL_checklstring(L, 1, &utf8_len); | ||
965 | int width = 0; | 962 | int width = 0; |
966 | |||
967 | mk_wchar_t wc; | 963 | mk_wchar_t wc; |
968 | 964 | ||
969 | if (utf8_len == 0) { | 965 | if (lua_type(L, 1) == LUA_TSTRING) { |
970 | lua_pushinteger(L, 0); | 966 | // Handle UTF8 as string input |
971 | return 1; | 967 | const char *utf8_char; |
972 | } | 968 | size_t utf8_len; |
969 | utf8_char = luaL_checklstring(L, 1, &utf8_len); | ||
973 | 970 | ||
974 | // Convert the UTF-8 string to a wide character | 971 | if (utf8_len == 0) { |
975 | int bytes_processed = utf8_to_wchar(utf8_char, utf8_len, &wc); | 972 | lua_pushinteger(L, 0); |
976 | if (bytes_processed == -1) { | 973 | return 1; |
977 | lua_pushnil(L); | 974 | } |
978 | lua_pushstring(L, "Invalid UTF-8 character"); | 975 | |
979 | return 2; | 976 | // Convert the UTF-8 string to a wide character |
977 | int bytes_processed = utf8_to_wchar(utf8_char, utf8_len, &wc); | ||
978 | if (bytes_processed == -1) { | ||
979 | lua_pushnil(L); | ||
980 | lua_pushstring(L, "Invalid UTF-8 character"); | ||
981 | return 2; | ||
982 | } | ||
983 | |||
984 | } else if (lua_type(L, 1) == LUA_TNUMBER) { | ||
985 | // Handle codepoint input | ||
986 | int codepoint = luaL_checkinteger(L, 1); | ||
987 | |||
988 | if (codepoint < 0 || codepoint > 0x10FFFF) { | ||
989 | lua_pushnil(L); | ||
990 | lua_pushstring(L, "Invalid Unicode codepoint"); | ||
991 | return 2; | ||
992 | } | ||
993 | wc = (mk_wchar_t)codepoint; | ||
994 | |||
995 | } else { | ||
996 | return luaL_argerror(L, 1, "Expected UTF-8-string or codepoint-integer as first argument"); | ||
980 | } | 997 | } |
981 | 998 | ||
982 | // Get the width of the wide character | 999 | // Get the width of the wide character |