Mercurial > hg > xemacs-beta
annotate src/systty.h @ 4906:6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
-------------------- ChangeLog entries follow: --------------------
lisp/ChangeLog addition:
2010-02-01 Ben Wing <ben@xemacs.org>
* cl-extra.el:
* cl-extra.el (cl-string-vector-equalp): Removed.
* cl-extra.el (cl-bit-vector-vector-equalp): Removed.
* cl-extra.el (cl-vector-array-equalp): Removed.
* cl-extra.el (cl-hash-table-contents-equalp): Removed.
* cl-extra.el (equalp): Removed.
* cl-extra.el (cl-mapcar-many):
Comment out the whole `equalp' implementation for the moment;
remove once we're sure the C implementation works.
* cl-macs.el:
* cl-macs.el (equalp):
Simplify the compiler-macro for `equalp' -- once it's in C,
we don't need to try so hard to expand it.
src/ChangeLog addition:
2010-02-01 Ben Wing <ben@xemacs.org>
* abbrev.c (abbrev_match_mapper):
* buffer.h (CANON_TABLE_OF):
* buffer.h:
* editfns.c (Fchar_equal):
* minibuf.c (scmp_1):
* text.c (qxestrcasecmp_i18n):
* text.c (qxestrncasecmp_i18n):
* text.c (qxetextcasecmp):
* text.c (qxetextcasecmp_matching):
Create new macro CANONCASE that converts to a canonical mapping
and use it to do caseless comparisons instead of DOWNCASE.
* alloc.c:
* alloc.c (cons_equal):
* alloc.c (vector_equal):
* alloc.c (string_equal):
* bytecode.c (compiled_function_equal):
* chartab.c (char_table_entry_equal):
* chartab.c (char_table_equal):
* data.c (weak_list_equal):
* data.c (weak_box_equal):
* data.c (ephemeron_equal):
* device-msw.c (equal_devmode):
* elhash.c (hash_table_equal):
* events.c (event_equal):
* extents.c (properties_equal):
* extents.c (extent_equal):
* faces.c:
* faces.c (face_equal):
* faces.c (face_hash):
* floatfns.c (float_equal):
* fns.c:
* fns.c (bit_vector_equal):
* fns.c (plists_differ):
* fns.c (Fplists_eq):
* fns.c (Fplists_equal):
* fns.c (Flax_plists_eq):
* fns.c (Flax_plists_equal):
* fns.c (internal_equal):
* fns.c (internal_equalp):
* fns.c (internal_equal_0):
* fns.c (syms_of_fns):
* glyphs.c (image_instance_equal):
* glyphs.c (glyph_equal):
* glyphs.c (glyph_hash):
* gui.c (gui_item_equal):
* lisp.h:
* lrecord.h (struct lrecord_implementation):
* marker.c (marker_equal):
* number.c (bignum_equal):
* number.c (ratio_equal):
* number.c (bigfloat_equal):
* objects.c (color_instance_equal):
* objects.c (font_instance_equal):
* opaque.c (equal_opaque):
* opaque.c (equal_opaque_ptr):
* rangetab.c (range_table_equal):
* specifier.c (specifier_equal):
Add a `foldcase' param to the equal() method and use it to implement
`equalp' comparisons. Also add to plists_differ(), although we
don't currently use it here.
Rewrite internal_equalp(). Implement cross-type vector comparisons.
Don't implement our own handling of numeric promotion -- just use
the `=' primitive.
Add internal_equal_0(), which takes a `foldcase' param and calls
either internal_equal() or internal_equalp().
* buffer.h:
When given a 0 for buffer (which is the norm when functions don't
have a specific buffer available), use the current buffer's table,
not `standard-case-table'; otherwise the current settings are
ignored.
* casetab.c:
* casetab.c (set_case_table):
When handling old-style vectors of 256 in `set-case-table' don't
overwrite the existing table! Instead create a new table and
populate.
* device-msw.c (sync_printer_with_devmode):
* lisp.h:
* text.c (lisp_strcasecmp_ascii):
Rename lisp_strcasecmp to lisp_strcasecmp_ascii and use
lisp_strcasecmp_i18n for caseless comparisons in some places.
* elhash.c:
Delete unused lisp_string_hash and lisp_string_equal().
* events.h:
* keymap-buttons.h:
* keymap.h:
* keymap.c (keymap_lookup_directly):
* keymap.c (keymap_store):
* keymap.c (FROB):
* keymap.c (key_desc_list_to_event):
* keymap.c (describe_map_mapper):
* keymap.c (INCLUDE_BUTTON_ZERO):
New file keymap-buttons.h; use to handle buttons 1-26 in place of
duplicating code 26 times.
* frame-gtk.c (allocate_gtk_frame_struct):
* frame-msw.c (mswindows_init_frame_1):
Fix some comments about internal_equal() in redisplay that don't
apply any more.
* keymap-slots.h:
* keymap.c:
New file keymap-slots.h. Use it to notate the slots in a keymap
structure, similar to frameslots.h or coding-system-slots.h.
* keymap.c (MARKED_SLOT):
* keymap.c (keymap_equal):
* keymap.c (keymap_hash):
Implement.
tests/ChangeLog addition:
2010-02-01 Ben Wing <ben@xemacs.org>
* automated/case-tests.el:
* automated/case-tests.el (uni-mappings):
* automated/search-tests.el:
Delete old pristine-case-table code. Rewrite the Unicode torture
test to take into account whether overlapping mappings exist for
more than one character, and not doing the upcase/downcase
comparisons in such cases.
* automated/lisp-tests.el (foo):
* automated/lisp-tests.el (string-variable):
* automated/lisp-tests.el (featurep):
Replace Assert (equal ... with Assert-equal; same for other types
of equality. Replace some awkward equivalents of Assert-equalp
with Assert-equalp. Add lots of equalp tests.
* automated/case-tests.el:
* automated/regexp-tests.el:
* automated/search-tests.el:
Fix up the comments at the top of the files. Move rules about where
to put tests into case-tests.el.
* automated/test-harness.el:
* automated/test-harness.el (test-harness-aborted-summary-template): New.
* automated/test-harness.el (test-harness-from-buffer):
* automated/test-harness.el (batch-test-emacs):
Fix Assert-test-not. Create Assert-not-equal and variants.
Delete the doc strings from all these convenience functions to avoid
excessive repetition; instead use one copy in a comment.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 01 Feb 2010 01:02:40 -0600 |
parents | aa5ed11f473b |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* systty.h - System-dependent definitions for terminals. |
2 Copyright (C) 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: FSF 19.30. */ | |
22 | |
440 | 23 #ifndef INCLUDED_systty_h_ |
24 #define INCLUDED_systty_h_ | |
428 | 25 |
26 #ifdef HAVE_TERMIOS | |
27 # define HAVE_TCATTR | |
28 #endif | |
29 | |
30 | |
31 /* Include the proper files. */ | |
32 | |
33 #ifdef HAVE_UNISTD_H | |
34 #include <unistd.h> | |
35 #endif | |
36 | |
37 /* XEmacs: TERMIOS is mo' better than TERMIO so we use it if it's | |
38 there. Since TERMIO is backward-compatibility stuff if both it | |
39 and TERMIOS exist, it's more likely to be broken. */ | |
40 | |
41 #if defined (HAVE_TERMIOS) | |
42 | |
43 /***** (1) The TERMIOS way (POSIX style) *****/ | |
44 | |
45 # if defined (_AIX) && defined (_I386) | |
46 # include <termios.h> /* termios.h needs to be before termio.h */ | |
47 # include <termio.h> | |
48 # else | |
49 # if !defined (NO_TERMIO) | |
50 # include <termio.h> | |
51 # endif | |
52 # include <termios.h> | |
53 # endif /* _AIX && _I386 */ | |
54 # ifndef INCLUDED_FCNTL | |
55 # define INCLUDED_FCNTL | |
56 # include <fcntl.h> | |
57 # endif | |
58 | |
59 #elif defined (HAVE_TERMIO) | |
60 | |
61 /***** (2) The TERMIO way (system V style) *****/ | |
62 | |
63 # ifndef NO_TERMIO | |
64 # include <termio.h> | |
65 # endif /* not NO_TERMIO */ | |
66 # ifndef INCLUDED_FCNTL | |
67 # define INCLUDED_FCNTL | |
68 # include <fcntl.h> | |
69 # endif | |
70 | |
442 | 71 #elif defined (WIN32_NATIVE) |
428 | 72 |
442 | 73 /***** (3) The WIN32_NATIVE way *****/ |
428 | 74 |
75 /* Nothing doing */ | |
76 | |
77 #else | |
78 | |
79 /***** (4) The BSD way *****/ | |
80 | |
81 # ifdef linux /* XEmacs addition -- necessary? */ | |
82 # include <bsd/sgtty.h> | |
83 # else | |
84 # include <sgtty.h> | |
85 # endif | |
86 | |
87 | |
88 #endif /* HAVE_TERMIOS */ | |
89 | |
90 /* XEmacs: I don't think we need the following crap. */ | |
91 #ifdef __GNU_LIBRARY__ | |
92 #include <termios.h> | |
93 #endif | |
94 | |
95 /* Formerly there was a conditional that included sys/filio.h if | |
96 USG5_4 was defined, but this is already included in s/usg5-4.h */ | |
97 | |
98 /* Generally useful to include this file: */ | |
99 | |
4759
aa5ed11f473b
Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents:
771
diff
changeset
|
100 #if !defined (WIN32_NATIVE) |
428 | 101 # include <sys/ioctl.h> |
102 #endif | |
103 | |
104 | |
105 /* ----------------------------------------------------- */ | |
106 /* miscellaneous includes */ | |
107 /* ----------------------------------------------------- */ | |
108 | |
109 /* Include files for PTY's */ | |
110 | |
535 | 111 #if defined (HAVE_SYS_PTYIO_H) /* HP-UX */ |
428 | 112 #include <sys/ptyio.h> |
113 #endif | |
114 | |
535 | 115 #if defined (HAVE_PTY_H) |
116 #include <pty.h> | |
117 #elif defined (HAVE_SYS_PTY_H) | |
428 | 118 #include <sys/pty.h> |
119 #endif | |
120 | |
121 /* XEmacs: removed some random if defined (pfa) crap for FASYNC (SIGIO). | |
122 We've cleaned SIGIO up. */ | |
123 | |
124 | |
125 /* ----------------------------------------------------- */ | |
126 /* inhibiting particular features */ | |
127 /* ----------------------------------------------------- */ | |
128 | |
129 | |
4759
aa5ed11f473b
Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents:
771
diff
changeset
|
130 #if defined (BROKEN_TIOCGETC) |
428 | 131 #undef TIOCGETC /* Avoid confusing some conditionals that test this. */ |
132 #endif | |
133 | |
134 /* XEmacs: SIGIO is cleaned up so we remove the crap here that messes | |
135 with it (and FIONREAD and FASYNC, which are related). */ | |
136 | |
137 /* On TERMIOS systems, the tcmumbleattr calls take care of these | |
138 parameters, and it's a bad idea to use them (on AIX, it makes the | |
139 tty hang for a long time). */ | |
140 #if defined (TIOCGLTC) && !defined (HAVE_TERMIOS) | |
141 #define HAVE_LTCHARS | |
142 #endif | |
143 | |
144 #if defined (TIOCGETC) && !defined (HAVE_TERMIOS) | |
145 #define HAVE_TCHARS | |
146 #endif | |
147 | |
148 | |
149 /* ----------------------------------------------------- */ | |
150 /* disabling terminal functions */ | |
151 /* ----------------------------------------------------- */ | |
152 | |
153 /* Try to establish the correct character to disable terminal functions | |
154 in a system-independent manner. | |
155 We use the POSIX standard way to do this, and emulate on other systems. */ | |
156 | |
157 #ifndef _POSIX_VDISABLE | |
158 # if defined CDEL | |
159 # define _POSIX_VDISABLE CDEL | |
160 # else | |
161 # define _POSIX_VDISABLE 255 | |
162 # endif | |
163 #endif /* ! _POSIX_VDISABLE */ | |
164 | |
165 | |
166 /* ----------------------------------------------------- */ | |
167 /* Get the number of characters queued for output */ | |
168 /* ----------------------------------------------------- */ | |
169 | |
170 /* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters | |
171 queued for output to the terminal FD in *SIZE, if FD is a tty. | |
172 Returns -1 if there was an error (i.e. FD is not a tty), 0 | |
173 otherwise. */ | |
174 #ifdef TIOCOUTQ | |
175 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TIOCOUTQ, size) | |
176 #endif | |
177 | |
178 #ifdef HAVE_TERMIO | |
179 #ifdef TCOUTQ | |
180 #undef EMACS_OUTQSIZE | |
181 #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TCOUTQ, size) | |
182 #endif | |
183 #endif | |
184 | |
185 | |
186 /* -------------------------------------------------------------------- */ | |
187 /* Manipulate a terminal's current (foreground) process group */ | |
188 /* -------------------------------------------------------------------- */ | |
189 | |
442 | 190 /* EMACS_GET_TTY_PGRP(int FD, pid_t *PGID) sets *PGID to the terminal |
191 FD's current foreground process group. Return -1 if there is an error. | |
192 | |
193 EMACS_SET_TTY_PGRP(int FD, pid_t *PGID) sets the terminal FD's current | |
194 foreground process group to *PGID. Return -1 if there is an error. | |
428 | 195 |
442 | 196 We prefer using the ioctl (BSD) interface instead of its Posix |
197 replacement tgetpgrp/tcsetpgrp since that is documented as being | |
198 restricted to processes sharing the same controlling tty. */ | |
428 | 199 |
442 | 200 #if defined (TIOCGPGRP) |
428 | 201 |
442 | 202 #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) ioctl (fd, TIOCGPGRP, pgid) |
203 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgid) ioctl (fd, TIOCSPGRP, pgid) | |
204 | |
205 #elif defined (HAVE_TCGETPGRP) | |
428 | 206 |
442 | 207 #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) (*(pgid) = tcgetpgrp (fd)) |
208 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgid) tcsetpgrp (fd, *(pgid)) | |
428 | 209 |
442 | 210 #else |
428 | 211 |
442 | 212 /* Just ignore this for now and hope for the best */ |
213 #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) 0 | |
214 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgif) 0 | |
428 | 215 |
216 #endif | |
217 | |
218 /* EMACS_GETPGRP (arg) returns the process group of the terminal. */ | |
219 | |
220 #ifdef GETPGRP_VOID | |
221 #define EMACS_GETPGRP(x) getpgrp() | |
222 #else | |
223 #define EMACS_GETPGRP(x) getpgrp(x) | |
224 #endif /* GETPGRP_VOID */ | |
225 | |
226 /* XEmacs backward-compatibility. Is 0 always a reasonable argument? */ | |
227 #define EMACS_GET_PROCESS_GROUP() EMACS_GETPGRP (0) | |
228 | |
229 /* XEmacs addition? */ | |
230 | |
231 /* EMACS_SEPARATE_PROCESS_GROUP () creates a separate process group for the | |
232 running process. */ | |
233 | |
234 /* EMACS_SET_PROCESS_GROUP () sets our process group as specified. */ | |
235 | |
236 /* POSIX calls for setpgid(), so we use it if it's available. | |
237 Otherwise use setpgrp(), in USG or BSD flavor. Note that | |
238 on newer systems, setpgrp() has unwanted effects (e.g. | |
239 creating a new session), so we want to avoid its use | |
240 if possible. | |
241 | |
242 NOTE: On some older systems, we should consider using setpgrp2() | |
243 if it exists. This is sufficiently rare, though, that there | |
244 seems no point in autodetecting it. Currently dgux.h is the | |
245 only place where this has to be munged. */ | |
246 | |
247 #if defined (HAVE_SETPGID) | |
248 # define EMACS_SEPARATE_PROCESS_GROUP() setpgid (0, 0) | |
249 # define EMACS_SET_PROCESS_GROUP(pg) setpgid (0, pg) | |
250 #elif defined (USG) | |
251 # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp () | |
252 /* old (pre-SVR4) USG's don't provide any way to do this. | |
253 No big loss -- it just means that ^Z won't work right | |
254 if we're run from sh. */ | |
255 # define EMACS_SET_PROCESS_GROUP(pg) | |
771 | 256 #elif defined (WIN32_NATIVE) |
432 | 257 # define EMACS_SEPARATE_PROCESS_GROUP() |
428 | 258 #else |
259 /* Under NeXTstep, a process group of 0 is not the same as specifying | |
260 your own process ID, so we go ahead and specify it explicitly. */ | |
261 # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp (0, getpid ()) | |
262 # define EMACS_SET_PROCESS_GROUP(pg) setpgrp (0, pg) | |
263 #endif | |
264 | |
265 | |
266 /* --------------------------------------------------------- */ | |
267 /* Manipulate a TTY's input/output processing parameters */ | |
268 /* --------------------------------------------------------- */ | |
269 | |
270 /* struct emacs_tty is a structure used to hold the current tty | |
271 parameters. If the terminal has several structures describing its | |
272 state, for example a struct tchars, a struct sgttyb, a struct | |
273 tchars, a struct ltchars, and a struct pagechars, struct | |
274 emacs_tty should contain an element for each parameter struct | |
275 that Emacs may change. | |
276 | |
430 | 277 emacs_get_tty (int FD, struct emacs_tty *P) stores the parameters |
428 | 278 of the tty on FD in *P. Return zero if all's well, or -1 if we ran |
279 into an error we couldn't deal with. | |
280 | |
430 | 281 emacs_set_tty (int FD, struct emacs_tty *P, int flushp) |
428 | 282 sets the parameters of the tty on FD according to the contents of |
283 *P. If flushp is non-zero, we discard queued input to be | |
284 written before making the change. | |
285 Return 0 if all went well, and -1 if anything failed. | |
286 | |
287 EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel | |
288 expands tabs to spaces upon output; in that case, there is no | |
289 advantage to using tabs over spaces. */ | |
290 | |
291 | |
292 /* For each tty parameter structure that Emacs might want to save and restore, | |
293 - include an element for it in this structure, and | |
294 - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the | |
295 new members. */ | |
296 | |
297 struct emacs_tty { | |
298 | |
299 /* There is always one of the following elements, so there is no need | |
300 for dummy get and set definitions. */ | |
301 #ifdef HAVE_TCATTR | |
302 struct termios main; | |
303 #else /* !HAVE_TCATTR */ | |
304 #ifdef HAVE_TERMIO | |
305 struct termio main; | |
306 #else /* !HAVE_TERMIO */ | |
442 | 307 #ifdef WIN32_NATIVE |
428 | 308 int main; |
442 | 309 #else /* not WIN32_NATIVE */ |
428 | 310 struct sgttyb main; |
442 | 311 #endif /* not WIN32_NATIVE */ |
428 | 312 #endif /* !HAVE_TERMIO */ |
313 #endif /* !HAVE_TCATTR */ | |
314 | |
315 /* If we have TERMIOS, we don't need to do this - they're taken care of | |
316 by the tc*attr calls. */ | |
317 #ifndef HAVE_TERMIOS | |
318 #ifdef HAVE_LTCHARS | |
319 struct ltchars ltchars; | |
320 #endif /* HAVE_LTCHARS */ | |
321 | |
322 #ifdef HAVE_TCHARS | |
323 struct tchars tchars; | |
324 int lmode; | |
325 #endif /* HAVE_TCHARS */ | |
326 #endif /* HAVE_TERMIOS */ | |
327 }; | |
328 | |
430 | 329 int emacs_get_tty (int fd, struct emacs_tty *settings); |
330 int emacs_set_tty (int fd, struct emacs_tty *settings, int flushp); | |
428 | 331 |
332 | |
333 /* --------------------------------------------------------- */ | |
334 /* Define EMACS_TTY_TABS_OK */ | |
335 /* --------------------------------------------------------- */ | |
336 | |
513 | 337 #if defined (TABDLY) && defined (TAB3) |
338 # define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) | |
339 #elif defined (OXTABS) | |
340 # define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & OXTABS) != OXTABS) | |
428 | 341 #else |
513 | 342 # define EMACS_TTY_TABS_OK(p) 1 |
343 #endif | |
428 | 344 |
440 | 345 #endif /* INCLUDED_systty_h_ */ |