aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAakarsh Kashyap <[email protected]>2026-06-29 22:27:45 +0530
committerAakarsh Kashyap <[email protected]>2026-06-29 22:27:45 +0530
commit36db9ebac493aa07a08c8a92a1380d253e05718e (patch)
tree70b528aa4ca444f2251d01787307225c551f8d91 /src
parent53a8f41171179663cebdb9afbee5de88f8b6bbd4 (diff)
input handling using SCSP ring buffer
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp33
-rw-r--r--src/reader.cpp46
2 files changed, 67 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7565371..4959eef 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,5 +1,6 @@
/* main.cpp - reader: RSVP-style terminal word reader */
+#include <thread>
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
@@ -15,18 +16,18 @@
int
main(int argc, char *argv[])
{
- EditorCfg *cfg;
- FILE *fp;
- long size;
- int speed;
- std::string content;
- std::vector<std::string> data;
- size_t i;
- std::string *k;
+ EditorCfg *cfg;
+ FILE *fp;
+ long size;
+ std::string content;
+ std::vector<std::string> data;
+ size_t i;
+ std::string *k;
+ SCPCQueue<char> queue(1024);
cfg = (EditorCfg *)malloc(sizeof(EditorCfg));
- speed = 250000;
-
+ cfg->speed = 250000;
+ int& speed = cfg->speed;
if (!cfg)
die("[err]: malloc failed\n");
@@ -58,6 +59,8 @@ main(int argc, char *argv[])
split(content, data, " \t\r\n,;:!?");
+ std::thread input_thread(producer, std::ref(queue));
+
for (;;) {
for (i = 0; i < data.size(); i++) {
k = &data[i];
@@ -65,16 +68,26 @@ main(int argc, char *argv[])
continue;
window_size_callback(cfg);
editor_refresh_scrn(cfg);
+ consumer(queue, cfg);
{
int mid = (int)k->size() / 2;
int remaining = (int)k->size() - mid - 1;
const char *cstr = k->c_str();
+ const char message[] = "Current delay: ";
+ char buf[32];
+ int len{};
+
write(STDOUT_FILENO, cstr, mid);
write(STDOUT_FILENO, "\x1b[31m", 5);
write(STDOUT_FILENO, cstr + mid, 1);
write(STDOUT_FILENO, "\x1b[m", 3);
write(STDOUT_FILENO, cstr + mid + 1, remaining);
+
+ write(STDOUT_FILENO, "\x1b[H", 3);
+ write(STDOUT_FILENO, message, sizeof(message)-1);
+ len = snprintf(buf, sizeof(buf), "%d", cfg->speed);
+ write(STDOUT_FILENO, buf, len);
}
usleep(speed);
}
diff --git a/src/reader.cpp b/src/reader.cpp
index 4bc88a6..eec7478 100644
--- a/src/reader.cpp
+++ b/src/reader.cpp
@@ -144,7 +144,7 @@ window_size_callback(EditorCfg *cfg)
if (get_window_size(&rows, &cols) < 0) {
fprintf(stderr,
- "[err]: window_size_callback: get_window_size\n");
+ "[err]: window_size_callback: get_window_size\n");
return;
}
if (cfg->screenrows != rows || cfg->screencols != cols) {
@@ -188,7 +188,7 @@ editor_refresh_scrn(EditorCfg *cfg)
ab_append(&ab, "\x1b[2J", 4);
memset(buff, 0, sizeof(buff));
snprintf(buff, sizeof(buff), "\x1b[%d;%dH",
- cfg->screenrows / 2, cfg->screencols / 2);
+ cfg->screenrows / 2, cfg->screencols / 2);
ab_append(&ab, buff, strlen(buff));
ab_write(&ab);
ab_free(&ab);
@@ -227,3 +227,45 @@ split(const std::string &txt,
}
return strings.size();
}
+
+static void
+editor_process_key_process(char c, EditorCfg *cfg)
+{
+
+ switch (c)
+ {
+ case CTRL_KEY('q'):
+ write(STDOUT_FILENO, "\x1b[2J", 4);
+ write(STDOUT_FILENO, "\x1b[H", 3);
+ exit(0);
+ break;
+ case CTRL_KEY('j'):
+ cfg->speed += 10000;
+ break;
+ case CTRL_KEY('k'):
+ cfg->speed -= 10000;
+ break;
+ }
+}
+
+void
+producer(SCPCQueue<char> &queue)
+{
+ for (;;) {
+ char value = editor_readkey();
+ queue.push(value);
+ }
+}
+
+void
+consumer(SCPCQueue<char> &queue, EditorCfg *cfg)
+{
+ for (;;) {
+ char value{};
+ if (queue.pop(value)) {
+ editor_process_key_process(value, cfg);
+ } else {
+ break;
+ }
+ }
+}