-- This file is part of Bindings-bfd.
--
-- Copyright (C) 2010 Michael Nelson
--
-- Bindings-bfd is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Bindings-bfd is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Lesser General Public License for more details.

-- You should have received a copy of the GNU Lesser General Public License
-- along with Bindings-bfd.  If not, see <http://www.gnu.org/licenses/>.

module Bindings.Bfd.Disasm where

import Foreign.C
import Foreign.Ptr

import System.Posix.IO

import Bindings.Bfd.Disasm.Info
import Bindings.Bfd.Misc


type Disasm = FunPtr Disasm'

type Disasm' = Vma' -> Info0 -> IO CInt


run
   :: (Integral a)
   => Disasm
   -> Info
   -> a
   -> IO (String, Int)
run disasm (Info info fd) vma =
   do
      let
         vma' = fromIntegral vma
         f = d_run disasm vma' info

      len <- f
      (str,_) <- fdRead fd 80 -- arbitrarily longer than any possible assembler expression (we hope)
      
      return (str, fromIntegral len :: Int)

foreign import ccall unsafe "dynamic" d_run
   :: Disasm -> Disasm'