applied Ritesh's patch to stext handling with some minor modifications cb4951dd
Anselm R. Garbe · 2007-11-10 20:21 1 file(s) · +15 −10
dwm.c +15 −10
1287 1287
void
1288 1288
run(void) {
1289 1289
	char *p;
1290 +
	char buf[sizeof stext];
1290 1291
	fd_set rd;
1291 1292
	int r, xfd;
1292 1293
	unsigned int len, offset;
1298 1299
	readin = True;
1299 1300
	offset = 0;
1300 1301
	len = sizeof stext - 1;
1301 -
	stext[len] = '\0'; /* 0-terminator is never touched */
1302 +
	buf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
1302 1303
	while(running) {
1303 1304
		FD_ZERO(&rd);
1304 1305
		if(readin)
1310 1311
			eprint("select failed\n");
1311 1312
		}
1312 1313
		if(FD_ISSET(STDIN_FILENO, &rd)) {
1313 -
			switch((r = read(STDIN_FILENO, stext + offset, len - offset))) {
1314 +
			switch((r = read(STDIN_FILENO, buf + offset, len - offset))) {
1314 1315
			case -1:
1315 1316
				strncpy(stext, strerror(errno), len);
1316 1317
				readin = False;
1320 1321
				readin = False;
1321 1322
				break;
1322 1323
			default:
1323 -
				stext[offset + r] = '\0';
1324 -
				for(p = stext; *p && *p != '\n'; p++);
1325 -
				if(*p == '\n') {
1326 -
					*p = '\0';
1327 -
					offset = 0;
1328 -
				}
1329 -
				else
1330 -
					offset = (offset + r < len - 1) ? offset + r : 0;
1324 +
				for(p = buf + offset; r > 0; p++, r--, offset++)
1325 +
					if(*p == '\n' || *p == '\0') {
1326 +
						*p = '\0';
1327 +
						strncpy(stext, buf, len);
1328 +
						p += r - 1; /* p is buf + offset + r - 1 */
1329 +
						for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
1330 +
						offset = r;
1331 +
						if(r)
1332 +
							memmove(buf, p - r + 1, r);
1333 +
						break;
1334 +
					}
1335 +
				break;
1331 1336
			}
1332 1337
			drawbar();
1333 1338
		}