Moved the buffer edition into dedicated functions.
[selector.git] / selector.cc
index c936029..50a852b 100644 (file)
@@ -210,6 +210,65 @@ void initialize_matcher(int use_regexp, int case_sensitive,
   }
 }
 
+//////////////////////////////////////////////////////////////////////
+// Buffer edition
+
+void delete_char(char *buffer, int *position) {
+  if(buffer[*position]) {
+    int c = *position;
+    while(c < buffer_size && buffer[c]) {
+      buffer[c] = buffer[c+1];
+      c++;
+    }
+  }
+}
+
+void backspace_char(char *buffer, int *position) {
+  if(*position > 0) {
+    if(buffer[*position]) {
+      int c = *position - 1;
+      while(buffer[c]) {
+        buffer[c] = buffer[c+1];
+        c++;
+      }
+    } else {
+      buffer[*position - 1] = '\0';
+    }
+
+    (*position)--;
+  }
+}
+
+void insert_char(char *buffer, int *position, char character) {
+  if(strlen(buffer) < buffer_size - 1) {
+    int c = *position;
+    char t = buffer[c], u;
+    while(t) {
+      c++;
+      u = buffer[c];
+      buffer[c] = t;
+      t = u;
+    }
+    c++;
+    buffer[c] = '\0';
+    buffer[(*position)++] = character;
+  }
+}
+
+void kill_before_cursor(char *buffer, int *position) {
+  int s = 0;
+  while(buffer[*position + s]) {
+    buffer[s] = buffer[*position + s];
+    s++;
+  }
+  buffer[s] = '\0';
+  *position = 0;
+}
+
+void kill_after_cursor(char *buffer, int *position) {
+  buffer[*position] = '\0';
+}
+
 //////////////////////////////////////////////////////////////////////
 
 int previous_visible(int current_line, int nb_lines, char **lines, matcher_t *matcher) {
@@ -746,6 +805,17 @@ int main(int argc, char **argv) {
 
   update_screen(&current_line, &temporary_line, 0, nb_lines, lines, cursor_position, pattern);
 
+  // ^@ \000
+  // ^A \001
+  // ...
+  // ^Z \032
+  // ^[ \033
+  // ^\ \034
+  // ^] \035
+  // ^^ \036
+  // ^_ \037
+  // ^? \177
+
   do {
 
     key = getch();
@@ -753,42 +823,15 @@ int main(int argc, char **argv) {
     int motion = 0;
 
     if(key >= ' ' && key <= '~') { // Insert character
-      int c = cursor_position;
-      char t = pattern[c], u;
-      while(t) {
-        c++;
-        u = pattern[c];
-        pattern[c] = t;
-        t = u;
-      }
-      c++;
-      pattern[c] = '\0';
-      pattern[cursor_position++] = key;
+      insert_char(pattern, &cursor_position, key);
     }
 
-    else if(key == KEY_BACKSPACE || key == '\b' || key == '\7f') {
-      if(cursor_position > 0) {
-        if(pattern[cursor_position]) {
-          int c = cursor_position-1;
-          while(pattern[c]) {
-            pattern[c] = pattern[c+1];
-            c++;
-          }
-        } else {
-          pattern[cursor_position - 1] = '\0';
-        }
-        cursor_position--;
-      }
+    else if(key == KEY_BACKSPACE || key == '\010' || key == '\177') {
+      backspace_char(pattern, &cursor_position);
     }
 
-    else if(key == KEY_DC || key == '\ 4') {
-      if(pattern[cursor_position]) {
-        int c = cursor_position;
-        while(pattern[c]) {
-          pattern[c] = pattern[c+1];
-          c++;
-        }
-      }
+    else if(key == KEY_DC || key == '\004') {
+      delete_char(pattern, &cursor_position);
     }
 
     else if(key == KEY_HOME) {
@@ -807,52 +850,46 @@ int main(int argc, char **argv) {
       motion = -10;
     }
 
-    else if(key == KEY_DOWN || key == '\ e') {
+    else if(key == KEY_DOWN || key == '\014') {
       motion = 1;
     }
 
-    else if(key == KEY_UP || key == '\10') {
+    else if(key == KEY_UP || key == '\016') {
       motion = -1;
     }
 
-    else if(key == KEY_LEFT || key == '\ 2') {
+    else if(key == KEY_LEFT || key == '\002') {
       if(cursor_position > 0) cursor_position--;
     }
 
-    else if(key == KEY_RIGHT || key == '\ 6') {
+    else if(key == KEY_RIGHT || key == '\006') {
       if(pattern[cursor_position]) cursor_position++;
     }
 
-    else if(key == '\ 1') {
+    else if(key == '\001') {
       cursor_position = 0;
     }
 
-    else if(key == '\ 5') {
+    else if(key == '\005') {
       cursor_position = strlen(pattern);
     }
 
-    else if(key == '\12') {
+    else if(key == '\022') {
       use_regexp = !use_regexp;
     }
 
-    else if(key == '\15') {
-      int s = 0;
-      while(pattern[cursor_position + s]) {
-        pattern[s] = pattern[cursor_position + s];
-        s++;
-      }
-      pattern[s] = '\0';
-      cursor_position = 0;
+    else if(key == '\025') {
+      kill_before_cursor(pattern, &cursor_position);
     }
 
-    else if(key == '\v') {
-      pattern[cursor_position] = '\0';
+    else if(key == '\013') {
+      kill_after_cursor(pattern, &cursor_position);
     }
 
     update_screen(&current_line, &temporary_line, motion,
                   nb_lines, lines, cursor_position, pattern);
 
-  } while(key != '\n' && key != KEY_ENTER && key != '\a');
+  } while(key != '\n' && key != KEY_ENTER && key != '\007');
 
   echo();
   curs_set(1);