annotate src/select-common.h @ 3025:facf3239ba30

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