summaryrefslogtreecommitdiff
path: root/im.h
diff options
context:
space:
mode:
Diffstat (limited to 'im.h')
-rw-r--r--im.h93
1 files changed, 93 insertions, 0 deletions
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 <im_buffer_pos; i++) {
+ output[i] = im_buffer[i];
+ }
+ output[im_buffer_pos] = 0;
+ int tmp = im_buffer_pos;
+ im_buffer_pos = 0;
+ return tmp;
+ break;
+ //backspace
+ case 0x08:
+ if (im_buffer_pos > 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;
+
+}