summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rw-r--r--bin/klon.c111
1 files changed, 53 insertions, 58 deletions
diff --git a/bin/klon.c b/bin/klon.c
index d78b8a39..735b2ed6 100644
--- a/bin/klon.c
+++ b/bin/klon.c
@@ -155,13 +155,6 @@ static bool canTable(const struct Stack *table, uint8_t card) {
     return (card & MASK_RANK) == (get(table, 0) & MASK_RANK) - 1;
 }
 
-static struct Stack *autoFound(uint8_t card) {
-    for (int i = 0; i < 4; ++i) {
-        if (canFound(&g.found[i], card)) return &g.found[i];
-    }
-    return NULL;
-}
-
 enum {
     PAIR_EMPTY = 1,
     PAIR_BACK,
@@ -260,34 +253,31 @@ static void render(void) {
 static struct Stack *src;
 static uint8_t depth;
 
-static void select(struct Stack *stack) {
-    if (!get(stack, 0)) return;
-    if (src != stack) {
-        src = stack;
-        depth = 0;
-    }
+static void deepen(void) {
+    assert(src);
     if (depth == len(src)) return;
     if (!(get(src, depth) & MASK_UP)) return;
     src->data[src->index + depth] |= MASK_SELECT;
-    depth += 1;
+    depth++;
 }
 
-static void commit(struct Stack *dest) {
-    for (int i = 0; i < depth; ++i) {
-        src->data[src->index + i] &= ~MASK_SELECT;
-    }
-    checkpoint();
-    transfer(dest, src, depth);
-    src = NULL;
+static void select(struct Stack *stack) {
+    if (!get(stack, 0)) return;
+    src = stack;
     depth = 0;
+    deepen();
 }
 
-static void cancel(void) {
+static void commit(struct Stack *dest) {
+    assert(src);
     for (int i = 0; i < depth; ++i) {
         src->data[src->index + i] &= ~MASK_SELECT;
     }
+    if (dest) {
+        checkpoint();
+        transfer(dest, src, depth);
+    }
     src = NULL;
-    depth = 0;
 }
 
 int main() {
@@ -302,49 +292,54 @@ int main() {
         render();
 
         int c = getch();
-        if (src) {
-            if (c >= 'a' && c <= 'd' && depth == 1) {
-                if (canFound(&g.found[c - 'a'], get(src, 0))) {
-                    commit(&g.found[c - 'a']);
+        if (!src) {
+            if (c == 'q') {
+                break;
+            } else if (c == 'u') {
+                undo();
+            } else if (c == 's' || c == ' ') {
+                if (get(&g.stock, 0)) {
+                    checkpoint();
+                    draw();
                 } else {
-                    cancel();
+                    wasted();
                 }
-            } else if ((c == 'f' || c == '\n') && depth == 1) {
-                struct Stack *found = autoFound(get(src, 0));
-                if (found) {
-                    commit(found);
+            } else if (c == 'w') {
+                select(&g.waste);
+            } else if (c >= 'a' && c <= 'd') {
+                select(&g.found[c - 'a']);
+            } else if (c >= '1' && c <= '7') {
+                select(&g.table[c - '1']);
+            }
+
+        } else {
+            if (c >= '1' && c <= '7') {
+                struct Stack *table = &g.table[c - '1'];
+                if (src == table) {
+                    deepen();
+                } else if (canTable(table, get(src, depth - 1))) {
+                    commit(table);
                 } else {
-                    cancel();
+                    commit(NULL);
                 }
-            } else if (c >= '1' && c <= '7') {
-                if (src == &g.table[c - '1']) {
-                    select(&g.table[c - '1']);
-                } else if (canTable(&g.table[c - '1'], get(src, depth - 1))) {
-                    commit(&g.table[c - '1']);
+            } else if (depth == 1 && c >= 'a' && c <= 'd') {
+                struct Stack *found = &g.found[c - 'a'];
+                if (canFound(found, get(src, 0))) {
+                    commit(found);
                 } else {
-                    cancel();
+                    commit(NULL);
                 }
+            } else if (depth == 1 && (c == 'f' || c == '\n')) {
+                struct Stack *found;
+                for (int i = 0; i < 4; ++i) {
+                    found = &g.found[i];
+                    if (canFound(found, get(src, 0))) break;
+                    found = NULL;
+                }
+                commit(found);
             } else {
-                cancel();
-            }
-
-        } else if (c == 's' || c == ' ') {
-            checkpoint();
-            if (get(&g.stock, 0)) {
-                draw();
-            } else {
-                wasted();
+                commit(NULL);
             }
-        } else if (c == 'w') {
-            select(&g.waste);
-        } else if (c >= '1' && c <= '7') {
-            select(&g.table[c - '1']);
-        } else if (c >= 'a' && c <= 'd') {
-            select(&g.found[c - 'a']);
-        } else if (c == 'u') {
-            undo();
-        } else if (c == 'q') {
-            break;
         }
     }
 
2021-09-21Recalculate various lengths only as neededJune McEnroe This actually speeds things up quite a bit, saving roughly a second on a big PNG screenshot. Almost all the remaining time is spent in deflate. 2021-09-21Rewrite pngo, add explicit optionsJune McEnroe Interesting to see how my code habits have changed. 2021-09-16Fix /* **/ comment matchingJune McEnroe 2021-09-15Remove typer, add downgrade to READMEJune McEnroe 2021-09-15Set bot mode on downgradeJune McEnroe 2021-09-15Enter capsicum in downgradeJune McEnroe 2021-09-15Factor out common parts of downgrade messagesJune McEnroe Also bump the message cap to 1024 because that is ostensibly useful for replying to older messages. 2021-09-14Add downgrade IRC botJune McEnroe 2021-09-14Sort by title if authors matchJune McEnroe There are probably better things to sort by but title definitely always exists. 2021-09-13Swap-remove tags as they're foundJune McEnroe This makes it even faster. From ~1s on a sqlite3.c amalgamation to ~0.85s. 2021-09-12Replace htagml regex with strncmpJune McEnroe Since ctags only ever produces regular expressions of the form /^re$/ or /^re/ with no other special characters, instead unescape the pattern and simply use strncmp. Running on a sqlite3.c amalgamation, the regex version takes ~37s while the strncmp version takes ~1s, producing identical output. Big win! 2021-09-11Also defer printing comment for lone close-parensJune McEnroe 2021-09-10Publish "git-comment"June McEnroe 2021-09-10Add git comment --pretty optionJune McEnroe 2021-09-08Defer printing comment if line is blank or closing braceJune McEnroe This fixes badly indented comments. 2021-09-08Up default min-repeat to 30 linesJune McEnroe 2021-09-08Handle dirty lines in git-commentJune McEnroe 2021-09-08Document and install git-commentJune McEnroe 2021-09-08Add repeat and all options to git-commentJune McEnroe 2021-09-08Add group threshold to git-commentJune McEnroe