# HG changeset patch # User Thien-Thi Nguyen # Date 1023069122 0 # Node ID ff3b6311d00f43822680fb77c225576906320e6f # Parent d3c9a21335792d76ecb6b566ce7156f2ed321b2c (last_known_column): Now a float. (current_column_1, position_indentation, current_column, string_display_width): Return float. (Fcurrent_column): Cast `current_column' return value to int. (Fcurrent_indentation): Cast `position_indentation' retval to int. (indented_beyond_p): Third arg now a float. (compute_motion, vmotion): Cast `indented_beyond_p' 3rd arg to float. diff -r d3c9a2133579 -r ff3b6311d00f src/indent.c --- a/src/indent.c Mon Jun 03 01:50:02 2002 +0000 +++ b/src/indent.c Mon Jun 03 01:52:02 2002 +0000 @@ -47,7 +47,7 @@ Some things in set last_known_column_point to -1 to mark the memorized value as invalid. */ -int last_known_column; +float last_known_column; /* Value of point when current_column was called. */ @@ -57,8 +57,8 @@ int last_known_column_modified; -static int current_column_1 P_ ((void)); -static int position_indentation P_ ((int)); +static float current_column_1 P_ ((void)); +static float position_indentation P_ ((int)); /* Cache of beginning of line found by the last call of current_column. */ @@ -329,6 +329,7 @@ } \ } while (0) + DEFUN ("current-column", Fcurrent_column, Scurrent_column, 0, 0, 0, doc: /* Return the horizontal position of point. Beginning of line is column 0. This is calculated by adding together the widths of all the displayed @@ -342,7 +343,7 @@ () { Lisp_Object temp; - XSETFASTINT (temp, current_column ()); + XSETFASTINT (temp, (int) current_column ()); /* iftc */ return temp; } @@ -354,7 +355,7 @@ last_known_column_point = 0; } -int +float current_column () { register int col; @@ -401,25 +402,25 @@ { EMACS_INT i, n; Lisp_Object charvec; - + if (ptr == stop) { /* We stopped either for the beginning of the buffer or for the gap. */ if (ptr == BEGV_ADDR) break; - + /* It was the gap. Jump back over it. */ stop = BEGV_ADDR; ptr = GPT_ADDR; - + /* Check whether that brings us to beginning of buffer. */ if (BEGV >= GPT) break; } c = *--ptr; - + if (dp && VECTORP (DISP_CHAR_VECTOR (dp, c))) { charvec = DISP_CHAR_VECTOR (dp, c); @@ -430,7 +431,7 @@ charvec = Qnil; n = 1; } - + for (i = n - 1; i >= 0; --i) { if (VECTORP (charvec)) @@ -438,14 +439,14 @@ /* This should be handled the same as next_element_from_display_vector does it. */ Lisp_Object entry = AREF (charvec, i); - + if (INTEGERP (entry) && GLYPH_CHAR_VALID_P (XFASTINT (entry))) c = FAST_GLYPH_CHAR (XFASTINT (entry)); else c = ' '; } - + if (c >= 040 && c < 0177) col++; else if (c == '\n' @@ -459,7 +460,7 @@ { if (tab_seen) col = ((col + tab_width) / tab_width) * tab_width; - + post_tab += col; col = 0; tab_seen = 1; @@ -501,7 +502,7 @@ This function handles characters that are invisible due to text properties or overlays. */ -static int +static float current_column_1 () { register int tab_width = XINT (current_buffer->tab_width); @@ -615,7 +616,7 @@ { unsigned char *ptr; int bytes, width, wide_column; - + ptr = BYTE_POS_ADDR (scan_byte); MULTIBYTE_BYTES_WIDTH (ptr, dp); scan_byte += bytes; @@ -651,7 +652,7 @@ If BEG is nil, that stands for the beginning of STRING. If END is nil, that stands for the end of STRING. */ -static int +static float string_display_width (string, beg, end) Lisp_Object string, beg, end; { @@ -777,7 +778,7 @@ } -static int position_indentation P_ ((int)); +static float position_indentation P_ ((int)); DEFUN ("current-indentation", Fcurrent_indentation, Scurrent_indentation, 0, 0, 0, @@ -791,12 +792,12 @@ scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, -1, 1); - XSETFASTINT (val, position_indentation (PT_BYTE)); + XSETFASTINT (val, (int) position_indentation (PT_BYTE)); /* iftc */ SET_PT_BOTH (opoint, opoint_byte); return val; } -static int +static float position_indentation (pos_byte) register int pos_byte; { @@ -846,7 +847,7 @@ /* The -1 and +1 arrange to point at the first byte of gap (if STOP_POS_BYTE is the position of the gap) rather than at the data after the gap. */ - + stop = BYTE_POS_ADDR (stop_pos_byte - 1) + 1; p = BYTE_POS_ADDR (pos_byte); } @@ -888,9 +889,10 @@ int indented_beyond_p (pos, pos_byte, column) - int pos, pos_byte, column; + int pos, pos_byte; + float column; { - int val; + float val; int opoint = PT, opoint_byte = PT_BYTE; SET_PT_BOTH (pos, pos_byte); @@ -899,7 +901,7 @@ val = position_indentation (PT_BYTE); SET_PT_BOTH (opoint, opoint_byte); - return val >= column; + return val >= column; /* hmm, float comparison */ } DEFUN ("move-to-column", Fmove_to_column, Smove_to_column, 1, 2, "p", @@ -1093,7 +1095,7 @@ goal_pt_byte = PT_BYTE; Findent_to (make_number (col), Qnil); SET_PT_BOTH (goal_pt, goal_pt_byte); - + /* Set the last_known... vars consistently. */ col = goal; } @@ -1352,7 +1354,7 @@ W_ ^---- next after the point ^---- next char. after the point. ---------- - In case of wide-column character + In case of wide-column character The problem here is continuation at a wide-column character. In this case, the line may shorter less than WIDTH. @@ -1522,7 +1524,7 @@ { EMACS_INT i, n; Lisp_Object charvec; - + c = FETCH_BYTE (pos_byte); /* Check composition sequence. */ @@ -1588,14 +1590,14 @@ /* This should be handled the same as next_element_from_display_vector does it. */ Lisp_Object entry = AREF (charvec, i); - + if (INTEGERP (entry) && GLYPH_CHAR_VALID_P (XFASTINT (entry))) c = FAST_GLYPH_CHAR (XFASTINT (entry)); else c = ' '; } - + if (c >= 040 && c < 0177) hpos++; else if (c == '\t') @@ -1609,7 +1611,8 @@ else if (c == '\n') { if (selective > 0 - && indented_beyond_p (pos, pos_byte, selective)) + && indented_beyond_p (pos, pos_byte, + (float) selective)) /* iftc */ { /* If (pos == to), we don't have to take care of selective display. */ @@ -1624,7 +1627,8 @@ pos_byte = CHAR_TO_BYTE (pos); } while (pos < to - && indented_beyond_p (pos, pos_byte, selective)); + && indented_beyond_p (pos, pos_byte, + (float) selective)); /* iftc */ /* Allow for the " ..." that is displayed for them. */ if (selective_rlen) { @@ -1874,7 +1878,7 @@ && ((selective > 0 && indented_beyond_p (XFASTINT (prevline), CHAR_TO_BYTE (XFASTINT (prevline)), - selective)) + (float) selective)) /* iftc */ /* watch out for newlines with `invisible' property */ || (propval = Fget_char_property (prevline, Qinvisible, @@ -1887,7 +1891,7 @@ lmargin + (XFASTINT (prevline) == BEG ? start_hpos : 0), 0, - from, + from, /* Don't care for VPOS... */ 1 << (BITS_PER_SHORT - 1), /* ... nor HPOS. */ @@ -1934,7 +1938,7 @@ && ((selective > 0 && indented_beyond_p (XFASTINT (prevline), CHAR_TO_BYTE (XFASTINT (prevline)), - selective)) + (float) selective)) /* iftc */ /* watch out for newlines with `invisible' property */ || (propval = Fget_char_property (prevline, Qinvisible, text_prop_object), @@ -1946,7 +1950,7 @@ lmargin + (XFASTINT (prevline) == BEG ? start_hpos : 0), 0, - from, + from, /* Don't care for VPOS... */ 1 << (BITS_PER_SHORT - 1), /* ... nor HPOS. */ @@ -2015,7 +2019,7 @@ old_buffer = w->buffer; XSETBUFFER (w->buffer, current_buffer); } - + SET_TEXT_POS (pt, PT, PT_BYTE); start_display (&it, w, pt); @@ -2028,12 +2032,12 @@ if (XINT (lines) != 0) move_it_by_lines (&it, XINT (lines), 0); - + SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); if (BUFFERP (old_buffer)) w->buffer = old_buffer; - + RETURN_UNGCPRO (make_number (it.vpos)); }