a4a41b44670ee18ae507de65f4d944cccd5d7bf4
[m17n/m17n-db.git] / FORMATS / IM.txt
1 /* Copyright (C) 2003, 2004, 2005
2      National Institute of Advanced Industrial Science and Technology (AIST)
3      Registration Number H15PRO112
4    See the end for copying conditions.  */
5
6 /***en
7
8 @page mdbIM Input Method
9
10 @section im-description DESCRIPTION
11
12 The m17n library provides a driver for input methods that are
13 dynamically loadable from the m17n database (see @ref m17nInputMethod
14 @latexonly (P.\pageref{group__m17nInputMethod}) @endlatexonly).
15
16 This section describes the data format that defines those input
17 methods.
18
19 @section im-format SYNTAX and SEMANTICS
20
21 The following data format defines an input method.  The driver loads a
22 definition from a file, a stream, etc.  The definition is converted
23 into the form of plist in the driver.
24
25 @verbatim
26 INPUT-METHOD ::=
27     IM-DECLARATION ? DESCRIPTION ? VARIABLE-LIST ? COMMAND-LIST ?
28     TITLE MAP-LIST MACRO-LIST ? MODULE-LIST ? STATE-LIST
29
30 IM-DECLARATION ::= '(' 'input-method' LANGUAGE NAME ')'
31 DESCRIPTION ::= '(' 'description' [ MTEXT-OR-GETTEXT | nil] ')'
32 VARIABLE-LIST ::= '(' 'variable' VARIABLE-DECLARATION * ')'
33 COMMAND-LIST ::= '(' 'command' COMMAND-DECLARATION * ')'
34 TITLE ::= '(' 'title' TITLE-TEXT ')'
35
36 VARIABLE-DECLARATION ::=
37     '(' VAR-NAME [ MTEXT-OR-GETTEXT | nil ] VALUE VALUE-CANDIDATE * ')'
38
39 COMMAND-DECLARATION ::=
40     '(' CMD-NAME [ MTEXT-OR-GETTEXT | nil ] KEYSEQ * ')'
41
42 MTEXT-OR-GETTEXT ::=
43     [ MTEXT | '(' '_' MTEXT ')']
44
45 LANGUAGE ::= SYMBOL
46 NAME ::= SYMBOL
47 IM-DESCRIPTION ::= MTEXT
48 VAR-NAME ::= SYMBOL
49 VAR-DESCRIPTION ::= MTEXT
50 VALUE ::= MTEXT | SYMBOL | INTEGER
51 VALUE-CANDIDATE ::= VALUE | '(' RANGE-FROM RANGE-TO ')'
52 RANGE-FROM ::= INTEGER
53 RANGE-TO ::= INTEGER
54 CMD-NAME ::= SYMBOL
55 CMD-DESCRIPTION ::= MTEXT
56 TITLE-TEXT ::= MTEXT
57 @endverbatim
58
59 @c IM-DECLARATION specifies the language and name of this input
60 method.
61
62 @c DESCRIPTION specifies the description text of this input method by
63 MTEXT-OR-GETTEXT.  It it takes the second form, the text is translated
64 according to the current locale by "gettext" (if the translation is
65 provided).
66
67 @c VARIABLE-DECLARATION declares a variable used in this input method.
68 If a variable must be initialized to the default value, or is to be
69 customized by a user, it must be declared here.
70
71 @c COMMAND-DECLARATION declares a command used in this input method.
72 If a command must be bound to the default key sequence, or is to be
73 customized by a user, it must be declared here.
74
75 @c TITLE-TEXT is a text displayed on the screen when this input method
76 is active.
77
78 @verbatim
79 MAP-LIST ::= '(' 'map' MAP * ')'
80
81 MAP ::= '(' MAP-NAME RULE * ')'
82
83 MAP-NAME ::= SYMBOL
84
85 RULE ::= '(' KEYSEQ MAP-ACTION * ')'
86
87 KEYSEQ ::= MTEXT | '(' [ SYMBOL | INTEGER ] * ')'
88 @endverbatim
89
90 @c SYMBOL in the definitions of @c MAP-NAME must not be @c t nor @c
91 nil.
92
93 @c MTEXT in the definition of @c KEYSEQ consists of characters that
94 can be generated by a keyboard.  Therefore @c MTEXT usually contains
95 only ASCII characters.  However, if the input method is intended to be
96 used, for instance, with a West European keyboard, @c MTEXT may
97 contain Latin-1 characters.
98
99 @c SYMBOL in the definition of @c KEYSEQ must be the return value of
100 the minput_event_to_key () function.
101
102 @c INTEGER in the definition of @c KEYSEQ must be a valid character
103 code.
104
105 @verbatim
106 MAP-ACTION ::= ACTION
107
108 ACTION ::= INSERT | DELETE | SELECT | MOVE | MARK
109            | SHOW | HIDE | PUSHBACK | UNDO | UNHANDLE | SHIFT | CALL
110            | SET | IF | COND | '(' MACRO-NAME ')'
111
112 PREDEFINED-SYMBOL ::=
113     '@0' | '@1' | '@2' | '@3' | '@4'
114     | '@5' | '@6' | '@7' | '@8' | '@9'
115     | '@<' | '@=' | '@>' | '@-' | '@+' | '@[' | '@]'
116     | '@@'
117     | '@-N' | '@+N'
118 @endverbatim
119 @verbatim
120 MACRO-LIST ::= '(' 'macro' MACRO * ')'
121
122 MACRO ::= '(' MACRO-NAME MACRO-ACTION * ')'
123
124 MACRO-NAME ::= SYMBOL
125
126 MACRO-ACTION ::= ACTION
127 @endverbatim
128 @verbatim
129 MODULE-LIST ::= '(' 'module' MODULE * ')'
130
131 MODULE ::= '(' MODULE-NAME FUNCTION * ')'
132
133 MODULE-NAME ::= SYMBOL
134
135 FUNCTION ::= SYMBOL
136 @endverbatim
137
138 Each @c MODULE declares the name of external module (i.e. dynamic
139 library) and function names exported by the module.  If a @c FUNCTION has
140 name "init", it is called with only the default arguments (see the
141 section about @c CALL) when an input context is created for the input
142 method.  If a @c FUNCTION has name "fini", it is called with only the
143 default arguments when an input context is destroyed.
144
145 @verbatim
146 STATE-LIST ::= '(' 'state' STATE * ')'
147
148 STATE ::= '(' STATE-NAME [ STATE-TITLE-TEXT ] BRANCH * ')'
149
150 STATE-NAME ::= SYMBOL
151
152 STATE-TITLE-TEXT ::= MTEXT
153
154 BRANCH ::= '(' MAP-NAME BRANCH-ACTION * ')'
155            | '(' nil BRANCH-ACTION * ')'
156            | '(' t BRANCH-ACTION * ')'
157 @endverbatim
158
159 The optional @c STATE-TITLE-TEXT specifies a title text displayed on
160 the screen when the input method is in this state.  If @c
161 STATE-TITLE-TEXT is omitted, @c TITLE-TEXT is used.
162
163 In the first form of @c BRANCH, @c MAP-NAME must be an item that
164 appears in @c MAP.  In this case, if a key sequence matching one of @c
165 KEYSEQs of @c MAP-NAME is typed, @c BRANCH-ACTIONs are executed.
166
167 In the second form of @c BRANCH, @c BRANCH-ACTIONs are executed if a
168 key sequence that doesn't match any of @c Branch's of the current
169 state is typed.
170
171 In the third form of @c BRANCH, @c BRANCH-ACTIONs are executed when
172 shifted to the current state.  If the current state is the initial
173 state, @c BRANCH-ACTIONs are executed also when an input context of
174 the input method is created.
175
176 @verbatim
177 BRANCH-ACTION ::= ACTION
178 @endverbatim
179
180 An input method has the following two lists of symbols.
181
182 <ul>
183 <li> marker list
184
185 A marker is a symbol indicating a character position in the preediting
186 text.  The @c MARK action assigns a position to a marker.  The
187 position of a marker is referred by the @c MOVE and the @c DELETE actions.
188
189 <li> variable list
190
191 A variable is a symbol associated with an integer value.  The value of
192 a variable is set by the @c SET action, and is referred by the @c SET,
193 the @c INSERT, and the @c IF actions.  All variables are implicitly
194 initialized to zero.
195
196 </ul>
197
198 Each @c PREDEFINED-SYMBOL has a special meaning when used as a marker.
199
200 <ul>
201 <li> @c @@0, @c @@1, @c @@2, @c @@3, @c @@4, @c @@5, @c @@6, @c @@7, @c @@8, @c @@9
202
203 The 0th, 1st, 2nd, ... 9th position respectively.
204
205 <li> @c @@<, @c @@=, @c @@>
206
207 The first, the current, and the last position.
208
209 <li> @c @@-, @c @@+
210
211 The previous and the next position.
212
213 <li> @c @@[, @c @@]
214
215 The previous and the next position where a candidate list changes.
216 </ul>
217
218 Some of the @c PREDEFINED-SYMBOL has a special meaning when used as a candidate
219 index in the @c SELECT action.
220
221 <ul>
222
223 <li> @c @@<, @c @@=, @c @@>
224
225 The first, the current, and the last candidate of the current candidate group.
226
227 <li> @c @@-
228
229 The previous candidate.  If the current candidate is the first one in
230 the current candidate group, then it means the last candidate in the
231 previous candidate group.
232
233 <li> @c @@+
234
235 The next candidate.  If the current candidate is the last one in the
236 current candidate group, then it means the first candidate in the next
237 candidate group.
238
239 <li> @c @@[, @c @@]
240
241 The candidate in the previous and the next candidate group having the same
242 candidate index as the current one.
243 </ul>
244
245 And, this also has a special meaning.
246
247 <ul>
248 <li> @c @@@
249
250 Number of handled keys at that moment.
251
252 </ul>
253
254 These are for supporting surround text handling.
255
256 <ul>
257 <li> @c @@-N
258
259 Here, @c N is a positive integer.  The value is a character at Nth
260 previous position from the current caret of the surrounding text.
261 When this is used as the argument of @c delete action, it specifies
262 how many preceding characters in the surround text to delete.
263
264 <li> @c @@+N
265
266 Here, @c N is a positive integer.  The value is a character at Nth
267 next position from the current caret of the surrounding text.
268 When this is used as the argument of @c delete action, it specifies
269 how many following characters in the surround text to delete.
270 </ul>
271
272 The arguments and the behavior of each action are listed below.
273
274 @verbatim
275 INSERT ::= '(' 'insert' MTEXT ')'
276            | MTEXT
277            | INTEGER
278            | '(' 'insert' SYMBOL ')'
279            | '(' 'insert' '(' CANDIDATES * ')' ')'
280            | '(' CANDIDATES * ')' 
281
282 CANDIDATES ::= MTEXT | '(' MTEXT * ')'
283 @endverbatim
284
285 The first and second forms insert @c MTEXT before the current position.
286
287 The third form inserts the character @c INTEGER before the current
288 position.
289
290 The fourth form treats @c SYMBOL as a variable, and inserts its value
291 (if it is a valid character code) before the current position.
292
293 In the fifth and sixth forms, each @c CANDIDATES represents a
294 candidate group, and each element of @c CANDIDATES represents a
295 candidate, i.e. if @c CANDIDATES is an M-text, the candidates are the
296 characters in the M-text; if @c CANDIDATES is a list of M-texts, the
297 candidates are the M-texts in the list.
298
299 These forms insert the first candidate before the current position.
300 The inserted string is associated with the list of candidates and
301 the information indicating the currently selected candidate.
302
303 The marker positions affected by the insertion are automatically relocated.
304
305 @verbatim
306 DELETE ::= '(' 'delete' SYMBOL ')'
307            | '(' 'delete' INTEGER ')'
308 @endverbatim
309
310 The first form treats @c SYMBOL as a marker, and deletes characters
311 between the current position and the marker position.
312
313 The second form treats @c INTEGER as a character position, and deletes
314 characters between the current position and the character position.
315
316 The marker positions affected by the deletion are automatically relocated.
317
318 @verbatim
319 SELECT ::= '(' 'select' PREDEFINED-SYMBOL ')'
320            | '(' 'select' INTEGER ')'
321 @endverbatim
322
323 This action first checks if the character just before the current position
324 belongs to a string that is associated with a candidate list.  If it is,
325 the action replaces that string with a candidate specified by the
326 argument.
327
328 The first form treats @c PREDEFINED-SYMBOL as a candidate index (as
329 described above) that specifies a new candidate in the candidate list.
330
331 The second form treats @c INTEGER as a candidate index that specifies a
332 new candidate in the candidate list.
333
334 @verbatim
335 SHOW ::= '(show)'
336 @endverbatim
337
338 This actions instructs the input method driver to display a candidate
339 list associated with the string before the current position.
340
341 @verbatim
342 HIDE ::= '(hide)'
343 @endverbatim
344
345 This action instructs the input method driver to hide the currently
346 displayed candidate list.
347
348 @verbatim
349 MOVE ::= '(' 'move' SYMBOL ')'
350          | '(' 'move' INTEGER ')'
351 @endverbatim
352
353 The first form treats @c SYMBOL as a marker, and makes the marker
354 position be the new current position.
355
356 The second form treats @c INTEGER as a character position, and makes
357 that position be the new current position.
358
359 @verbatim
360 MARK ::= '(' 'mark' SYMBOL ')'
361 @endverbatim
362
363 This action treats @c SYMBOL as a marker, and sets its position to the
364 current position.  @c SYMBOL must not be a @c PREDEFINED-SYMBOL.
365
366 @verbatim
367 PUSHBACK :: = '(' 'pushback' INTEGER ')'
368               | '(' 'pushback' KEYSEQ ')'
369 @endverbatim
370
371 The first form pushes back the latest @c INTEGER number of key events
372 to the event queue if @c INTEGER is positive, and pushes back all key
373 events if @c INTEGER is zero.
374
375 The second form pushes back keys in @c KEYSEQ to the event queue.
376
377 @verbatim
378 UNDO :: = '(' 'undo' [ INTEGER | SYMBOL ] ')'
379 @endverbatim
380
381 If there's no argument, this action cancels the last two key events
382 (i.e. the one that invoked this command, and the previous one).
383
384 If there's an integer argument NUM, it must be positive or negative
385 (not zero).  If positive, from the NUMth to the last events are
386 canceled.  If negative the last (- NUM) events are canceled.
387
388 If there's a symbol argument, it must be resolved to an integer number
389 and the number is treated as the actual argument as above.
390
391 @verbatim
392 UNHANDLE :: = '(unhandle)'
393 @endverbatim
394
395 This action commit the current preedit and return the last key as
396 unhandled.
397
398 @verbatim
399 SHIFT :: = '(' 'shift' STATE-NAME ')'
400 @endverbatim
401
402 This action shifts the current state to @c STATE-NAME.  @c
403 STATE-NAME must appear in @c STATE-LIST.
404
405 @verbatim
406 CALL ::= '(' 'call' MODULE-NAME FUNCTION ARG * ')'
407
408 ARG ::= INTEGER | SYMBOL | MTEXT | PLIST
409 @endverbatim
410
411 This action calls the function @c FUNCTION of external module @c
412 MODULE-NAME.  @c MODULE-NAME and @c FUNCTION must appear in @c
413 MODULE-LIST.
414
415 The function is called with an argument of the type (#MPlist *).  The
416 key of the first element is #Mt and its value is a pointer to an
417 object of the type #MInputContext.  The key of the second element is
418 #Msymbol and its value is the current state name.  @c ARGs are used as
419 the value of the third and later elements.  Their keys are determined
420 automatically; if an @c ARG is an integer, the corresponding key is
421 #Minteger; if an @c ARG is a symbol, the corresponding key is
422 #Msymbol, etc.
423
424 The function must return NULL or a value of the type (#MPlist *) that
425 represents a list of actions to take.
426
427 @verbatim
428 SET ::= '(' CMD SYMBOL1 EXPRESSION ')'
429
430 CMD ::= 'set' | 'add' | 'sub' | 'mul' | 'div'
431
432 EXPRESSION ::= INTEGER | SYMBOL2 | '(' OPERAND EXPRESSION * ')'
433
434 OPERAND ::= '+' | '-' | '*' | '/' | '|' | '&' | '!'
435             | '=' | '<' | '>' | '<=' | '>='
436
437 @endverbatim
438
439 This action treats @c SYMBOL1 and @c SYMBOL2 as variables and sets the
440 value of @c SYMBOL1 as below.
441
442 If @c CMD is 'set', it sets the value of @c SYMBOL1 to the value of @c
443 EXPRESSION.
444
445 If @c CMD is 'add', it increments the value of @c SYMBOL1 by the value
446 of @c EXPRESSION.
447
448 If @c CMD is 'sub', it decrements the value of @c SYMBOL1 by the value
449 of @c EXPRESSION.
450
451 If @c CMD is 'mul', it multiplies the value of @c SYMBOL1 by the value
452 of @c EXPRESSION.
453
454 If @c CMD is 'div', it divides the value of @c SYMBOL1 by the value of
455 @c EXPRESSION.
456
457 @verbatim
458 IF ::= '(' CONDITION ACTION-LIST1 ACTION-LIST2 ')'
459
460 CONDITION ::= [ '=' | '<' | '>' | '<=' | '>=' ] EXPRESSION1 EXPRESSION2
461
462 ACTION-LIST1 ::= '(' ACTION * ')'
463
464 ACTION-LIST2 ::= '(' ACTION * ')'
465 @endverbatim
466
467 This action performs actions in @c ACTION-LIST1 if @c CONDITION is
468 true, and performs @c ACTION-LIST2 (if any) otherwise.
469
470 @c SYMBOL1 and @c SYMBOL2 are treated as variables.
471
472 @verbatim
473 COND ::= '(' 'cond' [ '(' EXPRESSION ACTION * ') ] * ')'
474 @endverbatim
475
476 This action performs the first action @c ACTION whose corresponding
477 @c EXPRESSION has nonzero value.
478
479 @ifnot FOR-MAN
480
481 @section im-example1 EXAMPLE 1
482
483 This is a very simple example for inputting Latin characters with
484 diacritical marks (acute and cedilla).  For instance, when you type:
485 @verbatim
486     Comme'die-Franc,aise, chic,,
487 @endverbatim
488 you will get this:
489 @if FOR-HTML
490 @verbatim
491     Commédie-Française, chic,
492 @endverbatim
493 @endif
494 @if FOR-LATEX
495 @latexonly
496 \hskip5mm\texttt{\footnotesize Comm\'{e}die-Fran\c{c}aise, chic,}
497 @endlatexonly
498 @endif
499
500 The definition of the input method is very simple as below, and it is
501 quite straight forward to extend it to cover all Latin characters.
502
503 @if FOR-HTML
504 @verbatim
505 (title "latin-postfix")
506 (map
507  (trans
508   ("a'" ?á) ("e'" ?é) ("i'" ?í) ("o'" ?ó) ("u'" ?ú) ("c," ?ç)
509   ("A'" ?Á) ("E'" ?É) ("I'" ?Í) ("O'" ?Ó) ("U'" ?Ú) ("C," ?Ç)
510   ("a''" "a'") ("e''" "e'") ("i''" "i'") ("o''" "o'") ("u''" "u'")
511   ("c,," "c,")
512   ("A''" "A'") ("E''" "E'") ("I''" "I'") ("O''" "O'") ("U''" "U'")
513   ("C,," "C,")))
514 (state
515  (init
516   (trans)))
517 @endverbatim
518 @endif
519 @if FOR-LATEX
520 @latexonly
521 \texttt{\footnotesize
522 \hskip2mm(title "latin-postfix")\\
523 \hskip2mm(map\\
524 \hskip4mm (trans\\
525 \hskip6mm  ("a'" ?\'{a}) ("e'" ?\'{e}) ("i'" ?\'{i}) ("o'" ?\'{o})
526 ("u'" ?\'{u}) ("c," ?\c{c})\\
527 \hskip6mm  ("A'" ?\'{A}) ("E'" ?\'{E}) ("I'" ?\'{I}) ("O'" ?\'{O})
528 ("U'" ?\'{U}) ("C," ?\c{C})\\
529 \hskip6mm  ("a''" "a'") ("e''" "e'") ("i''" "i'") ("o''" "o'") ("u''" "u'")\\
530 \hskip6mm  ("c,," "c,")\\
531 \hskip6mm  ("A''" "A'") ("E''" "E'") ("I''" "I'") ("O''" "O'") ("U''" "U'")\\
532 \hskip6mm  ("C,," "C,")))\\
533 \hskip2mm(state\\
534 \hskip4mm (init\\
535 \hskip6mm  (trans)))}
536 @endlatexonly
537 @endif
538
539 @section im-example2 EXAMPLE 2
540
541 This example is for inputting Unicode characters by typing C-u
542 (Control-u) followed by four hexadecimal digits.  For instance, when
543 you type ("^u" means Control-u):
544 @verbatim
545     ^u2190^u2191^u2192^u2193
546 @endverbatim
547 you will get this (Unicode arrow symbols):
548 @verbatim
549     ←↑→↓
550 @endverbatim
551
552 The definition utilizes @c SET and @c IF commands as below:
553 @verbatim
554 (title "UNICODE")
555 (map
556  (starter
557   ((C-U) "U+"))
558  (hex
559   ("0" ?0) ("1" ?1) ... ("9" ?9) ("a" ?A) ("b" ?B) ... ("f" ?F)))
560 (state
561  (init
562   (starter (set code 0) (set count 0) (shift unicode)))
563  (unicode
564   (hex (set this @-)
565        (< this ?A
566           ((sub this 48))
567           ((sub this 55)))
568        (mul code 16) (add code this)
569        (add count 1)
570        (= count 4
571           ((delete @<) (insert code) (shift init))))))
572 @endverbatim
573
574 @section im-example3 EXAMPLE 3
575
576 This example is for inputting Chinese characters by typing PinYin key
577 sequence.
578 @if FOR-HTML
579 For instance, when you type:
580 @verbatim
581     nihaobei2jing2
582 @endverbatim
583 you will get:
584 @verbatim
585     你好北京
586 @endverbatim
587
588 The definition utilizes @c CANDIDATE and @c SELECT commands as below.
589 Note that this is just an example, and it ignores such important key
590 as Backspace.
591
592 @verbatim
593 (title "拼")
594
595 (map
596  ;; The initial character of Pinyin.
597  (starter
598   ("a") ("b") ... ("h") ("j") ... ("t") ("w") ("x") ("y") ("z"))
599
600  ;; Big table of Pinyin vs the corresponding Chinese characters.
601  (pinyin
602   ...
603   ("bei" ("被北备背悲辈杯倍贝碑" ...))
604   ("hao" ("好号毫豪浩耗皓嚎昊郝" ...))
605   ("jing" ("经京精境警竟静惊景敬" ...))
606   ("ni" ("你呢尼泥逆倪匿拟腻妮" ...))
607   ...)
608  ;; Typing 1, 2, ..., 0 selects the 0th, 1st, ..., 9th candidate.
609  (choose
610   ("1" (select 0)) ("2" (select 1)) ... ("9" (select 8)) ("0" (select 9))))
611
612 (state
613  (init
614   ;; When an initial character of Pinyin is typed, re-handle it in
615   ;; "main" state.  Anything else is just produced as is.
616   (starter (show) (pushback 1) (shift main)))
617
618  (main
619   ;; When a complete Pinyin sequence is typed, shift to "select" state
620   ;; to allow users to select one from the candidates.
621   (pinyin (shift select))
622
623   ;; When anything else is typed, produce the current candidate (if
624   ;; any), and re-handle the last input in "init" state.
625   (nil (hide) (shift init)))
626
627  (select
628   ;; When a number is typed, select the corresponding canidate,
629   ;; produce it, and shift to "init" state.
630   (choose (hide) (shift init))
631
632   ;; When anything else is typed, produce the current candidate,
633   ;; and re-handle the last input in "init" state.
634   (nil (hide) (shift init))))
635 @endverbatim
636
637 @elseif FOR-LATEX
638 @latexonly
639 \begin{center}
640 \fbox{This example is readable only in the documentation of HTML version.}
641 \end{center}
642 @endlatexonly
643 @endif
644
645 @endif
646
647 @section im-seealso SEE ALSO
648
649 @ref mim-list "Input Methods provided by the m17n database",
650 @ref mdbGeneral "mdbGeneral(5)"
651 */
652
653 /* 
654 Copyright (C) 2003, 2004, 2005
655   National Institute of Advanced Industrial Science and Technology (AIST)
656   Registration Number H15PRO112
657
658 This file is part of the m17n database; a sub-part of the m17n
659 library.
660
661 The m17n library is free software; you can redistribute it and/or
662 modify it under the terms of the GNU Lesser General Public License
663 as published by the Free Software Foundation; either version 2.1 of
664 the License, or (at your option) any later version.
665
666 The m17n library is distributed in the hope that it will be useful,
667 but WITHOUT ANY WARRANTY; without even the implied warranty of
668 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
669 Lesser General Public License for more details.
670
671 You should have received a copy of the GNU Lesser General Public
672 License along with the m17n library; if not, write to the Free
673 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
674 Boston, MA 02110-1301, USA.
675 */
676
677 /* Local Variables: */
678 /* coding: utf-8 */
679 /* End: */