From 23bd495521fed1aba4e1cfb8631cf78fa50b92f2 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 18 Nov 2019 14:08:46 +0000 Subject: [PATCH] Format more numbers --- src/Mima/Format/Common.hs | 51 +++++++++++++++++++++++++++++------ src/Mima/Format/FlagFile.hs | 8 ++++-- src/Mima/Format/SymbolFile.hs | 5 +++- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/Mima/Format/Common.hs b/src/Mima/Format/Common.hs index 4e39a18..fb6cab7 100644 --- a/src/Mima/Format/Common.hs +++ b/src/Mima/Format/Common.hs @@ -1,19 +1,54 @@ +{-# LANGUAGE OverloadedStrings #-} + module Mima.Format.Common - ( toHex - , fixedWidthHex - , fixedWidthHexAddress + ( toBin + , toDec + , toHex + , chunkedBy + , chunkyBin + , chunkyDec + , chunkyHex + , fixWidthBin + , fixWidthDec + , fixWidthHex ) where import qualified Data.Text as T import Numeric -import Mima.Word +toBin :: (Integral a, Show a) => a -> T.Text +toBin a + | a < 0 = "-" <> toBin (- a) +toBin 0 = "0" +toBin a = T.reverse $ T.pack $ toBin' a + where + toBin' :: (Integral a, Show a) => a -> String + toBin' 0 = [] + toBin' n = (if n `mod` 2 == 0 then '0' else '1') : toBin' (n `div` 2) + +toDec :: (Integral a, Show a ) => a -> T.Text +toDec = T.pack . show toHex :: (Integral a, Show a) => a -> T.Text toHex a = T.pack $ showHex a "" -fixedWidthHex :: (Integral a, Show a) => Int -> a -> T.Text -fixedWidthHex n = T.justifyRight n '0' . toHex +chunkedBy :: T.Text -> Int -> T.Text -> T.Text +chunkedBy sep n = T.intercalate sep . T.chunksOf n -fixedWidthHexAddress :: MimaAddress -> T.Text -fixedWidthHexAddress = fixedWidthHex 5 +chunkyBin :: T.Text -> T.Text +chunkyBin = chunkedBy " " 4 + +chunkyDec :: T.Text -> T.Text +chunkyDec = chunkedBy "'" 3 + +chunkyHex :: T.Text -> T.Text +chunkyHex = chunkedBy " " 2 + +fixWidthBin :: Int -> T.Text -> T.Text +fixWidthBin n = T.justifyRight n '0' + +fixWidthDec :: Int -> T.Text -> T.Text +fixWidthDec n = T.justifyRight n ' ' + +fixWidthHex :: Int -> T.Text -> T.Text +fixWidthHex n = T.justifyRight n '0' diff --git a/src/Mima/Format/FlagFile.hs b/src/Mima/Format/FlagFile.hs index c5556ab..d561ade 100644 --- a/src/Mima/Format/FlagFile.hs +++ b/src/Mima/Format/FlagFile.hs @@ -10,14 +10,18 @@ import qualified Data.Text as T import Mima.Flag import Mima.Format.Common +import Mima.Word + +fAddress :: MimaAddress -> T.Text +fAddress = fixWidthHex 5 . toHex fFlagSet :: Set.Set Char -> T.Text fFlagSet = T.pack . Set.toAscList fRange :: AddressRange -> T.Text fRange r - | lower == upper = fixedWidthHexAddress lower - | otherwise = fixedWidthHexAddress lower <> "-" <> fixedWidthHexAddress upper + | lower == upper = fAddress lower + | otherwise = fAddress lower <> "-" <> fAddress upper where lower = lowerAddress r upper = upperAddress r diff --git a/src/Mima/Format/SymbolFile.hs b/src/Mima/Format/SymbolFile.hs index 202e256..7ef2297 100644 --- a/src/Mima/Format/SymbolFile.hs +++ b/src/Mima/Format/SymbolFile.hs @@ -11,6 +11,9 @@ import qualified Data.Text as T import Mima.Format.Common import Mima.Word +fAddress :: MimaAddress -> T.Text +fAddress = fixWidthHex 5 . toHex + type LabelName = T.Text combineByAddress :: Map.Map LabelName MimaAddress -> Map.Map MimaAddress (Set.Set LabelName) @@ -24,7 +27,7 @@ fLabels :: Set.Set LabelName -> T.Text fLabels = T.intercalate " " . Set.toAscList fLine :: (MimaAddress, Set.Set LabelName) -> T.Text -fLine (a, s) = fixedWidthHexAddress a <> ": " <> fLabels s <> "\n" +fLine (a, s) = fAddress a <> ": " <> fLabels s <> "\n" formatSymbolFile :: Map.Map LabelName MimaAddress -> T.Text formatSymbolFile = mconcat . map fLine . Map.assocs . combineByAddress