Handle UTF-8 characters properly for CMDLENGTH

This commit is contained in:
Utkarsh Verma 2022-04-19 16:48:17 +05:30
parent c720d07df8
commit f04d21fa22
No known key found for this signature in database
GPG Key ID: 817656CF818EFCCC
2 changed files with 15 additions and 10 deletions

View File

@ -1,4 +1,4 @@
#define CMDLENGTH 60
#define CMDLENGTH 45
#define DELIMITER " "
#define CLICKABLE_BLOCKS

23
main.c
View File

@ -39,14 +39,17 @@ static Display* dpy;
static int screen;
static Window root;
static unsigned short statusContinue = 1;
static char outputs[LEN(blocks)][CMDLENGTH + 1 + CLICKABLE_BLOCKS];
static char statusBar[2][LEN(blocks) * (LEN(outputs[0]) - 1) + (LEN(blocks) - 1 + LEADING_DELIMITER) * (LEN(DELIMITER) - 1) + 1];
static struct epoll_event event, events[LEN(blocks) + 2];
static int pipes[LEN(blocks)][2];
static int timerPipe[2];
static int signalFD;
static int epollFD;
static int execLock = 0;
// Longest UTF-8 character is 4 bytes long
static char outputs[LEN(blocks)][CMDLENGTH * 4 + 1 + CLICKABLE_BLOCKS];
static char statusBar[2][LEN(blocks) * (LEN(outputs[0]) - 1) + (LEN(blocks) - 1 + LEADING_DELIMITER) * (LEN(DELIMITER) - 1) + 1];
void (*writeStatus)();
int gcd(int a, int b) {
@ -110,19 +113,21 @@ void updateBlock(int i) {
char buffer[LEN(outputs[0]) - CLICKABLE_BLOCKS];
int bytesRead = read(pipes[i][0], buffer, LEN(buffer));
// Trim UTF-8 characters properly
int j = bytesRead - 1;
while ((buffer[j] & 0b11000000) == 0x80)
j--;
// Trim UTF-8 string to desired length
int count = 0, j = 0;
while (buffer[j] != '\n' && count <= CMDLENGTH) {
// Increment count for non-continuation bytes
if ((buffer[j++] & 0xc0) != 0x80)
count++;
}
// Cache last character and replace it with a trailing space
char ch = buffer[j];
buffer[j] = ' ';
// Trim trailing spaces
while (buffer[j] == ' ')
j--;
buffer[j + 1] = '\0';
while (j >= 0 && buffer[j] == ' ') j--;
buffer[j + 1] = 0;
// Clear the pipe
if (bytesRead == LEN(buffer)) {