summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2026-04-24 00:21:18 -0400
committerJonathan Bradley <jcb@pikum.xyz>2026-04-24 00:32:37 -0400
commit610ce8238332a41cfb61a4e32c0185e1fb10132f (patch)
tree14362aed7865cd34a1064206aaf17843073e2293
initial commit: prints everything at once
-rw-r--r--.gitignore1
-rwxr-xr-xsrc/spreed.c143
-rw-r--r--test.txt16
3 files changed, 160 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5dee528
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/spreed
diff --git a/src/spreed.c b/src/spreed.c
new file mode 100755
index 0000000..933bec7
--- /dev/null
+++ b/src/spreed.c
@@ -0,0 +1,143 @@
+#if 0
+${CC:-gcc} -s -O2 -std=c99 -Wall -o ${SPREED_INSTALL_DIR:-.}/spreed src/spreed.c
+exit
+#endif
+
+/* TODO
+ * contractions don't work
+ * - result of trying to separate a+b
+ */
+
+#include <locale.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#define CLR_FG L"\033[31m"
+#define CLR_RESET L"\033[0m"
+
+uint8_t get_optimal_recognition_point(size_t len) {
+ static uint8_t orps[9] = {0,0,0,1,1,2,2,2,2};
+ if (len >= 10) return 3;
+ return orps[len-1];
+}
+
+int main(int argc, char *argv[])
+{
+ wchar_t word[48];
+ wchar_t wc;
+ size_t res;
+ int c;
+ char chararr[4] = {0};
+ uint8_t u, uu;
+ size_t ichar = 0, iword = 0;
+ uint8_t b_word_break = 0;
+
+ memset(word, 0, 48 * sizeof(wchar_t));
+ memset(chararr, 0, sizeof(chararr));
+
+ setlocale(LC_ALL, "");
+ fwide(stdout, 1);
+
+ fwprintf(stdout, L" V\n");
+ do {
+ b_word_break = 0;
+ c = getchar();
+ if (c == EOF) {
+ b_word_break = iword > 0;
+ goto END_OF_WORD;
+ }
+ chararr[ichar++] = (char)c;
+
+ res = mbrtowc(&wc, chararr, 4, NULL);
+ switch(res) {
+ case 0:
+ // null char
+ if (iword == 0 && ichar == 1) {
+ ichar = 0;
+ memset(chararr, 0, 4 * sizeof(char));
+ continue;
+ } else {
+ // fwprintf(stderr, L"cowabunga: %X %X, %lX\n", ichar, c, wc);
+ b_word_break = 1;
+ goto END_OF_WORD;
+ }
+ case (size_t)-2:
+ // incomplete wchar_t, keep reading bytes
+ continue;
+ case (size_t)-1:
+ if (ichar == 4) {
+ // emojis return (size_t)-1 until we have all the bytes
+ fwprintf(stderr, L"\nmbrtowc encoding error\n");
+ return 1;
+ }
+ continue;
+ }
+
+ ichar = 0;
+ memset(chararr, 0, 4 * sizeof(char));
+
+ // not a printable character, swallow
+ if (!iswprint(wc) && iword == 0) {
+ continue;
+ }
+
+ if (iswspace(wc)) {
+ if (iword == 0) {
+ continue;
+ }
+ b_word_break = 1;
+ }
+
+ if (iword > 0) {
+ if (iswpunct(word[iword-1]) != iswpunct(wc)) {
+ b_word_break = 1;
+ }
+ }
+
+END_OF_WORD:
+ ichar = 0;
+
+ if (b_word_break != 0 || iword == 37) {
+ if (iword == 0) {
+ fwprintf(stderr, L"\n0 length word\n");
+ return 2;
+ }
+ ichar = get_optimal_recognition_point(iword);
+ uu = 0;
+ putwchar('\r');
+ for (u = 0; u < 48; ++u) {
+ if (u < 10-ichar) {
+ putwchar(L' ');
+ continue;
+ }
+ if (uu < iword) {
+ if (u == 10) {
+ fwprintf(stdout, L"%ls", CLR_FG);
+ }
+ putwchar(word[uu++]);
+ if (u == 10) {
+ fwprintf(stdout, L"%ls", CLR_RESET);
+ }
+ continue;
+ }
+ putwchar(L' ');
+ }
+ putwchar('\n');
+
+ iword = 0;
+ memset(word, 0, 48 * sizeof(wchar_t));
+ }
+
+ ichar = 0;
+ if (!iswspace(wc)) {
+ word[iword++] = wc;
+ }
+
+ } while (c != EOF);
+ putwchar('\n');
+
+ return 0;
+}
diff --git a/test.txt b/test.txt
new file mode 100644
index 0000000..1b9def7
--- /dev/null
+++ b/test.txt
@@ -0,0 +1,16 @@
+this ain't workin
+1
+22
+333
+4444
+55555
+666666
+7777777
+88888888
+999999999
+0123456789
+001122334455
+alpha10numeric
+
+😐
+(1+1)==2