\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{fp-snap}[1995/04/05]

%version information
\def\FP@snapversion{1.0a}
\message{%
  `Fixed Point Snap Off',%
  \space\space\space\space\space\space\space\space\space\space%
  Version \FP@snapversion%
  \space(C) Michael Mehlich%
  \space\space\space\space\space\space\space%
  \space\space\space\space\space\space%
}

%resolve dependencies
\RequirePackage{fp-basic}

%%%public area (macros which may be used)%%%

\def\FPround#1#2#3{\FP@calld\FP@round#1{#2}{#3}}
\def\FPtrunc#1#2#3{\FP@calld\FP@trunc#1{#2}{#3}}
\def\FPclip#1#2{\FP@calld\FP@clip#1{#2}}

%%%private fp-area (don't use these macros)%%%

%round value
\def\FP@round#1#2.#3.#4\relax#5{%
  % #1 macro, which gets the result
  % #2 integer part of value
  % #3 fractional part of value
  % #4 dummy to swallow everything after the second '.'
  % #5 round position
  {\FP@beginmessage{ROUND}%
   %
   \FP@count=#5\relax%
   %
   \ifnum\FP@count<0\relax%
     \FP@errmessage{Rounding value before point not allowed}%
   \else
     \FP@readvalue{x}{#2}{#3}%
     \ifnum\FP@count=0\relax%
        \ifnum\FP@xfa<500000000\relax%
	  \edef\FP@tmp{#2}%
	\else%
	  \advance\FP@xib1\relax%
	  \ifnum\FP@xib<1000000000\relax\else%
	    \advance\FP@xia1\relax%
	    \advance\FP@xib-1000000000\relax%
	  \fi%
	  \ifnum\FP@xs<0\relax%
	    \edef\FP@tmp{-}%
	  \else%
	    \edef\FP@tmp{}%
	  \fi%
	  \ifnum\FP@xia=0\relax%
	    \edef\FP@tmp{\FP@tmp\the\FP@xib}%
	  \else%
	    \advance\FP@xib1000000000\relax%
	    \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib}%
	  \fi%
	\fi%
     \else%
       \ifnum\FP@count>18\relax%
         \FP@count=18\relax%
       \fi%
       \advance\FP@xfa1000000000\relax%
       \advance\FP@xfb1000000000\relax%
       \edef\FP@tmp{\expandafter\FP@ignorenext\the\FP@xfa\expandafter\FP@ignorenext\the\FP@xfb}%
       \edef\FP@rd{}%
       \FP@shift=\FP@count%
       \FP@times=1\relax%
       \loop%
          \ifnum\FP@count>0\relax%
             \edef\FP@rd{\FP@rd\expandafter\FP@first\FP@tmp\noexpand\relax}%
             \edef\FP@tmp{\expandafter\FP@ignorenext\FP@tmp}%
	     \advance\FP@count-1\relax%
	     \multiply\FP@times10\relax\ifnum\FP@times=1000000000\relax\FP@times=1\relax\fi%
          \repeat%
       \edef\FP@tmp{\expandafter\FP@first\FP@tmp\noexpand\relax}%
       \expandafter\FP@rega\FP@tmp\relax%
       \ifnum\FP@rega>4\relax%
	 \ifnum\FP@shift>8\relax%
	   \FP@ninesplit\FP@rd%
	   \expandafter\FP@rega\expandafter0\FP@rd\relax%
	   \advance\FP@rega1\relax%
	   \ifnum\FP@rega<\FP@times%
	     \advance\FP@rega\FP@times%
	     \advance\FP@res1000000000\relax%
	   \else%
	     \advance\FP@res1\relax%
	     \ifnum\FP@res<1000000000\relax%
	       \advance\FP@res1000000000\relax%
	     \else%
	       \advance\FP@xib1\relax%
	       \ifnum\FP@xib<1000000000\relax\else%
	         \advance\FP@xia1\relax%
	         \advance\FP@xib-1000000000\relax%
	       \fi%
	     \fi%
	   \fi%
	   \edef\FP@tmpa{\expandafter\FP@ignorenext\the\FP@res\expandafter\FP@ignorenext\the\FP@rega}%
	 \else%
	   \expandafter\FP@rega\FP@rd\relax%
	   \advance\FP@rega1\relax%
	   \ifnum\FP@rega<\FP@times%
	     \advance\FP@rega\FP@times%
	   \else%
	     \advance\FP@xib1\relax%
	     \ifnum\FP@xib<1000000000\relax\else%
	       \advance\FP@xia1\relax%
	       \advance\FP@xib-1000000000\relax%
	     \fi%
	   \fi%
           \edef\FP@tmpa{\expandafter\FP@ignorenext\the\FP@rega}%
	 \fi%
       \else%
         \edef\FP@tmpa{\FP@rd}%
       \fi%
       \ifnum\FP@xs<0\relax%
         \edef\FP@tmp{-}%
       \else%
         \edef\FP@tmp{}%
       \fi%
       \ifnum\FP@xia=0\relax%
         \edef\FP@tmp{\FP@tmp\the\FP@xib.\FP@tmpa}%
       \else%
         \advance\FP@xib1000000000\relax%
         \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib.\FP@tmpa}%
       \fi%
     \fi%
   \fi%
   %
   \global\let\FP@tmp\FP@tmp%
   %
   \FP@endmessage{}%
  }%
  \let#1\FP@tmp%
}

%trunc value

\def\FP@trunc#1#2.#3.#4\relax#5{%
  % #1 macro, which gets the result
  % #2 integer part of value
  % #3 fractional part of value
  % #4 dummy to swallow everything after the second '.'
  % #5 trunc position
  {\FP@beginmessage{TRUNC}%
   %
   \FP@count=#5\relax%
   %
   \ifnum\FP@count<0\relax%
     \FP@errmessage{Truncating value before point not allowed}%
   \else\ifnum\FP@count=0\relax%
     \edef\FP@tmp{#2}%
   \else
     \ifnum\FP@count>18\relax%
       \FP@count=18\relax%
     \fi%
     \FP@readvalue{x}{#2}{#3}%
     \advance\FP@xfa1000000000\relax%
     \advance\FP@xfb1000000000\relax%
     \edef\FP@tmp{\expandafter\FP@ignorenext\the\FP@xfa\expandafter\FP@ignorenext\the\FP@xfb}%
     \edef\FP@tmpa{}%
     \loop%
       \ifnum\FP@count>0\relax%
          \edef\FP@tmpa{\FP@tmpa\expandafter\FP@first\FP@tmp\noexpand\relax}%
          \edef\FP@tmp{\expandafter\FP@ignorenext\FP@tmp}%
	  \advance\FP@count-1\relax%
       \repeat%
     \ifnum\FP@xs<0\relax%
       \edef\FP@tmp{-}%
     \else%
       \edef\FP@tmp{}%
     \fi%
     \ifnum\FP@xia=0\relax%
       \edef\FP@tmp{\FP@tmp\the\FP@xib.\FP@tmpa}%
     \else%
       \advance\FP@xib1000000000\relax%
       \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib.\FP@tmpa}%
     \fi%
   \fi\fi%
   %
   \global\let\FP@tmp\FP@tmp%
   %
   \FP@endmessage{}%
  }%
  \let#1\FP@tmp%
}

%clip value

\def\FP@revert#1#2{%
  % #1 macro, which gets the result
  % #2 value
  {\edef\FP@tmpa{#2}%
   \edef\FP@tmp{}%
   \loop%
     \expandafter\if!\FP@tmpa!\relax\else%
       \edef\FP@tmpb{\expandafter\FP@first\FP@tmpa\noexpand\relax}%
       \edef\FP@tmpa{\expandafter\FP@ignorenext\FP@tmpa}%
       \edef\FP@tmp{\FP@tmpb\FP@tmp}%
     \repeat%
   \global\let\FP@tmp\FP@tmp%
  }%
  \let#1\FP@tmp%
}

\def\FP@clip#1#2.#3.#4\relax{%
  % #1 macro, which gets the result
  % #2 integer part of value
  % #3 fractional part of value
  % #4 dummy to swallow everthing after the 2nd '.'
  %
  {\FP@beginmessage{CLIP}%
   %
   \FP@revert\FP@tmpb{#3}%
   \FP@removeleadingzeros\FP@tmpb\relax%
   \FP@revert\FP@tmpb\FP@tmp%
   \edef\FP@tmpa{#2}%
   \FP@removeleadingzeros\FP@tmpa\relax%
   \edef\FP@tmpa{\FP@tmp}%
   \expandafter\if!\FP@tmpa!\relax%
     \expandafter\if!\FP@tmpb!\relax%
       \edef\FP@tmp{0}%
     \else
       \edef\FP@tmp{0.\FP@tmpb}%
     \fi%
   \else%
     \expandafter\if!\FP@tmpb!\relax%
       \edef\FP@tmp{\FP@tmpa}%
     \else%
       \edef\FP@tmp{\FP@tmpa.\FP@tmpb}%
     \fi%
   \fi%
   %
   \global\let\FP@tmp\FP@tmp%
   %
   \FP@endmessage{}%
  }%
  \let#1\FP@tmp%
}
