Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/smlnj-lib/Util/int-inf.sml
ViewVC logotype

Diff of /sml/trunk/src/smlnj-lib/Util/int-inf.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 27, Thu Mar 12 01:05:57 1998 UTC revision 106, Thu May 28 21:30:17 1998 UTC
# Line 36  Line 36 
36    
37          val skipWS : (char, 'a) StringCvt.reader -> 'a -> 'a          val skipWS : (char, 'a) StringCvt.reader -> 'a -> 'a
38    
         val scanWord : StringCvt.radix  
               ->  (char, 'a) StringCvt.reader  
                 -> 'a -> (Word32.word * 'a) option  
39          val scanInt : StringCvt.radix          val scanInt : StringCvt.radix
40                ->  (char, 'a) StringCvt.reader                ->  (char, 'a) StringCvt.reader
41                  -> 'a -> (int * 'a) option                  -> 'a -> (int * 'a) option
# Line 63  Line 60 
60          type 'a chr_strm = {getc : (char, 'a) StringCvt.reader}          type 'a chr_strm = {getc : (char, 'a) StringCvt.reader}
61    
62        (* A table for mapping digits to values.  Whitespace characters map to        (* A table for mapping digits to values.  Whitespace characters map to
63         * 128, "+" maps to 129, "-","~" map to 130, "." maps to 131, and the         * 128, and the characters 0-9,A-Z,a-z map to their
64         * characters 0-9,A-Z,a-z map to their * base-36 value.  All other         * base-36 value.  All other characters map to 255.
        * characters map to 255.  
65         *)         *)
66          local          local
67            val cvtTable = "\            val cvtTable = "\
68              \\255\255\255\255\255\255\255\255\255\128\128\255\255\255\255\255\              \\255\255\255\255\255\255\255\255\255\128\128\255\255\255\255\255\
69              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
70              \\128\255\255\255\255\255\255\255\255\255\255\129\255\130\131\255\              \\128\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
71              \\000\001\002\003\004\005\006\007\008\009\255\255\255\255\255\255\              \\000\001\002\003\004\005\006\007\008\009\255\255\255\255\255\255\
72              \\255\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\              \\255\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\
73              \\025\026\027\028\029\030\031\032\033\034\035\255\255\255\255\255\              \\025\026\027\028\029\030\031\032\033\034\035\255\255\255\255\255\
74              \\255\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\              \\255\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\
75              \\025\026\027\028\029\030\031\032\033\034\035\255\255\255\130\255\              \\025\026\027\028\029\030\031\032\033\034\035\255\255\255\255\255\
76              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
77              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
78              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\              \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
# Line 90  Line 86 
86          in          in
87          fun code (c : char) = W.fromInt(ord(CharVector.sub(cvtTable, ord c)))          fun code (c : char) = W.fromInt(ord(CharVector.sub(cvtTable, ord c)))
88          val wsCode : Word32.word = 0w128          val wsCode : Word32.word = 0w128
         val plusCode : Word32.word = 0w129  
         val minusCode : Word32.word = 0w130  
89          end (* local *)          end (* local *)
90    
91          fun skipWS (getc : (char, 'a) StringCvt.reader) cs = let          fun skipWS (getc : (char, 'a) StringCvt.reader) cs = let
# Line 103  Line 97 
97                  skip cs                  skip cs
98                end                end
99    
       (* skip leading whitespace and any sign (+, -, or ~) *)  
         fun scanPrefix (getc : (char, 'a) StringCvt.reader) cs = let  
           fun skipWS cs = (case (getc cs)  
                  of NONE => NONE  
                   | (SOME(c, cs')) => let val c' = code c  
                       in  
                         if (c' = wsCode) then skipWS cs' else SOME(c', cs')  
                       end  
                 (* end case *))  
           fun getNext (neg, cs) = (case (getc cs)  
                  of NONE => NONE  
                   | (SOME(c, cs)) => SOME{neg=neg, next=code c, rest=cs}  
                 (* end case *))  
           in  
             case (skipWS cs)  
              of NONE => NONE  
               | (SOME(c, cs')) =>  
                   if (c = plusCode) then getNext(false, cs')  
                   else if (c = minusCode) then getNext(true, cs')  
                   else SOME{neg=false, next=c, rest=cs'}  
             (* end case *)  
           end  
   
100        (* for power of 2 bases (2, 8 & 16), we can check for overflow by looking        (* for power of 2 bases (2, 8 & 16), we can check for overflow by looking
101         * at the hi (1, 3 or 4) bits.         * at the hi (1, 3 or 4) bits.
102         *)         *)
103          fun chkOverflow mask w =          fun chkOverflow mask w =
104            if (W.andb(mask, w) = 0w0) then () else raise Overflow            if (W.andb(mask, w) = 0w0) then () else raise Overflow
105    
106          fun scanBin (getc : (char, 'a) StringCvt.reader) cs = (case (scanPrefix getc cs)          fun scan getc cs = case getc (skipWS getc cs)
107             of NONE => NONE             of NONE => NONE
108              | (SOME{neg, next, rest}) => let              | SOME(c,rest) => SOME(code c, rest)
109    
110            fun scanBin getc cs = (case (scan getc cs)
111               of NONE => NONE
112                | (SOME(next, rest)) => let
113                  fun isDigit (d : Word32.word) = (d < 0w2)                  fun isDigit (d : Word32.word) = (d < 0w2)
114                  val chkOverflow = chkOverflow 0wx80000000                  val chkOverflow = chkOverflow 0wx80000000
115                  fun cvt (w, rest) = (case (getc rest)                  fun cvt (w, rest) = (case (getc rest)
116                         of NONE => SOME{neg=neg, word=w, rest=rest}                         of NONE => SOME (w, rest)
117                          | SOME(c, rest') => let val d = code c                          | SOME(c, rest') => let val d = code c
118                              in                              in
119                                if (isDigit d)                                if (isDigit d)
120                                  then (                                  then (
121                                    chkOverflow w;                                    chkOverflow w;
122                                    cvt(W.+(W.<<(w, 0w1), d), rest'))                                    cvt(W.+(W.<<(w, 0w1), d), rest'))
123                                  else SOME{neg=neg, word=w, rest=rest}                                  else SOME(w, rest)
124                              end                              end
125                        (* end case *))                        (* end case *))
126                  in                  in
# Line 155  Line 130 
130                  end                  end
131            (* end case *))            (* end case *))
132    
133          fun scanOct getc cs = (case (scanPrefix getc cs)          fun scanOct getc cs = (case (scan getc cs)
134             of NONE => NONE             of NONE => NONE
135              | (SOME{neg, next, rest}) => let              | (SOME(next, rest)) => let
136                  fun isDigit (d : Word32.word) = (d < 0w8)                  fun isDigit (d : Word32.word) = (d < 0w8)
137                  val chkOverflow = chkOverflow 0wxE0000000                  val chkOverflow = chkOverflow 0wxE0000000
138                  fun cvt (w, rest) = (case (getc rest)                  fun cvt (w, rest) = (case (getc rest)
139                         of NONE => SOME{neg=neg, word=w, rest=rest}                         of NONE => SOME(w, rest)
140                          | SOME(c, rest') => let val d = code c                          | SOME(c, rest') => let val d = code c
141                              in                              in
142                                if (isDigit d)                                if (isDigit d)
143                                  then (                                  then (
144                                    chkOverflow w;                                    chkOverflow w;
145                                    cvt(W.+(W.<<(w, 0w3), d), rest'))                                    cvt(W.+(W.<<(w, 0w3), d), rest'))
146                                  else SOME{neg=neg, word=w, rest=rest}                                  else SOME(w, rest)
147                              end                              end
148                        (* end case *))                        (* end case *))
149                  in                  in
# Line 178  Line 153 
153                  end                  end
154            (* end case *))            (* end case *))
155    
156          fun scanDec getc cs = (case (scanPrefix getc cs)          fun scanDec getc cs = (case (scan getc cs)
157             of NONE => NONE             of NONE => NONE
158              | (SOME{neg, next, rest}) => let              | (SOME(next, rest)) => let
159                  fun isDigit (d : Word32.word) = (d < 0w10)                  fun isDigit (d : Word32.word) = (d < 0w10)
160                  fun cvt (w, rest) = (case (getc rest)                  fun cvt (w, rest) = (case (getc rest)
161                         of NONE => SOME{neg=neg, word=w, rest=rest}                         of NONE => SOME(w, rest)
162                          | SOME(c, rest') => let val d = code c                          | SOME(c, rest') => let val d = code c
163                              in                              in
164                                if (isDigit d)                                if (isDigit d)
# Line 194  Line 169 
169                                      then raise Overflow                                      then raise Overflow
170                                      else ();                                      else ();
171                                    cvt (0w10*w+d, rest'))                                    cvt (0w10*w+d, rest'))
172                                  else SOME{neg=neg, word=w, rest=rest}                                  else SOME(w, rest)
173                              end                              end
174                        (* end case *))                        (* end case *))
175                  in                  in
# Line 204  Line 179 
179                  end                  end
180            (* end case *))            (* end case *))
181    
182          fun scanHex getc cs = (case (scanPrefix getc cs)          fun scanHex getc cs = (case (scan getc cs)
183             of NONE => NONE             of NONE => NONE
184              | (SOME{neg, next, rest}) => let              | (SOME(next, rest)) => let
185                  fun isDigit (d : Word32.word) = (d < 0w16)                  fun isDigit (d : Word32.word) = (d < 0w16)
186                  val chkOverflow = chkOverflow 0wxF0000000                  val chkOverflow = chkOverflow 0wxF0000000
187                  fun cvt (w, rest) = (case (getc rest)                  fun cvt (w, rest) = (case (getc rest)
188                         of NONE => SOME{neg=neg, word=w, rest=rest}                         of NONE => SOME(w, rest)
189                          | SOME(c, rest') => let val d = code c                          | SOME(c, rest') => let val d = code c
190                              in                              in
191                                if (isDigit d)                                if (isDigit d)
192                                  then (                                  then (
193                                    chkOverflow w;                                    chkOverflow w;
194                                    cvt(W.+(W.<<(w, 0w4), d), rest'))                                    cvt(W.+(W.<<(w, 0w4), d), rest'))
195                                  else SOME{neg=neg, word=w, rest=rest}                                  else SOME(w, rest)
196                              end                              end
197                        (* end case *))                        (* end case *))
198                  in                  in
# Line 227  Line 202 
202                  end                  end
203            (* end case *))            (* end case *))
204    
         fun finalWord scanFn getc cs = (case (scanFn getc cs)  
            of NONE => NONE  
             | (SOME{neg=true, ...}) => NONE  
             | (SOME{neg=false, word, rest}) => SOME(word, rest)  
           (* end case *))  
   
         fun scanWord StringCvt.BIN = finalWord scanBin  
           | scanWord StringCvt.OCT = finalWord scanOct  
           | scanWord StringCvt.DEC = finalWord scanDec  
           | scanWord StringCvt.HEX = finalWord scanHex  
   
205          fun finalInt scanFn getc cs = (case (scanFn getc cs)          fun finalInt scanFn getc cs = (case (scanFn getc cs)
206             of NONE => NONE             of NONE => NONE
207              | (SOME{neg=true, word, rest}) =>              | (SOME(word, rest)) =>
                 if (largestNegInt < word)  
                   then raise Overflow  
                   else SOME(I.~(W.toInt word), rest)  
             | (SOME{word, rest, ...}) =>  
208                  if (largestPosInt < word)                  if (largestPosInt < word)
209                    then raise Overflow                    then raise Overflow
210                    else SOME(W.toInt word, rest)                    else SOME(W.toInt word, rest)
# Line 855  Line 815 
815        | log2 _ = raise Domain        | log2 _ = raise Domain
816    
817    end (* structure IntInf *)    end (* structure IntInf *)
   

Legend:
Removed from v.27  
changed lines
  Added in v.106

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0