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
	--trace "getHeader" (return ())
	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