Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 8312577 in mainline


Ignore:
Timestamp:
2012-08-17T11:44:43Z (9 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
lfn, master
Children:
1d5a540
Parents:
2f136e4
Message:

Add backwards search functionality to edit.

Location:
uspace/app/edit
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/edit/edit.c

    r2f136e4 r8312577  
    8787       
    8888        char *previous_search;
     89        bool previous_search_reverse;
    8990} pane_t;
    9091
     
    159160static void insert_clipboard_data(void);
    160161
    161 static void search(void);
    162 static void search_forward(char *pattern);
     162static void search(char *pattern, bool reverse);
     163static void search_prompt(bool reverse);
    163164static void search_repeat(void);
    164165
     
    417418                break;
    418419        case KC_F:
    419                 search();
     420                search_prompt(false);
    420421                break;
    421422        case KC_N:
     
    435436        case KC_RIGHT:
    436437                caret_move_word_right(true);
     438                break;
     439        case KC_F:
     440                search_prompt(true);
    437441                break;
    438442        default:
     
    11611165}
    11621166
     1167static int search_spt_reverse_producer(void *data, wchar_t *ret)
     1168{
     1169        assert(data != NULL);
     1170        assert(ret != NULL);
     1171        spt_t *spt = data;
     1172        *ret = spt_prev_char(*spt, spt);
     1173        return EOK;
     1174}
     1175
    11631176static int search_spt_mark(void *data, void **mark)
    11641177{
     
    11861199};
    11871200
     1201static search_ops_t search_spt_reverse_ops = {
     1202        .equals = char_exact_equals,
     1203        .producer = search_spt_reverse_producer,
     1204        .mark = search_spt_mark,
     1205        .mark_free = search_spt_mark_free,
     1206};
     1207
    11881208/** Ask for line and go to it. */
    1189 static void search(void)
     1209static void search_prompt(bool reverse)
    11901210{
    11911211        char *pattern;
     1212       
     1213        const char *prompt_text = "Find next";
     1214        if (reverse)
     1215                prompt_text = "Find previous";
    11921216       
    11931217        const char *default_value = "";
     
    11951219                default_value = pane.previous_search;
    11961220       
    1197         pattern = prompt("Search for", default_value);
     1221        pattern = prompt(prompt_text, default_value);
    11981222        if (pattern == NULL) {
    11991223                status_display("Search cancelled.");
     
    12041228                free(pane.previous_search);
    12051229        pane.previous_search = pattern;
    1206        
    1207         search_forward(pattern);
     1230        pane.previous_search_reverse = reverse;
     1231       
     1232        search(pattern, reverse);
    12081233}
    12091234
     
    12151240        }
    12161241       
    1217         search_forward(pane.previous_search);
    1218 }
    1219 
    1220 static void search_forward(char *pattern)
     1242        search(pane.previous_search, pane.previous_search_reverse);
     1243}
     1244
     1245static void search(char *pattern, bool reverse)
    12211246{
    12221247        status_display("Searching...");
     
    12251250        tag_get_pt(&pane.caret_pos, &sp);
    12261251       
    1227         /* Start searching on the position after caret */
    1228         spt_next_char(sp, &sp);
     1252        /* Start searching on the position before/after caret */
     1253        if (!reverse) {
     1254                spt_next_char(sp, &sp);
     1255        }
     1256        else {
     1257                spt_prev_char(sp, &sp);
     1258        }
    12291259        producer_pos = sp;
    12301260       
    1231         search_t *search = search_init(pattern, &producer_pos, search_spt_ops);
     1261        search_ops_t ops = search_spt_ops;
     1262        if (reverse)
     1263                ops = search_spt_reverse_ops;
     1264       
     1265        search_t *search = search_init(pattern, &producer_pos, ops, reverse);
    12321266        if (search == NULL) {
    12331267                status_display("Failed initializing search.");
     
    12491283                while (match.length > 0) {
    12501284                        match.length--;
    1251                         spt_prev_char(*end, end);
     1285                        if (reverse) {
     1286                                spt_next_char(*end, end);
     1287                        }
     1288                        else {
     1289                                spt_prev_char(*end, end);
     1290                        }
    12521291                }
    12531292                caret_move(*end, true, true);
  • uspace/app/edit/search.c

    r2f136e4 r8312577  
    4141#include "search_impl.h"
    4242
    43 search_t *search_init(const char *pattern, void *client_data, search_ops_t ops)
     43search_t *search_init(const char *pattern, void *client_data, search_ops_t ops,
     44    bool reverse)
    4445{
    4546        search_t *search = calloc(1, sizeof(search_t));
     
    4748                return NULL;
    4849       
    49         search->pattern = str_to_awstr(pattern);
    50         if (search->pattern == NULL) {
     50        wchar_t *p = str_to_awstr(pattern);
     51        if (p == NULL) {
    5152                free(search);
    5253                return NULL;
    5354        }
    5455       
     56        search->pattern_length = wstr_length(p);
     57       
     58        if (reverse) {
     59                /* Reverse the pattern */
     60                size_t pos, half;
     61                half = search->pattern_length / 2;
     62                for (pos = 0; pos < half; pos++) {
     63                        wchar_t tmp = p[pos];
     64                        p[pos] = p[search->pattern_length - pos - 1];
     65                        p[search->pattern_length - pos - 1] = tmp;
     66                }
     67        }
     68       
     69        search->pattern = p;
     70       
    5571        search->client_data = client_data;
    5672        search->ops = ops;
    57         search->pattern_length = wstr_length(search->pattern);
    5873        search->back_table = calloc(search->pattern_length, sizeof(ssize_t));
    5974        if (search->back_table == NULL) {
  • uspace/app/edit/search.h

    r2f136e4 r8312577  
    5959
    6060extern bool char_exact_equals(const wchar_t, const wchar_t);
    61 extern search_t *search_init(const char *, void *, search_ops_t);
     61extern search_t *search_init(const char *, void *, search_ops_t, bool);
    6262extern int search_next_match(search_t *, match_t *);
    6363extern void search_fini(search_t *);
Note: See TracChangeset for help on using the changeset viewer.