49 lines
1,010 B
C
49 lines
1,010 B
C
#include "util.h"
|
|
|
|
#define UTF8_MULTIBYTE_BIT BIT(7)
|
|
|
|
unsigned int gcd(unsigned int a, unsigned int b) {
|
|
while (b > 0) {
|
|
const unsigned int temp = a % b;
|
|
a = b;
|
|
b = temp;
|
|
}
|
|
|
|
return a;
|
|
}
|
|
|
|
size_t truncate_utf8_string(char* const buffer, const size_t size,
|
|
const size_t char_limit) {
|
|
size_t char_count = 0;
|
|
size_t i = 0;
|
|
while (char_count < char_limit) {
|
|
char ch = buffer[i];
|
|
if (ch == '\0') {
|
|
break;
|
|
}
|
|
|
|
unsigned short skip = 1;
|
|
|
|
// Multibyte unicode character.
|
|
if ((ch & UTF8_MULTIBYTE_BIT) != 0) {
|
|
// Skip continuation bytes.
|
|
ch <<= 1;
|
|
while ((ch & UTF8_MULTIBYTE_BIT) != 0) {
|
|
ch <<= 1;
|
|
++skip;
|
|
}
|
|
}
|
|
|
|
// Avoid buffer overflow.
|
|
if (i + skip >= size) {
|
|
break;
|
|
}
|
|
|
|
++char_count;
|
|
i += skip;
|
|
}
|
|
|
|
buffer[i] = '\0';
|
|
|
|
return i + 1;
|
|
}
|