% 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
}%