lib/mbsalign: add function to calculate width
We already have mbs_safe_nwidth() but it assumes that all "bad" chars will be encoded by \x<hex>. Now we need also function that do not care about encoding. Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
7c16238c06
commit
0957fdca6a
|
@ -53,6 +53,9 @@ extern size_t mbsalign_with_padding (const char *src, char *dest, size_t dest_si
|
||||||
extern size_t mbs_safe_nwidth(const char *buf, size_t bufsz, size_t *sz);
|
extern size_t mbs_safe_nwidth(const char *buf, size_t bufsz, size_t *sz);
|
||||||
extern size_t mbs_safe_width(const char *s);
|
extern size_t mbs_safe_width(const char *s);
|
||||||
|
|
||||||
|
extern size_t mbs_nwidth(const char *buf, size_t bufsz);
|
||||||
|
extern size_t mbs_width(const char *s);
|
||||||
|
|
||||||
extern char *mbs_safe_encode(const char *s, size_t *width);
|
extern char *mbs_safe_encode(const char *s, size_t *width);
|
||||||
extern char *mbs_safe_encode_to_buffer(const char *s, size_t *width, char *buf, const char *safechars);
|
extern char *mbs_safe_encode_to_buffer(const char *s, size_t *width, char *buf, const char *safechars);
|
||||||
extern size_t mbs_safe_encode_size(size_t bytes);
|
extern size_t mbs_safe_encode_size(size_t bytes);
|
||||||
|
|
|
@ -28,9 +28,67 @@
|
||||||
#include "strutils.h"
|
#include "strutils.h"
|
||||||
#include "widechar.h"
|
#include "widechar.h"
|
||||||
|
|
||||||
/* Replace non printable chars.
|
/*
|
||||||
Note \t and \n etc. are non printable.
|
* Counts number of cells in multibyte string. All control and
|
||||||
Return 1 if replacement made, 0 otherwise. */
|
* non-printable chars are ignored.
|
||||||
|
*
|
||||||
|
* Returns: number of cells.
|
||||||
|
*/
|
||||||
|
size_t mbs_nwidth(const char *buf, size_t bufsz)
|
||||||
|
{
|
||||||
|
const char *p = buf, *last = buf;
|
||||||
|
size_t width = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_WIDECHAR
|
||||||
|
mbstate_t st;
|
||||||
|
memset(&st, 0, sizeof(st));
|
||||||
|
#endif
|
||||||
|
if (p && *p && bufsz)
|
||||||
|
last = p + (bufsz - 1);
|
||||||
|
|
||||||
|
while (p && *p && p <= last) {
|
||||||
|
if (iscntrl((unsigned char) *p)) {
|
||||||
|
p++;
|
||||||
|
|
||||||
|
/* try detect "\e[x;ym" and skip on success */
|
||||||
|
if (*p && *p == '[') {
|
||||||
|
const char *e = p;
|
||||||
|
while (*e && e < last && *e != 'm')
|
||||||
|
e++;
|
||||||
|
if (*e == 'm')
|
||||||
|
p = e + 1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#ifdef HAVE_WIDECHAR
|
||||||
|
wchar_t wc;
|
||||||
|
size_t len = mbrtowc(&wc, p, MB_CUR_MAX, &st);
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
break;
|
||||||
|
if (len > 0 && iswprint(wc)) {
|
||||||
|
int x = wcwidth(wc);
|
||||||
|
if (x > 0)
|
||||||
|
width += x;
|
||||||
|
} else if (len == (size_t) -1 || len == (size_t) -2)
|
||||||
|
len = 1;
|
||||||
|
p += len;
|
||||||
|
#else
|
||||||
|
if (isprint((unsigned char) *p))
|
||||||
|
width++;
|
||||||
|
p++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t mbs_width(const char *s)
|
||||||
|
{
|
||||||
|
if (!s || !*s)
|
||||||
|
return 0;
|
||||||
|
return mbs_nwidth(s, strlen(s));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Counts number of cells in multibyte string. For all control and
|
* Counts number of cells in multibyte string. For all control and
|
||||||
|
|
Loading…
Reference in New Issue