aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp131
1 files changed, 72 insertions, 59 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 97e9dce..7565371 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,72 +1,85 @@
-#include "../include/reader.h"
-
-int main(int argc, char *argv[]) {
- try {
- editor_cfg *cfg = (editor_cfg *)malloc(sizeof(editor_cfg));
- if (cfg == nullptr) {
- die("[err]: malloc failed\n");
- }
-
- enable_raw(cfg);
- init_editor(cfg);
-
- int speed { 250000 };
-
- if (argc < 2)
- die("[err]: no file provided!\n");
-
- if (argc > 3)
- die("[err]: too many arguments!\n");
-
- if (argc == 3) {
- if (!is_number(argv[2]))
- die("[err]: invalid speed interval provided!\n");
- speed = std::stoi(argv[2]);
- }
+/* main.cpp - reader: RSVP-style terminal word reader */
- FILE *fp = fopen(argv[1], "r");
+#define _POSIX_C_SOURCE 200809L
- if (fp == nullptr)
- die("[err]: fopen failed\n");
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
- fseek(fp, 0, SEEK_END);
- long size = ftell(fp);
- rewind(fp);
+#include <string>
+#include <vector>
- std::string content(size, '\0');
- fread(content.data(), 1, size, fp);
-
- fclose(fp);
-
- std::vector<std::string> data;
- split(content, data, " \t\r\n,;:!?");
+#include "../include/reader.h"
- while(1) {
- for (std::string &k: data) {
- if (k.empty()) continue;
- window_size_callback(cfg);
- editor_refresh_scrn(cfg);
- int mid = k.size() / 2;
+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;
+
+ cfg = (EditorCfg *)malloc(sizeof(EditorCfg));
+ speed = 250000;
+
+ if (!cfg)
+ die("[err]: malloc failed\n");
+
+ enable_raw(cfg);
+ init_editor(cfg);
+
+ if (argc < 2)
+ die("[err]: no file provided!\n");
+ if (argc > 3)
+ die("[err]: too many arguments!\n");
+
+ if (argc == 3) {
+ if (!is_number(argv[2]))
+ die("[err]: invalid speed interval provided!\n");
+ speed = atoi(argv[2]);
+ }
- write(STDOUT_FILENO, k.substr(0, mid).c_str(), mid);
+ fp = fopen(argv[1], "r");
+ if (!fp)
+ die("[err]: fopen failed\n");
+
+ fseek(fp, 0, SEEK_END);
+ size = ftell(fp);
+ rewind(fp);
+
+ content.resize(size, '\0');
+ fread(&content[0], 1, size, fp);
+ fclose(fp);
+
+ split(content, data, " \t\r\n,;:!?");
+
+ for (;;) {
+ for (i = 0; i < data.size(); i++) {
+ k = &data[i];
+ if (k->empty())
+ continue;
+ window_size_callback(cfg);
+ editor_refresh_scrn(cfg);
+ {
+ int mid = (int)k->size() / 2;
+ int remaining = (int)k->size() - mid - 1;
+ const char *cstr = k->c_str();
+
+ write(STDOUT_FILENO, cstr, mid);
write(STDOUT_FILENO, "\x1b[31m", 5);
- write(STDOUT_FILENO, k.substr(mid, 1).c_str(), 1);
+ write(STDOUT_FILENO, cstr + mid, 1);
write(STDOUT_FILENO, "\x1b[m", 3);
-
- int remaining = k.size() - mid - 1;
-
- write(STDOUT_FILENO, k.substr(mid + 1, remaining).c_str(), remaining);
- usleep(speed);
+ write(STDOUT_FILENO, cstr + mid + 1, remaining);
}
+ usleep(speed);
}
-
- free(cfg);
-
- } catch (const std::exception &e) {
- die(e.what());
- } catch (...) {
- die("[err]: Unknown exception occurred\n");
}
+ free(cfg);
return 0;
-} /* main.cpp */
+}