Optimised and corrected updatestatus function

This commit is contained in:
Ashish Kumar Yadav 2020-07-29 22:36:15 +05:30
parent 74621edcab
commit 2d876bcd55

View file

@ -13,8 +13,7 @@
#define LOCKFILE "/tmp/dwmblocks.pid"
#define NILL INT_MIN
#define EMPTYCMDOUT(block) (block->cmdoutcur[0] == '\n' || block->cmdoutcur[0] == '\0')
#define NOTATCMDOUTEND(block, i) (i < CMDLENGTH && block->cmdoutcur[i] != '\n' && block->cmdoutcur[i] != '\0')
#define EMPTYCMDOUT(block) (*(block->cmdoutcur) == '\n' || *(block->cmdoutcur) == '\0')
typedef struct {
char *pathu;
@ -209,60 +208,72 @@ termhandler(int signum)
int
updatestatus()
{
int i;
char *str = statusstr;
Block *current;
char *s = statusstr;
char *c, *p; /* for cmdoutcur and cmdoutprv */
const char *d; /* for delimiter */
Block *current = blocks;
for (current = blocks; current->pathu; current++) {
if (EMPTYCMDOUT(current)) {
if (current->cmdoutprv[0] != current->cmdoutcur[0]) {
current->cmdoutprv[0] = current->cmdoutcur[0];
/* checking half of the function */
/* skip empty blocks */
while (current->pathu && EMPTYCMDOUT(current)) {
if (*(current->cmdoutprv) != *(current->cmdoutcur)) {
*(current->cmdoutprv) = *(current->cmdoutcur);
current++;
goto update0;
}
continue;
current++;
}
i = 0;
/* skip delimiter in front of the first non-empty block */
if (current->pathu)
goto skipdelimc;
else
return 0;
/* main loop */
for (; current->pathu; current++) {
s += delimlength;
skipdelimc:
c = current->cmdoutcur; p = current->cmdoutprv;
do {
if (current->cmdoutcur[i] == current->cmdoutprv[i]) {
i++;
continue;
} else {
str += i;
if (*c != *p) {
s += (c - current->cmdoutcur);
goto update1;
}
} while (NOTATCMDOUTEND(current, i));
str += i;
c++; p++;
} while (*c != '\n' && *c != '\0');
s += (c - current->cmdoutcur);
if (current->pathc && current->signal)
str++;
if (*str == '\0')
goto update2;
str += delimlength;
s++;
}
return 0;
update0:
for (; current->pathu; current++) {
if (EMPTYCMDOUT(current)) {
current->cmdoutprv[0] = current->cmdoutcur[0];
continue;
/* updating half of the function */
/* skip empty blocks */
while (current->pathu && EMPTYCMDOUT(current)) {
*(current->cmdoutprv) = *(current->cmdoutcur);
current++;
}
i = 0;
/* skip delimiter in front of the first non-empty block */
if (current->pathu)
goto skipdelimu;
else
return 1;
/* main loop */
for (; current->pathu; current++) {
d = delim;
while (*d)
*(s++) = *(d++);
*(s++) = '\n'; /* to mark the end of delimiter */
skipdelimu:
c = current->cmdoutcur; p = current->cmdoutprv;
update1:
do {
*(str++) = current->cmdoutcur[i];
current->cmdoutprv[i] = current->cmdoutcur[i];
i++;
} while (NOTATCMDOUTEND(current, i));
*(s++) = *c;
*p = *c;
p++; c++;
} while (*c != '\n' && *c != '\0');
if (current->pathc && current->signal)
*(str++) = current->signal;
update2:
for (i = 0; delim[i]; i++)
*(str++) = delim[i];
*(str++) = '\n';
*(s++) = current->signal;
}
/* remove delimiter at the end if not all blocks are empty */
if (str != statusstr)
*(str - delimlength) = '\0';
return 1;
}