Code

wreadln: use memmove() instead of an temporary buffer
authorMax Kellermann <max@duempel.org>
Mon, 6 Oct 2008 12:55:31 +0000 (14:55 +0200)
committerMax Kellermann <max@duempel.org>
Mon, 6 Oct 2008 12:55:31 +0000 (14:55 +0200)
memmove() handles overlapping buffers well, we can use it to get room
for the inserted character.

src/wreadln.c

index f10b8c23f96c125f890b7ddc187ae4415c869ac2..0bfc414086a7ac541b990d776492a74f146576c0 100644 (file)
@@ -122,16 +122,11 @@ wreadln_insert_byte(struct wreadln *wr, gint key)
 {
        if (strlen(wr->line + wr->cursor)) { /* if the cursor is */
                /* not at the last pos */
-               gchar *tmp = NULL;
                gsize rest = strlen(wr->line + wr->cursor) + 1;
 
-               tmp = g_malloc0(rest);
-               g_strlcpy (tmp, wr->line + wr->cursor, rest);
+               memmove(wr->line + wr->cursor + 1,
+                       wr->line + wr->cursor, rest);
                wr->line[wr->cursor] = key;
-               wr->line[wr->cursor + 1] = 0;
-               g_strlcat(&wr->line[wr->cursor + 1], tmp, rest);
-               g_free(tmp);
-               cursor_move_right(wr);
        } else {
                wr->line[wr->cursor + 1] = 0;
                wr->line[wr->cursor] = key;