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

SCM Repository

[smlnj] Annotation of /sml/trunk/src/compiler/PervEnv/Basis/num-format.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/PervEnv/Basis/num-format.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 113 - (view) (download)
Original Path: sml/branches/FLINT/src/compiler/PervEnv/Basis/num-format.sml

1 : monnier 89 (* num-format.sml
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     * The word to string conversion for the largest word and int types.
6 :     * All of the other fmt functions can be implemented in terms of them.
7 :     *
8 :     *)
9 :    
10 :     structure NumFormat : sig
11 :    
12 :     val fmtWord : StringCvt.radix -> word32 -> string
13 :     val fmtInt : StringCvt.radix -> int32 -> string
14 :    
15 :     end = struct
16 :    
17 :     structure W = InlineT.Word32
18 :     structure I = InlineT.Int31
19 :     structure I32 = InlineT.Int32
20 :    
21 :     val op < = W.<
22 :     val op - = W.-
23 :     val op * = W.*
24 :     val op div = W.div
25 :    
26 :     fun mkDigit (w : word32) =
27 :     InlineT.CharVector.sub("0123456789abcdef", W.toInt w)
28 :    
29 :     fun wordToBin w = let
30 :     fun mkBit w = if (W.andb(w, 0w1) = 0w0) then #"0" else #"1"
31 :     fun f (0w0, n, l) = (I.+(n, 1), #"0" :: l)
32 :     | f (0w1, n, l) = (I.+(n, 1), #"1" :: l)
33 :     | f (w, n, l) = f(W.rshiftl(w, 0w1), I.+(n, 1), (mkBit w) :: l)
34 :     in
35 :     f (w, 0, [])
36 :     end
37 :     fun wordToOct w = let
38 :     fun f (w, n, l) = if (w < 0w8)
39 :     then (I.+(n, 1), (mkDigit w) :: l)
40 :     else f(W.rshiftl(w, 0w3), I.+(n, 1), mkDigit(W.andb(w, 0wx7)) :: l)
41 :     in
42 :     f (w, 0, [])
43 :     end
44 :     fun wordToDec w = let
45 :     fun f (w, n, l) = if (w < 0w10)
46 :     then (I.+(n, 1), (mkDigit w) :: l)
47 :     else let val j = w div 0w10
48 :     in
49 :     f (j, I.+(n, 1), mkDigit(w - 0w10*j) :: l)
50 :     end
51 :     in
52 :     f (w, 0, [])
53 :     end
54 :     fun wordToHex w = let
55 :     fun f (w, n, l) = if (w < 0w16)
56 :     then (I.+(n, 1), (mkDigit w) :: l)
57 :     else f(W.rshiftl(w, 0w4), I.+(n, 1), mkDigit(W.andb(w, 0wxf)) :: l)
58 :     in
59 :     f (w, 0, [])
60 :     end
61 :    
62 :     fun fmtW StringCvt.BIN = wordToBin
63 :     | fmtW StringCvt.OCT = wordToOct
64 :     | fmtW StringCvt.DEC = wordToDec
65 :     | fmtW StringCvt.HEX = wordToHex
66 :    
67 :     fun fmtWord radix = PreString.implode o (fmtW radix)
68 :    
69 :     fun fmtInt radix i =
70 :     if W.fromLargeInt i = 0wx80000000 then "~2147483648"
71 :     else let
72 :     val w32 = W.fromLargeInt(if I32.<(i, 0) then I32.~(i) else i)
73 :     val (n, digits) = fmtW radix w32
74 :     in
75 :     if I32.<(i, 0) then PreString.implode(I.+(n,1), #"~"::digits)
76 :     else PreString.implode(n, digits)
77 :     end
78 :     end;
79 :    
80 :    
81 :     (*
82 : monnier 113 * $Log$
83 : monnier 89 *)

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