----------------------------------------------------------------------
-- FILE:              Format.hs
-- DATE:              03/30/2001
-- PROJECT:           
-- LANGUAGE PLATFORM: 
-- OS PLATFORM:       RedHat Linux 6.2
-- AUTHOR:            Jeffrey A. Meunier
-- EMAIL:             jeffm@cse.uconn.edu
-- MAINTAINER:        Alex Mason
-- EMAIL:             axman6@gmail.com
----------------------------------------------------------------------



module Arm.Format
where



----------------------------------------------------------------------
-- Standard libraries.
----------------------------------------------------------------------
import Data.Array
import Data.Word



----------------------------------------------------------------------
-- Local libraries.
----------------------------------------------------------------------



----------------------------------------------------------------------
-- Number base data type.
----------------------------------------------------------------------
data Radix
  = Dec
  | Hex
  deriving (Show)



----------------------------------------------------------------------
-- Format a number in a specific number base.
----------------------------------------------------------------------
formatNum base
  = case base of
      Dec -> formatDec 10 '0'
      Hex -> formatHex 8 '0' ""



----------------------------------------------------------------------
-- Convert a number to a hex string.
----------------------------------------------------------------------
formatHex
  :: Int
  -> Char
  -> String
  -> Word32
  -> String

formatHex places fillChar accum n
  = if places == 0
      then accum
      else let digIndex = n `mod` 16
               dig = if n == 0
                       then fillChar
                       else hexChars ! digIndex
           in formatHex (places - 1) fillChar (dig : accum) (n `div` 16)



----------------------------------------------------------------------
-- Array of hex characters.
----------------------------------------------------------------------
hexChars
  :: Array Word32 Char

hexChars
  = listArray (0, 15) "0123456789ABCDEF"



----------------------------------------------------------------------
-- Format a decimal integer
----------------------------------------------------------------------
formatDec
  :: Int
  -> Char
  -> Word32
  -> String

formatDec places fillChar n
  = let s = show n
        pad = places - (length s)
    in (take pad (repeat fillChar)) ++ s






----------------------------------------------------------------------
-- eof
----------------------------------------------------------------------