From 57436f664e7d138bd915fb30f486e4bb802d74b6 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Tue, 22 Oct 2024 01:21:02 +0200 Subject: Abstract the string table into a newtype --- lib/Language/Elna/Object/StringTable.hs | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 lib/Language/Elna/Object/StringTable.hs (limited to 'lib/Language/Elna/Object/StringTable.hs') diff --git a/lib/Language/Elna/Object/StringTable.hs b/lib/Language/Elna/Object/StringTable.hs new file mode 100644 index 0000000..e75f2c6 --- /dev/null +++ b/lib/Language/Elna/Object/StringTable.hs @@ -0,0 +1,44 @@ +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 -- cgit v1.2.3