From 33c523fdef955c60fb81ccf3e30b8eace12933c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Haoran=20S=2E=20Diao=20=28=E5=88=81=E6=B5=A9=E7=84=B6=29?= <0@hairydiode.xyz> Date: Fri, 5 Sep 2025 23:33:59 -0700 Subject: tty intercept works --- im.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 im.h (limited to 'im.h') diff --git a/im.h b/im.h new file mode 100644 index 0000000..4980938 --- /dev/null +++ b/im.h @@ -0,0 +1,93 @@ +#include "imtable.h" +#define IM_BUFFER_LEN 32 +char im_buffer[IM_BUFFER_LEN]; +char im_buffer_pos = 0; +//recursive search, returns -1 on failure +//searches from [start, end) +int im_search(char * input, int start, int end) { + // 0 width search + if (end <= start) { + return -1; + } + //test for middle, works even for 1 width middle=start + int middle = start + (end-start)/2; + printf("testing:%s\n",im_table[middle][0]); + int test = strncmp(im_table[middle][0], input, IM_TABLE_ENTRY_LEN); + if (test == 0) { + return middle; + } + //special case for width 1,2 region + if ((end - start) == 1) { + if (test == 0) { + return start; + } else { + return -1; + } + } + if (test == 0) { + return 0; + } else { + if (test > 0) { + return im_search(input,start,middle); + } else { + return im_search(input,middle,end); + } + } + +} +//returns output len, since we want to be able to handle null bytes as well +int update_im_state(char input, char * output) { + if ( ('a' <= input <= 'z')||('0' <= input <= '9')||(input == ' ') ) { + if (im_buffer_pos < IM_BUFFER_LEN) { + im_buffer[im_buffer_pos] = input; + im_buffer_pos++; + } else { + //passthrough + output[0] = input; + output[1] = 0; + return 1; + } + } + int im_entry = im_search(im_buffer,0, IM_TABLE_LEN); + if (im_entry != -1) { + strncpy(output, im_table[im_entry][1], IM_TABLE_ENTRY_LEN); + im_buffer[0] = 0; + im_buffer_pos = 0; + return strlen(im_table[im_entry][1]); + } + //these only do something if there's something in the buffer, otherwise + //passthrough + if (im_buffer_pos > 0) { + switch (input) { + //escape, cancels + case 0x1B: + im_buffer[0] = 0; + im_buffer_pos = 0; + return 0; + break; + //enter, enters the buffer + case 0x0A: + for (int i = 0; i 0) { + im_buffer_pos--; + im_buffer[im_buffer_pos] = 0; + } + return 0; + break; + } + } + //default behavior of passthrough + output[0] = input; + output[1] = 0; + return 1; + +} -- cgit v1.1