8 Commits

Author SHA1 Message Date
a400cdf5ad update README.
Some checks are pending
Release / Bump Homebrew formula (push) Waiting to run
2025-11-22 01:44:41 -08:00
c8a43fb328 typo in release 2025-11-22 01:41:14 -08:00
3ea7c31cba update workflow 2025-11-22 01:39:45 -08:00
115091e517 add deployment workflow
Some checks are pending
Release / GoReleaser (push) Waiting to run
Release / Bump Homebrew formula (push) Waiting to run
2025-11-22 01:32:58 -08:00
1b9b618e3a backout 2025-11-22 01:27:44 -08:00
527759de09 broke it 2025-11-22 01:18:04 -08:00
8a724cfc87 fix assert 2025-11-21 23:49:33 -08:00
c03d184a05 updating cmakelists 2025-11-21 23:43:24 -08:00
5 changed files with 116 additions and 15 deletions

37
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: Release
on:
push:
tags:
- 'v*'
workflow_dispatch: {}
permissions:
contents: write
jobs:
homebrew:
name: Bump Homebrew formula
# Skip this job in case of git pushes to prerelease tags
if: ${{ github.event_name != 'push' || !contains(github.ref, '-') }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Extract version
id: extract-version
run: |
echo "tag-name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- uses: mislav/bump-homebrew-formula-action@v3
with:
formula-name: ke
formula-path: Formula/ke.rb
homebrew-tap: kisom/homebrew-tap
base-branch: master
commit-message: |
{{formulaName}} {{version}}
Created by https://github.com/mislav/bump-homebrew-formula-action
env:
COMMITTER_TOKEN: ${{ secrets.GH_CPAT }}

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.log
build

View File

@@ -2,13 +2,17 @@ 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 "1.0.0") set(KE_VERSION "1.0.4")
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")
# Add executable # Add executable
add_executable(ke main.c) add_executable(ke main.c)
# Define KE_VERSION for use in C code (e.g., #define KE_VERSION) # Define KE_VERSION for use in C code (e.g., #define KE_VERSION)
target_compile_definitions(ke PRIVATE KE_VERSION="${KE_VERSION}") target_compile_definitions(ke PRIVATE KE_VERSION="ke version ${KE_VERSION}")
# Set output properties # Set output properties
set_target_properties(ke PROPERTIES set_target_properties(ke PROPERTIES

View File

@@ -6,4 +6,6 @@ used fairly often.
See the man page for more info. See the man page for more info.
It should be available via homebrew, even.
Released under an ISC license. Released under an ISC license.

82
main.c
View File

@@ -44,6 +44,39 @@
#define TAB_STOP 8 #define TAB_STOP 8
#define INITIAL_BUFSIZE 64
int
next_power_of_2(int n)
{
n--;
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n+1;
}
/*
* cap_growth is a generalized strategy to growing buffers.
*/
int
cap_growth(int cap, int sz)
{
if (cap == 0) {
return INITIAL_BUFSIZE;
}
while (sz < cap) {
cap = next_power_of_2(cap);
}
return cap;
}
/* /*
* Function and struct declarations. * Function and struct declarations.
*/ */
@@ -67,6 +100,8 @@ struct erow {
int size; int size;
int rsize; int rsize;
int cap;
}; };
char nibble_to_hex(char c); char nibble_to_hex(char c);
@@ -181,7 +216,7 @@ init_editor(void)
editor.rows = 0; editor.rows = 0;
if (get_winsz(&editor.rows, &editor.cols) == -1) { if (get_winsz(&editor.rows, &editor.cols) == -1) {
die("can't get window size - is this an interactive terminal?"); // die("can't get window size - is this an interactive terminal?");
} }
editor.rows--; /* status bar */ editor.rows--; /* status bar */
editor.rows--; /* message line */ editor.rows--; /* message line */
@@ -229,17 +264,17 @@ ab_append(struct abuf *buf, const char *s, int len)
char *nc = buf->b; char *nc = buf->b;
int sz; int sz;
assert((delta <= 0 && buf->len < INT_MAX - delta)); assert((delta >= 0 && buf->len < INT_MAX - delta));
sz = buf->len + delta; sz = buf->len + delta;
if (sz >= buf->cap) { if (sz > buf->cap) {
if (buf->cap == 0) { if (buf->cap == 0) {
buf->cap = 1; buf->cap = 64;
} }
while (sz > buf->cap) { while (sz < buf->cap) {
if (buf->cap < INT_MAX/2) { if (buf->cap > INT_MAX/2) {
buf->cap *= INT_MAX; buf->cap = INT_MAX;
break; break;
} }
buf->cap *= 2; buf->cap *= 2;
@@ -373,8 +408,9 @@ erow_init(struct erow *row, int len)
row->rsize = 0; row->rsize = 0;
row->render = NULL; row->render = NULL;
row->line = NULL; row->line = NULL;
row->cap = cap_growth(0, len);
row->line = malloc(len+1); row->line = malloc(row->cap);
assert(row->line != NULL); assert(row->line != NULL);
if (row->line == NULL) { if (row->line == NULL) {
return -1; return -1;
@@ -513,6 +549,9 @@ row_append_row(struct erow *row, char *s, int len)
void void
row_insert_ch(struct erow *row, int at, int16_t c) row_insert_ch(struct erow *row, int at, int16_t c)
{ {
int ncap = 0;
char *nline = NULL;
/* /*
* row_insert_ch just concerns itself with how to update a row. * row_insert_ch just concerns itself with how to update a row.
*/ */
@@ -521,6 +560,19 @@ row_insert_ch(struct erow *row, int at, int16_t c)
} }
assert(c > 0); assert(c > 0);
if (row->size == row->cap) {
ncap = cap_growth(row->cap, row->size+1);
nline = realloc(row->line, ncap);
assert(nline != NULL);
if (nline == NULL) {
return;
}
row->cap = ncap;
row->line = nline;
}
row->line = realloc(row->line, row->size+2); row->line = realloc(row->line, row->size+2);
assert(row->line != NULL); assert(row->line != NULL);
memmove(&row->line[at+1], &row->line[at], row->size - at + 1); memmove(&row->line[at+1], &row->line[at], row->size - at + 1);
@@ -1368,7 +1420,6 @@ draw_rows(struct abuf *ab)
ab_append(ab, "|", 1); ab_append(ab, "|", 1);
} }
} else { } else {
erow_update(&editor.row[filerow]);
buflen = editor.row[filerow].rsize - editor.coloffs; buflen = editor.row[filerow].rsize - editor.coloffs;
if (buflen < 0) { if (buflen < 0) {
buflen = 0; buflen = 0;
@@ -1377,6 +1428,7 @@ draw_rows(struct abuf *ab)
if (buflen > editor.cols) { if (buflen > editor.cols) {
buflen = editor.cols; buflen = editor.cols;
} }
ab_append(ab, editor.row[filerow].render+editor.coloffs, ab_append(ab, editor.row[filerow].render+editor.coloffs,
buflen); buflen);
} }
@@ -1519,10 +1571,10 @@ editor_set_status(const char *fmt, ...)
void void
loop(void) loop(void)
{ {
int up = 1; /* update on the first runthrough */ display_refresh();
while (1) { while (1) {
if (up) display_refresh(); int update = 0;
/* /*
* ke should only refresh the display if it has received keyboard * ke should only refresh the display if it has received keyboard
@@ -1530,8 +1582,12 @@ loop(void)
* handling pastes without massive screen flicker. * handling pastes without massive screen flicker.
* *
*/ */
if ((up = process_keypress()) != 0) { while (process_keypress()) {
while (process_keypress()) ; update = 1;
}
if (update) {
display_refresh();
} }
} }
} }