%%%%%%%%%%%%%%%%%%%%%%%%%%% utfcode.sty %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % utfcode.sty % scanner module for the Arabic and Hebrew segments of UTF-8 % loaded and called by utf8.sty % 07.03.2002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (c) Klaus Lagally % Institut fuer Informatik % Universitaet Stuttgart %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \catcode`\@ = 11 \a@ident {utfcode.sty} {3.10a Arabic+Hebrew segment of UTF-8} {07.03.2002} \newcount \u@lb \newcount \u@lq \newif \ifa@quote \def \utfc@scan #1>{% modified scanner call: token sequence -> \a@tokens \iftest@scan \tracingmacros = 1 \fi \global\def \a@rest {}\global\a@tokens = {}\def \sc@char {}% \utf@beg #1\@ \@ \@ \@@ % transform \iftest@scan \tracingmacros = 0 \xpa \a@verb \xpa (\the\a@tokens )>\fi } \def \utf@beg #1#2{% start UTF-8 scanner \h@mzafalse \iz@fetfalse \novocalize % because of explicit quoting \@ssimfalse \def \next {\utf@word #1#2}% \ifnum `#1="D8 \ifnum `#2="27 \def \next {\utf@alif }\fi \else %\ifx #1"\def \next {\utf@lquote #2}\else \ifx #1/\global \a@tokens ={#1}\def \next {\utf@word #2}\else % x> %\fi \fi\fi \next } {\catcode `\^ 7 \catcode `\^^M=13 \gdef \utf@word #1#2{% transform input into internal notation \ifx #1\@ \def \next {\utf@end #2}\else % finished \ifx #1-\def \next {\utf@minus #2}\else % %ifx #1"\def \next {\utf@rquote #2}\else % \ifx #1/\def \next {\sc@back #1#2}\else % %\if \nxp ^^M\nxp #1\def \next {\utf@par #2}\else % active character \ifnum `#1="D6 \def \next {\utf@dvi #2}\else % \ifnum `#1="D7 \def \next {\utf@dvii #2}\else % \ifnum `#1="D8 \def \next {\utf@dviii #2}\else % \ifnum `#1="D9 \def \next {\utf@dix #2}\else % \ifnum `#1="DA \def \next {\utf@da #2}\else % \ifnum `#1="DB \def \next {\utf@db #2}\else % \def \next {\utf@asci #1#2}% \fi\fi\fi\fi\fi\fi % %\fi\fi \fi\fi\fi \next }% % \gdef \utf@word #1{% transform input into internal notation \ifx #1\@ \def \next {\utf@end }\else % finished \ifx #1-\def \next {\utf@minus }\else % \ifx #1/\def \next {\sc@back #1}\else % \ifnum `#1="D6 \def \next {\utf@dvi }\else % \ifnum `#1="D7 \def \next {\utf@dvii }\else % \ifnum `#1="D8 \def \next {\utf@dviii }\else % \ifnum `#1="D9 \def \next {\utf@dix }\else % \ifnum `#1="DA \def \next {\utf@da }\else % \ifnum `#1="DB \def \next {\utf@db }\else % \def \next {\utf@asci #1}% \fi\fi\fi\fi\fi\fi % \fi\fi\fi \next }% } % catcode 13 \def \utf@end #1\@@ {\relax } \def \utf@next {% save and deposit character \sc@put \utf@word } \def \utf@asci #1{% deposit ASCII item \def \sc@char {#1}\utf@next } {\catcode `\% 12 \gdef \a@pc {%}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@dvi #1{% segment D6 \u@lb `#1\relax \advance \u@lb -128 \u@lq \u@lb \divide \u@lq 8 \edef \sc@char {}% \ifcase \u@lq \or \or \or \or \or \or \advance \u@lb -48 \edef \sc@char {\ifcase \u@lb "\n@xp\a@e\or "\n@xp\a@I\or "\n@xp\a@A\or "\n@xp\a@O\or "i\or "\n@xp\a@E\or "e\or "a\or \fi }% \or \advance \u@lb -56 \edef \sc@char {\ifcase \u@lb "A\or "\n@xp\a@o\or L\or "u\or "\n@xp\a@Zu\or |\or B\or "\n@xp\a@Zo\or \fi }% \fi \utf@next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@dvii #1{% segment D7 \u@lb `#1\relax \advance \u@lb -128 \u@lq \u@lb \divide \u@lq 8 \ifcase \u@lq \edef \sc@char {\ifcase \u@lb K\or "\n@xp\a@Ze\or "\n@xp\a@Za\or :\or "\n@xp\a@Zi\or \or \or \or \fi }% \or \advance \u@lb -8 \edef \sc@char {}% \or \advance \u@lb -16 \edef \sc@char {\ifcase \u@lb Q\or b\or g\or d\or h\or w\or z\or X\or \fi }% \or \advance \u@lb -24 \edef \sc@char {\ifcase \u@lb C\or y\or k\or k\or l\or m\or m\or n\or \fi }% \or \advance \u@lb -32 \edef \sc@char {\ifcase \u@lb n\or s\or P\or p\or p\or S\or S\or q\or \fi }% \or \advance \u@lb -40 \edef \sc@char {\ifcase \u@lb r\or \n@xp\a@S \or t\or \or \or \or \or \or \fi }% \or \advance \u@lb -48 \edef \sc@char {\ifcase \u@lb w\n@xp\a@U w\or wy\or y\n@xp\a@U y\or '\or ''\or \or \or \or \fi }% \or \advance \u@lb -56 \edef \sc@char {\ifcase \u@lb \or \or \or \or \or \or \or "|\or \fi }% \fi \utf@next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@dviii #1{% segment D8 \u@lb `#1\relax \advance \u@lb -"80 \u@lq \u@lb \divide \u@lq 8 \ifcase \u@lq \edef \sc@char {}% \or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb \or \or \or \or ,\or \or \or \or \fi }% \or \advance \u@lb -"10 \edef \sc@char {}% \or \advance \u@lb -"18 \edef \sc@char {\ifcase \u@lb \or \or \or ;\or \or \or \or ?\or \fi }% \or \advance \u@lb -"20 \edef \sc@char {\ifcase \u@lb \or Q|\or QA\or Qa\or Qw\or Qi\or Qy\or A\or \fi }% \or \advance \u@lb -"28 \edef \sc@char {\ifcase \u@lb b\or T\or t\or C\or G\or H\or X\or d\or \fi }% \or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb F\or r\or z\or s\or x\or S\or D\or V\or \fi }% \or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb Z\or P\or R\or \or \or \or \or \or \fi }% \fi \utf@next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@dix #1{% segment D9 \u@lb `#1\relax \advance \u@lb -"80 \u@lq \u@lb \divide \u@lq 8 \ifcase \u@lq \edef \sc@char {\ifcase \u@lb B\or f\or q\or k\or l\or m\or n\or h\or \fi }% \or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb w\or Y\or y\or "aN\or "uN\or "iN\or "a\or "u\or \fi }% \or \advance \u@lb -"10 \edef \sc@char {\ifcase \u@lb "i\or "\n@xp\a@Ze\or ""\or "\n@xp\a@ZE\or "\n@xp\a@Za\or "\n@xp\a@Zu\or \or \or \fi }% \or \advance \u@lb -"18 \edef \sc@char {}% \or \advance \u@lb -"20 \edef \sc@char {\ifcase \u@lb 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or \fi }% \or \advance \u@lb -"28 \edef \sc@char {\ifcase \u@lb 8\or 9\or \a@pc\or \f@sila\or \f@sila\or *\or \or \or \fi }% \or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb "\n@xp\a@a\or "\or "\n@xp\a@ZA\or "\n@xp\a@ZU\or % N"\n@xp\a@Za\or Qa\or Qw\or Qw"u\or \fi }% N"\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 }% \or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb % Qy\or \n@xp\a@t\or \n@xp\a@T\or \n@xp\a@ab\or N"\n@xp\a@Za Y\or \n@xp\a@t\or \n@xp\a@T\or \n@xp\a@ab\or \n@xp\a@v\or \n@xp\a@at\or p\or \n@xp\a@ac\or \fi }% \fi \utf@next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@da #1{% segment DA \u@lb `#1\relax \advance \u@lb -"80 \u@lq \u@lb \divide \u@lq 8 \ifcase \u@lq \edef \sc@char {\ifcase \u@lb \n@xp\a@ap\or c\or \n@xp\a@G\or \n@xp\a@ag\or \n@xp\a@ah\or \n@xp\a@c\or J\or \n@xp\a@aj\or \fi }% \or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb \n@xp\a@d\or \n@xp\a@aA\or \n@xp\a@D\or \n@xp\a@aB\or \n@xp\a@ad\or \n@xp\a@af\or \n@xp\a@aC\or \n@xp\a@ae\or \fi }% \or \advance \u@lb -"10 \edef \sc@char {\ifcase \u@lb \n@xp\a@aD\or \n@xp\a@r\or \n@xp\a@aF\or \n@xp\a@q\or \n@xp\a@aG\or \n@xp\a@R\or \n@xp\a@z\or \n@xp\a@aH\or \fi }% \or \advance \u@lb -"18 \edef \sc@char {\ifcase \u@lb j\or \n@xp\a@ar\or \n@xp\a@s\or \n@xp\a@aJ\or \n@xp\a@aK\or \n@xp\a@aL\or \n@xp\a@aM\or \n@xp\a@aO\or \fi }% \or \advance \u@lb -"20 \edef \sc@char {\ifcase \u@lb \n@xp\a@p\or \n@xp\a@f\or \n@xp\a@F\or \n@xp\a@aP\or v\or \n@xp\a@V\or \n@xp\a@aq\or \n@xp\a@aQ\or \fi }% \or \advance \u@lb -"28 \edef \sc@char {\ifcase \u@lb \n@xp\a@aR\or \n@xp\a@k\or \n@xp\a@ax\or \n@xp\a@g\or \n@xp\a@L\or K\or \n@xp\a@aS\or g\or \fi }% \or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb \n@xp\a@J\or \n@xp\a@al\or \n@xp\a@aT\or \n@xp\a@ak\or \n@xp\a@M\or \n@xp\a@l\or \n@xp\a@aW\or \n@xp\a@aX\or \fi }% \or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb \n@xp\a@aY\or \n@xp\a@aZ\or \n@xp\a@n\or \n@xp\a@an\or \n@xp\a@m\or \n@xp\a@am\or h-\or \n@xp\a@aE\or \fi }% \fi \utf@next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@db #1{% segment DB \u@lb `#1\relax \advance \u@lb -"80 \u@lq \u@lb \divide \u@lq 8 \ifcase \u@lq \edef \sc@char {\ifcase \u@lb Qh\or \n@xp\a@h\or \n@xp\a@B\or \n@xp\a@j\or \n@xp\a@aU\or \n@xp\a@aV\or \n@xp\a@W\or \n@xp\a@w\or \fi }% \or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb \n@xp\a@aw\or \n@xp\a@au\or \n@xp\a@av\or \n@xp\a@X\or Y\or L\or \n@xp\a@az\or \n@xp\a@x\or \fi }% \or \advance \u@lb -"10 \edef \sc@char {\ifcase \u@lb \n@xp\a@Y\or \n@xp\a@y\or E\or \n@xp\a@ay\or B\or \n@xp\a@H\or \or \or \fi }% \or \advance \u@lb -"18 \edef \sc@char {}% \or \advance \u@lb -"20 \edef \sc@char {}% \or \advance \u@lb -"28 \edef \sc@char {}% \or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or \fi }% \or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb 8\or 9\or \n@xp\a@aI\or \n@xp\a@aN\or \n@xp\a@P\or \n@xp\a@ai"\n@xp\a@Zi\or \n@xp\a@ao"\n@xp\a@Zi\or \or \fi }% \fi \utf@next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \utf@alif {% alif at the beginning of a word \def \sc@char {a}\sc@put \utf@word } \def \utf@minus {% hyphen between words \def \sc@char {-}\sc@put \utf@beg } %\def \sc@char {B}\sc@put \utf@beg } \def \utf@lquote {% left quote \ifa@quote \def \sc@char {'}\global\a@quotefalse \else \def \sc@char {`}\global\a@quotetrue \fi \sc@put \utf@beg } \def \utf@rquote {% right quote \global\a@quotefalse \def \sc@char {'}\sc@put \utf@word } \def \utf@par #1\@ \@@ {% new line, push back the rest \sc@back \\#1\@ \@@ } \def \utf@b@cs #1#2{% test word end \def \sc@char {#1}\sc@put %\ifx #2\@ \def \next {\sc@endscan #2}\else \ifx #2\@ \def \next {\utf@end #2}\else \ifcat -\nxp #2 \def \next {\utf@word #2}\else \def \next {\sc@back #2}\fi \fi \next } \def \utf@cs #1#2{% control sequence within a word; push back? \xpa \ifx #1\closegeresh \def \next {\utf@b@cs {\nxp \lq }#2}\else \xpa \ifx #1\closequote \def \next {\utf@b@cs {`}#2}\else \def \next {\sc@back #1#2}% \fi\fi \next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \catcode `\@ = \utfatcode \endinput %%%%%%%%%%%%%%%%%%%%%%%% EOF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%