+static void act_search_backwards (void) {
+ int len, posn, dfapos;
+ DFA dfa;
+ static unsigned char sblk[SEARCH_BLK];
+ static char withdef[] = "Search backward (default=last): ";
+ static char withoutdef[] = "Search backward: ";
+
+ if (!search_prompt(withdef, withoutdef))
+ return;
+
+ dfa = last_search->reverse;
+ len = last_search->len;
+ dfapos = 0;
+
+ posn = cur_pos + len - 1;
+ if (posn >= file_size)
+ posn = file_size;
+
+ for (; posn >= 0; posn--) {
+ unsigned char *q;
+ int size = SEARCH_BLK;
+
+ if (size > posn)
+ size = posn;
+ buf_fetch_data (filedata, sblk, size, posn-size);
+ q = sblk + size;
+ while (size--) {
+ posn--;
+ dfapos = dfa[dfapos][*--q];
+ if (dfapos == len) {
+ int new_top;
+
+ cur_pos = posn;
+ edit_type = !!edit_type;
+ new_top = cur_pos - (scrlines-1) * width;
+ new_top = begline(new_top);
+ if (top_pos > new_top)
+ top_pos = new_top;
+ return;
+ }
+ }
+ }
+ strcpy (message, "Not found.");
+}
+