summaryrefslogtreecommitdiff
path: root/programs/sub-suite/shift_line.c
diff options
context:
space:
mode:
Diffstat (limited to 'programs/sub-suite/shift_line.c')
-rw-r--r--programs/sub-suite/shift_line.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/programs/sub-suite/shift_line.c b/programs/sub-suite/shift_line.c
new file mode 100644
index 0000000..255d21b
--- /dev/null
+++ b/programs/sub-suite/shift_line.c
@@ -0,0 +1,79 @@
+#include <stdint.h>
+
+const uint8_t bits[8] = {
+ 0x80,
+ 0x40,
+ 0x20,
+ 0x10,
+ 0x08,
+ 0x04,
+ 0x02,
+ 0x01
+};
+
+int maxcol = 80;
+int scr_str = 0;
+int scr_row = 0;
+int scr_col = 0;
+uint8_t bitabl[16];
+
+uint8_t bitpos(unsigned int row, uint8_t *mask) {
+ uint8_t bit = row & 7;
+ *mask = bits[bit];
+ return row >> 3;
+
+}
+
+void setbit(unsigned int row) {
+ uint8_t mask;
+ uint8_t byte = bitpos(row, &mask);
+ bitabl[byte] |= mask;
+}
+
+void clrbit(unsigned int row) {
+ uint8_t mask;
+ uint8_t byte = bitpos(row, &mask);
+ bitabl[byte] &= ~mask;
+}
+
+int find_end(char *str, int start) {
+ int i;
+ for (i = start; str[i]; i++);
+ return i;
+}
+
+void shift_line(char *str, int cursor, int left) {
+ /*int cursor = ((scr_row+scr_str)*maxcol)+scr_col;*/
+ int end = find_end(str, cursor);
+ if (left) {
+ int i = end-1;
+ int j = end;
+ for (; i > cursor; i--, j--) {
+ if (i < 0) {
+ i = 0;
+ str[i] = 0;
+ break;
+ }
+ str[j] = str[i];
+ str[i] = 0;
+
+ }
+ /*str[i+1] = (!str[i+1]) ? ' ' : str[i+1];*/
+ end = find_end(str, i+2);
+ /*str[i+1] = (str[i+1] == ' ') ? 0 : str[i+1];*/
+ if ((end/maxcol) > scr_row) {
+ setbit(end/maxcol);
+ }
+ } else {
+ int i = cursor;
+ int j = cursor-1;
+ for (; str[i]; i++, j++) {
+ str[j] = str[i];
+ str[i] = 0;
+ }
+ end = find_end(str, i);
+ if ((end % maxcol) == 0 && (end/maxcol) > scr_row) {
+ clrbit(end/maxcol);
+ }
+ }
+}