Преглед на файлове

add dynamic allocated input buffer

Jan Klemkow преди 6 години
родител
ревизия
5e42d0b7db
променени са 2 файла, в които са добавени 21 реда и са изтрити 12 реда
  1. 0 1
      TODO
  2. 21 11
      scroll.c

+ 0 - 1
TODO

@@ -1,5 +1,4 @@
  * strlen function which is aware of ESC sequences and unicode
- * dynamic input buffer
  * Alternative Screen mode detection
  * scroll down function
  * scroll/jump to buttom on new input

+ 21 - 11
scroll.c

@@ -83,18 +83,18 @@ reset(void)
 }
 
 void
-addline(char *str)
+addline(char *str, size_t size)
 {
 	struct line *line = malloc(sizeof *line);
 
 	if (line == NULL)
 		die("malloc:");
 
-	line->len = strlen(str);
-	line->str = strdup(str);
-
+	line->len = size;
+	line->str = malloc(size);
 	if (line->str == NULL)
-		die("strdup");
+		die("malloc:");
+	memcpy(line->str, str, size);
 
 	bottom = line;
 
@@ -185,8 +185,12 @@ main(int argc, char *argv[])
 		die("tcsetattr:");
 
 	fd_set rd;
-	char buf[10000], *p = buf;
-	memset(buf, 0, sizeof buf);
+	size_t size = BUFSIZ, pos = 0;
+	char *buf = calloc(size, sizeof *buf);
+	if (buf == NULL)
+		die("calloc:");
+	memset(buf, 0, size);
+
 	for (;;) {
 		char c;
 
@@ -208,11 +212,17 @@ main(int argc, char *argv[])
 		if (FD_ISSET(mfd, &rd)) {
 			if (read(mfd, &c, 1) <= 0 && errno != EINTR)
 				die("read:");
-			*p++ = c;
+			buf[pos++] = c;
+			if (pos == size) {
+				size *= 2;
+				buf = realloc(buf, size);
+				if (buf == NULL)
+					die("realloc:");
+			}
 			if (c == '\n') {
-				p = buf;
-				addline(buf);
-				memset(buf, 0, sizeof buf);
+				addline(buf, pos);
+				memset(buf, 0, size);
+				pos = 0;
 			}
 			if (write(STDOUT_FILENO, &c, 1) == -1)
 				die("write:");