2 Revīzijas f11f8c603b ... cb8b12940f

Autors SHA1 Ziņojums Datums
  Kevin "The Nuclear" Bloom cb8b12940f fixed bug that caused crash due to hiliting 2 mēneši atpakaļ
  Kevin "The Nuclear" Bloom c57dd6309f made dynamic-expand more GNU Emacs-like 2 mēneši atpakaļ
2 mainītis faili ar 29 papildinājumiem un 17 dzēšanām
  1. 27 17
      command.c
  2. 2 0
      hilite.c

+ 27 - 17
command.c

@@ -1923,9 +1923,9 @@ void dynamically_expand()
   if(dynaex.query == NULL) {
     dynaex.end = curbp->b_point;
     dynaex.start = curbp->b_point-1;
-    dynaex.sp = 0;
     while(isalpha(*(p = ptr(curbp, --dynaex.start))) || isdigit(*p) || *p == '_')
       ;;
+    dynaex.sp = dynaex.start;
     dynaex.start++;
     dynaex.nquery = dynaex.end - dynaex.start;
     dynaex.nresult = dynaex.nquery;
@@ -1940,35 +1940,46 @@ void dynamically_expand()
   }
 
 restart:
-  while (dynaex.sp < endpoint) {
-    if(dynaex.sp >= dynaex.start && dynaex.sp <= dynaex.end) {
-      dynaex.sp++;
-      continue;
+  i = dynaex.nquery-1;
+  j = i;
+  int dir = -1;
+  point_t match = 0;
+  while (!(dynaex.sp >= dynaex.start && dynaex.sp <= dynaex.end)) {
+    if(dynaex.sp == -1) {
+      dynaex.sp = endpoint;
     }
     p = ptr(curbp, dynaex.sp);
-    if(i == dynaex.nquery) {
+    if(i == -1) {
       if(!isalpha(*p) && !isdigit(*p) && *p != '_') {
+        dynaex.sp = match;
         break;
       }
       result[j] = *p;
       result[++j] = '\0';
     } else if(*p == dynaex.query[i]) {
       result[j] = dynaex.query[i];
-      i++;
-      j++;
+      i--;
+      j--;
+      if(i == -1) {
+        j = dynaex.nquery;
+        dir = 1;
+        match = dynaex.sp;
+        dynaex.sp += dynaex.nquery - 1;
+      }
     } else if(i > 0) {
-      i = 0;
-      j = 0;
+      i = dynaex.nquery-1;
+      j = i;
+      dir = -1;
     }
-    dynaex.sp++;
+    dynaex.sp += dir;
   }
 
   currentcommand = KBD_EXPAND;
 
-  if(dynaex.sp == endpoint) {
+  if(dynaex.sp >= dynaex.start && dynaex.sp <= dynaex.end) {
     msg("No dynamic expansion for \"%s\" found.", dynaex.query);
     /* Free the struct so we can loop again */
-    dynaex.sp = 0;
+    dynaex.sp = dynaex.start - 1;
     dr = dynaex.results;
     while(dynaex.results != NULL) {
       dr = dynaex.results;
@@ -1986,18 +1997,17 @@ restart:
   }
 
   /* Check if the match has been used before, if so, skip it. */
-  for(dr = dynaex.results; dr->result != NULL; dr = dr->d_next) {
+  for(dr = dynaex.results; dr != NULL && dr->result != NULL; dr = dr->d_next) {
     int k = 0;
     for(; dr->result[k] != '\0'; k++) {
       if(dr->result[k] != result[k])
         break;
     }
-    if(dr->result[k] == '\0') {
+    if(dr->result[k] == '\0' && result[k] == '\0') {
       i = 0;
       j = 0;
       goto restart;
-    } else
-      break;
+    }
   }
 
   curbp->b_point = dynaex.start;

+ 2 - 0
hilite.c

@@ -231,6 +231,8 @@ int parse_text(buffer_t *bp, point_t pt)
                 t = 2;
                 break;
               }
+              if(pt+k == pos(bp, bp->b_ebuf))
+                break;
               c_now = get_at(bp, pt+k);
             }
             if(t == 0) {