module Lua.Bytecode5_1.Header where
import Debug.Trace
import Data.Word
import Data.Int
import Data.Bits
import Data.ByteString
import System.IO
import Data.Serialize.Get
import Lua.Bytecode5_1.Types
data Header = Header {
versionMajor :: Word8,
versionMinor :: Word8,
formatVersion :: Word8,
bigEndian :: Bool,
intBytes :: Word8,
size_tBytes :: Word8,
instructionBytes :: Word8,
lua_NumberBytes :: Word8,
floatNums :: Bool
}
deriving (Show)
headerAssert :: Get ()
headerAssert = do
b <- getBytes 4
if pack [0x1b,0x4c,0x75,0x61] /= b
then fail "The LUA Signature Header is missing."
else return ()
getHeader :: Get Header
getHeader = do
headerAssert
headerBS <- getBytes 8
return $ Header {
versionMajor = index headerBS 0 `shiftR` 4
, versionMinor = index headerBS 0 .&. 0xf
, formatVersion = index headerBS 1
, bigEndian = index headerBS 2 == 0
, intBytes = index headerBS 3
, size_tBytes = index headerBS 4
, instructionBytes = index headerBS 5
, lua_NumberBytes = index headerBS 6
, floatNums = index headerBS 7 == 0
}
instance LuaGet Header where
luaGet = getHeader