diff options
Diffstat (limited to 'lib/Language/Elna/Object/StringTable.hs')
| -rw-r--r-- | lib/Language/Elna/Object/StringTable.hs | 44 |
1 files changed, 44 insertions, 0 deletions
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 |
