45 lines
1.2 KiB
Haskell
45 lines
1.2 KiB
Haskell
|
module Language.Elna.Object.StringTable
|
||
|
( StringTable
|
||
|
, append
|
||
|
, elem
|
||
|
, index
|
||
|
, encode
|
||
|
, size
|
||
|
) where
|
||
|
|
||
|
import Data.ByteString (StrictByteString)
|
||
|
import qualified Data.ByteString as ByteString
|
||
|
import Language.Elna.Object.Elf
|
||
|
import Prelude hiding (elem)
|
||
|
|
||
|
newtype StringTable = StringTable StrictByteString
|
||
|
deriving Eq
|
||
|
|
||
|
instance Semigroup StringTable
|
||
|
where
|
||
|
(StringTable x) <> (StringTable y) = StringTable $ x <> ByteString.drop 1 y
|
||
|
|
||
|
instance Monoid StringTable
|
||
|
where
|
||
|
mempty = StringTable "\0"
|
||
|
|
||
|
size :: StringTable -> Elf32_Word
|
||
|
size (StringTable container) =
|
||
|
fromIntegral $ ByteString.length container
|
||
|
|
||
|
elem :: StrictByteString -> StringTable -> Bool
|
||
|
elem needle (StringTable container) =
|
||
|
("\0" <> needle <> "\0") `ByteString.isInfixOf` container
|
||
|
|
||
|
append :: StrictByteString -> StringTable -> StringTable
|
||
|
append element (StringTable container) =
|
||
|
StringTable $ container <> element <> "\0"
|
||
|
|
||
|
index :: Elf32_Word -> StringTable -> StrictByteString
|
||
|
index stringTableIndex (StringTable stringTable)
|
||
|
= ByteString.takeWhile (/= 0)
|
||
|
$ ByteString.drop (fromIntegral stringTableIndex) stringTable
|
||
|
|
||
|
encode :: StringTable -> StrictByteString
|
||
|
encode (StringTable container) = container
|