-- GENERATED by C->Haskell Compiler, version 0.16.5 Crystal Seed, 24 Jan 2009 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "./Codec/Game/Puz/Internal.chs" #-}{-# LANGUAGE ForeignFunctionInterface #-}


module Codec.Game.Puz.Internal where

import Foreign
import Foreign.C

import Text.ParserCombinators.Parsec

-- how to get c2hs to do this?
foreign import ccall safe "puz.h &puz_deep_free"
  puzDeepFree :: FunPtr (Ptr Puz -> IO ())


newtype PuzHead = PuzHead (ForeignPtr (PuzHead))
withPuzHead (PuzHead fptr) = withForeignPtr fptr
{-# LINE 17 "./Codec/Game/Puz/Internal.chs" #-}
newtype Puz = Puz (ForeignPtr (Puz))
withPuz (Puz fptr) = withForeignPtr fptr
{-# LINE 18 "./Codec/Game/Puz/Internal.chs" #-}

data PuzType = PuzTypeBinary
             | PuzTypeText
             | PuzTypeUnknown
             deriving (Eq,Show)
instance Enum PuzType where
  fromEnum PuzTypeBinary = 1
  fromEnum PuzTypeText = 2
  fromEnum PuzTypeUnknown = 4

  toEnum 1 = PuzTypeBinary
  toEnum 2 = PuzTypeText
  toEnum 4 = PuzTypeUnknown
  toEnum unmatched = error ("PuzType.toEnum: Cannot match " ++ show unmatched)

{-# LINE 26 "./Codec/Game/Puz/Internal.chs" #-}


-- XXX is this really freeing the right thing?  How could I tell?
marshallPuzMaybe :: Ptr Puz -> IO (Maybe Puz)
marshallPuzMaybe pp = 
  if pp == nullPtr 
    then return Nothing
    else do fp <- newForeignPtr puzDeepFree pp
            return $ Just $ Puz fp

marshallPuz :: Ptr Puz -> IO Puz
marshallPuz pp = do fp <- newForeignPtr puzDeepFree pp
                    return $ Puz fp



-- custom marshallers
charToCUChar :: Char -> CUChar
charToCUChar = toEnum . fromEnum

-- shouldn't this be built in?
boolToCInt :: Bool -> CInt
boolToCInt True = 1
boolToCInt False = 0

newString :: String -> IO (Ptr CUChar)
newString = 
  newArray0 (toEnum 0) . map charToCUChar

-- IN
alwaysUseIn :: a -> (a -> b) -> b
alwaysUseIn a f = f a

nullIn :: (Ptr a -> IO b) -> IO b
nullIn = alwaysUseIn nullPtr

puzTypeIn :: (CInt -> IO b) -> IO b
puzTypeIn = alwaysUseIn $ cIntConv $ fromEnum PuzTypeBinary

zeroShortIn :: (CUShort -> IO b) -> IO b
zeroShortIn = alwaysUseIn $ fromIntegral (0x0000 :: Int)

puzIn :: Puz -> (Ptr Puz -> IO b) -> IO b
puzIn (Puz fp) = withForeignPtr fp

stringIn :: String -> (Ptr CUChar -> IO b) -> IO b
stringIn = withArray0 0 . map charToCUChar 

rtblIn :: [(String,Int)] -> (Ptr CUChar -> IO b) -> IO b
rtblIn tbl = 
  let chars = concatMap (\(s,i) -> let pad = if i < 10 then " " else "" in
                                   pad ++ show i ++ ":" ++ s ++ ";")
                        tbl
  in
    stringIn chars

rusrIn :: [Maybe String] -> (Ptr (Ptr CUChar) -> IO b) -> IO b
rusrIn rusr f =
  do strs <- mapM (\a -> case a of
                           Nothing -> return nullPtr
                           Just s  -> newString s) rusr
     res <- withArray strs f
     mapM_ (\a -> if a == nullPtr then return () else free a) strs
     return res

-- OUT
cerrToBool :: CInt -> Bool
cerrToBool = (0 ==)

cintToBool :: CInt -> Bool
cintToBool = (0 /=)

saveIntToBool :: CInt -> Bool
saveIntToBool = (-1 /=)

stringOut :: Ptr CUChar -> IO String
stringOut ptr =
  do cuchars <- peekArray0 (0 :: CUChar) ptr
     return $ map (toEnum . (fromIntegral :: CUChar -> Int)) cuchars

rtblParser :: Parser [(Int,String)]
rtblParser =
  sepEndBy (do spaces
               ds <- many1 digit
               _ <- char ':'
               reb <- many1 alphaNum
               return ((read ds) + 1, reb)) 
           (char ';')

rtblOut :: Ptr CUChar -> IO [(Int,String)]
rtblOut ptr =
    do str <- stringOut ptr
       case parse rtblParser "rebus table" str of
         Left err -> error ("Ill-formed puzzle file: " ++ show err)
         Right tbl -> return tbl

bruteForceOut :: CInt -> Maybe Int
bruteForceOut i =
  if i < 0 then Nothing
           else Just $ fromIntegral i    


{- puz struct creation, initialization -}

puzCreate :: IO ((Puz))
puzCreate =
  nullIn $ \a1' -> 
  puzCreate'_ a1' >>= \res ->
  marshallPuz res >>= \res' ->
  return (res')
{-# LINE 132 "./Codec/Game/Puz/Internal.chs" #-}

puzLoad :: (Ptr CUChar) -> (Int) -> IO ((Maybe Puz))
puzLoad a3 a4 =
  nullIn $ \a1' -> 
  puzTypeIn $ \a2' -> 
  let {a3' = id a3} in 
  let {a4' = fromIntegral a4} in 
  puzLoad'_ a1' a2' a3' a4' >>= \res ->
  marshallPuzMaybe res >>= \res' ->
  return (res')
{-# LINE 141 "./Codec/Game/Puz/Internal.chs" #-}

puzSave :: (Puz) -> (Ptr CUChar) -> (Int) -> IO ((Bool))
puzSave a1 a3 a4 =
  puzIn a1 $ \a1' -> 
  puzTypeIn $ \a2' -> 
  let {a3' = id a3} in 
  let {a4' = fromIntegral a4} in 
  puzSave'_ a1' a2' a3' a4' >>= \res ->
  let {res' = saveIntToBool res} in
  return (res')
{-# LINE 150 "./Codec/Game/Puz/Internal.chs" #-}

puzSize :: (Puz) -> IO ((Int))
puzSize a1 =
  puzIn a1 $ \a1' -> 
  puzSize'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 154 "./Codec/Game/Puz/Internal.chs" #-}
     

{- check sum checking, generation -}
puzCksumsCalc :: (Puz) -> IO ()
puzCksumsCalc a1 =
  puzIn a1 $ \a1' -> 
  puzCksumsCalc'_ a1' >>= \res ->
  return ()
{-# LINE 160 "./Codec/Game/Puz/Internal.chs" #-}

puzCksumsCheck :: (Puz) -> IO ((Bool))
puzCksumsCheck a1 =
  puzIn a1 $ \a1' -> 
  puzCksumsCheck'_ a1' >>= \res ->
  let {res' = cerrToBool res} in
  return (res')
{-# LINE 164 "./Codec/Game/Puz/Internal.chs" #-}

puzCksumsCommit :: (Puz) -> IO ()
puzCksumsCommit a1 =
  puzIn a1 $ \a1' -> 
  puzCksumsCommit'_ a1' >>= \res ->
  return ()
{-# LINE 168 "./Codec/Game/Puz/Internal.chs" #-}

{- accessors -}
-- XXX actually the return guys on the sets check errors

puzGetWidth :: (Puz) -> IO ((Int))
puzGetWidth a1 =
  puzIn a1 $ \a1' -> 
  puzGetWidth'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 175 "./Codec/Game/Puz/Internal.chs" #-}

puzSetWidth :: (Puz) -> (Int) -> IO ()
puzSetWidth a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  puzSetWidth'_ a1' a2' >>= \res ->
  return ()
{-# LINE 182 "./Codec/Game/Puz/Internal.chs" #-}


puzGetHeight :: (Puz) -> IO ((Int))
puzGetHeight a1 =
  puzIn a1 $ \a1' -> 
  puzGetHeight'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 187 "./Codec/Game/Puz/Internal.chs" #-}

puzSetHeight :: (Puz) -> (Int) -> IO ()
puzSetHeight a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  puzSetHeight'_ a1' a2' >>= \res ->
  return ()
{-# LINE 194 "./Codec/Game/Puz/Internal.chs" #-}


puzGetSolution :: (Puz) -> IO ((Ptr CUChar))
puzGetSolution a1 =
  puzIn a1 $ \a1' -> 
  puzGetSolution'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 199 "./Codec/Game/Puz/Internal.chs" #-}

puzSetSolution :: (Puz) -> (Ptr CUChar) -> IO ()
puzSetSolution a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = id a2} in 
  puzSetSolution'_ a1' a2' >>= \res ->
  return ()
{-# LINE 206 "./Codec/Game/Puz/Internal.chs" #-}


puzGetGrid :: (Puz) -> IO ((Ptr CUChar))
puzGetGrid a1 =
  puzIn a1 $ \a1' -> 
  puzGetGrid'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 211 "./Codec/Game/Puz/Internal.chs" #-}

puzSetGrid :: (Puz) -> (Ptr CUChar) -> IO ()
puzSetGrid a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = id a2} in 
  puzSetGrid'_ a1' a2' >>= \res ->
  return ()
{-# LINE 218 "./Codec/Game/Puz/Internal.chs" #-}


puzGetTitle :: (Puz) -> IO ((String))
puzGetTitle a1 =
  puzIn a1 $ \a1' -> 
  puzGetTitle'_ a1' >>= \res ->
  stringOut res >>= \res' ->
  return (res')
{-# LINE 223 "./Codec/Game/Puz/Internal.chs" #-}

puzSetTitle :: (Puz) -> (String) -> IO ()
puzSetTitle a1 a2 =
  puzIn a1 $ \a1' -> 
  stringIn a2 $ \a2' -> 
  puzSetTitle'_ a1' a2' >>= \res ->
  return ()
{-# LINE 230 "./Codec/Game/Puz/Internal.chs" #-}


puzGetAuthor :: (Puz) -> IO ((String))
puzGetAuthor a1 =
  puzIn a1 $ \a1' -> 
  puzGetAuthor'_ a1' >>= \res ->
  stringOut res >>= \res' ->
  return (res')
{-# LINE 235 "./Codec/Game/Puz/Internal.chs" #-}

puzSetAuthor :: (Puz) -> (String) -> IO ()
puzSetAuthor a1 a2 =
  puzIn a1 $ \a1' -> 
  stringIn a2 $ \a2' -> 
  puzSetAuthor'_ a1' a2' >>= \res ->
  return ()
{-# LINE 242 "./Codec/Game/Puz/Internal.chs" #-}


puzGetCopyright :: (Puz) -> IO ((String))
puzGetCopyright a1 =
  puzIn a1 $ \a1' -> 
  puzGetCopyright'_ a1' >>= \res ->
  stringOut res >>= \res' ->
  return (res')
{-# LINE 247 "./Codec/Game/Puz/Internal.chs" #-}

puzSetCopyright :: (Puz) -> (String) -> IO ()
puzSetCopyright a1 a2 =
  puzIn a1 $ \a1' -> 
  stringIn a2 $ \a2' -> 
  puzSetCopyright'_ a1' a2' >>= \res ->
  return ()
{-# LINE 254 "./Codec/Game/Puz/Internal.chs" #-}


puzGetClueCount :: (Puz) -> IO ((Int))
puzGetClueCount a1 =
  puzIn a1 $ \a1' -> 
  puzGetClueCount'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 259 "./Codec/Game/Puz/Internal.chs" #-}

puzSetClueCount :: (Puz) -> (Int) -> IO ()
puzSetClueCount a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  puzSetClueCount'_ a1' a2' >>= \res ->
  return ()
{-# LINE 266 "./Codec/Game/Puz/Internal.chs" #-}


puzGetClue :: (Puz) -> (Int) -> IO ((String))
puzGetClue a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  puzGetClue'_ a1' a2' >>= \res ->
  stringOut res >>= \res' ->
  return (res')
{-# LINE 274 "./Codec/Game/Puz/Internal.chs" #-}

puzSetClue :: (Puz) -> (Int) -> (String) -> IO ()
puzSetClue a1 a2 a3 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  stringIn a3 $ \a3' -> 
  puzSetClue'_ a1' a2' a3' >>= \res ->
  return ()
{-# LINE 282 "./Codec/Game/Puz/Internal.chs" #-}


puzGetNotes :: (Puz) -> IO ((String))
puzGetNotes a1 =
  puzIn a1 $ \a1' -> 
  puzGetNotes'_ a1' >>= \res ->
  stringOut res >>= \res' ->
  return (res')
{-# LINE 287 "./Codec/Game/Puz/Internal.chs" #-}

puzSetNotes :: (Puz) -> (String) -> IO ()
puzSetNotes a1 a2 =
  puzIn a1 $ \a1' -> 
  stringIn a2 $ \a2' -> 
  puzSetNotes'_ a1' a2' >>= \res ->
  return ()
{-# LINE 294 "./Codec/Game/Puz/Internal.chs" #-}


puzHasRebus :: (Puz) -> IO ((Bool))
puzHasRebus a1 =
  puzIn a1 $ \a1' -> 
  puzHasRebus'_ a1' >>= \res ->
  let {res' = cintToBool res} in
  return (res')
{-# LINE 299 "./Codec/Game/Puz/Internal.chs" #-}

puzGetRebus :: (Puz) -> IO ((Ptr CUChar))
puzGetRebus a1 =
  puzIn a1 $ \a1' -> 
  puzGetRebus'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 303 "./Codec/Game/Puz/Internal.chs" #-}

puzSetRebus :: (Puz) -> (Ptr CUChar) -> IO ()
puzSetRebus a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = id a2} in 
  puzSetRebus'_ a1' a2' >>= \res ->
  return ()
{-# LINE 310 "./Codec/Game/Puz/Internal.chs" #-}

puzGetRebusCount :: (Puz) -> IO ((Int))
puzGetRebusCount a1 =
  puzIn a1 $ \a1' -> 
  puzGetRebusCount'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 314 "./Codec/Game/Puz/Internal.chs" #-}

puzSetRebusCount :: (Puz) -> (Int) -> IO ()
puzSetRebusCount a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  puzSetRebusCount'_ a1' a2' >>= \res ->
  return ()
{-# LINE 321 "./Codec/Game/Puz/Internal.chs" #-}


puzGetRtbl :: (Puz) -> IO (([(Int,String)]))
puzGetRtbl a1 =
  puzIn a1 $ \a1' -> 
  puzGetRtbl'_ a1' >>= \res ->
  rtblOut res >>= \res' ->
  return (res')
{-# LINE 326 "./Codec/Game/Puz/Internal.chs" #-}
     
puzSetRtbl :: (Puz) -> ([(String,Int)]) -> IO ()
puzSetRtbl a1 a2 =
  puzIn a1 $ \a1' -> 
  rtblIn a2 $ \a2' -> 
  puzSetRtbl'_ a1' a2' >>= \res ->
  return ()
{-# LINE 333 "./Codec/Game/Puz/Internal.chs" #-}


puzHasTimer :: (Puz) -> IO ((Bool))
puzHasTimer a1 =
  puzIn a1 $ \a1' -> 
  puzHasTimer'_ a1' >>= \res ->
  let {res' = cintToBool res} in
  return (res')
{-# LINE 338 "./Codec/Game/Puz/Internal.chs" #-}

-- XXX these next two ignore errors
puzGetTimerElapsed :: (Puz) -> IO ((Int))
puzGetTimerElapsed a1 =
  puzIn a1 $ \a1' -> 
  puzGetTimerElapsed'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 343 "./Codec/Game/Puz/Internal.chs" #-}

puzGetTimerStopped :: (Puz) -> IO ((Bool))
puzGetTimerStopped a1 =
  puzIn a1 $ \a1' -> 
  puzGetTimerStopped'_ a1' >>= \res ->
  let {res' = cintToBool res} in
  return (res')
{-# LINE 347 "./Codec/Game/Puz/Internal.chs" #-}

puzSetTimer :: (Puz) -> (Int) -> (Bool) -> IO ()
puzSetTimer a1 a2 a3 =
  puzIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  let {a3' = boolToCInt a3} in 
  puzSetTimer'_ a1' a2' a3' >>= \res ->
  return ()
{-# LINE 355 "./Codec/Game/Puz/Internal.chs" #-}


puzHasExtras :: (Puz) -> IO ((Bool))
puzHasExtras a1 =
  puzIn a1 $ \a1' -> 
  puzHasExtras'_ a1' >>= \res ->
  let {res' = cintToBool res} in
  return (res')
{-# LINE 360 "./Codec/Game/Puz/Internal.chs" #-}

puzGetExtras :: (Puz) -> IO ((Ptr CUChar))
puzGetExtras a1 =
  puzIn a1 $ \a1' -> 
  puzGetExtras'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 364 "./Codec/Game/Puz/Internal.chs" #-}

puzSetExtras :: (Puz) -> (Ptr CUChar) -> IO ()
puzSetExtras a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = id a2} in 
  puzSetExtras'_ a1' a2' >>= \res ->
  return ()
{-# LINE 371 "./Codec/Game/Puz/Internal.chs" #-}


puzHasRusr :: (Puz) -> IO ((Bool))
puzHasRusr a1 =
  puzIn a1 $ \a1' -> 
  puzHasRusr'_ a1' >>= \res ->
  let {res' = cintToBool res} in
  return (res')
{-# LINE 376 "./Codec/Game/Puz/Internal.chs" #-}

puzGetRusr :: (Puz) -> IO ((Ptr (Ptr CUChar)))
puzGetRusr a1 =
  puzIn a1 $ \a1' -> 
  puzGetRusr'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 380 "./Codec/Game/Puz/Internal.chs" #-}

puzSetRusr :: (Puz) -> ([Maybe String]) -> IO ()
puzSetRusr a1 a2 =
  puzIn a1 $ \a1' -> 
  rusrIn a2 $ \a2' -> 
  puzSetRusr'_ a1' a2' >>= \res ->
  return ()
{-# LINE 387 "./Codec/Game/Puz/Internal.chs" #-}


puzIsLockedGet :: (Puz) -> IO ((Bool))
puzIsLockedGet a1 =
  puzIn a1 $ \a1' -> 
  puzIsLockedGet'_ a1' >>= \res ->
  let {res' = cintToBool res} in
  return (res')
{-# LINE 392 "./Codec/Game/Puz/Internal.chs" #-}

puzLockedCksumGet :: (Puz) -> IO ((CUShort))
puzLockedCksumGet a1 =
  puzIn a1 $ \a1' -> 
  puzLockedCksumGet'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 396 "./Codec/Game/Puz/Internal.chs" #-}

puzLockSet :: (Puz) -> (CUShort) -> IO ()
puzLockSet a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = id a2} in 
  puzLockSet'_ a1' a2' >>= \res ->
  return ()
{-# LINE 403 "./Codec/Game/Puz/Internal.chs" #-}


puzCksumString :: (String) -> (Int) -> IO ((CUShort))
puzCksumString a1 a2 =
  stringIn a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  zeroShortIn $ \a3' -> 
  puzCksumString'_ a1' a2' a3' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 412 "./Codec/Game/Puz/Internal.chs" #-}

puzUnlockSolution :: (Puz) -> (CUShort) -> IO ((Bool))
puzUnlockSolution a1 a2 =
  puzIn a1 $ \a1' -> 
  let {a2' = id a2} in 
  puzUnlockSolution'_ a1' a2' >>= \res ->
  let {res' = cerrToBool res} in
  return (res')
{-# LINE 419 "./Codec/Game/Puz/Internal.chs" #-}

puzBruteForceUnlock :: (Puz) -> IO ((Maybe Int))
puzBruteForceUnlock a1 =
  puzIn a1 $ \a1' -> 
  puzBruteForceUnlock'_ a1' >>= \res ->
  let {res' = bruteForceOut res} in
  return (res')
{-# LINE 425 "./Codec/Game/Puz/Internal.chs" #-}

--{# fun puz_deep_free as puzDeepFree
--   { id `Ptr Puz' }
--   ->
--   `()'
-- #}

------
------ C2HS stuff - why isn't there a C2HS module
------

cIntConv :: (Integral a, Integral b) => a -> b
cIntConv  = fromIntegral

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_init"
  puzCreate'_ :: ((Ptr (Puz)) -> (IO (Ptr (Puz))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_load"
  puzLoad'_ :: ((Ptr (Puz)) -> (CInt -> ((Ptr CUChar) -> (CInt -> (IO (Ptr (Puz)))))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_save"
  puzSave'_ :: ((Ptr (Puz)) -> (CInt -> ((Ptr CUChar) -> (CInt -> (IO CInt)))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_size"
  puzSize'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_cksums_calc"
  puzCksumsCalc'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_cksums_check"
  puzCksumsCheck'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_cksums_commit"
  puzCksumsCommit'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_width_get"
  puzGetWidth'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_width_set"
  puzSetWidth'_ :: ((Ptr (Puz)) -> (CUChar -> (IO CInt)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_height_get"
  puzGetHeight'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_height_set"
  puzSetHeight'_ :: ((Ptr (Puz)) -> (CUChar -> (IO CInt)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_solution_get"
  puzGetSolution'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_solution_set"
  puzSetSolution'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_grid_get"
  puzGetGrid'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_grid_set"
  puzSetGrid'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_title_get"
  puzGetTitle'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_title_set"
  puzSetTitle'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_author_get"
  puzGetAuthor'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_author_set"
  puzSetAuthor'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_copyright_get"
  puzGetCopyright'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_copyright_set"
  puzSetCopyright'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_clue_count_get"
  puzGetClueCount'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_clue_count_set"
  puzSetClueCount'_ :: ((Ptr (Puz)) -> (CInt -> (IO CInt)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_clue_get"
  puzGetClue'_ :: ((Ptr (Puz)) -> (CInt -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_clue_set"
  puzSetClue'_ :: ((Ptr (Puz)) -> (CInt -> ((Ptr CUChar) -> (IO (Ptr CUChar)))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_notes_get"
  puzGetNotes'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_notes_set"
  puzSetNotes'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_has_rebus"
  puzHasRebus'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rebus_get"
  puzGetRebus'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rebus_set"
  puzSetRebus'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rebus_count_get"
  puzGetRebusCount'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rebus_count_set"
  puzSetRebusCount'_ :: ((Ptr (Puz)) -> (CInt -> (IO CInt)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rtblstr_get"
  puzGetRtbl'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rtblstr_set"
  puzSetRtbl'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr (Ptr CUChar)))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_has_timer"
  puzHasTimer'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_timer_elapsed_get"
  puzGetTimerElapsed'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_timer_stopped_get"
  puzGetTimerStopped'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_timer_set"
  puzSetTimer'_ :: ((Ptr (Puz)) -> (CInt -> (CInt -> (IO (Ptr CUChar)))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_has_extras"
  puzHasExtras'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_extras_get"
  puzGetExtras'_ :: ((Ptr (Puz)) -> (IO (Ptr CUChar)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_extras_set"
  puzSetExtras'_ :: ((Ptr (Puz)) -> ((Ptr CUChar) -> (IO (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_has_rusr"
  puzHasRusr'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rusr_get"
  puzGetRusr'_ :: ((Ptr (Puz)) -> (IO (Ptr (Ptr CUChar))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_rusr_set"
  puzSetRusr'_ :: ((Ptr (Puz)) -> ((Ptr (Ptr CUChar)) -> (IO (Ptr (Ptr CUChar)))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_is_locked_get"
  puzIsLockedGet'_ :: ((Ptr (Puz)) -> (IO CInt))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_locked_cksum_get"
  puzLockedCksumGet'_ :: ((Ptr (Puz)) -> (IO CUShort))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_lock_set"
  puzLockSet'_ :: ((Ptr (Puz)) -> (CUShort -> (IO CUShort)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_cksum_region"
  puzCksumString'_ :: ((Ptr CUChar) -> (CInt -> (CUShort -> (IO CUShort))))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_unlock_solution"
  puzUnlockSolution'_ :: ((Ptr (Puz)) -> (CUShort -> (IO CInt)))

foreign import ccall safe "Codec/Game/Puz/Internal.chs.h puz_brute_force_unlock"
  puzBruteForceUnlock'_ :: ((Ptr (Puz)) -> (IO CInt))