view lisp/case-table.el @ 85682:919974c09488

(struct frame): Move all bit fields after the first bit field to take advantage of the available space. Group all the chars together to reduce wasted space due to padding.
author Dan Nicolaescu <dann@ics.uci.edu>
date Fri, 26 Oct 2007 18:09:36 +0000
parents 9355f9b7bbff
children 73661ddc7ac7 f55f9811f5d7
line wrap: on
line source

;;; case-table.el --- code to extend the character set and support case tables

;; Copyright (C) 1988, 1994, 2001, 2002, 2003, 2004,
;;   2005, 2006, 2007 Free Software Foundation, Inc.

;; Author: Howard Gayle
;; Maintainer: FSF
;; Keywords: i18n

;; 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, 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; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; Written by:
;; TN/ETX/TX/UMG Howard Gayle        UUCP : seismo!enea!erix!howard
;; Telefonaktiebolaget L M Ericsson  Phone: +46 8 719 55 65
;; Ericsson Telecom     	     Telex: 14910 ERIC S
;; S-126 25 Stockholm                FAX  : +46 8 719 64 82
;; Sweden

;;; Code:

(defvar set-case-syntax-offset 0)

(defvar set-case-syntax-set-multibyte nil)

(defun describe-buffer-case-table ()
  "Describe the case table of the current buffer."
  (interactive)
  (let ((description (make-char-table 'case-table)))
    (map-char-table
     (function (lambda (key value)
		 (aset
		  description key
		  (cond ((not (natnump value))
			 "case-invariant")
			((/= key (downcase key))
			 (concat "uppercase, matches "
				 (char-to-string (downcase key))))
			((/= key (upcase key))
			 (concat "lowercase, matches "
				 (char-to-string (upcase key))))
			(t "case-invariant")))))
     (current-case-table))
    (save-excursion
     (with-output-to-temp-buffer "*Help*"
       (set-buffer standard-output)
       (describe-vector description)
       (help-mode)))))

(defun get-upcase-table (case-table)
  "Return the upcase table of CASE-TABLE."
  (or (char-table-extra-slot case-table 0)
      ;; Setup all extra slots of CASE-TABLE by temporarily selecting
      ;; it as the standard case table.
      (let ((old (standard-case-table)))
	(unwind-protect
	    (progn
	      (set-standard-case-table case-table)
	      (char-table-extra-slot case-table 0))
	  (or (eq case-table old)
	      (set-standard-case-table old))))))

(defun copy-case-table (case-table)
  (let ((copy (copy-sequence case-table))
	(up (char-table-extra-slot case-table 0)))
    ;; Clear out the extra slots (except for upcase table) so that
    ;; they will be recomputed from the main (downcase) table.
    (if up
	(set-char-table-extra-slot copy 0 (copy-sequence up)))
    (set-char-table-extra-slot copy 1 nil)
    (set-char-table-extra-slot copy 2 nil)
    copy))

(defsubst set-case-syntax-1 (char)
  "Offset CHAR by `set-case-syntax-offset' if CHAR is a non-ASCII 8-bit char."
  (if (and (>= char 128) (< char 256))
      (+ char set-case-syntax-offset)
    char))

(defun set-case-syntax-delims (l r table)
  "Make characters L and R a matching pair of non-case-converting delimiters.
This sets the entries for L and R in TABLE, which is a string
that will be used as the downcase part of a case table.
It also modifies `standard-syntax-table' to
indicate left and right delimiters."
  (setq l (set-case-syntax-1 l))
  (setq r (set-case-syntax-1 r))
  (aset table l l)
  (aset table r r)
  (let ((up (get-upcase-table table)))
    (aset up l l)
    (aset up r r))
  ;; Clear out the extra slots so that they will be
  ;; recomputed from the main (downcase) table and upcase table.
  (set-char-table-extra-slot table 1 nil)
  (set-char-table-extra-slot table 2 nil)
  (modify-syntax-entry l (concat "(" (char-to-string r) "  ")
		       (standard-syntax-table))
  (modify-syntax-entry r (concat ")" (char-to-string l) "  ")
		       (standard-syntax-table)))

(defun set-case-syntax-pair (uc lc table)
  "Make characters UC and LC a pair of inter-case-converting letters.
This sets the entries for characters UC and LC in TABLE, which is a string
that will be used as the downcase part of a case table.
It also modifies `standard-syntax-table' to give them the syntax of
word constituents."
  (setq uc (set-case-syntax-1 uc))
  (setq lc (set-case-syntax-1 lc))
  (aset table uc lc)
  (aset table lc lc)
  (let ((up (get-upcase-table table)))
    (aset up uc uc)
    (aset up lc uc))
  ;; Clear out the extra slots so that they will be
  ;; recomputed from the main (downcase) table and upcase table.
  (set-char-table-extra-slot table 1 nil)
  (set-char-table-extra-slot table 2 nil)
  (modify-syntax-entry lc "w   " (standard-syntax-table))
  (modify-syntax-entry uc "w   " (standard-syntax-table)))

(defun set-upcase-syntax (uc lc table)
  "Make character UC an upcase of character LC.
It also modifies `standard-syntax-table' to give them the syntax of
word constituents."
  (setq uc (set-case-syntax-1 uc))
  (setq lc (set-case-syntax-1 lc))
  (aset table lc lc)
  (let ((up (get-upcase-table table)))
    (aset up uc uc)
    (aset up lc uc))
  ;; Clear out the extra slots so that they will be
  ;; recomputed from the main (downcase) table and upcase table.
  (set-char-table-extra-slot table 1 nil)
  (set-char-table-extra-slot table 2 nil)
  (modify-syntax-entry lc "w   " (standard-syntax-table))
  (modify-syntax-entry uc "w   " (standard-syntax-table)))

(defun set-downcase-syntax (uc lc table)
  "Make character LC a downcase of character UC.
It also modifies `standard-syntax-table' to give them the syntax of
word constituents."
  (setq uc (set-case-syntax-1 uc))
  (setq lc (set-case-syntax-1 lc))
  (aset table uc lc)
  (aset table lc lc)
  (let ((up (get-upcase-table table)))
    (aset up uc uc))
  ;; Clear out the extra slots so that they will be
  ;; recomputed from the main (downcase) table and upcase table.
  (set-char-table-extra-slot table 1 nil)
  (set-char-table-extra-slot table 2 nil)
  (modify-syntax-entry lc "w   " (standard-syntax-table))
  (modify-syntax-entry uc "w   " (standard-syntax-table)))

(defun set-case-syntax (c syntax table)
  "Make character C case-invariant with syntax SYNTAX.
This sets the entry for character C in TABLE, which is a string
that will be used as the downcase part of a case table.
It also modifies `standard-syntax-table'.
SYNTAX should be \" \", \"w\", \".\" or \"_\"."
  (setq c (set-case-syntax-1 c))
  (aset table c c)
  (let ((up (get-upcase-table table)))
    (aset up c c))
  ;; Clear out the extra slots so that they will be
  ;; recomputed from the main (downcase) table and upcase table.
  (set-char-table-extra-slot table 1 nil)
  (set-char-table-extra-slot table 2 nil)
  (modify-syntax-entry c syntax (standard-syntax-table)))

(provide 'case-table)

;;; arch-tag: 3c2cf885-2c9a-449a-9972-2e269191896d
;;; case-table.el ends here