=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/less/search.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/less/search.c 2011/09/21 19:01:49 1.7 --- src/usr.bin/less/search.c 2014/04/25 13:38:21 1.8 *************** *** 1,11 **** /* ! * Copyright (C) 1984-2011 Mark Nudelman * * You may distribute under the terms of either the GNU General Public * License or the Less License, as specified in the README file. * ! * For more information about less, or for information on how to ! * contact the author, see the README file. */ --- 1,10 ---- /* ! * Copyright (C) 1984-2012 Mark Nudelman * * You may distribute under the terms of either the GNU General Public * License or the Less License, as specified in the README file. * ! * For more information, see the README file. */ *************** *** 66,71 **** --- 65,76 ---- char* text; int search_type; }; + + #if NO_REGEX + #define info_compiled(info) ((void*)0) + #else + #define info_compiled(info) ((info)->compiled) + #endif static struct pattern_info search_info; static struct pattern_info filter_info; *************** *** 98,107 **** char *pattern; int search_type; { if (pattern == NULL) ! CLEAR_PATTERN(search_info.compiled); else if (compile_pattern(pattern, search_type, &info->compiled) < 0) return -1; /* Pattern compiled successfully; save the text too. */ if (info->text != NULL) free(info->text); --- 103,114 ---- char *pattern; int search_type; { + #if !NO_REGEX if (pattern == NULL) ! CLEAR_PATTERN(info->compiled); else if (compile_pattern(pattern, search_type, &info->compiled) < 0) return -1; + #endif /* Pattern compiled successfully; save the text too. */ if (info->text != NULL) free(info->text); *************** *** 132,138 **** --- 139,147 ---- if (info->text != NULL) free(info->text); info->text = NULL; + #if !NO_REGEX uncompile_pattern(&info->compiled); + #endif } /* *************** *** 188,196 **** prev_pattern(info) struct pattern_info *info; { ! if (info->search_type & SRCH_NO_REGEX) ! return (info->text != NULL); ! return (!is_null_pattern(info->compiled)); } #if HILITE_SEARCH --- 197,207 ---- prev_pattern(info) struct pattern_info *info; { ! #if !NO_REGEX ! if ((info->search_type & SRCH_NO_REGEX) == 0) ! return (!is_null_pattern(info->compiled)); ! #endif ! return (info->text != NULL); } #if HILITE_SEARCH *************** *** 473,478 **** --- 484,530 ---- } /* + * Hilight every character in a range of displayed characters. + */ + static void + create_hilites(linepos, start_index, end_index, chpos) + POSITION linepos; + int start_index; + int end_index; + int *chpos; + { + struct hilite *hl; + int i; + + /* Start the first hilite. */ + hl = (struct hilite *) ecalloc(1, sizeof(struct hilite)); + hl->hl_startpos = linepos + chpos[start_index]; + + /* + * Step through the displayed chars. + * If the source position (before cvt) of the char is one more + * than the source pos of the previous char (the usual case), + * just increase the size of the current hilite by one. + * Otherwise (there are backspaces or something involved), + * finish the current hilite and start a new one. + */ + for (i = start_index+1; i <= end_index; i++) + { + if (chpos[i] != chpos[i-1] + 1 || i == end_index) + { + hl->hl_endpos = linepos + chpos[i-1] + 1; + add_hilite(&hilite_anchor, hl); + /* Start new hilite unless this is the last char. */ + if (i < end_index) + { + hl = (struct hilite *) ecalloc(1, sizeof(struct hilite)); + hl->hl_startpos = linepos + chpos[i]; + } + } + } + } + + /* * Make a hilite for each string in a physical line which matches * the current pattern. * sp,ep delimit the first match already found. *************** *** 489,495 **** { char *searchp; char *line_end = line + line_len; - struct hilite *hl; if (sp == NULL || ep == NULL) return; --- 541,546 ---- *************** *** 505,517 **** */ searchp = line; do { ! if (ep > sp) ! { ! hl = (struct hilite *) ecalloc(1, sizeof(struct hilite)); ! hl->hl_startpos = linepos + chpos[sp-line]; ! hl->hl_endpos = linepos + chpos[ep-line]; ! add_hilite(&hilite_anchor, hl); ! } /* * If we matched more than zero characters, * move to the first char after the string we matched. --- 556,562 ---- */ searchp = line; do { ! create_hilites(linepos, sp-line, ep-line, chpos); /* * If we matched more than zero characters, * move to the first char after the string we matched. *************** *** 523,529 **** searchp++; else /* end of line */ break; ! } while (match_pattern(search_info.compiled, search_info.text, searchp, line_end - searchp, &sp, &ep, 1, search_info.search_type)); } #endif --- 568,574 ---- searchp++; else /* end of line */ break; ! } while (match_pattern(info_compiled(&search_info), search_info.text, searchp, line_end - searchp, &sp, &ep, 1, search_info.search_type)); } #endif *************** *** 795,801 **** * If so, add an entry to the filter list. */ if ((search_type & SRCH_FIND_ALL) && prev_pattern(&filter_info)) { ! int line_filter = match_pattern(filter_info.compiled, filter_info.text, cline, line_len, &sp, &ep, 0, filter_info.search_type); if (line_filter) { --- 840,846 ---- * If so, add an entry to the filter list. */ if ((search_type & SRCH_FIND_ALL) && prev_pattern(&filter_info)) { ! int line_filter = match_pattern(info_compiled(&filter_info), filter_info.text, cline, line_len, &sp, &ep, 0, filter_info.search_type); if (line_filter) { *************** *** 815,821 **** */ if (prev_pattern(&search_info)) { ! line_match = match_pattern(search_info.compiled, search_info.text, cline, line_len, &sp, &ep, 0, search_type); if (line_match) { --- 860,866 ---- */ if (prev_pattern(&search_info)) { ! line_match = match_pattern(info_compiled(&search_info), search_info.text, cline, line_len, &sp, &ep, 0, search_type); if (line_match) {