% Copyright 2016 Slavonic Computing Initialive
%
http://sci.ponomar.net
%
\ProvidesPackage{cu-num}[2016/03/03 v1.1 CU Numerics]
\@ifundefined{detokenize}{%
\PackageError{cu-num}%
{You must upgrade your TeX distribution to be able to use this package}%
{This package depends on eTeX-based engine}%
}{}
%
% Tools
%
\def\cu@ifempty#1{%
\if\relax\detokenize{#1}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}%
%
\def\cu@firstoffour\cu@repeat #1\stop@ #2#3#4#5{#2}%
\def\cu@firstofthree\cu@repeat@i #1\stop@ #2#3#4{#2}%
\def\cu@switch #1{%
\if\relax\detokenize{#1}\relax
\expandafter\cu@firstoffour
\fi
\cu@repeat #1\stop@
}%
\def\cu@repeat #1#2\stop@ #3{%
\if\relax\detokenize{#2}\relax
\expandafter\cu@firstofthree
\fi
\cu@repeat@i #2\stop@
}%
\def\cu@repeat@i #1#2\stop@ #3{%
\if\relax\detokenize{#2}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}%
%
% Slavonic numbering system. Internals.
%
\def\cu@format@small@number#1#2#3{%
\ifcase#1 \or
\expandafter р\or
\expandafter с\or
\expandafter т\or
\expandafter у\or
\expandafter ф\or
\expandafter х\or
\expandafter ѱ\or
\expandafter ѿ\or
\expandafter ц\else
\errmessage{cu-num: Internal error}%
\fi
\if 1#2%
\ifcase#3 \or
\expandafter а\or
\expandafter в\or
\expandafter г\or
\expandafter д\or
\expandafter є\or
\expandafter ѕ\or
\expandafter з\or
\expandafter и\or
\expandafter ѳ\else
\errmessage{cu-num: Internal error}%
\fi
і%
\else
\ifcase#2 \or
\expandafter і\or
\expandafter к\or
\expandafter л\or
\expandafter м\or
\expandafter н\or
\expandafter ѯ\or
\expandafter ѻ\or
\expandafter п\or
\expandafter ч\else
\errmessage{cu-num: Internal error}%
\fi
\ifcase#3 \or
\expandafter а\or
\expandafter в\or
\expandafter г\or
\expandafter д\or
\expandafter є\or
\expandafter ѕ\or
\expandafter з\or
\expandafter и\or
\expandafter ѳ\else
\errmessage{cu-num: Internal error}%
\fi
\fi
}%
%
%
\protected\def\cu@titlo{\char"0483}%
\def\cu@thousand{҂}%
\protected\def\cu@spacer{\,}%
%
\protected\def\stop@{}%
\protected\def\divider@{DIVIDER}%
%
\def\cu@format#1{%
\ifnum#1<0%
\errmessage{cu-num: negative numbers not supported}%
\else\ifnum#1=0%
0\cu@titlo
\else\ifnum#1<10%
{}%
{}%
\cu@format@xxx 00#1\stop@
\else\ifnum#1<100%
{}%
{}%
\cu@format@xxx 0#1\stop@
\else\ifnum#1<1000%
{}%
{}%
\cu@format@xxx #1\stop@
\else\ifnum#1<10000%
{}%
\cu@format@xxxxxx 00#1\stop@
\else\ifnum#1<100000%
{}%
\cu@format@xxxxxx 0#1\stop@
\else\ifnum#1<1000000%
{}%
\cu@format@xxxxxx #1\stop@
\else\ifnum#1<10000000%
\cu@format@xxxxxxxxx 00#1\stop@
\else\ifnum#1<100000000%
\cu@format@xxxxxxxxx 0#1\stop@
\else\ifnum#1<1000000000%
\cu@format@xxxxxxxxx #1\stop@
\else
\errmessage{cu-num: number too big "#1"}%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}%
%
\def\cu@format@xxx#1#2#3\stop@{%
{%
\cu@format@small@number#1#2#3%
}%
}%
%
\def\cu@format@xxxxxx#1#2#3#4#5#6\stop@{%
{\cu@format@small@number#1#2#3}%
{\cu@format@small@number#4#5#6}%
}%
%
\def\cu@format@xxxxxxxxx#1#2#3#4#5#6#7#8#9\stop@{%
{\cu@format@small@number#1#2#3}%
\cu@format@xxxxxx#4#5#6#7#8#9\stop@
}%
%
\def\cu@place@titlo #1{%
\cu@switch{#1}{%
{}%
}{%
{\cu@place@titlo@i #1\stop@}%
}{%
{\cu@place@titlo@ii #1\stop@}%
}{%
{\cu@place@titlo@iii #1\stop@}%
}%
}%
\def\cu@place@titlo@iii #1#2#3#4\stop@{%
\cu@ifempty{#4}{%
#1\cu@place@titlo@ii #2#3\stop@
}{%
#1\cu@place@titlo@iii #2#3#4\stop@
}%
}%
\def\cu@place@titlo@ii #1#2\stop@{%
\if #1ѿ%
#1#2\cu@titlo\else #1\cu@titlo #2\fi
}%
\def\cu@place@titlo@i #1\stop@{%
\if #10%
0\else #1\cu@titlo \fi
}%
%
\def\cu@merge@historic #1#2#3{%
\cu@switch{#2}{%
{#1}{#2}{#3}%
}{%
{#1}{#2#3}{0}%
}{%
{#1}{#2}{#3}%
}{%
{#1}{#2}{#3}%
}%
}%
%
\def\cu@place@thousands#1#2#3{%
\cu@ifempty{#1}{%
{}%
}{%
{\cu@thousand\cu@thousand #1}%
}%
\cu@ifempty{#2}{%
{}%
}{%
\if#30%
{\cu@thousand #2}%
\else
\cu@ifempty{#3}{%
{\cu@interleave #2\stop@}%
}{%
{\cu@thousand #2}%
}%
\fi
}%
\if#30%
{}%
\else
{#3}%
\fi
}%
%
\def\cu@interleave#1#2\stop@{%
\ifx#1\cu@titlo
\cu@ifempty{#2}{#1}{%
#1\cu@interleave #2\stop@
}%
\else
\cu@ifempty{#2}{%
\cu@thousand #1%
}{%
\cu@thousand #1\cu@interleave #2\stop@
}%
\fi
}%
%
\def\cu@place@all@titlo#1#2#3{%
\cu@place@titlo{#1}%
\cu@place@titlo{#2}%
\cu@place@titlo{#3}%
}%
\def\cu@place#1{%
\if\relax\detokenize{#1}\relax
{}%
\else
\cu@place@i #1\stop@
\fi
}%
\def\cu@place@i#1#2\stop@{%
\if\relax\detokenize{#2}\relax
{#1\cu@titlo}%
\else
\cu@place@ii #1#2\stop@
\fi
}%
\def\cu@place@ii #1#2#3\stop@{%
\if\relax\detokenize{#3}\relax
\if#1ѿ{#1#2\cu@titlo}\else
{#1\cu@titlo #2}\fi
\else
\if#2ѿ{#1#2#3\cu@titlo}\else
{#1#2\cu@titlo #3}\fi
\fi
}%
%
\def\cu@compose#1#2#3{%
\cu@ifempty{#1}{%
\cu@compose@ii{#2}{#3}%
}{%
\cu@ifempty{#2}{%
\cu@compose@ii{#1}{#3}%
}{%
\cu@ifempty{#3}{%
\cu@compose@ii{#1}{#2}%
}{%
#1\cu@spacer #2\cu@spacer #3%
}%
}%
}%
}%
%
\def\cu@compose@ii#1#2{%
\cu@ifempty{#1}{%
\cu@ifempty{#2}{}{#2}%
}{%
\cu@ifempty{#2}{#1}{#1\cu@spacer #2}%
}%
}%
%
\def\cu@fmt@#1{%
%\tracingmacros=1%
%\tracingonline=1%
\edef\@x{\number #1}%
\ifnum\@x=0\relax
\edef\@x{0\cu@titlo}%
\else\ifnum\@x<0%
\edef\@x{\number-\@x}%
\edef\@x{\noexpand\cu@format{\@x}}%
\edef\@x{\@x}%
\edef\@x{\noexpand\cu@merge@historic\@x}%
\edef\@x{\@x}%
\edef\@x{\noexpand\cu@place@all@titlo\@x}%
\edef\@x{\@x}%
\edef\@x{\noexpand\cu@place@thousands\@x}%
\edef\@x{\@x}%
\edef\@x{\noexpand\cu@compose\@x}%
\edef\@x{\@x}%
\edef\@x{-\@x}%
\else
\edef\@x{\noexpand\cu@format{\@x}}%
\edef\@x{\@x}%
%\show\@x
\edef\@x{\noexpand\cu@merge@historic\@x}%
\edef\@x{\@x}%
%\show\@x
\edef\@x{\noexpand\cu@place@all@titlo\@x}%
\edef\@x{\@x}%
%\show\@x
\edef\@x{\noexpand\cu@place@thousands\@x}%
\edef\@x{\@x}%
%\show\@x
\edef\@x{\noexpand\cu@compose\@x}%
\edef\@x{\@x}%
%\show\@x
\fi\fi
%\tracingmacros=0%
}%
%
% User API
%
\protected\def\cuNum#1{%
\bgroup
\cu@fmt@{#1}%
\@x
\egroup
}%