//#include "imtable.h" #include "boshiamy.h" #define IM_BUFFER_LEN 32 #define ENTER_KEY 0x0D #define BACKSPACE_KEY 0x7F //#define BACKSPACE_KEY '+' //setting it to the actual escape character interferes with arrow keys and //whatnot //#define ESCAPE_KEY 0x1B #define ESCAPE_KEY '`' //Vertical Tab Ctrl+K #define TOGGLE_KEY 0x0B char im_buffer[IM_BUFFER_LEN+1]; char im_buffer_pos = 0; int im_on = 1; //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 (input == TOGGLE_KEY) { im_on = !im_on; //clears the im buffer if its toggling off if (!im_on) { im_buffer[0] = 0; im_buffer_pos = 0; } } //just exit if the im is off if (!im_on) { output[0] = input; output[1] = 0; return 1; } if ( ('a' <= input && input <= 'z')||('0' <= input && input <= '9') ||(input == ' ') || (input == ',') || (input == '.')) { if ( (im_buffer_pos < IM_BUFFER_LEN) && (im_buffer_pos < IM_TABLE_ENTRY_LEN) ){ im_buffer[im_buffer_pos] = input; im_buffer_pos++; im_buffer[im_buffer_pos] = 0; } else { //passthrough output[0] = input; output[1] = 0; return 1; } //if there's a match return it int im_entry = im_search(im_buffer, 0, IM_TABLE_LEN); if (im_entry != -1) { //clear the buffer im_buffer[0] = 0; im_buffer_pos = 0; strncpy(output, im_table[im_entry][1], IM_TABLE_ENTRY_LEN); return strlen(im_table[im_entry][1]); } } else { //these only do something if there's something in the buffer, otherwise //passthrough if (im_buffer_pos > 0) { switch (input) { //escape, cancels case ESCAPE_KEY: im_buffer[0] = 0; im_buffer_pos = 0; return 0; break; //enter, enters the buffer case ENTER_KEY: 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; } }