Compare commits
2 Commits
undo-syste
...
v2.1.2
| Author | SHA1 | Date | |
|---|---|---|---|
| 9dc0547796 | |||
| 85e9f33613 |
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.15)
|
|||||||
project(ke C) # Specify C language explicitly
|
project(ke C) # Specify C language explicitly
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 99)
|
||||||
set(KE_VERSION "2.1.0")
|
set(KE_VERSION "2.1.2")
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "-Wall -Wextra -pedantic -Wshadow -Werror -std=c99 -g -Werror=stringop-truncation")
|
set(CMAKE_C_FLAGS "-Wall -Wextra -pedantic -Wshadow -Werror -std=c99 -g -Werror=stringop-truncation")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DEFAULT_SOURCE -D_XOPEN_SOURCE")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DEFAULT_SOURCE -D_XOPEN_SOURCE")
|
||||||
@@ -35,4 +35,3 @@ install(FILES ke.1 TYPE MAN)
|
|||||||
|
|
||||||
install(TARGETS ke RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS ke RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
install(FILES ke.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
install(FILES ke.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
||||||
|
|
||||||
|
|||||||
25
main.c
25
main.c
@@ -1905,7 +1905,6 @@ move_cursor(const int16_t c, const int interactive)
|
|||||||
void
|
void
|
||||||
newline(void)
|
newline(void)
|
||||||
{
|
{
|
||||||
abuf *row = NULL;
|
|
||||||
size_t rhs_len = 0;
|
size_t rhs_len = 0;
|
||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
|
|
||||||
@@ -1918,24 +1917,30 @@ newline(void)
|
|||||||
ECURY++;
|
ECURY++;
|
||||||
ECURX = 0;
|
ECURX = 0;
|
||||||
} else {
|
} else {
|
||||||
row = &EROW[ECURY];
|
/*
|
||||||
rhs_len = row->size - (size_t) ECURX;
|
* IMPORTANT: Do not keep a pointer to EROW[ECURY] across erow_insert(),
|
||||||
|
* as erow_insert() may realloc the rows array and invalidate it.
|
||||||
|
*/
|
||||||
|
rhs_len = EROW[ECURY].size - (size_t)ECURX;
|
||||||
if (rhs_len > 0) {
|
if (rhs_len > 0) {
|
||||||
tmp = malloc(rhs_len);
|
tmp = malloc(rhs_len);
|
||||||
assert(tmp != NULL);
|
assert(tmp != NULL);
|
||||||
memcpy(tmp, &row->b[ECURX], rhs_len);
|
memcpy(tmp, &EROW[ECURY].b[ECURX], rhs_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
row->size = ECURX;
|
/* Insert the right-hand side as a new row first (may realloc rows). */
|
||||||
if (row->cap <= row->size) {
|
|
||||||
ab_resize(row, row->size + 1);
|
|
||||||
}
|
|
||||||
row->b[row->size] = '\0';
|
|
||||||
|
|
||||||
erow_insert(ECURY + 1, tmp ? tmp : "", (int)rhs_len);
|
erow_insert(ECURY + 1, tmp ? tmp : "", (int)rhs_len);
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Now safely shrink the original row (re-fetch by index). */
|
||||||
|
EROW[ECURY].size = ECURX;
|
||||||
|
if (EROW[ECURY].cap <= EROW[ECURY].size) {
|
||||||
|
ab_resize(&EROW[ECURY], EROW[ECURY].size + 1);
|
||||||
|
}
|
||||||
|
EROW[ECURY].b[EROW[ECURY].size] = '\0';
|
||||||
|
|
||||||
ECURY++;
|
ECURY++;
|
||||||
ECURX = 0;
|
ECURX = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user