Fixed search for first symbol in string.
[midnight-commander.git] / src / viewer / plain.c
blob346c4e9b4ef6a4a36dfbca0f621265a1e74ace0f
1 /*
2 Internal file viewer for the Midnight Commander
3 Function for plain view
5 Copyright (C) 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
6 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
8 Written by: 1994, 1995, 1998 Miguel de Icaza
9 1994, 1995 Janne Kukonlehto
10 1995 Jakub Jelinek
11 1996 Joseph M. Hinkle
12 1997 Norbert Warmuth
13 1998 Pavel Machek
14 2004 Roland Illig <roland.illig@gmx.de>
15 2005 Roland Illig <roland.illig@gmx.de>
16 2009 Slava Zanko <slavazanko@google.com>
17 2009 Andrew Borodin <aborodin@vmail.ru>
18 2009 Ilia Maslakov <il.smind@gmail.com>
19 2010 Andrew Borodin <aborodin@vmail.ru>
21 This file is part of the Midnight Commander.
23 The Midnight Commander is free software; you can redistribute it
24 and/or modify it under the terms of the GNU General Public License as
25 published by the Free Software Foundation; either version 2 of the
26 License, or (at your option) any later version.
28 The Midnight Commander is distributed in the hope that it will be
29 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
30 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
31 General Public License for more details.
33 You should have received a copy of the GNU General Public License
34 along with this program; if not, write to the Free Software
35 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
36 MA 02110-1301, USA.
39 #include <config.h>
41 #include "lib/global.h"
42 #include "lib/tty/tty.h"
43 #include "lib/skin.h"
44 #include "lib/util.h" /* is_printable() */
45 #include "lib/charsets.h"
47 #include "src/setup.h" /* option_tab_spacing */
49 #include "internal.h"
50 #include "mcviewer.h" /* mcview_show_eof */
52 /*** global variables ****************************************************************************/
54 /*** file scope macro definitions ****************************************************************/
56 /*** file scope type declarations ****************************************************************/
58 /*** file scope variables ************************************************************************/
60 /*** file scope functions ************************************************************************/
61 /* --------------------------------------------------------------------------------------------- */
63 /* --------------------------------------------------------------------------------------------- */
64 /*** public functions ****************************************************************************/
65 /* --------------------------------------------------------------------------------------------- */
67 void
68 mcview_display_text (mcview_t * view)
70 const screen_dimen left = view->data_area.left;
71 const screen_dimen top = view->data_area.top;
72 const screen_dimen width = view->data_area.width;
73 const screen_dimen height = view->data_area.height;
74 screen_dimen row = 0, col = 0;
75 off_t from;
76 int cw = 1;
77 int c, prev_ch = 0;
78 gboolean last_row = TRUE;
79 struct hexedit_change_node *curr = view->change_list;
81 mcview_display_clean (view);
82 mcview_display_ruler (view);
84 /* Find the first displayable changed byte */
85 from = view->dpy_start;
86 while ((curr != NULL) && (curr->offset < from))
87 curr = curr->next;
89 while (TRUE)
91 tty_setcolor (NORMAL_COLOR);
93 if (row >= height)
94 break;
96 #ifdef HAVE_CHARSET
97 if (view->utf8)
99 gboolean read_res = TRUE;
101 c = mcview_get_utf (view, from, &cw, &read_res);
102 if (!read_res)
103 break;
105 else
106 #endif
107 if (!mcview_get_byte (view, from, &c))
108 break;
110 last_row = FALSE;
111 from++;
112 if (cw > 1)
113 from += cw - 1;
115 if (c != '\n' && prev_ch == '\r')
117 if (++row >= height)
118 break;
120 col = 0;
121 /* tty_print_anychar ('\n'); */
124 prev_ch = c;
125 if (c == '\r')
126 continue;
128 if (c == '\n')
130 col = 0;
131 row++;
132 continue;
135 if (col >= width && view->text_wrap_mode)
137 col = 0;
138 if (++row >= height)
139 break;
142 if (c == '\t')
144 col += (option_tab_spacing - col % option_tab_spacing);
145 if (view->text_wrap_mode && col >= width && width != 0)
147 row += col / width;
148 col %= width;
150 continue;
153 if (view->search_start <= from && from < view->search_end)
154 tty_setcolor (SELECTED_COLOR);
156 if (((off_t) col >= view->dpy_text_column)
157 && ((off_t) col - view->dpy_text_column < (off_t) width))
159 widget_move (view, top + row, left + ((off_t) col - view->dpy_text_column));
160 #ifdef HAVE_CHARSET
161 if (mc_global.utf8_display)
163 if (!view->utf8)
164 c = convert_from_8bit_to_utf_c ((unsigned char) c, view->converter);
165 if (!g_unichar_isprint (c))
166 c = '.';
168 else if (view->utf8)
169 c = convert_from_utf_to_current_c (c, view->converter);
170 else
171 #endif
173 c = convert_to_display_c (c);
175 if (!is_printable (c))
176 c = '.';
179 tty_print_anychar (c);
182 col++;
184 #ifdef HAVE_CHARSET
185 if (view->utf8)
187 if (g_unichar_iswide (c))
188 col++;
189 else if (g_unichar_iszerowidth (c))
190 col--;
192 #endif
195 view->dpy_end = from;
196 if (mcview_show_eof != NULL && mcview_show_eof[0] != '\0')
198 if (last_row && mcview_get_byte (view, from - 1, &c))
199 if (c != '\n')
200 row--;
201 while (++row < height)
203 widget_move (view, top + row, left);
204 tty_print_string (mcview_show_eof);
209 /* --------------------------------------------------------------------------------------------- */