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/branches/num64/system/Basis/Implementation/word8.sml
ViewVC logotype

Annotation of /sml/branches/num64/system/Basis/Implementation/word8.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 651 - (view) (download)
Original Path: sml/trunk/src/system/Basis/Implementation/word8.sml

1 : monnier 416 (* word8.sml
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     *)
6 :    
7 :     structure Word8Imp : WORD =
8 :     struct
9 :    
10 :     structure W8 = InlineT.Word8
11 :     structure W31 = InlineT.Word31
12 :     structure LW = Word32Imp
13 :    
14 : monnier 429 type word = Word8.word (* 31 bits *)
15 : monnier 416
16 :     val wordSize = 8
17 :     val wordSizeW = 0w8
18 :     val wordShift = InlineT.Word31.-(0w31, wordSizeW)
19 :     fun adapt oper args = W8.andb(oper args, 0wxFF)
20 :    
21 :     val toInt : word -> int = W8.toInt
22 :     val toIntX : word -> int = W8.toIntX
23 :     val fromInt : int -> word = W8.fromInt
24 :    
25 :     val toLargeWord : word -> LargeWord.word = W8.toLargeWord
26 :     val toLargeWordX = W8.toLargeWordX
27 :     val fromLargeWord = W8.fromLargeWord
28 :    
29 :     val toLargeInt : word -> LargeInt.int = LW.toLargeInt o toLargeWord
30 :     val toLargeIntX : word -> LargeInt.int = W8.toLargeIntX
31 :     val fromLargeInt: LargeInt.int -> word = W8.fromLargeInt
32 :    
33 :    
34 :     (** These should be inline functions **)
35 :     fun << (w : word, k) = if (InlineT.DfltWord.<=(wordSizeW, k))
36 :     then 0w0
37 :     else adapt W8.lshift (w, k)
38 :     fun >> (w : word, k) = if (InlineT.DfltWord.<=(wordSizeW, k))
39 :     then 0w0
40 :     else W8.rshiftl(w, k)
41 :     fun ~>> (w : word, k) = if (InlineT.DfltWord.<=(wordSizeW, k))
42 :     then adapt W8.rshift (W8.lshift(w, wordShift), 0w31)
43 :     else adapt W8.rshift
44 :     (W8.lshift(w, wordShift), InlineT.DfltWord.+(wordShift, k))
45 :    
46 :     val orb : word * word -> word = W8.orb
47 :     val xorb : word * word -> word = W8.xorb
48 :     val andb : word * word -> word = W8.andb
49 :     val notb : word -> word = adapt W8.notb
50 :    
51 :     val op * : word * word -> word = adapt W8.*
52 :     (* NOTE: waste of time to check for overflow; really should use Word31
53 :     * arithmetic operators; when those get implemented, switch over.
54 :     *)
55 :     val op + : word * word -> word = adapt W8.+
56 :     val op - : word * word -> word = adapt W8.-
57 :     val op div : word * word -> word = W8.div
58 :     fun op mod (a:word, b:word):word = a-(a div b)*b
59 :    
60 :     fun compare (w1, w2) =
61 :     if (W8.<(w1, w2)) then LESS
62 :     else if (W8.>(w1, w2)) then GREATER
63 :     else EQUAL
64 :     val op > : word * word -> bool = W8.>
65 :     val op >= : word * word -> bool = W8.>=
66 :     val op < : word * word -> bool = W8.<
67 :     val op <= : word * word -> bool = W8.<=
68 :    
69 :     fun min (w1, w2) = if (w1 < w2) then w1 else w2
70 :     fun max (w1, w2) = if (w1 > w2) then w1 else w2
71 :    
72 :     fun fmt radix = (NumFormat.fmtWord radix) o toLargeWord
73 :     val toString = fmt StringCvt.HEX
74 :    
75 :     fun scan radix = let
76 :     val scanLarge = NumScan.scanWord radix
77 :     fun scan getc cs = (case (scanLarge getc cs)
78 :     of NONE => NONE
79 :     | (SOME(w, cs')) => if InlineT.Word32.>(w, 0w255)
80 :     then raise Overflow
81 :     else SOME(fromLargeWord w, cs')
82 :     (* end case *))
83 :     in
84 :     scan
85 :     end
86 :     val fromString = PreBasis.scanString (scan StringCvt.HEX)
87 :    
88 :     end (* structure Word8 *)
89 :    
90 :    

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