{- 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/. -} 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