From 4e4eb0de0f50517e3a2892cddcadfbd75da7152f Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Mon, 20 Aug 2018 18:41:23 -0400 Subject: Add wcsnchr, wcsnrchr, awcsntombs This eliminates calls to editHead and editTail inside edit.c. Oh god I'm sorry for following libc naming conventions for this stuff. --- pls.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'pls.c') diff --git a/pls.c b/pls.c index d768b8f..08309f8 100644 --- a/pls.c +++ b/pls.c @@ -22,6 +22,22 @@ #include "chat.h" +wchar_t *wcsnchr(const wchar_t *wcs, size_t len, wchar_t chr) { + len = wcsnlen(wcs, len); + for (size_t i = 0; i < len; ++i) { + if (wcs[i] == chr) return (wchar_t *)&wcs[i]; + } + return NULL; +} + +wchar_t *wcsnrchr(const wchar_t *wcs, size_t len, wchar_t chr) { + len = wcsnlen(wcs, len); + for (size_t i = len - 1; i < len; --i) { + if (wcs[i] == chr) return (wchar_t *)&wcs[i]; + } + return NULL; +} + wchar_t *ambstowcs(const char *src) { size_t len = mbsrtowcs(NULL, &src, 0, NULL); if (len == (size_t)-1) return NULL; @@ -54,6 +70,22 @@ char *awcstombs(const wchar_t *src) { return dst; } +char *awcsntombs(const wchar_t *src, size_t nwc) { + size_t len = wcsnrtombs(NULL, &src, nwc, 0, NULL); + if (len == (size_t)-1) return NULL; + + char *dst = malloc(sizeof(*dst) * (1 + len)); + if (!dst) return NULL; + + len = wcsnrtombs(dst, &src, nwc, 1 + len, NULL); + if (len == (size_t)-1) { + free(dst); + return NULL; + } + + return dst; +} + // From : // // While narrow strings provide snprintf, which makes it possible to determine -- cgit 1.4.1