{-# LINE 1 "Hdis86/C.hsc" #-}
{-# LANGUAGE
{-# LINE 2 "Hdis86/C.hsc" #-}
    ForeignFunctionInterface
  , EmptyDataDecls #-}

-- | Bare import of the @udis86@ C library.
--
-- This module is not recommended for most users. What you see is what you get.
-- The modules "Hdis86.IO" and "Hdis86.Pure" provide a more Haskell-friendly
-- interface to the same functionality.
--
-- If you want to use this module, see the @udis86@ documentation: <http://udis86.sourceforge.net>
--
-- Instruction opcodes are not enumerated here. You can convert between the
-- C-level integer codes and the type @'Hdis86.Types.Opcode'@ using the latter's
-- @'Enum'@ instance.

module Hdis86.C where

import Foreign
import Foreign.C
import Control.Monad ( liftM2 )


{-# LINE 24 "Hdis86/C.hsc" #-}

-- * The type @ud_t@

-- | Just a pointer tag, with no Haskell representation.
data UD_t

sizeof_ud_t :: Int
sizeof_ud_t = ((592))
{-# LINE 32 "Hdis86/C.hsc" #-}

-- * Callbacks

type InputHook = IO CInt

eoi :: CInt
eoi = (-1)
{-# LINE 39 "Hdis86/C.hsc" #-}

foreign import ccall "wrapper"
  wrap_InputHook :: InputHook -> IO (FunPtr InputHook)

type Translator = Ptr UD_t -> IO ()

foreign import ccall "wrapper"
  wrap_Translator :: Translator -> IO (FunPtr Translator)

-- * Imported functions

foreign import ccall "ud_init"
  init :: Ptr UD_t -> IO ()

foreign import ccall "ud_set_input_hook"
  set_input_hook :: Ptr UD_t -> FunPtr InputHook -> IO ()

foreign import ccall "ud_set_input_buffer"
  set_input_buffer :: Ptr UD_t -> Ptr CChar -> CSize -> IO ()

foreign import ccall "ud_set_input_file"
  set_input_file :: Ptr UD_t -> Ptr CFile -> IO ()

foreign import ccall "ud_set_mode"
  set_mode :: Ptr UD_t -> (Word8) -> IO ()
{-# LINE 64 "Hdis86/C.hsc" #-}

foreign import ccall "ud_set_pc"
  set_pc :: Ptr UD_t -> (Word64) -> IO ()
{-# LINE 67 "Hdis86/C.hsc" #-}

foreign import ccall "ud_set_syntax"
  set_syntax :: Ptr UD_t -> FunPtr Translator -> IO ()

foreign import ccall "ud_set_vendor"
  set_vendor :: Ptr UD_t -> UD_vendor -> IO ()

foreign import ccall "ud_disassemble"
  disassemble :: Ptr UD_t -> IO CUInt

foreign import ccall "ud_insn_len"
  insn_len :: Ptr UD_t -> IO CUInt

foreign import ccall "ud_insn_off"
  insn_off :: Ptr UD_t -> IO (Word64)
{-# LINE 82 "Hdis86/C.hsc" #-}

foreign import ccall "ud_insn_hex"
  insn_hex :: Ptr UD_t -> IO CString

foreign import ccall "ud_insn_ptr"
  insn_ptr :: Ptr UD_t -> IO (Ptr (Word8))
{-# LINE 88 "Hdis86/C.hsc" #-}

foreign import ccall "ud_insn_asm"
  insn_asm :: Ptr UD_t -> IO CString

foreign import ccall "ud_input_skip"
  input_skip :: Ptr UD_t -> CSize -> IO ()

foreign import ccall "&ud_translate_intel"
  translate_intel :: FunPtr Translator

foreign import ccall "&ud_translate_att"
  translate_att :: FunPtr Translator

-- * Struct accessors

get_mnemonic :: Ptr UD_t -> IO CUInt
get_mnemonic p = ((\hsc_ptr -> peekByteOff hsc_ptr 160)) p
{-# LINE 105 "Hdis86/C.hsc" #-}

-- | Another pointer tag.
data Operand

get_operand1, get_operand2, get_operand3 :: Ptr UD_t -> Ptr Operand
get_operand1 = ((\hsc_ptr -> hsc_ptr `plusPtr` 164))
{-# LINE 111 "Hdis86/C.hsc" #-}
get_operand2 = ((\hsc_ptr -> hsc_ptr `plusPtr` 192))
{-# LINE 112 "Hdis86/C.hsc" #-}
get_operand3 = ((\hsc_ptr -> hsc_ptr `plusPtr` 220))
{-# LINE 113 "Hdis86/C.hsc" #-}

get_type, get_base, get_index :: Ptr Operand -> IO UD_type
get_type  = ((\hsc_ptr -> peekByteOff hsc_ptr 0))
{-# LINE 116 "Hdis86/C.hsc" #-}
get_base  = ((\hsc_ptr -> peekByteOff hsc_ptr 16))
{-# LINE 117 "Hdis86/C.hsc" #-}
get_index = ((\hsc_ptr -> peekByteOff hsc_ptr 20))
{-# LINE 118 "Hdis86/C.hsc" #-}

get_size, get_offset, get_scale :: Ptr Operand -> IO (Word8)
{-# LINE 120 "Hdis86/C.hsc" #-}
get_size   = ((\hsc_ptr -> peekByteOff hsc_ptr 4))
{-# LINE 121 "Hdis86/C.hsc" #-}
get_offset = ((\hsc_ptr -> peekByteOff hsc_ptr 24))
{-# LINE 122 "Hdis86/C.hsc" #-}
get_scale  = ((\hsc_ptr -> peekByteOff hsc_ptr 25))
{-# LINE 123 "Hdis86/C.hsc" #-}

get_lval_u8  :: Ptr Operand -> IO Word8
get_lval_u8  = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 126 "Hdis86/C.hsc" #-}
get_lval_u16 :: Ptr Operand -> IO Word16
get_lval_u16 = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 128 "Hdis86/C.hsc" #-}
get_lval_u32 :: Ptr Operand -> IO Word32
get_lval_u32 = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 130 "Hdis86/C.hsc" #-}
get_lval_u64 :: Ptr Operand -> IO Word64
get_lval_u64 = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 132 "Hdis86/C.hsc" #-}

get_lval_s8  :: Ptr Operand -> IO Int8
get_lval_s8  = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 135 "Hdis86/C.hsc" #-}
get_lval_s16 :: Ptr Operand -> IO Int16
get_lval_s16 = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 137 "Hdis86/C.hsc" #-}
get_lval_s32 :: Ptr Operand -> IO Int32
get_lval_s32 = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 139 "Hdis86/C.hsc" #-}
get_lval_s64 :: Ptr Operand -> IO Int64
get_lval_s64 = ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 141 "Hdis86/C.hsc" #-}

get_lval_ptr :: Ptr Operand -> IO (Word16, Word32)
get_lval_ptr p = liftM2 (,) (((\hsc_ptr -> peekByteOff hsc_ptr 8)) p)
{-# LINE 144 "Hdis86/C.hsc" #-}
                            (((\hsc_ptr -> peekByteOff hsc_ptr 12)) p)
{-# LINE 145 "Hdis86/C.hsc" #-}

get_pfx_rex, get_pfx_seg, get_pfx_opr, get_pfx_adr,
  get_pfx_lock, get_pfx_rep, get_pfx_repe, get_pfx_repne :: Ptr UD_t -> IO (Word8)
{-# LINE 148 "Hdis86/C.hsc" #-}
get_pfx_rex   = ((\hsc_ptr -> peekByteOff hsc_ptr 249))
{-# LINE 149 "Hdis86/C.hsc" #-}
get_pfx_seg   = ((\hsc_ptr -> peekByteOff hsc_ptr 250))
{-# LINE 150 "Hdis86/C.hsc" #-}
get_pfx_opr   = ((\hsc_ptr -> peekByteOff hsc_ptr 251))
{-# LINE 151 "Hdis86/C.hsc" #-}
get_pfx_adr   = ((\hsc_ptr -> peekByteOff hsc_ptr 252))
{-# LINE 152 "Hdis86/C.hsc" #-}
get_pfx_lock  = ((\hsc_ptr -> peekByteOff hsc_ptr 253))
{-# LINE 153 "Hdis86/C.hsc" #-}
get_pfx_rep   = ((\hsc_ptr -> peekByteOff hsc_ptr 254))
{-# LINE 154 "Hdis86/C.hsc" #-}
get_pfx_repe  = ((\hsc_ptr -> peekByteOff hsc_ptr 255))
{-# LINE 155 "Hdis86/C.hsc" #-}
get_pfx_repne = ((\hsc_ptr -> peekByteOff hsc_ptr 256))
{-# LINE 156 "Hdis86/C.hsc" #-}

get_pc :: Ptr UD_t -> IO (Word64)
{-# LINE 158 "Hdis86/C.hsc" #-}
get_pc = ((\hsc_ptr -> peekByteOff hsc_ptr 144))
{-# LINE 159 "Hdis86/C.hsc" #-}

-- * Enumerations

type UD_vendor = CUInt
udVendorIntel :: UD_vendor
udVendorIntel =  1
udVendorAmd :: UD_vendor
udVendorAmd =  0

{-# LINE 164 "Hdis86/C.hsc" #-}

type UD_type = CUInt
udNone :: UD_type
udNone =  0
udRAl :: UD_type
udRAl =  1
udRCl :: UD_type
udRCl =  2
udRDl :: UD_type
udRDl =  3
udRBl :: UD_type
udRBl =  4
udRAh :: UD_type
udRAh =  5
udRCh :: UD_type
udRCh =  6
udRDh :: UD_type
udRDh =  7
udRBh :: UD_type
udRBh =  8
udRSpl :: UD_type
udRSpl =  9
udRBpl :: UD_type
udRBpl =  10
udRSil :: UD_type
udRSil =  11
udRDil :: UD_type
udRDil =  12
udRR8b :: UD_type
udRR8b =  13
udRR9b :: UD_type
udRR9b =  14
udRR10b :: UD_type
udRR10b =  15
udRR11b :: UD_type
udRR11b =  16
udRR12b :: UD_type
udRR12b =  17
udRR13b :: UD_type
udRR13b =  18
udRR14b :: UD_type
udRR14b =  19
udRR15b :: UD_type
udRR15b =  20
udRAx :: UD_type
udRAx =  21
udRCx :: UD_type
udRCx =  22
udRDx :: UD_type
udRDx =  23
udRBx :: UD_type
udRBx =  24
udRSp :: UD_type
udRSp =  25
udRBp :: UD_type
udRBp =  26
udRSi :: UD_type
udRSi =  27
udRDi :: UD_type
udRDi =  28
udRR8w :: UD_type
udRR8w =  29
udRR9w :: UD_type
udRR9w =  30
udRR10w :: UD_type
udRR10w =  31
udRR11w :: UD_type
udRR11w =  32
udRR12w :: UD_type
udRR12w =  33
udRR13w :: UD_type
udRR13w =  34
udRR14w :: UD_type
udRR14w =  35
udRR15w :: UD_type
udRR15w =  36
udREax :: UD_type
udREax =  37
udREcx :: UD_type
udREcx =  38
udREdx :: UD_type
udREdx =  39
udREbx :: UD_type
udREbx =  40
udREsp :: UD_type
udREsp =  41
udREbp :: UD_type
udREbp =  42
udREsi :: UD_type
udREsi =  43
udREdi :: UD_type
udREdi =  44
udRR8d :: UD_type
udRR8d =  45
udRR9d :: UD_type
udRR9d =  46
udRR10d :: UD_type
udRR10d =  47
udRR11d :: UD_type
udRR11d =  48
udRR12d :: UD_type
udRR12d =  49
udRR13d :: UD_type
udRR13d =  50
udRR14d :: UD_type
udRR14d =  51
udRR15d :: UD_type
udRR15d =  52
udRRax :: UD_type
udRRax =  53
udRRcx :: UD_type
udRRcx =  54
udRRdx :: UD_type
udRRdx =  55
udRRbx :: UD_type
udRRbx =  56
udRRsp :: UD_type
udRRsp =  57
udRRbp :: UD_type
udRRbp =  58
udRRsi :: UD_type
udRRsi =  59
udRRdi :: UD_type
udRRdi =  60
udRR8 :: UD_type
udRR8 =  61
udRR9 :: UD_type
udRR9 =  62
udRR10 :: UD_type
udRR10 =  63
udRR11 :: UD_type
udRR11 =  64
udRR12 :: UD_type
udRR12 =  65
udRR13 :: UD_type
udRR13 =  66
udRR14 :: UD_type
udRR14 =  67
udRR15 :: UD_type
udRR15 =  68
udREs :: UD_type
udREs =  69
udRCs :: UD_type
udRCs =  70
udRSs :: UD_type
udRSs =  71
udRDs :: UD_type
udRDs =  72
udRFs :: UD_type
udRFs =  73
udRGs :: UD_type
udRGs =  74
udRCr0 :: UD_type
udRCr0 =  75
udRCr1 :: UD_type
udRCr1 =  76
udRCr2 :: UD_type
udRCr2 =  77
udRCr3 :: UD_type
udRCr3 =  78
udRCr4 :: UD_type
udRCr4 =  79
udRCr5 :: UD_type
udRCr5 =  80
udRCr6 :: UD_type
udRCr6 =  81
udRCr7 :: UD_type
udRCr7 =  82
udRCr8 :: UD_type
udRCr8 =  83
udRCr9 :: UD_type
udRCr9 =  84
udRCr10 :: UD_type
udRCr10 =  85
udRCr11 :: UD_type
udRCr11 =  86
udRCr12 :: UD_type
udRCr12 =  87
udRCr13 :: UD_type
udRCr13 =  88
udRCr14 :: UD_type
udRCr14 =  89
udRCr15 :: UD_type
udRCr15 =  90
udRDr0 :: UD_type
udRDr0 =  91
udRDr1 :: UD_type
udRDr1 =  92
udRDr2 :: UD_type
udRDr2 =  93
udRDr3 :: UD_type
udRDr3 =  94
udRDr4 :: UD_type
udRDr4 =  95
udRDr5 :: UD_type
udRDr5 =  96
udRDr6 :: UD_type
udRDr6 =  97
udRDr7 :: UD_type
udRDr7 =  98
udRDr8 :: UD_type
udRDr8 =  99
udRDr9 :: UD_type
udRDr9 =  100
udRDr10 :: UD_type
udRDr10 =  101
udRDr11 :: UD_type
udRDr11 =  102
udRDr12 :: UD_type
udRDr12 =  103
udRDr13 :: UD_type
udRDr13 =  104
udRDr14 :: UD_type
udRDr14 =  105
udRDr15 :: UD_type
udRDr15 =  106
udRMm0 :: UD_type
udRMm0 =  107
udRMm1 :: UD_type
udRMm1 =  108
udRMm2 :: UD_type
udRMm2 =  109
udRMm3 :: UD_type
udRMm3 =  110
udRMm4 :: UD_type
udRMm4 =  111
udRMm5 :: UD_type
udRMm5 =  112
udRMm6 :: UD_type
udRMm6 =  113
udRMm7 :: UD_type
udRMm7 =  114
udRSt0 :: UD_type
udRSt0 =  115
udRSt1 :: UD_type
udRSt1 =  116
udRSt2 :: UD_type
udRSt2 =  117
udRSt3 :: UD_type
udRSt3 =  118
udRSt4 :: UD_type
udRSt4 =  119
udRSt5 :: UD_type
udRSt5 =  120
udRSt6 :: UD_type
udRSt6 =  121
udRSt7 :: UD_type
udRSt7 =  122
udRXmm0 :: UD_type
udRXmm0 =  123
udRXmm1 :: UD_type
udRXmm1 =  124
udRXmm2 :: UD_type
udRXmm2 =  125
udRXmm3 :: UD_type
udRXmm3 =  126
udRXmm4 :: UD_type
udRXmm4 =  127
udRXmm5 :: UD_type
udRXmm5 =  128
udRXmm6 :: UD_type
udRXmm6 =  129
udRXmm7 :: UD_type
udRXmm7 =  130
udRXmm8 :: UD_type
udRXmm8 =  131
udRXmm9 :: UD_type
udRXmm9 =  132
udRXmm10 :: UD_type
udRXmm10 =  133
udRXmm11 :: UD_type
udRXmm11 =  134
udRXmm12 :: UD_type
udRXmm12 =  135
udRXmm13 :: UD_type
udRXmm13 =  136
udRXmm14 :: UD_type
udRXmm14 =  137
udRXmm15 :: UD_type
udRXmm15 =  138
udRRip :: UD_type
udRRip =  139
udOpReg :: UD_type
udOpReg =  140
udOpMem :: UD_type
udOpMem =  141
udOpPtr :: UD_type
udOpPtr =  142
udOpImm :: UD_type
udOpImm =  143
udOpJimm :: UD_type
udOpJimm =  144
udOpConst  :: UD_type
udOpConst  =  145

{-# LINE 206 "Hdis86/C.hsc" #-}