%externalintegerfn Readi %alias "3L_IMP___read_i"
   %constinteger Minfinity = \((-1)>>1)
   %integer MaxN, MaxD
   %integer Value, Sym, Sign = 1, Base = 10, Ok = 0, Digit
   %cycle
      Sym = Nextsymbol
      %exit %unless Sym <= ' '
      Skipsymbol
   %repeat
   %if Sym = '+' %or Sym = '-' %start
      Sign = Sym-'-'                      {0 == minus}
      Skipsymbol
   %finish
   MaxN = Minfinity//10
   MaxD = MaxN*10 - Minfinity
   Value = 0
   %cycle
      Sym = Nextsymbol
      %if Sym = '_' %start
         %exit %if Ok = 0
         Base = -Value
         MaxN = Minfinity//Base
         MaxD = MaxN*Base - Minfinity
         Value = 0;  Ok = 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
         %if Value <= MaxN %start
            %signal 1,1 %if Value < MaxN %or Digit > MaxD
         %finish
         Value = Value*Base-Digit
         Ok = 1
      %finish
      Skipsymbol
   %repeat
   %signal 4,1,Sym %if Ok = 0
   %if Sign # 0 %start
      %signal 1,1 %if Value = Minfinity
      Value = -Value
   %finish
   %result = Value
%end
%endoffile
