\f
/* Set variables WIDTH and BYTES for a multibyte sequence starting at P.
- C is *P which should satisfy `BASE_LEADING_CODE_P (c)'.
-
DP is a display table or NULL.
This macro is used in current_column_1, Fmove_to_column, and
compute_motion. */
-#define MULTIBYTE_BYTES_WIDTH(p, c, dp) \
- do { \
- unsigned char *pend = p + 1; \
- \
- wide_column = 0; \
- while (! CHAR_HEAD_P (*pend)) pend++; \
- \
- if (c == LEADING_CODE_COMPOSITION) \
- { \
- int id = str_cmpchar_id (p, pend - p); \
- int ch = MAKE_COMPOSITE_CHAR (id); \
- \
- if (id >= 0) \
- { \
- bytes = cmpchar_table[id]->len; \
- if (dp != 0 && VECTORP (DISP_CHAR_VECTOR (dp, ch))) \
- width = XVECTOR (DISP_CHAR_VECTOR (dp, ch))->size; \
- else \
- width = cmpchar_table[id]->width; \
- if (width > 1) \
- wide_column = width; \
- } \
- else \
- { \
- bytes = 1; \
- width = 4; \
- } \
- } \
- else \
- { \
- bytes = BYTES_BY_CHAR_HEAD (c); \
- if (bytes >= 2 && bytes <= pend - p) \
- { \
- int ch = STRING_CHAR (p, bytes); \
- \
- if (CHAR_VALID_P (ch, 0)) \
- { \
- if (dp && VECTORP (DISP_CHAR_VECTOR (dp, ch))) \
- width = XVECTOR (DISP_CHAR_VECTOR (dp, ch))->size; \
- else \
- width = WIDTH_BY_CHAR_HEAD (c); \
- } \
- else \
- width = bytes * 4; \
- if (width > 1) \
- wide_column = width; \
- } \
- else \
- { \
- bytes = 1; \
- width = 4; \
- } \
- } \
- if (p + bytes < pend) \
- { \
- width += 4 * (pend - (p + bytes)); \
- bytes = pend - p; \
- } \
+#define MULTIBYTE_BYTES_WIDTH(p, dp) \
+ do { \
+ int c; \
+ \
+ wide_column = 0; \
+ c = STRING_CHAR_AND_LENGTH (p, MAX_LENGTH_OF_MULTI_BYTE_FORM, bytes); \
+ if (BYTES_BY_CHAR_HEAD (*p) != bytes) \
+ width = bytes * 4; \
+ else \
+ { \
+ if (dp != 0 && VECTORP (DISP_CHAR_VECTOR (dp, c))) \
+ width = XVECTOR (DISP_CHAR_VECTOR (dp, c))->size; \
+ else \
+ width = WIDTH_BY_CHAR_HEAD (*p); \
+ if (width > 1) \
+ wide_column = width; \
+ } \
} while (0)
DEFUN ("current-column", Fcurrent_column, Scurrent_column, 0, 0, 0,
scan_byte--;
ptr = BYTE_POS_ADDR (scan_byte);
- MULTIBYTE_BYTES_WIDTH (ptr, c, dp);
+ MULTIBYTE_BYTES_WIDTH (ptr, dp);
scan_byte += bytes;
col += width;
}
pos_byte--;
ptr = BYTE_POS_ADDR (pos_byte);
- MULTIBYTE_BYTES_WIDTH (ptr, c, dp);
+ MULTIBYTE_BYTES_WIDTH (ptr, dp);
pos_byte += bytes;
col += width;
}
pos_byte--; /* rewind POS_BYTE */
ptr = BYTE_POS_ADDR (pos_byte);
- MULTIBYTE_BYTES_WIDTH (ptr, c, dp);
+ MULTIBYTE_BYTES_WIDTH (ptr, dp);
pos_byte += bytes;
if (wide_column)
wide_column_end_hpos = hpos + wide_column;
CHECK_NUMBER_COERCE_MARKER (from, 0);
CHECK_CONS (frompos, 0);
- CHECK_NUMBER (XCONS (frompos)->car, 0);
- CHECK_NUMBER (XCONS (frompos)->cdr, 0);
+ CHECK_NUMBER (XCAR (frompos), 0);
+ CHECK_NUMBER (XCDR (frompos), 0);
CHECK_NUMBER_COERCE_MARKER (to, 0);
CHECK_CONS (topos, 0);
- CHECK_NUMBER (XCONS (topos)->car, 0);
- CHECK_NUMBER (XCONS (topos)->cdr, 0);
+ CHECK_NUMBER (XCAR (topos), 0);
+ CHECK_NUMBER (XCDR (topos), 0);
CHECK_NUMBER (width, 0);
if (!NILP (offsets))
{
CHECK_CONS (offsets, 0);
- CHECK_NUMBER (XCONS (offsets)->car, 0);
- CHECK_NUMBER (XCONS (offsets)->cdr, 0);
- hscroll = XINT (XCONS (offsets)->car);
- tab_offset = XINT (XCONS (offsets)->cdr);
+ CHECK_NUMBER (XCAR (offsets), 0);
+ CHECK_NUMBER (XCDR (offsets), 0);
+ hscroll = XINT (XCAR (offsets));
+ tab_offset = XINT (XCDR (offsets));
}
else
hscroll = tab_offset = 0;
if (XINT (to) < BEGV || XINT (to) > ZV)
args_out_of_range_3 (to, make_number (BEGV), make_number (ZV));
- pos = compute_motion (XINT (from), XINT (XCONS (frompos)->cdr),
- XINT (XCONS (frompos)->car), 0,
- XINT (to), XINT (XCONS (topos)->cdr),
- XINT (XCONS (topos)->car),
+ pos = compute_motion (XINT (from), XINT (XCDR (frompos)),
+ XINT (XCAR (frompos)), 0,
+ XINT (to), XINT (XCDR (topos)),
+ XINT (XCAR (topos)),
XINT (width), hscroll, tab_offset,
XWINDOW (window));