-----------------------------------------------------------------------------
-- |
-- Module      :  Coded.Text.Raw
-- Copyright   :  (c) Dominic Steinitz 2006
-- License     :  BSD-style (see the file ReadMe.tex)
--
-- Stability   :  experimental
-- Portability :  portable
--
-----------------------------------------------------------------------------

module Codec.Text.Raw(
   hexdump,
   hexdumpBy,
   ) where

import Data.List
import Codec.Utils
import Numeric
import Text.PrettyPrint

split :: Int -> [a] -> [[a]]
split :: forall a. Int -> [a] -> [[a]]
split Int
n [a]
xs = forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (forall a. Int -> [a] -> Maybe ([a], [a])
g Int
n) [a]
xs

g :: Int -> [a] -> Maybe ([a],[a])
g :: forall a. Int -> [a] -> Maybe ([a], [a])
g Int
n [] = forall a. Maybe a
Nothing
g Int
n [a]
y  = forall a. a -> Maybe a
Just (forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
y)

sh :: a -> [Char]
sh a
x | a
x forall a. Ord a => a -> a -> Bool
< a
16    = Char
'0'forall a. a -> [a] -> [a]
:(forall a. (Integral a, Show a) => a -> ShowS
showHex a
x [Char]
"")
     | Bool
otherwise = forall a. (Integral a, Show a) => a -> ShowS
showHex a
x [Char]
""

type OctetsPerLine = Int

hexdump :: OctetsPerLine -> [Octet] -> Doc
hexdump :: Int -> [Octet] -> Doc
hexdump Int
n =
   [Doc] -> Doc
vcat forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a b. (a -> b) -> [a] -> [b]
map [Doc] -> Doc
hcat forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a b. (a -> b) -> [a] -> [b]
map (forall a. a -> [a] -> [a]
intersperse Doc
colon) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (a -> b) -> [a] -> [b]
map ([Char] -> Doc
text forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. (Integral a, Show a) => a -> [Char]
sh)) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a. Int -> [a] -> [[a]]
split Int
n

hexdumpBy :: String -> OctetsPerLine -> [Octet] -> Doc
hexdumpBy :: [Char] -> Int -> [Octet] -> Doc
hexdumpBy [Char]
s Int
n =
   [Doc] -> Doc
vcat forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a b. (a -> b) -> [a] -> [b]
map [Doc] -> Doc
hcat forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a b. (a -> b) -> [a] -> [b]
map (forall a. a -> [a] -> [a]
intersperse ([Char] -> Doc
text [Char]
s)) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (a -> b) -> [a] -> [b]
map ([Char] -> Doc
text forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. (Integral a, Show a) => a -> [Char]
sh)) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall a. Int -> [a] -> [[a]]
split Int
n