Mercurial > hg > xemacs-beta
annotate src/select-xlike-inc.c @ 5184:039d9a7f2e6d
Call init_string_ascii_begin() in #'sort*, #'fill, don't be clever.
2010-04-02 Aidan Kehoe <kehoea@parhasard.net>
* fns.c (FsortX, Ffill):
Don't try to be clever with the ascii_begin string header slot in
these function, just call init_string_ascii_begin().
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Fri, 02 Apr 2010 12:31:23 +0100 |
parents | 358aa3bb603f |
children | 308d34e9f07d |
rev | line source |
---|---|
647 | 1 /* Selection processing for XEmacs -- common btwn select-x.c and select-gtk.c |
2 Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not synched with FSF. */ | |
22 | |
4984 | 23 #ifdef THIS_IS_X |
647 | 24 #define XE_ATOM_TYPE Atom |
25 #define XE_ATOM_TO_SYMBOL x_atom_to_symbol | |
26 #define XE_SYMBOL_TO_ATOM symbol_to_x_atom | |
27 #else | |
28 #define XE_ATOM_TYPE GdkAtom | |
29 #define XE_ATOM_TO_SYMBOL atom_to_symbol | |
30 #define XE_SYMBOL_TO_ATOM symbol_to_gtk_atom | |
4984 | 31 #endif /* THIS_IS_X */ |
647 | 32 |
33 /* #### These are going to move into Lisp code(!) with the aid of | |
34 some new functions I'm working on - ajh */ | |
35 | |
36 /* These functions convert from the selection data read from the server into | |
37 something that we can use from elisp, and vice versa. | |
38 | |
39 Type: Format: Size: Elisp Type: | |
40 ----- ------- ----- ----------- | |
41 * 8 * String | |
42 ATOM 32 1 Symbol | |
43 ATOM 32 > 1 Vector of Symbols | |
44 * 16 1 Integer | |
45 * 16 > 1 Vector of Integers | |
46 * 32 1 if <=16 bits: Integer | |
47 if > 16 bits: Cons of top16, bot16 | |
48 * 32 > 1 Vector of the above | |
49 | |
3833 | 50 NOTE NOTE NOTE: |
51 Format == 32 means that the buffer will be C longs, which need not be | |
52 32-bit quantities. See the note in select-x.c (x_get_window_property). | |
53 | |
647 | 54 When converting a Lisp number to C, it is assumed to be of format 16 if |
55 it is an integer, and of format 32 if it is a cons of two integers. | |
56 | |
57 When converting a vector of numbers from Elisp to C, it is assumed to be | |
58 of format 16 if every element in the vector is an integer, and is assumed | |
59 to be of format 32 if any element is a cons of two integers. | |
60 | |
61 When converting an object to C, it may be of the form (SYMBOL . <data>) | |
62 where SYMBOL is what we should claim that the type is. Format and | |
63 representation are as above. | |
64 | |
65 NOTE: Under Mule, when someone shoves us a string without a type, we | |
3025 | 66 set the type to `COMPOUND_TEXT' and automatically convert to Compound |
647 | 67 Text. If the string has a type, we assume that the user wants the |
68 data sent as-is so we just do "binary" conversion. | |
69 */ | |
70 | |
71 | |
72 static Lisp_Object | |
73 selection_data_to_lisp_data (struct device *d, | |
2367 | 74 Rawbyte *data, |
665 | 75 Bytecount size, |
647 | 76 XE_ATOM_TYPE type, |
77 int format) | |
78 { | |
4984 | 79 #ifdef THIS_IS_X |
647 | 80 if (type == DEVICE_XATOM_NULL (d)) |
81 return QNULL; | |
82 | |
83 /* Convert any 8-bit data to a string, for compactness. */ | |
84 else if (format == 8) | |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
3833
diff
changeset
|
85 return make_extstring ((Extbyte *) data, size, |
647 | 86 type == DEVICE_XATOM_TEXT (d) || |
87 type == DEVICE_XATOM_COMPOUND_TEXT (d) | |
88 ? Qctext : Qbinary); | |
89 | |
90 /* Convert a single atom to a Lisp Symbol. | |
91 Convert a set of atoms to a vector of symbols. */ | |
92 else if (type == XA_ATOM) | |
93 #else | |
94 if (type == gdk_atom_intern ("NULL", 0)) | |
95 return QNULL; | |
96 | |
97 /* Convert any 8-bit data to a string, for compactness. */ | |
98 else if (format == 8) | |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
3833
diff
changeset
|
99 return make_extstring ((Extbyte *) data, size, |
647 | 100 ((type == gdk_atom_intern ("TEXT", FALSE)) || |
101 (type == gdk_atom_intern ("COMPOUND_TEXT", FALSE))) | |
102 ? Qctext : Qbinary); | |
103 | |
104 /* Convert a single atom to a Lisp Symbol. | |
105 Convert a set of atoms to a vector of symbols. */ | |
106 else if (type == gdk_atom_intern ("ATOM", FALSE)) | |
4984 | 107 #endif /* THIS_IS_X */ |
647 | 108 { |
109 if (size == sizeof (XE_ATOM_TYPE)) | |
110 return XE_ATOM_TO_SYMBOL (d, *((XE_ATOM_TYPE *) data)); | |
111 else | |
112 { | |
665 | 113 Elemcount i; |
114 Elemcount len = size / sizeof (XE_ATOM_TYPE); | |
647 | 115 Lisp_Object v = Fmake_vector (make_int (len), Qzero); |
116 for (i = 0; i < len; i++) | |
117 Faset (v, make_int (i), XE_ATOM_TO_SYMBOL (d, ((XE_ATOM_TYPE *) data) [i])); | |
118 return v; | |
119 } | |
120 } | |
121 | |
122 /* Convert a single 16 or small 32 bit number to a Lisp Int. | |
123 If the number is > 16 bits, convert it to a cons of integers, | |
124 16 bits in each half. | |
125 */ | |
126 else if (format == 32 && size == sizeof (long)) | |
127 return word_to_lisp (((unsigned long *) data) [0]); | |
128 else if (format == 16 && size == sizeof (short)) | |
129 return make_int ((int) (((unsigned short *) data) [0])); | |
130 | |
131 /* Convert any other kind of data to a vector of numbers, represented | |
132 as above (as an integer, or a cons of two 16 bit integers). | |
133 | |
134 #### Perhaps we should return the actual type to lisp as well. | |
135 | |
136 (x-get-selection-internal 'PRIMARY 'LINE_NUMBER) | |
137 ==> [4 4] | |
138 | |
139 and perhaps it should be | |
140 | |
141 (x-get-selection-internal 'PRIMARY 'LINE_NUMBER) | |
142 ==> (SPAN . [4 4]) | |
143 | |
144 Right now the fact that the return type was SPAN is discarded before | |
145 lisp code gets to see it. | |
146 */ | |
147 else if (format == 16) | |
148 { | |
665 | 149 Elemcount i; |
647 | 150 Lisp_Object v = make_vector (size / 4, Qzero); |
151 for (i = 0; i < size / 4; i++) | |
152 { | |
153 int j = (int) ((unsigned short *) data) [i]; | |
154 Faset (v, make_int (i), make_int (j)); | |
155 } | |
156 return v; | |
157 } | |
158 else | |
159 { | |
665 | 160 Elemcount i; |
647 | 161 Lisp_Object v = make_vector (size / 4, Qzero); |
162 for (i = 0; i < size / 4; i++) | |
163 { | |
164 unsigned long j = ((unsigned long *) data) [i]; | |
165 Faset (v, make_int (i), word_to_lisp (j)); | |
166 } | |
167 return v; | |
168 } | |
169 } | |
170 | |
171 | |
172 static void | |
173 lisp_data_to_selection_data (struct device *d, | |
174 Lisp_Object obj, | |
2367 | 175 Rawbyte **data_ret, |
647 | 176 XE_ATOM_TYPE *type_ret, |
665 | 177 Bytecount *size_ret, |
647 | 178 int *format_ret) |
179 { | |
180 Lisp_Object type = Qnil; | |
181 | |
182 if (CONSP (obj) && SYMBOLP (XCAR (obj))) | |
183 { | |
184 type = XCAR (obj); | |
185 obj = XCDR (obj); | |
186 if (CONSP (obj) && NILP (XCDR (obj))) | |
187 obj = XCAR (obj); | |
188 } | |
189 | |
190 if (EQ (obj, QNULL) || (EQ (type, QNULL))) | |
191 { /* This is not the same as declining */ | |
192 *format_ret = 32; | |
193 *size_ret = 0; | |
194 *data_ret = 0; | |
195 type = QNULL; | |
196 } | |
197 else if (STRINGP (obj)) | |
198 { | |
199 const Extbyte *extval; | |
665 | 200 Bytecount extvallen; |
647 | 201 |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
202 LISP_STRING_TO_SIZED_EXTERNAL (obj, extval, extvallen, |
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
203 (NILP (type) ? Qctext : Qbinary)); |
647 | 204 *format_ret = 8; |
205 *size_ret = extvallen; | |
2367 | 206 *data_ret = xnew_rawbytes (*size_ret); |
647 | 207 memcpy (*data_ret, extval, *size_ret); |
208 #ifdef MULE | |
209 if (NILP (type)) type = QCOMPOUND_TEXT; | |
210 #else | |
211 if (NILP (type)) type = QSTRING; | |
212 #endif | |
213 } | |
214 else if (CHARP (obj)) | |
215 { | |
867 | 216 Ibyte buf[MAX_ICHAR_LEN]; |
647 | 217 Bytecount len; |
218 const Extbyte *extval; | |
665 | 219 Bytecount extvallen; |
647 | 220 |
221 *format_ret = 8; | |
867 | 222 len = set_itext_ichar (buf, XCHAR (obj)); |
647 | 223 TO_EXTERNAL_FORMAT (DATA, (buf, len), |
224 ALLOCA, (extval, extvallen), | |
225 Qctext); | |
226 *size_ret = extvallen; | |
2367 | 227 *data_ret = xnew_rawbytes (*size_ret); |
647 | 228 memcpy (*data_ret, extval, *size_ret); |
229 #ifdef MULE | |
230 if (NILP (type)) type = QCOMPOUND_TEXT; | |
231 #else | |
232 if (NILP (type)) type = QSTRING; | |
233 #endif | |
234 } | |
235 else if (SYMBOLP (obj)) | |
236 { | |
237 *format_ret = 32; | |
238 *size_ret = 1; | |
2367 | 239 *data_ret = xnew_rawbytes (sizeof (XE_ATOM_TYPE) + 1); |
647 | 240 (*data_ret) [sizeof (XE_ATOM_TYPE)] = 0; |
241 (*(XE_ATOM_TYPE **) data_ret) [0] = XE_SYMBOL_TO_ATOM (d, obj, 0); | |
242 if (NILP (type)) type = QATOM; | |
243 } | |
244 else if (INTP (obj) && | |
245 XINT (obj) <= 0x7FFF && | |
246 XINT (obj) >= -0x8000) | |
247 { | |
248 *format_ret = 16; | |
249 *size_ret = 1; | |
2367 | 250 *data_ret = xnew_rawbytes (sizeof (short) + 1); |
647 | 251 (*data_ret) [sizeof (short)] = 0; |
252 (*(short **) data_ret) [0] = (short) XINT (obj); | |
253 if (NILP (type)) type = QINTEGER; | |
254 } | |
255 else if (INTP (obj) || CONSP (obj)) | |
256 { | |
257 *format_ret = 32; | |
258 *size_ret = 1; | |
2367 | 259 *data_ret = xnew_rawbytes (sizeof (long) + 1); |
647 | 260 (*data_ret) [sizeof (long)] = 0; |
261 (*(unsigned long **) data_ret) [0] = lisp_to_word (obj); | |
262 if (NILP (type)) type = QINTEGER; | |
263 } | |
264 else if (VECTORP (obj)) | |
265 { | |
266 /* Lisp Vectors may represent a set of ATOMs; | |
267 a set of 16 or 32 bit INTEGERs; | |
268 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...] | |
269 */ | |
665 | 270 Elemcount i; |
647 | 271 |
272 if (SYMBOLP (XVECTOR_DATA (obj) [0])) | |
273 /* This vector is an ATOM set */ | |
274 { | |
275 if (NILP (type)) type = QATOM; | |
276 *size_ret = XVECTOR_LENGTH (obj); | |
277 *format_ret = 32; | |
2367 | 278 *data_ret = xnew_rawbytes ((*size_ret) * sizeof (XE_ATOM_TYPE)); |
647 | 279 for (i = 0; i < *size_ret; i++) |
280 if (SYMBOLP (XVECTOR_DATA (obj) [i])) | |
281 (*(XE_ATOM_TYPE **) data_ret) [i] = | |
282 XE_SYMBOL_TO_ATOM (d, XVECTOR_DATA (obj) [i], 0); | |
283 else | |
284 syntax_error | |
285 ("all elements of the vector must be of the same type", obj); | |
286 } | |
287 #if 0 /* #### MULTIPLE doesn't work yet */ | |
288 else if (VECTORP (XVECTOR_DATA (obj) [0])) | |
289 /* This vector is an ATOM_PAIR set */ | |
290 { | |
291 if (NILP (type)) type = QATOM_PAIR; | |
292 *size_ret = XVECTOR_LENGTH (obj); | |
293 *format_ret = 32; | |
2367 | 294 *data_ret = |
295 xnew_rawbytes ((*size_ret) * sizeof (XE_ATOM_TYPE) * 2); | |
647 | 296 for (i = 0; i < *size_ret; i++) |
297 if (VECTORP (XVECTOR_DATA (obj) [i])) | |
298 { | |
299 Lisp_Object pair = XVECTOR_DATA (obj) [i]; | |
300 if (XVECTOR_LENGTH (pair) != 2) | |
301 syntax_error | |
302 ("elements of the vector must be vectors of exactly two elements", pair); | |
303 | |
304 (*(XE_ATOM_TYPE **) data_ret) [i * 2] = | |
305 XE_SYMBOL_TO_ATOM (d, XVECTOR_DATA (pair) [0], 0); | |
306 (*(XE_ATOM_TYPE **) data_ret) [(i * 2) + 1] = | |
307 XE_SYMBOL_TO_ATOM (d, XVECTOR_DATA (pair) [1], 0); | |
308 } | |
309 else | |
310 syntax_error | |
311 ("all elements of the vector must be of the same type", obj); | |
312 } | |
313 #endif | |
314 else | |
315 /* This vector is an INTEGER set, or something like it */ | |
316 { | |
317 *size_ret = XVECTOR_LENGTH (obj); | |
318 if (NILP (type)) type = QINTEGER; | |
319 *format_ret = 16; | |
320 for (i = 0; i < *size_ret; i++) | |
321 if (CONSP (XVECTOR_DATA (obj) [i])) | |
322 *format_ret = 32; | |
323 else if (!INTP (XVECTOR_DATA (obj) [i])) | |
324 syntax_error | |
325 ("all elements of the vector must be integers or conses of integers", obj); | |
326 | |
2367 | 327 *data_ret = xnew_rawbytes (*size_ret * (*format_ret/8)); |
647 | 328 for (i = 0; i < *size_ret; i++) |
329 if (*format_ret == 32) | |
330 (*((unsigned long **) data_ret)) [i] = | |
331 lisp_to_word (XVECTOR_DATA (obj) [i]); | |
332 else | |
333 (*((unsigned short **) data_ret)) [i] = | |
334 (unsigned short) lisp_to_word (XVECTOR_DATA (obj) [i]); | |
335 } | |
336 } | |
337 else | |
338 invalid_argument ("unrecognized selection data", obj); | |
339 | |
340 *type_ret = XE_SYMBOL_TO_ATOM (d, type, 0); | |
341 } | |
342 |