1 |
689 |
jeremybenn |
/* { dg-do compile } */
|
2 |
|
|
/* { dg-require-effective-target lp64 } */
|
3 |
|
|
/* { dg-options "-O2 -ftree-tail-merge" } */
|
4 |
|
|
|
5 |
|
|
enum Lisp_Type
|
6 |
|
|
{
|
7 |
|
|
Lisp_Int0 = 0, Lisp_Int1 = 4, Lisp_Symbol = 2, Lisp_Misc = 3, Lisp_String =
|
8 |
|
|
1, Lisp_Vectorlike = 5, Lisp_Cons = 6, Lisp_Float = 7,
|
9 |
|
|
};
|
10 |
|
|
typedef long Lisp_Object;
|
11 |
|
|
enum pvec_type
|
12 |
|
|
{
|
13 |
|
|
PVEC_NORMAL_VECTOR = 0, PVEC_PROCESS = 0x200, PVEC_FRAME =
|
14 |
|
|
0x400, PVEC_COMPILED = 0x800, PVEC_WINDOW =
|
15 |
|
|
0x1000, PVEC_WINDOW_CONFIGURATION = 0x2000, PVEC_SUBR =
|
16 |
|
|
0x4000, PVEC_CHAR_TABLE = 0x8000, PVEC_BOOL_VECTOR =
|
17 |
|
|
0x10000, PVEC_BUFFER = 0x20000, PVEC_HASH_TABLE = 0x40000, PVEC_TERMINAL =
|
18 |
|
|
0x80000, PVEC_SUB_CHAR_TABLE = 0x100000, PVEC_FONT =
|
19 |
|
|
0x200000, PVEC_OTHER = 0x400000, PVEC_TYPE_MASK = 0x7ffe00
|
20 |
|
|
};
|
21 |
|
|
struct Lisp_Vector
|
22 |
|
|
{
|
23 |
|
|
unsigned long size;
|
24 |
|
|
};
|
25 |
|
|
struct Lisp_Char_Table
|
26 |
|
|
{
|
27 |
|
|
Lisp_Object defalt;
|
28 |
|
|
Lisp_Object ascii;
|
29 |
|
|
};
|
30 |
|
|
struct Lisp_Sub_Char_Table
|
31 |
|
|
{
|
32 |
|
|
Lisp_Object contents[1];
|
33 |
|
|
};
|
34 |
|
|
extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
|
35 |
|
|
struct buffer_text
|
36 |
|
|
{
|
37 |
|
|
unsigned char *beg;
|
38 |
|
|
long gpt_byte;
|
39 |
|
|
long gap_size;
|
40 |
|
|
};
|
41 |
|
|
struct buffer
|
42 |
|
|
{
|
43 |
|
|
struct buffer_text *text;
|
44 |
|
|
struct region_cache *width_run_cache;
|
45 |
|
|
Lisp_Object tab_width;
|
46 |
|
|
Lisp_Object ctl_arrow;
|
47 |
|
|
};
|
48 |
|
|
extern struct buffer *current_buffer;
|
49 |
|
|
extern Lisp_Object Vchar_width_table;
|
50 |
|
|
struct frame
|
51 |
|
|
{
|
52 |
|
|
long text_lines, text_cols;
|
53 |
|
|
};
|
54 |
|
|
struct window
|
55 |
|
|
{
|
56 |
|
|
Lisp_Object frame;
|
57 |
|
|
};
|
58 |
|
|
extern Lisp_Object Vtruncate_partial_width_windows;
|
59 |
|
|
extern struct Lisp_Char_Table *window_display_table (struct window *);
|
60 |
|
|
struct position *
|
61 |
|
|
compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos,
|
62 |
|
|
width, hscroll, tab_offset, win)
|
63 |
|
|
long from, fromvpos, fromhpos, to, tovpos, tohpos;
|
64 |
|
|
struct window *win;
|
65 |
|
|
{
|
66 |
|
|
register long hpos = fromhpos;
|
67 |
|
|
register long pos;
|
68 |
|
|
long pos_byte;
|
69 |
|
|
register int c = 0;
|
70 |
|
|
register struct Lisp_Char_Table *dp = window_display_table (win);
|
71 |
|
|
long wide_column_end_hpos = 0;
|
72 |
|
|
long continuation_glyph_width;
|
73 |
|
|
while (1)
|
74 |
|
|
{
|
75 |
|
|
if (hpos > width)
|
76 |
|
|
{
|
77 |
|
|
int total_width = width + continuation_glyph_width;
|
78 |
|
|
if (!((Vtruncate_partial_width_windows) == (Qnil))
|
79 |
|
|
&& (total_width <
|
80 |
|
|
(((void) 0,
|
81 |
|
|
(struct frame
|
82 |
|
|
*) ((long) (((win)->frame) & ~((((long) 1) << 3) -
|
83 |
|
|
1)))))->text_cols))
|
84 |
|
|
{
|
85 |
|
|
if (pos <= to)
|
86 |
|
|
{
|
87 |
|
|
pos = find_before_next_newline (pos, to, 1);
|
88 |
|
|
}
|
89 |
|
|
if (wide_column_end_hpos > width)
|
90 |
|
|
{
|
91 |
|
|
hpos -= width;
|
92 |
|
|
}
|
93 |
|
|
}
|
94 |
|
|
}
|
95 |
|
|
else
|
96 |
|
|
{
|
97 |
|
|
Lisp_Object charvec;
|
98 |
|
|
c =
|
99 |
|
|
*(((((pos_byte)) >=
|
100 |
|
|
(current_buffer->text->gpt_byte) ? (current_buffer->text->
|
101 |
|
|
gap_size) : 0) +
|
102 |
|
|
((pos_byte)) + (current_buffer->text->beg) - ((1))));
|
103 |
|
|
if (current_buffer->width_run_cache)
|
104 |
|
|
{
|
105 |
|
|
if (((((enum Lisp_Type) (((unsigned long) ((charvec))) &
|
106 |
|
|
((((long) 1) << 3) - 1))) ==
|
107 |
|
|
Lisp_Vectorlike)
|
108 |
|
|
&&
|
109 |
|
|
!(((void) 0,
|
110 |
|
|
(struct Lisp_Vector
|
111 |
|
|
*) ((long) ((charvec) & ~((((long) 1) << 3) - 1))))->
|
112 |
|
|
size & ((((unsigned long) 1 << (64 - 1)) >> 1)))))
|
113 |
|
|
{
|
114 |
|
|
unsigned char *ptr;
|
115 |
|
|
int bytes, width, wide_column;
|
116 |
|
|
do
|
117 |
|
|
{
|
118 |
|
|
if ((!((*ptr) & 0x80) ? 1 : !((*ptr) & 0x20) ? 2 :
|
119 |
|
|
!((*ptr) & 0x10) ? 3 : !((*ptr) & 0x08) ? 4 : 5) !=
|
120 |
|
|
bytes)
|
121 |
|
|
width = bytes * 4;
|
122 |
|
|
else
|
123 |
|
|
{
|
124 |
|
|
if (dp != 0
|
125 |
|
|
&&
|
126 |
|
|
((((enum
|
127 |
|
|
Lisp_Type) (((unsigned
|
128 |
|
|
long) (((((unsigned) (c) <
|
129 |
|
|
0x80)
|
130 |
|
|
? ((((dp)->ascii) ==
|
131 |
|
|
(Qnil)) ? (dp)->
|
132 |
|
|
defalt
|
133 |
|
|
: (((((enum
|
134 |
|
|
Lisp_Type)
|
135 |
|
|
(((unsigned
|
136 |
|
|
long) (((dp)->ascii))) & ((((long) 1) << 3) - 1))) == Lisp_Vectorlike) && (((((void) 0, (struct Lisp_Vector *) ((long) (((dp)->ascii) & ~((((long) 1) << 3) - 1))))->size & (((((unsigned long) 1 << (64 - 1)) >> 1)) | (PVEC_SUB_CHAR_TABLE)))) == (((((unsigned long) 1 << (64 - 1)) >> 1)) | (PVEC_SUB_CHAR_TABLE)))) ? ((void) 0, (struct Lisp_Sub_Char_Table *) ((long) (((dp)->ascii) & ~((((long) 1) << 3) - 1))))->contents[c] : (dp)->ascii)) : disp_char_vector ((dp), (c)))))) & ((((long) 1) << 3) - 1))) == Lisp_Vectorlike) && !(((void) 0, (struct Lisp_Vector *) ((long) (((((unsigned) (c) < 0x80) ? ((((dp)->ascii) == (Qnil)) ? (dp)->defalt : (((((enum Lisp_Type) (((unsigned long) (((dp)->ascii))) & ((((long) 1) << 3) - 1))) == Lisp_Vectorlike) && (((((void) 0, (struct Lisp_Vector *) ((long) (((dp)->ascii) & ~((((long) 1) << 3) - 1))))->size & (((((unsigned long) 1 << (64 - 1)) >> 1)) | (PVEC_SUB_CHAR_TABLE)))) == (((((unsigned long) 1 << (64 - 1)) >> 1)) | (PVEC_SUB_CHAR_TABLE)))) ? ((void) 0, (struct Lisp_Sub_Char_Table *) ((long) (((dp)->ascii) & ~((((long) 1) << 3) - 1))))->contents[c] : (dp)->ascii)) : disp_char_vector ((dp), (c)))) & ~((((long) 1) << 3) - 1))))->size & ((((unsigned long) 1 << (64 - 1)) >> 1)))))
|
137 |
|
|
width =
|
138 |
|
|
((void) 0,
|
139 |
|
|
(struct Lisp_Vector
|
140 |
|
|
*) ((long) (((((unsigned) (c) <
|
141 |
|
|
0x80) ? ((((dp)->ascii) ==
|
142 |
|
|
(Qnil)) ? (dp)->
|
143 |
|
|
defalt
|
144 |
|
|
: (((((enum
|
145 |
|
|
Lisp_Type) (((unsigned long) (((dp)->ascii))) & ((((long) 1) << 3) - 1))) == Lisp_Vectorlike) && (((((void) 0, (struct Lisp_Vector *) ((long) (((dp)->ascii) & ~((((long) 1) << 3) - 1))))->size & (((((unsigned long) 1 << (64 - 1)) >> 1)) | (PVEC_SUB_CHAR_TABLE)))) == (((((unsigned long) 1 << (64 - 1)) >> 1)) | (PVEC_SUB_CHAR_TABLE)))) ? ((void) 0, (struct Lisp_Sub_Char_Table *) ((long) (((dp)->ascii) & ~((((long) 1) << 3) - 1))))->contents[c] : (dp)->ascii)) : disp_char_vector ((dp), (c)))) & ~((((long) 1) << 3) - 1))))->size;
|
146 |
|
|
else
|
147 |
|
|
width =
|
148 |
|
|
(((unsigned) (c) < 0x80) ? (c <
|
149 |
|
|
0x20 ? (c ==
|
150 |
|
|
'\t'
|
151 |
|
|
? ((((long)
|
152 |
|
|
(current_buffer->
|
153 |
|
|
tab_width))
|
154 |
|
|
>> (3 -
|
155 |
|
|
1)))
|
156 |
|
|
: (c ==
|
157 |
|
|
'\n' ? 0
|
158 |
|
|
: (((current_buffer->ctl_arrow) == (Qnil)) ? 4 : 2))) : (c < 0x7f ? 1 : ((((current_buffer->ctl_arrow) == (Qnil)) ? 4 : 2)))) : (((long) ((((unsigned) (c) < 0x80) ? (
|
159 |
|
|
{
|
160 |
|
|
Lisp_Object
|
161 |
|
|
_val;
|
162 |
|
|
_val;}
|
163 |
|
|
): char_table_ref ((Vchar_width_table), (c))))) >> (3 - 1)));
|
164 |
|
|
if (width > 1)
|
165 |
|
|
wide_column = width;
|
166 |
|
|
}
|
167 |
|
|
}
|
168 |
|
|
while (0);
|
169 |
|
|
if (wide_column)
|
170 |
|
|
wide_column_end_hpos = hpos + wide_column;
|
171 |
|
|
}
|
172 |
|
|
}
|
173 |
|
|
}
|
174 |
|
|
}
|
175 |
|
|
}
|