Mercurial > hg > xemacs-beta
view src/systty.h @ 5882:bbe4146603db
Reduce regexp usage, now CL-oriented non-regexp code available, core Lisp
lisp/ChangeLog addition:
2015-04-01 Aidan Kehoe <kehoea@parhasard.net>
When calling #'string-match with a REGEXP without regular
expression special characters, call #'search, #'mismatch, #'find,
etc. instead, making our code less likely to side-effect other
functions' match data and a little faster.
* apropos.el (apropos-command):
* apropos.el (apropos):
Call (position ?\n ...) rather than (string-match "\n" ...) here.
* buff-menu.el:
* buff-menu.el (buffers-menu-omit-invisible-buffers):
Don't fire up the regexp engine just to check if a string starts
with a space.
* buff-menu.el (select-buffers-tab-buffers-by-mode):
Don't fire up the regexp engine just to compare mode basenames.
* buff-menu.el (format-buffers-tab-line):
* buff-menu.el (build-buffers-tab-internal): Moved to being a
label within the following.
* buff-menu.el (buffers-tab-items): Use the label.
* bytecomp.el (byte-compile-log-1):
Don't fire up the regexp engine just to look for a newline.
* cus-edit.el (get):
Ditto.
* cus-edit.el (custom-variable-value-create):
Ditto, but for a colon.
* descr-text.el (describe-text-sexp):
Ditto.
* descr-text.el (describe-char-unicode-data):
Use #'split-string-by-char given that we're just looking for a
semicolon.
* descr-text.el (describe-char):
Don't fire up the regexp engine just to look for a newline.
* disass.el (disassemble-internal):
Ditto.
* files.el (file-name-sans-extension):
Implement this using #'position.
* files.el (file-name-extension):
Correct this function's docstring, implement it in terms of
#'position.
* files.el (insert-directory):
Don't fire up the regexp engine to split a string by space; don't
reverse the list of switches, this is actually a longstand bug as
far as I can see.
* gnuserv.el (gnuserv-process-filter):
Use #'position here, instead of consing inside #'split-string
needlessly.
* gtk-file-dialog.el (gtk-file-dialog-update-dropdown):
Use #'split-string-by-char here, don't fire up #'split-string for
directory-sep-char.
* gtk-font-menu.el (hack-font-truename):
Implement this more cheaply in terms of #'find,
#'split-string-by-char, #'equal, rather than #'string-match,
#'split-string, #'string-equal.
* hyper-apropos.el (hyper-apropos-grok-functions):
* hyper-apropos.el (hyper-apropos-grok-variables):
Look for a newline using #'position rather than #'string-match in
these functions.
* info.el (Info-insert-dir):
* info.el (Info-insert-file-contents):
* info.el (Info-follow-reference):
* info.el (Info-extract-menu-node-name):
* info.el (Info-menu):
Look for fixed strings using #'position or #'search as appropriate
in this file.
* ldap.el (ldap-decode-string):
* ldap.el (ldap-encode-string):
#'encode-coding-string, #'decode-coding-string are always
available, don't check if they're fboundp.
* ldap.el (ldap-decode-address):
* ldap.el (ldap-encode-address):
Use #'split-string-by-char in these functions.
* lisp-mnt.el (lm-creation-date):
* lisp-mnt.el (lm-last-modified-date):
Don't fire up the regexp engine just to look for spaces in this file.
* menubar-items.el (default-menubar):
Use (not (mismatch ...)) rather than #'string-match here, for
simple regexp.
Use (search "beta" ...) rather than (string-match "beta" ...)
* menubar-items.el (sort-buffers-menu-alphabetically):
* menubar-items.el (sort-buffers-menu-by-mode-then-alphabetically):
* menubar-items.el (group-buffers-menu-by-mode-then-alphabetically):
Don't fire up the regexp engine to check if a string starts with
a space or an asterisk.
Use the more fine-grained results of #'compare-strings; compare
case-insensitively for the buffer menu.
* menubar-items.el (list-all-buffers):
* menubar-items.el (tutorials-menu-filter):
Use #'equal rather than #'string-equal, which, in this context,
has the drawback of not having a bytecode, and no redeeming
features.
* minibuf.el:
* minibuf.el (un-substitute-in-file-name):
Use #'count, rather than counting the occurences of $ using the
regexp engine.
* minibuf.el (read-file-name-internal-1):
Don't fire up the regexp engine to search for ?=.
* mouse.el (mouse-eval-sexp):
Check for newline with #'find.
* msw-font-menu.el (mswindows-reset-device-font-menus):
Split a string by newline with #'split-string-by-char.
* mule/japanese.el:
* mule/japanese.el ("Japanese"):
Use #'search rather than #'string-match; canoncase before
comparing; fix a bug I had introduced where I had been making case
insensitive comparisons where the case mattered.
* mule/korea-util.el (default-korean-keyboard):
Look for ?3 using #'find, not #'string-march.
* mule/korea-util.el (quail-hangul-switch-hanja):
Search for a fixed string using #'search.
* mule/mule-cmds.el (set-locale-for-language-environment):
#'position, #'substitute rather than #'string-match,
#'replace-in-string.
* newcomment.el (comment-make-extra-lines):
Use #'search rather than #'string-match for a simple string.
* package-get.el (package-get-remote-filename):
Use #'position when looking for ?@
* process.el (setenv):
* process.el (read-envvar-name):
Use #'position when looking for ?=.
* replace.el (map-query-replace-regexp):
Use #'split-string-by-char instead of using an inline
implementation of it.
* select.el (select-convert-from-cf-text):
* select.el (select-convert-from-cf-unicodetext):
Use #'position rather than #'string-match in these functions.
* setup-paths.el (paths-emacs-data-root-p):
Use #'search when looking for simple string.
* sound.el (load-sound-file):
Use #'split-string-by-char rather than an inline reimplementation
of same.
* startup.el (splash-screen-window-body):
* startup.el (splash-screen-tty-body):
Search for simple strings using #'search.
* version.el (emacs-version):
Ditto.
* x-font-menu.el (hack-font-truename):
Implement this more cheaply in terms of #'find,
#'split-string-by-char, #'equal, rather than #'string-match,
#'split-string, #'string-equal.
* x-font-menu.el (x-reset-device-font-menus-core):
Use #'split-string-by-char here.
* x-init.el (x-initialize-keyboard):
Search for a simple string using #'search.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Wed, 01 Apr 2015 14:28:20 +0100 |
parents | 308d34e9f07d |
children |
line wrap: on
line source
/* systty.h - System-dependent definitions for terminals. Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. This file is part of XEmacs. XEmacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ /* Synched up with: FSF 19.30. */ #ifndef INCLUDED_systty_h_ #define INCLUDED_systty_h_ #ifdef HAVE_TERMIOS # define HAVE_TCATTR #endif /* Include the proper files. */ #ifdef HAVE_UNISTD_H #include <unistd.h> #endif /* XEmacs: TERMIOS is mo' better than TERMIO so we use it if it's there. Since TERMIO is backward-compatibility stuff if both it and TERMIOS exist, it's more likely to be broken. */ #if defined (HAVE_TERMIOS) /***** (1) The TERMIOS way (POSIX style) *****/ # if defined (_AIX) && defined (_I386) # include <termios.h> /* termios.h needs to be before termio.h */ # include <termio.h> # else # if !defined (NO_TERMIO) # include <termio.h> # endif # include <termios.h> # endif /* _AIX && _I386 */ # ifndef INCLUDED_FCNTL # define INCLUDED_FCNTL # include <fcntl.h> # endif #elif defined (HAVE_TERMIO) /***** (2) The TERMIO way (system V style) *****/ # ifndef NO_TERMIO # include <termio.h> # endif /* not NO_TERMIO */ # ifndef INCLUDED_FCNTL # define INCLUDED_FCNTL # include <fcntl.h> # endif #elif defined (WIN32_NATIVE) /***** (3) The WIN32_NATIVE way *****/ /* Nothing doing */ #else /***** (4) The BSD way *****/ # ifdef linux /* XEmacs addition -- necessary? */ # include <bsd/sgtty.h> # else # include <sgtty.h> # endif #endif /* HAVE_TERMIOS */ /* XEmacs: I don't think we need the following crap. */ #ifdef __GNU_LIBRARY__ #include <termios.h> #endif /* Formerly there was a conditional that included sys/filio.h if USG5_4 was defined, but this is already included in s/usg5-4.h */ /* Generally useful to include this file: */ #if !defined (WIN32_NATIVE) # include <sys/ioctl.h> #endif /* ----------------------------------------------------- */ /* miscellaneous includes */ /* ----------------------------------------------------- */ /* Include files for PTY's */ #if defined (HAVE_SYS_PTYIO_H) /* HP-UX */ #include <sys/ptyio.h> #endif #if defined (HAVE_PTY_H) #include <pty.h> #elif defined (HAVE_SYS_PTY_H) #include <sys/pty.h> #endif /* XEmacs: removed some random if defined (pfa) crap for FASYNC (SIGIO). We've cleaned SIGIO up. */ /* ----------------------------------------------------- */ /* inhibiting particular features */ /* ----------------------------------------------------- */ #if defined (BROKEN_TIOCGETC) #undef TIOCGETC /* Avoid confusing some conditionals that test this. */ #endif /* XEmacs: SIGIO is cleaned up so we remove the crap here that messes with it (and FIONREAD and FASYNC, which are related). */ /* On TERMIOS systems, the tcmumbleattr calls take care of these parameters, and it's a bad idea to use them (on AIX, it makes the tty hang for a long time). */ #if defined (TIOCGLTC) && !defined (HAVE_TERMIOS) #define HAVE_LTCHARS #endif #if defined (TIOCGETC) && !defined (HAVE_TERMIOS) #define HAVE_TCHARS #endif /* ----------------------------------------------------- */ /* disabling terminal functions */ /* ----------------------------------------------------- */ /* Try to establish the correct character to disable terminal functions in a system-independent manner. We use the POSIX standard way to do this, and emulate on other systems. */ #ifndef _POSIX_VDISABLE # if defined CDEL # define _POSIX_VDISABLE CDEL # else # define _POSIX_VDISABLE 255 # endif #endif /* ! _POSIX_VDISABLE */ /* ----------------------------------------------------- */ /* Get the number of characters queued for output */ /* ----------------------------------------------------- */ /* EMACS_OUTQSIZE(FD, int *SIZE) stores the number of characters queued for output to the terminal FD in *SIZE, if FD is a tty. Returns -1 if there was an error (i.e. FD is not a tty), 0 otherwise. */ #ifdef TIOCOUTQ #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TIOCOUTQ, size) #endif #ifdef HAVE_TERMIO #ifdef TCOUTQ #undef EMACS_OUTQSIZE #define EMACS_OUTQSIZE(fd, size) ioctl (fd, TCOUTQ, size) #endif #endif /* -------------------------------------------------------------------- */ /* Manipulate a terminal's current (foreground) process group */ /* -------------------------------------------------------------------- */ /* EMACS_GET_TTY_PGRP(int FD, pid_t *PGID) sets *PGID to the terminal FD's current foreground process group. Return -1 if there is an error. EMACS_SET_TTY_PGRP(int FD, pid_t *PGID) sets the terminal FD's current foreground process group to *PGID. Return -1 if there is an error. We prefer using the ioctl (BSD) interface instead of its Posix replacement tgetpgrp/tcsetpgrp since that is documented as being restricted to processes sharing the same controlling tty. */ #if defined (TIOCGPGRP) #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) ioctl (fd, TIOCGPGRP, pgid) #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgid) ioctl (fd, TIOCSPGRP, pgid) #elif defined (HAVE_TCGETPGRP) #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) (*(pgid) = tcgetpgrp (fd)) #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgid) tcsetpgrp (fd, *(pgid)) #else /* Just ignore this for now and hope for the best */ #define EMACS_GET_TTY_PROCESS_GROUP(fd, pgid) 0 #define EMACS_SET_TTY_PROCESS_GROUP(fd, pgif) 0 #endif /* EMACS_GETPGRP (arg) returns the process group of the terminal. */ #ifdef GETPGRP_VOID #define EMACS_GETPGRP(x) getpgrp() #else #define EMACS_GETPGRP(x) getpgrp(x) #endif /* GETPGRP_VOID */ /* XEmacs backward-compatibility. Is 0 always a reasonable argument? */ #define EMACS_GET_PROCESS_GROUP() EMACS_GETPGRP (0) /* XEmacs addition? */ /* EMACS_SEPARATE_PROCESS_GROUP () creates a separate process group for the running process. */ /* EMACS_SET_PROCESS_GROUP () sets our process group as specified. */ /* POSIX calls for setpgid(), so we use it if it's available. Otherwise use setpgrp(), in USG or BSD flavor. Note that on newer systems, setpgrp() has unwanted effects (e.g. creating a new session), so we want to avoid its use if possible. NOTE: On some older systems, we should consider using setpgrp2() if it exists. This is sufficiently rare, though, that there seems no point in autodetecting it. Currently dgux.h is the only place where this has to be munged. */ #if defined (HAVE_SETPGID) # define EMACS_SEPARATE_PROCESS_GROUP() setpgid (0, 0) # define EMACS_SET_PROCESS_GROUP(pg) setpgid (0, pg) #elif defined (USG) # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp () /* old (pre-SVR4) USG's don't provide any way to do this. No big loss -- it just means that ^Z won't work right if we're run from sh. */ # define EMACS_SET_PROCESS_GROUP(pg) #elif defined (WIN32_NATIVE) # define EMACS_SEPARATE_PROCESS_GROUP() #else /* Under NeXTstep, a process group of 0 is not the same as specifying your own process ID, so we go ahead and specify it explicitly. */ # define EMACS_SEPARATE_PROCESS_GROUP() setpgrp (0, getpid ()) # define EMACS_SET_PROCESS_GROUP(pg) setpgrp (0, pg) #endif /* --------------------------------------------------------- */ /* Manipulate a TTY's input/output processing parameters */ /* --------------------------------------------------------- */ /* struct emacs_tty is a structure used to hold the current tty parameters. If the terminal has several structures describing its state, for example a struct tchars, a struct sgttyb, a struct tchars, a struct ltchars, and a struct pagechars, struct emacs_tty should contain an element for each parameter struct that Emacs may change. emacs_get_tty (int FD, struct emacs_tty *P) stores the parameters of the tty on FD in *P. Return zero if all's well, or -1 if we ran into an error we couldn't deal with. emacs_set_tty (int FD, struct emacs_tty *P, int flushp) sets the parameters of the tty on FD according to the contents of *P. If flushp is non-zero, we discard queued input to be written before making the change. Return 0 if all went well, and -1 if anything failed. EMACS_TTY_TABS_OK (struct emacs_tty *P) is false iff the kernel expands tabs to spaces upon output; in that case, there is no advantage to using tabs over spaces. */ /* For each tty parameter structure that Emacs might want to save and restore, - include an element for it in this structure, and - extend the emacs_{get,set}_tty functions in sysdep.c to deal with the new members. */ struct emacs_tty { /* There is always one of the following elements, so there is no need for dummy get and set definitions. */ #ifdef HAVE_TCATTR struct termios main; #else /* !HAVE_TCATTR */ #ifdef HAVE_TERMIO struct termio main; #else /* !HAVE_TERMIO */ #ifdef WIN32_NATIVE int main; #else /* not WIN32_NATIVE */ struct sgttyb main; #endif /* not WIN32_NATIVE */ #endif /* !HAVE_TERMIO */ #endif /* !HAVE_TCATTR */ /* If we have TERMIOS, we don't need to do this - they're taken care of by the tc*attr calls. */ #ifndef HAVE_TERMIOS #ifdef HAVE_LTCHARS struct ltchars ltchars; #endif /* HAVE_LTCHARS */ #ifdef HAVE_TCHARS struct tchars tchars; int lmode; #endif /* HAVE_TCHARS */ #endif /* HAVE_TERMIOS */ }; int emacs_get_tty (int fd, struct emacs_tty *settings); int emacs_set_tty (int fd, struct emacs_tty *settings, int flushp); /* --------------------------------------------------------- */ /* Define EMACS_TTY_TABS_OK */ /* --------------------------------------------------------- */ #if defined (TABDLY) && defined (TAB3) # define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & TABDLY) != TAB3) #elif defined (OXTABS) # define EMACS_TTY_TABS_OK(p) (((p)->main.c_oflag & OXTABS) != OXTABS) #else # define EMACS_TTY_TABS_OK(p) 1 #endif #endif /* INCLUDED_systty_h_ */