util.c (1010B)
1 #include "util.h" 2 3 #define UTF8_MULTIBYTE_BIT BIT(7) 4 5 unsigned int gcd(unsigned int a, unsigned int b) { 6 while (b > 0) { 7 const unsigned int temp = a % b; 8 a = b; 9 b = temp; 10 } 11 12 return a; 13 } 14 15 size_t truncate_utf8_string(char* const buffer, const size_t size, 16 const size_t char_limit) { 17 size_t char_count = 0; 18 size_t i = 0; 19 while (char_count < char_limit) { 20 char ch = buffer[i]; 21 if (ch == '\0') { 22 break; 23 } 24 25 unsigned short skip = 1; 26 27 // Multibyte unicode character. 28 if ((ch & UTF8_MULTIBYTE_BIT) != 0) { 29 // Skip continuation bytes. 30 ch <<= 1; 31 while ((ch & UTF8_MULTIBYTE_BIT) != 0) { 32 ch <<= 1; 33 ++skip; 34 } 35 } 36 37 // Avoid buffer overflow. 38 if (i + skip >= size) { 39 break; 40 } 41 42 ++char_count; 43 i += skip; 44 } 45 46 buffer[i] = '\0'; 47 48 return i + 1; 49 }