1/* $FreeBSD: head/contrib/libreadline/display.c 165675 2006-12-31 09:22:31Z ache $ */
2/* display.c -- readline redisplay facility. */
3
4/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
5
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
8
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2, or
12 (at your option) any later version.
--- 42 unchanged lines hidden (view full) ---
55
56#include "rlprivate.h"
57#include "xmalloc.h"
58
59#if !defined (strchr) && !defined (__STDC__)
60extern char *strchr (), *strrchr ();
61#endif /* !strchr && !__STDC__ */
62
63static void update_line PARAMS((char *, char *, int, int, int, int));
64static void space_to_eol PARAMS((int));
65static void delete_chars PARAMS((int));
66static void insert_some_chars PARAMS((char *, int, int));
67static void cr PARAMS((void));
68
69#if defined (HANDLE_MULTIBYTE)
70static int _rl_col_width PARAMS((const char *, int, int));
71static int *_rl_wrapped_line;
72#else
73# define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s))
74#endif
75
76static int *inv_lbreaks, *vis_lbreaks;
77static int inv_lbsize, vis_lbsize;
78
79/* Heuristic used to decide whether it is faster to move from CUR to NEW
80 by backing up or outputting a carriage return and moving forward. CUR
81 and NEW are either both buffer positions or absolute screen positions. */
82#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new)))
83
84/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a
85 buffer index in others. This macro is used when deciding whether the
86 current cursor position is in the middle of a prompt string containing
87 invisible characters. */
88#define PROMPT_ENDING_INDEX \
89 ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1)
90
91
92/* **************************************************************** */
93/* */
94/* Display stuff */
95/* */
96/* **************************************************************** */
97
98/* This is the stuff that is hard for me. I never seem to write good
99 display routines in C. Let's see how I do this time. */
--- 36 unchanged lines hidden (view full) ---
136/* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale
137 supporting multibyte characters, and an absolute cursor position when
138 in such a locale. This is an artifact of the donated multibyte support.
139 Care must be taken when modifying its value. */
140int _rl_last_c_pos = 0;
141int _rl_last_v_pos = 0;
142
143static int cpos_adjusted;
144static int cpos_buffer_position;
145
146/* Number of lines currently on screen minus 1. */
147int _rl_vis_botlin = 0;
148
149/* Variables used only in this file. */
150/* The last left edge of text that was displayed. This is used when
151 doing horizontal scrolling. It shifts in thirds of a screenwidth. */
152static int last_lmargin;
--- 11 unchanged lines hidden (view full) ---
164
165/* Default and initial buffer size. Can grow. */
166static int line_size = 1024;
167
168/* Variables to keep track of the expanded prompt string, which may
169 include invisible characters. */
170
171static char *local_prompt, *local_prompt_prefix;
172static int local_prompt_len;
173static int prompt_visible_length, prompt_prefix_length;
174
175/* The number of invisible characters in the line currently being
176 displayed on the screen. */
177static int visible_wrap_offset;
178
179/* The number of invisible characters in the prompt string. Static so it
180 can be shared between rl_redisplay and update_line */
--- 19 unchanged lines hidden (view full) ---
200
201/* These are getting numerous enough that it's time to create a struct. */
202
203static char *saved_local_prompt;
204static char *saved_local_prefix;
205static int saved_last_invisible;
206static int saved_visible_length;
207static int saved_prefix_length;
208static int saved_local_length;
209static int saved_invis_chars_first_line;
210static int saved_physical_chars;
211
212/* Expand the prompt string S and return the number of visible
213 characters in *LP, if LP is not null. This is currently more-or-less
214 a placeholder for expansion. LIP, if non-null is a place to store the
215 index of the last invisible character in the returned string. NIFLP,
216 if non-zero, is a place to store the number of invisible characters in
--- 7 unchanged lines hidden (view full) ---
224 the returned string; all characters except those between \001 and
225 \002 are assumed to be `visible'. */
226
227static char *
228expand_prompt (pmt, lp, lip, niflp, vlp)
229 char *pmt;
230 int *lp, *lip, *niflp, *vlp;
231{
232 char *r, *ret, *p, *igstart;
233 int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
234
235 /* Short-circuit if we can. */
236 if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
237 {
238 r = savestring (pmt);
239 if (lp)
240 *lp = strlen (r);
--- 7 unchanged lines hidden (view full) ---
248 }
249
250 l = strlen (pmt);
251 r = ret = (char *)xmalloc (l + 1);
252
253 invfl = 0; /* invisible chars in first line of prompt */
254 invflset = 0; /* we only want to set invfl once */
255
256 igstart = 0;
257 for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++)
258 {
259 /* This code strips the invisible character string markers
260 RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
261 if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE) /* XXX - check ignoring? */
262 {
263 ignoring = 1;
264 igstart = p;
265 continue;
266 }
267 else if (ignoring && *p == RL_PROMPT_END_IGNORE)
268 {
269 ignoring = 0;
270 if (p != (igstart + 1))
271 last = r - ret - 1;
272 continue;
273 }
274 else
275 {
276#if defined (HANDLE_MULTIBYTE)
277 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
278 {
--- 83 unchanged lines hidden (view full) ---
362 char *p, *t;
363 int c;
364
365 /* Clear out any saved values. */
366 FREE (local_prompt);
367 FREE (local_prompt_prefix);
368
369 local_prompt = local_prompt_prefix = (char *)0;
370 local_prompt_len = 0;
371 prompt_last_invisible = prompt_invis_chars_first_line = 0;
372 prompt_visible_length = prompt_physical_chars = 0;
373
374 if (prompt == 0 || *prompt == 0)
375 return (0);
376
377 p = strrchr (prompt, '\n');
378 if (!p)
379 {
380 /* The prompt is only one logical line, though it might wrap. */
381 local_prompt = expand_prompt (prompt, &prompt_visible_length,
382 &prompt_last_invisible,
383 &prompt_invis_chars_first_line,
384 &prompt_physical_chars);
385 local_prompt_prefix = (char *)0;
386 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
387 return (prompt_visible_length);
388 }
389 else
390 {
391 /* The prompt spans multiple lines. */
392 t = ++p;
393 local_prompt = expand_prompt (p, &prompt_visible_length,
394 &prompt_last_invisible,
395 (int *)NULL,
396 &prompt_physical_chars);
397 c = *t; *t = '\0';
398 /* The portion of the prompt string up to and including the
399 final newline is now null-terminated. */
400 local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
401 (int *)NULL,
402 &prompt_invis_chars_first_line,
403 (int *)NULL);
404 *t = c;
405 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
406 return (prompt_prefix_length);
407 }
408}
409
410/* Initialize the VISIBLE_LINE and INVISIBLE_LINE arrays, and their associated
411 arrays of line break markers. MINSIZE is the minimum size of VISIBLE_LINE
412 and INVISIBLE_LINE; if it is greater than LINE_SIZE, LINE_SIZE is
413 increased. If the lines have already been allocated, this ensures that
--- 40 unchanged lines hidden (view full) ---
454}
455
456/* Basic redisplay algorithm. */
457void
458rl_redisplay ()
459{
460 register int in, out, c, linenum, cursor_linenum;
461 register char *line;
462 int inv_botlin, lb_botlin, lb_linenum, o_cpos;
463 int newlines, lpos, temp, modmark, n0, num;
464 char *prompt_this_line;
465#if defined (HANDLE_MULTIBYTE)
466 wchar_t wc;
467 size_t wc_bytes;
468 int wc_width;
469 mbstate_t ps;
470 int _rl_wrapped_multicolumn = 0;
--- 7 unchanged lines hidden (view full) ---
478
479 if (invisible_line == 0 || vis_lbreaks == 0)
480 {
481 init_line_structures (0);
482 rl_on_new_line ();
483 }
484
485 /* Draw the line into the buffer. */
486 cpos_buffer_position = -1;
487
488 line = invisible_line;
489 out = inv_botlin = 0;
490
491 /* Mark the line as modified or not. We only do this for history
492 lines. */
493 modmark = 0;
494 if (_rl_mark_modified_lines && current_history () && rl_undo_list)
--- 10 unchanged lines hidden (view full) ---
505 rl_display_fixed = 0;
506
507 /* If the prompt to be displayed is the `primary' readline prompt (the
508 one passed to readline()), use the values we have already expanded.
509 If not, use what's already in rl_display_prompt. WRAP_OFFSET is the
510 number of non-visible characters in the prompt string. */
511 if (rl_display_prompt == rl_prompt || local_prompt)
512 {
513 if (local_prompt_prefix && forced_display)
514 _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
515
516 if (local_prompt_len > 0)
517 {
518 temp = local_prompt_len + out + 2;
519 if (temp >= line_size)
520 {
521 line_size = (temp + 1024) - (temp % 1024);
522 visible_line = (char *)xrealloc (visible_line, line_size);
523 line = invisible_line = (char *)xrealloc (invisible_line, line_size);
524 }
525 strncpy (line + out, local_prompt, local_prompt_len);
526 out += local_prompt_len;
527 }
528 line[out] = '\0';
529 wrap_offset = local_prompt_len - prompt_visible_length;
530 }
531 else
532 {
533 int pmtlen;
534 prompt_this_line = strrchr (rl_display_prompt, '\n');
535 if (!prompt_this_line)
536 prompt_this_line = rl_display_prompt;
537 else
--- 84 unchanged lines hidden (view full) ---
622 the first physical line of the prompt.
623 wrap_offset - prompt_invis_chars_first_line is the number of invis
624 chars on the second line. */
625
626 /* what if lpos is already >= _rl_screenwidth before we start drawing the
627 contents of the command line? */
628 while (lpos >= _rl_screenwidth)
629 {
630 int z;
631 /* fix from Darin Johnson <darin@acuson.com> for prompt string with
632 invisible characters that is longer than the screen width. The
633 prompt_invis_chars_first_line variable could be made into an array
634 saying how many invisible characters there are per line, but that's
635 probably too much work for the benefit gained. How many people have
636 prompts that exceed two physical lines?
637 Additional logic fix from Edward Catmur <ed@catmur.co.uk> */
638#if defined (HANDLE_MULTIBYTE)
639 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
640 {
641 n0 = num;
642 temp = local_prompt_len;
643 while (num < temp)
644 {
645 z = _rl_col_width (local_prompt, n0, num);
646 if (z > _rl_screenwidth)
647 {
648 num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
649 break;
650 }
651 else if (z == _rl_screenwidth)
652 break;
653 num++;
654 }
655 temp = num;
656 }
657 else
658#endif /* !HANDLE_MULTIBYTE */
659 temp = ((newlines + 1) * _rl_screenwidth);
660
661 /* Now account for invisible characters in the current line. */
662 temp += ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line
663 : ((newlines == 1) ? wrap_offset : 0))
664 : ((newlines == 0) ? wrap_offset :0));
665
666 inv_lbreaks[++newlines] = temp;
667#if defined (HANDLE_MULTIBYTE)
668 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
669 lpos -= _rl_col_width (local_prompt, n0, num);
670 else
671#endif
672 lpos -= _rl_screenwidth;
673 }
674
675 prompt_last_screen_line = newlines;
676
677 /* Draw the rest of the line (after the prompt) into invisible_line, keeping
678 track of where the cursor is (cpos_buffer_position), the number of the line containing
679 the cursor (lb_linenum), the last line number (lb_botlin and inv_botlin).
680 It maintains an array of line breaks for display (inv_lbreaks).
681 This handles expanding tabs for display and displaying meta characters. */
682 lb_linenum = 0;
683#if defined (HANDLE_MULTIBYTE)
684 in = 0;
685 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
686 {
--- 36 unchanged lines hidden (view full) ---
723 line_size *= 2;
724 visible_line = (char *)xrealloc (visible_line, line_size);
725 invisible_line = (char *)xrealloc (invisible_line, line_size);
726 line = invisible_line;
727 }
728
729 if (in == rl_point)
730 {
731 cpos_buffer_position = out;
732 lb_linenum = newlines;
733 }
734
735#if defined (HANDLE_MULTIBYTE)
736 if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */
737#else
738 if (META_CHAR (c))
739#endif
--- 77 unchanged lines hidden (view full) ---
817 {
818 /* The space will be removed in update_line() */
819 line[out++] = ' ';
820 _rl_wrapped_multicolumn++;
821 CHECK_LPOS();
822 }
823 if (in == rl_point)
824 {
825 cpos_buffer_position = out;
826 lb_linenum = newlines;
827 }
828 for (i = in; i < in+wc_bytes; i++)
829 line[out++] = rl_line_buffer[i];
830 for (i = 0; i < wc_width; i++)
831 CHECK_LPOS();
832 }
833 else
--- 14 unchanged lines hidden (view full) ---
848 wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps);
849 }
850 else
851 in++;
852#endif
853
854 }
855 line[out] = '\0';
856 if (cpos_buffer_position < 0)
857 {
858 cpos_buffer_position = out;
859 lb_linenum = newlines;
860 }
861
862 inv_botlin = lb_botlin = newlines;
863 CHECK_INV_LBREAKS ();
864 inv_lbreaks[newlines+1] = out;
865 cursor_linenum = lb_linenum;
866
867 /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed.
868 CURSOR_LINENUM == line number where the cursor should be placed. */
869
870 /* PWP: now is when things get a bit hairy. The visible and invisible
871 line buffers are really multiple lines, which would wrap every
872 (screenwidth - 1) characters. Go through each in turn, finding
873 the changed region and updating it. The line order is top to bottom. */
874
875 /* If we can move the cursor up and down, then use multiple lines,
--- 28 unchanged lines hidden (view full) ---
904#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
905#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
906#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
907#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
908
909 /* For each line in the buffer, do the updating display. */
910 for (linenum = 0; linenum <= inv_botlin; linenum++)
911 {
912 /* This can lead us astray if we execute a program that changes
913 the locale from a non-multibyte to a multibyte one. */
914 o_cpos = _rl_last_c_pos;
915 cpos_adjusted = 0;
916 update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum,
917 VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin);
918
919 /* update_line potentially changes _rl_last_c_pos, but doesn't
920 take invisible characters into account, since _rl_last_c_pos
921 is an absolute cursor position in a multibyte locale. See
922 if compensating here is the right thing, or if we have to
923 change update_line itself. There is one case in which
924 update_line adjusts _rl_last_c_pos itself (so it can pass
925 _rl_move_cursor_relative accurate values); it communicates
926 this back by setting cpos_adjusted. If we assume that
927 _rl_last_c_pos is correct (an absolute cursor position) each
928 time update_line is called, then we can assume in our
929 calculations that o_cpos does not need to be adjusted by
930 wrap_offset. */
931 if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
932 cpos_adjusted == 0 &&
933 _rl_last_c_pos != o_cpos &&
934 _rl_last_c_pos > wrap_offset &&
935 o_cpos < prompt_last_invisible)
936 _rl_last_c_pos -= wrap_offset;
937
938 /* If this is the line with the prompt, we might need to
--- 52 unchanged lines hidden (view full) ---
991
992 /* We have to reprint the prompt if it contains invisible
993 characters, since it's not generally OK to just reprint
994 the characters from the current cursor position. But we
995 only need to reprint it if the cursor is before the last
996 invisible character in the prompt string. */
997 nleft = prompt_visible_length + wrap_offset;
998 if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
999#if 0
1000 _rl_last_c_pos <= PROMPT_ENDING_INDEX && local_prompt)
1001#else
1002 _rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt)
1003#endif
1004 {
1005#if defined (__MSDOS__)
1006 putc ('\r', rl_outstream);
1007#else
1008 if (_rl_term_cr)
1009 tputs (_rl_term_cr, 1, _rl_output_character_function);
1010#endif
1011 _rl_output_some_chars (local_prompt, nleft);
1012 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1013 _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft) - wrap_offset;
1014 else
1015 _rl_last_c_pos = nleft;
1016 }
1017
1018 /* Where on that line? And where does that line start
1019 in the buffer? */
1020 pos = inv_lbreaks[cursor_linenum];
1021 /* nleft == number of characters in the line buffer between the
1022 start of the line and the desired cursor position. */
1023 nleft = cpos_buffer_position - pos;
1024
1025 /* NLEFT is now a number of characters in a buffer. When in a
1026 multibyte locale, however, _rl_last_c_pos is an absolute cursor
1027 position that doesn't take invisible characters in the prompt
1028 into account. We use a fudge factor to compensate. */
1029
1030 /* Since _rl_backspace() doesn't know about invisible characters in the
1031 prompt, and there's no good way to tell it, we compensate for
1032 those characters here and call _rl_backspace() directly. */
1033 if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos)
1034 {
1035 /* TX == new physical cursor position in multibyte locale. */
1036 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1037 tx = _rl_col_width (&visible_line[pos], 0, nleft) - visible_wrap_offset;
1038 else
1039 tx = nleft;
1040 if (_rl_last_c_pos > tx)
1041 {
1042 _rl_backspace (_rl_last_c_pos - tx); /* XXX */
1043 _rl_last_c_pos = tx;
--- 17 unchanged lines hidden (view full) ---
1061
1062 /* Always at top line. */
1063 _rl_last_v_pos = 0;
1064
1065 /* Compute where in the buffer the displayed line should start. This
1066 will be LMARGIN. */
1067
1068 /* The number of characters that will be displayed before the cursor. */
1069 ndisp = cpos_buffer_position - wrap_offset;
1070 nleft = prompt_visible_length + wrap_offset;
1071 /* Where the new cursor position will be on the screen. This can be
1072 longer than SCREENWIDTH; if it is, lmargin will be adjusted. */
1073 phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset);
1074 t = _rl_screenwidth / 3;
1075
1076 /* If the number of characters had already exceeded the screenwidth,
1077 last_lmargin will be > 0. */
1078
1079 /* If the number of characters to be displayed is more than the screen
1080 width, compute the starting offset so that the cursor is about
1081 two-thirds of the way across the screen. */
1082 if (phys_c_pos > _rl_screenwidth - 2)
1083 {
1084 lmargin = cpos_buffer_position - (2 * t);
1085 if (lmargin < 0)
1086 lmargin = 0;
1087 /* If the left margin would be in the middle of a prompt with
1088 invisible characters, don't display the prompt at all. */
1089 if (wrap_offset && lmargin > 0 && lmargin < nleft)
1090 lmargin = nleft;
1091 }
1092 else if (ndisp < _rl_screenwidth - 2) /* XXX - was -1 */
1093 lmargin = 0;
1094 else if (phys_c_pos < 1)
1095 {
1096 /* If we are moving back towards the beginning of the line and
1097 the last margin is no longer correct, compute a new one. */
1098 lmargin = ((cpos_buffer_position - 1) / t) * t; /* XXX */
1099 if (wrap_offset && lmargin > 0 && lmargin < nleft)
1100 lmargin = nleft;
1101 }
1102 else
1103 lmargin = last_lmargin;
1104
1105 /* If the first character on the screen isn't the first character
1106 in the display line, indicate this with a special character. */
--- 28 unchanged lines hidden (view full) ---
1135 {
1136 nleft = _rl_screenwidth - t;
1137 _rl_clear_to_eol (nleft);
1138 }
1139 visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
1140 if (visible_first_line_len > _rl_screenwidth)
1141 visible_first_line_len = _rl_screenwidth;
1142
1143 _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin]);
1144 last_lmargin = lmargin;
1145 }
1146 }
1147 fflush (rl_outstream);
1148
1149 /* Swap visible and non-visible lines. */
1150 {
1151 char *vtemp = visible_line;
--- 41 unchanged lines hidden (view full) ---
1193 int current_line, omax, nmax, inv_botlin;
1194{
1195 register char *ofd, *ols, *oe, *nfd, *nls, *ne;
1196 int temp, lendiff, wsatend, od, nd;
1197 int current_invis_chars;
1198 int col_lendiff, col_temp;
1199#if defined (HANDLE_MULTIBYTE)
1200 mbstate_t ps_new, ps_old;
1201 int new_offset, old_offset;
1202#endif
1203
1204 /* If we're at the right edge of a terminal that supports xn, we're
1205 ready to wrap around, so do so. This fixes problems with knowing
1206 the exact cursor position and cut-and-paste with certain terminal
1207 emulators. In this calculation, TEMP is the physical screen
1208 position of the cursor. */
1209 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
--- 216 unchanged lines hidden (view full) ---
1426 string, then redraw the entire prompt string. We can only do this
1427 reliably if the terminal supports a `cr' capability.
1428
1429 This is not an efficiency hack -- there is a problem with redrawing
1430 portions of the prompt string if they contain terminal escape
1431 sequences (like drawing the `unbold' sequence without a corresponding
1432 `bold') that manifests itself on certain terminals. */
1433
1434 lendiff = local_prompt_len;
1435 od = ofd - old; /* index of first difference in visible line */
1436 if (current_line == 0 && !_rl_horizontal_scroll_mode &&
1437 _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 &&
1438 od >= lendiff && _rl_last_c_pos < PROMPT_ENDING_INDEX)
1439 {
1440#if defined (__MSDOS__)
1441 putc ('\r', rl_outstream);
1442#else
1443 tputs (_rl_term_cr, 1, _rl_output_character_function);
1444#endif
1445 _rl_output_some_chars (local_prompt, lendiff);
1446 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1447 {
1448 /* We take wrap_offset into account here so we can pass correct
1449 information to _rl_move_cursor_relative. */
1450 _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff) - wrap_offset;
1451 cpos_adjusted = 1;
1452 }
1453 else
1454 _rl_last_c_pos = lendiff;
1455 }
1456
1457 /* When this function returns, _rl_last_c_pos is correct, and an absolute
1458 cursor postion in multibyte mode, but a buffer index when not in a
1459 multibyte locale. */
1460 _rl_move_cursor_relative (od, old);
1461#if 1
1462#if defined (HANDLE_MULTIBYTE)
1463 /* We need to indicate that the cursor position is correct in the presence of
1464 invisible characters in the prompt string. Let's see if setting this when
1465 we make sure we're at the end of the drawn prompt string works. */
1466 if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
1467 cpos_adjusted = 1;
1468#endif
1469#endif
1470
1471 /* if (len (new) > len (old))
1472 lendiff == difference in buffer
1473 col_lendiff == difference on screen
1474 When not using multibyte characters, these are equal */
1475 lendiff = (nls - nfd) - (ols - ofd);
1476 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1477 col_lendiff = _rl_col_width (new, nfd - new, nls - new) - _rl_col_width (old, ofd - old, ols - old);
--- 211 unchanged lines hidden (view full) ---
1689
1690 return 0;
1691}
1692
1693/* Actually update the display, period. */
1694int
1695rl_forced_update_display ()
1696{
1697 register char *temp;
1698
1699 if (visible_line)
1700 {
1701 temp = visible_line;
1702 while (*temp)
1703 *temp++ = '\0';
1704 }
1705 rl_on_new_line ();
1706 forced_display++;
1707 (*rl_redisplay_function) ();
1708 return 0;
1709}
--- 18 unchanged lines hidden (view full) ---
1728 /* If we have multibyte characters, NEW is indexed by the buffer point in
1729 a multibyte string, but _rl_last_c_pos is the display position. In
1730 this case, NEW's display position is not obvious and must be
1731 calculated. We need to account for invisible characters in this line,
1732 as long as we are past them and they are counted by _rl_col_width. */
1733 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1734 {
1735 dpos = _rl_col_width (data, 0, new);
1736 if (dpos > prompt_last_invisible) /* XXX - don't use woff here */
1737 {
1738 dpos -= woff;
1739 /* Since this will be assigned to _rl_last_c_pos at the end (more
1740 precisely, _rl_last_c_pos == dpos when this function returns),
1741 let the caller know. */
1742 cpos_adjusted = 1;
1743 }
1744 }
1745 else
1746#endif
1747 dpos = new;
1748
1749 /* If we don't have to do anything, then return. */
1750 if (cpos == dpos)
1751 return;
1752
1753 /* It may be faster to output a CR, and then move forwards instead
1754 of moving backwards. */
1755 /* i == current physical cursor position. */
1756#if defined (HANDLE_MULTIBYTE)
1757 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1758 i = _rl_last_c_pos;
1759 else
1760#endif
1761 i = _rl_last_c_pos - woff;
1762 if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) ||
1763 (_rl_term_autowrap && i == _rl_screenwidth))
1764 {
1765#if defined (__MSDOS__)
1766 putc ('\r', rl_outstream);
1767#else
1768 tputs (_rl_term_cr, 1, _rl_output_character_function);
1769#endif /* !__MSDOS__ */
1770 cpos = _rl_last_c_pos = 0;
--- 5 unchanged lines hidden (view full) ---
1776 to move the cursor forward if there is one, else print that
1777 portion of the output buffer again. Which is cheaper? */
1778
1779 /* The above comment is left here for posterity. It is faster
1780 to print one character (non-control) than to print a control
1781 sequence telling the terminal to move forward one character.
1782 That kind of control is for people who don't know what the
1783 data is underneath the cursor. */
1784
1785 /* However, we need a handle on where the current display position is
1786 in the buffer for the immediately preceding comment to be true.
1787 In multibyte locales, we don't currently have that info available.
1788 Without it, we don't know where the data we have to display begins
1789 in the buffer and we have to go back to the beginning of the screen
1790 line. In this case, we can use the terminal sequence to move forward
1791 if it's available. */
1792 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1793 {
1794 if (_rl_term_forward_char)
1795 {
1796 for (i = cpos; i < dpos; i++)
1797 tputs (_rl_term_forward_char, 1, _rl_output_character_function);
1798 }
1799 else
1800 {
1801 tputs (_rl_term_cr, 1, _rl_output_character_function);
1802 for (i = 0; i < new; i++)
1803 putc (data[i], rl_outstream);
1804 }
1805 }
1806 else
1807 for (i = cpos; i < new; i++)
1808 putc (data[i], rl_outstream);
1809 }
1810
1811#if defined (HANDLE_MULTIBYTE)
1812 /* NEW points to the buffer point, but _rl_last_c_pos is the display point.
--- 132 unchanged lines hidden (view full) ---
1945 msg_saved_prompt = 1;
1946 }
1947 rl_display_prompt = msg_buf;
1948 local_prompt = expand_prompt (msg_buf, &prompt_visible_length,
1949 &prompt_last_invisible,
1950 &prompt_invis_chars_first_line,
1951 &prompt_physical_chars);
1952 local_prompt_prefix = (char *)NULL;
1953 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
1954 (*rl_redisplay_function) ();
1955
1956 return 0;
1957}
1958#else /* !USE_VARARGS */
1959int
1960rl_message (format, arg1, arg2)
1961 char *format;
--- 7 unchanged lines hidden (view full) ---
1969 rl_save_prompt ();
1970 msg_saved_prompt = 1;
1971 }
1972 local_prompt = expand_prompt (msg_buf, &prompt_visible_length,
1973 &prompt_last_invisible,
1974 &prompt_invis_chars_first_line,
1975 &prompt_physical_chars);
1976 local_prompt_prefix = (char *)NULL;
1977 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
1978 (*rl_redisplay_function) ();
1979
1980 return 0;
1981}
1982#endif /* !USE_VARARGS */
1983
1984/* How to clear things from the "echo-area". */
1985int
--- 20 unchanged lines hidden (view full) ---
2006}
2007
2008void
2009rl_save_prompt ()
2010{
2011 saved_local_prompt = local_prompt;
2012 saved_local_prefix = local_prompt_prefix;
2013 saved_prefix_length = prompt_prefix_length;
2014 saved_local_length = local_prompt_len;
2015 saved_last_invisible = prompt_last_invisible;
2016 saved_visible_length = prompt_visible_length;
2017 saved_invis_chars_first_line = prompt_invis_chars_first_line;
2018 saved_physical_chars = prompt_physical_chars;
2019
2020 local_prompt = local_prompt_prefix = (char *)0;
2021 local_prompt_len = 0;
2022 prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0;
2023 prompt_invis_chars_first_line = prompt_physical_chars = 0;
2024}
2025
2026void
2027rl_restore_prompt ()
2028{
2029 FREE (local_prompt);
2030 FREE (local_prompt_prefix);
2031
2032 local_prompt = saved_local_prompt;
2033 local_prompt_prefix = saved_local_prefix;
2034 local_prompt_len = saved_local_length;
2035 prompt_prefix_length = saved_prefix_length;
2036 prompt_last_invisible = saved_last_invisible;
2037 prompt_visible_length = saved_visible_length;
2038 prompt_invis_chars_first_line = saved_invis_chars_first_line;
2039 prompt_physical_chars = saved_physical_chars;
2040
2041 /* can test saved_local_prompt to see if prompt info has been saved. */
2042 saved_local_prompt = saved_local_prefix = (char *)0;
2043 saved_local_length = 0;
2044 saved_last_invisible = saved_visible_length = saved_prefix_length = 0;
2045 saved_invis_chars_first_line = saved_physical_chars = 0;
2046}
2047
2048char *
2049_rl_make_prompt_for_search (pchar)
2050 int pchar;
2051{
--- 172 unchanged lines hidden (view full) ---
2224 }
2225 _rl_move_vert (_rl_vis_botlin);
2226 /* If we've wrapped lines, remove the final xterm line-wrap flag. */
2227 if (full_lines && _rl_term_autowrap && (VIS_LLEN(_rl_vis_botlin) == _rl_screenwidth))
2228 {
2229 char *last_line;
2230
2231 last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]];
2232 cpos_buffer_position = -1; /* don't know where we are in buffer */
2233 _rl_move_cursor_relative (_rl_screenwidth - 1, last_line); /* XXX */
2234 _rl_clear_to_eol (0);
2235 putc (last_line[_rl_screenwidth - 1], rl_outstream);
2236 }
2237 _rl_vis_botlin = 0;
2238 rl_crlf ();
2239 fflush (rl_outstream);
2240 rl_display_fixed++;
2241}
--- 26 unchanged lines hidden (view full) ---
2268 rl_save_prompt ();
2269
2270 rl_display_prompt = t;
2271 local_prompt = expand_prompt (t, &prompt_visible_length,
2272 &prompt_last_invisible,
2273 &prompt_invis_chars_first_line,
2274 &prompt_physical_chars);
2275 local_prompt_prefix = (char *)NULL;
2276 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
2277
2278 rl_forced_update_display ();
2279
2280 rl_display_prompt = oldp;
2281 rl_restore_prompt();
2282}
2283
2284/* Redisplay the current line after a SIGWINCH is received. */
--- 86 unchanged lines hidden (view full) ---
2371 In the case of multibyte characters with stateful encoding, we have to
2372 scan from the beginning of the string to take the state into account. */
2373static int
2374_rl_col_width (str, start, end)
2375 const char *str;
2376 int start, end;
2377{
2378 wchar_t wc;
2379 mbstate_t ps;
2380 int tmp, point, width, max;
2381
2382 if (end <= start)
2383 return 0;
2384
2385 memset (&ps, 0, sizeof (mbstate_t));
2386
2387 point = 0;
2388 max = end;
2389
2390 while (point < start)
2391 {
2392 tmp = mbrlen (str + point, max, &ps);
2393 if (MB_INVALIDCH ((size_t)tmp))
2394 {
--- 58 unchanged lines hidden ---
2/* display.c -- readline redisplay facility. */
3
4/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
5
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
8
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2, or
12 (at your option) any later version.
--- 42 unchanged lines hidden (view full) ---
55
56#include "rlprivate.h"
57#include "xmalloc.h"
58
59#if !defined (strchr) && !defined (__STDC__)
60extern char *strchr (), *strrchr ();
61#endif /* !strchr && !__STDC__ */
62
63static void update_line PARAMS((char *, char *, int, int, int, int));
64static void space_to_eol PARAMS((int));
65static void delete_chars PARAMS((int));
66static void insert_some_chars PARAMS((char *, int, int));
67static void cr PARAMS((void));
68
69#if defined (HANDLE_MULTIBYTE)
70static int _rl_col_width PARAMS((const char *, int, int));
71static int *_rl_wrapped_line;
72#else
73# define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s))
74#endif
75
76static int *inv_lbreaks, *vis_lbreaks;
77static int inv_lbsize, vis_lbsize;
78
79/* Heuristic used to decide whether it is faster to move from CUR to NEW
80 by backing up or outputting a carriage return and moving forward. CUR
81 and NEW are either both buffer positions or absolute screen positions. */
82#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new)))
83
84/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a
85 buffer index in others. This macro is used when deciding whether the
86 current cursor position is in the middle of a prompt string containing
87 invisible characters. */
88#define PROMPT_ENDING_INDEX \
89 ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1)
90
91
92/* **************************************************************** */
93/* */
94/* Display stuff */
95/* */
96/* **************************************************************** */
97
98/* This is the stuff that is hard for me. I never seem to write good
99 display routines in C. Let's see how I do this time. */
--- 36 unchanged lines hidden (view full) ---
136/* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale
137 supporting multibyte characters, and an absolute cursor position when
138 in such a locale. This is an artifact of the donated multibyte support.
139 Care must be taken when modifying its value. */
140int _rl_last_c_pos = 0;
141int _rl_last_v_pos = 0;
142
143static int cpos_adjusted;
144static int cpos_buffer_position;
145
146/* Number of lines currently on screen minus 1. */
147int _rl_vis_botlin = 0;
148
149/* Variables used only in this file. */
150/* The last left edge of text that was displayed. This is used when
151 doing horizontal scrolling. It shifts in thirds of a screenwidth. */
152static int last_lmargin;
--- 11 unchanged lines hidden (view full) ---
164
165/* Default and initial buffer size. Can grow. */
166static int line_size = 1024;
167
168/* Variables to keep track of the expanded prompt string, which may
169 include invisible characters. */
170
171static char *local_prompt, *local_prompt_prefix;
172static int local_prompt_len;
173static int prompt_visible_length, prompt_prefix_length;
174
175/* The number of invisible characters in the line currently being
176 displayed on the screen. */
177static int visible_wrap_offset;
178
179/* The number of invisible characters in the prompt string. Static so it
180 can be shared between rl_redisplay and update_line */
--- 19 unchanged lines hidden (view full) ---
200
201/* These are getting numerous enough that it's time to create a struct. */
202
203static char *saved_local_prompt;
204static char *saved_local_prefix;
205static int saved_last_invisible;
206static int saved_visible_length;
207static int saved_prefix_length;
208static int saved_local_length;
209static int saved_invis_chars_first_line;
210static int saved_physical_chars;
211
212/* Expand the prompt string S and return the number of visible
213 characters in *LP, if LP is not null. This is currently more-or-less
214 a placeholder for expansion. LIP, if non-null is a place to store the
215 index of the last invisible character in the returned string. NIFLP,
216 if non-zero, is a place to store the number of invisible characters in
--- 7 unchanged lines hidden (view full) ---
224 the returned string; all characters except those between \001 and
225 \002 are assumed to be `visible'. */
226
227static char *
228expand_prompt (pmt, lp, lip, niflp, vlp)
229 char *pmt;
230 int *lp, *lip, *niflp, *vlp;
231{
232 char *r, *ret, *p, *igstart;
233 int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
234
235 /* Short-circuit if we can. */
236 if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
237 {
238 r = savestring (pmt);
239 if (lp)
240 *lp = strlen (r);
--- 7 unchanged lines hidden (view full) ---
248 }
249
250 l = strlen (pmt);
251 r = ret = (char *)xmalloc (l + 1);
252
253 invfl = 0; /* invisible chars in first line of prompt */
254 invflset = 0; /* we only want to set invfl once */
255
256 igstart = 0;
257 for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++)
258 {
259 /* This code strips the invisible character string markers
260 RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
261 if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE) /* XXX - check ignoring? */
262 {
263 ignoring = 1;
264 igstart = p;
265 continue;
266 }
267 else if (ignoring && *p == RL_PROMPT_END_IGNORE)
268 {
269 ignoring = 0;
270 if (p != (igstart + 1))
271 last = r - ret - 1;
272 continue;
273 }
274 else
275 {
276#if defined (HANDLE_MULTIBYTE)
277 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
278 {
--- 83 unchanged lines hidden (view full) ---
362 char *p, *t;
363 int c;
364
365 /* Clear out any saved values. */
366 FREE (local_prompt);
367 FREE (local_prompt_prefix);
368
369 local_prompt = local_prompt_prefix = (char *)0;
370 local_prompt_len = 0;
371 prompt_last_invisible = prompt_invis_chars_first_line = 0;
372 prompt_visible_length = prompt_physical_chars = 0;
373
374 if (prompt == 0 || *prompt == 0)
375 return (0);
376
377 p = strrchr (prompt, '\n');
378 if (!p)
379 {
380 /* The prompt is only one logical line, though it might wrap. */
381 local_prompt = expand_prompt (prompt, &prompt_visible_length,
382 &prompt_last_invisible,
383 &prompt_invis_chars_first_line,
384 &prompt_physical_chars);
385 local_prompt_prefix = (char *)0;
386 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
387 return (prompt_visible_length);
388 }
389 else
390 {
391 /* The prompt spans multiple lines. */
392 t = ++p;
393 local_prompt = expand_prompt (p, &prompt_visible_length,
394 &prompt_last_invisible,
395 (int *)NULL,
396 &prompt_physical_chars);
397 c = *t; *t = '\0';
398 /* The portion of the prompt string up to and including the
399 final newline is now null-terminated. */
400 local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
401 (int *)NULL,
402 &prompt_invis_chars_first_line,
403 (int *)NULL);
404 *t = c;
405 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
406 return (prompt_prefix_length);
407 }
408}
409
410/* Initialize the VISIBLE_LINE and INVISIBLE_LINE arrays, and their associated
411 arrays of line break markers. MINSIZE is the minimum size of VISIBLE_LINE
412 and INVISIBLE_LINE; if it is greater than LINE_SIZE, LINE_SIZE is
413 increased. If the lines have already been allocated, this ensures that
--- 40 unchanged lines hidden (view full) ---
454}
455
456/* Basic redisplay algorithm. */
457void
458rl_redisplay ()
459{
460 register int in, out, c, linenum, cursor_linenum;
461 register char *line;
462 int inv_botlin, lb_botlin, lb_linenum, o_cpos;
463 int newlines, lpos, temp, modmark, n0, num;
464 char *prompt_this_line;
465#if defined (HANDLE_MULTIBYTE)
466 wchar_t wc;
467 size_t wc_bytes;
468 int wc_width;
469 mbstate_t ps;
470 int _rl_wrapped_multicolumn = 0;
--- 7 unchanged lines hidden (view full) ---
478
479 if (invisible_line == 0 || vis_lbreaks == 0)
480 {
481 init_line_structures (0);
482 rl_on_new_line ();
483 }
484
485 /* Draw the line into the buffer. */
486 cpos_buffer_position = -1;
487
488 line = invisible_line;
489 out = inv_botlin = 0;
490
491 /* Mark the line as modified or not. We only do this for history
492 lines. */
493 modmark = 0;
494 if (_rl_mark_modified_lines && current_history () && rl_undo_list)
--- 10 unchanged lines hidden (view full) ---
505 rl_display_fixed = 0;
506
507 /* If the prompt to be displayed is the `primary' readline prompt (the
508 one passed to readline()), use the values we have already expanded.
509 If not, use what's already in rl_display_prompt. WRAP_OFFSET is the
510 number of non-visible characters in the prompt string. */
511 if (rl_display_prompt == rl_prompt || local_prompt)
512 {
513 if (local_prompt_prefix && forced_display)
514 _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
515
516 if (local_prompt_len > 0)
517 {
518 temp = local_prompt_len + out + 2;
519 if (temp >= line_size)
520 {
521 line_size = (temp + 1024) - (temp % 1024);
522 visible_line = (char *)xrealloc (visible_line, line_size);
523 line = invisible_line = (char *)xrealloc (invisible_line, line_size);
524 }
525 strncpy (line + out, local_prompt, local_prompt_len);
526 out += local_prompt_len;
527 }
528 line[out] = '\0';
529 wrap_offset = local_prompt_len - prompt_visible_length;
530 }
531 else
532 {
533 int pmtlen;
534 prompt_this_line = strrchr (rl_display_prompt, '\n');
535 if (!prompt_this_line)
536 prompt_this_line = rl_display_prompt;
537 else
--- 84 unchanged lines hidden (view full) ---
622 the first physical line of the prompt.
623 wrap_offset - prompt_invis_chars_first_line is the number of invis
624 chars on the second line. */
625
626 /* what if lpos is already >= _rl_screenwidth before we start drawing the
627 contents of the command line? */
628 while (lpos >= _rl_screenwidth)
629 {
630 int z;
631 /* fix from Darin Johnson <darin@acuson.com> for prompt string with
632 invisible characters that is longer than the screen width. The
633 prompt_invis_chars_first_line variable could be made into an array
634 saying how many invisible characters there are per line, but that's
635 probably too much work for the benefit gained. How many people have
636 prompts that exceed two physical lines?
637 Additional logic fix from Edward Catmur <ed@catmur.co.uk> */
638#if defined (HANDLE_MULTIBYTE)
639 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
640 {
641 n0 = num;
642 temp = local_prompt_len;
643 while (num < temp)
644 {
645 z = _rl_col_width (local_prompt, n0, num);
646 if (z > _rl_screenwidth)
647 {
648 num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
649 break;
650 }
651 else if (z == _rl_screenwidth)
652 break;
653 num++;
654 }
655 temp = num;
656 }
657 else
658#endif /* !HANDLE_MULTIBYTE */
659 temp = ((newlines + 1) * _rl_screenwidth);
660
661 /* Now account for invisible characters in the current line. */
662 temp += ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line
663 : ((newlines == 1) ? wrap_offset : 0))
664 : ((newlines == 0) ? wrap_offset :0));
665
666 inv_lbreaks[++newlines] = temp;
667#if defined (HANDLE_MULTIBYTE)
668 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
669 lpos -= _rl_col_width (local_prompt, n0, num);
670 else
671#endif
672 lpos -= _rl_screenwidth;
673 }
674
675 prompt_last_screen_line = newlines;
676
677 /* Draw the rest of the line (after the prompt) into invisible_line, keeping
678 track of where the cursor is (cpos_buffer_position), the number of the line containing
679 the cursor (lb_linenum), the last line number (lb_botlin and inv_botlin).
680 It maintains an array of line breaks for display (inv_lbreaks).
681 This handles expanding tabs for display and displaying meta characters. */
682 lb_linenum = 0;
683#if defined (HANDLE_MULTIBYTE)
684 in = 0;
685 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
686 {
--- 36 unchanged lines hidden (view full) ---
723 line_size *= 2;
724 visible_line = (char *)xrealloc (visible_line, line_size);
725 invisible_line = (char *)xrealloc (invisible_line, line_size);
726 line = invisible_line;
727 }
728
729 if (in == rl_point)
730 {
731 cpos_buffer_position = out;
732 lb_linenum = newlines;
733 }
734
735#if defined (HANDLE_MULTIBYTE)
736 if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */
737#else
738 if (META_CHAR (c))
739#endif
--- 77 unchanged lines hidden (view full) ---
817 {
818 /* The space will be removed in update_line() */
819 line[out++] = ' ';
820 _rl_wrapped_multicolumn++;
821 CHECK_LPOS();
822 }
823 if (in == rl_point)
824 {
825 cpos_buffer_position = out;
826 lb_linenum = newlines;
827 }
828 for (i = in; i < in+wc_bytes; i++)
829 line[out++] = rl_line_buffer[i];
830 for (i = 0; i < wc_width; i++)
831 CHECK_LPOS();
832 }
833 else
--- 14 unchanged lines hidden (view full) ---
848 wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps);
849 }
850 else
851 in++;
852#endif
853
854 }
855 line[out] = '\0';
856 if (cpos_buffer_position < 0)
857 {
858 cpos_buffer_position = out;
859 lb_linenum = newlines;
860 }
861
862 inv_botlin = lb_botlin = newlines;
863 CHECK_INV_LBREAKS ();
864 inv_lbreaks[newlines+1] = out;
865 cursor_linenum = lb_linenum;
866
867 /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed.
868 CURSOR_LINENUM == line number where the cursor should be placed. */
869
870 /* PWP: now is when things get a bit hairy. The visible and invisible
871 line buffers are really multiple lines, which would wrap every
872 (screenwidth - 1) characters. Go through each in turn, finding
873 the changed region and updating it. The line order is top to bottom. */
874
875 /* If we can move the cursor up and down, then use multiple lines,
--- 28 unchanged lines hidden (view full) ---
904#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
905#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
906#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
907#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
908
909 /* For each line in the buffer, do the updating display. */
910 for (linenum = 0; linenum <= inv_botlin; linenum++)
911 {
912 /* This can lead us astray if we execute a program that changes
913 the locale from a non-multibyte to a multibyte one. */
914 o_cpos = _rl_last_c_pos;
915 cpos_adjusted = 0;
916 update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum,
917 VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin);
918
919 /* update_line potentially changes _rl_last_c_pos, but doesn't
920 take invisible characters into account, since _rl_last_c_pos
921 is an absolute cursor position in a multibyte locale. See
922 if compensating here is the right thing, or if we have to
923 change update_line itself. There is one case in which
924 update_line adjusts _rl_last_c_pos itself (so it can pass
925 _rl_move_cursor_relative accurate values); it communicates
926 this back by setting cpos_adjusted. If we assume that
927 _rl_last_c_pos is correct (an absolute cursor position) each
928 time update_line is called, then we can assume in our
929 calculations that o_cpos does not need to be adjusted by
930 wrap_offset. */
931 if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
932 cpos_adjusted == 0 &&
933 _rl_last_c_pos != o_cpos &&
934 _rl_last_c_pos > wrap_offset &&
935 o_cpos < prompt_last_invisible)
936 _rl_last_c_pos -= wrap_offset;
937
938 /* If this is the line with the prompt, we might need to
--- 52 unchanged lines hidden (view full) ---
991
992 /* We have to reprint the prompt if it contains invisible
993 characters, since it's not generally OK to just reprint
994 the characters from the current cursor position. But we
995 only need to reprint it if the cursor is before the last
996 invisible character in the prompt string. */
997 nleft = prompt_visible_length + wrap_offset;
998 if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
999#if 0
1000 _rl_last_c_pos <= PROMPT_ENDING_INDEX && local_prompt)
1001#else
1002 _rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt)
1003#endif
1004 {
1005#if defined (__MSDOS__)
1006 putc ('\r', rl_outstream);
1007#else
1008 if (_rl_term_cr)
1009 tputs (_rl_term_cr, 1, _rl_output_character_function);
1010#endif
1011 _rl_output_some_chars (local_prompt, nleft);
1012 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1013 _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft) - wrap_offset;
1014 else
1015 _rl_last_c_pos = nleft;
1016 }
1017
1018 /* Where on that line? And where does that line start
1019 in the buffer? */
1020 pos = inv_lbreaks[cursor_linenum];
1021 /* nleft == number of characters in the line buffer between the
1022 start of the line and the desired cursor position. */
1023 nleft = cpos_buffer_position - pos;
1024
1025 /* NLEFT is now a number of characters in a buffer. When in a
1026 multibyte locale, however, _rl_last_c_pos is an absolute cursor
1027 position that doesn't take invisible characters in the prompt
1028 into account. We use a fudge factor to compensate. */
1029
1030 /* Since _rl_backspace() doesn't know about invisible characters in the
1031 prompt, and there's no good way to tell it, we compensate for
1032 those characters here and call _rl_backspace() directly. */
1033 if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos)
1034 {
1035 /* TX == new physical cursor position in multibyte locale. */
1036 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1037 tx = _rl_col_width (&visible_line[pos], 0, nleft) - visible_wrap_offset;
1038 else
1039 tx = nleft;
1040 if (_rl_last_c_pos > tx)
1041 {
1042 _rl_backspace (_rl_last_c_pos - tx); /* XXX */
1043 _rl_last_c_pos = tx;
--- 17 unchanged lines hidden (view full) ---
1061
1062 /* Always at top line. */
1063 _rl_last_v_pos = 0;
1064
1065 /* Compute where in the buffer the displayed line should start. This
1066 will be LMARGIN. */
1067
1068 /* The number of characters that will be displayed before the cursor. */
1069 ndisp = cpos_buffer_position - wrap_offset;
1070 nleft = prompt_visible_length + wrap_offset;
1071 /* Where the new cursor position will be on the screen. This can be
1072 longer than SCREENWIDTH; if it is, lmargin will be adjusted. */
1073 phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset);
1074 t = _rl_screenwidth / 3;
1075
1076 /* If the number of characters had already exceeded the screenwidth,
1077 last_lmargin will be > 0. */
1078
1079 /* If the number of characters to be displayed is more than the screen
1080 width, compute the starting offset so that the cursor is about
1081 two-thirds of the way across the screen. */
1082 if (phys_c_pos > _rl_screenwidth - 2)
1083 {
1084 lmargin = cpos_buffer_position - (2 * t);
1085 if (lmargin < 0)
1086 lmargin = 0;
1087 /* If the left margin would be in the middle of a prompt with
1088 invisible characters, don't display the prompt at all. */
1089 if (wrap_offset && lmargin > 0 && lmargin < nleft)
1090 lmargin = nleft;
1091 }
1092 else if (ndisp < _rl_screenwidth - 2) /* XXX - was -1 */
1093 lmargin = 0;
1094 else if (phys_c_pos < 1)
1095 {
1096 /* If we are moving back towards the beginning of the line and
1097 the last margin is no longer correct, compute a new one. */
1098 lmargin = ((cpos_buffer_position - 1) / t) * t; /* XXX */
1099 if (wrap_offset && lmargin > 0 && lmargin < nleft)
1100 lmargin = nleft;
1101 }
1102 else
1103 lmargin = last_lmargin;
1104
1105 /* If the first character on the screen isn't the first character
1106 in the display line, indicate this with a special character. */
--- 28 unchanged lines hidden (view full) ---
1135 {
1136 nleft = _rl_screenwidth - t;
1137 _rl_clear_to_eol (nleft);
1138 }
1139 visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
1140 if (visible_first_line_len > _rl_screenwidth)
1141 visible_first_line_len = _rl_screenwidth;
1142
1143 _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin]);
1144 last_lmargin = lmargin;
1145 }
1146 }
1147 fflush (rl_outstream);
1148
1149 /* Swap visible and non-visible lines. */
1150 {
1151 char *vtemp = visible_line;
--- 41 unchanged lines hidden (view full) ---
1193 int current_line, omax, nmax, inv_botlin;
1194{
1195 register char *ofd, *ols, *oe, *nfd, *nls, *ne;
1196 int temp, lendiff, wsatend, od, nd;
1197 int current_invis_chars;
1198 int col_lendiff, col_temp;
1199#if defined (HANDLE_MULTIBYTE)
1200 mbstate_t ps_new, ps_old;
1201 int new_offset, old_offset;
1202#endif
1203
1204 /* If we're at the right edge of a terminal that supports xn, we're
1205 ready to wrap around, so do so. This fixes problems with knowing
1206 the exact cursor position and cut-and-paste with certain terminal
1207 emulators. In this calculation, TEMP is the physical screen
1208 position of the cursor. */
1209 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
--- 216 unchanged lines hidden (view full) ---
1426 string, then redraw the entire prompt string. We can only do this
1427 reliably if the terminal supports a `cr' capability.
1428
1429 This is not an efficiency hack -- there is a problem with redrawing
1430 portions of the prompt string if they contain terminal escape
1431 sequences (like drawing the `unbold' sequence without a corresponding
1432 `bold') that manifests itself on certain terminals. */
1433
1434 lendiff = local_prompt_len;
1435 od = ofd - old; /* index of first difference in visible line */
1436 if (current_line == 0 && !_rl_horizontal_scroll_mode &&
1437 _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 &&
1438 od >= lendiff && _rl_last_c_pos < PROMPT_ENDING_INDEX)
1439 {
1440#if defined (__MSDOS__)
1441 putc ('\r', rl_outstream);
1442#else
1443 tputs (_rl_term_cr, 1, _rl_output_character_function);
1444#endif
1445 _rl_output_some_chars (local_prompt, lendiff);
1446 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1447 {
1448 /* We take wrap_offset into account here so we can pass correct
1449 information to _rl_move_cursor_relative. */
1450 _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff) - wrap_offset;
1451 cpos_adjusted = 1;
1452 }
1453 else
1454 _rl_last_c_pos = lendiff;
1455 }
1456
1457 /* When this function returns, _rl_last_c_pos is correct, and an absolute
1458 cursor postion in multibyte mode, but a buffer index when not in a
1459 multibyte locale. */
1460 _rl_move_cursor_relative (od, old);
1461#if 1
1462#if defined (HANDLE_MULTIBYTE)
1463 /* We need to indicate that the cursor position is correct in the presence of
1464 invisible characters in the prompt string. Let's see if setting this when
1465 we make sure we're at the end of the drawn prompt string works. */
1466 if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
1467 cpos_adjusted = 1;
1468#endif
1469#endif
1470
1471 /* if (len (new) > len (old))
1472 lendiff == difference in buffer
1473 col_lendiff == difference on screen
1474 When not using multibyte characters, these are equal */
1475 lendiff = (nls - nfd) - (ols - ofd);
1476 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1477 col_lendiff = _rl_col_width (new, nfd - new, nls - new) - _rl_col_width (old, ofd - old, ols - old);
--- 211 unchanged lines hidden (view full) ---
1689
1690 return 0;
1691}
1692
1693/* Actually update the display, period. */
1694int
1695rl_forced_update_display ()
1696{
1697 register char *temp;
1698
1699 if (visible_line)
1700 {
1701 temp = visible_line;
1702 while (*temp)
1703 *temp++ = '\0';
1704 }
1705 rl_on_new_line ();
1706 forced_display++;
1707 (*rl_redisplay_function) ();
1708 return 0;
1709}
--- 18 unchanged lines hidden (view full) ---
1728 /* If we have multibyte characters, NEW is indexed by the buffer point in
1729 a multibyte string, but _rl_last_c_pos is the display position. In
1730 this case, NEW's display position is not obvious and must be
1731 calculated. We need to account for invisible characters in this line,
1732 as long as we are past them and they are counted by _rl_col_width. */
1733 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1734 {
1735 dpos = _rl_col_width (data, 0, new);
1736 if (dpos > prompt_last_invisible) /* XXX - don't use woff here */
1737 {
1738 dpos -= woff;
1739 /* Since this will be assigned to _rl_last_c_pos at the end (more
1740 precisely, _rl_last_c_pos == dpos when this function returns),
1741 let the caller know. */
1742 cpos_adjusted = 1;
1743 }
1744 }
1745 else
1746#endif
1747 dpos = new;
1748
1749 /* If we don't have to do anything, then return. */
1750 if (cpos == dpos)
1751 return;
1752
1753 /* It may be faster to output a CR, and then move forwards instead
1754 of moving backwards. */
1755 /* i == current physical cursor position. */
1756#if defined (HANDLE_MULTIBYTE)
1757 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1758 i = _rl_last_c_pos;
1759 else
1760#endif
1761 i = _rl_last_c_pos - woff;
1762 if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) ||
1763 (_rl_term_autowrap && i == _rl_screenwidth))
1764 {
1765#if defined (__MSDOS__)
1766 putc ('\r', rl_outstream);
1767#else
1768 tputs (_rl_term_cr, 1, _rl_output_character_function);
1769#endif /* !__MSDOS__ */
1770 cpos = _rl_last_c_pos = 0;
--- 5 unchanged lines hidden (view full) ---
1776 to move the cursor forward if there is one, else print that
1777 portion of the output buffer again. Which is cheaper? */
1778
1779 /* The above comment is left here for posterity. It is faster
1780 to print one character (non-control) than to print a control
1781 sequence telling the terminal to move forward one character.
1782 That kind of control is for people who don't know what the
1783 data is underneath the cursor. */
1784
1785 /* However, we need a handle on where the current display position is
1786 in the buffer for the immediately preceding comment to be true.
1787 In multibyte locales, we don't currently have that info available.
1788 Without it, we don't know where the data we have to display begins
1789 in the buffer and we have to go back to the beginning of the screen
1790 line. In this case, we can use the terminal sequence to move forward
1791 if it's available. */
1792 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1793 {
1794 if (_rl_term_forward_char)
1795 {
1796 for (i = cpos; i < dpos; i++)
1797 tputs (_rl_term_forward_char, 1, _rl_output_character_function);
1798 }
1799 else
1800 {
1801 tputs (_rl_term_cr, 1, _rl_output_character_function);
1802 for (i = 0; i < new; i++)
1803 putc (data[i], rl_outstream);
1804 }
1805 }
1806 else
1807 for (i = cpos; i < new; i++)
1808 putc (data[i], rl_outstream);
1809 }
1810
1811#if defined (HANDLE_MULTIBYTE)
1812 /* NEW points to the buffer point, but _rl_last_c_pos is the display point.
--- 132 unchanged lines hidden (view full) ---
1945 msg_saved_prompt = 1;
1946 }
1947 rl_display_prompt = msg_buf;
1948 local_prompt = expand_prompt (msg_buf, &prompt_visible_length,
1949 &prompt_last_invisible,
1950 &prompt_invis_chars_first_line,
1951 &prompt_physical_chars);
1952 local_prompt_prefix = (char *)NULL;
1953 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
1954 (*rl_redisplay_function) ();
1955
1956 return 0;
1957}
1958#else /* !USE_VARARGS */
1959int
1960rl_message (format, arg1, arg2)
1961 char *format;
--- 7 unchanged lines hidden (view full) ---
1969 rl_save_prompt ();
1970 msg_saved_prompt = 1;
1971 }
1972 local_prompt = expand_prompt (msg_buf, &prompt_visible_length,
1973 &prompt_last_invisible,
1974 &prompt_invis_chars_first_line,
1975 &prompt_physical_chars);
1976 local_prompt_prefix = (char *)NULL;
1977 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
1978 (*rl_redisplay_function) ();
1979
1980 return 0;
1981}
1982#endif /* !USE_VARARGS */
1983
1984/* How to clear things from the "echo-area". */
1985int
--- 20 unchanged lines hidden (view full) ---
2006}
2007
2008void
2009rl_save_prompt ()
2010{
2011 saved_local_prompt = local_prompt;
2012 saved_local_prefix = local_prompt_prefix;
2013 saved_prefix_length = prompt_prefix_length;
2014 saved_local_length = local_prompt_len;
2015 saved_last_invisible = prompt_last_invisible;
2016 saved_visible_length = prompt_visible_length;
2017 saved_invis_chars_first_line = prompt_invis_chars_first_line;
2018 saved_physical_chars = prompt_physical_chars;
2019
2020 local_prompt = local_prompt_prefix = (char *)0;
2021 local_prompt_len = 0;
2022 prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0;
2023 prompt_invis_chars_first_line = prompt_physical_chars = 0;
2024}
2025
2026void
2027rl_restore_prompt ()
2028{
2029 FREE (local_prompt);
2030 FREE (local_prompt_prefix);
2031
2032 local_prompt = saved_local_prompt;
2033 local_prompt_prefix = saved_local_prefix;
2034 local_prompt_len = saved_local_length;
2035 prompt_prefix_length = saved_prefix_length;
2036 prompt_last_invisible = saved_last_invisible;
2037 prompt_visible_length = saved_visible_length;
2038 prompt_invis_chars_first_line = saved_invis_chars_first_line;
2039 prompt_physical_chars = saved_physical_chars;
2040
2041 /* can test saved_local_prompt to see if prompt info has been saved. */
2042 saved_local_prompt = saved_local_prefix = (char *)0;
2043 saved_local_length = 0;
2044 saved_last_invisible = saved_visible_length = saved_prefix_length = 0;
2045 saved_invis_chars_first_line = saved_physical_chars = 0;
2046}
2047
2048char *
2049_rl_make_prompt_for_search (pchar)
2050 int pchar;
2051{
--- 172 unchanged lines hidden (view full) ---
2224 }
2225 _rl_move_vert (_rl_vis_botlin);
2226 /* If we've wrapped lines, remove the final xterm line-wrap flag. */
2227 if (full_lines && _rl_term_autowrap && (VIS_LLEN(_rl_vis_botlin) == _rl_screenwidth))
2228 {
2229 char *last_line;
2230
2231 last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]];
2232 cpos_buffer_position = -1; /* don't know where we are in buffer */
2233 _rl_move_cursor_relative (_rl_screenwidth - 1, last_line); /* XXX */
2234 _rl_clear_to_eol (0);
2235 putc (last_line[_rl_screenwidth - 1], rl_outstream);
2236 }
2237 _rl_vis_botlin = 0;
2238 rl_crlf ();
2239 fflush (rl_outstream);
2240 rl_display_fixed++;
2241}
--- 26 unchanged lines hidden (view full) ---
2268 rl_save_prompt ();
2269
2270 rl_display_prompt = t;
2271 local_prompt = expand_prompt (t, &prompt_visible_length,
2272 &prompt_last_invisible,
2273 &prompt_invis_chars_first_line,
2274 &prompt_physical_chars);
2275 local_prompt_prefix = (char *)NULL;
2276 local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
2277
2278 rl_forced_update_display ();
2279
2280 rl_display_prompt = oldp;
2281 rl_restore_prompt();
2282}
2283
2284/* Redisplay the current line after a SIGWINCH is received. */
--- 86 unchanged lines hidden (view full) ---
2371 In the case of multibyte characters with stateful encoding, we have to
2372 scan from the beginning of the string to take the state into account. */
2373static int
2374_rl_col_width (str, start, end)
2375 const char *str;
2376 int start, end;
2377{
2378 wchar_t wc;
2379 mbstate_t ps;
2380 int tmp, point, width, max;
2381
2382 if (end <= start)
2383 return 0;
2384
2385 memset (&ps, 0, sizeof (mbstate_t));
2386
2387 point = 0;
2388 max = end;
2389
2390 while (point < start)
2391 {
2392 tmp = mbrlen (str + point, max, &ps);
2393 if (MB_INVALIDCH ((size_t)tmp))
2394 {
--- 58 unchanged lines hidden ---