2024-12-11 21:44:32 +01:00
|
|
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
|
|
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
|
|
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
|
|
|
|
2024-10-22 01:21:02 +02:00
|
|
|
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
|