1%%%%%%%%%%%%%%%%%%%%%%%%%%% utfcode.sty %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% utfcode.sty
3% scanner module for the Arabic and Hebrew segments of UTF-8
4% loaded and called by utf8.sty
5% 07.03.2002
6%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7% (c) Klaus Lagally
8%     Institut fuer Informatik
9%     Universitaet Stuttgart
10%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11
12\catcode`\@ = 11
13
14\a@ident {utfcode.sty} {3.10a Arabic+Hebrew segment of UTF-8} {07.03.2002}
15
16\newcount \u@lb	\newcount \u@lq
17
18\newif \ifa@quote
19
20\def \utfc@scan #1>{% modified scanner call: token sequence -> \a@tokens
21\iftest@scan \tracingmacros = 1 \fi
22\global\def \a@rest {}\global\a@tokens = {}\def \sc@char {}%
23\utf@beg #1\@ \@ \@ \@@ % transform
24\iftest@scan \tracingmacros = 0 \xpa \a@verb \xpa (\the\a@tokens )>\fi }
25
26\def \utf@beg #1#2{% start UTF-8 scanner
27\h@mzafalse  \iz@fetfalse \novocalize % because of explicit quoting
28	\@ssimfalse
29	\def \next {\utf@word #1#2}%
30\ifnum `#1="D8 \ifnum `#2="27 \def \next {\utf@alif }\fi \else
31%\ifx #1"\def \next {\utf@lquote #2}\else
32\ifx #1/\global \a@tokens ={#1}\def \next {\utf@word #2}\else % x>
33%\fi
34\fi\fi \next }
35
36{\catcode `\^ 7 \catcode `\^^M=13
37\gdef \utf@word #1#2{% transform input into internal notation
38\ifx #1\@ \def \next {\utf@end #2}\else		% finished
39\ifx #1-\def \next {\utf@minus #2}\else %
40%ifx #1"\def \next {\utf@rquote #2}\else %
41\ifx #1/\def \next {\sc@back #1#2}\else %
42%\if \nxp ^^M\nxp #1\def \next {\utf@par #2}\else % active character
43\ifnum `#1="D6 \def \next {\utf@dvi #2}\else %
44\ifnum `#1="D7 \def \next {\utf@dvii #2}\else %
45\ifnum `#1="D8 \def \next {\utf@dviii #2}\else %
46\ifnum `#1="D9 \def \next {\utf@dix #2}\else %
47\ifnum `#1="DA \def \next {\utf@da #2}\else %
48\ifnum `#1="DB \def \next {\utf@db #2}\else %
49	\def \next {\utf@asci #1#2}%
50\fi\fi\fi\fi\fi\fi %
51%\fi\fi
52\fi\fi\fi \next }%
53%
54\gdef \utf@word #1{% transform input into internal notation
55\ifx #1\@ \def \next {\utf@end }\else		% finished
56\ifx #1-\def \next {\utf@minus }\else %
57\ifx #1/\def \next {\sc@back #1}\else %
58\ifnum `#1="D6 \def \next {\utf@dvi }\else %
59\ifnum `#1="D7 \def \next {\utf@dvii }\else %
60\ifnum `#1="D8 \def \next {\utf@dviii }\else %
61\ifnum `#1="D9 \def \next {\utf@dix }\else %
62\ifnum `#1="DA \def \next {\utf@da }\else %
63\ifnum `#1="DB \def \next {\utf@db }\else %
64	\def \next {\utf@asci #1}%
65\fi\fi\fi\fi\fi\fi %
66\fi\fi\fi \next }%
67} % catcode 13
68
69\def \utf@end #1\@@ {\relax }
70
71\def \utf@next {% save and deposit character
72\sc@put \utf@word }
73
74\def \utf@asci #1{% deposit ASCII item
75\def \sc@char {#1}\utf@next }
76
77{\catcode `\% 12 \gdef \a@pc {%}}
78
79%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80
81\def \utf@dvi #1{% segment D6
82	\u@lb `#1\relax \advance \u@lb -128
83	\u@lq \u@lb \divide \u@lq 8
84	\edef \sc@char {}%
85\ifcase \u@lq \or \or \or \or \or
86\or \advance \u@lb -48 \edef \sc@char
87	{\ifcase \u@lb
88	"\n@xp\a@e\or "\n@xp\a@I\or "\n@xp\a@A\or "\n@xp\a@O\or
89	"i\or "\n@xp\a@E\or "e\or "a\or
90	\fi }%
91\or \advance \u@lb -56 \edef \sc@char
92	{\ifcase \u@lb
93	"A\or "\n@xp\a@o\or L\or "u\or
94	"\n@xp\a@Zu\or |\or B\or "\n@xp\a@Zo\or
95	\fi }%
96\fi \utf@next }
97
98%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
99
100\def \utf@dvii #1{% segment D7
101	\u@lb `#1\relax \advance \u@lb -128
102	\u@lq \u@lb \divide \u@lq 8
103\ifcase \u@lq \edef \sc@char
104	{\ifcase \u@lb
105	K\or "\n@xp\a@Ze\or "\n@xp\a@Za\or :\or "\n@xp\a@Zi\or \or \or \or
106	\fi }%
107\or \advance \u@lb  -8 \edef \sc@char {}%
108\or \advance \u@lb -16 \edef \sc@char
109	{\ifcase \u@lb
110	Q\or b\or g\or d\or h\or w\or z\or X\or
111	\fi }%
112\or \advance \u@lb -24 \edef \sc@char
113	{\ifcase \u@lb
114	C\or y\or k\or k\or l\or m\or m\or n\or
115	\fi }%
116\or \advance \u@lb -32 \edef \sc@char
117	{\ifcase \u@lb
118	n\or s\or P\or p\or p\or S\or S\or q\or
119	\fi }%
120\or \advance \u@lb -40 \edef \sc@char
121	{\ifcase \u@lb
122	r\or \n@xp\a@S \or t\or \or \or \or \or \or
123	\fi }%
124\or \advance \u@lb -48 \edef \sc@char
125	{\ifcase \u@lb
126	w\n@xp\a@U w\or wy\or y\n@xp\a@U y\or '\or
127	''\or \or \or \or
128	\fi }%
129\or \advance \u@lb -56 \edef \sc@char
130	{\ifcase \u@lb
131	\or \or \or \or \or \or \or "|\or
132	\fi }%
133\fi \utf@next }
134
135%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136
137\def \utf@dviii #1{% segment D8
138	\u@lb `#1\relax \advance \u@lb -"80
139	\u@lq \u@lb \divide \u@lq 8
140\ifcase \u@lq 	               \edef \sc@char {}%
141\or  \advance \u@lb  -8        \edef \sc@char {\ifcase \u@lb
142	\or    \or    \or    \or    ,\or   \or    \or    \or    \fi }%
143\or  \advance \u@lb -"10       \edef \sc@char {}%
144\or  \advance \u@lb -"18       \edef \sc@char {\ifcase \u@lb
145	\or    \or    \or    ;\or   \or    \or    \or    ?\or   \fi }%
146\or  \advance \u@lb -"20       \edef \sc@char {\ifcase \u@lb
147	\or    Q|\or  QA\or  Qa\or  Qw\or  Qi\or  Qy\or  A\or   \fi }%
148\or  \advance \u@lb -"28       \edef \sc@char {\ifcase \u@lb
149	b\or   T\or   t\or   C\or   G\or   H\or   X\or   d\or  	\fi }%
150\or  \advance \u@lb -"30       \edef \sc@char {\ifcase \u@lb
151	F\or   r\or   z\or   s\or   x\or   S\or   D\or   V\or   \fi }%
152\or  \advance \u@lb -"38       \edef \sc@char {\ifcase \u@lb
153	Z\or   P\or   R\or   \or    \or    \or    \or    \or    \fi }%
154\fi \utf@next }
155
156%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
157
158\def \utf@dix #1{% segment D9
159	\u@lb `#1\relax \advance \u@lb -"80
160	\u@lq \u@lb \divide \u@lq 8
161\ifcase \u@lq 		       \edef \sc@char {\ifcase \u@lb
162	B\or   f\or   q\or   k\or   l\or   m\or   n\or   h\or   \fi }%
163\or  \advance \u@lb  -8        \edef \sc@char {\ifcase \u@lb
164	w\or   Y\or   y\or   "aN\or "uN\or "iN\or "a\or  "u\or  \fi }%
165\or  \advance \u@lb -"10       \edef \sc@char {\ifcase \u@lb
166	"i\or  "\n@xp\a@Ze\or ""\or "\n@xp\a@ZE\or
167	"\n@xp\a@Za\or "\n@xp\a@Zu\or \or \or \fi }%
168\or  \advance \u@lb -"18       \edef \sc@char {}%
169\or  \advance \u@lb -"20       \edef \sc@char {\ifcase \u@lb
170	0\or   1\or   2\or   3\or   4\or   5\or   6\or   7\or   \fi }%
171\or  \advance \u@lb -"28       \edef \sc@char {\ifcase \u@lb
172	8\or           9\or           \a@pc\or       \f@sila\or
173	\f@sila\or     *\or           \or            \or            \fi }%
174\or  \advance \u@lb -"30       \edef \sc@char {\ifcase \u@lb
175	"\n@xp\a@a\or  "\or     "\n@xp\a@ZA\or "\n@xp\a@ZU\or
176%      N"\n@xp\a@Za\or Qa\or          Qw\or          Qw"u\or        \fi }%
177N"\n@xp\a@Za\or N"\n@xp\a@Za A\or N"\n@xp\a@Za w\or N"\n@xp\a@Za w"u\or \fi }%
178\or  \advance \u@lb -"38       \edef \sc@char {\ifcase \u@lb
179%	Qy\or          \n@xp\a@t\or   \n@xp\a@T\or   \n@xp\a@ab\or
180	N"\n@xp\a@Za Y\or \n@xp\a@t\or   \n@xp\a@T\or   \n@xp\a@ab\or
181	\n@xp\a@v\or   \n@xp\a@at\or  p\or           \n@xp\a@ac\or  \fi }%
182\fi \utf@next }
183
184%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
185
186\def \utf@da #1{% segment DA
187	\u@lb `#1\relax \advance \u@lb -"80
188	\u@lq \u@lb \divide \u@lq 8
189\ifcase \u@lq                  \edef \sc@char {\ifcase \u@lb
190	\n@xp\a@ap\or  c\or           \n@xp\a@G\or   \n@xp\a@ag\or
191	\n@xp\a@ah\or  \n@xp\a@c\or   J\or           \n@xp\a@aj\or  \fi }%
192\or  \advance \u@lb  -8        \edef \sc@char {\ifcase \u@lb
193	\n@xp\a@d\or   \n@xp\a@aA\or  \n@xp\a@D\or   \n@xp\a@aB\or
194	\n@xp\a@ad\or  \n@xp\a@af\or  \n@xp\a@aC\or  \n@xp\a@ae\or  \fi }%
195\or  \advance \u@lb -"10       \edef \sc@char {\ifcase \u@lb
196	\n@xp\a@aD\or  \n@xp\a@r\or   \n@xp\a@aF\or  \n@xp\a@q\or
197	\n@xp\a@aG\or  \n@xp\a@R\or   \n@xp\a@z\or   \n@xp\a@aH\or  \fi }%
198\or  \advance \u@lb -"18       \edef \sc@char {\ifcase \u@lb
199	j\or           \n@xp\a@ar\or  \n@xp\a@s\or   \n@xp\a@aJ\or
200	\n@xp\a@aK\or  \n@xp\a@aL\or  \n@xp\a@aM\or  \n@xp\a@aO\or  \fi }%
201\or  \advance \u@lb -"20       \edef \sc@char {\ifcase \u@lb
202	\n@xp\a@p\or   \n@xp\a@f\or   \n@xp\a@F\or   \n@xp\a@aP\or
203	v\or           \n@xp\a@V\or   \n@xp\a@aq\or  \n@xp\a@aQ\or  \fi }%
204\or  \advance \u@lb -"28       \edef \sc@char {\ifcase \u@lb
205	\n@xp\a@aR\or  \n@xp\a@k\or   \n@xp\a@ax\or  \n@xp\a@g\or
206	\n@xp\a@L\or   K\or           \n@xp\a@aS\or  g\or           \fi }%
207\or  \advance \u@lb -"30       \edef \sc@char {\ifcase \u@lb
208	\n@xp\a@J\or   \n@xp\a@al\or  \n@xp\a@aT\or  \n@xp\a@ak\or
209	\n@xp\a@M\or   \n@xp\a@l\or   \n@xp\a@aW\or  \n@xp\a@aX\or  \fi }%
210\or  \advance \u@lb -"38       \edef \sc@char {\ifcase \u@lb
211	\n@xp\a@aY\or  \n@xp\a@aZ\or  \n@xp\a@n\or   \n@xp\a@an\or
212	\n@xp\a@m\or   \n@xp\a@am\or  h-\or          \n@xp\a@aE\or  \fi }%
213\fi \utf@next }
214
215%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
216
217\def \utf@db #1{% segment DB
218	\u@lb `#1\relax \advance \u@lb -"80
219	\u@lq \u@lb \divide \u@lq 8
220\ifcase \u@lq                  \edef \sc@char {\ifcase \u@lb
221	Qh\or          \n@xp\a@h\or   \n@xp\a@B\or  \n@xp\a@j\or
222	\n@xp\a@aU\or  \n@xp\a@aV\or  \n@xp\a@W\or  \n@xp\a@w\or    \fi }%
223\or  \advance \u@lb  -8        \edef \sc@char {\ifcase \u@lb
224	\n@xp\a@aw\or  \n@xp\a@au\or  \n@xp\a@av\or  \n@xp\a@X\or
225	Y\or           L\or           \n@xp\a@az\or  \n@xp\a@x\or   \fi }%
226\or  \advance \u@lb -"10       \edef \sc@char {\ifcase \u@lb
227	\n@xp\a@Y\or   \n@xp\a@y\or   E\or           \n@xp\a@ay\or
228	B\or           \n@xp\a@H\or   \or            \or            \fi }%
229\or  \advance \u@lb -"18       \edef \sc@char {}%
230\or  \advance \u@lb -"20       \edef \sc@char {}%
231\or  \advance \u@lb -"28       \edef \sc@char {}%
232\or  \advance \u@lb -"30       \edef \sc@char {\ifcase \u@lb
233	0\or           1\or           2\or           3\or
234	4\or           5\or           6\or           7\or  \fi }%
235\or  \advance \u@lb -"38       \edef \sc@char {\ifcase \u@lb
236	8\or           9\or           \n@xp\a@aI\or  \n@xp\a@aN\or
237	\n@xp\a@P\or   \n@xp\a@ai"\n@xp\a@Zi\or
238	\n@xp\a@ao"\n@xp\a@Zi\or       \or            \fi }%
239\fi \utf@next }
240
241%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242
243\def \utf@alif {% alif at the beginning of a word
244\def \sc@char {a}\sc@put \utf@word }
245
246\def \utf@minus {% hyphen between words
247\def \sc@char {-}\sc@put \utf@beg }
248%\def \sc@char {B}\sc@put \utf@beg }
249
250\def \utf@lquote {% left quote
251\ifa@quote \def \sc@char {'}\global\a@quotefalse
252\else \def \sc@char {`}\global\a@quotetrue
253\fi \sc@put \utf@beg }
254
255\def \utf@rquote {% right quote
256\global\a@quotefalse \def \sc@char {'}\sc@put \utf@word }
257
258\def \utf@par #1\@ \@@ {% new line, push back the rest
259\sc@back \\#1\@ \@@ }
260
261\def \utf@b@cs #1#2{% test word end
262\def \sc@char {#1}\sc@put
263%\ifx #2\@ \def \next {\sc@endscan #2}\else
264\ifx #2\@ \def \next {\utf@end #2}\else
265\ifcat -\nxp #2 \def \next {\utf@word #2}\else
266\def \next {\sc@back #2}\fi \fi \next }
267
268\def \utf@cs #1#2{% control sequence within a word; push back?
269\xpa \ifx #1\closegeresh \def \next {\utf@b@cs {\nxp \lq }#2}\else
270\xpa \ifx #1\closequote \def \next {\utf@b@cs {`}#2}\else
271	\def \next {\sc@back #1#2}%
272\fi\fi \next }
273
274%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
275
276\catcode `\@ = \utfatcode
277
278\endinput
279%%%%%%%%%%%%%%%%%%%%%%%% EOF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280