annotate src/composite.c @ 88054:eae3aec0f807

2008-01-29 John Wiegley <johnw@newartisans.com> * url-auth.el (url-digest-auth): If the 'opaque' argument is not being used, don't add it to the response text. Also, changed an if so that the interaction between the PROMPT and OVERWRITE arguments can no longer result in the user being queried twice for the same login and password information.
author John Wiegley <johnw@newartisans.com>
date Tue, 29 Jan 2008 03:52:05 +0000
parents 107ccd98fa12
children 606f2d163a64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1 /* Composite sequence support.
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67658
diff changeset
2 Copyright (C) 2001, 2002, 2003, 2004, 2005,
79759
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78313
diff changeset
3 2006, 2007, 2008 Free Software Foundation, Inc.
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78313
diff changeset
4 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
67658
547f2b420666 Copyright fixed
Kenichi Handa <handa@m17n.org>
parents: 65487
diff changeset
5 National Institute of Advanced Industrial Science and Technology (AIST)
547f2b420666 Copyright fixed
Kenichi Handa <handa@m17n.org>
parents: 65487
diff changeset
6 Registration Number H14PRO021
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
7
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
8 This file is part of GNU Emacs.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
9
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10 GNU Emacs is free software; you can redistribute it and/or modify
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
11 it under the terms of the GNU General Public License as published by
78313
2b9404c2f01f Remove license from trivial file.
Glenn Morris <rgm@gnu.org>
parents: 78011
diff changeset
12 the Free Software Foundation; either version 3, or (at your option)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
13 any later version.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
14
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
15 GNU Emacs is distributed in the hope that it will be useful,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
18 GNU General Public License for more details.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
20 You should have received a copy of the GNU General Public License
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21 along with GNU Emacs; see the file COPYING. If not, write to
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63147
diff changeset
22 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63147
diff changeset
23 Boston, MA 02110-1301, USA. */
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
24
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
25 #include <config.h>
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26 #include "lisp.h"
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
27 #include "buffer.h"
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28 #include "charset.h"
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29 #include "intervals.h"
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 /* Emacs uses special text property `composition' to support character
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 composition. A sequence of characters that have the same (i.e. eq)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 `composition' property value is treated as a single composite
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 sequence (we call it just `composition' here after). Characters in
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 a composition are all composed somehow on the screen.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37 The property value has this form when the composition is made:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38 ((LENGTH . COMPONENTS) . MODIFICATION-FUNC)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39 then turns to this form:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41 when the composition is registered in composition_hash_table and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
42 composition_table. These rather peculiar structures were designed
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
43 to make it easy to distinguish them quickly (we can do that by
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
44 checking only the first element) and to extract LENGTH (from the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45 former form) and COMPOSITION-ID (from the latter form).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
47 We register a composition when it is displayed, or when the width
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 is required (for instance, to calculate columns).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50 LENGTH -- Length of the composition. This information is used to
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 check the validity of the composition.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
52
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53 COMPONENTS -- Character, string, vector, list, or nil.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55 If it is nil, characters in the text are composed relatively
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56 according to their metrics in font glyphs.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58 If it is a character or a string, the character or characters
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 in the string are composed relatively.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61 If it is a vector or list of integers, the element is a
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62 character or an encoded composition rule. The characters are
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
63 composed according to the rules. (2N)th elements are
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
64 characters to be composed and (2N+1)th elements are
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
65 composition rules to tell how to compose (2N+2)th element with
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66 the previously composed 2N glyphs.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 COMPONENTS-VEC -- Vector of integers. In relative composition, the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 elements are characters to be composed. In rule-base
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 composition, the elements are characters or encoded
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 composition rules.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 MODIFICATION-FUNC -- If non nil, it is a function to call when the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 composition gets invalid after a modification in a buffer. If
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 it is nil, a function in `composition-function-table' of the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
76 first character in the sequence is called.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
77
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
78 COMPOSITION-ID --Identification number of the composition. It is
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 used as an index to composition_table for the composition.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
80
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
81 When Emacs has to display a composition or has to know its
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82 displaying width, the function get_composition_id is called. It
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 returns COMPOSITION-ID so that the caller can access the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 information about the composition through composition_table. If a
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 COMPOSITION-ID has not yet been assigned to the composition,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86 get_composition_id checks the validity of `composition' property,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 and, if valid, assigns a new ID, registers the information in
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 composition_hash_table and composition_table, and changes the form
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89 of the property value. If the property is invalid, return -1
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 without changing the property value.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 We use two tables to keep information about composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 composition_hash_table and composition_table.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 The former is a hash table in which keys are COMPONENTS-VECs and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 values are the corresponding COMPOSITION-IDs. This hash table is
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
97 weak, but as each key (COMPONENTS-VEC) is also kept as a value of the
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 `composition' property, it won't be collected as garbage until all
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
99 bits of text that have the same COMPONENTS-VEC are deleted.
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
101 The latter is a table of pointers to `struct composition' indexed
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
102 by COMPOSITION-ID. This structure keeps the other information (see
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103 composite.h).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
104
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 In general, a text property holds information about individual
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106 characters. But, a `composition' property holds information about
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
107 a sequence of characters (in this sense, it is like the `intangible'
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
108 property). That means that we should not share the property value
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
109 in adjacent compositions -- we can't distinguish them if they have the
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 same property. So, after any changes, we call
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111 `update_compositions' and change a property of one of adjacent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 compositions to a copy of it. This function also runs a proper
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113 composition modification function to make a composition that gets
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 invalid by the change valid again.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
116 As the value of the `composition' property holds information about a
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117 specific range of text, the value gets invalid if we change the
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
118 text in the range. We treat the `composition' property as always
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119 rear-nonsticky (currently by setting default-text-properties to
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 (rear-nonsticky (composition))) and we never make properties of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121 adjacent compositions identical. Thus, any such changes make the
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
122 range just shorter. So, we can check the validity of the `composition'
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
123 property by comparing LENGTH information with the actual length of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
124 the composition.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
125
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
126 */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
127
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
128
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
129 Lisp_Object Qcomposition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
130
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
131 /* Table of pointers to the structure `composition' indexed by
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
132 COMPOSITION-ID. This structure is for storing information about
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133 each composition except for COMPONENTS-VEC. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134 struct composition **composition_table;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
136 /* The current size of `composition_table'. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
137 static int composition_table_size;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139 /* Number of compositions currently made. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
140 int n_compositions;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
142 /* Hash table for compositions. The key is COMPONENTS-VEC of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143 `composition' property. The value is the corresponding
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
144 COMPOSITION-ID. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
145 Lisp_Object composition_hash_table;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
146
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
147 /* Function to call to adjust composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
148 Lisp_Object Vcompose_chars_after_function;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
149
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
150 /* Char-table of patterns and functions to make a composition. */
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
151 Lisp_Object Vcomposition_function_table;
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
152 Lisp_Object Qcomposition_function_table;
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
153
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154 /* Temporary variable used in macros COMPOSITION_XXX. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 Lisp_Object composition_temp;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
156
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157 /* Return how many columns C will occupy on the screen. It always
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
158 returns 1 for control characters and 8-bit characters because those
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
159 are just ignored in a composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
160 #define CHAR_WIDTH(c) \
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
161 (SINGLE_BYTE_CHAR_P (c) ? 1 : CHARSET_WIDTH (CHAR_CHARSET (c)))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
162
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163 /* Return COMPOSITION-ID of a composition at buffer position
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 CHARPOS/BYTEPOS and length NCHARS. The `composition' property of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 the sequence is PROP. STRING, if non-nil, is a string that
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
166 contains the composition instead of the current buffer.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 If the composition is invalid, return -1. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
170 int
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171 get_composition_id (charpos, bytepos, nchars, prop, string)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172 int charpos, bytepos, nchars;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 Lisp_Object prop, string;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 Lisp_Object id, length, components, key, *key_contents;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176 int glyph_len;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
177 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (composition_hash_table);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
178 int hash_index;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 unsigned hash_code;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 struct composition *cmp;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 int i, ch;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 /* PROP should be
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
184 Form-A: ((LENGTH . COMPONENTS) . MODIFICATION-FUNC)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
185 or
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
186 Form-B: (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
187 */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
188 if (nchars == 0 || !CONSP (prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
189 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
190
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 id = XCAR (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192 if (INTEGERP (id))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
194 /* PROP should be Form-B. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
195 if (XINT (id) < 0 || XINT (id) >= n_compositions)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
196 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
197 return XINT (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
199
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200 /* PROP should be Form-A.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
201 Thus, ID should be (LENGTH . COMPONENTS). */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
202 if (!CONSP (id))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204 length = XCAR (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205 if (!INTEGERP (length) || XINT (length) != nchars)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
206 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
207
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
208 components = XCDR (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
209
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
210 /* Check if the same composition has already been registered or not
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
211 by consulting composition_hash_table. The key for this table is
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
212 COMPONENTS (converted to a vector COMPONENTS-VEC) or, if it is
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
213 nil, vector of characters in the composition range. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
214 if (INTEGERP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215 key = Fmake_vector (make_number (1), components);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
216 else if (STRINGP (components) || CONSP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
217 key = Fvconcat (1, &components);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
218 else if (VECTORP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
219 key = components;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
220 else if (NILP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
221 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
222 key = Fmake_vector (make_number (nchars), Qnil);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
223 if (STRINGP (string))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
224 for (i = 0; i < nchars; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
225 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
226 FETCH_STRING_CHAR_ADVANCE (ch, string, charpos, bytepos);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227 XVECTOR (key)->contents[i] = make_number (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
228 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
229 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
230 for (i = 0; i < nchars; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
231 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232 FETCH_CHAR_ADVANCE (ch, charpos, bytepos);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
233 XVECTOR (key)->contents[i] = make_number (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
234 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
235 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
236 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
237 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
238
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
239 hash_index = hash_lookup (hash_table, key, &hash_code);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
240 if (hash_index >= 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
241 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
242 /* We have already registered the same composition. Change PROP
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
243 from Form-A above to Form-B while replacing COMPONENTS with
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
244 COMPONENTS-VEC stored in the hash table. We can directly
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
245 modify the cons cell of PROP because it is not shared. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
246 key = HASH_KEY (hash_table, hash_index);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
247 id = HASH_VALUE (hash_table, hash_index);
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
248 XSETCAR (prop, id);
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
249 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop))));
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
250 return XINT (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
251 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
252
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
253 /* This composition is a new one. We must register it. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
254
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
255 /* Check if we have sufficient memory to store this information. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
256 if (composition_table_size == 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
257 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
258 composition_table_size = 256;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
259 composition_table
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
260 = (struct composition **) xmalloc (sizeof (composition_table[0])
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
261 * composition_table_size);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
262 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
263 else if (composition_table_size <= n_compositions)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
264 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
265 composition_table_size += 256;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
266 composition_table
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
267 = (struct composition **) xrealloc (composition_table,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
268 sizeof (composition_table[0])
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
269 * composition_table_size);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
270 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
271
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
272 key_contents = XVECTOR (key)->contents;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
273
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
274 /* Check if the contents of COMPONENTS are valid if COMPONENTS is a
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
275 vector or a list. It should be a sequence of:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
276 char1 rule1 char2 rule2 char3 ... ruleN charN+1 */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277 if (VECTORP (components) || CONSP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
278 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
279 int len = XVECTOR (key)->size;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
280
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
281 /* The number of elements should be odd. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
282 if ((len % 2) == 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
283 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
284 /* All elements should be integers (character or encoded
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
285 composition rule). */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
286 for (i = 0; i < len; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
287 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
288 if (!INTEGERP (key_contents[i]))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
289 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
290 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
291 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
292
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
293 /* Change PROP from Form-A above to Form-B. We can directly modify
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
294 the cons cell of PROP because it is not shared. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
295 XSETFASTINT (id, n_compositions);
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
296 XSETCAR (prop, id);
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
297 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop))));
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
298
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299 /* Register the composition in composition_hash_table. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
300 hash_index = hash_put (hash_table, key, id, hash_code);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
302 /* Register the composition in composition_table. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
303 cmp = (struct composition *) xmalloc (sizeof (struct composition));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
304
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
305 cmp->method = (NILP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
306 ? COMPOSITION_RELATIVE
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
307 : ((INTEGERP (components) || STRINGP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
308 ? COMPOSITION_WITH_ALTCHARS
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
309 : COMPOSITION_WITH_RULE_ALTCHARS));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
310 cmp->hash_index = hash_index;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
311 glyph_len = (cmp->method == COMPOSITION_WITH_RULE_ALTCHARS
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
312 ? (XVECTOR (key)->size + 1) / 2
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
313 : XVECTOR (key)->size);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
314 cmp->glyph_len = glyph_len;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
315 cmp->offsets = (short *) xmalloc (sizeof (short) * glyph_len * 2);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
316 cmp->font = NULL;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
317
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
318 /* Calculate the width of overall glyphs of the composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
319 if (cmp->method != COMPOSITION_WITH_RULE_ALTCHARS)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
320 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
321 /* Relative composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
322 cmp->width = 0;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
323 for (i = 0; i < glyph_len; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
324 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
325 int this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
326 ch = XINT (key_contents[i]);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
327 this_width = CHAR_WIDTH (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
328 if (cmp->width < this_width)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
329 cmp->width = this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
330 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
331 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
332 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
333 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
334 /* Rule-base composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
335 float leftmost = 0.0, rightmost;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
336
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
337 ch = XINT (key_contents[0]);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
338 rightmost = CHAR_WIDTH (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
339
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
340 for (i = 1; i < glyph_len; i += 2)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
341 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
342 int rule, gref, nref;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
343 int this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
344 float this_left;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
345
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
346 rule = XINT (key_contents[i]);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
347 ch = XINT (key_contents[i + 1]);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
348 this_width = CHAR_WIDTH (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
349
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
350 /* A composition rule is specified by an integer value
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
351 that encodes global and new reference points (GREF and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
352 NREF). GREF and NREF are specified by numbers as
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
353 below:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
354 0---1---2 -- ascent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
355 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
356 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
357 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
358 9--10--11 -- center
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
359 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
360 ---3---4---5--- baseline
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
361 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
362 6---7---8 -- descent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
363 */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
364 COMPOSITION_DECODE_RULE (rule, gref, nref);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
365 this_left = (leftmost
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
366 + (gref % 3) * (rightmost - leftmost) / 2.0
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 - (nref % 3) * this_width / 2.0);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
368
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
369 if (this_left < leftmost)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
370 leftmost = this_left;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
371 if (this_left + this_width > rightmost)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
372 rightmost = this_left + this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
373 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
374
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
375 cmp->width = rightmost - leftmost;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
376 if (cmp->width < (rightmost - leftmost))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
377 /* To get a ceiling integer value. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
378 cmp->width++;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
379 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
380
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
381 composition_table[n_compositions] = cmp;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
382
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
383 return n_compositions++;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
384
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
385 invalid_composition:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
386 /* Would it be better to remove this `composition' property? */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
387 return -1;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
388 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
389
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
390
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
391 /* Find a composition at or nearest to position POS of OBJECT (buffer
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
392 or string).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
393
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
394 OBJECT defaults to the current buffer. If there's a composition at
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
395 POS, set *START and *END to the start and end of the sequence,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
396 *PROP to the `composition' property, and return 1.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
397
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
398 If there's no composition at POS and LIMIT is negative, return 0.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
399
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
400 Otherwise, search for a composition forward (LIMIT > POS) or
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
401 backward (LIMIT < POS). In this case, LIMIT bounds the search.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
402
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
403 If a composition is found, set *START, *END, and *PROP as above,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
404 and return 1, else return 0.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
405
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
406 This doesn't check the validity of composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
407
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
408 int
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
409 find_composition (pos, limit, start, end, prop, object)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
410 int pos, limit, *start, *end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
411 Lisp_Object *prop, object;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
412 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
413 Lisp_Object val;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
414
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
415 if (get_property_and_range (pos, Qcomposition, prop, start, end, object))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
416 return 1;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
417
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
418 if (limit < 0 || limit == pos)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
419 return 0;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
420
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
421 if (limit > pos) /* search forward */
34933
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
422 {
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
423 val = Fnext_single_property_change (make_number (pos), Qcomposition,
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
424 object, make_number (limit));
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
425 pos = XINT (val);
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
426 if (pos == limit)
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
427 return 0;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
428 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
429 else /* search backward */
34933
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
430 {
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
431 if (get_property_and_range (pos - 1, Qcomposition, prop, start, end,
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
432 object))
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
433 return 1;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
434 val = Fprevious_single_property_change (make_number (pos), Qcomposition,
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
435 object, make_number (limit));
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
436 pos = XINT (val);
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
437 if (pos == limit)
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
438 return 0;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
439 pos--;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
440 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
441 get_property_and_range (pos, Qcomposition, prop, start, end, object);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
442 return 1;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
443 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
444
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
445 /* Run a proper function to adjust the composition sitting between
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
446 FROM and TO with property PROP. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
447
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
448 static void
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
449 run_composition_function (from, to, prop)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
450 int from, to;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
451 Lisp_Object prop;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
452 {
34958
e3133339e30c (run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents: 34933
diff changeset
453 Lisp_Object func;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
454 int start, end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
455
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
456 func = COMPOSITION_MODIFICATION_FUNC (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
457 /* If an invalid composition precedes or follows, try to make them
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
458 valid too. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
459 if (from > BEGV
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
460 && find_composition (from - 1, -1, &start, &end, &prop, Qnil)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
461 && !COMPOSITION_VALID_P (start, end, prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
462 from = start;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
463 if (to < ZV
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
464 && find_composition (to, -1, &start, &end, &prop, Qnil)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
465 && !COMPOSITION_VALID_P (start, end, prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
466 to = end;
46940
545e543e82d5 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 46938
diff changeset
467 if (!NILP (Ffboundp (func)))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
468 call2 (func, make_number (from), make_number (to));
28472
bae9218986ac * composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents: 26848
diff changeset
469 else if (!NILP (Ffboundp (Vcompose_chars_after_function)))
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
470 call3 (Vcompose_chars_after_function,
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
471 make_number (from), make_number (to), Qnil);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
472 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
473
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
474 /* Make invalid compositions adjacent to or inside FROM and TO valid.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
475 CHECK_MASK is bitwise `or' of mask bits defined by macros
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
476 CHECK_XXX (see the comment in composite.h).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
477
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
478 This function is called when a buffer text is changed. If the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
479 change is deletion, FROM == TO. Otherwise, FROM < TO. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
480
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
481 void
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
482 update_compositions (from, to, check_mask)
48318
5c1be14cbcac (calccost, cmgoto): Declare all args (per C99).
Dave Love <fx@gnu.org>
parents: 47275
diff changeset
483 int from, to, check_mask;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
484 {
34958
e3133339e30c (run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents: 34933
diff changeset
485 Lisp_Object prop;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
486 int start, end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487
39046
a61b3d907098 (update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents: 38116
diff changeset
488 if (inhibit_modification_hooks)
a61b3d907098 (update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents: 38116
diff changeset
489 return;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
490
28581
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
491 /* If FROM and TO are not in a valid range, do nothing. */
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
492 if (! (BEGV <= from && from <= to && to <= ZV))
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
493 return;
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
494
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
495 if (check_mask & CHECK_HEAD)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
497 /* FROM should be at composition boundary. But, insertion or
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
498 deletion will make two compositions adjacent and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
499 indistinguishable when they have same (eq) property. To
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
500 avoid it, in such a case, we change the property of the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
501 latter to the copy of it. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
502 if (from > BEGV
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
503 && find_composition (from - 1, -1, &start, &end, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
504 && COMPOSITION_VALID_P (start, end, prop))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
505 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
506 if (from < end)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
507 Fput_text_property (make_number (from), make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
508 Qcomposition,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
509 Fcons (XCAR (prop), XCDR (prop)), Qnil);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
510 run_composition_function (start, end, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
511 from = end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
512 }
37242
029c8c1b451d (update_compositions) <check_mask & CHECK_HEAD>: Fix
Dave Love <fx@gnu.org>
parents: 34958
diff changeset
513 else if (from < ZV
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
514 && find_composition (from, -1, &start, &from, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
515 && COMPOSITION_VALID_P (start, from, prop))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
516 run_composition_function (start, from, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
517 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
518
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
519 if (check_mask & CHECK_INSIDE)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
520 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
521 /* In this case, we are sure that (check & CHECK_TAIL) is also
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
522 nonzero. Thus, here we should check only compositions before
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
523 (to - 1). */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
524 while (from < to - 1
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
525 && find_composition (from, to, &start, &from, &prop, Qnil)
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
526 && COMPOSITION_VALID_P (start, from, prop)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 && from < to - 1)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
528 run_composition_function (start, from, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
529 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
530
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
531 if (check_mask & CHECK_TAIL)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
532 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
533 if (from < to
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
534 && find_composition (to - 1, -1, &start, &end, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
535 && COMPOSITION_VALID_P (start, end, prop))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
536 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
537 /* TO should be also at composition boundary. But,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
538 insertion or deletion will make two compositions adjacent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
539 and indistinguishable when they have same (eq) property.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
540 To avoid it, in such a case, we change the property of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
541 the former to the copy of it. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
542 if (to < end)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
543 Fput_text_property (make_number (start), make_number (to),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
544 Qcomposition,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
545 Fcons (XCAR (prop), XCDR (prop)), Qnil);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
546 run_composition_function (start, end, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
547 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
548 else if (to < ZV
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
549 && find_composition (to, -1, &start, &end, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
550 && COMPOSITION_VALID_P (start, end, prop))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551 run_composition_function (start, end, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
552 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
553 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
554
30022
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
555
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
556 /* Modify composition property values in LIST destructively. LIST is
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
557 a list as returned from text_property_list. Change values to the
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
558 top-level copies of them so that none of them are `eq'. */
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
559
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
560 void
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
561 make_composition_value_copy (list)
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
562 Lisp_Object list;
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
563 {
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
564 Lisp_Object plist, val;
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
565
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
566 for (; CONSP (list); list = XCDR (list))
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
567 {
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
568 plist = XCAR (XCDR (XCDR (XCAR (list))));
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
569 while (CONSP (plist) && CONSP (XCDR (plist)))
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
570 {
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
571 if (EQ (XCAR (plist), Qcomposition)
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
572 && (val = XCAR (XCDR (plist)), CONSP (val)))
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
573 XSETCAR (XCDR (plist), Fcons (XCAR (val), XCDR (val)));
30022
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
574 plist = XCDR (XCDR (plist));
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
575 }
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
576 }
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
577 }
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
578
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
579
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
580 /* Make text in the region between START and END a composition that
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
581 has COMPONENTS and MODIFICATION-FUNC.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
582
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
583 If STRING is non-nil, then operate on characters contained between
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
584 indices START and END in STRING. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
585
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
586 void
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
587 compose_text (start, end, components, modification_func, string)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
588 int start, end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
589 Lisp_Object components, modification_func, string;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
590 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
591 Lisp_Object prop;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
592
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
593 prop = Fcons (Fcons (make_number (end - start), components),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 modification_func);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
595 Fput_text_property (make_number (start), make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
596 Qcomposition, prop, string);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
597 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
598
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
599
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
600 /* Emacs Lisp APIs. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
601
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
602 DEFUN ("compose-region-internal", Fcompose_region_internal,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
603 Scompose_region_internal, 2, 4, 0,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
604 doc: /* Internal use only.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
605
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
606 Compose text in the region between START and END.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
607 Optional 3rd and 4th arguments are COMPONENTS and MODIFICATION-FUNC
47275
49ac77cddafb (Fcompose_region_internal, Fcompose_string_internal): Fix spacing.
Juanma Barranquero <lekktu@gmail.com>
parents: 46940
diff changeset
608 for the composition. See `compose-region' for more detail. */)
64574
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
609 (start, end, components, modification_func)
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
610 Lisp_Object start, end, components, modification_func;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
611 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
612 validate_region (&start, &end);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
613 if (!NILP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
614 && !INTEGERP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
615 && !CONSP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
616 && !STRINGP (components))
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
617 CHECK_VECTOR (components);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
618
64574
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
619 compose_text (XINT (start), XINT (end), components, modification_func, Qnil);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
620 return Qnil;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
621 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
622
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
623 DEFUN ("compose-string-internal", Fcompose_string_internal,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
624 Scompose_string_internal, 3, 5, 0,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
625 doc: /* Internal use only.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
626
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
627 Compose text between indices START and END of STRING.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
628 Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC
47275
49ac77cddafb (Fcompose_region_internal, Fcompose_string_internal): Fix spacing.
Juanma Barranquero <lekktu@gmail.com>
parents: 46940
diff changeset
629 for the composition. See `compose-string' for more detail. */)
64574
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
630 (string, start, end, components, modification_func)
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
631 Lisp_Object string, start, end, components, modification_func;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
633 CHECK_STRING (string);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
634 CHECK_NUMBER (start);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
635 CHECK_NUMBER (end);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
637 if (XINT (start) < 0 ||
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
638 XINT (start) > XINT (end)
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46293
diff changeset
639 || XINT (end) > SCHARS (string))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
640 args_out_of_range (start, end);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
641
64574
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
642 compose_text (XINT (start), XINT (end), components, modification_func, string);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
643 return string;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
644 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
645
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
646 DEFUN ("find-composition-internal", Ffind_composition_internal,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
647 Sfind_composition_internal, 4, 4, 0,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
648 doc: /* Internal use only.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
649
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
650 Return information about composition at or nearest to position POS.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
651 See `find-composition' for more detail. */)
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
652 (pos, limit, string, detail_p)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
653 Lisp_Object pos, limit, string, detail_p;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
654 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
655 Lisp_Object prop, tail;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
656 int start, end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
657 int id;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
658
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
659 CHECK_NUMBER_COERCE_MARKER (pos);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
660 start = XINT (pos);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
661 if (!NILP (limit))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
662 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
663 CHECK_NUMBER_COERCE_MARKER (limit);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
664 end = XINT (limit);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
665 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667 end = -1;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
668
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
669 if (!NILP (string))
38097
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
670 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
671 CHECK_STRING (string);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46293
diff changeset
672 if (XINT (pos) < 0 || XINT (pos) > SCHARS (string))
38097
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
673 args_out_of_range (string, pos);
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
674 }
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
675 else
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
676 {
38116
a85b9df3dffb (Ffind_composition_internal): Accept ZV
Gerd Moellmann <gerd@gnu.org>
parents: 38098
diff changeset
677 if (XINT (pos) < BEGV || XINT (pos) > ZV)
38097
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
678 args_out_of_range (Fcurrent_buffer (), pos);
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
679 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
680
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681 if (!find_composition (start, end, &start, &end, &prop, string))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
682 return Qnil;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
683 if (!COMPOSITION_VALID_P (start, end, prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
684 return Fcons (make_number (start), Fcons (make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
685 Fcons (Qnil, Qnil)));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
686 if (NILP (detail_p))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
687 return Fcons (make_number (start), Fcons (make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
688 Fcons (Qt, Qnil)));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
689
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
690 if (COMPOSITION_REGISTERD_P (prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
691 id = COMPOSITION_ID (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
692 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
693 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
694 int start_byte = (NILP (string)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695 ? CHAR_TO_BYTE (start)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696 : string_char_to_byte (string, start));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697 id = get_composition_id (start, start_byte, end - start, prop, string);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
699
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
700 if (id >= 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
701 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
702 Lisp_Object components, relative_p, mod_func;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
703 enum composition_method method = COMPOSITION_METHOD (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704 int width = composition_table[id]->width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
706 components = Fcopy_sequence (COMPOSITION_COMPONENTS (prop));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
707 relative_p = (method == COMPOSITION_WITH_RULE_ALTCHARS
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
708 ? Qnil : Qt);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
709 mod_func = COMPOSITION_MODIFICATION_FUNC (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
710 tail = Fcons (components,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
711 Fcons (relative_p,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
712 Fcons (mod_func,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
713 Fcons (make_number (width), Qnil))));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
714 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
715 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
716 tail = Qnil;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
717
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
718 return Fcons (make_number (start), Fcons (make_number (end), tail));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
719 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
720
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
721
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
722 void
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
723 syms_of_composite ()
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
724 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
725 Qcomposition = intern ("composition");
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
726 staticpro (&Qcomposition);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
727
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
728 /* Make a hash table for composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
729 {
28472
bae9218986ac * composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents: 26848
diff changeset
730 Lisp_Object args[6];
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
731 extern Lisp_Object QCsize;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
732
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
733 args[0] = QCtest;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
734 args[1] = Qequal;
53316
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
735 /* We used to make the hash table weak so that unreferenced
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
736 compostions can be garbage-collected. But, usually once
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
737 created compositions are repeatedly used in an Emacs session,
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
738 and thus it's not worth to save memory in such a way. So, we
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
739 make the table not weak. */
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
740 args[2] = QCweakness;
53221
94ae4d74b7e0 (syms_of_composite): Don't make the compostion hash table week.
Kenichi Handa <handa@m17n.org>
parents: 52401
diff changeset
741 args[3] = Qnil;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
742 args[4] = QCsize;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
743 args[5] = make_number (311);
28472
bae9218986ac * composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents: 26848
diff changeset
744 composition_hash_table = Fmake_hash_table (6, args);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
745 staticpro (&composition_hash_table);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
746 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
747
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
748 /* Text property `composition' should be nonsticky by default. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
749 Vtext_property_default_nonsticky
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
750 = Fcons (Fcons (Qcomposition, Qt), Vtext_property_default_nonsticky);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
751
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
752 DEFVAR_LISP ("compose-chars-after-function", &Vcompose_chars_after_function,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
753 doc: /* Function to adjust composition of buffer text.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
754
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
755 The function is called with three arguments FROM, TO, and OBJECT.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
756 FROM and TO specify the range of text of which composition should be
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
757 adjusted. OBJECT, if non-nil, is a string that contains the text.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
758
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
759 This function is called after a text with `composition' property is
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
760 inserted or deleted to keep `composition' property of buffer text
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
761 valid.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
762
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
763 The default value is the function `compose-chars-after'. */);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
764 Vcompose_chars_after_function = intern ("compose-chars-after");
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
765
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
766 Qcomposition_function_table = intern ("composition-function-table");
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
767 staticpro (&Qcomposition_function_table);
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
768
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
769 /* Intern this now in case it isn't already done.
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
770 Setting this variable twice is harmless.
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
771 But don't staticpro it here--that is done in alloc.c. */
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
772 Qchar_table_extra_slots = intern ("char-table-extra-slots");
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
773
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
774 Fput (Qcomposition_function_table, Qchar_table_extra_slots, make_number (0));
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
775
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
776 DEFVAR_LISP ("composition-function-table", &Vcomposition_function_table,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
777 doc: /* Char table of patterns and functions to make a composition.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
778
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
779 Each element is nil or an alist of PATTERNs vs FUNCs, where PATTERNs
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
780 are regular expressions and FUNCs are functions. FUNC is responsible
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
781 for composing text matching the corresponding PATTERN. FUNC is called
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
782 with three arguments FROM, TO, and PATTERN. See the function
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
783 `compose-chars-after' for more detail.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
784
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
785 This table is looked up by the first character of a composition when
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
786 the composition gets invalid after a change in a buffer. */);
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
787 Vcomposition_function_table
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
788 = Fmake_char_table (Qcomposition_function_table, Qnil);
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
789
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
790 defsubr (&Scompose_region_internal);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
791 defsubr (&Scompose_string_internal);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
792 defsubr (&Sfind_composition_internal);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
793 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
794
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
795 /* arch-tag: 79cefaf8-ca48-4eed-97e5-d5afb290d272
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
796 (do not change this comment) */