3 Commits

Author SHA1 Message Date
fc86d0cb4e Remove Linux only build flag.
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
2025-11-30 13:15:07 -08:00
9dc0547796 bump version
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
2025-11-30 13:11:00 -08:00
85e9f33613 Fix newline on darwin.
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
2025-11-28 22:01:46 -08:00
2 changed files with 19 additions and 15 deletions

View File

@@ -2,9 +2,9 @@ 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.3")
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")
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")
# Optionally enable AddressSanitizer (ASan) # Optionally enable AddressSanitizer (ASan)
@@ -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)

27
main.c
View File

@@ -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) { erow_insert(ECURY + 1, tmp ? tmp : "", (int)rhs_len);
ab_resize(row, row->size + 1);
}
row->b[row->size] = '\0';
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;
} }