Mercurial > emacs
view src/casetab.c @ 110321:4b26adbef9a2
Major code cleanup. Split tramp.el into tramp.el and tramp-sh.el.
* Makefile.in (TRAMP_SRC): Remove tramp-fish.el. Add tramp-sh.el.
* net/tramp.el (top): Don't show loading message. Require just
'tramp-compat, everything else is required there. Use
`ignore-errors' where appropriate.
(tramp-inline-compress-start-size, tramp-copy-size-limit)
(tramp-terminal-type, tramp-end-of-output)
(tramp-initial-end-of-output, tramp-completion-function-alist-rsh)
(tramp-completion-function-alist-ssh)
(tramp-completion-function-alist-telnet)
(tramp-completion-function-alist-su)
(tramp-completion-function-alist-putty, tramp-remote-path)
(tramp-remote-process-environment, tramp-sh-extra-args)
(tramp-actions-before-shell, tramp-uudecode)
(tramp-perl-file-truename, tramp-perl-file-name-all-completions)
(tramp-perl-file-attributes)
(tramp-perl-directory-files-and-attributes)
(tramp-perl-encode-with-module, tramp-perl-decode-with-module)
(tramp-perl-encode, tramp-perl-decode)
(tramp-vc-registered-read-file-names, tramp-file-mode-type-map)
(tramp-file-name-handler-alist, tramp-make-tramp-temp-file)
(tramp-handle-make-symbolic-link, tramp-handle-load)
(tramp-handle-file-name-as-directory)
(tramp-handle-file-name-directory)
(tramp-handle-file-name-nondirectory, tramp-handle-file-truename)
(tramp-handle-file-exists-p, tramp-handle-file-attributes)
(tramp-do-file-attributes-with-ls)
(tramp-do-file-attributes-with-perl)
(tramp-do-file-attributes-with-stat)
(tramp-handle-set-visited-file-modtime)
(tramp-handle-verify-visited-file-modtime)
(tramp-handle-set-file-modes, tramp-handle-set-file-times)
(tramp-set-file-uid-gid, tramp-remote-selinux-p)
(tramp-handle-file-selinux-context)
(tramp-handle-set-file-selinux-context)
(tramp-handle-file-executable-p, tramp-handle-file-readable-p)
(tramp-handle-file-newer-than-file-p, tramp-handle-file-modes)
(tramp-handle-file-directory-p, tramp-handle-file-regular-p)
(tramp-handle-file-symlink-p, tramp-handle-file-writable-p)
(tramp-handle-file-ownership-preserved-p)
(tramp-handle-directory-file-name, tramp-handle-directory-files)
(tramp-handle-directory-files-and-attributes)
(tramp-do-directory-files-and-attributes-with-perl)
(tramp-do-directory-files-and-attributes-with-stat)
(tramp-handle-file-name-all-completions)
(tramp-handle-file-name-completion, tramp-handle-add-name-to-file)
(tramp-handle-copy-file, tramp-handle-copy-directory)
(tramp-handle-rename-file, tramp-do-copy-or-rename-file)
(tramp-do-copy-or-rename-file-via-buffer)
(tramp-do-copy-or-rename-file-directly)
(tramp-do-copy-or-rename-file-out-of-band)
(tramp-handle-make-directory, tramp-handle-delete-directory)
(tramp-handle-delete-file)
(tramp-handle-dired-recursive-delete-directory)
(tramp-handle-dired-compress-file, tramp-handle-dired-uncache)
(tramp-handle-insert-directory)
(tramp-handle-unhandled-file-name-directory)
(tramp-handle-expand-file-name)
(tramp-handle-substitute-in-file-name)
(tramp-handle-executable-find, tramp-process-sentinel)
(tramp-handle-start-file-process, tramp-handle-process-file)
(tramp-handle-call-process-region, tramp-handle-shell-command)
(tramp-handle-file-local-copy, tramp-handle-file-remote-p)
(tramp-handle-insert-file-contents)
(tramp-handle-insert-file-contents-literally)
(tramp-handle-find-backup-file-name)
(tramp-handle-make-auto-save-file-name, tramp-handle-write-region)
(tramp-vc-registered-file-names, tramp-handle-vc-registered)
(tramp-sh-file-name-handler, tramp-vc-file-name-handler)
(tramp-maybe-send-script, tramp-set-auto-save, tramp-run-test)
(tramp-run-test2, tramp-find-executable, tramp-set-remote-path)
(tramp-find-file-exists-command, tramp-open-shell)
(tramp-find-shell, tramp-barf-if-no-shell-prompt)
(tramp-open-connection-setup-interactive-shell)
(tramp-local-coding-commands, tramp-remote-coding-commands)
(tramp-find-inline-encoding, tramp-call-local-coding-command)
(tramp-inline-compress-commands, tramp-find-inline-compress)
(tramp-compute-multi-hops, tramp-maybe-open-connection)
(tramp-send-command , tramp-wait-for-output)
(tramp-send-command-and-check, tramp-barf-unless-okay)
(tramp-send-command-and-read, tramp-mode-string-to-int)
(tramp-convert-file-attributes, tramp-check-cached-permissions)
(tramp-file-mode-from-int, tramp-file-mode-permissions)
(tramp-shell-case-fold, tramp-make-copy-program-file-name)
(tramp-method-out-of-band-p, tramp-local-host-p)
(tramp-get-remote-path, tramp-get-remote-tmpdir)
(tramp-get-ls-command, tramp-get-ls-command-with-dired)
(tramp-get-test-command, tramp-get-test-nt-command)
(tramp-get-file-exists-command, tramp-get-remote-ln)
(tramp-get-remote-perl, tramp-get-remote-stat)
(tramp-get-remote-readlink, tramp-get-remote-trash)
(tramp-get-remote-id, tramp-get-remote-uid, tramp-get-remote-gid)
(tramp-get-local-uid, tramp-get-local-gid)
(tramp-get-inline-compress, tramp-get-inline-coding, ): Move to
tramp-sh.el.
(tramp-methods, tramp-default-method-alist)
(tramp-default-user-alist, tramp-foreign-file-name-handler-alist):
Move initialization to tramp-sh.el.
(tramp-temp-name-prefix): Make it a defconst.
(tramp-dissect-file-name): Don't check anymore for multi-hop
methods.
(tramp-debug-outline-regexp): Add a docstring.
(tramp-debug-outline-level): Renamed from `tramp-outline-level'.
(tramp-get-debug-buffer): Use it.
* net/tramp-cache.el (top): Set tramp-autoload cookie for
initialization forms.
(tramp-set-connection-property): Don't protect `tramp-message'
call, it isn't necessary any longer.
(tramp-dump-connection-properties): Use `ignore-errors'.
* net/tramp-compat.el (top): Require 'advice, 'format-spec,
'password-cache and 'auth-source.
* net/tramp-gvfs.el (top):
* net/tramp-smb.el (top): Require 'tramp-sh.
* net/tramp-gw.el (tramp-gw-open-network-stream): Use `ignore-errors'.
* net/tramp-sh.el: New file, derived from tramp.el.
(top): Initialize `tramp-methods', `tramp-default-method-alist',
`tramp-default-user-alist', tramp-foreign-file-name-handler-alist.
Remove "scp1_old", "scp2_old", "ssh1_old", "ssh2_old". Use
`ignore-errors' where appropriate.
(tramp-sh-file-name-handler-alist): Renamed from
`tramp-file-name-handler-alist'.
(tramp-send-command-and-check): Return t or nil. Remove all
`zerop' checks, where called.
(tramp-handle-set-file-modes)
(tramp-do-copy-or-rename-file-directly)
(tramp-handle-delete-directory, tramp-handle-delete-file)
(tramp-maybe-send-script, ): Use `tramp-barf-unless-okay'.
(tramp-sh-file-name-handler, tramp-send-command-and-check)
(tramp-get-remote-ln): Set tramp-autoload cookie.
* net/tramp-fish.el: Remove file.
author | Michael Albinus <michael.albinus@gmx.de> |
---|---|
date | Mon, 13 Sep 2010 17:17:01 +0200 |
parents | 8cfee7d2955f |
children | 417b1e4d63cd |
line wrap: on
line source
/* GNU Emacs routines to deal with case tables. Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Author: Howard Gayle This file is part of GNU Emacs. GNU Emacs 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. GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <setjmp.h> #include "lisp.h" #include "buffer.h" #include "character.h" Lisp_Object Qcase_table_p, Qcase_table; Lisp_Object Vascii_downcase_table, Vascii_upcase_table; Lisp_Object Vascii_canon_table, Vascii_eqv_table; /* Used as a temporary in DOWNCASE and other macros in lisp.h. No need to mark it, since it is used only very temporarily. */ int case_temp1; Lisp_Object case_temp2; static void set_canon (Lisp_Object case_table, Lisp_Object range, Lisp_Object elt); static void set_identity (Lisp_Object table, Lisp_Object c, Lisp_Object elt); static void shuffle (Lisp_Object table, Lisp_Object c, Lisp_Object elt); DEFUN ("case-table-p", Fcase_table_p, Scase_table_p, 1, 1, 0, doc: /* Return t if OBJECT is a case table. See `set-case-table' for more information on these data structures. */) (Lisp_Object object) { Lisp_Object up, canon, eqv; if (! CHAR_TABLE_P (object)) return Qnil; if (! EQ (XCHAR_TABLE (object)->purpose, Qcase_table)) return Qnil; up = XCHAR_TABLE (object)->extras[0]; canon = XCHAR_TABLE (object)->extras[1]; eqv = XCHAR_TABLE (object)->extras[2]; return ((NILP (up) || CHAR_TABLE_P (up)) && ((NILP (canon) && NILP (eqv)) || (CHAR_TABLE_P (canon) && (NILP (eqv) || CHAR_TABLE_P (eqv)))) ? Qt : Qnil); } static Lisp_Object check_case_table (Lisp_Object obj) { CHECK_TYPE (!NILP (Fcase_table_p (obj)), Qcase_table_p, obj); return (obj); } DEFUN ("current-case-table", Fcurrent_case_table, Scurrent_case_table, 0, 0, 0, doc: /* Return the case table of the current buffer. */) (void) { return current_buffer->downcase_table; } DEFUN ("standard-case-table", Fstandard_case_table, Sstandard_case_table, 0, 0, 0, doc: /* Return the standard case table. This is the one used for new buffers. */) (void) { return Vascii_downcase_table; } static Lisp_Object set_case_table (Lisp_Object table, int standard); DEFUN ("set-case-table", Fset_case_table, Sset_case_table, 1, 1, 0, doc: /* Select a new case table for the current buffer. A case table is a char-table which maps characters to their lower-case equivalents. It also has three \"extra\" slots which may be additional char-tables or nil. These slots are called UPCASE, CANONICALIZE and EQUIVALENCES. UPCASE maps each non-upper-case character to its upper-case equivalent. (The value in UPCASE for an upper-case character is never used.) If lower and upper case characters are in 1-1 correspondence, you may use nil and the upcase table will be deduced from DOWNCASE. CANONICALIZE maps each character to a canonical equivalent; any two characters that are related by case-conversion have the same canonical equivalent character; it may be nil, in which case it is deduced from DOWNCASE and UPCASE. EQUIVALENCES is a map that cyclicly permutes each equivalence class (of characters with the same canonical equivalent); it may be nil, in which case it is deduced from CANONICALIZE. */) (Lisp_Object table) { return set_case_table (table, 0); } DEFUN ("set-standard-case-table", Fset_standard_case_table, Sset_standard_case_table, 1, 1, 0, doc: /* Select a new standard case table for new buffers. See `set-case-table' for more info on case tables. */) (Lisp_Object table) { return set_case_table (table, 1); } static Lisp_Object set_case_table (Lisp_Object table, int standard) { Lisp_Object up, canon, eqv; check_case_table (table); up = XCHAR_TABLE (table)->extras[0]; canon = XCHAR_TABLE (table)->extras[1]; eqv = XCHAR_TABLE (table)->extras[2]; if (NILP (up)) { up = Fmake_char_table (Qcase_table, Qnil); map_char_table (set_identity, Qnil, table, up); map_char_table (shuffle, Qnil, table, up); XCHAR_TABLE (table)->extras[0] = up; } if (NILP (canon)) { canon = Fmake_char_table (Qcase_table, Qnil); XCHAR_TABLE (table)->extras[1] = canon; map_char_table (set_canon, Qnil, table, table); } if (NILP (eqv)) { eqv = Fmake_char_table (Qcase_table, Qnil); map_char_table (set_identity, Qnil, canon, eqv); map_char_table (shuffle, Qnil, canon, eqv); XCHAR_TABLE (table)->extras[2] = eqv; } /* This is so set_image_of_range_1 in regex.c can find the EQV table. */ XCHAR_TABLE (canon)->extras[2] = eqv; if (standard) { Vascii_downcase_table = table; Vascii_upcase_table = up; Vascii_canon_table = canon; Vascii_eqv_table = eqv; } else { current_buffer->downcase_table = table; current_buffer->upcase_table = up; current_buffer->case_canon_table = canon; current_buffer->case_eqv_table = eqv; } return table; } /* The following functions are called in map_char_table. */ /* Set CANON char-table element for characters in RANGE to a translated ELT by UP and DOWN char-tables. This is done only when ELT is a character. The char-tables CANON, UP, and DOWN are in CASE_TABLE. */ static void set_canon (Lisp_Object case_table, Lisp_Object range, Lisp_Object elt) { Lisp_Object up = XCHAR_TABLE (case_table)->extras[0]; Lisp_Object canon = XCHAR_TABLE (case_table)->extras[1]; if (NATNUMP (elt)) Fset_char_table_range (canon, range, Faref (case_table, Faref (up, elt))); } /* Set elements of char-table TABLE for C to C itself. C may be a cons specifying a character range. In that case, set characters in that range to themselves. This is done only when ELT is a character. This is called in map_char_table. */ static void set_identity (Lisp_Object table, Lisp_Object c, Lisp_Object elt) { if (NATNUMP (elt)) { int from, to; if (CONSP (c)) { from = XINT (XCAR (c)); to = XINT (XCDR (c)); } else from = to = XINT (c); for (; from <= to; from++) CHAR_TABLE_SET (table, from, make_number (from)); } } /* Permute the elements of TABLE (which is initially an identity mapping) so that it has one cycle for each equivalence class induced by the translation table on which map_char_table is operated. */ static void shuffle (Lisp_Object table, Lisp_Object c, Lisp_Object elt) { if (NATNUMP (elt)) { int from, to; if (CONSP (c)) { from = XINT (XCAR (c)); to = XINT (XCDR (c)); } else from = to = XINT (c); for (; from <= to; from++) { Lisp_Object tem = Faref (table, elt); Faset (table, elt, make_number (from)); Faset (table, make_number (from), tem); } } } void init_casetab_once (void) { register int i; Lisp_Object down, up; Qcase_table = intern_c_string ("case-table"); staticpro (&Qcase_table); /* Intern this now in case it isn't already done. Setting this variable twice is harmless. But don't staticpro it here--that is done in alloc.c. */ Qchar_table_extra_slots = intern_c_string ("char-table-extra-slots"); /* Now we are ready to set up this property, so we can create char tables. */ Fput (Qcase_table, Qchar_table_extra_slots, make_number (3)); down = Fmake_char_table (Qcase_table, Qnil); Vascii_downcase_table = down; XCHAR_TABLE (down)->purpose = Qcase_table; for (i = 0; i < 128; i++) { int c = (i >= 'A' && i <= 'Z') ? i + ('a' - 'A') : i; CHAR_TABLE_SET (down, i, make_number (c)); } XCHAR_TABLE (down)->extras[1] = Fcopy_sequence (down); up = Fmake_char_table (Qcase_table, Qnil); XCHAR_TABLE (down)->extras[0] = up; for (i = 0; i < 128; i++) { int c = ((i >= 'A' && i <= 'Z') ? i + ('a' - 'A') : ((i >= 'a' && i <= 'z') ? i + ('A' - 'a') : i)); CHAR_TABLE_SET (up, i, make_number (c)); } XCHAR_TABLE (down)->extras[2] = Fcopy_sequence (up); /* Fill in what isn't filled in. */ set_case_table (down, 1); } void syms_of_casetab (void) { Qcase_table_p = intern_c_string ("case-table-p"); staticpro (&Qcase_table_p); staticpro (&Vascii_canon_table); staticpro (&Vascii_downcase_table); staticpro (&Vascii_eqv_table); staticpro (&Vascii_upcase_table); defsubr (&Scase_table_p); defsubr (&Scurrent_case_table); defsubr (&Sstandard_case_table); defsubr (&Sset_case_table); defsubr (&Sset_standard_case_table); } /* arch-tag: e06388ad-99fe-40ec-ba67-9d010fcc4916 (do not change this comment) */