%externallongrealfn ReadR %alias "3L_IMP___read_r"
   %externalintegerfnspec ReadI %alias "3L_IMP___read_i"
   %constinteger Max Power = 12,      {enough 24 bit chunks for max precision}
                 Min Power = -6+1     {includes zero}
   %integerarray A(Min Power : Max Power)

   %longreal Value, Sign = 1
   %integer Min, Max, Power, Base, Point, Exp, Ok, Sym, Digit, J

   %routine Mul(%integer Carry)   {A = A*Base + Carry}
      %integer J, N
      %for J = 1, 1, Max %cycle
         N = A(J)*Base + Carry
         Carry = N>>24
         A(J) = N&16_00FF FFFF
      %repeat
      %if Carry # 0 %start
         Max = Max+1;  A(Max) = Carry
      %finish
   %end

   %longrealfn Evaluate       {result = internal rep. of A}
      %longreal Answer, Next
      %integer Carry, J, N
      %while Power < 0 %cycle
         Power = Power+1
         Carry = 0
         %for J = Max, -1, Min %cycle
            N = A(J)+Carry
            A(J) = N//Base
            Carry = Rem(N, Base)<<24
         %repeat
         %while Min # Min Power %and Carry # 0 %cycle
            Min = Min-1
            A(Min) = Carry//Base
            Carry = Rem(Carry, Base)<<24
         %repeat
      %repeat
      Power = Power-1 %and Mul(0) %while Power > 0
      Answer = 0
      Next = 2^(24*(Max-1))
      %for J = Max, -1, Min %cycle
         Answer = Answer + A(J)*Next
         Next = Next/(1<<24)
      %repeat
      %result = Answer
   %end


   Max = 0;  Min = 1;  Point = 0;  Power = 0;  Base = 10

   %cycle
      Sym = Nextsymbol;  %exit %if Sym > ' '
      Skipsymbol
   %repeat

   %if Sym = '-' %or Sym = '+' %start
      Sign = -1 %if Sym = '-'
      Skipsymbol
   %finish

   %cycle
      Sym = Nextsymbol
      %if Sym = '.' %start
         %exit %if Point # 0
         Point = -1
      %else %if Sym = '@'
         %if Ok # 0 %start
            Skipsymbol
            Power = Power+ReadI
         %finish
         %exit
      %else %if Sym = '_'
         %exit %if Point # 0
         Base = Int(Evaluate)
         Max = 0;  Min = 1;  Point = 0;  Power = 0
      %else
         %if '0' <= Sym <= '9' %start
            Digit = (Sym-'0')
         %else %if 'A' <= Sym&95 <= 'Z'
            Digit = (Sym&95-'A'+10)
         %finish %else Digit = Base
         %exit %if Digit >= Base
         Power = Power+Point
         Mul(Digit)
         Ok = 1
      %finish
      Skipsymbol
   %repeat
   %signal 4,1,Sym %if Ok = 0
   %result = Evaluate*Sign
%end
%endoffile
