dwmblocks

Kris's build of dwmblocks
git clone git clone https://git.krisyotam.com/krisyotam/dwmblocks.git
Log | Files | Refs | README | LICENSE

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 }