content: -- Sample code for Keystone Assembler Engine.
  
  import Keystone
  
  import qualified Data.ByteString as BS
  import Data.List (intercalate)
  import qualified Numeric as N (showHex)
  
  -- Pretty-print byte string as hex.
  showHexBS :: BS.ByteString
            -> String
  showHexBS =
      concatMap (flip N.showHex " ") . BS.unpack
  
  testKs :: Architecture
         -> [Mode]
         -> [String]
         -> Maybe OptionValue
         -> IO ()
  testKs arch mode assembly maybeSyntax = do
      result <- runAssembler $ do
          ks <- open arch mode
          case maybeSyntax of
              Just syntax -> option ks OptSyntax syntax
              Nothing     -> return ()
          (encode, count) <- assemble ks assembly Nothing
          return (encode, count)
      case result of
          Right (encode, count) -> let size = BS.length encode in do
              putStr   $ intercalate ";" assembly ++ " = "
              putStrLn $ showHexBS encode
              putStrLn $ "Assembled: " ++ show size ++ " bytes, " ++
                         show count ++ " statements\n"
          Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++
                                 strerror err ++ ")"
  
  main :: IO ()
  main = do
      -- X86
      testKs ArchX86 [Mode16] ["add eax, ecx"]   Nothing
      testKs ArchX86 [Mode32] ["add eax, ecx"]   Nothing
      testKs ArchX86 [Mode64] ["add rax, rcx"]   Nothing
      testKs ArchX86 [Mode32] ["add %ecx, %eax"] (Just SyntaxAtt)
      testKs ArchX86 [Mode64] ["add %rcx, %rax"] (Just SyntaxAtt)
  
      -- ARM
      testKs ArchArm [ModeArm]                ["sub r1, r2, r5"]   Nothing
      testKs ArchArm [ModeArm, ModeBigEndian] ["sub r1, r2, r5"]   Nothing
      testKs ArchArm [ModeThumb]              ["movs r4, #0xf0"]   Nothing
      testKs ArchArm [ModeThumb, ModeBigEndian] ["movs r4, #0xf0"] Nothing
  
      -- ARM64
      testKs ArchArm64 [ModeLittleEndian] ["ldr w1, [sp, #0x8]"] Nothing
  
      -- Hexagon
      testKs ArchHexagon [ModeBigEndian] ["v23.w=vavg(v11.w,v2.w):rnd"] Nothing
  
      -- MIPS
      testKs ArchMips [ModeMips32]                ["and $9, $6, $7"] Nothing
      testKs ArchMips [ModeMips32, ModeBigEndian] ["and $9, $6, $7"] Nothing
      testKs ArchMips [ModeMips64]                ["and $9, $6, $7"] Nothing
      testKs ArchMips [ModeMips64, ModeBigEndian] ["and $9, $6, $7"] Nothing
  
      -- PowerPC
      testKs ArchPpc [ModePpc32, ModeBigEndian] ["add 1, 2, 3"] Nothing
      testKs ArchPpc [ModePpc64]                ["add 1, 2, 3"] Nothing
      testKs ArchPpc [ModePpc64, ModeBigEndian] ["add 1, 2, 3"] Nothing
  
      -- SPARC
      testKs ArchSparc [ModeSparc32, ModeLittleEndian] ["add %g1, %g2, %g3"] Nothing
      testKs ArchSparc [ModeSparc32, ModeBigEndian]    ["add %g1, %g2, %g3"] Nothing
  
      -- SystemZ
      testKs ArchSystemz [ModeBigEndian] ["a %r0, 4095(%r15,%r1)"] Nothing
  