Changeset 8312577 in mainline for uspace/app/edit/edit.c


Ignore:
Timestamp:
2012-08-17T11:44:43Z (12 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1d5a540
Parents:
2f136e4
Message:

Add backwards search functionality to edit.

File:
1 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);
Note: See TracChangeset for help on using the changeset viewer.