packages feed

hscurses 1.2 → 1.3

raw patch · 33 files changed

+3771/−9798 lines, 33 filesdep +old-localedep +old-timedep −haskell98setup-changedPVP ok

version bump matches the API change (PVP)

Dependencies added: old-locale, old-time

Dependencies removed: haskell98

API changes (from Hackage documentation)

- HSCurses.Curses: ButtonAlt :: ButtonEvent
- HSCurses.Curses: ButtonClicked :: Int -> ButtonEvent
- HSCurses.Curses: ButtonControl :: ButtonEvent
- HSCurses.Curses: ButtonDoubleClicked :: Int -> ButtonEvent
- HSCurses.Curses: ButtonPressed :: Int -> ButtonEvent
- HSCurses.Curses: ButtonReleased :: Int -> ButtonEvent
- HSCurses.Curses: ButtonShift :: ButtonEvent
- HSCurses.Curses: ButtonTripleClicked :: Int -> ButtonEvent
- HSCurses.Curses: Color :: Int -> Color
- HSCurses.Curses: CursorInvisible :: CursorVisibility
- HSCurses.Curses: CursorVeryVisible :: CursorVisibility
- HSCurses.Curses: CursorVisible :: CursorVisibility
- HSCurses.Curses: KeyA1 :: Key
- HSCurses.Curses: KeyA3 :: Key
- HSCurses.Curses: KeyB2 :: Key
- HSCurses.Curses: KeyBTab :: Key
- HSCurses.Curses: KeyBackspace :: Key
- HSCurses.Curses: KeyBeg :: Key
- HSCurses.Curses: KeyBreak :: Key
- HSCurses.Curses: KeyC1 :: Key
- HSCurses.Curses: KeyC3 :: Key
- HSCurses.Curses: KeyCATab :: Key
- HSCurses.Curses: KeyCTab :: Key
- HSCurses.Curses: KeyCancel :: Key
- HSCurses.Curses: KeyChar :: Char -> Key
- HSCurses.Curses: KeyClear :: Key
- HSCurses.Curses: KeyClose :: Key
- HSCurses.Curses: KeyCommand :: Key
- HSCurses.Curses: KeyCopy :: Key
- HSCurses.Curses: KeyCreate :: Key
- HSCurses.Curses: KeyDC :: Key
- HSCurses.Curses: KeyDL :: Key
- HSCurses.Curses: KeyDown :: Key
- HSCurses.Curses: KeyEIC :: Key
- HSCurses.Curses: KeyEOL :: Key
- HSCurses.Curses: KeyEOS :: Key
- HSCurses.Curses: KeyEnd :: Key
- HSCurses.Curses: KeyEnter :: Key
- HSCurses.Curses: KeyExit :: Key
- HSCurses.Curses: KeyF :: Int -> Key
- HSCurses.Curses: KeyFind :: Key
- HSCurses.Curses: KeyHelp :: Key
- HSCurses.Curses: KeyHome :: Key
- HSCurses.Curses: KeyIC :: Key
- HSCurses.Curses: KeyIL :: Key
- HSCurses.Curses: KeyLL :: Key
- HSCurses.Curses: KeyLeft :: Key
- HSCurses.Curses: KeyMark :: Key
- HSCurses.Curses: KeyMessage :: Key
- HSCurses.Curses: KeyMouse :: Key
- HSCurses.Curses: KeyMove :: Key
- HSCurses.Curses: KeyNPage :: Key
- HSCurses.Curses: KeyNext :: Key
- HSCurses.Curses: KeyOpen :: Key
- HSCurses.Curses: KeyOptions :: Key
- HSCurses.Curses: KeyPPage :: Key
- HSCurses.Curses: KeyPrevious :: Key
- HSCurses.Curses: KeyPrint :: Key
- HSCurses.Curses: KeyRedo :: Key
- HSCurses.Curses: KeyReference :: Key
- HSCurses.Curses: KeyRefresh :: Key
- HSCurses.Curses: KeyReplace :: Key
- HSCurses.Curses: KeyReset :: Key
- HSCurses.Curses: KeyResize :: Key
- HSCurses.Curses: KeyRestart :: Key
- HSCurses.Curses: KeyResume :: Key
- HSCurses.Curses: KeyRight :: Key
- HSCurses.Curses: KeySBeg :: Key
- HSCurses.Curses: KeySCancel :: Key
- HSCurses.Curses: KeySCommand :: Key
- HSCurses.Curses: KeySCopy :: Key
- HSCurses.Curses: KeySCreate :: Key
- HSCurses.Curses: KeySDC :: Key
- HSCurses.Curses: KeySDL :: Key
- HSCurses.Curses: KeySEOL :: Key
- HSCurses.Curses: KeySEnd :: Key
- HSCurses.Curses: KeySExit :: Key
- HSCurses.Curses: KeySF :: Key
- HSCurses.Curses: KeySFind :: Key
- HSCurses.Curses: KeySHelp :: Key
- HSCurses.Curses: KeySHome :: Key
- HSCurses.Curses: KeySIC :: Key
- HSCurses.Curses: KeySLeft :: Key
- HSCurses.Curses: KeySMessage :: Key
- HSCurses.Curses: KeySMove :: Key
- HSCurses.Curses: KeySNext :: Key
- HSCurses.Curses: KeySOptions :: Key
- HSCurses.Curses: KeySPrevious :: Key
- HSCurses.Curses: KeySPrint :: Key
- HSCurses.Curses: KeySR :: Key
- HSCurses.Curses: KeySRedo :: Key
- HSCurses.Curses: KeySReplace :: Key
- HSCurses.Curses: KeySReset :: Key
- HSCurses.Curses: KeySRight :: Key
- HSCurses.Curses: KeySRsume :: Key
- HSCurses.Curses: KeySSave :: Key
- HSCurses.Curses: KeySSuspend :: Key
- HSCurses.Curses: KeySTab :: Key
- HSCurses.Curses: KeySUndo :: Key
- HSCurses.Curses: KeySave :: Key
- HSCurses.Curses: KeySelect :: Key
- HSCurses.Curses: KeySuspend :: Key
- HSCurses.Curses: KeyUndo :: Key
- HSCurses.Curses: KeyUnknown :: Int -> Key
- HSCurses.Curses: KeyUp :: Key
- HSCurses.Curses: MouseEvent :: Int -> Int -> Int -> Int -> [ButtonEvent] -> MouseEvent
- HSCurses.Curses: Pair :: Int -> Pair
- HSCurses.Curses: addLn :: IO ()
- HSCurses.Curses: attr0 :: Attr
- HSCurses.Curses: attrBold :: Int
- HSCurses.Curses: attrBoldOff :: IO ()
- HSCurses.Curses: attrBoldOn :: IO ()
- HSCurses.Curses: attrDim :: Int
- HSCurses.Curses: attrDimOff :: IO ()
- HSCurses.Curses: attrDimOn :: IO ()
- HSCurses.Curses: attrOff :: Attr -> IO ()
- HSCurses.Curses: attrOn :: Attr -> IO ()
- HSCurses.Curses: attrPlus :: Attr -> Attr -> Attr
- HSCurses.Curses: attrSet :: Attr -> Pair -> IO ()
- HSCurses.Curses: bTee :: Char
- HSCurses.Curses: beep :: IO ()
- HSCurses.Curses: bkgrndSet :: Attr -> Pair -> IO ()
- HSCurses.Curses: block :: Char
- HSCurses.Curses: board :: Char
- HSCurses.Curses: bullet :: Char
- HSCurses.Curses: cBreak :: Bool -> IO ()
- HSCurses.Curses: canChangeColor :: IO Bool
- HSCurses.Curses: ckBoard :: Char
- HSCurses.Curses: clearOk :: Bool -> IO CInt
- HSCurses.Curses: clrToEol :: IO ()
- HSCurses.Curses: color :: String -> Maybe Color
- HSCurses.Curses: colorContent :: Color -> IO (Int, Int, Int)
- HSCurses.Curses: colorPairs :: IO Int
- HSCurses.Curses: colors :: IO Int
- HSCurses.Curses: cursSet :: CursorVisibility -> IO CursorVisibility
- HSCurses.Curses: cursesSigWinch :: Maybe Signal
- HSCurses.Curses: cursesTest :: IO ()
- HSCurses.Curses: dArrow :: Char
- HSCurses.Curses: data Attr
- HSCurses.Curses: data ButtonEvent
- HSCurses.Curses: data CursorVisibility
- HSCurses.Curses: data Key
- HSCurses.Curses: data MouseEvent
- HSCurses.Curses: decodeKey :: CInt -> Key
- HSCurses.Curses: defaultBackground :: Color
- HSCurses.Curses: defaultForeground :: Color
- HSCurses.Curses: degree :: Char
- HSCurses.Curses: delWin :: Window -> IO ()
- HSCurses.Curses: diamond :: Char
- HSCurses.Curses: echo :: Bool -> IO ()
- HSCurses.Curses: endWin :: IO ()
- HSCurses.Curses: erase :: IO ()
- HSCurses.Curses: flushinp :: IO CInt
- HSCurses.Curses: gEqual :: Char
- HSCurses.Curses: getCh :: IO Key
- HSCurses.Curses: getYX :: Window -> IO (Int, Int)
- HSCurses.Curses: getch :: IO CInt
- HSCurses.Curses: hLine :: Char
- HSCurses.Curses: hasColors :: IO Bool
- HSCurses.Curses: initColor :: Color -> (Int, Int, Int) -> IO ()
- HSCurses.Curses: initCurses :: IO ()
- HSCurses.Curses: initPair :: Pair -> Color -> Color -> IO ()
- HSCurses.Curses: initScr :: IO Window
- HSCurses.Curses: instance Bits Attr
- HSCurses.Curses: instance Eq Attr
- HSCurses.Curses: instance Eq ButtonEvent
- HSCurses.Curses: instance Eq Color
- HSCurses.Curses: instance Eq Key
- HSCurses.Curses: instance Eq Pair
- HSCurses.Curses: instance Ix Color
- HSCurses.Curses: instance Ix Pair
- HSCurses.Curses: instance Num Attr
- HSCurses.Curses: instance Ord Color
- HSCurses.Curses: instance Ord Pair
- HSCurses.Curses: instance Show Attr
- HSCurses.Curses: instance Show ButtonEvent
- HSCurses.Curses: instance Show Key
- HSCurses.Curses: instance Show MouseEvent
- HSCurses.Curses: instance Show Pair
- HSCurses.Curses: instance Storable Attr
- HSCurses.Curses: intrFlush :: Bool -> IO ()
- HSCurses.Curses: isAltCharset :: Attr -> Bool
- HSCurses.Curses: isBlink :: Attr -> Bool
- HSCurses.Curses: isBold :: Attr -> Bool
- HSCurses.Curses: isDim :: Attr -> Bool
- HSCurses.Curses: isHorizontal :: Attr -> Bool
- HSCurses.Curses: isInvis :: Attr -> Bool
- HSCurses.Curses: isLeft :: Attr -> Bool
- HSCurses.Curses: isLow :: Attr -> Bool
- HSCurses.Curses: isProtect :: Attr -> Bool
- HSCurses.Curses: isReverse :: Attr -> Bool
- HSCurses.Curses: isRight :: Attr -> Bool
- HSCurses.Curses: isStandout :: Attr -> Bool
- HSCurses.Curses: isTop :: Attr -> Bool
- HSCurses.Curses: isUnderline :: Attr -> Bool
- HSCurses.Curses: isVertical :: Attr -> Bool
- HSCurses.Curses: keyResizeCode :: Maybe CInt
- HSCurses.Curses: keypad :: Window -> Bool -> IO ()
- HSCurses.Curses: lArrow :: Char
- HSCurses.Curses: lEqual :: Char
- HSCurses.Curses: lTee :: Char
- HSCurses.Curses: lantern :: Char
- HSCurses.Curses: leaveOk :: Bool -> IO CInt
- HSCurses.Curses: llCorner :: Char
- HSCurses.Curses: lrCorner :: Char
- HSCurses.Curses: mouseEventButton :: MouseEvent -> [ButtonEvent]
- HSCurses.Curses: mouseEventId :: MouseEvent -> Int
- HSCurses.Curses: mouseEventX :: MouseEvent -> Int
- HSCurses.Curses: mouseEventY :: MouseEvent -> Int
- HSCurses.Curses: mouseEventZ :: MouseEvent -> Int
- HSCurses.Curses: move :: Int -> Int -> IO ()
- HSCurses.Curses: mvWAddStr :: Window -> Int -> Int -> String -> IO ()
- HSCurses.Curses: nEqual :: Char
- HSCurses.Curses: newPad :: Int -> Int -> IO Window
- HSCurses.Curses: newWin :: Int -> Int -> Int -> Int -> IO Window
- HSCurses.Curses: newtype Color
- HSCurses.Curses: newtype Pair
- HSCurses.Curses: nl :: Bool -> IO ()
- HSCurses.Curses: noDelay :: Window -> Bool -> IO ()
- HSCurses.Curses: pRefresh :: Window -> Int -> Int -> Int -> Int -> Int -> Int -> IO ()
- HSCurses.Curses: pairContent :: Pair -> IO (Color, Color)
- HSCurses.Curses: pi :: Char
- HSCurses.Curses: plMinus :: Char
- HSCurses.Curses: plus :: Char
- HSCurses.Curses: rArrow :: Char
- HSCurses.Curses: rTee :: Char
- HSCurses.Curses: raw :: Bool -> IO ()
- HSCurses.Curses: recognize :: Char -> IO a -> ((Word32) -> IO a) -> IO a
- HSCurses.Curses: refresh :: IO ()
- HSCurses.Curses: resetParams :: IO ()
- HSCurses.Curses: resizeTerminal :: Int -> Int -> IO ()
- HSCurses.Curses: s1 :: Char
- HSCurses.Curses: s3 :: Char
- HSCurses.Curses: s7 :: Char
- HSCurses.Curses: s9 :: Char
- HSCurses.Curses: scrSize :: IO (Int, Int)
- HSCurses.Curses: setAltCharset :: Attr -> Bool -> Attr
- HSCurses.Curses: setBlink :: Attr -> Bool -> Attr
- HSCurses.Curses: setBold :: Attr -> Bool -> Attr
- HSCurses.Curses: setDim :: Attr -> Bool -> Attr
- HSCurses.Curses: setHorizontal :: Attr -> Bool -> Attr
- HSCurses.Curses: setInvis :: Attr -> Bool -> Attr
- HSCurses.Curses: setLeft :: Attr -> Bool -> Attr
- HSCurses.Curses: setLow :: Attr -> Bool -> Attr
- HSCurses.Curses: setProtect :: Attr -> Bool -> Attr
- HSCurses.Curses: setReverse :: Attr -> Bool -> Attr
- HSCurses.Curses: setRight :: Attr -> Bool -> Attr
- HSCurses.Curses: setStandout :: Attr -> Bool -> Attr
- HSCurses.Curses: setTop :: Attr -> Bool -> Attr
- HSCurses.Curses: setUnderline :: Attr -> Bool -> Attr
- HSCurses.Curses: setVertical :: Attr -> Bool -> Attr
- HSCurses.Curses: standend :: IO Int
- HSCurses.Curses: standout :: IO Int
- HSCurses.Curses: startColor :: IO ()
- HSCurses.Curses: stdScr :: Window
- HSCurses.Curses: sterling :: Char
- HSCurses.Curses: tTee :: Char
- HSCurses.Curses: throwIfErr :: (Num a) => String -> IO a -> IO a
- HSCurses.Curses: throwIfErr_ :: (Num a) => String -> IO a -> IO ()
- HSCurses.Curses: touchWin :: Window -> IO ()
- HSCurses.Curses: type Window = Ptr WindowTag
- HSCurses.Curses: uArrow :: Char
- HSCurses.Curses: ulCorner :: Char
- HSCurses.Curses: ungetCh :: (Integral a) => a -> IO ()
- HSCurses.Curses: update :: IO ()
- HSCurses.Curses: urCorner :: Char
- HSCurses.Curses: useDefaultColors :: IO ()
- HSCurses.Curses: vLine :: Char
- HSCurses.Curses: vline :: Char -> Int -> IO ()
- HSCurses.Curses: wAddStr :: Window -> [Char] -> IO ()
- HSCurses.Curses: wAttrGet :: Window -> IO (Attr, Pair)
- HSCurses.Curses: wAttrOff :: Window -> Int -> IO ()
- HSCurses.Curses: wAttrOn :: Window -> Int -> IO ()
- HSCurses.Curses: wAttrSet :: Window -> (Attr, Pair) -> IO ()
- HSCurses.Curses: wClrToEol :: Window -> IO ()
- HSCurses.Curses: wMove :: Window -> Int -> Int -> IO ()
- HSCurses.Curses: waddch :: Window -> (Word32) -> IO CInt
- HSCurses.Curses: wclear :: Window -> IO ()
- HSCurses.Curses: withMouseEventMask :: (MonadIO m) => [ButtonEvent] -> m a -> m a
- HSCurses.CursesHelper: AttributeStyle :: [Attribute] -> ForegroundColor -> BackgroundColor -> Style
- HSCurses.CursesHelper: BlackB :: BackgroundColor
- HSCurses.CursesHelper: BlackF :: ForegroundColor
- HSCurses.CursesHelper: Blink :: Attribute
- HSCurses.CursesHelper: BlueF :: ForegroundColor
- HSCurses.CursesHelper: Bold :: Attribute
- HSCurses.CursesHelper: BrightWhiteF :: ForegroundColor
- HSCurses.CursesHelper: BrownB :: BackgroundColor
- HSCurses.CursesHelper: BrownF :: ForegroundColor
- HSCurses.CursesHelper: ColorlessStyle :: [Attribute] -> Style
- HSCurses.CursesHelper: CyanF :: ForegroundColor
- HSCurses.CursesHelper: DarkBlueB :: BackgroundColor
- HSCurses.CursesHelper: DarkBlueF :: ForegroundColor
- HSCurses.CursesHelper: DarkCyanB :: BackgroundColor
- HSCurses.CursesHelper: DarkCyanF :: ForegroundColor
- HSCurses.CursesHelper: DarkGreenB :: BackgroundColor
- HSCurses.CursesHelper: DarkGreenF :: ForegroundColor
- HSCurses.CursesHelper: DarkRedB :: BackgroundColor
- HSCurses.CursesHelper: DarkRedF :: ForegroundColor
- HSCurses.CursesHelper: DefaultB :: BackgroundColor
- HSCurses.CursesHelper: DefaultF :: ForegroundColor
- HSCurses.CursesHelper: Dim :: Attribute
- HSCurses.CursesHelper: GreenF :: ForegroundColor
- HSCurses.CursesHelper: GreyF :: ForegroundColor
- HSCurses.CursesHelper: MagentaF :: ForegroundColor
- HSCurses.CursesHelper: PurpleB :: BackgroundColor
- HSCurses.CursesHelper: PurpleF :: ForegroundColor
- HSCurses.CursesHelper: RedF :: ForegroundColor
- HSCurses.CursesHelper: Reverse :: Attribute
- HSCurses.CursesHelper: Style :: ForegroundColor -> BackgroundColor -> Style
- HSCurses.CursesHelper: Underline :: Attribute
- HSCurses.CursesHelper: WhiteB :: BackgroundColor
- HSCurses.CursesHelper: WhiteF :: ForegroundColor
- HSCurses.CursesHelper: YellowF :: ForegroundColor
- HSCurses.CursesHelper: black :: Color
- HSCurses.CursesHelper: blue :: Color
- HSCurses.CursesHelper: changeCursesStyle :: CursesStyle -> [Attribute] -> CursesStyle
- HSCurses.CursesHelper: convertAttributes :: [Attribute] -> Attr
- HSCurses.CursesHelper: convertStyles :: [Style] -> IO [CursesStyle]
- HSCurses.CursesHelper: cyan :: Color
- HSCurses.CursesHelper: data Attribute
- HSCurses.CursesHelper: data BackgroundColor
- HSCurses.CursesHelper: data CursesStyle
- HSCurses.CursesHelper: data ForegroundColor
- HSCurses.CursesHelper: data Style
- HSCurses.CursesHelper: defaultColor :: Color
- HSCurses.CursesHelper: defaultCursesStyle :: CursesStyle
- HSCurses.CursesHelper: defaultStyle :: Style
- HSCurses.CursesHelper: displayKey :: Key -> String
- HSCurses.CursesHelper: drawCursor :: (Int, Int) -> (Int, Int) -> IO ()
- HSCurses.CursesHelper: drawLine :: Int -> String -> IO ()
- HSCurses.CursesHelper: end :: IO ()
- HSCurses.CursesHelper: getKey :: (MonadIO m) => m () -> m Key
- HSCurses.CursesHelper: gotoTop :: IO ()
- HSCurses.CursesHelper: green :: Color
- HSCurses.CursesHelper: instance Eq Attribute
- HSCurses.CursesHelper: instance Eq BackgroundColor
- HSCurses.CursesHelper: instance Eq CursesStyle
- HSCurses.CursesHelper: instance Eq ForegroundColor
- HSCurses.CursesHelper: instance Eq Style
- HSCurses.CursesHelper: instance Show Attribute
- HSCurses.CursesHelper: instance Show BackgroundColor
- HSCurses.CursesHelper: instance Show CursesStyle
- HSCurses.CursesHelper: instance Show ForegroundColor
- HSCurses.CursesHelper: instance Show Style
- HSCurses.CursesHelper: magenta :: Color
- HSCurses.CursesHelper: mkCursesStyle :: [Attribute] -> CursesStyle
- HSCurses.CursesHelper: red :: Color
- HSCurses.CursesHelper: resetStyle :: IO ()
- HSCurses.CursesHelper: resizeui :: IO (Int, Int)
- HSCurses.CursesHelper: setStyle :: CursesStyle -> IO ()
- HSCurses.CursesHelper: start :: IO ()
- HSCurses.CursesHelper: suspend :: IO ()
- HSCurses.CursesHelper: white :: Color
- HSCurses.CursesHelper: withCursor :: (MonadExcIO m) => CursorVisibility -> m a -> m a
- HSCurses.CursesHelper: withProgram :: (MonadExcIO m) => m a -> m a
- HSCurses.CursesHelper: withStyle :: (MonadExcIO m) => CursesStyle -> m a -> m a
- HSCurses.CursesHelper: yellow :: Color
- HSCurses.Logging: debug :: (MonadIO m) => String -> m ()
- HSCurses.Logging: trace :: String -> a -> a
- HSCurses.MonadException: blockM :: (MonadExc m) => m a -> m a
- HSCurses.MonadException: bracketM :: (MonadExc m) => m a -> (a -> m b) -> (a -> m c) -> m c
- HSCurses.MonadException: bracketM_ :: (MonadExc m) => m a -> m b -> m c -> m c
- HSCurses.MonadException: catchDynM :: (MonadExc m, Typeable exc) => m a -> (exc -> m a) -> m a
- HSCurses.MonadException: catchJustM :: (MonadExc m) => (Exception -> Maybe b) -> m a -> (b -> m a) -> m a
- HSCurses.MonadException: catchM :: (MonadExc m) => m a -> (Exception -> m a) -> m a
- HSCurses.MonadException: class (Monad m) => MonadExc m
- HSCurses.MonadException: class (MonadIO m, MonadExc m) => MonadExcIO m
- HSCurses.MonadException: finally :: IO a -> IO b -> IO a
- HSCurses.MonadException: handleJustM :: (MonadExc m) => (Exception -> Maybe b) -> (b -> m a) -> m a -> m a
- HSCurses.MonadException: handleM :: (MonadExc m) => (Exception -> m a) -> m a -> m a
- HSCurses.MonadException: instance (MonadExc m) => MonadExc (StateT s m)
- HSCurses.MonadException: instance (MonadExc m, MonadIO m) => MonadExcIO (StateT s m)
- HSCurses.MonadException: instance MonadExc IO
- HSCurses.MonadException: instance MonadExcIO IO
- HSCurses.MonadException: modifyState :: (MonadExc m) => (s -> m (a, s)) -> StateT s m a
- HSCurses.MonadException: tryJustM :: (MonadExc m) => (Exception -> Maybe b) -> m a -> m (Either b a)
- HSCurses.MonadException: tryM :: (MonadExc m) => m a -> m (Either Exception a)
- HSCurses.MonadException: unblockM :: (MonadExc m) => m a -> m a
- HSCurses.Widgets: ActiveTableCell :: w -> TableCell
- HSCurses.Widgets: AlignCenter :: HAlignment
- HSCurses.Widgets: AlignLeft :: HAlignment
- HSCurses.Widgets: AlignRight :: HAlignment
- HSCurses.Widgets: Cont :: a -> Cont a
- HSCurses.Widgets: DHActive :: DrawingHint
- HSCurses.Widgets: DHFocus :: DrawingHint
- HSCurses.Widgets: DHNormal :: DrawingHint
- HSCurses.Widgets: DStyle :: CursesStyle -> CursesStyle -> CursesStyle -> DrawingStyle
- HSCurses.Widgets: DirDown :: Direction
- HSCurses.Widgets: DirLeft :: Direction
- HSCurses.Widgets: DirRight :: Direction
- HSCurses.Widgets: DirUp :: Direction
- HSCurses.Widgets: Done :: a -> Cont a
- HSCurses.Widgets: EWOptions :: [(Key, KeyHandler EditWidget)] -> Int -> DrawingStyle -> EditWidgetOptions
- HSCurses.Widgets: EditWidget :: String -> Int -> Int -> [String] -> Int -> Maybe String -> EditWidgetOptions -> EditWidget
- HSCurses.Widgets: EmptyWidget :: Size -> EmptyWidget
- HSCurses.Widgets: First :: FillRow
- HSCurses.Widgets: Last :: FillRow
- HSCurses.Widgets: None :: FillRow
- HSCurses.Widgets: OpaqueWidget :: Size -> OpaqueWidget
- HSCurses.Widgets: TBWDisplayInfo :: Int -> Int -> Int -> Int -> [Row] -> Int -> [Int] -> [Int] -> Maybe (Int, Size) -> TableWidgetDisplayInfo
- HSCurses.Widgets: TBWOptions :: Maybe Int -> FillRow -> [Int] -> Size -> TableWidgetOptions
- HSCurses.Widgets: TWOptions :: TextWidgetSize -> DrawingStyle -> HAlignment -> TextWidgetOptions
- HSCurses.Widgets: TWSizeDefault :: TextWidgetSize
- HSCurses.Widgets: TWSizeFixed :: Size -> TextWidgetSize
- HSCurses.Widgets: TableCell :: w -> TableCell
- HSCurses.Widgets: TableWidget :: [Row] -> Int -> Maybe Pos -> TableWidgetOptions -> TableWidget
- HSCurses.Widgets: TextWidget :: String -> Int -> Int -> TextWidgetOptions -> TextWidget
- HSCurses.Widgets: _activateTableCell :: (MonadExcIO m) => m () -> Pos -> Size -> TableCell -> m (TableCell, String)
- HSCurses.Widgets: _draw :: DrawingHint -> DrawingStyle -> IO a -> IO a
- HSCurses.Widgets: activate :: (ActiveWidget a, MonadExcIO m) => m () -> Pos -> Size -> a -> m (a, String)
- HSCurses.Widgets: activateEditWidget :: (MonadExcIO m) => m () -> Pos -> Size -> EditWidget -> m (EditWidget, String)
- HSCurses.Widgets: align :: HAlignment -> Int -> a -> [a] -> [a]
- HSCurses.Widgets: alignRows :: [[[a]]] -> a -> [a] -> [[a]]
- HSCurses.Widgets: class (Widget a) => ActiveWidget a
- HSCurses.Widgets: class Widget a
- HSCurses.Widgets: data Cont a
- HSCurses.Widgets: data Direction
- HSCurses.Widgets: data DrawingHint
- HSCurses.Widgets: data DrawingStyle
- HSCurses.Widgets: data EditWidget
- HSCurses.Widgets: data EditWidgetOptions
- HSCurses.Widgets: data EmptyWidget
- HSCurses.Widgets: data FillRow
- HSCurses.Widgets: data HAlignment
- HSCurses.Widgets: data OpaqueWidget
- HSCurses.Widgets: data TableCell
- HSCurses.Widgets: data TableWidget
- HSCurses.Widgets: data TableWidgetDisplayInfo
- HSCurses.Widgets: data TableWidgetOptions
- HSCurses.Widgets: data TextWidget
- HSCurses.Widgets: data TextWidgetOptions
- HSCurses.Widgets: data TextWidgetSize
- HSCurses.Widgets: deleteAt :: Int -> [a] -> [a]
- HSCurses.Widgets: draw :: (Widget a) => Pos -> Size -> DrawingHint -> a -> IO ()
- HSCurses.Widgets: drawEditWidget :: Pos -> Size -> DrawingHint -> EditWidget -> IO ()
- HSCurses.Widgets: drawTableWidget :: Pos -> Size -> DrawingHint -> TableWidget -> IO ()
- HSCurses.Widgets: drawTextWidget :: Pos -> Size -> DrawingHint -> TextWidget -> IO ()
- HSCurses.Widgets: dstyle_active :: DrawingStyle -> CursesStyle
- HSCurses.Widgets: dstyle_focus :: DrawingStyle -> CursesStyle
- HSCurses.Widgets: dstyle_normal :: DrawingStyle -> CursesStyle
- HSCurses.Widgets: editWidgetDeleteLeft' :: Pos -> Size -> EditWidget -> EditWidget
- HSCurses.Widgets: editWidgetGoEnd' :: Pos -> Size -> EditWidget -> EditWidget
- HSCurses.Widgets: ew_content :: EditWidget -> String
- HSCurses.Widgets: ew_history :: EditWidget -> [String]
- HSCurses.Widgets: ew_historyIndex :: EditWidget -> Int
- HSCurses.Widgets: ew_historySavedContent :: EditWidget -> Maybe String
- HSCurses.Widgets: ew_options :: EditWidget -> EditWidgetOptions
- HSCurses.Widgets: ew_xcursor :: EditWidget -> Int
- HSCurses.Widgets: ew_xoffset :: EditWidget -> Int
- HSCurses.Widgets: ewopt_keyHandlers :: EditWidgetOptions -> [(Key, KeyHandler EditWidget)]
- HSCurses.Widgets: ewopt_minWidth :: EditWidgetOptions -> Int
- HSCurses.Widgets: ewopt_style :: EditWidgetOptions -> DrawingStyle
- HSCurses.Widgets: findFirstActiveCell :: [Row] -> TableWidgetOptions -> Maybe Pos
- HSCurses.Widgets: findNextActiveCell :: TableWidgetOptions -> Int -> Pos -> Direction -> Maybe Pos
- HSCurses.Widgets: getCellInfo :: Pos -> Size -> TableWidget -> (Int, Int) -> (Pos, Size)
- HSCurses.Widgets: getCellWidget :: TableWidget -> (Int, Int) -> TableCell
- HSCurses.Widgets: getHeight :: Size -> Int
- HSCurses.Widgets: getWidth :: Size -> Int
- HSCurses.Widgets: getXOffset :: Offset -> Int
- HSCurses.Widgets: getXPos :: Pos -> Int
- HSCurses.Widgets: getYOffset :: Offset -> Int
- HSCurses.Widgets: getYPos :: Pos -> Int
- HSCurses.Widgets: instance ActiveWidget EditWidget
- HSCurses.Widgets: instance Eq Direction
- HSCurses.Widgets: instance Eq DrawingHint
- HSCurses.Widgets: instance Eq DrawingStyle
- HSCurses.Widgets: instance Eq FillRow
- HSCurses.Widgets: instance Eq HAlignment
- HSCurses.Widgets: instance Eq TableWidgetOptions
- HSCurses.Widgets: instance Eq TextWidget
- HSCurses.Widgets: instance Eq TextWidgetOptions
- HSCurses.Widgets: instance Eq TextWidgetSize
- HSCurses.Widgets: instance Ord Direction
- HSCurses.Widgets: instance Ord DrawingHint
- HSCurses.Widgets: instance Show Direction
- HSCurses.Widgets: instance Show DrawingHint
- HSCurses.Widgets: instance Show DrawingStyle
- HSCurses.Widgets: instance Show FillRow
- HSCurses.Widgets: instance Show HAlignment
- HSCurses.Widgets: instance Show TableWidgetOptions
- HSCurses.Widgets: instance Show TextWidget
- HSCurses.Widgets: instance Show TextWidgetOptions
- HSCurses.Widgets: instance Show TextWidgetSize
- HSCurses.Widgets: instance Widget EditWidget
- HSCurses.Widgets: instance Widget EmptyWidget
- HSCurses.Widgets: instance Widget OpaqueWidget
- HSCurses.Widgets: instance Widget TableCell
- HSCurses.Widgets: instance Widget TableWidget
- HSCurses.Widgets: instance Widget TextWidget
- HSCurses.Widgets: isActive :: TableCell -> Bool
- HSCurses.Widgets: joinLists :: [[a]] -> [a] -> [a]
- HSCurses.Widgets: listReplace :: [a] -> a -> Int -> [a]
- HSCurses.Widgets: minSize :: (Widget a) => a -> Size
- HSCurses.Widgets: mkDrawingStyle :: CursesStyle -> DrawingStyle
- HSCurses.Widgets: mkKeyHandler :: (Pos -> Size -> a -> a) -> KeyHandler a
- HSCurses.Widgets: newEditWidget :: EditWidgetOptions -> String -> EditWidget
- HSCurses.Widgets: newTableWidget :: TableWidgetOptions -> [Row] -> TableWidget
- HSCurses.Widgets: newTextWidget :: TextWidgetOptions -> String -> TextWidget
- HSCurses.Widgets: scrollBy :: Int -> Int
- HSCurses.Widgets: setCellWidget :: TableWidget -> (Int, Int) -> TableCell -> TableWidget
- HSCurses.Widgets: singletonRow :: TableCell -> Row
- HSCurses.Widgets: splitList :: (Eq a) => [a] -> [a] -> [[a]]
- HSCurses.Widgets: tableWidgetActivateCurrent :: (MonadExcIO m) => m () -> Pos -> Size -> DrawingHint -> TableWidget -> m (TableWidget, Maybe String)
- HSCurses.Widgets: tableWidgetDeleteRow :: Int -> TableWidget -> TableWidget
- HSCurses.Widgets: tableWidgetDisplayInfo :: Size -> TableWidget -> TableWidgetDisplayInfo
- HSCurses.Widgets: tableWidgetGoDown :: Size -> TableWidget -> TableWidget
- HSCurses.Widgets: tableWidgetGoLeft :: Size -> TableWidget -> TableWidget
- HSCurses.Widgets: tableWidgetGoRight :: Size -> TableWidget -> TableWidget
- HSCurses.Widgets: tableWidgetGoUp :: Size -> TableWidget -> TableWidget
- HSCurses.Widgets: tableWidgetScrollDown :: Size -> TableWidget -> TableWidget
- HSCurses.Widgets: tableWidgetScrollUp :: Size -> TableWidget -> TableWidget
- HSCurses.Widgets: tbw_colOffset :: TableWidget -> Int
- HSCurses.Widgets: tbw_options :: TableWidget -> TableWidgetOptions
- HSCurses.Widgets: tbw_pos :: TableWidget -> Maybe Pos
- HSCurses.Widgets: tbw_rows :: TableWidget -> [Row]
- HSCurses.Widgets: tbwdisp_firstVis :: TableWidgetDisplayInfo -> Int
- HSCurses.Widgets: tbwdisp_height :: TableWidgetDisplayInfo -> Int
- HSCurses.Widgets: tbwdisp_heights :: TableWidgetDisplayInfo -> [Int]
- HSCurses.Widgets: tbwdisp_lastVis :: TableWidgetDisplayInfo -> Int
- HSCurses.Widgets: tbwdisp_nrows :: TableWidgetDisplayInfo -> Int
- HSCurses.Widgets: tbwdisp_rightMargin :: TableWidgetDisplayInfo -> Maybe (Int, Size)
- HSCurses.Widgets: tbwdisp_rows :: TableWidgetDisplayInfo -> [Row]
- HSCurses.Widgets: tbwdisp_width :: TableWidgetDisplayInfo -> Int
- HSCurses.Widgets: tbwdisp_widths :: TableWidgetDisplayInfo -> [Int]
- HSCurses.Widgets: tbwopt_activeCols :: TableWidgetOptions -> [Int]
- HSCurses.Widgets: tbwopt_fillCol :: TableWidgetOptions -> Maybe Int
- HSCurses.Widgets: tbwopt_fillRow :: TableWidgetOptions -> FillRow
- HSCurses.Widgets: tbwopt_minSize :: TableWidgetOptions -> Size
- HSCurses.Widgets: textWidgetGetText :: TextWidget -> String
- HSCurses.Widgets: textWidgetScrollDown :: Size -> TextWidget -> TextWidget
- HSCurses.Widgets: textWidgetScrollLeft :: Size -> TextWidget -> TextWidget
- HSCurses.Widgets: textWidgetScrollRight :: Size -> TextWidget -> TextWidget
- HSCurses.Widgets: textWidgetScrollUp :: Size -> TextWidget -> TextWidget
- HSCurses.Widgets: textWidgetSetText :: TextWidget -> String -> TextWidget
- HSCurses.Widgets: tw_options :: TextWidget -> TextWidgetOptions
- HSCurses.Widgets: tw_text :: TextWidget -> String
- HSCurses.Widgets: tw_xoffset :: TextWidget -> Int
- HSCurses.Widgets: tw_yoffset :: TextWidget -> Int
- HSCurses.Widgets: twopt_halign :: TextWidgetOptions -> HAlignment
- HSCurses.Widgets: twopt_size :: TextWidgetOptions -> TextWidgetSize
- HSCurses.Widgets: twopt_style :: TextWidgetOptions -> DrawingStyle
- HSCurses.Widgets: type KeyHandler a = Pos -> Size -> a -> IO (Cont a)
- HSCurses.Widgets: type Offset = (Int, Int)
- HSCurses.Widgets: type Pos = (Int, Int)
- HSCurses.Widgets: type Row = [TableCell]
- HSCurses.Widgets: type Size = (Int, Int)
+ UI.HSCurses.Curses: ButtonAlt :: ButtonEvent
+ UI.HSCurses.Curses: ButtonClicked :: Int -> ButtonEvent
+ UI.HSCurses.Curses: ButtonControl :: ButtonEvent
+ UI.HSCurses.Curses: ButtonDoubleClicked :: Int -> ButtonEvent
+ UI.HSCurses.Curses: ButtonPressed :: Int -> ButtonEvent
+ UI.HSCurses.Curses: ButtonReleased :: Int -> ButtonEvent
+ UI.HSCurses.Curses: ButtonShift :: ButtonEvent
+ UI.HSCurses.Curses: ButtonTripleClicked :: Int -> ButtonEvent
+ UI.HSCurses.Curses: Color :: Int -> Color
+ UI.HSCurses.Curses: CursorInvisible :: CursorVisibility
+ UI.HSCurses.Curses: CursorVeryVisible :: CursorVisibility
+ UI.HSCurses.Curses: CursorVisible :: CursorVisibility
+ UI.HSCurses.Curses: KeyA1 :: Key
+ UI.HSCurses.Curses: KeyA3 :: Key
+ UI.HSCurses.Curses: KeyB2 :: Key
+ UI.HSCurses.Curses: KeyBTab :: Key
+ UI.HSCurses.Curses: KeyBackspace :: Key
+ UI.HSCurses.Curses: KeyBeg :: Key
+ UI.HSCurses.Curses: KeyBreak :: Key
+ UI.HSCurses.Curses: KeyC1 :: Key
+ UI.HSCurses.Curses: KeyC3 :: Key
+ UI.HSCurses.Curses: KeyCATab :: Key
+ UI.HSCurses.Curses: KeyCTab :: Key
+ UI.HSCurses.Curses: KeyCancel :: Key
+ UI.HSCurses.Curses: KeyChar :: Char -> Key
+ UI.HSCurses.Curses: KeyClear :: Key
+ UI.HSCurses.Curses: KeyClose :: Key
+ UI.HSCurses.Curses: KeyCommand :: Key
+ UI.HSCurses.Curses: KeyCopy :: Key
+ UI.HSCurses.Curses: KeyCreate :: Key
+ UI.HSCurses.Curses: KeyDC :: Key
+ UI.HSCurses.Curses: KeyDL :: Key
+ UI.HSCurses.Curses: KeyDown :: Key
+ UI.HSCurses.Curses: KeyEIC :: Key
+ UI.HSCurses.Curses: KeyEOL :: Key
+ UI.HSCurses.Curses: KeyEOS :: Key
+ UI.HSCurses.Curses: KeyEnd :: Key
+ UI.HSCurses.Curses: KeyEnter :: Key
+ UI.HSCurses.Curses: KeyExit :: Key
+ UI.HSCurses.Curses: KeyF :: Int -> Key
+ UI.HSCurses.Curses: KeyFind :: Key
+ UI.HSCurses.Curses: KeyHelp :: Key
+ UI.HSCurses.Curses: KeyHome :: Key
+ UI.HSCurses.Curses: KeyIC :: Key
+ UI.HSCurses.Curses: KeyIL :: Key
+ UI.HSCurses.Curses: KeyLL :: Key
+ UI.HSCurses.Curses: KeyLeft :: Key
+ UI.HSCurses.Curses: KeyMark :: Key
+ UI.HSCurses.Curses: KeyMessage :: Key
+ UI.HSCurses.Curses: KeyMouse :: Key
+ UI.HSCurses.Curses: KeyMove :: Key
+ UI.HSCurses.Curses: KeyNPage :: Key
+ UI.HSCurses.Curses: KeyNext :: Key
+ UI.HSCurses.Curses: KeyOpen :: Key
+ UI.HSCurses.Curses: KeyOptions :: Key
+ UI.HSCurses.Curses: KeyPPage :: Key
+ UI.HSCurses.Curses: KeyPrevious :: Key
+ UI.HSCurses.Curses: KeyPrint :: Key
+ UI.HSCurses.Curses: KeyRedo :: Key
+ UI.HSCurses.Curses: KeyReference :: Key
+ UI.HSCurses.Curses: KeyRefresh :: Key
+ UI.HSCurses.Curses: KeyReplace :: Key
+ UI.HSCurses.Curses: KeyReset :: Key
+ UI.HSCurses.Curses: KeyResize :: Key
+ UI.HSCurses.Curses: KeyRestart :: Key
+ UI.HSCurses.Curses: KeyResume :: Key
+ UI.HSCurses.Curses: KeyRight :: Key
+ UI.HSCurses.Curses: KeySBeg :: Key
+ UI.HSCurses.Curses: KeySCancel :: Key
+ UI.HSCurses.Curses: KeySCommand :: Key
+ UI.HSCurses.Curses: KeySCopy :: Key
+ UI.HSCurses.Curses: KeySCreate :: Key
+ UI.HSCurses.Curses: KeySDC :: Key
+ UI.HSCurses.Curses: KeySDL :: Key
+ UI.HSCurses.Curses: KeySEOL :: Key
+ UI.HSCurses.Curses: KeySEnd :: Key
+ UI.HSCurses.Curses: KeySExit :: Key
+ UI.HSCurses.Curses: KeySF :: Key
+ UI.HSCurses.Curses: KeySFind :: Key
+ UI.HSCurses.Curses: KeySHelp :: Key
+ UI.HSCurses.Curses: KeySHome :: Key
+ UI.HSCurses.Curses: KeySIC :: Key
+ UI.HSCurses.Curses: KeySLeft :: Key
+ UI.HSCurses.Curses: KeySMessage :: Key
+ UI.HSCurses.Curses: KeySMove :: Key
+ UI.HSCurses.Curses: KeySNext :: Key
+ UI.HSCurses.Curses: KeySOptions :: Key
+ UI.HSCurses.Curses: KeySPrevious :: Key
+ UI.HSCurses.Curses: KeySPrint :: Key
+ UI.HSCurses.Curses: KeySR :: Key
+ UI.HSCurses.Curses: KeySRedo :: Key
+ UI.HSCurses.Curses: KeySReplace :: Key
+ UI.HSCurses.Curses: KeySReset :: Key
+ UI.HSCurses.Curses: KeySRight :: Key
+ UI.HSCurses.Curses: KeySRsume :: Key
+ UI.HSCurses.Curses: KeySSave :: Key
+ UI.HSCurses.Curses: KeySSuspend :: Key
+ UI.HSCurses.Curses: KeySTab :: Key
+ UI.HSCurses.Curses: KeySUndo :: Key
+ UI.HSCurses.Curses: KeySave :: Key
+ UI.HSCurses.Curses: KeySelect :: Key
+ UI.HSCurses.Curses: KeySuspend :: Key
+ UI.HSCurses.Curses: KeyUndo :: Key
+ UI.HSCurses.Curses: KeyUnknown :: Int -> Key
+ UI.HSCurses.Curses: KeyUp :: Key
+ UI.HSCurses.Curses: MouseEvent :: Int -> Int -> Int -> Int -> [ButtonEvent] -> MouseEvent
+ UI.HSCurses.Curses: Pair :: Int -> Pair
+ UI.HSCurses.Curses: addLn :: IO ()
+ UI.HSCurses.Curses: attr0 :: Attr
+ UI.HSCurses.Curses: attrBold :: Int
+ UI.HSCurses.Curses: attrBoldOff :: IO ()
+ UI.HSCurses.Curses: attrBoldOn :: IO ()
+ UI.HSCurses.Curses: attrDim :: Int
+ UI.HSCurses.Curses: attrDimOff :: IO ()
+ UI.HSCurses.Curses: attrDimOn :: IO ()
+ UI.HSCurses.Curses: attrOff :: Attr -> IO ()
+ UI.HSCurses.Curses: attrOn :: Attr -> IO ()
+ UI.HSCurses.Curses: attrPlus :: Attr -> Attr -> Attr
+ UI.HSCurses.Curses: attrSet :: Attr -> Pair -> IO ()
+ UI.HSCurses.Curses: bTee :: Char
+ UI.HSCurses.Curses: beep :: IO ()
+ UI.HSCurses.Curses: bkgrndSet :: Attr -> Pair -> IO ()
+ UI.HSCurses.Curses: block :: Char
+ UI.HSCurses.Curses: board :: Char
+ UI.HSCurses.Curses: bullet :: Char
+ UI.HSCurses.Curses: cBreak :: Bool -> IO ()
+ UI.HSCurses.Curses: cERR :: CInt
+ UI.HSCurses.Curses: cKEY_DOWN :: ChType
+ UI.HSCurses.Curses: cKEY_LEFT :: ChType
+ UI.HSCurses.Curses: cKEY_RIGHT :: ChType
+ UI.HSCurses.Curses: cKEY_UP :: ChType
+ UI.HSCurses.Curses: cTRUE :: NBool
+ UI.HSCurses.Curses: canChangeColor :: IO Bool
+ UI.HSCurses.Curses: ckBoard :: Char
+ UI.HSCurses.Curses: clearOk :: Bool -> IO CInt
+ UI.HSCurses.Curses: clrToEol :: IO ()
+ UI.HSCurses.Curses: color :: String -> Maybe Color
+ UI.HSCurses.Curses: colorContent :: Color -> IO (Int, Int, Int)
+ UI.HSCurses.Curses: colorPairs :: IO Int
+ UI.HSCurses.Curses: colors :: IO Int
+ UI.HSCurses.Curses: cursSet :: CursorVisibility -> IO CursorVisibility
+ UI.HSCurses.Curses: cursesSigWinch :: Maybe Signal
+ UI.HSCurses.Curses: cursesTest :: IO ()
+ UI.HSCurses.Curses: dArrow :: Char
+ UI.HSCurses.Curses: data Attr
+ UI.HSCurses.Curses: data ButtonEvent
+ UI.HSCurses.Curses: data CursorVisibility
+ UI.HSCurses.Curses: data Key
+ UI.HSCurses.Curses: data MouseEvent
+ UI.HSCurses.Curses: decodeKey :: CInt -> Key
+ UI.HSCurses.Curses: defaultBackground :: Color
+ UI.HSCurses.Curses: defaultForeground :: Color
+ UI.HSCurses.Curses: degree :: Char
+ UI.HSCurses.Curses: delWin :: Window -> IO ()
+ UI.HSCurses.Curses: diamond :: Char
+ UI.HSCurses.Curses: echo :: Bool -> IO ()
+ UI.HSCurses.Curses: endWin :: IO ()
+ UI.HSCurses.Curses: erase :: IO ()
+ UI.HSCurses.Curses: errI :: IO CInt -> IO ()
+ UI.HSCurses.Curses: flushinp :: IO CInt
+ UI.HSCurses.Curses: gEqual :: Char
+ UI.HSCurses.Curses: getCh :: IO Key
+ UI.HSCurses.Curses: getYX :: Window -> IO (Int, Int)
+ UI.HSCurses.Curses: getch :: IO CInt
+ UI.HSCurses.Curses: hLine :: Char
+ UI.HSCurses.Curses: hasColors :: IO Bool
+ UI.HSCurses.Curses: initColor :: Color -> (Int, Int, Int) -> IO ()
+ UI.HSCurses.Curses: initCurses :: IO ()
+ UI.HSCurses.Curses: initPair :: Pair -> Color -> Color -> IO ()
+ UI.HSCurses.Curses: initScr :: IO Window
+ UI.HSCurses.Curses: instance Bits Attr
+ UI.HSCurses.Curses: instance Eq Attr
+ UI.HSCurses.Curses: instance Eq ButtonEvent
+ UI.HSCurses.Curses: instance Eq Color
+ UI.HSCurses.Curses: instance Eq Key
+ UI.HSCurses.Curses: instance Eq Pair
+ UI.HSCurses.Curses: instance Ix Color
+ UI.HSCurses.Curses: instance Ix Pair
+ UI.HSCurses.Curses: instance Num Attr
+ UI.HSCurses.Curses: instance Ord Color
+ UI.HSCurses.Curses: instance Ord Pair
+ UI.HSCurses.Curses: instance Show Attr
+ UI.HSCurses.Curses: instance Show ButtonEvent
+ UI.HSCurses.Curses: instance Show Key
+ UI.HSCurses.Curses: instance Show MouseEvent
+ UI.HSCurses.Curses: instance Show Pair
+ UI.HSCurses.Curses: instance Storable Attr
+ UI.HSCurses.Curses: intrFlush :: Bool -> IO ()
+ UI.HSCurses.Curses: isAltCharset :: Attr -> Bool
+ UI.HSCurses.Curses: isBlink :: Attr -> Bool
+ UI.HSCurses.Curses: isBold :: Attr -> Bool
+ UI.HSCurses.Curses: isDim :: Attr -> Bool
+ UI.HSCurses.Curses: isHorizontal :: Attr -> Bool
+ UI.HSCurses.Curses: isInvis :: Attr -> Bool
+ UI.HSCurses.Curses: isLeft :: Attr -> Bool
+ UI.HSCurses.Curses: isLow :: Attr -> Bool
+ UI.HSCurses.Curses: isProtect :: Attr -> Bool
+ UI.HSCurses.Curses: isReverse :: Attr -> Bool
+ UI.HSCurses.Curses: isRight :: Attr -> Bool
+ UI.HSCurses.Curses: isStandout :: Attr -> Bool
+ UI.HSCurses.Curses: isTop :: Attr -> Bool
+ UI.HSCurses.Curses: isUnderline :: Attr -> Bool
+ UI.HSCurses.Curses: isVertical :: Attr -> Bool
+ UI.HSCurses.Curses: keyResizeCode :: Maybe CInt
+ UI.HSCurses.Curses: keypad :: Window -> Bool -> IO ()
+ UI.HSCurses.Curses: lArrow :: Char
+ UI.HSCurses.Curses: lEqual :: Char
+ UI.HSCurses.Curses: lTee :: Char
+ UI.HSCurses.Curses: lantern :: Char
+ UI.HSCurses.Curses: leaveOk :: Bool -> IO CInt
+ UI.HSCurses.Curses: llCorner :: Char
+ UI.HSCurses.Curses: lrCorner :: Char
+ UI.HSCurses.Curses: mouseEventButton :: MouseEvent -> [ButtonEvent]
+ UI.HSCurses.Curses: mouseEventId :: MouseEvent -> Int
+ UI.HSCurses.Curses: mouseEventX :: MouseEvent -> Int
+ UI.HSCurses.Curses: mouseEventY :: MouseEvent -> Int
+ UI.HSCurses.Curses: mouseEventZ :: MouseEvent -> Int
+ UI.HSCurses.Curses: move :: Int -> Int -> IO ()
+ UI.HSCurses.Curses: mvAddCh :: Int -> Int -> ChType -> IO ()
+ UI.HSCurses.Curses: mvWAddStr :: Window -> Int -> Int -> String -> IO ()
+ UI.HSCurses.Curses: nEqual :: Char
+ UI.HSCurses.Curses: newPad :: Int -> Int -> IO Window
+ UI.HSCurses.Curses: newWin :: Int -> Int -> Int -> Int -> IO Window
+ UI.HSCurses.Curses: newtype Color
+ UI.HSCurses.Curses: newtype Pair
+ UI.HSCurses.Curses: nl :: Bool -> IO ()
+ UI.HSCurses.Curses: noDelay :: Window -> Bool -> IO ()
+ UI.HSCurses.Curses: noqiflush :: IO ()
+ UI.HSCurses.Curses: pRefresh :: Window -> Int -> Int -> Int -> Int -> Int -> Int -> IO ()
+ UI.HSCurses.Curses: pairContent :: Pair -> IO (Color, Color)
+ UI.HSCurses.Curses: pi :: Char
+ UI.HSCurses.Curses: plMinus :: Char
+ UI.HSCurses.Curses: plus :: Char
+ UI.HSCurses.Curses: rArrow :: Char
+ UI.HSCurses.Curses: rTee :: Char
+ UI.HSCurses.Curses: raw :: Bool -> IO ()
+ UI.HSCurses.Curses: recognize :: Char -> IO a -> (ChType -> IO a) -> IO a
+ UI.HSCurses.Curses: refresh :: IO ()
+ UI.HSCurses.Curses: resetParams :: IO ()
+ UI.HSCurses.Curses: resizeTerminal :: Int -> Int -> IO ()
+ UI.HSCurses.Curses: s1 :: Char
+ UI.HSCurses.Curses: s3 :: Char
+ UI.HSCurses.Curses: s7 :: Char
+ UI.HSCurses.Curses: s9 :: Char
+ UI.HSCurses.Curses: scrSize :: IO (Int, Int)
+ UI.HSCurses.Curses: setAltCharset :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setBlink :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setBold :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setDim :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setHorizontal :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setInvis :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setLeft :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setLow :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setProtect :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setReverse :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setRight :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setStandout :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setTop :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setUnderline :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: setVertical :: Attr -> Bool -> Attr
+ UI.HSCurses.Curses: standend :: IO Int
+ UI.HSCurses.Curses: standout :: IO Int
+ UI.HSCurses.Curses: startColor :: IO ()
+ UI.HSCurses.Curses: stdScr :: Window
+ UI.HSCurses.Curses: sterling :: Char
+ UI.HSCurses.Curses: tTee :: Char
+ UI.HSCurses.Curses: throwIfErr :: (Num a) => String -> IO a -> IO a
+ UI.HSCurses.Curses: throwIfErr_ :: (Num a) => String -> IO a -> IO ()
+ UI.HSCurses.Curses: timeout :: Int -> IO ()
+ UI.HSCurses.Curses: touchWin :: Window -> IO ()
+ UI.HSCurses.Curses: type ChType = Word32
+ UI.HSCurses.Curses: type NBool = Word8
+ UI.HSCurses.Curses: type Window = Ptr WindowTag
+ UI.HSCurses.Curses: uArrow :: Char
+ UI.HSCurses.Curses: ulCorner :: Char
+ UI.HSCurses.Curses: ungetCh :: (Integral a) => a -> IO ()
+ UI.HSCurses.Curses: update :: IO ()
+ UI.HSCurses.Curses: urCorner :: Char
+ UI.HSCurses.Curses: useDefaultColors :: IO ()
+ UI.HSCurses.Curses: vLine :: Char
+ UI.HSCurses.Curses: vline :: Char -> Int -> IO ()
+ UI.HSCurses.Curses: wAddStr :: Window -> [Char] -> IO ()
+ UI.HSCurses.Curses: wAttrGet :: Window -> IO (Attr, Pair)
+ UI.HSCurses.Curses: wAttrOff :: Window -> Int -> IO ()
+ UI.HSCurses.Curses: wAttrOn :: Window -> Int -> IO ()
+ UI.HSCurses.Curses: wAttrSet :: Window -> (Attr, Pair) -> IO ()
+ UI.HSCurses.Curses: wClrToEol :: Window -> IO ()
+ UI.HSCurses.Curses: wMove :: Window -> Int -> Int -> IO ()
+ UI.HSCurses.Curses: waddch :: Window -> ChType -> IO CInt
+ UI.HSCurses.Curses: waddchnstr :: Window -> CString -> CInt -> IO CInt
+ UI.HSCurses.Curses: wclear :: Window -> IO ()
+ UI.HSCurses.Curses: withMouseEventMask :: (MonadIO m) => [ButtonEvent] -> m a -> m a
+ UI.HSCurses.CursesHelper: AttributeStyle :: [Attribute] -> ForegroundColor -> BackgroundColor -> Style
+ UI.HSCurses.CursesHelper: BlackB :: BackgroundColor
+ UI.HSCurses.CursesHelper: BlackF :: ForegroundColor
+ UI.HSCurses.CursesHelper: Blink :: Attribute
+ UI.HSCurses.CursesHelper: BlueF :: ForegroundColor
+ UI.HSCurses.CursesHelper: Bold :: Attribute
+ UI.HSCurses.CursesHelper: BrightWhiteF :: ForegroundColor
+ UI.HSCurses.CursesHelper: BrownB :: BackgroundColor
+ UI.HSCurses.CursesHelper: BrownF :: ForegroundColor
+ UI.HSCurses.CursesHelper: ColorlessStyle :: [Attribute] -> Style
+ UI.HSCurses.CursesHelper: CyanF :: ForegroundColor
+ UI.HSCurses.CursesHelper: DarkBlueB :: BackgroundColor
+ UI.HSCurses.CursesHelper: DarkBlueF :: ForegroundColor
+ UI.HSCurses.CursesHelper: DarkCyanB :: BackgroundColor
+ UI.HSCurses.CursesHelper: DarkCyanF :: ForegroundColor
+ UI.HSCurses.CursesHelper: DarkGreenB :: BackgroundColor
+ UI.HSCurses.CursesHelper: DarkGreenF :: ForegroundColor
+ UI.HSCurses.CursesHelper: DarkRedB :: BackgroundColor
+ UI.HSCurses.CursesHelper: DarkRedF :: ForegroundColor
+ UI.HSCurses.CursesHelper: DefaultB :: BackgroundColor
+ UI.HSCurses.CursesHelper: DefaultF :: ForegroundColor
+ UI.HSCurses.CursesHelper: Dim :: Attribute
+ UI.HSCurses.CursesHelper: GreenF :: ForegroundColor
+ UI.HSCurses.CursesHelper: GreyF :: ForegroundColor
+ UI.HSCurses.CursesHelper: MagentaF :: ForegroundColor
+ UI.HSCurses.CursesHelper: PurpleB :: BackgroundColor
+ UI.HSCurses.CursesHelper: PurpleF :: ForegroundColor
+ UI.HSCurses.CursesHelper: RedF :: ForegroundColor
+ UI.HSCurses.CursesHelper: Reverse :: Attribute
+ UI.HSCurses.CursesHelper: Style :: ForegroundColor -> BackgroundColor -> Style
+ UI.HSCurses.CursesHelper: Underline :: Attribute
+ UI.HSCurses.CursesHelper: WhiteB :: BackgroundColor
+ UI.HSCurses.CursesHelper: WhiteF :: ForegroundColor
+ UI.HSCurses.CursesHelper: YellowF :: ForegroundColor
+ UI.HSCurses.CursesHelper: black :: Color
+ UI.HSCurses.CursesHelper: blue :: Color
+ UI.HSCurses.CursesHelper: changeCursesStyle :: CursesStyle -> [Attribute] -> CursesStyle
+ UI.HSCurses.CursesHelper: convertAttributes :: [Attribute] -> Attr
+ UI.HSCurses.CursesHelper: convertStyles :: [Style] -> IO [CursesStyle]
+ UI.HSCurses.CursesHelper: cyan :: Color
+ UI.HSCurses.CursesHelper: data Attribute
+ UI.HSCurses.CursesHelper: data BackgroundColor
+ UI.HSCurses.CursesHelper: data CursesStyle
+ UI.HSCurses.CursesHelper: data ForegroundColor
+ UI.HSCurses.CursesHelper: data Style
+ UI.HSCurses.CursesHelper: defaultColor :: Color
+ UI.HSCurses.CursesHelper: defaultCursesStyle :: CursesStyle
+ UI.HSCurses.CursesHelper: defaultStyle :: Style
+ UI.HSCurses.CursesHelper: displayKey :: Key -> String
+ UI.HSCurses.CursesHelper: drawCursor :: (Int, Int) -> (Int, Int) -> IO ()
+ UI.HSCurses.CursesHelper: drawLine :: Int -> String -> IO ()
+ UI.HSCurses.CursesHelper: end :: IO ()
+ UI.HSCurses.CursesHelper: getKey :: (MonadIO m) => m () -> m Key
+ UI.HSCurses.CursesHelper: gotoTop :: IO ()
+ UI.HSCurses.CursesHelper: green :: Color
+ UI.HSCurses.CursesHelper: instance Eq Attribute
+ UI.HSCurses.CursesHelper: instance Eq BackgroundColor
+ UI.HSCurses.CursesHelper: instance Eq CursesStyle
+ UI.HSCurses.CursesHelper: instance Eq ForegroundColor
+ UI.HSCurses.CursesHelper: instance Eq Style
+ UI.HSCurses.CursesHelper: instance Show Attribute
+ UI.HSCurses.CursesHelper: instance Show BackgroundColor
+ UI.HSCurses.CursesHelper: instance Show CursesStyle
+ UI.HSCurses.CursesHelper: instance Show ForegroundColor
+ UI.HSCurses.CursesHelper: instance Show Style
+ UI.HSCurses.CursesHelper: magenta :: Color
+ UI.HSCurses.CursesHelper: mkCursesStyle :: [Attribute] -> CursesStyle
+ UI.HSCurses.CursesHelper: red :: Color
+ UI.HSCurses.CursesHelper: resetStyle :: IO ()
+ UI.HSCurses.CursesHelper: resizeui :: IO (Int, Int)
+ UI.HSCurses.CursesHelper: setStyle :: CursesStyle -> IO ()
+ UI.HSCurses.CursesHelper: start :: IO ()
+ UI.HSCurses.CursesHelper: suspend :: IO ()
+ UI.HSCurses.CursesHelper: white :: Color
+ UI.HSCurses.CursesHelper: withCursor :: (MonadExcIO m) => CursorVisibility -> m a -> m a
+ UI.HSCurses.CursesHelper: withProgram :: (MonadExcIO m) => m a -> m a
+ UI.HSCurses.CursesHelper: withStyle :: (MonadExcIO m) => CursesStyle -> m a -> m a
+ UI.HSCurses.CursesHelper: yellow :: Color
+ UI.HSCurses.Logging: debug :: (MonadIO m) => String -> m ()
+ UI.HSCurses.Logging: trace :: String -> a -> a
+ UI.HSCurses.MonadException: blockM :: (MonadExc m) => m a -> m a
+ UI.HSCurses.MonadException: blockState :: (MonadExc m) => StateT s m a -> StateT s m a
+ UI.HSCurses.MonadException: bracketM :: (MonadExc m) => m a -> (a -> m b) -> (a -> m c) -> m c
+ UI.HSCurses.MonadException: bracketM_ :: (MonadExc m) => m a -> m b -> m c -> m c
+ UI.HSCurses.MonadException: catchDynM :: (MonadExc m, Typeable exc) => m a -> (exc -> m a) -> m a
+ UI.HSCurses.MonadException: catchJustM :: (MonadExc m) => (Exception -> Maybe b) -> m a -> (b -> m a) -> m a
+ UI.HSCurses.MonadException: catchM :: (MonadExc m) => m a -> (Exception -> m a) -> m a
+ UI.HSCurses.MonadException: catchState :: (MonadExc m) => StateT s m a -> (Exception -> StateT s m a) -> StateT s m a
+ UI.HSCurses.MonadException: class (Monad m) => MonadExc m
+ UI.HSCurses.MonadException: class (MonadIO m, MonadExc m) => MonadExcIO m
+ UI.HSCurses.MonadException: finally :: IO a -> IO b -> IO a
+ UI.HSCurses.MonadException: handleJustM :: (MonadExc m) => (Exception -> Maybe b) -> (b -> m a) -> m a -> m a
+ UI.HSCurses.MonadException: handleM :: (MonadExc m) => (Exception -> m a) -> m a -> m a
+ UI.HSCurses.MonadException: instance (MonadExc m) => MonadExc (StateT s m)
+ UI.HSCurses.MonadException: instance (MonadExc m, MonadIO m) => MonadExcIO (StateT s m)
+ UI.HSCurses.MonadException: instance MonadExc IO
+ UI.HSCurses.MonadException: instance MonadExcIO IO
+ UI.HSCurses.MonadException: modifyState :: (MonadExc m) => (s -> m (a, s)) -> StateT s m a
+ UI.HSCurses.MonadException: tryJustM :: (MonadExc m) => (Exception -> Maybe b) -> m a -> m (Either b a)
+ UI.HSCurses.MonadException: tryM :: (MonadExc m) => m a -> m (Either Exception a)
+ UI.HSCurses.MonadException: unblockM :: (MonadExc m) => m a -> m a
+ UI.HSCurses.MonadException: unblockState :: (MonadExc m) => StateT s m a -> StateT s m a
+ UI.HSCurses.Widgets: ActiveTableCell :: w -> TableCell
+ UI.HSCurses.Widgets: AlignCenter :: HAlignment
+ UI.HSCurses.Widgets: AlignLeft :: HAlignment
+ UI.HSCurses.Widgets: AlignRight :: HAlignment
+ UI.HSCurses.Widgets: Cont :: a -> Cont a
+ UI.HSCurses.Widgets: DHActive :: DrawingHint
+ UI.HSCurses.Widgets: DHFocus :: DrawingHint
+ UI.HSCurses.Widgets: DHNormal :: DrawingHint
+ UI.HSCurses.Widgets: DStyle :: CursesStyle -> CursesStyle -> CursesStyle -> DrawingStyle
+ UI.HSCurses.Widgets: DirDown :: Direction
+ UI.HSCurses.Widgets: DirLeft :: Direction
+ UI.HSCurses.Widgets: DirRight :: Direction
+ UI.HSCurses.Widgets: DirUp :: Direction
+ UI.HSCurses.Widgets: Done :: a -> Cont a
+ UI.HSCurses.Widgets: EWOptions :: [(Key, KeyHandler EditWidget)] -> Int -> DrawingStyle -> EditWidgetOptions
+ UI.HSCurses.Widgets: EditWidget :: String -> Int -> Int -> [String] -> Int -> Maybe String -> EditWidgetOptions -> EditWidget
+ UI.HSCurses.Widgets: EmptyWidget :: Size -> EmptyWidget
+ UI.HSCurses.Widgets: First :: FillRow
+ UI.HSCurses.Widgets: Last :: FillRow
+ UI.HSCurses.Widgets: None :: FillRow
+ UI.HSCurses.Widgets: OpaqueWidget :: Size -> OpaqueWidget
+ UI.HSCurses.Widgets: TBWDisplayInfo :: Int -> Int -> Int -> Int -> [Row] -> Int -> [Int] -> [Int] -> Maybe (Int, Size) -> TableWidgetDisplayInfo
+ UI.HSCurses.Widgets: TBWOptions :: Maybe Int -> FillRow -> [Int] -> Size -> TableWidgetOptions
+ UI.HSCurses.Widgets: TWOptions :: TextWidgetSize -> DrawingStyle -> HAlignment -> TextWidgetOptions
+ UI.HSCurses.Widgets: TWSizeDefault :: TextWidgetSize
+ UI.HSCurses.Widgets: TWSizeFixed :: Size -> TextWidgetSize
+ UI.HSCurses.Widgets: TableCell :: w -> TableCell
+ UI.HSCurses.Widgets: TableWidget :: [Row] -> Int -> Maybe Pos -> TableWidgetOptions -> TableWidget
+ UI.HSCurses.Widgets: TextWidget :: String -> Int -> Int -> TextWidgetOptions -> TextWidget
+ UI.HSCurses.Widgets: _activateTableCell :: (MonadExcIO m) => m () -> Pos -> Size -> TableCell -> m (TableCell, String)
+ UI.HSCurses.Widgets: _draw :: DrawingHint -> DrawingStyle -> IO a -> IO a
+ UI.HSCurses.Widgets: activate :: (ActiveWidget a, MonadExcIO m) => m () -> Pos -> Size -> a -> m (a, String)
+ UI.HSCurses.Widgets: activateEditWidget :: (MonadExcIO m) => m () -> Pos -> Size -> EditWidget -> m (EditWidget, String)
+ UI.HSCurses.Widgets: addToHistory :: EditWidget -> [Char] -> EditWidget
+ UI.HSCurses.Widgets: align :: HAlignment -> Int -> a -> [a] -> [a]
+ UI.HSCurses.Widgets: alignRows :: [[[a]]] -> a -> [a] -> [[a]]
+ UI.HSCurses.Widgets: class (Widget a) => ActiveWidget a
+ UI.HSCurses.Widgets: class Widget a
+ UI.HSCurses.Widgets: data Cont a
+ UI.HSCurses.Widgets: data Direction
+ UI.HSCurses.Widgets: data DrawingHint
+ UI.HSCurses.Widgets: data DrawingStyle
+ UI.HSCurses.Widgets: data EditWidget
+ UI.HSCurses.Widgets: data EditWidgetOptions
+ UI.HSCurses.Widgets: data EmptyWidget
+ UI.HSCurses.Widgets: data FillRow
+ UI.HSCurses.Widgets: data HAlignment
+ UI.HSCurses.Widgets: data OpaqueWidget
+ UI.HSCurses.Widgets: data TableCell
+ UI.HSCurses.Widgets: data TableWidget
+ UI.HSCurses.Widgets: data TableWidgetDisplayInfo
+ UI.HSCurses.Widgets: data TableWidgetOptions
+ UI.HSCurses.Widgets: data TextWidget
+ UI.HSCurses.Widgets: data TextWidgetOptions
+ UI.HSCurses.Widgets: data TextWidgetSize
+ UI.HSCurses.Widgets: defaultDrawingStyle :: DrawingStyle
+ UI.HSCurses.Widgets: defaultEWOptions :: EditWidgetOptions
+ UI.HSCurses.Widgets: defaultTBWOptions :: TableWidgetOptions
+ UI.HSCurses.Widgets: defaultTWOptions :: TextWidgetOptions
+ UI.HSCurses.Widgets: deleteAt :: Int -> [a] -> [a]
+ UI.HSCurses.Widgets: draw :: (Widget a) => Pos -> Size -> DrawingHint -> a -> IO ()
+ UI.HSCurses.Widgets: drawEditWidget :: Pos -> Size -> DrawingHint -> EditWidget -> IO ()
+ UI.HSCurses.Widgets: drawTableWidget :: Pos -> Size -> DrawingHint -> TableWidget -> IO ()
+ UI.HSCurses.Widgets: drawTextWidget :: Pos -> Size -> DrawingHint -> TextWidget -> IO ()
+ UI.HSCurses.Widgets: dstyle_active :: DrawingStyle -> CursesStyle
+ UI.HSCurses.Widgets: dstyle_focus :: DrawingStyle -> CursesStyle
+ UI.HSCurses.Widgets: dstyle_normal :: DrawingStyle -> CursesStyle
+ UI.HSCurses.Widgets: editWidgetDeleteLeft :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetDeleteLeft' :: Pos -> Size -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetDeleteToEnd :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetDeleteToEnd' :: t -> t1 -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetDeleteUnderCursor :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetDeleteUnderCursor' :: t -> t1 -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetFinish :: (Monad m) => t -> t1 -> EditWidget -> m (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetGetContent :: EditWidget -> String
+ UI.HSCurses.Widgets: editWidgetGetOptions :: EditWidget -> EditWidgetOptions
+ UI.HSCurses.Widgets: editWidgetGoEnd :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetGoEnd' :: Pos -> Size -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetGoHome :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetGoHome' :: t -> t1 -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetGoLeft :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetGoLeft' :: t -> t1 -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetGoRight :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetGoRight' :: t -> (t1, Int) -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetHistory :: (Num t) => (Int -> t -> Int) -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetHistoryDown :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetHistoryDown' :: t -> t1 -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetHistoryUp :: Pos -> Size -> EditWidget -> IO (Cont EditWidget)
+ UI.HSCurses.Widgets: editWidgetHistoryUp' :: t -> t1 -> EditWidget -> EditWidget
+ UI.HSCurses.Widgets: editWidgetKeyHandlers :: [(Key, Pos -> Size -> EditWidget -> IO (Cont EditWidget))]
+ UI.HSCurses.Widgets: editWidgetSetContent :: EditWidget -> String -> EditWidget
+ UI.HSCurses.Widgets: editWidgetSetOptions :: EditWidget -> EditWidgetOptions -> EditWidget
+ UI.HSCurses.Widgets: ew_content :: EditWidget -> String
+ UI.HSCurses.Widgets: ew_contentPos :: EditWidget -> Int
+ UI.HSCurses.Widgets: ew_history :: EditWidget -> [String]
+ UI.HSCurses.Widgets: ew_historyIndex :: EditWidget -> Int
+ UI.HSCurses.Widgets: ew_historySavedContent :: EditWidget -> Maybe String
+ UI.HSCurses.Widgets: ew_options :: EditWidget -> EditWidgetOptions
+ UI.HSCurses.Widgets: ew_xcursor :: EditWidget -> Int
+ UI.HSCurses.Widgets: ew_xoffset :: EditWidget -> Int
+ UI.HSCurses.Widgets: ewopt_keyHandlers :: EditWidgetOptions -> [(Key, KeyHandler EditWidget)]
+ UI.HSCurses.Widgets: ewopt_minWidth :: EditWidgetOptions -> Int
+ UI.HSCurses.Widgets: ewopt_style :: EditWidgetOptions -> DrawingStyle
+ UI.HSCurses.Widgets: findFirstActiveCell :: [Row] -> TableWidgetOptions -> Maybe Pos
+ UI.HSCurses.Widgets: findNextActiveCell :: TableWidgetOptions -> Int -> Pos -> Direction -> Maybe Pos
+ UI.HSCurses.Widgets: getCellInfo :: Pos -> Size -> TableWidget -> (Int, Int) -> (Pos, Size)
+ UI.HSCurses.Widgets: getCellWidget :: TableWidget -> (Int, Int) -> TableCell
+ UI.HSCurses.Widgets: getHeight :: Size -> Int
+ UI.HSCurses.Widgets: getWidth :: Size -> Int
+ UI.HSCurses.Widgets: getXOffset :: Offset -> Int
+ UI.HSCurses.Widgets: getXPos :: Pos -> Int
+ UI.HSCurses.Widgets: getYOffset :: Offset -> Int
+ UI.HSCurses.Widgets: getYPos :: Pos -> Int
+ UI.HSCurses.Widgets: instance ActiveWidget EditWidget
+ UI.HSCurses.Widgets: instance Eq Direction
+ UI.HSCurses.Widgets: instance Eq DrawingHint
+ UI.HSCurses.Widgets: instance Eq DrawingStyle
+ UI.HSCurses.Widgets: instance Eq FillRow
+ UI.HSCurses.Widgets: instance Eq HAlignment
+ UI.HSCurses.Widgets: instance Eq TableWidgetOptions
+ UI.HSCurses.Widgets: instance Eq TextWidget
+ UI.HSCurses.Widgets: instance Eq TextWidgetOptions
+ UI.HSCurses.Widgets: instance Eq TextWidgetSize
+ UI.HSCurses.Widgets: instance Ord Direction
+ UI.HSCurses.Widgets: instance Ord DrawingHint
+ UI.HSCurses.Widgets: instance Show Direction
+ UI.HSCurses.Widgets: instance Show DrawingHint
+ UI.HSCurses.Widgets: instance Show DrawingStyle
+ UI.HSCurses.Widgets: instance Show FillRow
+ UI.HSCurses.Widgets: instance Show HAlignment
+ UI.HSCurses.Widgets: instance Show TableWidgetOptions
+ UI.HSCurses.Widgets: instance Show TextWidget
+ UI.HSCurses.Widgets: instance Show TextWidgetOptions
+ UI.HSCurses.Widgets: instance Show TextWidgetSize
+ UI.HSCurses.Widgets: instance Widget EditWidget
+ UI.HSCurses.Widgets: instance Widget EmptyWidget
+ UI.HSCurses.Widgets: instance Widget OpaqueWidget
+ UI.HSCurses.Widgets: instance Widget TableCell
+ UI.HSCurses.Widgets: instance Widget TableWidget
+ UI.HSCurses.Widgets: instance Widget TextWidget
+ UI.HSCurses.Widgets: isActive :: TableCell -> Bool
+ UI.HSCurses.Widgets: joinLists :: [[a]] -> [a] -> [a]
+ UI.HSCurses.Widgets: listReplace :: [a] -> a -> Int -> [a]
+ UI.HSCurses.Widgets: maxHistoryLength :: Int
+ UI.HSCurses.Widgets: minSize :: (Widget a) => a -> Size
+ UI.HSCurses.Widgets: mkDrawingStyle :: CursesStyle -> DrawingStyle
+ UI.HSCurses.Widgets: mkKeyHandler :: (Pos -> Size -> a -> a) -> KeyHandler a
+ UI.HSCurses.Widgets: newEditWidget :: EditWidgetOptions -> String -> EditWidget
+ UI.HSCurses.Widgets: newTableWidget :: TableWidgetOptions -> [Row] -> TableWidget
+ UI.HSCurses.Widgets: newTextWidget :: TextWidgetOptions -> String -> TextWidget
+ UI.HSCurses.Widgets: scrollBackward :: t -> Int -> Int -> Int
+ UI.HSCurses.Widgets: scrollBy :: Int -> Int
+ UI.HSCurses.Widgets: scrollFactor :: Double
+ UI.HSCurses.Widgets: scrollForward :: Int -> Int -> Int -> Int
+ UI.HSCurses.Widgets: setCellWidget :: TableWidget -> (Int, Int) -> TableCell -> TableWidget
+ UI.HSCurses.Widgets: singletonRow :: TableCell -> Row
+ UI.HSCurses.Widgets: splitList :: (Eq a) => [a] -> [a] -> [[a]]
+ UI.HSCurses.Widgets: tableWidgetActivateCurrent :: (MonadExcIO m) => m () -> Pos -> Size -> DrawingHint -> TableWidget -> m (TableWidget, Maybe String)
+ UI.HSCurses.Widgets: tableWidgetDeleteRow :: Int -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetDisplayInfo :: Size -> TableWidget -> TableWidgetDisplayInfo
+ UI.HSCurses.Widgets: tableWidgetGoDown :: Size -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetGoLeft :: Size -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetGoRight :: Size -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetGoUp :: Size -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetMakeVisible :: TableWidget -> (Int, Int) -> Int -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetMove :: Direction -> (Int, Int) -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetScrollDown :: Size -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tableWidgetScrollUp :: Size -> TableWidget -> TableWidget
+ UI.HSCurses.Widgets: tbw_colOffset :: TableWidget -> Int
+ UI.HSCurses.Widgets: tbw_options :: TableWidget -> TableWidgetOptions
+ UI.HSCurses.Widgets: tbw_pos :: TableWidget -> Maybe Pos
+ UI.HSCurses.Widgets: tbw_rows :: TableWidget -> [Row]
+ UI.HSCurses.Widgets: tbwdisp_firstVis :: TableWidgetDisplayInfo -> Int
+ UI.HSCurses.Widgets: tbwdisp_height :: TableWidgetDisplayInfo -> Int
+ UI.HSCurses.Widgets: tbwdisp_heights :: TableWidgetDisplayInfo -> [Int]
+ UI.HSCurses.Widgets: tbwdisp_lastVis :: TableWidgetDisplayInfo -> Int
+ UI.HSCurses.Widgets: tbwdisp_nrows :: TableWidgetDisplayInfo -> Int
+ UI.HSCurses.Widgets: tbwdisp_rightMargin :: TableWidgetDisplayInfo -> Maybe (Int, Size)
+ UI.HSCurses.Widgets: tbwdisp_rows :: TableWidgetDisplayInfo -> [Row]
+ UI.HSCurses.Widgets: tbwdisp_width :: TableWidgetDisplayInfo -> Int
+ UI.HSCurses.Widgets: tbwdisp_widths :: TableWidgetDisplayInfo -> [Int]
+ UI.HSCurses.Widgets: tbwopt_activeCols :: TableWidgetOptions -> [Int]
+ UI.HSCurses.Widgets: tbwopt_fillCol :: TableWidgetOptions -> Maybe Int
+ UI.HSCurses.Widgets: tbwopt_fillRow :: TableWidgetOptions -> FillRow
+ UI.HSCurses.Widgets: tbwopt_minSize :: TableWidgetOptions -> Size
+ UI.HSCurses.Widgets: textWidgetGetText :: TextWidget -> String
+ UI.HSCurses.Widgets: textWidgetScrollDown :: Size -> TextWidget -> TextWidget
+ UI.HSCurses.Widgets: textWidgetScrollLeft :: Size -> TextWidget -> TextWidget
+ UI.HSCurses.Widgets: textWidgetScrollRight :: Size -> TextWidget -> TextWidget
+ UI.HSCurses.Widgets: textWidgetScrollUp :: Size -> TextWidget -> TextWidget
+ UI.HSCurses.Widgets: textWidgetSetText :: TextWidget -> String -> TextWidget
+ UI.HSCurses.Widgets: tw_options :: TextWidget -> TextWidgetOptions
+ UI.HSCurses.Widgets: tw_text :: TextWidget -> String
+ UI.HSCurses.Widgets: tw_xoffset :: TextWidget -> Int
+ UI.HSCurses.Widgets: tw_yoffset :: TextWidget -> Int
+ UI.HSCurses.Widgets: twopt_halign :: TextWidgetOptions -> HAlignment
+ UI.HSCurses.Widgets: twopt_size :: TextWidgetOptions -> TextWidgetSize
+ UI.HSCurses.Widgets: twopt_style :: TextWidgetOptions -> DrawingStyle
+ UI.HSCurses.Widgets: type KeyHandler a = Pos -> Size -> a -> IO (Cont a)
+ UI.HSCurses.Widgets: type Offset = (Int, Int)
+ UI.HSCurses.Widgets: type Pos = (Int, Int)
+ UI.HSCurses.Widgets: type Row = [TableCell]
+ UI.HSCurses.Widgets: type Size = (Int, Int)

Files

− HSCurses/CWString.hsc
@@ -1,388 +0,0 @@------ Copyright (c) 2002-2004 John Meacham (john at repetae dot net)--- Copyright (c) 2004      Don Stewart - http://www.cse.unsw.edu.au/~dons--- --- This library 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 2.1 of the License, or (at your option) any later version.--- --- This library 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 this library; if not, write to the Free Software--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA---module HSCurses.CWString (--    -- * utf8 versions-    withUTF8String,-    withUTF8StringLen,-    newUTF8String,-    newUTF8StringLen,-    peekUTF8String,-    peekUTF8StringLen,--    -- * WChar stuff-#ifdef HAVE_WCHAR_H-    withCWString,-    withCWStringLen,-    newCWString,-    newCWStringLen,-    peekCWString,-    peekCWStringLen,-    wcharIsUnicode,-    CWChar, -    CWString, -    CWStringLen,-#endif-    -- * Locale versions -    withLCString,-    withLCStringLen,-    newLCString,-    newLCStringLen,-    peekLCStringLen,-    peekLCString,---  charIsRepresentable--    ) where--import Data.Char            ( ord, chr )-import Data.Bits            ( Bits((.|.), (.&.), shift) )-import Foreign.C.String--#if __GLASGOW_HASKELL__ < 603-import GHC.Exts-#endif--#ifdef HAVE_WCHAR_H--import Foreign.C.Types--#include <wchar.h>-#include <limits.h>-#include <stdlib.h>--type CWChar = (#type wchar_t)-type CWString = Ptr CWChar-type CWStringLen = (CWString, Int)--fi :: (Integral a, Num b) => a -> b-fi x = fromIntegral x------------------------ CWChar functions----------------------{-# INLINE wcharIsUnicode #-}-wcharIsUnicode :: Bool--#if defined(__STDC_ISO_10646__)--wcharIsUnicode = True---- support functions -wNUL :: CWChar-wNUL = 0-#ifndef __GLASGOW_HASKELL__-pairLength :: String -> CString -> CStringLen-pairLength  = flip (,) . length--cwCharsToChars :: [CWChar] -> [Char]-cwCharsToChars xs  = map castCWCharToChar xs-charsToCWChars :: [Char] -> [CWChar]-charsToCWChars xs  = map castCharToCWChar xs--#endif--- __STDC_ISO_10646__--castCWCharToChar :: CWChar -> Char-castCWCharToChar ch = chr (fromIntegral ch )--castCharToCWChar :: Char -> CWChar-castCharToCWChar ch = fromIntegral (ord ch)---- exported functions-peekCWString    :: CWString -> IO String-#ifndef __GLASGOW_HASKELL__-peekCString cp  = do cs <- peekArray0 wNUL cp; return (cwCharsToChars cs)-#else-peekCWString cp = loop 0-  where-    loop i = do-        val <- peekElemOff cp i-        if val == wNUL then return [] else do-            rest <- loop (i+1)-            return (castCWCharToChar val : rest)-#endif--peekCWStringLen           :: CWStringLen -> IO String-#ifndef __GLASGOW_HASKELL__-peekCWStringLen (cp, len)  = do cs <- peekArray len cp; return (cwCharsToChars cs)-#else-peekCWStringLen (cp, len) = loop 0-  where-    loop i | i == len  = return []-           | otherwise = do-                val <- peekElemOff cp i-                rest <- loop (i+1)-                return (castCWCharToChar val : rest)-#endif--newCWString :: String -> IO CWString-#ifndef __GLASGOW_HASKELL__-newCWString  = newArray0 wNUL . charsToCWChars-#else-newCWString str = do-  ptr <- mallocArray0 (length str)-  let-        go [] n##   = pokeElemOff ptr (I## n##) wNUL-        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)-  go str 0##-  return ptr-#endif--newCWStringLen     :: String -> IO CWStringLen-#ifndef __GLASGOW_HASKELL__-newCWStringLen str  = do a <- newArray (charsToCWChars str)-                        return (pairLength str a)-#else-newCWStringLen str = do-  ptr <- mallocArray0 len-  let-        go [] _       = return ()-        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)-  go str 0##-  return (ptr, len)-  where-    len = length str-#endif--withCWString :: String -> (CWString -> IO a) -> IO a-#ifndef __GLASGOW_HASKELL__-withCWString  = withArray0 wNUL . charsToCWChars-#else-withCWString str f =-  allocaArray0 (length str) $ \ptr ->-      let-        go [] n##     = pokeElemOff ptr (I## n##) wNUL-        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)-      in do-      go str 0##-      f ptr-#endif--withCWStringLen         :: String -> (CWStringLen -> IO a) -> IO a-#ifndef __GLASGOW_HASKELL__-withCWStringLen str act  = withArray (charsToCWChars str) $ act . pairLength str-#else-withCWStringLen str f =-  allocaArray len $ \ptr ->-      let-        go [] _       = return ()-        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)-      in do-      go str 0##-      f (ptr,len)-  where-    len = length str-#endif---#else--- no __STDC_ISO_10646__-wcharIsUnicode = False-#endif--newtype MBState = MBState { _mbstate :: (Ptr MBState)}--withMBState :: (MBState -> IO a) -> IO a-withMBState act = allocaBytes (#const sizeof(mbstate_t)) (\mb -> c_memset mb 0 (#const sizeof(mbstate_t)) >> act (MBState mb)) --clearMBState :: MBState -> IO ()-clearMBState (MBState mb) = c_memset mb 0 (#const sizeof(mbstate_t)) >> return ()--wcsrtombs :: CWString -> (CString, CSize) -> IO CSize-wcsrtombs wcs (cs,len) = -    alloca (\p -> -        poke p wcs >> withMBState (\mb -> -            wcsrtombs' p cs len mb)) -    where-        wcsrtombs'  p cs' len' mb = do-            x <- c_wcsrtombs cs p len' mb-            case x of -                -1 -> do-                    sp <- peek p -                    poke sp ((fi (ord '?'))::CWChar)-                    poke p wcs-                    clearMBState mb-                    wcsrtombs' p cs' len' mb-                e | e >= 0 && e <= len' -> do-                    let ep = advancePtr cs' (fi e)-                    poke ep (fi (0::Int))-                    return x-                e -> error $ "HSCurses.CWString.wcsrtombs: impossible case: "++show e--#def inline HsInt hs_get_mb_cur_max () { return MB_CUR_MAX; }-foreign import ccall unsafe hs_get_mb_cur_max :: IO Int --mb_cur_max :: Int-mb_cur_max = unsafePerformIO hs_get_mb_cur_max --{--charIsRepresentable :: Char -> IO Bool-charIsRepresentable ch = fmap (/= -1) $ allocaBytes mb_cur_max (\cs -> c_wctomb cs (fi $ ord ch)) --}--{--foreign import ccall unsafe "stdlib.h wctomb" c_wctomb :: CString -> CWChar -> IO CInt--}--foreign import ccall unsafe "stdlib.h wcsrtombs" -        c_wcsrtombs :: CString -> (Ptr (Ptr CWChar)) -> CSize -> MBState -> IO CSize--foreign import ccall unsafe "string.h memset" -        c_memset :: Ptr a -> CInt -> CSize -> IO (Ptr a)--foreign import ccall unsafe "stdlib.h mbstowcs" -        c_mbstowcs :: CWString -> CString -> CSize -> IO CSize--mbstowcs :: CWString-         -> Foreign.C.String.CString-         -> Foreign.C.Types.CSize -> IO Foreign.C.Types.CSize--mbstowcs a b s = throwIf (== -1) (const "mbstowcs") $ c_mbstowcs a b s --peekLCString    :: CString -> IO String-peekLCString cp  = do -    sz <- mbstowcs nullPtr cp 0-    allocaArray (fi $ sz + 1) (\wcp -> mbstowcs wcp cp (sz + 1) >> peekCWString wcp)---- TODO fix for embeded NULs-peekLCStringLen           :: CStringLen -> IO String-peekLCStringLen (cp, len)  =  allocaBytes (len + 1) $ \ncp -> do-    copyBytes ncp cp len-    pokeElemOff ncp len 0-    peekLCString ncp-    -newLCString :: String -> IO CString-newLCString s = -    withCWString s $ \wcs -> do -        cs <- mallocArray0 alen-        wcsrtombs wcs (cs, fi alen)-        return cs --    where alen = mb_cur_max * length s--newLCStringLen     :: String -> IO CStringLen-newLCStringLen str  = newLCString str >>= \cs -> return (pairLength1 str cs)--withLCString :: String -> (CString -> IO a) -> IO a-withLCString s a = -    withCWString s $ \wcs -> -        allocaArray0 alen $ \cs -> -            wcsrtombs wcs (cs,fi alen) >> a cs--    where alen = mb_cur_max * length s--withLCStringLen :: String -> (CStringLen -> IO a) -> IO a-withLCStringLen s a = -    withCWString s $ \wcs -> -        allocaArray0 alen $ \cs -> do-            sz <- wcsrtombs wcs (cs,fi alen)-            a (cs,fi sz)--    where alen = mb_cur_max * length s--pairLength1 :: String -> CString -> CStringLen-pairLength1  = flip (,) . length--#else--- -------------------------------------------------------------- no CF_WCHAR_SUPPORT (OpenBSD)--{--charIsRepresentable :: Char -> IO Bool-charIsRepresentable ch = return $ isLatin1 ch--}--withLCString :: String -> (Foreign.C.String.CString -> IO a) -> IO a-withLCString = withCString--withLCStringLen  :: String -> (Foreign.C.String.CStringLen -> IO a) -> IO a-withLCStringLen = withCStringLen--newLCString :: String -> IO Foreign.C.String.CString-newLCString = newCString--newLCStringLen :: String -> IO Foreign.C.String.CStringLen-newLCStringLen = newCStringLen--peekLCString :: Foreign.C.String.CString -> IO String-peekLCString = peekCString--peekLCStringLen :: Foreign.C.String.CStringLen -> IO String-peekLCStringLen = peekCStringLen--#endif--- no CF_WCHAR_SUPPORT---------------------- UTF8 versions--------------------withUTF8String :: String -> (CString -> IO a) -> IO a-withUTF8String hsStr = withCString (toUTF hsStr)--withUTF8StringLen :: String -> (CStringLen -> IO a) -> IO a-withUTF8StringLen hsStr = withCStringLen (toUTF hsStr)--newUTF8String :: String -> IO CString-newUTF8String = newCString . toUTF--newUTF8StringLen :: String -> IO CStringLen-newUTF8StringLen = newCStringLen . toUTF--peekUTF8String :: CString -> IO String-peekUTF8String strPtr = fmap fromUTF $ peekCString strPtr--peekUTF8StringLen :: CStringLen -> IO String-peekUTF8StringLen strPtr = fmap fromUTF $ peekCStringLen strPtr---- these should read and write directly from/to memory.--- A first pass will be needed to determine the size of the allocated region--toUTF :: String -> String-toUTF [] = []-toUTF (x:xs) | ord x<=0x007F = x:toUTF xs-             | ord x<=0x07FF = chr (0xC0 .|. ((ord x `shift` (-6)) .&. 0x1F)):-                               chr (0x80 .|. (ord x .&. 0x3F)):-                               toUTF xs-             | otherwise     = chr (0xE0 .|. ((ord x `shift` (-12)) .&. 0x0F)):-                               chr (0x80 .|. ((ord x `shift` (-6)) .&. 0x3F)):-                               chr (0x80 .|. (ord x .&. 0x3F)):-                               toUTF xs--fromUTF :: String -> String-fromUTF [] = []-fromUTF (al@(x:xs)) | ord x<=0x7F = x:fromUTF xs-                     | ord x<=0xBF = err-                     | ord x<=0xDF = twoBytes al-                     | ord x<=0xEF = threeBytes al-                     | otherwise   = err-  where-    twoBytes (x1:x2:xs') = chr (((ord x1 .&. 0x1F) `shift` 6) .|.-                               (ord x2 .&. 0x3F)):fromUTF xs'-    twoBytes _ = error "fromUTF: illegal two byte sequence"--    threeBytes (x1:x2:x3:xs') = chr (((ord x1 .&. 0x0F) `shift` 12) .|.-                                    ((ord x2 .&. 0x3F) `shift` 6) .|.-                                    (ord x3 .&. 0x3F)):fromUTF xs'-    threeBytes _ = error "fromUTF: illegal three byte sequence" -    -    err = error "fromUTF: illegal UTF-8 character"-
− HSCurses/Curses.hsc
@@ -1,1403 +0,0 @@-{-# OPTIONS -fffi -fglasgow-exts #-}--- glaexts needed for newtype deriving ---- Copyright (c) 2002-2004 John Meacham (john at repetae dot net)--- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons--- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de--- --- This library 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 2.1 of the License, or (at your option) any later version.--- --- This library 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 this library; if not, write to the Free Software--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA--------- | Binding to the [wn]curses library. From the ncurses man page:------ >      The curses library routines give the user a terminal-inde---- >      pendent method of updating character screens with  reason---- >      able  optimization.--- --- Sections of the quoted documentation are from the OpenBSD man pages, which--- are distributed under a BSD license.------ A useful reference is: ---        /Writing Programs with NCURSES/, by Eric S. Raymond and Zeyd---        M. Ben-Halim, <http://dickey.his.com/ncurses/>------ N.B attrs don't work with Irix curses.h. This should be fixed.-----module HSCurses.Curses (--    -- * Basic Functions-    stdScr,             -- :: Window-    initScr,            -- :: IO Window-    initCurses,         -- :: IO ()-    resetParams,-    endWin,             -- :: IO ()-    scrSize,            -- :: IO (Int, Int)--    -- * Windows and Pads-    Window,             -- data Window deriving Eq-    touchWin,-    newPad, pRefresh, delWin, newWin,--    -- * Refresh Routines-    refresh,            -- :: IO ()-    update,-    resizeTerminal,--    -- * Navigation-    move,           -- :: Int -> Int -> IO ()-    getYX,    -    -    -- * Input -    getCh, getch, decodeKey, ungetCh, keyResizeCode,--    -- * Input Options-    cBreak,             -- :: Bool -> IO ()-    raw,                -- :: Bool -> IO ()-    echo,               -- :: Bool -> IO ()-    intrFlush,          -- :: Bool -> IO ()-    keypad,             -- :: Window -> Bool -> IO ()-    noDelay,            -- :: Window -> Bool -> IO ()--    -- * Output-    wAddStr, -    addLn,         -- :: IO ()-    mvWAddStr,-    wMove,-    bkgrndSet,      -- :: Attr -> Pair -> IO ()-    erase,          -- :: IO ()-    wclear,         -- :: Window -> IO ()-    clrToEol,       -- :: IO ()-    wClrToEol,-    beep,-    waddch, --    -- * Output Options    -    clearOk,-    leaveOk,-    nl,                 -- :: Bool -> IO ()--    -- * Cursor Routines-    CursorVisibility(..), cursSet,-    -    -- * Color Support-    hasColors,      -- :: IO Bool-    startColor,     -- :: IO ()-    useDefaultColors,   -- :: IO ()-    Pair(..),       -- newtype Pair = Pair Int deriving (Eq, Ord, Ix)-    colorPairs,     -- :: IO Int-    Color(..),      -- newtype Color = Color Int deriving (Eq, Ord, Ix)-    colors,         -- :: IO Int-    color,          -- :: String -> Maybe Color---    black, red, green, yellow, blue, magenta, cyan, white, -- :: Color-    initPair,       -- :: Pair -> Color -> Color -> IO ()-    pairContent,    -- :: Pair -> IO (Color, Color)-    canChangeColor, -- :: IO Bool-    initColor,      -- :: Color -> (Int, Int, Int) -> IO ()-    colorContent,   -- :: Color -> IO (Int, Int, Int)-    defaultBackground, defaultForeground,-    -    -- * Attributes-    attrPlus,-    Attr,  -    attr0, -- :: Attr-    -    isAltCharset, isBlink, isBold, isDim, isHorizontal, isInvis,-    isLeft, isLow, isProtect, isReverse, isRight, isStandout, isTop,-    isUnderline, isVertical,-        -- :: Attr -> Bool-    -    setAltCharset, setBlink, setBold, setDim, setHorizontal, setInvis,-    setLeft, setLow, setProtect, setReverse, setRight, setStandout,-    setTop, setUnderline, setVertical,-        -- :: Attr -> Bool -> Attr-    -    attrSet, -- :: Attr -> Pair -> IO ()-    attrOn, attrOff,--    standout,standend,-    attrDim, attrBold,-    attrDimOn, attrDimOff,-    attrBoldOn, attrBoldOff,-    wAttrOn,-    wAttrOff, -    wAttrSet, wAttrGet,--    -- * Mouse Routines-    withMouseEventMask,-    ButtonEvent(..),-    MouseEvent(..),--    -- * Keys-    Key(..),--    -- * Lines-    vline,-    ulCorner, llCorner, urCorner, lrCorner, rTee, lTee, bTee, tTee, hLine,-    vLine, plus, s1, s9, diamond, ckBoard, degree, plMinus, bullet,-    lArrow, rArrow, dArrow, uArrow, board, lantern, block,-    s3, s7, lEqual, gEqual, pi, nEqual, sterling,--    -- * Signals-    cursesSigWinch,--    -- * Misc-    cursesTest,-    throwIfErr, throwIfErr_,-    flushinp,-    recognize-        -  ) where --#include <config.h>-#include <HSCurses.h>--#if HAVE_SIGNAL_H-# include <signal.h>-#endif--import HSCurses.CWString       ( withLCStringLen )-import HSCurses.MonadException-import HSCurses.Logging--import Prelude hiding           ( pi )-import Data.Char-import Data.List-import Data.Ix                  ( Ix )--import Control.Monad-import Control.Monad.Trans-import Control.Concurrent-import Control.Concurrent.Chan--import Foreign-import CForeign-import Foreign.C.Error-import System.Posix.Signals--#if __GLASGOW_HASKELL__ < 603-import Data.Bits-#endif--------------------------------------------------------------------------------- | @initCurses fn@ does all initialization necessary for a Curses---   application. ----initCurses :: IO ()-initCurses = do-    initScr-    b <- hasColors-    when b $ startColor >> useDefaultColors--resetParams :: IO ()-resetParams = do-    raw True    -- raw mode please-    echo False-    nl False-    intrFlush True-    leaveOk False-    keypad stdScr True-    defineKey (#const KEY_UP) "\x1b[1;2A"-    defineKey (#const KEY_DOWN) "\x1b[1;2B"-    defineKey (#const KEY_SLEFT) "\x1b[1;2D"-    defineKey (#const KEY_SRIGHT) "\x1b[1;2C"----------------------------------------------------------------------------fi :: (Integral a, Num b) => a -> b-fi = fromIntegral--throwIfErr :: Num a => String -> IO a -> IO a---throwIfErr name act = do---    res <- act---    if res == (#const ERR)---        then ioError (userError ("Curses: "++name++" failed"))---        else return res-throwIfErr s = throwIf (== (#const ERR)) (\a -> "Curses[" ++ show a ++ "]:"  ++ s)--throwIfErr_ :: Num a => String -> IO a -> IO ()-throwIfErr_ name act = void $ throwIfErr name act----------------------------------------------------------------------------type WindowTag = ()-type Window = Ptr WindowTag------- | The standard screen----stdScr :: Window-stdScr = unsafePerformIO (peek stdscr)-foreign import ccall "static HSCurses.h &stdscr" -    stdscr :: Ptr Window------- | initscr is normally the first curses routine to call when--- initializing a program. curs_initscr(3):------ >     To initialize the routines, the routine initscr or newterm--- >     must be called before any of the other routines that  deal--- >     with  windows  and  screens  are used. ------ >     The initscr code determines the terminal type and initial---- >     izes all curses data structures.  initscr also causes  the--- >     first  call  to  refresh  to  clear the screen.  If errors--- >     occur, initscr writes  an  appropriate  error  message  to--- >     standard error and exits; otherwise, a pointer is returned--- >     to stdscr.----initScr :: IO Window-initScr = throwIfNull "initscr" initscr-foreign import ccall unsafe "HSCurses.h initscr" initscr :: IO Window------- | > The cbreak routine---   > disables line buffering and erase/kill  character-process----   > ing  (interrupt  and  flow  control  characters  are unaf----   > fected), making characters typed by the  user  immediately---   > available  to  the  program.  The nocbreak routine returns---   > the terminal to normal (cooked) mode.----cBreak :: Bool -> IO ()-cBreak True  = throwIfErr_ "cbreak"   cbreak-cBreak False = throwIfErr_ "nocbreak" nocbreak--foreign import ccall unsafe "HSCurses.h cbreak"     cbreak :: IO CInt-foreign import ccall unsafe "HSCurses.h nocbreak" nocbreak :: IO CInt------- |>    The  raw and noraw routines place the terminal into or out--- >     of raw mode.  Raw mode is similar to cbreak mode, in  that--- >     characters  typed  are  immediately  passed through to the--- >     user program.  The differences are that in raw  mode,  the--- >     interrupt,  quit, suspend, and flow control characters are--- >     all passed through uninterpreted, instead of generating  a--- >     signal.   The  behavior  of the BREAK key depends on other--- >     bits in the tty driver that are not set by curses.----raw :: Bool -> IO ()-raw False = throwIfErr_ "noraw" noraw-raw True  = throwIfErr_ "raw"   raw_c--foreign import ccall unsafe "HSCurses.h noraw" noraw :: IO CInt-foreign import ccall unsafe "HSCurses.h raw"   raw_c :: IO CInt------- |>      The  echo  and  noecho routines control whether characters--- >       typed by the user are echoed by getch as they  are  typed.--- >       Echoing  by  the  tty  driver is always disabled, but ini---- >       tially getch is in echo  mode,  so  characters  typed  are--- >       echoed.  Authors of most interactive programs prefer to do--- >       their own echoing in a controlled area of the  screen,  or--- >       not  to  echo  at  all, so they disable echoing by calling--- >       noecho.  [See curs_getch(3) for a discussion of how  these--- >       routines interact with cbreak and nocbreak.]--- >----echo :: Bool -> IO ()-echo False = throwIfErr_ "noecho" noecho-echo True  = throwIfErr_ "echo"   echo_c--foreign import ccall unsafe "HSCurses.h noecho" noecho :: IO CInt-foreign import ccall unsafe "HSCurses.h echo" echo_c :: IO CInt------- |>       The  nl  and  nonl routines control whether the underlying--- >        display device translates the return key into  newline  on--- >        input,  and  whether it translates newline into return and--- >        line-feed on output (in either case, the call  addch('\n')--- >        does the equivalent of return and line feed on the virtual--- >        screen).  Initially, these translations do occur.  If  you--- >        disable  them using nonl, curses will be able to make bet---- >        ter use of the line-feed capability, resulting  in  faster--- >        cursor  motion.   Also, curses will then be able to detect--- >        the return key.--- > -nl :: Bool -> IO ()-nl True  = throwIfErr_ "nl"   nl_c-nl False = throwIfErr_ "nonl" nonl--foreign import ccall unsafe "HSCurses.h nl" nl_c :: IO CInt-foreign import ccall unsafe "HSCurses.h nonl" nonl :: IO CInt---- |>       If  the intrflush option is enabled, (bf is TRUE), when an--- >        interrupt key  is  pressed  on  the  keyboard  (interrupt,--- >        break,  quit)  all  output in the tty driver queue will be--- >        flushed, giving the  effect  of  faster  response  to  the--- >        interrupt,  but  causing  curses to have the wrong idea of--- >        what is on the  screen.   Disabling  (bf  is  FALSE),  the--- >        option  prevents the flush.--- > -intrFlush :: Bool -> IO ()-intrFlush bf =-    throwIfErr_ "intrflush" $ intrflush stdScr (if bf then 1 else 0)-foreign import ccall unsafe "HSCurses.h intrflush" intrflush :: Window -> (#type bool) -> IO CInt------- | Enable the keypad of the user's terminal.----keypad :: Window -> Bool -> IO ()-keypad win bf = throwIfErr_ "keypad" $ keypad_c win (if bf then 1 else 0)-foreign import ccall unsafe "HSCurses.h keypad" -    keypad_c :: Window -> (#type bool) -> IO CInt--noDelay :: Window -> Bool -> IO ()-noDelay win bf =-    throwIfErr_ "nodelay" $ nodelay win (if bf then 1 else 0)--foreign import ccall unsafe "HSCurses.h nodelay" -    nodelay :: Window -> (#type bool) -> IO CInt------- |   Normally, the hardware cursor is left at the  location  of---     the  window  cursor  being  refreshed.  The leaveok option---     allows the cursor to be left wherever the  update  happens---     to leave it.  It is useful for applications where the cur----     sor is not used, since it  reduces  the  need  for  cursor---     motions.   If  possible, the cursor is made invisible when---     this option is enabled.----leaveOk  :: Bool -> IO CInt-leaveOk True  = leaveok_c stdScr 1-leaveOk False = leaveok_c stdScr 0--foreign import ccall unsafe "HSCurses.h leaveok" -    leaveok_c :: Window -> (#type bool) -> IO CInt--clearOk :: Bool -> IO CInt-clearOk True  = clearok_c stdScr 1-clearOk False = clearok_c stdScr 0--foreign import ccall unsafe "HSCurses.h clearok" -    clearok_c :: Window -> (#type bool) -> IO CInt----------------------------------------------------------------------------foreign import ccall unsafe "HSCurses.h use_default_colors" -    useDefaultColors :: IO ()--defaultBackground, defaultForeground :: Color-defaultBackground = Color (-1)-defaultForeground = Color (-1)----------------------------------------------------------------------------defineKey :: CInt -> String -> IO ()-defineKey k s =  withCString s (\s' -> define_key s' k) >> return ()--foreign import ccall unsafe "HSCurses.h define_key" -    define_key :: Ptr CChar -> CInt -> IO ()------- | >  The program must call endwin for each terminal being used before---   >  exiting from curses.----endWin :: IO ()-endWin = throwIfErr_ "endwin" endwin-foreign import ccall unsafe "HSCurses.h endwin" endwin :: IO CInt--------------------------------------------------------------------------------- | get the dimensions of the screen----scrSize :: IO (Int, Int)-scrSize = do-    lnes <- peek linesPtr-    cols <- peek colsPtr-    return (fromIntegral lnes, fromIntegral cols)--foreign import ccall "HSCurses.h &LINES" linesPtr :: Ptr CInt-foreign import ccall "HSCurses.h &COLS"  colsPtr  :: Ptr CInt------- | refresh curses windows and lines. curs_refresh(3)----refresh :: IO ()-refresh = throwIfErr_ "refresh" refresh_c--foreign import ccall unsafe "HSCurses.h refresh" -    refresh_c :: IO CInt------- | Do an actual update. Used after endWin on linux to restore the terminal----update :: IO ()-update = throwIfErr_ "update" update_c--foreign import ccall unsafe "HSCurses.h doupdate" -    update_c :: IO CInt----------------------------------------------------------------------------hasColors :: IO Bool-hasColors = liftM (/= 0) has_colors-foreign import ccall unsafe "HSCurses.h has_colors" has_colors :: IO (#type bool)------- | Initialise the color settings, also sets the screen to the--- default colors (white on black)----startColor :: IO ()-startColor = throwIfErr_ "start_color" start_color-foreign import ccall unsafe start_color :: IO CInt--newtype Pair = Pair Int deriving (Eq, Ord, Ix, Show)------- | colorPairs defines the maximum number of color-pairs the terminal--- can support). ----colorPairs :: IO Int-colorPairs = fmap fromIntegral $ peek colorPairsPtr--foreign import ccall "HSCurses.h &COLOR_PAIRS" -        colorPairsPtr :: Ptr CInt--newtype Color = Color Int deriving (Eq, Ord, Ix)--colors :: IO Int-colors = liftM fromIntegral $ peek colorsPtr--foreign import ccall "HSCurses.h &COLORS" colorsPtr :: Ptr CInt----black, red, green, yellow, blue, magenta, cyan, white :: Color--color :: String -> Maybe Color-color "default"  = Just $ Color (-1)-color "black"    = Just $ Color (#const COLOR_BLACK)-color "red"      = Just $ Color (#const COLOR_RED)-color "green"    = Just $ Color (#const COLOR_GREEN)-color "yellow"   = Just $ Color (#const COLOR_YELLOW)-color "blue"     = Just $ Color (#const COLOR_BLUE)-color "magenta"  = Just $ Color (#const COLOR_MAGENTA)-color "cyan"     = Just $ Color (#const COLOR_CYAN)-color "white"    = Just $ Color (#const COLOR_WHITE)-color _ =  Nothing-------- |   curses support color attributes  on  terminals  with  that---     capability.   To  use  these  routines start_color must be---     called, usually right after initscr.   Colors  are  always---     used  in pairs (referred to as color-pairs).  A color-pair---     consists of a foreground  color  (for  characters)  and  a---     background color (for the blank field on which the charac----     ters are displayed).  A programmer  initializes  a  color----     pair  with  the routine init_pair.  After it has been ini----     tialized, COLOR_PAIR(n), a macro  defined  in  <curses.h>,---     can be used as a new video attribute.------     If  a  terminal  is capable of redefining colors, the pro----     grammer can use the routine init_color to change the defi----     nition   of   a   color.------     The init_pair routine changes the definition of  a  color----     pair.   It takes three arguments: the number of the color----     pair to be changed, the foreground color number,  and  the---     background color number.  For portable applications:------     -    The value of the first argument must be between 1 and---          COLOR_PAIRS-1.------     -    The value of the second and third arguments  must  be---          between  0  and  COLORS (the 0 color pair is wired to---          white on black and cannot be changed).-------initPair :: Pair -> Color -> Color -> IO ()-initPair (Pair p) (Color f) (Color b) =-    throwIfErr_ "init_pair" $-        init_pair (fromIntegral p) (fromIntegral f) (fromIntegral b)--foreign import ccall unsafe -    init_pair :: CShort -> CShort -> CShort -> IO CInt---pairContent :: Pair -> IO (Color, Color)-pairContent (Pair p) =-    alloca $ \fPtr ->-    alloca $ \bPtr -> do-        throwIfErr "pair_content" $ pair_content (fromIntegral p) fPtr bPtr-        f <- peek fPtr-        b <- peek bPtr-        return (Color (fromIntegral f), Color (fromIntegral b))--foreign import ccall unsafe pair_content :: CShort -> Ptr CShort -> Ptr CShort -> IO CInt--canChangeColor :: IO Bool-canChangeColor = liftM (/= 0) can_change_color--foreign import ccall unsafe can_change_color :: IO (#type bool)--initColor :: Color -> (Int, Int, Int) -> IO ()-initColor (Color c) (r, g, b) =-    throwIfErr_ "init_color" $-        init_color (fromIntegral c) (fromIntegral r) (fromIntegral g) (fromIntegral b)-foreign import ccall unsafe init_color :: CShort -> CShort -> CShort -> CShort -> IO CInt--colorContent :: Color -> IO (Int, Int, Int)-colorContent (Color c) =-    alloca $ \rPtr ->-    alloca $ \gPtr ->-    alloca $ \bPtr -> do-        throwIfErr "color_content" $ color_content (fromIntegral c) rPtr gPtr bPtr-        r <- peek rPtr-        g <- peek gPtr-        b <- peek bPtr-        return (fromIntegral r, fromIntegral g, fromIntegral b)--foreign import ccall unsafe -    color_content :: CShort -> Ptr CShort -> Ptr CShort -> Ptr CShort -> IO CInt--foreign import ccall unsafe "HSCurses.h hs_curses_color_pair" -    colorPair :: Pair -> (#type chtype)-#def inline chtype hs_curses_color_pair (HsInt pair) {return COLOR_PAIR (pair);}------------------ Attributes ----------------foreign import ccall unsafe "HSCurses.h attr_set" -    attr_set :: Attr -> CShort -> Ptr a -> IO Int---- foreign import ccall unsafe "HSCurses.h attr_get" :: Attr -> CShort -> Ptr a -> IO Int--foreign import ccall unsafe "HSCurses.h wattr_set" -    wattr_set :: Window -> Attr -> CInt -> Ptr a -> IO CInt--foreign import ccall unsafe "HSCurses.h wattr_get" -    wattr_get :: Window -> Ptr Attr -> Ptr CShort -> Ptr a -> IO CInt--foreign import ccall "HSCurses.h attr_on" attr_on :: (#type attr_t) -> Ptr a -> IO Int-foreign import ccall "HSCurses.h attr_off" attr_off :: (#type attr_t) -> Ptr a -> IO Int-foreign import ccall "HSCurses.h attron" attron :: Int -> IO Int-foreign import ccall "HSCurses.h attroff" attroff :: Int -> IO Int-foreign import ccall unsafe "HSCurses.h wattron" wattron :: Window -> CInt -> IO CInt-foreign import ccall unsafe "HSCurses.h wattroff" wattroff :: Window -> CInt -> IO CInt-foreign import ccall standout :: IO Int-foreign import ccall standend :: IO Int------- |----wAttrSet :: Window -> (Attr,Pair) -> IO ()-wAttrSet w (a,(Pair p)) = throwIfErr_ "wattr_set" $ -    wattr_set w a (fromIntegral p) nullPtr------- | manipulate the current attributes of the named window. see curs_attr(3)----wAttrGet :: Window -> IO (Attr,Pair)-wAttrGet w =-    alloca $ \pa -> -        alloca $ \pp -> do-            throwIfErr_ "wattr_get" $ wattr_get w pa pp nullPtr-            a <- peek pa-            p <- peek pp-            return (a,Pair $ fromIntegral p)---newtype Attr = Attr (#type attr_t) deriving (Eq,Storable,Bits, Num, Show)------- | Normal display (no highlight)----attr0 :: Attr-attr0 = Attr (#const WA_NORMAL)--isAltCharset, isBlink, isBold, isDim, isHorizontal, isInvis, isLeft,-    isLow, isProtect, isReverse, isRight, isStandout, isTop,-    isUnderline, isVertical :: Attr -> Bool--isAltCharset = isAttr (#const WA_ALTCHARSET)-isBlink      = isAttr (#const WA_BLINK)-isBold       = isAttr (#const WA_BOLD)-isDim        = isAttr (#const WA_DIM)-isHorizontal = isAttr (#const WA_HORIZONTAL)-isInvis      = isAttr (#const WA_INVIS)-isLeft       = isAttr (#const WA_LEFT)-isLow        = isAttr (#const WA_LOW)-isProtect    = isAttr (#const WA_PROTECT)-isReverse    = isAttr (#const WA_REVERSE)-isRight      = isAttr (#const WA_RIGHT)-isStandout   = isAttr (#const WA_STANDOUT)-isTop        = isAttr (#const WA_TOP)-isUnderline  = isAttr (#const WA_UNDERLINE)-isVertical   = isAttr (#const WA_VERTICAL)--isAttr :: (#type attr_t) -> Attr -> Bool-isAttr b (Attr a) = a .&. b /= 0------- | Setting attributes----setAltCharset, setBlink, setBold, setDim, setHorizontal, setInvis,-    setLeft, setLow, setProtect, setReverse, setRight, setStandout,-    setTop, setUnderline, setVertical :: Attr -> Bool -> Attr--setAltCharset = setAttr (#const WA_ALTCHARSET)-setBlink      = setAttr (#const WA_BLINK)-setBold       = setAttr (#const WA_BOLD)-setDim        = setAttr (#const WA_DIM)-setHorizontal = setAttr (#const WA_HORIZONTAL)-setInvis      = setAttr (#const WA_INVIS)-setLeft       = setAttr (#const WA_LEFT)-setLow        = setAttr (#const WA_LOW)-setProtect    = setAttr (#const WA_PROTECT)-setReverse    = setAttr (#const WA_REVERSE)-setRight      = setAttr (#const WA_RIGHT)-setStandout   = setAttr (#const WA_STANDOUT)-setTop        = setAttr (#const WA_TOP)-setUnderline  = setAttr (#const WA_UNDERLINE)-setVertical   = setAttr (#const WA_VERTICAL)--setAttr :: (#type attr_t) -> Attr -> Bool -> Attr-setAttr b (Attr a) False = Attr (a .&. complement b)-setAttr b (Attr a) True  = Attr (a .|.            b)--attrPlus :: Attr -> Attr -> Attr-attrPlus (Attr a) (Attr b) = Attr (a .|. b)--attrSet :: Attr -> Pair -> IO ()-attrSet attr (Pair p) = throwIfErr_ "attrset" $-    attr_set attr (fromIntegral p) nullPtr--attrOn :: Attr -> IO ()-attrOn (Attr attr) = throwIfErr_ "attr_on" $-    attr_on attr nullPtr---attrOff :: Attr -> IO ()-attrOff (Attr attr) = throwIfErr_ "attr_off" $-    attr_off attr nullPtr----wAttrOn :: Window -> Int -> IO ()-wAttrOn w x = throwIfErr_ "wattron" $ wattron w (fi x)--wAttrOff :: Window -> Int -> IO ()-wAttrOff w x = throwIfErr_ "wattroff" $ wattroff w (fi x)--attrDimOn :: IO ()-attrDimOn  = throwIfErr_ "attron A_DIM" $-    attron (#const A_DIM) --attrDimOff :: IO ()-attrDimOff = throwIfErr_ "attroff A_DIM" $-    attroff (#const A_DIM) --attrBoldOn :: IO ()-attrBoldOn  = throwIfErr_ "attron A_BOLD" $-    attron (#const A_BOLD) --attrBoldOff :: IO ()-attrBoldOff = throwIfErr_ "attroff A_BOLD" $-    attroff (#const A_BOLD) ---attrDim :: Int-attrDim = (#const A_DIM)-attrBold :: Int-attrBold = (#const A_BOLD)----------------------------------------------------------------------------mvWAddStr :: Window -> Int -> Int -> String -> IO ()-mvWAddStr w y x str = wMove w y x >> wAddStr w str --addLn :: IO ()-addLn = wAddStr stdScr "\n" ------- | normalise the string, stripping \\r and making control chars--- printable. Called over all output(?)--{--normalise :: String -> String-normalise []        = []-normalise ('\r':cs) = normalise cs-normalise (c:cs) | isControl c   = '@' : normalise cs-                 | otherwise     = c   : normalise cs-{-# INLINE normalise #-}--}--{--normalise s = map f . filter (/= '\r') s-    where-        f c | isPrint c  = c-        f c = '@'--}----------------------------------------------------------------------------#if defined(HAVE_WCHAR_H) && defined(HAVE_LIBNCURSESW)----wAddStr :: Window -> String -> IO ()---wAddStr w str = throwIfErr_ ("waddnwstr: " ++ show str) $ withCWStringLen (normalise str) (\(ws,len) -> waddnwstr w ws (fi len))-    -foreign import ccall unsafe -    waddnwstr :: Window -> CWString -> CInt -> IO CInt--foreign import ccall unsafe -    waddch :: Window -> (#type chtype) -> IO CInt--wAddStr :: Window -> String -> IO ()-wAddStr win str = do-    let-        convStr f = case f [] of-            [] -> return ()-            s  -> throwIfErr_ "waddnstr" $-                withCWStringLen  (s) (\(ws,len) ->  (waddnwstr win ws (fi len)))-        loop []        acc = convStr acc-        loop (ch:str') acc = recognize-            ch-            (loop str' (acc . (ch:)))-            (\ch' -> do-                convStr acc-                throwIfErr "waddch" $ waddch win ch'-                loop str' id)-    loop str id --#else------- This is heavily called, and does a lot of allocs.  We walk over all--- the string accumulating a list of characters to be drawn.------ Got it down to:------      wAddStr Yi.Curses 20.0   38.1---      wAddStr Yi.Curses 10.0   32.5--- --- TODO make this way less expensive. That accum sucks.--- use difference lists for O(1) append----wAddStr :: Window -> [Char] -> IO ()-wAddStr _   [] = return ()-wAddStr win s  = throwIfErr_ ("waddnstr: <" ++ s ++ ">") $-    withLCStringLen (s) (\(ws,len) -> waddnstr win ws (fi len))--foreign import ccall threadsafe-    waddnstr :: Window -> CString -> CInt -> IO CInt--foreign import ccall threadsafe-    waddch :: Window -> (#type chtype) -> IO CInt--foreign import ccall threadsafe -    waddchnstr :: Window -> CString -> CInt -> IO CInt--#endif--foreign import ccall threadsafe-    vline  :: Char -> Int -> IO ()--------------------------------------------------------------------------------- what ?-----#let translate_attr attr =                              \-    "(if a .&. %lu /= 0 then %lu else 0) .|.",          \-    (unsigned long) WA_##attr, (unsigned long) A_##attr--bkgrndSet :: Attr -> Pair -> IO ()-bkgrndSet (Attr a) p = bkgdset $-    fromIntegral (ord ' ') .|.-    #translate_attr ALTCHARSET-    #translate_attr BLINK-    #translate_attr BOLD-    #translate_attr DIM-    #translate_attr INVIS-    #translate_attr PROTECT-    #translate_attr REVERSE-    #translate_attr STANDOUT-    #translate_attr UNDERLINE-    colorPair p--foreign import ccall unsafe bkgdset :: (#type chtype) -> IO ()--erase :: IO ()-erase = throwIfErr_ "erase" $ werase_c  stdScr-foreign import ccall unsafe "werase" werase_c :: Window -> IO CInt--wclear :: Window -> IO ()-wclear w = throwIfErr_ "wclear" $ wclear_c  w-foreign import ccall unsafe "wclear" wclear_c :: Window -> IO CInt--clrToEol :: IO ()-clrToEol = throwIfErr_ "clrtoeol" clrtoeol-foreign import ccall unsafe clrtoeol :: IO CInt------- | >    move the cursor associated with the window---   >    to line y and column x.  This routine does  not  move  the---   >    physical  cursor  of the terminal until refresh is called.---   >    The position specified is relative to the upper  left-hand---   >    corner of the window, which is (0,0).------ Note that 'move_c' may be a macro.----move :: Int -> Int -> IO ()-move y x = throwIfErr_ "move" $ move_c (fromIntegral y) (fromIntegral x)--foreign import ccall unsafe "move" -    move_c :: CInt -> CInt -> IO CInt------- | >    move the cursor associated with the window---   >    to line y and column x.  This routine does  not  move  the---   >    physical  cursor  of the terminal until refresh is called.---   >    The position specified is relative to the upper  left-hand---   >    corner of the window, which is (0,0).----wMove :: Window -> Int -> Int -> IO ()-wMove w y x = throwIfErr_ "wmove" $ wmove w (fi y) (fi x)--foreign import ccall unsafe  -    wmove :: Window -> CInt -> CInt -> IO CInt----------------------- Cursor routines---------------------data CursorVisibility = CursorInvisible | CursorVisible | CursorVeryVisible--vis_c :: CursorVisibility -> CInt-vis_c vis = case vis of-    CursorInvisible   -> 0-    CursorVisible     -> 1-    CursorVeryVisible -> 2-    -c_vis :: CInt -> CursorVisibility-c_vis 0 = CursorInvisible-c_vis 1 = CursorVisible-c_vis 2 = CursorVeryVisible-c_vis n = error ("Illegal C value for cursor visibility: " ++ show n)------- | Set the cursor state------ >       The curs_set routine sets  the  cursor  state  is  set  to--- >       invisible, normal, or very visible for visibility equal to--- >       0, 1, or 2 respectively.  If  the  terminal  supports  the--- >       visibility   requested,   the  previous  cursor  state  is--- >       returned; otherwise, ERR is returned.----cursSet :: CursorVisibility -> IO CursorVisibility-cursSet CursorInvisible = -    do leaveOk True-       old <- curs_set 0-       return $ c_vis old-cursSet v = -    do leaveOk False -       old <- curs_set (vis_c v)-       return $ c_vis old--foreign import ccall unsafe "HSCurses.h curs_set" -    curs_set :: CInt -> IO CInt---- --- | Get the current cursor coordinates----getYX :: Window -> IO (Int, Int)-getYX w =-    alloca $ \py ->                 -- allocate two ints on the stack-        alloca $ \px -> do-            nomacro_getyx w py px   -- writes current cursor coords-            y <- peek py-            x <- peek px-            return (fromIntegral y, fromIntegral x)------- | Get the current cursor coords, written into the two argument ints.------ >    The getyx macro places the current cursor position of the given--- >    window in the two integer variables y and x.------      void getyx(WINDOW *win, int y, int x);----foreign import ccall unsafe "HSCursesUtils.h hscurses_nomacro_getyx" -        nomacro_getyx :: Window -> Ptr CInt -> Ptr CInt -> IO ()-----------------------------------------------------------------------------touchWin :: Window -> IO ()-touchWin w = throwIfErr_ "touchwin" $ touchwin w-foreign import ccall touchwin :: Window -> IO CInt--newPad :: Int -> Int -> IO Window-newPad nlines ncols = throwIfNull "newpad" $ -    newpad (fromIntegral nlines) (fromIntegral ncols)--pRefresh :: Window -> Int -> Int -> Int -> Int -> Int -> Int -> IO ()-pRefresh pad pminrow pmincol sminrow smincol smaxrow smaxcol = -    throwIfErr_ "prefresh" $-        prefresh pad (fromIntegral pminrow) -                     (fromIntegral pmincol) -                     (fromIntegral sminrow) -                     (fromIntegral smincol) -                     (fromIntegral smaxrow) -                     (fromIntegral smaxcol)--delWin :: Window -> IO ()-delWin w = throwIfErr_ "delwin" $ delwin w-    -foreign import ccall unsafe -    prefresh :: Window -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt--foreign import ccall unsafe -    newpad :: CInt -> CInt -> IO Window--foreign import ccall unsafe -    delwin :: Window -> IO CInt--newWin :: Int -> Int -> Int -> Int -> IO Window-newWin nlines ncolumn begin_y begin_x = throwIfNull "newwin" $ -    newwin (fi nlines) (fi ncolumn) (fi begin_y) (fi begin_x)--foreign import ccall unsafe -    newwin :: CInt -> CInt -> CInt -> CInt -> IO Window--wClrToEol :: Window -> IO ()-wClrToEol w = throwIfErr_ "wclrtoeol" $ wclrtoeol w--foreign import ccall unsafe wclrtoeol :: Window -> IO CInt------- | >      The getch, wgetch, mvgetch and mvwgetch, routines read a---   >      character  from the window.----foreign import ccall unsafe getch :: IO CInt----foreign import ccall unsafe def_prog_mode :: IO CInt---foreign import ccall unsafe reset_prog_mode :: IO CInt-foreign import ccall unsafe flushinp :: IO CInt--foreign import ccall unsafe "HSCurses.h noqiflush" -    noqiflush :: IO ()--foreign import ccall unsafe "HSCurses.h beep" c_beep :: IO CInt-foreign import ccall unsafe "HSCurses.h flash" c_flash :: IO CInt--beep :: IO ()-beep = do-    br <- c_beep-    when (br /= (#const OK)) (c_flash >> return ()) -------------------------------------------------------------------------------- | Map curses keys to key abstraction-----data Key-    = KeyChar Char | KeyBreak | KeyDown | KeyUp | KeyLeft | KeyRight-    | KeyHome | KeyBackspace | KeyF Int | KeyDL | KeyIL | KeyDC-    | KeyIC | KeyEIC | KeyClear | KeyEOS | KeyEOL | KeySF | KeySR-    | KeyNPage | KeyPPage | KeySTab | KeyCTab | KeyCATab | KeyEnter-    | KeySReset | KeyReset | KeyPrint | KeyLL | KeyA1 | KeyA3-    | KeyB2 | KeyC1 | KeyC3 | KeyBTab | KeyBeg | KeyCancel | KeyClose-    | KeyCommand | KeyCopy | KeyCreate | KeyEnd | KeyExit | KeyFind-    | KeyHelp | KeyMark | KeyMessage | KeyMove | KeyNext | KeyOpen-    | KeyOptions | KeyPrevious | KeyRedo | KeyReference | KeyRefresh-    | KeyReplace | KeyRestart | KeyResume | KeySave | KeySBeg-    | KeySCancel | KeySCommand | KeySCopy | KeySCreate | KeySDC-    | KeySDL | KeySelect | KeySEnd | KeySEOL | KeySExit | KeySFind-    | KeySHelp | KeySHome | KeySIC | KeySLeft | KeySMessage | KeySMove-    | KeySNext | KeySOptions | KeySPrevious | KeySPrint | KeySRedo-    | KeySReplace | KeySRight | KeySRsume | KeySSave | KeySSuspend-    | KeySUndo | KeySuspend | KeyUndo | KeyResize | KeyMouse | KeyUnknown Int-    deriving (Eq,Show)--decodeKey :: CInt -> Key-decodeKey key = case key of-    _ | key >= 0 && key <= 255 -> KeyChar (chr (fromIntegral key))-    (#const KEY_BREAK)         -> KeyBreak-    (#const KEY_DOWN)          -> KeyDown-    (#const KEY_UP)            -> KeyUp-    (#const KEY_LEFT)          -> KeyLeft-    (#const KEY_RIGHT)         -> KeyRight-    (#const KEY_HOME)          -> KeyHome-    (#const KEY_BACKSPACE)     -> KeyBackspace-    _ | key >= (#const KEY_F0) && key <= (#const KEY_F(63))-                               -> KeyF (fromIntegral (key - #const KEY_F0))-    (#const KEY_DL)            -> KeyDL-    (#const KEY_IL)            -> KeyIL-    (#const KEY_DC)            -> KeyDC-    (#const KEY_IC)            -> KeyIC-    (#const KEY_EIC)           -> KeyEIC-    (#const KEY_CLEAR)         -> KeyClear-    (#const KEY_EOS)           -> KeyEOS-    (#const KEY_EOL)           -> KeyEOL-    (#const KEY_SF)            -> KeySF-    (#const KEY_SR)            -> KeySR-    (#const KEY_NPAGE)         -> KeyNPage-    (#const KEY_PPAGE)         -> KeyPPage-    (#const KEY_STAB)          -> KeySTab-    (#const KEY_CTAB)          -> KeyCTab-    (#const KEY_CATAB)         -> KeyCATab-    (#const KEY_ENTER)         -> KeyEnter-    (#const KEY_SRESET)        -> KeySReset-    (#const KEY_RESET)         -> KeyReset-    (#const KEY_PRINT)         -> KeyPrint-    (#const KEY_LL)            -> KeyLL-    (#const KEY_A1)            -> KeyA1-    (#const KEY_A3)            -> KeyA3-    (#const KEY_B2)            -> KeyB2-    (#const KEY_C1)            -> KeyC1-    (#const KEY_C3)            -> KeyC3-    (#const KEY_BTAB)          -> KeyBTab-    (#const KEY_BEG)           -> KeyBeg-    (#const KEY_CANCEL)        -> KeyCancel-    (#const KEY_CLOSE)         -> KeyClose-    (#const KEY_COMMAND)       -> KeyCommand-    (#const KEY_COPY)          -> KeyCopy-    (#const KEY_CREATE)        -> KeyCreate-    (#const KEY_END)           -> KeyEnd-    (#const KEY_EXIT)          -> KeyExit-    (#const KEY_FIND)          -> KeyFind-    (#const KEY_HELP)          -> KeyHelp-    (#const KEY_MARK)          -> KeyMark-    (#const KEY_MESSAGE)       -> KeyMessage-    (#const KEY_MOVE)          -> KeyMove-    (#const KEY_NEXT)          -> KeyNext-    (#const KEY_OPEN)          -> KeyOpen-    (#const KEY_OPTIONS)       -> KeyOptions-    (#const KEY_PREVIOUS)      -> KeyPrevious-    (#const KEY_REDO)          -> KeyRedo-    (#const KEY_REFERENCE)     -> KeyReference-    (#const KEY_REFRESH)       -> KeyRefresh-    (#const KEY_REPLACE)       -> KeyReplace-    (#const KEY_RESTART)       -> KeyRestart-    (#const KEY_RESUME)        -> KeyResume-    (#const KEY_SAVE)          -> KeySave-    (#const KEY_SBEG)          -> KeySBeg-    (#const KEY_SCANCEL)       -> KeySCancel-    (#const KEY_SCOMMAND)      -> KeySCommand-    (#const KEY_SCOPY)         -> KeySCopy-    (#const KEY_SCREATE)       -> KeySCreate-    (#const KEY_SDC)           -> KeySDC-    (#const KEY_SDL)           -> KeySDL-    (#const KEY_SELECT)        -> KeySelect-    (#const KEY_SEND)          -> KeySEnd-    (#const KEY_SEOL)          -> KeySEOL-    (#const KEY_SEXIT)         -> KeySExit-    (#const KEY_SFIND)         -> KeySFind-    (#const KEY_SHELP)         -> KeySHelp-    (#const KEY_SHOME)         -> KeySHome-    (#const KEY_SIC)           -> KeySIC-    (#const KEY_SLEFT)         -> KeySLeft-    (#const KEY_SMESSAGE)      -> KeySMessage-    (#const KEY_SMOVE)         -> KeySMove-    (#const KEY_SNEXT)         -> KeySNext-    (#const KEY_SOPTIONS)      -> KeySOptions-    (#const KEY_SPREVIOUS)     -> KeySPrevious-    (#const KEY_SPRINT)        -> KeySPrint-    (#const KEY_SREDO)         -> KeySRedo-    (#const KEY_SREPLACE)      -> KeySReplace-    (#const KEY_SRIGHT)        -> KeySRight-    (#const KEY_SRSUME)        -> KeySRsume-    (#const KEY_SSAVE)         -> KeySSave-    (#const KEY_SSUSPEND)      -> KeySSuspend-    (#const KEY_SUNDO)         -> KeySUndo-    (#const KEY_SUSPEND)       -> KeySuspend-    (#const KEY_UNDO)          -> KeyUndo-#ifdef KEY_RESIZE-    (#const KEY_RESIZE)        -> KeyResize-#endif-#ifdef KEY_MOUSE-    (#const KEY_MOUSE)         -> KeyMouse-#endif-    _                          -> KeyUnknown (fromIntegral key)--keyResizeCode :: Maybe CInt-#ifdef KEY_RESIZE-keyResizeCode = Just (#const KEY_RESIZE)-#else-keyResizeCode = Nothing-#endif---- ------------------------------------------------------------------------ get char------- ncurses ungetch and Haskell's threadWaitRead do not work together well.--- So I decided to implement my own input queue.--ungetCh i = -    do debug "ungetCh called"-       writeChan inputBuf (BufDirect (fi i))--data BufData = BufDirect CInt  -- data directly available-             | DataViaGetch    -- data can be obtained by calling getch--inputBuf :: Chan BufData-inputBuf = unsafePerformIO newChan-{-# NOINLINE inputBuf #-}--getchToInputBuf :: IO ()-getchToInputBuf =-    do threadWaitRead (fi 0)-       {- From the (n)curses manpage:-       Programmers  concerned  about portability should be prepared for either-       of two cases: (a) signal receipt does not interrupt getch;  (b)  signal-       receipt  interrupts getch and causes it to return ERR with errno set to-       EINTR.  Under the ncurses implementation, handled signals never  inter$B!>(B-       rupt getch.-       -}-       -- we only signalize that getch can now called without getting blocked.-       -- directly calling `getch' might result in losing the character just-       -- read (race condition).-       debug "now input available on stdin"-       writeChan inputBuf DataViaGetch------ | read a character from the window----getCh :: IO Key-getCh = -    do debug "getCh called"-       tid <- forkIO getchToInputBuf-       d <- readChan inputBuf-       killThread tid  -- we can kill the thread savely, because the thread does-                       -- not read any data via getch-       v <- case d of-              BufDirect x -> -                do debug "getCh: getting data directly from buffer"-                   return x-              DataViaGetch -> -                do debug "getCh: getting data via getch"-                   getch -- won't block!-       case v of-         (#const ERR) -> -- NO CODE IN THIS LINE -             do e <- getErrno-                if e `elem` [eAGAIN, eINTR] -                   then do debug "Curses.getCh returned eAGAIN or eINTR" -                           getCh-                   else throwErrno "HSCurses.Curses.getch"-         k -> let k' = decodeKey k-                  in do debug ("getCh: result = " ++ show k')-                        return k'---resizeTerminal :: Int -> Int -> IO ()--#ifdef HAVE_RESIZETERM-resizeTerminal a b = throwIfErr_ "resizeterm"  $ resizeterm (fi a) (fi b)--foreign import ccall unsafe "HSCurses.h resizeterm" -    resizeterm :: CInt -> CInt -> IO CInt-#else-resizeTerminal _ _ = return ()-#endif------- | The SIGWINCH signal is sent whenever the terminal size changes.--- This signal is not available on all platforms, so it is a |Maybe| value.----cursesSigWinch :: Maybe Signal-#ifdef SIGWINCH-cursesSigWinch = Just (#const SIGWINCH)-#else-cursesSigWinch = Nothing-#endif----------------- Test case---------------cursesTest :: IO ()-cursesTest = do-    initScr-    hc <- hasColors -    when hc startColor-    ccc <- canChangeColor-    (ys,xs) <- scrSize-    cp <- colorPairs-    cs <- colors-    endWin-    putStrLn $ "ScreenSize: " ++ show (xs,ys) -    putStrLn $ "hasColors: " ++ show hc-    putStrLn $ "canChangeColor: " ++ show ccc-    putStrLn $ "colorPairs: " ++ show cp-    putStrLn $ "colors: " ++ show cs--    ----------------------- Mouse Routines--------------------data MouseEvent = MouseEvent {-    mouseEventId :: Int, -    mouseEventX :: Int, -    mouseEventY :: Int, -    mouseEventZ :: Int, -    mouseEventButton :: [ButtonEvent]-   } deriving(Show)--data ButtonEvent = ButtonPressed Int | ButtonReleased Int | ButtonClicked Int | -    ButtonDoubleClicked Int | ButtonTripleClicked Int | ButtonShift | ButtonControl | ButtonAlt -                deriving(Eq,Show)--withMouseEventMask :: MonadIO m => [ButtonEvent] -> m a -> m a--#ifdef KEY_MOUSE--foreign import ccall unsafe "HSCurses.h mousemask" -    mousemask :: (#type mmask_t) -> Ptr (#type mmask_t) -> IO (#type mmask_t)--withMouseEventMask bes action = do-    ov <- liftIO $ alloca (\a ->  mousemask (besToMouseMask bes) a >> peek a) -    r <- action -    liftIO $ mousemask ov nullPtr -    return r--besToMouseMask :: [ButtonEvent] -> (#type mmask_t)-besToMouseMask bes = foldl' (.|.) 0 (map cb bes) where-    cb (ButtonPressed 1) = (#const BUTTON1_PRESSED)-    cb (ButtonPressed 2) = (#const BUTTON2_PRESSED)-    cb (ButtonPressed 3) = (#const BUTTON3_PRESSED)-    cb (ButtonPressed 4) = (#const BUTTON4_PRESSED)-    cb (ButtonReleased 1) = (#const BUTTON1_RELEASED)-    cb (ButtonReleased 2) = (#const BUTTON2_RELEASED)-    cb (ButtonReleased 3) = (#const BUTTON3_RELEASED)-    cb (ButtonReleased 4) = (#const BUTTON4_RELEASED)-    cb (ButtonClicked 1) = (#const BUTTON1_CLICKED)-    cb (ButtonClicked 2) = (#const BUTTON2_CLICKED)-    cb (ButtonClicked 3) = (#const BUTTON3_CLICKED)-    cb (ButtonClicked 4) = (#const BUTTON4_CLICKED)-    cb ButtonShift = (#const BUTTON_SHIFT)-    cb ButtonAlt = (#const BUTTON_ALT)-    cb ButtonControl = (#const BUTTON_CTRL)-    cb _ = 0---#else-withMouseEventMask _ a = a--#endif-----ulCorner, llCorner, urCorner, lrCorner, rTee, lTee, bTee, tTee, hLine,-    vLine, plus, s1, s9, diamond, ckBoard, degree, plMinus, bullet,-    lArrow, rArrow, dArrow, uArrow, board, lantern, block,-    s3, s7, lEqual, gEqual, pi, nEqual, sterling-    :: Char--ulCorner = chr 0x250C-llCorner = chr 0x2514-urCorner = chr 0x2510-lrCorner = chr 0x2518-rTee     = chr 0x2524-lTee     = chr 0x251C-bTee     = chr 0x2534-tTee     = chr 0x252C-hLine    = chr 0x2500-vLine    = chr 0x2502-plus     = chr 0x253C-s1       = chr 0x23BA -- was: 0xF800-s9       = chr 0x23BD -- was: 0xF804-diamond  = chr 0x25C6-ckBoard  = chr 0x2592-degree   = chr 0x00B0-plMinus  = chr 0x00B1-bullet   = chr 0x00B7-lArrow   = chr 0x2190-rArrow   = chr 0x2192-dArrow   = chr 0x2193-uArrow   = chr 0x2191-board    = chr 0x2591-lantern  = chr 0x256C-block    = chr 0x2588-s3       = chr 0x23BB -- was: 0xF801-s7       = chr 0x23BC -- was: 0xF803-lEqual   = chr 0x2264-gEqual   = chr 0x2265-pi       = chr 0x03C0-nEqual   = chr 0x2260-sterling = chr 0x00A3--{---- haddock doesn't like these commented out with ---   #if defined(__STDC_ISO_10646__)  && defined(HAVE_WADDNWSTR)-   #else --}--recognize :: Char -> IO a -> ((#type chtype) -> IO a) -> IO a-recognize _ch noConvert _convert = noConvert -- Handle the most common case first.------- ------------------------------------------------------------------------ code graveyard-----{---addStr :: String -> IO ()-addStr str =-    throwIfErr_ "addstr" $-    withCStringConv (readIORef cursesOutConv) str addstr-foreign import ccall unsafe addstr :: Ptr CChar -> IO CInt--addStrLn :: String -> IO ()-addStrLn str = addStr str >> addLn------- | add a string of characters to a curses window and advance cursor--- curs_addstr(3)----wAddStr :: Window -> String -> IO ()-wAddStr w str = throwIfErr_ "waddstr" $-    withCStringConv (readIORef cursesOutConv) str (waddstr w)--foreign import ccall unsafe waddstr :: Window -> Ptr CChar -> IO CInt---addGraphStr :: String -> IO ()-addGraphStr str = do-    conv <- readIORef cursesOutConv-    let-        convStr f = case f [] of-            [] -> return ()-            s  -> throwIfErr_ "addstr" $-                withCStringConv (return conv) s addstr-        loop []        acc = convStr acc-        loop (ch:str') acc = recognize-            ch-            (loop str' (acc . (ch:)))-            (\ch' -> do-                convStr acc-                throwIfErr "addch" $ addch ch'-                loop str' id)-    loop str id--addGraphStrLn :: String -> IO ()-addGraphStrLn str = do addGraphStr str; addLn---}---- vim: sw=4 ts=4
− HSCurses/CursesHelper.hs
@@ -1,473 +0,0 @@-{-# OPTIONS -cpp -#include HSCursesUtils.h -#include <signal.h> #-}---- --- Copyright (C) 2005 Stefan Wehr------ Derived from: yi/Curses/UI.hs---      Copyright (C) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons---      Released under the same license.------ Derived from: riot/UI.hs---      Copyright (c) Tuomo Valkonen 2004.---      Released under the same license.--- --- This program is free software; you can redistribute it and/or--- modify it under the terms of the GNU General Public License as--- published by the Free Software Foundation; either version 2 of--- the License, or (at your option) any later version.--- --- This program 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--- General Public License for more details.--- --- You should have received a copy of the GNU General Public License--- along with this program; if not, write to the Free Software--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA--- 02111-1307, USA.--- -----module HSCurses.CursesHelper (--        -- * UI initialisation -        start, end, suspend, resizeui,--        -- * Input-        getKey,--        -- * Drawing-        drawLine, drawCursor,--        -- * Navigation-        gotoTop,--        -- * Colors-        ForegroundColor(..), BackgroundColor(..),-        defaultColor, black, red, green, yellow, blue, magenta, cyan, white,--        -- * Attributes-        Attribute(..), convertAttributes,--        -- * Style-        Style(..), CursesStyle, mkCursesStyle, changeCursesStyle,-        setStyle, resetStyle, convertStyles,-        defaultStyle, defaultCursesStyle, withStyle, --        -- * Keys-        displayKey,--        -- * Helpers-        withCursor, withProgram-  )   where--import HSCurses.Curses hiding ( refresh, Window )-import qualified HSCurses.Curses as Curses-import HSCurses.Logging--import Char-import Data.Maybe-import Data.List-import Control.Monad.Trans-import HSCurses.MonadException-import System.Posix.Signals-------------- | @start@ initializes the UI and grabs the keyboard.------ This function installs a handler for the SIGWINCH signal--- which writes the KEY_RESIZE key to the input queue (if KEY_RESIZE and--- and SIGWINCH are both available). --- -start :: IO ()-start = do-    Curses.initCurses                   -- initialise the screen-    Curses.resetParams-    Curses.keypad Curses.stdScr True    -- grab the keyboard-    case (Curses.cursesSigWinch, Curses.keyResizeCode) of-      (Just sig, Just key) ->-          do installHandler sig (Catch $ sigwinch sig key) Nothing-             return ()-      _ -> debug ("cannot install SIGWINCH handler: signal=" ++ -                  show Curses.cursesSigWinch ++ ", KEY_RESIZE=" ++ -                  show Curses.keyResizeCode)-    where sigwinch sig key = -              do debug "SIGWINCH signal received"-                 Curses.ungetCh key-                 installHandler sig (Catch $ sigwinch sig key) Nothing-                 return ()--------- | Clean up and go home. ----end :: IO ()-end = do Curses.endWin--- Refresh is needed on linux. grr.-#if NCURSES_UPDATE_AFTER_END-         Curses.update-#endif------- | Suspend the program.----suspend :: IO ()-suspend = raiseSignal sigTSTP------- | @getKey refresh@ reads a key.------ The @refresh@ function is used to redraw the screen when the terminal size--- changes (see the documentatio of @start@ for a discussion of the problem).----getKey :: MonadIO m => m () -> m Key-getKey refresh = do-    k <- liftIO $ Curses.getCh-    debug ("getKey: " ++ show k)-    case k of-      KeyResize -> -          do refresh-             getKey refresh-      _ -> return k-------- | @drawLine n s@ draws @n@ characters of string @s@.----drawLine :: Int -> String -> IO ()--- lazy version is faster than calculating length of s-drawLine w s = Curses.wAddStr Curses.stdScr $! take w (s ++ repeat ' ')------- | Draw the cursor at the given position.----drawCursor :: (Int,Int) -> (Int, Int) -> IO ()-drawCursor (o_y,o_x) (y,x) = withCursor Curses.CursorVisible $ do-    gotoTop-    (h,w) <- scrSize-    Curses.wMove Curses.stdScr (min (h-1) (o_y + y)) (min (w-1) (o_x + x))------- | Move cursor to origin of stdScr.----gotoTop :: IO ()-gotoTop = Curses.wMove Curses.stdScr 0 0-------- | Resize the window--- From "Writing Programs with NCURSES", by Eric S. Raymond and --- Zeyd M. Ben-Halim-------resizeui :: IO (Int,Int)-resizeui = do-    Curses.endWin-    Curses.refresh-    Curses.scrSize---------------------------------------------------------------------------------- | Basic colors.----defaultColor :: Curses.Color-defaultColor = fromJust $ Curses.color "default"--black, red, green, yellow, blue, magenta, cyan, white :: Curses.Color-black     = fromJust $ Curses.color "black"-red       = fromJust $ Curses.color "red"-green     = fromJust $ Curses.color "green"-yellow    = fromJust $ Curses.color "yellow"-blue      = fromJust $ Curses.color "blue"-magenta   = fromJust $ Curses.color "magenta"-cyan      = fromJust $ Curses.color "cyan"-white     = fromJust $ Curses.color "white"------- | Converts a list of 'Curses.Color' pairs (foreground color and---   background color) into the curses representation 'Curses.Pair'.------   You should call this function exactly once, at application startup.------ (not visible outside this module)-colorsToPairs :: [(Curses.Color, Curses.Color)] -> IO [Curses.Pair]-colorsToPairs cs =-    do p <- Curses.colorPairs-       let nColors = length cs-           blackWhite = p < nColors-       if blackWhite-          then trace ("Terminal does not support enough colors. Number of " ++-                      " colors requested: " ++ show nColors ++ -                      ". Number of colors supported: " ++ show p)-                 return $ take nColors (repeat (Curses.Pair 0))-          else mapM toPairs (zip [1..] cs)-     where toPairs (n, (fg, bg)) = -               let p = Curses.Pair n -               in do Curses.initPair p fg bg-                     return p----------------------------------------------------------------------------- Nicer, user-visible color defs.------ We separate colors into dark and bright colors, to prevent users--- from erroneously constructing bright colors for dark backgrounds,--- which doesn't work.------- | Foreground colors.----data ForegroundColor-    = BlackF-    | GreyF-    | DarkRedF-    | RedF-    | DarkGreenF-    | GreenF-    | BrownF-    | YellowF-    | DarkBlueF-    | BlueF-    | PurpleF-    | MagentaF-    | DarkCyanF-    | CyanF-    | WhiteF-    | BrightWhiteF-    | DefaultF-    deriving (Eq, Show)------- | Background colors.----data BackgroundColor-    = BlackB-    | DarkRedB-    | DarkGreenB-    | BrownB-    | DarkBlueB-    | PurpleB-    | DarkCyanB-    | WhiteB-    | DefaultB-    deriving (Eq, Show)------- | Mapping abstract colours to ncurses attributes and colours------ (not visible outside this module)--convertBg :: BackgroundColor -> ([Attribute], Curses.Color)-convertBg c = case c of-    BlackB      -> ([], black)-    DarkRedB    -> ([], red)-    DarkGreenB  -> ([], green)-    BrownB      -> ([], yellow)-    DarkBlueB   -> ([], blue)-    PurpleB     -> ([], magenta)-    DarkCyanB   -> ([], cyan)-    WhiteB      -> ([], white)-    DefaultB    -> ([], defaultColor)--convertFg :: ForegroundColor -> ([Attribute], Curses.Color)-convertFg c = case c of-    BlackF       -> ([], black)-    GreyF        -> ([Bold], black)-    DarkRedF     -> ([], red)-    RedF         -> ([Bold], red)-    DarkGreenF   -> ([], green)-    GreenF       -> ([Bold], green)-    BrownF       -> ([], yellow)-    YellowF      -> ([Bold], yellow)-    DarkBlueF    -> ([], blue)-    BlueF        -> ([Bold], blue)-    PurpleF      -> ([], magenta)-    MagentaF     -> ([Bold], magenta)-    DarkCyanF    -> ([], cyan)-    CyanF        -> ([Bold], cyan)-    WhiteF       -> ([], white)-    BrightWhiteF -> ([Bold], white)-    DefaultF     -> ([], defaultColor)--------------------------------------------------------------------------------- | Abstractions for some commonly used attributes.----data Attribute = Bold-               | Underline-               | Dim-               | Reverse-               | Blink-               deriving (Eq, Show)------- | Converts an abstract attribute list into its curses representation.----convertAttributes :: [Attribute] -> Curses.Attr-convertAttributes = -    foldr setAttrs Curses.attr0-    where setAttrs Bold = setBoldA-          setAttrs Underline = setUnderlineA-          setAttrs Dim = setDimA-          setAttrs Reverse = setReverseA-          setAttrs Blink = setBlinkA--setBoldA, setUnderlineA, setDimA, -  setReverseA, setBlinkA :: Curses.Attr -> Curses.Attr-setBoldA = flip Curses.setBold True-setUnderlineA = flip Curses.setUnderline True-setDimA = flip Curses.setDim True-setReverseA = flip Curses.setReverse   True-setBlinkA = flip Curses.setBlink True-------------------------------------------------------------------------------- | A humand-readable style.----data Style = Style ForegroundColor BackgroundColor-           | AttributeStyle [Attribute] ForegroundColor BackgroundColor-           | ColorlessStyle [Attribute]-           deriving (Eq, Show)--defaultStyle :: Style-defaultStyle = Style DefaultF DefaultB------- | A style which uses the internal curses representations for---   attributes and colors.----data CursesStyle = CursesStyle Curses.Attr Curses.Pair-                 | ColorlessCursesStyle Curses.Attr-                 deriving (Eq, Show)--{--instance Show CursesStyle where-    show (CursesStyle _ _) = "CursesStyle"-    show (ColorlessCursesStyle _) = "ColorlessCursesStyle"--}--mkCursesStyle :: [Attribute] -> CursesStyle-mkCursesStyle attrs = ColorlessCursesStyle (convertAttributes attrs)------- | Changes the attributes of the given CursesStyle.----changeCursesStyle :: CursesStyle -> [Attribute] -> CursesStyle-changeCursesStyle (CursesStyle _ p) attrs =-    CursesStyle (convertAttributes attrs) p-changeCursesStyle _ attrs = ColorlessCursesStyle (convertAttributes attrs)--defaultCursesStyle :: CursesStyle-defaultCursesStyle = CursesStyle Curses.attr0 (Curses.Pair 0)------- | Reset the screen to normal values----resetStyle :: IO ()-resetStyle = setStyle defaultCursesStyle------- | Manipulate the current style of the standard screen----setStyle :: CursesStyle -> IO ()-setStyle (CursesStyle a p) = Curses.wAttrSet Curses.stdScr (a, p)-setStyle (ColorlessCursesStyle a) = -    do (_, p) <- Curses.wAttrGet Curses.stdScr-       Curses.wAttrSet Curses.stdScr (a, p)--withStyle :: MonadExcIO m => CursesStyle -> m a -> m a-withStyle style action = -    bracketM-        (liftIO $ do old <- Curses.wAttrGet Curses.stdScr    -- before-                     setStyle style-                     return old)-        (\old -> liftIO $ Curses.wAttrSet Curses.stdScr old) -- after-        (\_ -> action)                                       -- do this------- | Converts a list of human-readable styles into the corresponding---   curses representation. ------   This function should be called exactly once at application startup---   for all styles of the application.-convertStyles :: [Style] -> IO [CursesStyle]-convertStyles styleList =-    do let (attrs, cs) = unzip $ map convertStyle styleList-           cursesAttrs = map convertAttributes attrs-       cursesPairs <- colorsToPairs' cs-       let res = zipWith toCursesStyle cursesAttrs cursesPairs-       trace ("convertStyles: " ++ show (zip styleList res)) (return res)-    where convertStyle (Style fg bg) = convertStyle (AttributeStyle [] fg bg)-          convertStyle (AttributeStyle attrs fg bg) =-              let (afg, cfg) = convertFg fg-                  (abg, cbg) = convertBg bg-              in (afg ++ abg ++ attrs, Just (cfg, cbg))-          convertStyle (ColorlessStyle attrs) = (attrs, Nothing)-          colorsToPairs' cs = -              do pairs <- colorsToPairs (catMaybes cs)-                 return $ mergeNothing cs pairs-          mergeNothing (Just _:crest) (p:prest) = Just p -                                                  : mergeNothing crest prest-          mergeNothing (Nothing:crest) ps = Nothing : mergeNothing crest ps-          mergeNothing [] [] = []-          toCursesStyle cursesAttrs Nothing = -              ColorlessCursesStyle cursesAttrs-          toCursesStyle cursesAttrs (Just cursesPair) = -              CursesStyle cursesAttrs cursesPair-------------------------------------------------------------------------------- | Converting keys to humand-readable strings-----displayKey :: Key -> String-displayKey (KeyChar ' ') = "<Space>"-displayKey (KeyChar '\t') = "<Tab>"-displayKey (KeyChar '\r') = "<Enter>"-displayKey (KeyChar c) -    | isPrint c = [c]-displayKey (KeyChar c)  -- Control-    | ord '\^A' <= ord c && ord c <= ord '\^Z'-        = let c' = chr $ ord c - ord '\^A' + ord 'a'-              in '^':[toUpper c']-displayKey (KeyChar c) = show c-displayKey KeyDown = "<Down>"-displayKey KeyUp = "<Up>"-displayKey KeyLeft = "<Left>"-displayKey KeyRight = "<Right>"-displayKey KeyHome = "<Home>"-displayKey KeyBackspace = "<BS>"-displayKey (KeyF i) = 'F' : show i-displayKey KeyNPage = "<NPage>"-displayKey KeyPPage = "<PPage>"-displayKey KeyEnter = "<Return>"-displayKey KeyEnd = "<End>"-displayKey KeyIC = "<Insert>"-displayKey KeyDC = "<Delete>"-displayKey k = show k--------------------------------------------------------------------------------- | Other helpers---------- | set the cursor, and do action----withCursor :: MonadExcIO m => CursorVisibility -> m a -> m a-withCursor nv action = -    bracketM-        (liftIO $ Curses.cursSet nv)             -- before-        (\vis -> liftIO $ Curses.cursSet vis)    -- after-        (\_ -> action)                           -- do this--withProgram :: MonadExcIO m => m a -> m a-withProgram action = withCursor CursorVisible $ -    bracketM_ (liftIO endWin) (liftIO flushinp) action
− HSCurses/IConv.hsc
@@ -1,205 +0,0 @@-{-# OPTIONS -fffi #-}------- Copyright (c) 2004 Tuomo Valkonen <tuomov at iki dot fi>--- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons--- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de--- --- This library 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 2.1 of the License, or (at your option) any later version.--- --- This library 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 this library; if not, write to the Free Software--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA----- | Iconv binding--#if HAVE_ICONV_H-# include <iconv.h>-#endif--module HSCurses.IConv {-(-    IConv,-    iconv,-    iconv_,-    with_iconv,-    to_unicode, -    from_unicode,-    to_unicode_,-    from_unicode_-  )-} where--import HSCurses.CWString          ( peekUTF8StringLen, withUTF8StringLen )--import Foreign-import Foreign.C-import Foreign.C.String-import Control.Exception    ( Exception, try, bracket )--type IConv = Ptr () --(#type iconv_t)--err_ptr :: Ptr b -> Bool-err_ptr p = p == (plusPtr nullPtr (-1))--throw_if_not_2_big :: String -> IO CSize -> IO CSize-throw_if_not_2_big s r_ = do-    r <- r_-    if r == fromIntegral (-1 :: Int) then do-        errno <- getErrno-        if errno /= e2BIG then-	    throwErrno s-	  else-	    return r-      else-        return r-    -iconv_open :: String -> String -> IO IConv-iconv_open to from =-    withCString to $-        \cto -> withCString from $-            \cfrom -> do-	        throwErrnoIf err_ptr "iconv_open" -		    $ c_iconv_open cto cfrom---iconv_close :: IConv -> IO ()-iconv_close ic = -    throwErrnoIfMinus1_ "iconv_close" $ c_iconv_close ic-    -outbuf_size :: Int-outbuf_size = 1024--do_iconv :: ((Ptr a, Int) -> IO String) -> IConv -> (Ptr b, Int) -> IO String-do_iconv get_string_fn ic (inbuf, inbuf_bytes) =-    alloca $ \inbuf_ptr -> -        alloca $ \inbytesleft_ptr -> -            alloca $ \outbuf_ptr -> -                alloca $ \outbytesleft_ptr -> -                    allocaBytes outbuf_size $ \outbuf -> do-      poke (inbytesleft_ptr :: Ptr CSize) (fromIntegral inbuf_bytes)-      poke inbuf_ptr inbuf-      let loop acc = do-          poke (outbytesleft_ptr :: Ptr CSize) (fromIntegral outbuf_size)-          poke outbuf_ptr outbuf-          ret <- throw_if_not_2_big "c_iconv" $-              c_iconv ic inbuf_ptr inbytesleft_ptr-                         outbuf_ptr outbytesleft_ptr-          left <- peek outbytesleft_ptr-          res <- get_string_fn (castPtr outbuf, outbuf_size - fromIntegral left)-          if ret == fromIntegral (-1 :: Int) then-              loop (acc++res)-            else-              return (acc++res)-      loop []---with_iconv :: String -> String -> (IConv -> IO a) -> IO a-with_iconv to from fn =-    bracket (iconv_open to from) iconv_close fn--iconv_ :: String -> IConv -> IO String-iconv_ str ic =-    withCStringLen str $ do_iconv peekCStringLen ic---- between 8-bit encodings only-iconv :: String -> String -> String -> Either Exception String-iconv to from str =-    unsafePerformIO $ try $ with_iconv to from (iconv_ str)---#ifdef HAVE_WCHAR_H-{--type CUni = (#type wchar_t)-cuni_size = (#size wchar_t)-unicode_charset = "WCHAR_T"--chartocuni :: Char -> CUni-chartocuni = fromIntegral . ord--cunitochar :: CUni -> Char-cunitochar = chr . fromIntegral--}--cuni_charset :: [Char]-cuni_charset = "WCHAR_T"--peek_cuni :: (Ptr (#type wchar_t), Int) -> IO String-peek_cuni (buf, bytes) = do-    let (chars, rembytes) = bytes `divMod` (#size wchar_t)-    if rembytes /= 0 then-        error "Conversion result contains remainder bytes."-      else-        peekCWStringLen (buf, chars)-        --liftM (map cunitochar) $ peekArray chars buf--with_cuni :: String -> ((Ptr (#type wchar_t), Int) -> IO String) -> IO String-with_cuni str f =-    withCWStringLen str $ \(s, l) -> f (s, l*(#size wchar_t))-    --withArray (map chartocuni str) $ \s -> f (s, l*cuni_size)--#else--- no CF_WCHAR_SUPPORT---- Due to endianness problems, it is easiest to do this through UTF-8--cuni_charset :: [Char]-cuni_charset = "UTF-8"--peek_cuni :: CStringLen -> IO String-peek_cuni = peekUTF8StringLen--with_cuni :: [Char] -> (CStringLen -> IO a) -> IO a-with_cuni = withUTF8StringLen--#endif--to_unicode_ :: String -> String -> IO String-to_unicode_ from str =    -     with_iconv cuni_charset from $-      \ic -> withCStringLen str $ do_iconv peek_cuni ic--to_unicode :: String -> String -> Either Exception String-to_unicode from str = -    unsafePerformIO $ try $ to_unicode_ from str-    -from_unicode_ :: String -> String -> IO String-from_unicode_ to str = -     with_iconv to cuni_charset $-      \ic -> with_cuni str $ do_iconv peekCStringLen ic--from_unicode :: String -> String -> Either Exception String-from_unicode from str = -    unsafePerformIO $ try $ from_unicode_ from str---#ifndef ICONV_LIB_PREFIX--foreign import ccall unsafe "iconv.h iconv_open" c_iconv_open-    :: CString -> CString -> IO IConv--foreign import ccall unsafe "iconv.h iconv_close" c_iconv_close-    :: IConv -> IO CInt--foreign import ccall unsafe "iconv.h iconv" c_iconv-    :: IConv -> Ptr a -> Ptr CSize -> Ptr b -> Ptr CSize -> IO CSize--#else--foreign import ccall unsafe "iconv.h libiconv_open" c_iconv_open-    :: CString -> CString -> IO IConv--foreign import ccall unsafe "iconv.h libiconv_close" c_iconv_close-    :: IConv -> IO CInt--foreign import ccall unsafe "iconv.h libiconv" c_iconv-    :: IConv -> Ptr a -> Ptr CSize -> Ptr b -> Ptr CSize -> IO CSize--#endif
− HSCurses/Logging.hs
@@ -1,70 +0,0 @@-{-# OPTIONS -cpp -fno-cse #-}---- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de--- --- This library 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 2.1 of the License, or (at your option) any later version.--- --- This library 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 this library; if not, write to the Free Software--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA--module HSCurses.Logging (trace,debug) where--import IO-import Time-import Locale-import Data.IORef-import System.IO.Unsafe             ( unsafePerformIO )-import Control.Monad.Trans---trace :: String -> a -> a-debug :: MonadIO m => String -> m ()--#ifdef __DEBUG__--logFile :: Handle-logFile = unsafePerformIO $ do h <- openFile ".hscurses.log" AppendMode-                               debug_ h "logging initialized"-                               return h-{-# NOINLINE logFile #-}--formatTime :: IO String-formatTime =-    do let fmt = "%Y-%m-%d %H:%M:%S"-       clockT <- getClockTime-       calTime <- toCalendarTime clockT-       let maxSdecLen = 5-           sdec' = show $ ctPicosec calTime-           sdec = if length sdec' > maxSdecLen-                     then take maxSdecLen sdec'-                     else sdec'-       return (formatCalendarTime defaultTimeLocale fmt calTime -               ++ ":" ++ sdec)--trace s x = -    unsafePerformIO $ do debug s-                         return x--debug s = liftIO $ debug_ logFile s--debug_ f s =-    do ts <- formatTime-       hPutStrLn f ("[" ++ ts ++ "] " ++ s)-       hFlush f--#else--trace _ x = x--debug s = return ()--#endif
− HSCurses/MonadException.hs
@@ -1,143 +0,0 @@--- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de--- --- This library 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 2.1 of the License, or (at your option) any later version.--- --- This library 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 this library; if not, write to the Free Software--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA--module HSCurses.MonadException where--import Prelude hiding (catch)-import Control.Exception-import Control.Monad.State-import Data.Typeable-import Data.Dynamic--class Monad m => MonadExc m where-    catchM      :: m a -> (Exception -> m a) -> m a-    blockM      :: m a -> m a-    unblockM    :: m a -> m a---class (MonadIO m, MonadExc m) => MonadExcIO m------- Operations implemented in term of catchM, blockM and unblockM--- (taken from Control.Exception).-----catchJustM :: MonadExc m =>-       (Exception -> Maybe b) -- ^ Predicate to select exceptions-    -> m a                    -- ^ Computation to run-    -> (b -> m a)             -- ^ Handler-    -> m a-catchJustM p a handler = catchM a handler'-  where handler' e = case p e of -            Nothing -> throw e-            Just b  -> handler b--handleM :: MonadExc m => (Exception -> m a) -> m a -> m a-handleM = flip catchM--handleJustM :: MonadExc m => -              (Exception -> Maybe b) -> (b -> m a) -> m a -> m a-handleJustM p = flip (catchJustM p)--tryM :: MonadExc m => m a -> m (Either Exception a)-tryM a = catchM (a >>= \ v -> return (Right v)) (\e -> return (Left e))--tryJustM :: MonadExc m => (Exception -> Maybe b) -> m a -> m (Either b a)-tryJustM p a = do-  r <- tryM a-  case r of-    Right v -> return (Right v)-    Left  e -> case p e of-            Nothing -> throw e-            Just b  -> return (Left b)--catchDynM :: (MonadExc m, Typeable exc) => -             m a -> (exc -> m a) -> m a-catchDynM m k = catchM m handle-  where handle ex = case ex of-               (DynException dyn) ->-                case fromDynamic dyn of-                    Just exception  -> k exception-                    Nothing -> throw ex-               _ -> throw ex--bracketM :: MonadExc m =>-       m a         -- ^ computation to run first (\"acquire resource\")-    -> (a -> m b)  -- ^ computation to run last (\"release resource\")-    -> (a -> m c)  -- ^ computation to run in-between-    -> m c         -- returns the value from the in-between computation-bracketM before after thing =-  blockM (do-    a <- before -    r <- catchM-       (unblockM (thing a))-       (\e -> do { after a; throw e })-    after a-    return r-  )--bracketM_ :: MonadExc m => m a -> m b -> m c -> m c-bracketM_ before after thing = bracketM before (const after) (const thing)--finally :: IO a -- ^ computation to run first-    -> IO b     -- ^ computation to run afterward (even if an exception -                --   was raised)-    -> IO a     -- returns the value from the first computation-a `finally` sequel =-  blockM (do-    r <- catchM-         (unblockM a)-         (\e -> do { sequel; throw e })-    sequel-    return r-  )-------- Instance declarations-----instance MonadExc IO where-    catchM       = catch-    blockM       = block-    unblockM     = unblock--instance MonadExcIO IO--instance MonadExc m => MonadExc (StateT s m) where-    catchM   = catchState-    blockM   = blockState-    unblockM = unblockState--instance (MonadExc m, MonadIO m) => MonadExcIO (StateT s m)--modifyState :: MonadExc m => (s -> m (a, s)) -> StateT s m a-modifyState f = -    do oldState <- get-       (x, newState) <- lift $ f oldState-       put newState-       return x--catchState run handler =-    modifyState (\oldState -> runStateT run oldState `catchM` -                              (\e -> runStateT (handler e) oldState))--blockState run =-    modifyState (\oldState -> blockM (runStateT run oldState))--unblockState run =-    modifyState (\oldState -> unblockM (runStateT run oldState))-       
− HSCurses/Widgets.hs
@@ -1,873 +0,0 @@-{-# OPTIONS -fglasgow-exts #-}--- glasgow-exts needed for existentials and multi-parameter type classes.---- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de--- --- This library 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 2.1 of the License, or (at your option) any later version.--- --- This library 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 this library; if not, write to the Free Software--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA--module HSCurses.Widgets where--import Char-import List-import Maybe-import qualified HSCurses.Curses as Curses-import qualified HSCurses.CursesHelper as CursesH-import HSCurses.Logging--import Control.Monad.Trans-import Control.Exception (assert)-import HSCurses.MonadException--type Pos = (Int, Int)-type Offset = (Int, Int)--type Size = (Int, -- height-             Int  -- width-            )--getHeight :: Size -> Int-getHeight = fst--getWidth :: Size -> Int-getWidth = snd--getYOffset :: Offset -> Int-getYOffset = fst--getXOffset :: Offset -> Int-getXOffset = snd--getYPos :: Pos -> Int-getYPos = fst--getXPos :: Pos -> Int-getXPos = snd--data Direction = DirLeft | DirRight | DirUp | DirDown-               deriving (Eq, Show, Ord)--data HAlignment = AlignLeft | AlignCenter | AlignRight-               deriving (Eq, Show)--data Cont a = Cont a | Done a--class Widget a where-    draw      :: Pos -> Size -> DrawingHint -> a -> IO ()-    minSize   :: a -> Size--class Widget a => ActiveWidget a where-    activate  :: MonadExcIO m => m () -> Pos -> Size -> a -> m (a, String)--type KeyHandler a = Pos -> Size -> a -> IO (Cont a)--mkKeyHandler :: (Pos -> Size -> a -> a)-                -> KeyHandler a-mkKeyHandler f pos sz w = return (Cont (f pos sz w))------- Drawing-----data DrawingHint = DHNormal -                 | DHFocus-                 | DHActive-                   deriving (Eq, Show, Ord)--data DrawingStyle = DStyle-    { dstyle_normal      :: CursesH.CursesStyle-    , dstyle_focus       :: CursesH.CursesStyle-    , dstyle_active      :: CursesH.CursesStyle-    } deriving (Eq, Show)---mkDrawingStyle :: CursesH.CursesStyle -> DrawingStyle-mkDrawingStyle defStyle = -    let revStyle = CursesH.changeCursesStyle defStyle [CursesH.Reverse]-        in DStyle { dstyle_normal = defStyle-                  , dstyle_focus = revStyle-                  , dstyle_active = revStyle-                  }--defaultDrawingStyle = mkDrawingStyle CursesH.defaultCursesStyle-_draw :: DrawingHint -> DrawingStyle -> IO a -> IO a-_draw DHActive sty io = CursesH.withStyle (dstyle_active sty) io-_draw DHNormal sty io = CursesH.withStyle (dstyle_normal sty) io-_draw DHFocus sty io = CursesH.withStyle (dstyle_focus sty) io------- Helper functions for scrolling-----scrollFactor = 0.8--scrollBy :: Int -> Int-scrollBy displayLen = -    let amount = floor ((fromInteger.toInteger) displayLen * scrollFactor)-    in max (displayLen - 1) (min 1 amount)---- returns the new offset for scrolling in forward direction--- dataLen: total number of data items--- offset: the index of the first data item shown on the current page--- displayLen: the number of data items that is shown in one page-scrollForward dataLen offset displayLen =-    if offset + displayLen >= dataLen-       then offset-       else min (offset + scrollBy displayLen) (dataLen - displayLen)---- returns the new offset for scrolling in backward direction.--- parameters as for scrollForward-scrollBackward dataLen offset displayLen = -    if offset == 0-       then offset-       else max (offset - scrollBy displayLen) 0-------- EmptyWidget-----data EmptyWidget = EmptyWidget Size--instance Widget EmptyWidget where-    draw _ _ _ _ = return ()-    minSize (EmptyWidget sz) = sz-------- An opaque widget-----data OpaqueWidget = OpaqueWidget Size--instance Widget OpaqueWidget where-    draw pos@(y,x) sz@(h,w) _ _ = -        let draw' n =-                do Curses.wMove Curses.stdScr (y+n) x-                   CursesH.drawLine w ""-        in do mapM draw' (take h [0..])-              Curses.refresh-    minSize (OpaqueWidget sz) = sz------- Widget for text input-----data EditWidget = EditWidget-    { ew_content       :: String,-      ew_xoffset       :: Int, -- content!!xoffset is the 1st char shown-      ew_xcursor       :: Int, -- cursor position-      ew_history       :: [String],-      ew_historyIndex  :: Int,-      ew_historySavedContent :: Maybe String,-      ew_options       :: EditWidgetOptions-    }--ew_contentPos ew = ew_xcursor ew + ew_xoffset ew--instance Widget EditWidget where-    draw = drawEditWidget-    minSize ew = (1, ewopt_minWidth $ ew_options ew)--instance ActiveWidget EditWidget where-    activate = activateEditWidget--data EditWidgetOptions = EWOptions-    { ewopt_keyHandlers    :: [(Curses.Key, KeyHandler EditWidget)],-      ewopt_minWidth       :: Int,-      ewopt_style          :: DrawingStyle-    }--defaultEWOptions = EWOptions-                   { ewopt_keyHandlers = editWidgetKeyHandlers,-                     ewopt_minWidth = 8,-                     ewopt_style = defaultDrawingStyle-                   }--newEditWidget :: EditWidgetOptions -> String -> EditWidget-newEditWidget opts = -    editWidgetSetContent -      (EditWidget -       { ew_content = "",-         ew_xoffset = 0,  -         ew_xcursor = 0,-         ew_history = [],-         ew_historyIndex = -1,-         ew_historySavedContent = Nothing,-         ew_options = opts-       })----editWidgetGoLeft = mkKeyHandler editWidgetGoLeft'-editWidgetGoRight = mkKeyHandler editWidgetGoRight'-editWidgetDeleteLeft = mkKeyHandler editWidgetDeleteLeft'-editWidgetDeleteUnderCursor = mkKeyHandler editWidgetDeleteUnderCursor'-editWidgetDeleteToEnd = mkKeyHandler editWidgetDeleteToEnd'-editWidgetGoHome = mkKeyHandler editWidgetGoHome'-editWidgetGoEnd = mkKeyHandler editWidgetGoEnd'-editWidgetHistoryUp = mkKeyHandler editWidgetHistoryUp'-editWidgetHistoryDown = mkKeyHandler editWidgetHistoryDown'--editWidgetKeyHandlers = -    [(Curses.KeyLeft, editWidgetGoLeft),-     (Curses.KeyRight, editWidgetGoRight),-     (Curses.KeyBackspace, editWidgetDeleteLeft),-     (Curses.KeyChar '\^D', editWidgetDeleteUnderCursor),-     (Curses.KeyDC, editWidgetDeleteUnderCursor),-     (Curses.KeyChar '\^K', editWidgetDeleteToEnd),-     (Curses.KeyHome, editWidgetGoHome),-     (Curses.KeyChar '\^A', editWidgetGoHome),-     (Curses.KeyEnd, editWidgetGoEnd),-     (Curses.KeyChar '\^E', editWidgetGoEnd),-     (Curses.KeyChar '\r', editWidgetFinish),-     (Curses.KeyChar '\t', editWidgetFinish),-     (Curses.KeyUp, editWidgetHistoryUp),-     (Curses.KeyDown, editWidgetHistoryDown)-    ]--editWidgetGetContent ew = ew_content ew-editWidgetSetContent ew s = -    addToHistory (ew { ew_content = s, ew_xoffset = 0, ew_xcursor = 0 }) s--editWidgetGetOptions ew = ew_options ew-editWidgetSetOptions ew opts = ew { ew_options = opts }--drawEditWidget :: Pos -> Size -> DrawingHint -> EditWidget -> IO ()-drawEditWidget (y, x) (height, width) hint ew = -    _draw hint (ewopt_style . ew_options $ ew) $-    do Curses.wMove Curses.stdScr y x-       CursesH.drawLine width (drop (ew_xoffset ew) $ ew_content ew)-       Curses.refresh--activateEditWidget :: MonadExcIO m => m () -> Pos -> Size -                   -> EditWidget -> m (EditWidget, String)-activateEditWidget refresh pos@(y, x) sz@(height, width) ew =-    CursesH.withCursor Curses.CursorVisible $ processKey ew-    where -    processKey ew = -        do liftIO $ draw ew-           k <- CursesH.getKey refresh-           case lookup k (ewopt_keyHandlers $ ew_options ew) of-             Nothing -> -                 case k of-                   Curses.KeyChar c | isAscii c && isPrint c -                       -> processKey $ insertChar ew c-                   _   -> processKey ew-             Just f  ->-                 do x <- liftIO $ f pos sz ew-                    case x of-                      Cont ew' -> processKey ew'-                      Done ew' -> do liftIO $ drawEditWidget pos sz DHActive ew'-                                     return (ew', editWidgetGetContent ew')-    insertChar ew c = -        let pos = ew_contentPos ew-            oldContent = ew_content ew-            newContent = take pos oldContent ++ (c : drop pos oldContent)-            in editWidgetGoRight' pos sz (ew { ew_content = newContent })-    draw ew = _draw DHActive  (ewopt_style . ew_options $ ew) $-        do Curses.wMove Curses.stdScr y x-           CursesH.drawLine width (drop (ew_xoffset ew) $ ew_content ew)-           Curses.wMove Curses.stdScr y (x + ew_xcursor ew)-           Curses.refresh--editWidgetGoLeft' _ _ ew = -    let newXcursor = max (ew_xcursor ew - 1) 0-        newXoffset = if ew_xcursor ew == 0-                        then max (ew_xoffset ew - 1) 0-                        else ew_xoffset ew-        in ew { ew_xoffset = newXoffset,-                ew_xcursor = newXcursor }--editWidgetGoRight' _ (_, width) ew =-    let len = length (ew_content ew)-        lastChar = len - ew_xoffset ew - 1-        newXcursor = minimum [ew_xcursor ew + 1, lastChar + 1, width - 1]-        newXoffset = if ew_xcursor ew == width - 1-                        then min (ew_xoffset ew + 1) (len - width + 1)-                        else ew_xoffset ew-        in ew { ew_xoffset = newXoffset,-                ew_xcursor = newXcursor }--editWidgetDeleteLeft' :: Pos -> Size -> EditWidget -> EditWidget-editWidgetDeleteLeft' pos sz ew = -    let cpos = ew_contentPos ew - 1-        oldContent = ew_content ew-        newContent = take cpos oldContent ++ drop (cpos+1) oldContent-        ew' = editWidgetGoLeft' pos sz (ew { ew_content = newContent })-        in if ew_xcursor ew == 0 && ew_xoffset ew /= 0-              then editWidgetGoRight' pos sz (editWidgetGoLeft' pos sz ew')-              else ew'--editWidgetDeleteUnderCursor' _ _ ew = -    let pos = ew_contentPos ew-        oldContent = ew_content ew-        newContent = take pos oldContent ++ drop (pos+1) oldContent-        in ew { ew_content = newContent }--editWidgetDeleteToEnd' _ _ ew =-    let pos = ew_contentPos ew-        oldContent = ew_content ew-        newContent = take pos oldContent-        in ew { ew_content = newContent }--editWidgetGoHome' _ _ ew =-    ew { ew_xcursor = 0,-         ew_xoffset = 0 }--editWidgetGoEnd' :: Pos -> Size -> EditWidget -> EditWidget-editWidgetGoEnd' pos sz ew =-    let cpos = ew_contentPos ew-        len = length (ew_content ew)-        in if cpos == len-              then ew-              else editWidgetGoEnd' pos sz (editWidgetGoRight' pos sz ew)--editWidgetFinish _ _ ew =  return (Done (addToHistory ew (ew_content ew)))--maxHistoryLength = 50--addToHistory ew s = -    let newHist = if not (null s)-                     then take maxHistoryLength (s : ew_history ew)-                     else ew_history ew-        in ew { ew_history = newHist, ew_historyIndex = -1,-                ew_historySavedContent = Nothing }--editWidgetHistoryUp' _ _ ew = editWidgetHistory (+) ew-editWidgetHistoryDown' _ _ ew = editWidgetHistory (-) ew---- ew_historyList: list of history items, i.e. non-null strings which were ---   entered into the widget and confirmed with ENTER or which were added---   via editWidgetSetContent.--- ew_historyIndex: the index of the history item shown in the widget. The---   value -1 means that the value saved in ew_historySavedContent should---   be shown.-editWidgetHistory op ew = -    let i = ew_historyIndex ew-        l = ew_history ew-        j =  i `op` 1-        in if j >= 0 && j < length l-              then let savedContent =-                           case ew_historySavedContent ew of-                             Nothing -> Just (ew_content ew)-                             x -> x-                       in ew { ew_historyIndex = j, ew_content = l!!j,-                               ew_historySavedContent = savedContent,-                               ew_xcursor = 0, ew_xoffset = 0 }-              else if j == -1-                      then case ew_historySavedContent ew of-                             Nothing -> ew-                             Just x -> ew { ew_content = x, -                                            ew_historyIndex = j,-                                            ew_xcursor = 0, -                                            ew_xoffset = 0  }-                   else ew--------- Text widget-----data TextWidget = TextWidget-    { tw_text           :: String,-      tw_yoffset        :: Int,-      tw_xoffset        :: Int,-      tw_options        :: TextWidgetOptions-    }-    deriving (Eq, Show)--instance Widget TextWidget where-    draw = drawTextWidget-    minSize tw = -        case twopt_size $ tw_options tw of-          TWSizeDefault -> let l = lines (tw_text tw)-                           in (length l, if null l then 0 else maximum (map length l))-          TWSizeFixed sz -> sz--data TextWidgetSize = TWSizeDefault    -- minimal size determined by content-                    | TWSizeFixed Size -- minimal size is fixed, content is-                                       -- possibly cut off-                      deriving (Eq, Show)-                                 {--                    | Autowrap   -- minimal width determined by content,-                                 -- but lines are wrapped if necessary-                                 -}            -      -data TextWidgetOptions = TWOptions-    { twopt_size   :: TextWidgetSize,-      twopt_style  :: DrawingStyle,-      twopt_halign :: HAlignment }  -    deriving (Eq, Show)--defaultTWOptions = TWOptions-                { twopt_size = TWSizeDefault,-                  twopt_style = defaultDrawingStyle,-                  twopt_halign = AlignLeft }--newTextWidget :: TextWidgetOptions -> String -> TextWidget-newTextWidget opts s = TextWidget -                       { tw_text = s,-                         tw_yoffset = 0,-                         tw_xoffset = 0,-                         tw_options = opts-                       }--drawTextWidget :: Pos -> Size -> DrawingHint -> TextWidget -> IO ()-drawTextWidget pos@(y, x) sz@(height, width) hint tw = -    let ly = take height $ drop (tw_yoffset tw) (lines (tw_text tw))-        l = take height $ (map (drop (tw_xoffset tw)) ly ++ repeat [])-        l' = map (align (twopt_halign $ tw_options tw) width ' ') l-    in --trace ("drawing text widget at " ++ show pos ++ " with size " ++ show sz) $-       do _draw hint (twopt_style . tw_options $ tw) -                      (mapM drawLine $ zip l' [0..])-          Curses.refresh-    where drawLine (s, i) = -              do Curses.wMove Curses.stdScr (y + i) x-                 CursesH.drawLine width s--textWidgetGetText :: TextWidget -> String-textWidgetGetText = tw_text--textWidgetSetText :: TextWidget -> String -> TextWidget-textWidgetSetText tw s = tw { tw_text = s }--textWidgetScrollDown :: Size -> TextWidget -> TextWidget-textWidgetScrollDown (h, _) tw =-    let dataLen = length $ lines (tw_text tw)-        offset = tw_yoffset tw-        in tw { tw_yoffset = scrollForward dataLen offset h }--textWidgetScrollUp :: Size -> TextWidget -> TextWidget-textWidgetScrollUp (h, _) tw = -    let dataLen = length $ lines (tw_text tw)-        offset = tw_yoffset tw-        in tw { tw_yoffset = scrollBackward dataLen offset h }--textWidgetScrollLeft :: Size -> TextWidget -> TextWidget-textWidgetScrollLeft (_, w) tw = -    let dataLen = length $ lines (tw_text tw)-        offset = tw_xoffset tw-        in tw { tw_xoffset = scrollBackward dataLen offset w }--textWidgetScrollRight :: Size -> TextWidget -> TextWidget-textWidgetScrollRight (_, w) tw =-    let dataLen = length $ lines (tw_text tw)-        offset = tw_xoffset tw-        in tw { tw_xoffset = scrollForward dataLen offset w }-------- Table widget-----data TableCell = forall w. Widget w => TableCell w-               | forall w. ActiveWidget w => ActiveTableCell w--isActive :: TableCell -> Bool-isActive (TableCell _) = False-isActive (ActiveTableCell _) = True--instance Widget TableCell where-    draw pos sz hint (TableCell w) = draw pos sz hint w-    draw pos sz hint (ActiveTableCell w) = draw pos sz hint w-    minSize (TableCell w) = minSize w-    minSize (ActiveTableCell w) = minSize w--_activateTableCell :: MonadExcIO m => m () -> Pos -> Size -                   -> TableCell -> m (TableCell, String)-_activateTableCell _ _ _ (TableCell _) = -    error "_activateTableCell: cannot activate non-active cell!"-_activateTableCell refresh pos sz (ActiveTableCell w) =-    do (new, res) <- activate refresh pos sz w-       return (ActiveTableCell new, res)--type Row = [TableCell]--singletonRow :: TableCell -> Row-singletonRow tc = [tc]--getCellWidget :: TableWidget -> (Int, Int) -> TableCell-getCellWidget tbw (row, col) = (tbw_rows tbw) !! row !! col--setCellWidget :: TableWidget -> (Int, Int) -> TableCell -> TableWidget-setCellWidget tbw (rowIndex, colIndex) w =-    let rows = tbw_rows tbw-        row = rows !! rowIndex-        newRow = listReplace row w colIndex-        newRows = listReplace rows newRow rowIndex-        in tbw { tbw_rows = newRows }--data TableWidget = TableWidget-    { tbw_rows     :: [Row],-      tbw_colOffset  :: Int,-      tbw_pos      :: Maybe Pos,-      tbw_options  :: TableWidgetOptions }-                     -data FillRow = First | Last | None deriving (Eq,Show)--data TableWidgetOptions = TBWOptions-    { tbwopt_fillCol    :: Maybe Int,-      tbwopt_fillRow    :: FillRow,-      tbwopt_activeCols :: [Int],-      tbwopt_minSize    :: Size }-    deriving (Eq, Show)--defaultTBWOptions = TBWOptions-                    { tbwopt_fillCol = Nothing,-                      tbwopt_fillRow = None,-                      tbwopt_activeCols = [],-                      tbwopt_minSize = (4, 10) }--instance Widget TableWidget where-    draw      = drawTableWidget-    minSize   = tbwopt_minSize . tbw_options  --newTableWidget :: TableWidgetOptions -> [Row] -> TableWidget-newTableWidget opts rows = TableWidget-                              { tbw_rows = rows,-                                tbw_colOffset = 0,-                                tbw_pos = findFirstActiveCell rows opts,-                                tbw_options = opts }--data TableWidgetDisplayInfo = -    TBWDisplayInfo-    { tbwdisp_height     :: Int   -- height of the display area-    , tbwdisp_width      :: Int   -- width of the display area-    , tbwdisp_firstVis   :: Int   -- index of the first row visible-    , tbwdisp_lastVis    :: Int   -- index of the last row visible-    , tbwdisp_rows       :: [Row] -- the rows which are visible-    , tbwdisp_nrows      :: Int   -- the number of rows visible-    , tbwdisp_heights    :: [Int] -- the heights of the visible rows-    , tbwdisp_widths     :: [Int] -- the widths of the visible rows-      -- free space at the right side (xoffset, size)-    , tbwdisp_rightMargin :: Maybe (Int, Size) -    }--tableWidgetDisplayInfo :: Size -> TableWidget -> TableWidgetDisplayInfo-tableWidgetDisplayInfo sz@(height, width) tbw = -    assert (isQuadratic (tbw_rows tbw)) $-    let allRows = tbw_rows tbw-        ncols = length (allRows!!0)-        colOffset = tbw_colOffset tbw-        allHeights = minSpaces getHeight allRows-        heights' = drop colOffset allHeights-        nrows = getNRows heights' 0 0-        rows = take nrows $ drop colOffset allRows-        (heights, heightDummy) = -            let hs = take nrows heights'-                s = sum hs-                d = height - s-                in case tbwopt_fillRow $ tbw_options tbw of-                     First -> (applyToFirst (+d) hs, 0)-                     Last -> (applyToLast (+d) hs, 0)-                     None -> (hs, d)-        widths' = minSpaces getWidth (transpose $ tbw_rows tbw)-        (widths, rightMargin) = -            if sum widths' > width -               then error ("table to wide: width=" ++ show (sum widths') ++-                           ", available width=" ++ show width)-               else case tbwopt_fillCol $ tbw_options tbw of-                      Just i | i >= 0 && i < ncols-                                 -> (take i widths' ++ -                                     let rest = drop i widths'-                                     in (head rest + width - sum widths') : tail rest-                                    , Nothing)-                      _ -> let diff = width - sum widths'-                               msz = (height, diff)-                               m = if diff > 0 then Just (sum widths', msz) -                                   else Nothing-                           in (widths', m)-        dummyHeights = if heightDummy == 0 then [] else [heightDummy]-        dummyRows = if heightDummy == 0 then [] -                    else [map (\w -> TableCell (OpaqueWidget (heightDummy, w))) -                          widths]-        in TBWDisplayInfo-               { tbwdisp_height = height-               , tbwdisp_width = width-               , tbwdisp_firstVis = colOffset-               , tbwdisp_lastVis = colOffset + nrows - 1-               , tbwdisp_rows = rows ++ dummyRows-               , tbwdisp_nrows = nrows + length dummyRows-               , tbwdisp_heights = heights ++ dummyHeights-               , tbwdisp_widths = widths-               , tbwdisp_rightMargin = rightMargin-               }-    where-        minSpaces f ls = -            snd $ mapAccumL -                    (\acc ws -> -                       (acc, acc + maximum (map (f . minSize) ws)))-                    0 ls-        getNRows (h:hs) n acc | h + n <= height = getNRows hs (h+n) (acc+1)-        getNRows _ _ acc = acc-        isQuadratic [] = True-        isQuadratic (x:xs) = isQuadratic' xs (length x)-        isQuadratic' (x:xs) n = length x == n && isQuadratic' xs n-        isQuadratic' [] _ = True-        applyToFirst f [] = []-        applyToFirst f (x:xs) = f x : xs-        applyToLast f [] = []-        applyToLast f l = -            let (h, t) = (head $ reverse l, tail $ reverse l)-                in reverse $ f h : t--getCellInfo :: Pos -> Size -> TableWidget -> (Int,Int) -> (Pos, Size)-getCellInfo pos@(y,x) sz tbw (row, col) = -    let info = tableWidgetDisplayInfo sz tbw-        heights = tbwdisp_heights info-        widths = tbwdisp_widths info-        h = heights !! row-        w = widths !! col-        yoff = sum $ take row heights-        xoff = sum $ take col widths-        in ((y+yoff, x+xoff), (h, w))--drawTableWidget :: Pos -> Size -> DrawingHint -> TableWidget -> IO ()-drawTableWidget pos@(y, x) sz hint tbw = -    let info = tableWidgetDisplayInfo sz tbw-        heights = tbwdisp_heights info-        widths = tbwdisp_widths info-        firstVis = tbwdisp_firstVis info-        rows = tbwdisp_rows info-        rightMargin = tbwdisp_rightMargin info-        in do drawRows rows heights widths 0 firstVis hint-              case rightMargin of-                Nothing -> return ()-                Just (xoff,s) -> draw (y,x+xoff) s hint (OpaqueWidget s)-              Curses.refresh-    where drawRows :: [Row] -> [Int] -> [Int] -> Int -> Int -                   -> DrawingHint -> IO ()-          drawRows [] _ _ _ _ _ = return ()-          drawRows (r:rs) (h:hs) widths yoffset rowIndex hint = -            do drawCols r h widths yoffset 0 (rowIndex, 0) hint-               drawRows rs hs widths (yoffset + h) (rowIndex + 1) hint-          drawCols :: Row -> Int -> [Int] -> Int -> Int -> (Int, Int) -                   -> DrawingHint -> IO ()-          drawCols [] _ _ _ _ _ _ = return ()-          drawCols (c:cs) h (w:ws) yoffset xoffset (rowIndex, colIndex) hint = -            let hint' = case tbw_pos tbw of-                           Just (y, x) | y == rowIndex && x == colIndex-                               -> DHFocus-                           _ -> hint-            in do draw (y+yoffset, x+xoffset) (h,w) hint' c-                  drawCols cs h ws yoffset (xoffset + w) -                           (rowIndex, colIndex+1) hint---tableWidgetScrollDown :: Size -> TableWidget -> TableWidget-tableWidgetScrollDown (h, _) tbw =-    let dataLen = length $ tbw_rows tbw-        offset = tbw_colOffset tbw-        newOffset = scrollForward dataLen offset h-        newTbw = tbw { tbw_colOffset = newOffset }-        in case tbw_pos newTbw of-             Nothing -> newTbw-             Just (y,x) -> newTbw { tbw_pos = Just (max newOffset y, x) }--tableWidgetScrollUp :: Size -> TableWidget -> TableWidget-tableWidgetScrollUp sz@(h,_) tbw =  -    let dataLen = length $ tbw_rows tbw-        offset = tbw_colOffset tbw-        newOffset = scrollBackward dataLen offset h-        newTbw = tbw { tbw_colOffset = newOffset }-        newLastVis = tbwdisp_lastVis (tableWidgetDisplayInfo sz newTbw)-        in case tbw_pos newTbw of-             Nothing -> newTbw-             Just (y,x) -> -                 newTbw { tbw_pos = Just (min newLastVis y, x) }--tableWidgetActivateCurrent :: MonadExcIO m => m () -> Pos -> Size -                           -> DrawingHint -> TableWidget -                           -> m (TableWidget, Maybe String)-tableWidgetActivateCurrent refresh pos@(y, x) sz hint tbw = -    case tbw_pos tbw of-      Nothing -> do debug "tableWidgetActivateCurrent: pos=Nothing"-                    return (tbw, Nothing)-      Just p -> let w = getCellWidget tbw p-                    in if not $ isActive w-                       then do debug "tableWidgetActivateCurrent: not active"-                               return (tbw, Nothing)-                       else activate w p-    where -    activate widget colyx@(coly, colx) =-        let info = tableWidgetDisplayInfo sz tbw-            vcol = colx-            vrow = coly - tbwdisp_firstVis info-            heights = tbwdisp_heights info-            widths = tbwdisp_widths info-            h = heights !! vrow-            w = widths !! vcol-            yoffset = sum (take vrow heights)-            xoffset = sum (take vcol widths)-        in do (new, res) <- _activateTableCell refresh (y+yoffset, x+xoffset) -                              (h, w) widget-              return (setCellWidget tbw colyx new, Just res)--tableWidgetGoLeft :: Size -> TableWidget -> TableWidget-tableWidgetGoLeft =  tableWidgetMove DirLeft--tableWidgetGoRight :: Size -> TableWidget -> TableWidget-tableWidgetGoRight =  tableWidgetMove DirRight--tableWidgetGoUp :: Size -> TableWidget -> TableWidget-tableWidgetGoUp =  tableWidgetMove DirUp--tableWidgetGoDown :: Size -> TableWidget -> TableWidget-tableWidgetGoDown =  tableWidgetMove DirDown--tableWidgetMove dir sz tbw = -    let pos = tbw_pos tbw-        opts = tbw_options tbw-        nrows = length (tbw_rows tbw)-        in case pos of-             Nothing -> tbw-             Just p -> case findNextActiveCell opts nrows p dir of-                         Nothing -> tbw-                         newP@(Just (y, _)) ->-                             tableWidgetMakeVisible (tbw {tbw_pos=newP}) sz y--tableWidgetMakeVisible tbw sz@(height,_) y = -    let info = tableWidgetDisplayInfo sz tbw-        firstVis = tbwdisp_firstVis info-        lastVis = tbwdisp_lastVis info-        in if y < firstVis-              then tableWidgetMakeVisible (tableWidgetScrollUp sz tbw) sz y-              else if y > lastVis-                      then tableWidgetMakeVisible -                               (tableWidgetScrollDown sz tbw) sz y-                      else tbw--findFirstActiveCell :: [Row] -> TableWidgetOptions -> Maybe Pos-findFirstActiveCell rows opts = -    let nrows = length rows-        firstActiveCells = map (\y -> findNextActiveCell opts nrows -                                                         (y, -1) DirRight)-                               [0..nrows-1]-        in case catMaybes firstActiveCells of-             [] -> Nothing-             (x:_) -> Just x--findNextActiveCell :: TableWidgetOptions -> Int  -> Pos -> Direction -                   -> Maybe Pos-findNextActiveCell opts nrows pos@(y,x) dir = ---    trace ("findNextActiveCell (opts=" ++ show opts ++ ", nrows=" ++ show nrows---           ++ ", pos=" ++ show pos ++ ", dir=" ++ show dir) $-    let rows = [0..(nrows - 1)]-        cols = sort (tbwopt_activeCols opts)-        horiz f = case f cols x rows y of-                    Nothing -> Nothing-                    Just x -> Just (y, x)-        vert f = case f rows y cols x of-                   Nothing -> Nothing-                   Just y -> Just (y, x)-        res = case dir of-                DirLeft-> horiz goLeft-                DirRight -> horiz goRight-                DirUp -> vert goLeft-                DirDown -> vert goRight-        in --trace ("result of findNextActiveCell: " ++ show res) -           res-    where goLeft _ _ rows y | not (y `elem` rows) = Nothing-          goLeft cols x _ _ = -              case reverse (takeWhile (<x) cols) of-                [] -> Nothing-                (x:_) -> Just x-          goRight _ _ rows y | not (y `elem` rows) = Nothing-          goRight cols x _ _ = -              case dropWhile (x>=) cols of-                [] -> Nothing-                (x:_) -> Just x--tableWidgetDeleteRow :: Int -> TableWidget -> TableWidget-tableWidgetDeleteRow n tbw = -    let rows = tbw_rows tbw-        rows' = deleteAt n rows-        pos' = -           case tbw_pos tbw of-             Nothing -> Nothing-             Just (row,col) -> -                 let row' = min row (length rows' - 1)-                     in if row' >= 0 then Just (row', col)-                        else Nothing-        in tbw { tbw_rows = rows', tbw_pos = pos' }------- BorderWidget----------- Selection Widget---------- Utility functions------- | Join a list by some delimiter-joinLists :: [[a]] -> [a] -> [a]-joinLists l s = if (null l) then [] else foldr1 (\x -> \y -> x ++ s ++ y) l---- | Split a list by some delimiter-splitList :: Eq a => [a] -> [a] -> [[a]]-splitList d l =-    unfoldr (\x -> if (null x) -                      then Nothing -                      else Just $ nextToken d [] (snd $ splitAt (length d) x))-            (d++l)-  where nextToken _ r [] = (r, [])-        nextToken d r l@(h:t) | (d `isPrefixOf` l) = (r, l) -                              | otherwise = nextToken d (r++[h]) t--listReplace :: [a] -> a -> Int -> [a]-listReplace l a i = -    case splitAt i l of-      (_, []) -> error ("listReplace: index to large. index="++show i++-                        ", length="++show (length l))-      ([], _) | i < 0 -> error ("listReplace: negative index. index="++-                                show i)-      (xs,(y:ys)) -> xs ++ (a:ys)----alignRows :: [[String]] -> Char -> String -> [String]-alignRows :: [[[a]]] -> a -> [a] -> [[a]]-alignRows rows fill delim = -    let widths = foldr maxWidths (repeat 0) rows-        in map (alignRow widths) rows-    where-    maxWidths ::  [[a]] -> [Int] -> [Int]-    maxWidths row acc = map (uncurry max) (zip acc (map length row))-    alignRow widths row = concatMap (uncurry alignCell) (zip widths row)-    alignCell width cell = -        let diff = width - length cell-            in cell ++ (take diff $ repeat fill) ++ delim--        -align :: HAlignment -> Int -> a -> [a] -> [a]-align a w f l = -    let space = w - length l-        in case a of-             AlignLeft -> l ++ (fill space)-             AlignRight -> (fill space) ++ l        -             AlignCenter ->-                 let left = space `div` 2-                     right = left + (space `mod` 2)-                     in fill left ++ l ++ fill right-    where fill n = take n (repeat f)--deleteAt :: Int -> [a] -> [a]-deleteAt n l = if n >= 0 && n < length l -                  then let (a,b) = splitAt n l in a ++ (tail b)-                  else error ("deleteAt: illegal index: " ++ show n)
− Makefile
@@ -1,48 +0,0 @@-TOPDIR = .--# way = p-# HCFLAGS = -D__DEBUG__--include $(TOPDIR)/mk/config.mk--# this rule must remain first-default: boot lib--ALL_DIRS = cbits HSCurses--PKG      = hscurses-LIBRARY  = libhscurses$(_way).a-LIBOBJS  = $(OBJS)--INSTALL_HEADERS = $(wildcard cbits/*.h)--include $(TOPDIR)/mk/rules.mk--.PHONY: srcdist-srcdist:-	@DIST=hscurses-ds-`date +%Y%m%d`; \-	CHANGELOG=CHANGELOG.$$DIST; \-	if [ -e $$DIST ] ; then echo "$$DIST already exists"; exit 1; fi; \-	darcs dist -d $$DIST > /dev/null && \-	gunzip $$DIST.tar.gz && \-	tar --delete --file=$$DIST.tar $$DIST/boring && \-	mkdir $$DIST && \-	darcs changes | sed 's/[[:alnum:].]*@[[:alnum:].]*/(Email address hidden)/g' > $$DIST/$$CHANGELOG && \-	tar --append --file=$$DIST.tar $$DIST/$$CHANGELOG && \-	mv $$DIST/$$CHANGELOG $$CHANGELOG && \-	rm -rf $$DIST && \-	gzip $$DIST.tar && \-	md5sum $$DIST.tar.gz > $$DIST.md5 && \-	echo "created dist as $$DIST.tar.gz"--CLEAN_FILES+=$(wildcard hscurses-ds-*.tar.gz hscurses-ds-*.md5 CHANGELOG.hscurses-ds-*)-# Dependency orders-ifeq ($(MAKECMDGOALS),clean)-#empty-else-ifeq ($(MAKECMDGOALS),distclean)-#empty-else-include $(TOPDIR)/depend-endif-endif
README view
@@ -1,22 +1,21 @@-               hscurses -- A Haskell Binding to NCurses+               hscurses -- A Haskell Binding to ncurses                =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ -hscurses is a Haskell binding to the NCurses library, a library of+hscurses is a Haskell binding to the ncurses library, a library of functions that manage an application's display on character-cell terminals. hscurses also provides some basic widgets implemented on top of the ncurses binding, such as a text input widget and a table widget. -The hscurses library has been reported to work on Linux x86 and on-OpenBSD using GHC 6.2, 6.4, 6.6, 6.6.1, 6.8.2.+The hscurses library has been reported to work on Linux x86 using GHC 6.8.2. -Building and installing the hscurses library with GHC 6.6+Building and installing the hscurses library with GHC 6.8 ---------------------------------------------------------  Requirements:  - GNU m4-- GHC >= 6.6+- GHC >= 6.8 - ncurses  Build and installation steps:@@ -30,34 +29,6 @@    runhaskell Setup.hs haddock --Building and installing the hscurses library with GHC 6.2 and 6.4--------------------------------------------------------------------Requirements:--- GNU make-- GNU m4-- GHC >= 6.2-- ncurses--Build and installation steps:--  sh configure-  make-  make doc          # if you want to build the API documentation-  make install      # probably as root--  make register     # probably as root-OR-  make user-register  # don't need to be root--In order to generate the API documentation, you need haddock-(http://www.haskell.org/haddock). The command is then:--  make doc          # result goes to ./html-- Using the hscurses library: --------------------------- @@ -65,15 +36,13 @@ moment, user documentation is only available through Haddock API documentation. - Copyright: ---------- -   John Meacham <john at repetae dot net>, 2002-2004.-   Tuomo Valkonen <tuomov at iki.fi>, 2004.+   John Meacham <john @ repetae . net>, 2002-2004.+   Tuomo Valkonen <tuomov @ iki.fi>, 2004.    Don Stewart <http://www.cse.unsw.edu.au/~dons>, 2004.    Stefan Wehr <http://www.stefanwehr.de>, 2004-2005.-  History: --------
Setup.hs view
@@ -1,2 +1,2 @@ import Distribution.Simple-main = defaultMainWithHooks defaultUserHooks+main = defaultMainWithHooks simpleUserHooks
+ UI/HSCurses/CWString.hsc view
@@ -0,0 +1,387 @@+-- Copyright (c) 2002-2004 John Meacham (john at repetae dot net)+-- Copyright (c) 2004      Don Stewart - http://www.cse.unsw.edu.au/~dons+--+-- This library 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 2.1 of the License, or (at your option) any later version.+--+-- This library 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 this library; if not, write to the Free Software+-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA+++module UI.HSCurses.CWString (++    -- * utf8 versions+    withUTF8String,+    withUTF8StringLen,+    newUTF8String,+    newUTF8StringLen,+    peekUTF8String,+    peekUTF8StringLen,++    -- * WChar stuff+#ifdef HAVE_WCHAR_H+    withCWString,+    withCWStringLen,+    newCWString,+    newCWStringLen,+    peekCWString,+    peekCWStringLen,+    wcharIsUnicode,+    CWChar,+    CWString,+    CWStringLen,+#endif+    -- * Locale versions+    withLCString,+    withLCStringLen,+    newLCString,+    newLCStringLen,+    peekLCStringLen,+    peekLCString,+--  charIsRepresentable++    ) where++import Data.Char            ( ord, chr )+import Data.Bits            ( Bits((.|.), (.&.), shift) )+import Foreign.C.String++#if __GLASGOW_HASKELL__ < 603+import GHC.Exts+#endif++#ifdef HAVE_WCHAR_H++import Foreign.C.Types++#include <wchar.h>+#include <limits.h>+#include <stdlib.h>++type CWChar = (#type wchar_t)+type CWString = Ptr CWChar+type CWStringLen = (CWString, Int)++fi :: (Integral a, Num b) => a -> b+fi x = fromIntegral x++-------------------+-- CWChar functions+-------------------++{-# INLINE wcharIsUnicode #-}+wcharIsUnicode :: Bool++#if defined(__STDC_ISO_10646__)++wcharIsUnicode = True++-- support functions+wNUL :: CWChar+wNUL = 0+#ifndef __GLASGOW_HASKELL__+pairLength :: String -> CString -> CStringLen+pairLength  = flip (,) . length++cwCharsToChars :: [CWChar] -> [Char]+cwCharsToChars xs  = map castCWCharToChar xs+charsToCWChars :: [Char] -> [CWChar]+charsToCWChars xs  = map castCharToCWChar xs++#endif+-- __STDC_ISO_10646__++castCWCharToChar :: CWChar -> Char+castCWCharToChar ch = chr (fromIntegral ch )++castCharToCWChar :: Char -> CWChar+castCharToCWChar ch = fromIntegral (ord ch)++-- exported functions+peekCWString    :: CWString -> IO String+#ifndef __GLASGOW_HASKELL__+peekCString cp  = do cs <- peekArray0 wNUL cp; return (cwCharsToChars cs)+#else+peekCWString cp = loop 0+  where+    loop i = do+        val <- peekElemOff cp i+        if val == wNUL then return [] else do+            rest <- loop (i+1)+            return (castCWCharToChar val : rest)+#endif++peekCWStringLen           :: CWStringLen -> IO String+#ifndef __GLASGOW_HASKELL__+peekCWStringLen (cp, len)  = do cs <- peekArray len cp; return (cwCharsToChars cs)+#else+peekCWStringLen (cp, len) = loop 0+  where+    loop i | i == len  = return []+           | otherwise = do+                val <- peekElemOff cp i+                rest <- loop (i+1)+                return (castCWCharToChar val : rest)+#endif++newCWString :: String -> IO CWString+#ifndef __GLASGOW_HASKELL__+newCWString  = newArray0 wNUL . charsToCWChars+#else+newCWString str = do+  ptr <- mallocArray0 (length str)+  let+        go [] n##   = pokeElemOff ptr (I## n##) wNUL+        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)+  go str 0##+  return ptr+#endif++newCWStringLen     :: String -> IO CWStringLen+#ifndef __GLASGOW_HASKELL__+newCWStringLen str  = do a <- newArray (charsToCWChars str)+                        return (pairLength str a)+#else+newCWStringLen str = do+  ptr <- mallocArray0 len+  let+        go [] _       = return ()+        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)+  go str 0##+  return (ptr, len)+  where+    len = length str+#endif++withCWString :: String -> (CWString -> IO a) -> IO a+#ifndef __GLASGOW_HASKELL__+withCWString  = withArray0 wNUL . charsToCWChars+#else+withCWString str f =+  allocaArray0 (length str) $ \ptr ->+      let+        go [] n##     = pokeElemOff ptr (I## n##) wNUL+        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)+      in do+      go str 0##+      f ptr+#endif++withCWStringLen         :: String -> (CWStringLen -> IO a) -> IO a+#ifndef __GLASGOW_HASKELL__+withCWStringLen str act  = withArray (charsToCWChars str) $ act . pairLength str+#else+withCWStringLen str f =+  allocaArray len $ \ptr ->+      let+        go [] _       = return ()+        go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##)+      in do+      go str 0##+      f (ptr,len)+  where+    len = length str+#endif+++#else+-- no __STDC_ISO_10646__+wcharIsUnicode = False+#endif++newtype MBState = MBState { _mbstate :: (Ptr MBState)}++withMBState :: (MBState -> IO a) -> IO a+withMBState act = allocaBytes (#const sizeof(mbstate_t)) (\mb -> c_memset mb 0 (#const sizeof(mbstate_t)) >> act (MBState mb))++clearMBState :: MBState -> IO ()+clearMBState (MBState mb) = c_memset mb 0 (#const sizeof(mbstate_t)) >> return ()++wcsrtombs :: CWString -> (CString, CSize) -> IO CSize+wcsrtombs wcs (cs,len) =+    alloca (\p ->+        poke p wcs >> withMBState (\mb ->+            wcsrtombs' p cs len mb))+    where+        wcsrtombs'  p cs' len' mb = do+            x <- c_wcsrtombs cs p len' mb+            case x of+                -1 -> do+                    sp <- peek p+                    poke sp ((fi (ord '?'))::CWChar)+                    poke p wcs+                    clearMBState mb+                    wcsrtombs' p cs' len' mb+                e | e >= 0 && e <= len' -> do+                    let ep = advancePtr cs' (fi e)+                    poke ep (fi (0::Int))+                    return x+                e -> error $ "HSCurses.CWString.wcsrtombs: impossible case: "++show e++#def inline HsInt hs_get_mb_cur_max () { return MB_CUR_MAX; }+foreign import ccall unsafe hs_get_mb_cur_max :: IO Int++mb_cur_max :: Int+mb_cur_max = unsafePerformIO hs_get_mb_cur_max++{-+charIsRepresentable :: Char -> IO Bool+charIsRepresentable ch = fmap (/= -1) $ allocaBytes mb_cur_max (\cs -> c_wctomb cs (fi $ ord ch))+-}++{-+foreign import ccall unsafe "stdlib.h wctomb" c_wctomb :: CString -> CWChar -> IO CInt+-}++foreign import ccall unsafe "stdlib.h wcsrtombs"+        c_wcsrtombs :: CString -> (Ptr (Ptr CWChar)) -> CSize -> MBState -> IO CSize++foreign import ccall unsafe "string.h memset"+        c_memset :: Ptr a -> CInt -> CSize -> IO (Ptr a)++foreign import ccall unsafe "stdlib.h mbstowcs"+        c_mbstowcs :: CWString -> CString -> CSize -> IO CSize++mbstowcs :: CWString+         -> Foreign.C.String.CString+         -> Foreign.C.Types.CSize -> IO Foreign.C.Types.CSize++mbstowcs a b s = throwIf (== -1) (const "mbstowcs") $ c_mbstowcs a b s++peekLCString    :: CString -> IO String+peekLCString cp  = do+    sz <- mbstowcs nullPtr cp 0+    allocaArray (fi $ sz + 1) (\wcp -> mbstowcs wcp cp (sz + 1) >> peekCWString wcp)++-- TODO fix for embeded NULs+peekLCStringLen           :: CStringLen -> IO String+peekLCStringLen (cp, len)  =  allocaBytes (len + 1) $ \ncp -> do+    copyBytes ncp cp len+    pokeElemOff ncp len 0+    peekLCString ncp++newLCString :: String -> IO CString+newLCString s =+    withCWString s $ \wcs -> do+        cs <- mallocArray0 alen+        wcsrtombs wcs (cs, fi alen)+        return cs++    where alen = mb_cur_max * length s++newLCStringLen     :: String -> IO CStringLen+newLCStringLen str  = newLCString str >>= \cs -> return (pairLength1 str cs)++withLCString :: String -> (CString -> IO a) -> IO a+withLCString s a =+    withCWString s $ \wcs ->+        allocaArray0 alen $ \cs ->+            wcsrtombs wcs (cs,fi alen) >> a cs++    where alen = mb_cur_max * length s++withLCStringLen :: String -> (CStringLen -> IO a) -> IO a+withLCStringLen s a =+    withCWString s $ \wcs ->+        allocaArray0 alen $ \cs -> do+            sz <- wcsrtombs wcs (cs,fi alen)+            a (cs,fi sz)++    where alen = mb_cur_max * length s++pairLength1 :: String -> CString -> CStringLen+pairLength1  = flip (,) . length++#else+-- -----------------------------------------------------------+-- no CF_WCHAR_SUPPORT (OpenBSD)++{-+charIsRepresentable :: Char -> IO Bool+charIsRepresentable ch = return $ isLatin1 ch+-}++withLCString :: String -> (Foreign.C.String.CString -> IO a) -> IO a+withLCString = withCString++withLCStringLen  :: String -> (Foreign.C.String.CStringLen -> IO a) -> IO a+withLCStringLen = withCStringLen++newLCString :: String -> IO Foreign.C.String.CString+newLCString = newCString++newLCStringLen :: String -> IO Foreign.C.String.CStringLen+newLCStringLen = newCStringLen++peekLCString :: Foreign.C.String.CString -> IO String+peekLCString = peekCString++peekLCStringLen :: Foreign.C.String.CStringLen -> IO String+peekLCStringLen = peekCStringLen++#endif+-- no CF_WCHAR_SUPPORT++-----------------+-- UTF8 versions+-----------------++withUTF8String :: String -> (CString -> IO a) -> IO a+withUTF8String hsStr = withCString (toUTF hsStr)++withUTF8StringLen :: String -> (CStringLen -> IO a) -> IO a+withUTF8StringLen hsStr = withCStringLen (toUTF hsStr)++newUTF8String :: String -> IO CString+newUTF8String = newCString . toUTF++newUTF8StringLen :: String -> IO CStringLen+newUTF8StringLen = newCStringLen . toUTF++peekUTF8String :: CString -> IO String+peekUTF8String strPtr = fmap fromUTF $ peekCString strPtr++peekUTF8StringLen :: CStringLen -> IO String+peekUTF8StringLen strPtr = fmap fromUTF $ peekCStringLen strPtr++-- these should read and write directly from/to memory.+-- A first pass will be needed to determine the size of the allocated region++toUTF :: String -> String+toUTF [] = []+toUTF (x:xs) | ord x<=0x007F = x:toUTF xs+             | ord x<=0x07FF = chr (0xC0 .|. ((ord x `shift` (-6)) .&. 0x1F)):+                               chr (0x80 .|. (ord x .&. 0x3F)):+                               toUTF xs+             | otherwise     = chr (0xE0 .|. ((ord x `shift` (-12)) .&. 0x0F)):+                               chr (0x80 .|. ((ord x `shift` (-6)) .&. 0x3F)):+                               chr (0x80 .|. (ord x .&. 0x3F)):+                               toUTF xs++fromUTF :: String -> String+fromUTF [] = []+fromUTF (al@(x:xs)) | ord x<=0x7F = x:fromUTF xs+                     | ord x<=0xBF = err+                     | ord x<=0xDF = twoBytes al+                     | ord x<=0xEF = threeBytes al+                     | otherwise   = err+  where+    twoBytes (x1:x2:xs') = chr (((ord x1 .&. 0x1F) `shift` 6) .|.+                               (ord x2 .&. 0x3F)):fromUTF xs'+    twoBytes _ = error "fromUTF: illegal two byte sequence"++    threeBytes (x1:x2:x3:xs') = chr (((ord x1 .&. 0x0F) `shift` 12) .|.+                                    ((ord x2 .&. 0x3F) `shift` 6) .|.+                                    (ord x3 .&. 0x3F)):fromUTF xs'+    threeBytes _ = error "fromUTF: illegal three byte sequence"++    err = error "fromUTF: illegal UTF-8 character"+
+ UI/HSCurses/Curses.hsc view
@@ -0,0 +1,1450 @@+{-# LANGUAGE ForeignFunctionInterface, GeneralizedNewtypeDeriving #-}+-- glaexts needed for newtype deriving++-- Copyright (c) 2002-2004 John Meacham (john at repetae dot net)+-- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons+-- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de+--+-- This library 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 2.1 of the License, or (at your option) any later version.+--+-- This library 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 this library; if not, write to the Free Software+-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA++++--+-- | Binding to the [wn]curses library. From the ncurses man page:+--+-- >      The curses library routines give the user a terminal-inde-+-- >      pendent method of updating character screens with  reason-+-- >      able  optimization.+--+-- Sections of the quoted documentation are from the OpenBSD man pages, which+-- are distributed under a BSD license.+--+-- A useful reference is:+--        /Writing Programs with NCURSES/, by Eric S. Raymond and Zeyd+--        M. Ben-Halim, <http://dickey.his.com/ncurses/>+--+-- N.B attrs don't work with Irix curses.h. This should be fixed.+--++module UI.HSCurses.Curses (++    -- * Basic Functions+    stdScr,             -- :: Window+    initScr,            -- :: IO Window+    initCurses,         -- :: IO ()+    resetParams,+    endWin,             -- :: IO ()+    scrSize,            -- :: IO (Int, Int)++    -- * Windows and Pads+    Window,             -- data Window deriving Eq+    touchWin,+    newPad, pRefresh, delWin, newWin,++    -- * Refresh Routines+    refresh,            -- :: IO ()+    update,+    resizeTerminal,+    timeout,            -- :: Int -> IO ()+    noqiflush,           -- :: IO ()++    -- * Navigation+    move,               -- :: Int -> Int -> IO ()+    getYX,++    -- * Input+    getCh, getch, decodeKey, ungetCh, keyResizeCode,++    -- * Input Options+    cBreak,             -- :: Bool -> IO ()+    raw,                -- :: Bool -> IO ()+    echo,               -- :: Bool -> IO ()+    intrFlush,          -- :: Bool -> IO ()+    keypad,             -- :: Window -> Bool -> IO ()+    noDelay,            -- :: Window -> Bool -> IO ()++    -- * Output+    wAddStr,       -- :: Window -> String -> IO ()+    addLn,         -- :: IO ()+    mvWAddStr,+    mvAddCh,       -- :: Int -> Int -> ChType -> IO ()+    wMove,+    bkgrndSet,     -- :: Attr -> Pair -> IO ()+    erase,         -- :: IO ()+    wclear,        -- :: Window -> IO ()+    clrToEol,      -- :: IO ()+    wClrToEol,+    beep,+    waddch,+    waddchnstr,    -- :: Window -> CString -> CInt -> IO CInt++    -- * Output Options+    clearOk,+    leaveOk,+    nl,                 -- :: Bool -> IO ()++    -- * Cursor Routines+    CursorVisibility(..), cursSet,++    -- * Color Support+    hasColors,      -- :: IO Bool+    startColor,     -- :: IO ()+    useDefaultColors,   -- :: IO ()+    Pair(..),       -- newtype Pair = Pair Int deriving (Eq, Ord, Ix)+    colorPairs,     -- :: IO Int+    Color(..),      -- newtype Color = Color Int deriving (Eq, Ord, Ix)+    colors,         -- :: IO Int+    color,          -- :: String -> Maybe Color+--    black, red, green, yellow, blue, magenta, cyan, white, -- :: Color+    initPair,       -- :: Pair -> Color -> Color -> IO ()+    pairContent,    -- :: Pair -> IO (Color, Color)+    canChangeColor, -- :: IO Bool+    initColor,      -- :: Color -> (Int, Int, Int) -> IO ()+    colorContent,   -- :: Color -> IO (Int, Int, Int)+    defaultBackground, defaultForeground,++    -- * Attributes+    attrPlus,+    Attr,+    attr0, -- :: Attr++    isAltCharset, isBlink, isBold, isDim, isHorizontal, isInvis,+    isLeft, isLow, isProtect, isReverse, isRight, isStandout, isTop,+    isUnderline, isVertical,+        -- :: Attr -> Bool++    setAltCharset, setBlink, setBold, setDim, setHorizontal, setInvis,+    setLeft, setLow, setProtect, setReverse, setRight, setStandout,+    setTop, setUnderline, setVertical,+        -- :: Attr -> Bool -> Attr++    attrSet, -- :: Attr -> Pair -> IO ()+    attrOn, attrOff,++    standout,standend,+    attrDim, attrBold,+    attrDimOn, attrDimOff,+    attrBoldOn, attrBoldOff,+    wAttrOn,+    wAttrOff,+    wAttrSet, wAttrGet,++    -- * Mouse Routines+    withMouseEventMask,+    ButtonEvent(..),+    MouseEvent(..),++    -- * Keys+    Key(..),+    cERR,+    cKEY_UP,+    cKEY_DOWN,+    cKEY_LEFT,+    cKEY_RIGHT,+    cTRUE,+--    cACS_BLOCK,++    -- * Lines+    vline,+    ulCorner, llCorner, urCorner, lrCorner, rTee, lTee, bTee, tTee, hLine,+    vLine, plus, s1, s9, diamond, ckBoard, degree, plMinus, bullet,+    lArrow, rArrow, dArrow, uArrow, board, lantern, block,+    s3, s7, lEqual, gEqual, pi, nEqual, sterling,++    -- * Signals+    cursesSigWinch,++    -- * Misc+    cursesTest,+    throwIfErr, throwIfErr_,+    errI,       -- :: IO CInt -> IO ()+    flushinp,+    recognize,+    ChType,+    NBool++  ) where++#include <ghcconfig.h>+#include <HSCurses.h>++#if HAVE_SIGNAL_H+# include <signal.h>+#endif++import UI.HSCurses.CWString       ( withLCStringLen )+import UI.HSCurses.Logging++import Prelude hiding           ( pi )+import Data.Char+import Data.List+import Data.Ix                  ( Ix )++import Control.Monad+import Control.Monad.Trans+import Control.Concurrent+import Control.Concurrent.Chan++import Foreign+import Foreign.C.String+import Foreign.C.Types+import Foreign.C.Error+import System.Posix.Signals++#if __GLASGOW_HASKELL__ < 603+import Data.Bits+#endif+++------------------------------------------------------------------------+--+-- | @initCurses fn@ does all initialization necessary for a Curses+--   application.+--+initCurses :: IO ()+initCurses = do+    initScr+    b <- hasColors+    when b $ startColor >> useDefaultColors++resetParams :: IO ()+resetParams = do+    raw True    -- raw mode please+    echo False+    nl False+    intrFlush True+    leaveOk False+    keypad stdScr True+    defineKey (#const KEY_UP) "\x1b[1;2A"+    defineKey (#const KEY_DOWN) "\x1b[1;2B"+    defineKey (#const KEY_SLEFT) "\x1b[1;2D"+    defineKey (#const KEY_SRIGHT) "\x1b[1;2C"++------------------------------------------------------------------------++fi :: (Integral a, Num b) => a -> b+fi = fromIntegral++throwIfErr :: Num a => String -> IO a -> IO a+--throwIfErr name act = do+--    res <- act+--    if res == (cERR)+--        then ioError (userError ("Curses: "++name++" failed"))+--        else return res+throwIfErr s = throwIf (== (#const ERR)) (\a -> "Curses[" ++ show a ++ "]:"  ++ s)++throwIfErr_ :: Num a => String -> IO a -> IO ()+throwIfErr_ name act = void $ throwIfErr name act++errI :: IO CInt -> IO ()+errI f = do r <- f+            if r == cERR then do _ <- endwin+                                 error "curses returned an error"+             else return ()++------------------------------------------------------------------------++type WindowTag = ()+type Window = Ptr WindowTag+type ChType = #type chtype+type NBool = #type bool+++--+-- | The standard screen+--+stdScr :: Window+stdScr = unsafePerformIO (peek stdscr)+foreign import ccall "static HSCurses.h &stdscr"+    stdscr :: Ptr Window++--+-- | initscr is normally the first curses routine to call when+-- initializing a program. curs_initscr(3):+--+-- >     To initialize the routines, the routine initscr or newterm+-- >     must be called before any of the other routines that  deal+-- >     with  windows  and  screens  are used.+--+-- >     The initscr code determines the terminal type and initial-+-- >     izes all curses data structures.  initscr also causes  the+-- >     first  call  to  refresh  to  clear the screen.  If errors+-- >     occur, initscr writes  an  appropriate  error  message  to+-- >     standard error and exits; otherwise, a pointer is returned+-- >     to stdscr.+--+initScr :: IO Window+initScr = throwIfNull "initscr" initscr+foreign import ccall unsafe "HSCurses.h initscr" initscr :: IO Window++--+-- | > The cbreak routine+--   > disables line buffering and erase/kill  character-process-+--   > ing  (interrupt  and  flow  control  characters  are unaf-+--   > fected), making characters typed by the  user  immediately+--   > available  to  the  program.  The nocbreak routine returns+--   > the terminal to normal (cooked) mode.+--+cBreak :: Bool -> IO ()+cBreak True  = throwIfErr_ "cbreak"   cbreak+cBreak False = throwIfErr_ "nocbreak" nocbreak++foreign import ccall unsafe "HSCurses.h cbreak"     cbreak :: IO CInt+foreign import ccall unsafe "HSCurses.h nocbreak" nocbreak :: IO CInt++--+-- |>    The  raw and noraw routines place the terminal into or out+-- >     of raw mode.  Raw mode is similar to cbreak mode, in  that+-- >     characters  typed  are  immediately  passed through to the+-- >     user program.  The differences are that in raw  mode,  the+-- >     interrupt,  quit, suspend, and flow control characters are+-- >     all passed through uninterpreted, instead of generating  a+-- >     signal.   The  behavior  of the BREAK key depends on other+-- >     bits in the tty driver that are not set by curses.+--+raw :: Bool -> IO ()+raw False = throwIfErr_ "noraw" noraw+raw True  = throwIfErr_ "raw"   raw_c++foreign import ccall unsafe "HSCurses.h noraw" noraw :: IO CInt+foreign import ccall unsafe "HSCurses.h raw"   raw_c :: IO CInt++--+-- |>      The  echo  and  noecho routines control whether characters+-- >       typed by the user are echoed by getch as they  are  typed.+-- >       Echoing  by  the  tty  driver is always disabled, but ini-+-- >       tially getch is in echo  mode,  so  characters  typed  are+-- >       echoed.  Authors of most interactive programs prefer to do+-- >       their own echoing in a controlled area of the  screen,  or+-- >       not  to  echo  at  all, so they disable echoing by calling+-- >       noecho.  [See curs_getch(3) for a discussion of how  these+-- >       routines interact with cbreak and nocbreak.]+-- >+--+echo :: Bool -> IO ()+echo False = throwIfErr_ "noecho" noecho+echo True  = throwIfErr_ "echo"   echo_c++foreign import ccall unsafe "HSCurses.h noecho" noecho :: IO CInt+foreign import ccall unsafe "HSCurses.h echo" echo_c :: IO CInt++--+-- |>       The  nl  and  nonl routines control whether the underlying+-- >        display device translates the return key into  newline  on+-- >        input,  and  whether it translates newline into return and+-- >        line-feed on output (in either case, the call  addch('\n')+-- >        does the equivalent of return and line feed on the virtual+-- >        screen).  Initially, these translations do occur.  If  you+-- >        disable  them using nonl, curses will be able to make bet-+-- >        ter use of the line-feed capability, resulting  in  faster+-- >        cursor  motion.   Also, curses will then be able to detect+-- >        the return key.+-- >+nl :: Bool -> IO ()+nl True  = throwIfErr_ "nl"   nl_c+nl False = throwIfErr_ "nonl" nonl++foreign import ccall unsafe "HSCurses.h nl" nl_c :: IO CInt+foreign import ccall unsafe "HSCurses.h nonl" nonl :: IO CInt++-- |>       If  the intrflush option is enabled, (bf is TRUE), when an+-- >        interrupt key  is  pressed  on  the  keyboard  (interrupt,+-- >        break,  quit)  all  output in the tty driver queue will be+-- >        flushed, giving the  effect  of  faster  response  to  the+-- >        interrupt,  but  causing  curses to have the wrong idea of+-- >        what is on the  screen.   Disabling  (bf  is  FALSE),  the+-- >        option  prevents the flush.+-- >+intrFlush :: Bool -> IO ()+intrFlush bf =+    throwIfErr_ "intrflush" $ intrflush stdScr (if bf then 1 else 0)+foreign import ccall unsafe "HSCurses.h intrflush" intrflush :: Window -> (#type bool) -> IO CInt++--+-- | Enable the keypad of the user's terminal.+--+keypad :: Window -> Bool -> IO ()+keypad win bf = throwIfErr_ "keypad" $ keypad_c win (if bf then 1 else 0)+foreign import ccall unsafe "HSCurses.h keypad"+    keypad_c :: Window -> (#type bool) -> IO CInt++noDelay :: Window -> Bool -> IO ()+noDelay win bf =+    throwIfErr_ "nodelay" $ nodelay win (if bf then 1 else 0)++foreign import ccall unsafe "HSCurses.h nodelay"+    nodelay :: Window -> (#type bool) -> IO CInt++--+-- |   Normally, the hardware cursor is left at the  location  of+--     the  window  cursor  being  refreshed.  The leaveok option+--     allows the cursor to be left wherever the  update  happens+--     to leave it.  It is useful for applications where the cur-+--     sor is not used, since it  reduces  the  need  for  cursor+--     motions.   If  possible, the cursor is made invisible when+--     this option is enabled.+--+leaveOk  :: Bool -> IO CInt+leaveOk True  = leaveok_c stdScr 1+leaveOk False = leaveok_c stdScr 0++foreign import ccall unsafe "HSCurses.h leaveok"+    leaveok_c :: Window -> (#type bool) -> IO CInt++clearOk :: Bool -> IO CInt+clearOk True  = clearok_c stdScr 1+clearOk False = clearok_c stdScr 0++foreign import ccall unsafe "HSCurses.h clearok"+    clearok_c :: Window -> (#type bool) -> IO CInt++------------------------------------------------------------------------++foreign import ccall unsafe "HSCurses.h use_default_colors"+    useDefaultColors :: IO ()++defaultBackground, defaultForeground :: Color+defaultBackground = Color (-1)+defaultForeground = Color (-1)++------------------------------------------------------------------------++defineKey :: CInt -> String -> IO ()+defineKey k s =  withCString s (\s' -> define_key s' k) >> return ()++foreign import ccall unsafe "HSCurses.h define_key"+    define_key :: Ptr CChar -> CInt -> IO ()++--+-- | >  The program must call endwin for each terminal being used before+--   >  exiting from curses.+--+endWin :: IO ()+endWin = throwIfErr_ "endwin" endwin+foreign import ccall unsafe "HSCurses.h endwin" endwin :: IO CInt++------------------------------------------------------------------------++--+-- | get the dimensions of the screen+--+scrSize :: IO (Int, Int)+scrSize = do+    lnes <- peek linesPtr+    cols <- peek colsPtr+    return (fromIntegral lnes, fromIntegral cols)++foreign import ccall "HSCurses.h &LINES" linesPtr :: Ptr CInt+foreign import ccall "HSCurses.h &COLS"  colsPtr  :: Ptr CInt++--+-- | refresh curses windows and lines. curs_refresh(3)+--+refresh :: IO ()+refresh = throwIfErr_ "refresh" refresh_c++foreign import ccall unsafe "HSCurses.h refresh"+    refresh_c :: IO CInt++--+-- | Do an actual update. Used after endWin on linux to restore the terminal+--+update :: IO ()+update = throwIfErr_ "update" update_c++foreign import ccall unsafe "HSCurses.h doupdate" update_c :: IO CInt++foreign import ccall unsafe "static curses.h timeout" timeout_c :: CInt -> IO ()++-- | Set a delay in milliseconds.+timeout :: Int -> IO ()+timeout = timeout_c . fromIntegral++------------------------------------------------------------------------++hasColors :: IO Bool+hasColors = liftM (/= 0) has_colors+foreign import ccall unsafe "HSCurses.h has_colors" has_colors :: IO (#type bool)++--+-- | Initialise the color settings, also sets the screen to the+-- default colors (white on black)+--+startColor :: IO ()+startColor = throwIfErr_ "start_color" start_color+foreign import ccall unsafe start_color :: IO CInt++newtype Pair = Pair Int deriving (Eq, Ord, Ix, Show)++--+-- | colorPairs defines the maximum number of color-pairs the terminal+-- can support).+--+colorPairs :: IO Int+colorPairs = fmap fromIntegral $ peek colorPairsPtr++foreign import ccall "HSCurses.h &COLOR_PAIRS"+        colorPairsPtr :: Ptr CInt++newtype Color = Color Int deriving (Eq, Ord, Ix)++colors :: IO Int+colors = liftM fromIntegral $ peek colorsPtr++foreign import ccall "HSCurses.h &COLORS" colorsPtr :: Ptr CInt++--black, red, green, yellow, blue, magenta, cyan, white :: Color++color :: String -> Maybe Color+color "default"  = Just $ Color (-1)+color "black"    = Just $ Color (#const COLOR_BLACK)+color "red"      = Just $ Color (#const COLOR_RED)+color "green"    = Just $ Color (#const COLOR_GREEN)+color "yellow"   = Just $ Color (#const COLOR_YELLOW)+color "blue"     = Just $ Color (#const COLOR_BLUE)+color "magenta"  = Just $ Color (#const COLOR_MAGENTA)+color "cyan"     = Just $ Color (#const COLOR_CYAN)+color "white"    = Just $ Color (#const COLOR_WHITE)+color _ =  Nothing+++--+-- |   curses support color attributes  on  terminals  with  that+--     capability.   To  use  these  routines start_color must be+--     called, usually right after initscr.   Colors  are  always+--     used  in pairs (referred to as color-pairs).  A color-pair+--     consists of a foreground  color  (for  characters)  and  a+--     background color (for the blank field on which the charac-+--     ters are displayed).  A programmer  initializes  a  color-+--     pair  with  the routine init_pair.  After it has been ini-+--     tialized, COLOR_PAIR(n), a macro  defined  in  <curses.h>,+--     can be used as a new video attribute.+--+--     If  a  terminal  is capable of redefining colors, the pro-+--     grammer can use the routine init_color to change the defi-+--     nition   of   a   color.+--+--     The init_pair routine changes the definition of  a  color-+--     pair.   It takes three arguments: the number of the color-+--     pair to be changed, the foreground color number,  and  the+--     background color number.  For portable applications:+--+--     -    The value of the first argument must be between 1 and+--          COLOR_PAIRS-1.+--+--     -    The value of the second and third arguments  must  be+--          between  0  and  COLORS (the 0 color pair is wired to+--          white on black and cannot be changed).+--+--+initPair :: Pair -> Color -> Color -> IO ()+initPair (Pair p) (Color f) (Color b) =+    throwIfErr_ "init_pair" $+        init_pair (fromIntegral p) (fromIntegral f) (fromIntegral b)++foreign import ccall unsafe+    init_pair :: CShort -> CShort -> CShort -> IO CInt+++pairContent :: Pair -> IO (Color, Color)+pairContent (Pair p) =+    alloca $ \fPtr ->+    alloca $ \bPtr -> do+        throwIfErr "pair_content" $ pair_content (fromIntegral p) fPtr bPtr+        f <- peek fPtr+        b <- peek bPtr+        return (Color (fromIntegral f), Color (fromIntegral b))++foreign import ccall unsafe pair_content :: CShort -> Ptr CShort -> Ptr CShort -> IO CInt++canChangeColor :: IO Bool+canChangeColor = liftM (/= 0) can_change_color++foreign import ccall unsafe can_change_color :: IO (#type bool)++initColor :: Color -> (Int, Int, Int) -> IO ()+initColor (Color c) (r, g, b) =+    throwIfErr_ "init_color" $+        init_color (fromIntegral c) (fromIntegral r) (fromIntegral g) (fromIntegral b)+foreign import ccall unsafe init_color :: CShort -> CShort -> CShort -> CShort -> IO CInt++colorContent :: Color -> IO (Int, Int, Int)+colorContent (Color c) =+    alloca $ \rPtr ->+    alloca $ \gPtr ->+    alloca $ \bPtr -> do+        throwIfErr "color_content" $ color_content (fromIntegral c) rPtr gPtr bPtr+        r <- peek rPtr+        g <- peek gPtr+        b <- peek bPtr+        return (fromIntegral r, fromIntegral g, fromIntegral b)++foreign import ccall unsafe+    color_content :: CShort -> Ptr CShort -> Ptr CShort -> Ptr CShort -> IO CInt++foreign import ccall unsafe "HSCurses.h hs_curses_color_pair" colorPair :: Pair -> ChType+#def inline chtype hs_curses_color_pair (HsInt pair) {return COLOR_PAIR (pair);}++-------------+-- Attributes+-------------++foreign import ccall unsafe "HSCurses.h attr_set"+    attr_set :: Attr -> CShort -> Ptr a -> IO Int++-- foreign import ccall unsafe "HSCurses.h attr_get" :: Attr -> CShort -> Ptr a -> IO Int++foreign import ccall unsafe "HSCurses.h wattr_set"+    wattr_set :: Window -> Attr -> CInt -> Ptr a -> IO CInt++foreign import ccall unsafe "HSCurses.h wattr_get"+    wattr_get :: Window -> Ptr Attr -> Ptr CShort -> Ptr a -> IO CInt++foreign import ccall "HSCurses.h attr_on" attr_on :: (#type attr_t) -> Ptr a -> IO Int+foreign import ccall "HSCurses.h attr_off" attr_off :: (#type attr_t) -> Ptr a -> IO Int+foreign import ccall "HSCurses.h attron" attron :: Int -> IO Int+foreign import ccall "HSCurses.h attroff" attroff :: Int -> IO Int+foreign import ccall unsafe "HSCurses.h wattron" wattron :: Window -> CInt -> IO CInt+foreign import ccall unsafe "HSCurses.h wattroff" wattroff :: Window -> CInt -> IO CInt+foreign import ccall standout :: IO Int+foreign import ccall standend :: IO Int++--+-- |+--+wAttrSet :: Window -> (Attr,Pair) -> IO ()+wAttrSet w (a,(Pair p)) = throwIfErr_ "wattr_set" $+    wattr_set w a (fromIntegral p) nullPtr++--+-- | manipulate the current attributes of the named window. see curs_attr(3)+--+wAttrGet :: Window -> IO (Attr,Pair)+wAttrGet w =+    alloca $ \pa ->+        alloca $ \pp -> do+            throwIfErr_ "wattr_get" $ wattr_get w pa pp nullPtr+            a <- peek pa+            p <- peek pp+            return (a,Pair $ fromIntegral p)+++newtype Attr = Attr (#type attr_t) deriving (Eq,Storable,Bits, Num, Show)++--+-- | Normal display (no highlight)+--+attr0 :: Attr+attr0 = Attr (#const WA_NORMAL)++isAltCharset, isBlink, isBold, isDim, isHorizontal, isInvis, isLeft,+    isLow, isProtect, isReverse, isRight, isStandout, isTop,+    isUnderline, isVertical :: Attr -> Bool++isAltCharset = isAttr (#const WA_ALTCHARSET)+isBlink      = isAttr (#const WA_BLINK)+isBold       = isAttr (#const WA_BOLD)+isDim        = isAttr (#const WA_DIM)+isHorizontal = isAttr (#const WA_HORIZONTAL)+isInvis      = isAttr (#const WA_INVIS)+isLeft       = isAttr (#const WA_LEFT)+isLow        = isAttr (#const WA_LOW)+isProtect    = isAttr (#const WA_PROTECT)+isReverse    = isAttr (#const WA_REVERSE)+isRight      = isAttr (#const WA_RIGHT)+isStandout   = isAttr (#const WA_STANDOUT)+isTop        = isAttr (#const WA_TOP)+isUnderline  = isAttr (#const WA_UNDERLINE)+isVertical   = isAttr (#const WA_VERTICAL)++isAttr :: (#type attr_t) -> Attr -> Bool+isAttr b (Attr a) = a .&. b /= 0++--+-- | Setting attributes+--+setAltCharset, setBlink, setBold, setDim, setHorizontal, setInvis,+    setLeft, setLow, setProtect, setReverse, setRight, setStandout,+    setTop, setUnderline, setVertical :: Attr -> Bool -> Attr++setAltCharset = setAttr (#const WA_ALTCHARSET)+setBlink      = setAttr (#const WA_BLINK)+setBold       = setAttr (#const WA_BOLD)+setDim        = setAttr (#const WA_DIM)+setHorizontal = setAttr (#const WA_HORIZONTAL)+setInvis      = setAttr (#const WA_INVIS)+setLeft       = setAttr (#const WA_LEFT)+setLow        = setAttr (#const WA_LOW)+setProtect    = setAttr (#const WA_PROTECT)+setReverse    = setAttr (#const WA_REVERSE)+setRight      = setAttr (#const WA_RIGHT)+setStandout   = setAttr (#const WA_STANDOUT)+setTop        = setAttr (#const WA_TOP)+setUnderline  = setAttr (#const WA_UNDERLINE)+setVertical   = setAttr (#const WA_VERTICAL)++setAttr :: (#type attr_t) -> Attr -> Bool -> Attr+setAttr b (Attr a) False = Attr (a .&. complement b)+setAttr b (Attr a) True  = Attr (a .|.            b)++attrPlus :: Attr -> Attr -> Attr+attrPlus (Attr a) (Attr b) = Attr (a .|. b)++attrSet :: Attr -> Pair -> IO ()+attrSet attr (Pair p) = throwIfErr_ "attrset" $+    attr_set attr (fromIntegral p) nullPtr++attrOn :: Attr -> IO ()+attrOn (Attr attr) = throwIfErr_ "attr_on" $+    attr_on attr nullPtr+++attrOff :: Attr -> IO ()+attrOff (Attr attr) = throwIfErr_ "attr_off" $+    attr_off attr nullPtr++++wAttrOn :: Window -> Int -> IO ()+wAttrOn w x = throwIfErr_ "wattron" $ wattron w (fi x)++wAttrOff :: Window -> Int -> IO ()+wAttrOff w x = throwIfErr_ "wattroff" $ wattroff w (fi x)++attrDimOn :: IO ()+attrDimOn  = throwIfErr_ "attron A_DIM" $+    attron (#const A_DIM)++attrDimOff :: IO ()+attrDimOff = throwIfErr_ "attroff A_DIM" $+    attroff (#const A_DIM)++attrBoldOn :: IO ()+attrBoldOn  = throwIfErr_ "attron A_BOLD" $+    attron (#const A_BOLD)++attrBoldOff :: IO ()+attrBoldOff = throwIfErr_ "attroff A_BOLD" $+    attroff (#const A_BOLD)+++attrDim :: Int+attrDim = (#const A_DIM)+attrBold :: Int+attrBold = (#const A_BOLD)++------------------------------------------------------------------------++mvWAddStr :: Window -> Int -> Int -> String -> IO ()+mvWAddStr w y x str = wMove w y x >> wAddStr w str++mvAddCh :: Int -> Int -> ChType -> IO ()+mvAddCh l m n = mvaddch_c (fromIntegral l) (fromIntegral m) (fromIntegral n)++addLn :: IO ()+addLn = wAddStr stdScr "\n"++--+-- | normalise the string, stripping \\r and making control chars+-- printable. Called over all output(?)++{-+normalise :: String -> String+normalise []        = []+normalise ('\r':cs) = normalise cs+normalise (c:cs) | isControl c   = '@' : normalise cs+                 | otherwise     = c   : normalise cs+{-# INLINE normalise #-}+-}++{-+normalise s = map f . filter (/= '\r') s+    where+        f c | isPrint c  = c+        f c = '@'+-}++------------------------------------------------------------------------++#if defined(HAVE_WCHAR_H) && defined(HAVE_LIBNCURSESW)++--wAddStr :: Window -> String -> IO ()+--wAddStr w str = throwIfErr_ ("waddnwstr: " ++ show str) $ withCWStringLen (normalise str) (\(ws,len) -> waddnwstr w ws (fi len))++foreign import ccall unsafe+    waddnwstr :: Window -> CWString -> CInt -> IO CInt++foreign import ccall unsafe+    waddch :: Window -> ChType -> IO CInt++wAddStr :: Window -> String -> IO ()+wAddStr win str = do+    let+        convStr f = case f [] of+            [] -> return ()+            s  -> throwIfErr_ "waddnstr" $+                withCWStringLen  (s) (\(ws,len) ->  (waddnwstr win ws (fi len)))+        loop []        acc = convStr acc+        loop (ch:str') acc = recognize+            ch+            (loop str' (acc . (ch:)))+            (\ch' -> do+                convStr acc+                throwIfErr "waddch" $ waddch win ch'+                loop str' id)+    loop str id++#else++--+-- This is heavily called, and does a lot of allocs.  We walk over all+-- the string accumulating a list of characters to be drawn.+--+-- Got it down to:+--+--      wAddStr Yi.Curses 20.0   38.1+--      wAddStr Yi.Curses 10.0   32.5+--+-- TODO make this way less expensive. That accum sucks.+-- use difference lists for O(1) append+--+wAddStr :: Window -> [Char] -> IO ()+wAddStr _   [] = return ()+wAddStr win s  = throwIfErr_ ("waddnstr: <" ++ s ++ ">") $+    withLCStringLen (s) (\(ws,len) -> waddnstr win ws (fi len))++foreign import ccall threadsafe+    waddnstr :: Window -> CString -> CInt -> IO CInt++foreign import ccall threadsafe+    waddch :: Window -> ChType -> IO CInt++foreign import ccall threadsafe+    waddchnstr :: Window -> CString -> CInt -> IO CInt++foreign import ccall threadsafe "static curses.h mvaddch" mvaddch_c :: CInt -> CInt -> ChType -> IO ()++#endif++foreign import ccall threadsafe+    vline  :: Char -> Int -> IO ()++------------------------------------------------------------------------++--+-- what ?+--++#let translate_attr attr =                              \+    "(if a .&. %lu /= 0 then %lu else 0) .|.",          \+    (unsigned long) WA_##attr, (unsigned long) A_##attr++bkgrndSet :: Attr -> Pair -> IO ()+bkgrndSet (Attr a) p = bkgdset $+    fromIntegral (ord ' ') .|.+    #translate_attr ALTCHARSET+    #translate_attr BLINK+    #translate_attr BOLD+    #translate_attr DIM+    #translate_attr INVIS+    #translate_attr PROTECT+    #translate_attr REVERSE+    #translate_attr STANDOUT+    #translate_attr UNDERLINE+    colorPair p++foreign import ccall unsafe bkgdset :: ChType -> IO ()++erase :: IO ()+erase = throwIfErr_ "erase" $ werase_c  stdScr+foreign import ccall unsafe "werase" werase_c :: Window -> IO CInt++wclear :: Window -> IO ()+wclear w = throwIfErr_ "wclear" $ wclear_c  w+foreign import ccall unsafe "wclear" wclear_c :: Window -> IO CInt++clrToEol :: IO ()+clrToEol = throwIfErr_ "clrtoeol" clrtoeol+foreign import ccall unsafe clrtoeol :: IO CInt++--+-- | >    move the cursor associated with the window+--   >    to line y and column x.  This routine does  not  move  the+--   >    physical  cursor  of the terminal until refresh is called.+--   >    The position specified is relative to the upper  left-hand+--   >    corner of the window, which is (0,0).+--+-- Note that 'move_c' may be a macro.+--+move :: Int -> Int -> IO ()+move y x = throwIfErr_ "move" $ move_c (fromIntegral y) (fromIntegral x)++foreign import ccall unsafe "move"+    move_c :: CInt -> CInt -> IO CInt++--+-- | >    move the cursor associated with the window+--   >    to line y and column x.  This routine does  not  move  the+--   >    physical  cursor  of the terminal until refresh is called.+--   >    The position specified is relative to the upper  left-hand+--   >    corner of the window, which is (0,0).+--+wMove :: Window -> Int -> Int -> IO ()+wMove w y x = throwIfErr_ "wmove" $ wmove w (fi y) (fi x)++foreign import ccall unsafe+    wmove :: Window -> CInt -> CInt -> IO CInt++------------------+-- Cursor routines+------------------++data CursorVisibility = CursorInvisible | CursorVisible | CursorVeryVisible++vis_c :: CursorVisibility -> CInt+vis_c vis = case vis of+    CursorInvisible   -> 0+    CursorVisible     -> 1+    CursorVeryVisible -> 2++c_vis :: CInt -> CursorVisibility+c_vis 0 = CursorInvisible+c_vis 1 = CursorVisible+c_vis 2 = CursorVeryVisible+c_vis n = error ("Illegal C value for cursor visibility: " ++ show n)++--+-- | Set the cursor state+--+-- >       The curs_set routine sets  the  cursor  state  is  set  to+-- >       invisible, normal, or very visible for visibility equal to+-- >       0, 1, or 2 respectively.  If  the  terminal  supports  the+-- >       visibility   requested,   the  previous  cursor  state  is+-- >       returned; otherwise, ERR is returned.+--+cursSet :: CursorVisibility -> IO CursorVisibility+cursSet CursorInvisible =+    do leaveOk True+       old <- curs_set 0+       return $ c_vis old+cursSet v =+    do leaveOk False+       old <- curs_set (vis_c v)+       return $ c_vis old++foreign import ccall unsafe "HSCurses.h curs_set"+    curs_set :: CInt -> IO CInt++--+-- | Get the current cursor coordinates+--+getYX :: Window -> IO (Int, Int)+getYX w =+    alloca $ \py ->                 -- allocate two ints on the stack+        alloca $ \px -> do+            nomacro_getyx w py px   -- writes current cursor coords+            y <- peek py+            x <- peek px+            return (fromIntegral y, fromIntegral x)++--+-- | Get the current cursor coords, written into the two argument ints.+--+-- >    The getyx macro places the current cursor position of the given+-- >    window in the two integer variables y and x.+--+--      void getyx(WINDOW *win, int y, int x);+--+foreign import ccall unsafe "HSCursesUtils.h hscurses_nomacro_getyx"+        nomacro_getyx :: Window -> Ptr CInt -> Ptr CInt -> IO ()++------------------------------------------------------------------------+++touchWin :: Window -> IO ()+touchWin w = throwIfErr_ "touchwin" $ touchwin w+foreign import ccall touchwin :: Window -> IO CInt++newPad :: Int -> Int -> IO Window+newPad nlines ncols = throwIfNull "newpad" $+    newpad (fromIntegral nlines) (fromIntegral ncols)++pRefresh :: Window -> Int -> Int -> Int -> Int -> Int -> Int -> IO ()+pRefresh pad pminrow pmincol sminrow smincol smaxrow smaxcol =+    throwIfErr_ "prefresh" $+        prefresh pad (fromIntegral pminrow)+                     (fromIntegral pmincol)+                     (fromIntegral sminrow)+                     (fromIntegral smincol)+                     (fromIntegral smaxrow)+                     (fromIntegral smaxcol)++delWin :: Window -> IO ()+delWin w = throwIfErr_ "delwin" $ delwin w++foreign import ccall unsafe+    prefresh :: Window -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt++foreign import ccall unsafe+    newpad :: CInt -> CInt -> IO Window++foreign import ccall unsafe+    delwin :: Window -> IO CInt++newWin :: Int -> Int -> Int -> Int -> IO Window+newWin nlines ncolumn begin_y begin_x = throwIfNull "newwin" $+    newwin (fi nlines) (fi ncolumn) (fi begin_y) (fi begin_x)++foreign import ccall unsafe+    newwin :: CInt -> CInt -> CInt -> CInt -> IO Window++wClrToEol :: Window -> IO ()+wClrToEol w = throwIfErr_ "wclrtoeol" $ wclrtoeol w++foreign import ccall unsafe wclrtoeol :: Window -> IO CInt++--+-- | >      The getch, wgetch, mvgetch and mvwgetch, routines read a+--   >      character  from the window.+--+foreign import ccall unsafe getch :: IO CInt++--foreign import ccall unsafe def_prog_mode :: IO CInt+--foreign import ccall unsafe reset_prog_mode :: IO CInt+foreign import ccall unsafe flushinp :: IO CInt++foreign import ccall unsafe "HSCurses.h noqiflush" noqiflush :: IO ()++foreign import ccall unsafe "HSCurses.h beep" c_beep :: IO CInt+foreign import ccall unsafe "HSCurses.h flash" c_flash :: IO CInt++beep :: IO ()+beep = do+    br <- c_beep+    when (br /= (#const OK)) (c_flash >> return ())++------------------------------------------------------------------------+--+-- | Map curses keys to key abstraction+--++data Key+    = KeyChar Char | KeyBreak | KeyDown | KeyUp | KeyLeft | KeyRight+    | KeyHome | KeyBackspace | KeyF Int | KeyDL | KeyIL | KeyDC+    | KeyIC | KeyEIC | KeyClear | KeyEOS | KeyEOL | KeySF | KeySR+    | KeyNPage | KeyPPage | KeySTab | KeyCTab | KeyCATab | KeyEnter+    | KeySReset | KeyReset | KeyPrint | KeyLL | KeyA1 | KeyA3+    | KeyB2 | KeyC1 | KeyC3 | KeyBTab | KeyBeg | KeyCancel | KeyClose+    | KeyCommand | KeyCopy | KeyCreate | KeyEnd | KeyExit | KeyFind+    | KeyHelp | KeyMark | KeyMessage | KeyMove | KeyNext | KeyOpen+    | KeyOptions | KeyPrevious | KeyRedo | KeyReference | KeyRefresh+    | KeyReplace | KeyRestart | KeyResume | KeySave | KeySBeg+    | KeySCancel | KeySCommand | KeySCopy | KeySCreate | KeySDC+    | KeySDL | KeySelect | KeySEnd | KeySEOL | KeySExit | KeySFind+    | KeySHelp | KeySHome | KeySIC | KeySLeft | KeySMessage | KeySMove+    | KeySNext | KeySOptions | KeySPrevious | KeySPrint | KeySRedo+    | KeySReplace | KeySRight | KeySRsume | KeySSave | KeySSuspend+    | KeySUndo | KeySuspend | KeyUndo | KeyResize | KeyMouse | KeyUnknown Int+    deriving (Eq,Show)++decodeKey :: CInt -> Key+decodeKey key = case key of+    _ | key >= 0 && key <= 255 -> KeyChar (chr (fromIntegral key))+    (#const KEY_BREAK)         -> KeyBreak+    (#const KEY_DOWN)          -> KeyDown+    (#const KEY_UP)            -> KeyUp+    (#const KEY_LEFT)          -> KeyLeft+    (#const KEY_RIGHT)         -> KeyRight+    (#const KEY_HOME)          -> KeyHome+    (#const KEY_BACKSPACE)     -> KeyBackspace+    _ | key >= (#const KEY_F0) && key <= (#const KEY_F(63))+                               -> KeyF (fromIntegral (key - #const KEY_F0))+    (#const KEY_DL)            -> KeyDL+    (#const KEY_IL)            -> KeyIL+    (#const KEY_DC)            -> KeyDC+    (#const KEY_IC)            -> KeyIC+    (#const KEY_EIC)           -> KeyEIC+    (#const KEY_CLEAR)         -> KeyClear+    (#const KEY_EOS)           -> KeyEOS+    (#const KEY_EOL)           -> KeyEOL+    (#const KEY_SF)            -> KeySF+    (#const KEY_SR)            -> KeySR+    (#const KEY_NPAGE)         -> KeyNPage+    (#const KEY_PPAGE)         -> KeyPPage+    (#const KEY_STAB)          -> KeySTab+    (#const KEY_CTAB)          -> KeyCTab+    (#const KEY_CATAB)         -> KeyCATab+    (#const KEY_ENTER)         -> KeyEnter+    (#const KEY_SRESET)        -> KeySReset+    (#const KEY_RESET)         -> KeyReset+    (#const KEY_PRINT)         -> KeyPrint+    (#const KEY_LL)            -> KeyLL+    (#const KEY_A1)            -> KeyA1+    (#const KEY_A3)            -> KeyA3+    (#const KEY_B2)            -> KeyB2+    (#const KEY_C1)            -> KeyC1+    (#const KEY_C3)            -> KeyC3+    (#const KEY_BTAB)          -> KeyBTab+    (#const KEY_BEG)           -> KeyBeg+    (#const KEY_CANCEL)        -> KeyCancel+    (#const KEY_CLOSE)         -> KeyClose+    (#const KEY_COMMAND)       -> KeyCommand+    (#const KEY_COPY)          -> KeyCopy+    (#const KEY_CREATE)        -> KeyCreate+    (#const KEY_END)           -> KeyEnd+    (#const KEY_EXIT)          -> KeyExit+    (#const KEY_FIND)          -> KeyFind+    (#const KEY_HELP)          -> KeyHelp+    (#const KEY_MARK)          -> KeyMark+    (#const KEY_MESSAGE)       -> KeyMessage+    (#const KEY_MOVE)          -> KeyMove+    (#const KEY_NEXT)          -> KeyNext+    (#const KEY_OPEN)          -> KeyOpen+    (#const KEY_OPTIONS)       -> KeyOptions+    (#const KEY_PREVIOUS)      -> KeyPrevious+    (#const KEY_REDO)          -> KeyRedo+    (#const KEY_REFERENCE)     -> KeyReference+    (#const KEY_REFRESH)       -> KeyRefresh+    (#const KEY_REPLACE)       -> KeyReplace+    (#const KEY_RESTART)       -> KeyRestart+    (#const KEY_RESUME)        -> KeyResume+    (#const KEY_SAVE)          -> KeySave+    (#const KEY_SBEG)          -> KeySBeg+    (#const KEY_SCANCEL)       -> KeySCancel+    (#const KEY_SCOMMAND)      -> KeySCommand+    (#const KEY_SCOPY)         -> KeySCopy+    (#const KEY_SCREATE)       -> KeySCreate+    (#const KEY_SDC)           -> KeySDC+    (#const KEY_SDL)           -> KeySDL+    (#const KEY_SELECT)        -> KeySelect+    (#const KEY_SEND)          -> KeySEnd+    (#const KEY_SEOL)          -> KeySEOL+    (#const KEY_SEXIT)         -> KeySExit+    (#const KEY_SFIND)         -> KeySFind+    (#const KEY_SHELP)         -> KeySHelp+    (#const KEY_SHOME)         -> KeySHome+    (#const KEY_SIC)           -> KeySIC+    (#const KEY_SLEFT)         -> KeySLeft+    (#const KEY_SMESSAGE)      -> KeySMessage+    (#const KEY_SMOVE)         -> KeySMove+    (#const KEY_SNEXT)         -> KeySNext+    (#const KEY_SOPTIONS)      -> KeySOptions+    (#const KEY_SPREVIOUS)     -> KeySPrevious+    (#const KEY_SPRINT)        -> KeySPrint+    (#const KEY_SREDO)         -> KeySRedo+    (#const KEY_SREPLACE)      -> KeySReplace+    (#const KEY_SRIGHT)        -> KeySRight+    (#const KEY_SRSUME)        -> KeySRsume+    (#const KEY_SSAVE)         -> KeySSave+    (#const KEY_SSUSPEND)      -> KeySSuspend+    (#const KEY_SUNDO)         -> KeySUndo+    (#const KEY_SUSPEND)       -> KeySuspend+    (#const KEY_UNDO)          -> KeyUndo+#ifdef KEY_RESIZE+    (#const KEY_RESIZE)        -> KeyResize+#endif+#ifdef KEY_MOUSE+    (#const KEY_MOUSE)         -> KeyMouse+#endif+    _                          -> KeyUnknown (fromIntegral key)++keyResizeCode :: Maybe CInt+#ifdef KEY_RESIZE+keyResizeCode = Just (#const KEY_RESIZE)+#else+keyResizeCode = Nothing+#endif++cERR :: CInt+cERR = #const ERR++cKEY_UP, cKEY_DOWN, cKEY_LEFT, cKEY_RIGHT :: ChType+cKEY_UP = #const KEY_UP+cKEY_DOWN = #const KEY_DOWN+cKEY_LEFT = #const KEY_LEFT+cKEY_RIGHT = #const KEY_RIGHT++-- cACS_BLOCK :: ChType+-- cACS_BLOCK = #const ACS_BLOCK++cTRUE :: NBool+cTRUE = #const TRUE+++-- ---------------------------------------------------------------------+-- get char+--++-- ncurses ungetch and Haskell's threadWaitRead do not work together well.+-- So I decided to implement my own input queue.+ungetCh :: (Integral a) => a -> IO ()+ungetCh i =+    do debug "ungetCh called"+       writeChan inputBuf (BufDirect (fi i))++data BufData = BufDirect CInt  -- data directly available+             | DataViaGetch    -- data can be obtained by calling getch++inputBuf :: Chan BufData+inputBuf = unsafePerformIO newChan+{-# NOINLINE inputBuf #-}++getchToInputBuf :: IO ()+getchToInputBuf =+    do threadWaitRead (fi (0::Int))+       {- From the (n)curses manpage:+       Programmers  concerned  about portability should be prepared for either+       of two cases: (a) signal receipt does not interrupt getch;  (b)  signal+       receipt  interrupts getch and causes it to return ERR with errno set to+       EINTR.  Under the ncurses implementation, handled signals never  inter$B!>(B+       rupt getch.+       -}+       -- we only signalize that getch can now called without getting blocked.+       -- directly calling `getch' might result in losing the character just+       -- read (race condition).+       debug "now input available on stdin"+       writeChan inputBuf DataViaGetch+--+-- | read a character from the window+--+getCh :: IO Key+getCh =+    do debug "getCh called"+       tid <- forkIO getchToInputBuf+       d <- readChan inputBuf+       killThread tid  -- we can kill the thread savely, because the thread does+                       -- not read any data via getch+       v <- case d of+              BufDirect x ->+                do debug "getCh: getting data directly from buffer"+                   return x+              DataViaGetch ->+                do debug "getCh: getting data via getch"+                   getch -- won't block!+       case v of+         (#const ERR) -> -- NO CODE IN THIS LINE+             do e <- getErrno+                if e `elem` [eAGAIN, eINTR]+                   then do debug "Curses.getCh returned eAGAIN or eINTR"+                           getCh+                   else throwErrno "HSCurses.Curses.getch"+         k -> let k' = decodeKey k+                  in do debug ("getCh: result = " ++ show k')+                        return k'+++resizeTerminal :: Int -> Int -> IO ()++#ifdef HAVE_RESIZETERM+resizeTerminal a b = throwIfErr_ "resizeterm"  $ resizeterm (fi a) (fi b)++foreign import ccall unsafe "HSCurses.h resizeterm"+    resizeterm :: CInt -> CInt -> IO CInt+#else+resizeTerminal _ _ = return ()+#endif++--+-- | The SIGWINCH signal is sent whenever the terminal size changes.+-- This signal is not available on all platforms, so it is a |Maybe| value.+--+cursesSigWinch :: Maybe Signal+#ifdef SIGWINCH+cursesSigWinch = Just (#const SIGWINCH)+#else+cursesSigWinch = Nothing+#endif++------------+-- Test case+------------++cursesTest :: IO ()+cursesTest = do+    initScr+    hc <- hasColors+    when hc startColor+    ccc <- canChangeColor+    (ys,xs) <- scrSize+    cp <- colorPairs+    cs <- colors+    endWin+    putStrLn $ "ScreenSize: " ++ show (xs,ys)+    putStrLn $ "hasColors: " ++ show hc+    putStrLn $ "canChangeColor: " ++ show ccc+    putStrLn $ "colorPairs: " ++ show cp+    putStrLn $ "colors: " ++ show cs+++++-----------------+-- Mouse Routines+-----------------++data MouseEvent = MouseEvent {+    mouseEventId :: Int,+    mouseEventX :: Int,+    mouseEventY :: Int,+    mouseEventZ :: Int,+    mouseEventButton :: [ButtonEvent]+   } deriving(Show)++data ButtonEvent = ButtonPressed Int | ButtonReleased Int | ButtonClicked Int |+    ButtonDoubleClicked Int | ButtonTripleClicked Int | ButtonShift | ButtonControl | ButtonAlt+                deriving(Eq,Show)++withMouseEventMask :: MonadIO m => [ButtonEvent] -> m a -> m a++#ifdef KEY_MOUSE++foreign import ccall unsafe "HSCurses.h mousemask"+    mousemask :: (#type mmask_t) -> Ptr (#type mmask_t) -> IO (#type mmask_t)++withMouseEventMask bes action = do+    ov <- liftIO $ alloca (\a ->  mousemask (besToMouseMask bes) a >> peek a)+    r <- action+    liftIO $ mousemask ov nullPtr+    return r++besToMouseMask :: [ButtonEvent] -> (#type mmask_t)+besToMouseMask bes = foldl' (.|.) 0 (map cb bes) where+    cb (ButtonPressed 1) = (#const BUTTON1_PRESSED)+    cb (ButtonPressed 2) = (#const BUTTON2_PRESSED)+    cb (ButtonPressed 3) = (#const BUTTON3_PRESSED)+    cb (ButtonPressed 4) = (#const BUTTON4_PRESSED)+    cb (ButtonReleased 1) = (#const BUTTON1_RELEASED)+    cb (ButtonReleased 2) = (#const BUTTON2_RELEASED)+    cb (ButtonReleased 3) = (#const BUTTON3_RELEASED)+    cb (ButtonReleased 4) = (#const BUTTON4_RELEASED)+    cb (ButtonClicked 1) = (#const BUTTON1_CLICKED)+    cb (ButtonClicked 2) = (#const BUTTON2_CLICKED)+    cb (ButtonClicked 3) = (#const BUTTON3_CLICKED)+    cb (ButtonClicked 4) = (#const BUTTON4_CLICKED)+    cb ButtonShift = (#const BUTTON_SHIFT)+    cb ButtonAlt = (#const BUTTON_ALT)+    cb ButtonControl = (#const BUTTON_CTRL)+    cb _ = 0+++#else+withMouseEventMask _ a = a++#endif+++++ulCorner, llCorner, urCorner, lrCorner, rTee, lTee, bTee, tTee, hLine,+    vLine, plus, s1, s9, diamond, ckBoard, degree, plMinus, bullet,+    lArrow, rArrow, dArrow, uArrow, board, lantern, block,+    s3, s7, lEqual, gEqual, pi, nEqual, sterling+    :: Char++ulCorner = chr 0x250C+llCorner = chr 0x2514+urCorner = chr 0x2510+lrCorner = chr 0x2518+rTee     = chr 0x2524+lTee     = chr 0x251C+bTee     = chr 0x2534+tTee     = chr 0x252C+hLine    = chr 0x2500+vLine    = chr 0x2502+plus     = chr 0x253C+s1       = chr 0x23BA -- was: 0xF800+s9       = chr 0x23BD -- was: 0xF804+diamond  = chr 0x25C6+ckBoard  = chr 0x2592+degree   = chr 0x00B0+plMinus  = chr 0x00B1+bullet   = chr 0x00B7+lArrow   = chr 0x2190+rArrow   = chr 0x2192+dArrow   = chr 0x2193+uArrow   = chr 0x2191+board    = chr 0x2591+lantern  = chr 0x256C+block    = chr 0x2588+s3       = chr 0x23BB -- was: 0xF801+s7       = chr 0x23BC -- was: 0xF803+lEqual   = chr 0x2264+gEqual   = chr 0x2265+pi       = chr 0x03C0+nEqual   = chr 0x2260+sterling = chr 0x00A3++{-+-- haddock doesn't like these commented out with --+   #if defined(__STDC_ISO_10646__)  && defined(HAVE_WADDNWSTR)+   #else+-}++recognize :: Char -> IO a -> (ChType -> IO a) -> IO a+recognize _ch noConvert _convert = noConvert -- Handle the most common case first.+++++-- ---------------------------------------------------------------------+-- code graveyard+--++{-++addStr :: String -> IO ()+addStr str =+    throwIfErr_ "addstr" $+    withCStringConv (readIORef cursesOutConv) str addstr+foreign import ccall unsafe addstr :: Ptr CChar -> IO CInt++addStrLn :: String -> IO ()+addStrLn str = addStr str >> addLn++--+-- | add a string of characters to a curses window and advance cursor+-- curs_addstr(3)+--+wAddStr :: Window -> String -> IO ()+wAddStr w str = throwIfErr_ "waddstr" $+    withCStringConv (readIORef cursesOutConv) str (waddstr w)++foreign import ccall unsafe waddstr :: Window -> Ptr CChar -> IO CInt+++addGraphStr :: String -> IO ()+addGraphStr str = do+    conv <- readIORef cursesOutConv+    let+        convStr f = case f [] of+            [] -> return ()+            s  -> throwIfErr_ "addstr" $+                withCStringConv (return conv) s addstr+        loop []        acc = convStr acc+        loop (ch:str') acc = recognize+            ch+            (loop str' (acc . (ch:)))+            (\ch' -> do+                convStr acc+                throwIfErr "addch" $ addch ch'+                loop str' id)+    loop str id++addGraphStrLn :: String -> IO ()+addGraphStrLn str = do addGraphStr str; addLn++-}++-- vim: sw=4 ts=4
+ UI/HSCurses/CursesHelper.hs view
@@ -0,0 +1,474 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS -#include HSCursesUtils.h -#include <signal.h> #-}++--+-- Copyright (C) 2005 Stefan Wehr+--+-- Derived from: yi/Curses/UI.hs+--      Copyright (C) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons+--      Released under the same license.+--+-- Derived from: riot/UI.hs+--      Copyright (c) Tuomo Valkonen 2004.+--      Released under the same license.+--+-- This program is free software; you can redistribute it and/or+-- modify it under the terms of the GNU General Public License as+-- published by the Free Software Foundation; either version 2 of+-- the License, or (at your option) any later version.+--+-- This program 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+-- General Public License for more details.+--+-- You should have received a copy of the GNU General Public License+-- along with this program; if not, write to the Free Software+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA+-- 02111-1307, USA.+--+--++module UI.HSCurses.CursesHelper (++        -- * UI initialisation+        start, end, suspend, resizeui,++        -- * Input+        getKey,++        -- * Drawing+        drawLine, drawCursor,++        -- * Navigation+        gotoTop,++        -- * Colors+        ForegroundColor(..), BackgroundColor(..),+        defaultColor, black, red, green, yellow, blue, magenta, cyan, white,++        -- * Attributes+        Attribute(..), convertAttributes,++        -- * Style+        Style(..), CursesStyle, mkCursesStyle, changeCursesStyle,+        setStyle, resetStyle, convertStyles,+        defaultStyle, defaultCursesStyle, withStyle,++        -- * Keys+        displayKey,++        -- * Helpers+        withCursor, withProgram+  )   where++import UI.HSCurses.Curses hiding ( refresh, Window )+import UI.HSCurses.Logging+import UI.HSCurses.MonadException+import qualified UI.HSCurses.Curses as Curses++import Data.Char+import Data.Maybe+import Data.List+import Control.Monad.Trans+import System.Posix.Signals++--+--++--+-- | @start@ initializes the UI and grabs the keyboard.+--+-- This function installs a handler for the SIGWINCH signal+-- which writes the KEY_RESIZE key to the input queue (if KEY_RESIZE and+-- and SIGWINCH are both available).+--+start :: IO ()+start = do+    Curses.initCurses                   -- initialise the screen+    Curses.resetParams+    Curses.keypad Curses.stdScr True    -- grab the keyboard+    case (Curses.cursesSigWinch, Curses.keyResizeCode) of+      (Just sig, Just key) ->+          do installHandler sig (Catch $ sigwinch sig key) Nothing+             return ()+      _ -> debug ("cannot install SIGWINCH handler: signal=" +++                  show Curses.cursesSigWinch ++ ", KEY_RESIZE=" +++                  show Curses.keyResizeCode)+    where sigwinch sig key =+              do debug "SIGWINCH signal received"+                 Curses.ungetCh key+                 installHandler sig (Catch $ sigwinch sig key) Nothing+                 return ()++++--+-- | Clean up and go home.+--+end :: IO ()+end = do Curses.endWin+-- Refresh is needed on linux. grr.+#if NCURSES_UPDATE_AFTER_END+         Curses.update+#endif++--+-- | Suspend the program.+--+suspend :: IO ()+suspend = raiseSignal sigTSTP++--+-- | @getKey refresh@ reads a key.+--+-- The @refresh@ function is used to redraw the screen when the terminal size+-- changes (see the documentatio of @start@ for a discussion of the problem).+--+getKey :: MonadIO m => m () -> m Key+getKey refresh = do+    k <- liftIO $ Curses.getCh+    debug ("getKey: " ++ show k)+    case k of+      KeyResize ->+          do refresh+             getKey refresh+      _ -> return k+++--+-- | @drawLine n s@ draws @n@ characters of string @s@.+--+drawLine :: Int -> String -> IO ()+-- lazy version is faster than calculating length of s+drawLine w s = Curses.wAddStr Curses.stdScr $! take w (s ++ repeat ' ')++--+-- | Draw the cursor at the given position.+--+drawCursor :: (Int,Int) -> (Int, Int) -> IO ()+drawCursor (o_y,o_x) (y,x) = withCursor Curses.CursorVisible $ do+    gotoTop+    (h,w) <- scrSize+    Curses.wMove Curses.stdScr (min (h-1) (o_y + y)) (min (w-1) (o_x + x))++--+-- | Move cursor to origin of stdScr.+--+gotoTop :: IO ()+gotoTop = Curses.wMove Curses.stdScr 0 0+++--+-- | Resize the window+-- From "Writing Programs with NCURSES", by Eric S. Raymond and+-- Zeyd M. Ben-Halim+--+--+resizeui :: IO (Int,Int)+resizeui = do+    Curses.endWin+    Curses.refresh+    Curses.scrSize++++------------------------------------------------------------------------+--+-- | Basic colors.+--+defaultColor :: Curses.Color+defaultColor = fromJust $ Curses.color "default"++black, red, green, yellow, blue, magenta, cyan, white :: Curses.Color+black     = fromJust $ Curses.color "black"+red       = fromJust $ Curses.color "red"+green     = fromJust $ Curses.color "green"+yellow    = fromJust $ Curses.color "yellow"+blue      = fromJust $ Curses.color "blue"+magenta   = fromJust $ Curses.color "magenta"+cyan      = fromJust $ Curses.color "cyan"+white     = fromJust $ Curses.color "white"++--+-- | Converts a list of 'Curses.Color' pairs (foreground color and+--   background color) into the curses representation 'Curses.Pair'.+--+--   You should call this function exactly once, at application startup.+--+-- (not visible outside this module)+colorsToPairs :: [(Curses.Color, Curses.Color)] -> IO [Curses.Pair]+colorsToPairs cs =+    do p <- Curses.colorPairs+       let nColors = length cs+           blackWhite = p < nColors+       if blackWhite+          then trace ("Terminal does not support enough colors. Number of " +++                      " colors requested: " ++ show nColors +++                      ". Number of colors supported: " ++ show p)+                 return $ take nColors (repeat (Curses.Pair 0))+          else mapM toPairs (zip [1..] cs)+     where toPairs (n, (fg, bg)) =+               let p = Curses.Pair n+               in do Curses.initPair p fg bg+                     return p++------------------------------------------------------------------------+-- Nicer, user-visible color defs.+--+-- We separate colors into dark and bright colors, to prevent users+-- from erroneously constructing bright colors for dark backgrounds,+-- which doesn't work.++--+-- | Foreground colors.+--+data ForegroundColor+    = BlackF+    | GreyF+    | DarkRedF+    | RedF+    | DarkGreenF+    | GreenF+    | BrownF+    | YellowF+    | DarkBlueF+    | BlueF+    | PurpleF+    | MagentaF+    | DarkCyanF+    | CyanF+    | WhiteF+    | BrightWhiteF+    | DefaultF+    deriving (Eq, Show)++--+-- | Background colors.+--+data BackgroundColor+    = BlackB+    | DarkRedB+    | DarkGreenB+    | BrownB+    | DarkBlueB+    | PurpleB+    | DarkCyanB+    | WhiteB+    | DefaultB+    deriving (Eq, Show)++--+-- | Mapping abstract colours to ncurses attributes and colours+--+-- (not visible outside this module)++convertBg :: BackgroundColor -> ([Attribute], Curses.Color)+convertBg c = case c of+    BlackB      -> ([], black)+    DarkRedB    -> ([], red)+    DarkGreenB  -> ([], green)+    BrownB      -> ([], yellow)+    DarkBlueB   -> ([], blue)+    PurpleB     -> ([], magenta)+    DarkCyanB   -> ([], cyan)+    WhiteB      -> ([], white)+    DefaultB    -> ([], defaultColor)++convertFg :: ForegroundColor -> ([Attribute], Curses.Color)+convertFg c = case c of+    BlackF       -> ([], black)+    GreyF        -> ([Bold], black)+    DarkRedF     -> ([], red)+    RedF         -> ([Bold], red)+    DarkGreenF   -> ([], green)+    GreenF       -> ([Bold], green)+    BrownF       -> ([], yellow)+    YellowF      -> ([Bold], yellow)+    DarkBlueF    -> ([], blue)+    BlueF        -> ([Bold], blue)+    PurpleF      -> ([], magenta)+    MagentaF     -> ([Bold], magenta)+    DarkCyanF    -> ([], cyan)+    CyanF        -> ([Bold], cyan)+    WhiteF       -> ([], white)+    BrightWhiteF -> ([Bold], white)+    DefaultF     -> ([], defaultColor)+++------------------------------------------------------------------------+--+-- | Abstractions for some commonly used attributes.+--+data Attribute = Bold+               | Underline+               | Dim+               | Reverse+               | Blink+               deriving (Eq, Show)++--+-- | Converts an abstract attribute list into its curses representation.+--+convertAttributes :: [Attribute] -> Curses.Attr+convertAttributes =+    foldr setAttrs Curses.attr0+    where setAttrs Bold = setBoldA+          setAttrs Underline = setUnderlineA+          setAttrs Dim = setDimA+          setAttrs Reverse = setReverseA+          setAttrs Blink = setBlinkA++setBoldA, setUnderlineA, setDimA,+  setReverseA, setBlinkA :: Curses.Attr -> Curses.Attr+setBoldA = flip Curses.setBold True+setUnderlineA = flip Curses.setUnderline True+setDimA = flip Curses.setDim True+setReverseA = flip Curses.setReverse   True+setBlinkA = flip Curses.setBlink True++------------------------------------------------------------------------+--+-- | A humand-readable style.+--+data Style = Style ForegroundColor BackgroundColor+           | AttributeStyle [Attribute] ForegroundColor BackgroundColor+           | ColorlessStyle [Attribute]+           deriving (Eq, Show)++defaultStyle :: Style+defaultStyle = Style DefaultF DefaultB++--+-- | A style which uses the internal curses representations for+--   attributes and colors.+--+data CursesStyle = CursesStyle Curses.Attr Curses.Pair+                 | ColorlessCursesStyle Curses.Attr+                 deriving (Eq, Show)++{-+instance Show CursesStyle where+    show (CursesStyle _ _) = "CursesStyle"+    show (ColorlessCursesStyle _) = "ColorlessCursesStyle"+-}++mkCursesStyle :: [Attribute] -> CursesStyle+mkCursesStyle attrs = ColorlessCursesStyle (convertAttributes attrs)++--+-- | Changes the attributes of the given CursesStyle.+--+changeCursesStyle :: CursesStyle -> [Attribute] -> CursesStyle+changeCursesStyle (CursesStyle _ p) attrs =+    CursesStyle (convertAttributes attrs) p+changeCursesStyle _ attrs = ColorlessCursesStyle (convertAttributes attrs)++defaultCursesStyle :: CursesStyle+defaultCursesStyle = CursesStyle Curses.attr0 (Curses.Pair 0)++--+-- | Reset the screen to normal values+--+resetStyle :: IO ()+resetStyle = setStyle defaultCursesStyle++--+-- | Manipulate the current style of the standard screen+--+setStyle :: CursesStyle -> IO ()+setStyle (CursesStyle a p) = Curses.wAttrSet Curses.stdScr (a, p)+setStyle (ColorlessCursesStyle a) =+    do (_, p) <- Curses.wAttrGet Curses.stdScr+       Curses.wAttrSet Curses.stdScr (a, p)++withStyle :: MonadExcIO m => CursesStyle -> m a -> m a+withStyle style action =+    bracketM+        (liftIO $ do old <- Curses.wAttrGet Curses.stdScr    -- before+                     setStyle style+                     return old)+        (\old -> liftIO $ Curses.wAttrSet Curses.stdScr old) -- after+        (\_ -> action)                                       -- do this++--+-- | Converts a list of human-readable styles into the corresponding+--   curses representation.+--+--   This function should be called exactly once at application startup+--   for all styles of the application.+convertStyles :: [Style] -> IO [CursesStyle]+convertStyles styleList =+    do let (attrs, cs) = unzip $ map convertStyle styleList+           cursesAttrs = map convertAttributes attrs+       cursesPairs <- colorsToPairs' cs+       let res = zipWith toCursesStyle cursesAttrs cursesPairs+       trace ("convertStyles: " ++ show (zip styleList res)) (return res)+    where convertStyle (Style fg bg) = convertStyle (AttributeStyle [] fg bg)+          convertStyle (AttributeStyle attrs fg bg) =+              let (afg, cfg) = convertFg fg+                  (abg, cbg) = convertBg bg+              in (afg ++ abg ++ attrs, Just (cfg, cbg))+          convertStyle (ColorlessStyle attrs) = (attrs, Nothing)+          colorsToPairs' cs =+              do pairs <- colorsToPairs (catMaybes cs)+                 return $ mergeNothing cs pairs+          mergeNothing (Just _:crest) (p:prest) = Just p+                                                  : mergeNothing crest prest+          mergeNothing (Nothing:crest) ps = Nothing : mergeNothing crest ps+          mergeNothing [] [] = []+          toCursesStyle cursesAttrs Nothing =+              ColorlessCursesStyle cursesAttrs+          toCursesStyle cursesAttrs (Just cursesPair) =+              CursesStyle cursesAttrs cursesPair++------------------------------------------------------------------------+--+-- | Converting keys to humand-readable strings+--++displayKey :: Key -> String+displayKey (KeyChar ' ') = "<Space>"+displayKey (KeyChar '\t') = "<Tab>"+displayKey (KeyChar '\r') = "<Enter>"+displayKey (KeyChar c)+    | isPrint c = [c]+displayKey (KeyChar c)  -- Control+    | ord '\^A' <= ord c && ord c <= ord '\^Z'+        = let c' = chr $ ord c - ord '\^A' + ord 'a'+              in '^':[toUpper c']+displayKey (KeyChar c) = show c+displayKey KeyDown = "<Down>"+displayKey KeyUp = "<Up>"+displayKey KeyLeft = "<Left>"+displayKey KeyRight = "<Right>"+displayKey KeyHome = "<Home>"+displayKey KeyBackspace = "<BS>"+displayKey (KeyF i) = 'F' : show i+displayKey KeyNPage = "<NPage>"+displayKey KeyPPage = "<PPage>"+displayKey KeyEnter = "<Return>"+displayKey KeyEnd = "<End>"+displayKey KeyIC = "<Insert>"+displayKey KeyDC = "<Delete>"+displayKey k = show k+++------------------------------------------------------------------------+--+-- | Other helpers+--++--+-- | set the cursor, and do action+--+withCursor :: MonadExcIO m => CursorVisibility -> m a -> m a+withCursor nv action =+    bracketM+        (liftIO $ Curses.cursSet nv)             -- before+        (\vis -> liftIO $ Curses.cursSet vis)    -- after+        (\_ -> action)                           -- do this++withProgram :: MonadExcIO m => m a -> m a+withProgram action = withCursor CursorVisible $+    bracketM_ (liftIO endWin) (liftIO flushinp) action
+ UI/HSCurses/IConv.hsc view
@@ -0,0 +1,205 @@+{-# LANGUAGE ForeignFunctionInterface #-}++--+-- Copyright (c) 2004 Tuomo Valkonen <tuomov at iki dot fi>+-- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons+-- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de+--+-- This library 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 2.1 of the License, or (at your option) any later version.+--+-- This library 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 this library; if not, write to the Free Software+-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA+++-- | Iconv binding++#if HAVE_ICONV_H+# include <iconv.h>+#endif++module UI.HSCurses.IConv {-(+    IConv,+    iconv,+    iconv_,+    with_iconv,+    to_unicode,+    from_unicode,+    to_unicode_,+    from_unicode_+  )-} where++import UI.HSCurses.CWString          ( peekUTF8StringLen, withUTF8StringLen )++import Foreign+import Foreign.C+import Foreign.C.String+import Control.Exception    ( Exception, try, bracket )++type IConv = Ptr () --(#type iconv_t)++err_ptr :: Ptr b -> Bool+err_ptr p = p == (plusPtr nullPtr (-1))++throw_if_not_2_big :: String -> IO CSize -> IO CSize+throw_if_not_2_big s r_ = do+    r <- r_+    if r == fromIntegral (-1 :: Int) then do+        errno <- getErrno+        if errno /= e2BIG then+	    throwErrno s+	  else+	    return r+      else+        return r++iconv_open :: String -> String -> IO IConv+iconv_open to from =+    withCString to $+        \cto -> withCString from $+            \cfrom -> do+	        throwErrnoIf err_ptr "iconv_open"+		    $ c_iconv_open cto cfrom+++iconv_close :: IConv -> IO ()+iconv_close ic =+    throwErrnoIfMinus1_ "iconv_close" $ c_iconv_close ic++outbuf_size :: Int+outbuf_size = 1024++do_iconv :: ((Ptr a, Int) -> IO String) -> IConv -> (Ptr b, Int) -> IO String+do_iconv get_string_fn ic (inbuf, inbuf_bytes) =+    alloca $ \inbuf_ptr ->+        alloca $ \inbytesleft_ptr ->+            alloca $ \outbuf_ptr ->+                alloca $ \outbytesleft_ptr ->+                    allocaBytes outbuf_size $ \outbuf -> do+      poke (inbytesleft_ptr :: Ptr CSize) (fromIntegral inbuf_bytes)+      poke inbuf_ptr inbuf+      let loop acc = do+          poke (outbytesleft_ptr :: Ptr CSize) (fromIntegral outbuf_size)+          poke outbuf_ptr outbuf+          ret <- throw_if_not_2_big "c_iconv" $+              c_iconv ic inbuf_ptr inbytesleft_ptr+                         outbuf_ptr outbytesleft_ptr+          left <- peek outbytesleft_ptr+          res <- get_string_fn (castPtr outbuf, outbuf_size - fromIntegral left)+          if ret == fromIntegral (-1 :: Int) then+              loop (acc++res)+            else+              return (acc++res)+      loop []+++with_iconv :: String -> String -> (IConv -> IO a) -> IO a+with_iconv to from fn =+    bracket (iconv_open to from) iconv_close fn++iconv_ :: String -> IConv -> IO String+iconv_ str ic =+    withCStringLen str $ do_iconv peekCStringLen ic++-- between 8-bit encodings only+iconv :: String -> String -> String -> Either Exception String+iconv to from str =+    unsafePerformIO $ try $ with_iconv to from (iconv_ str)+++#ifdef HAVE_WCHAR_H+{-+type CUni = (#type wchar_t)+cuni_size = (#size wchar_t)+unicode_charset = "WCHAR_T"++chartocuni :: Char -> CUni+chartocuni = fromIntegral . ord++cunitochar :: CUni -> Char+cunitochar = chr . fromIntegral+-}++cuni_charset :: [Char]+cuni_charset = "WCHAR_T"++peek_cuni :: (Ptr (#type wchar_t), Int) -> IO String+peek_cuni (buf, bytes) = do+    let (chars, rembytes) = bytes `divMod` (#size wchar_t)+    if rembytes /= 0 then+        error "Conversion result contains remainder bytes."+      else+        peekCWStringLen (buf, chars)+        --liftM (map cunitochar) $ peekArray chars buf++with_cuni :: String -> ((Ptr (#type wchar_t), Int) -> IO String) -> IO String+with_cuni str f =+    withCWStringLen str $ \(s, l) -> f (s, l*(#size wchar_t))+    --withArray (map chartocuni str) $ \s -> f (s, l*cuni_size)++#else+-- no CF_WCHAR_SUPPORT++-- Due to endianness problems, it is easiest to do this through UTF-8++cuni_charset :: [Char]+cuni_charset = "UTF-8"++peek_cuni :: CStringLen -> IO String+peek_cuni = peekUTF8StringLen++with_cuni :: [Char] -> (CStringLen -> IO a) -> IO a+with_cuni = withUTF8StringLen++#endif++to_unicode_ :: String -> String -> IO String+to_unicode_ from str =+     with_iconv cuni_charset from $+      \ic -> withCStringLen str $ do_iconv peek_cuni ic++to_unicode :: String -> String -> Either Exception String+to_unicode from str =+    unsafePerformIO $ try $ to_unicode_ from str++from_unicode_ :: String -> String -> IO String+from_unicode_ to str =+     with_iconv to cuni_charset $+      \ic -> with_cuni str $ do_iconv peekCStringLen ic++from_unicode :: String -> String -> Either Exception String+from_unicode from str =+    unsafePerformIO $ try $ from_unicode_ from str+++#ifndef ICONV_LIB_PREFIX++foreign import ccall unsafe "iconv.h iconv_open" c_iconv_open+    :: CString -> CString -> IO IConv++foreign import ccall unsafe "iconv.h iconv_close" c_iconv_close+    :: IConv -> IO CInt++foreign import ccall unsafe "iconv.h iconv" c_iconv+    :: IConv -> Ptr a -> Ptr CSize -> Ptr b -> Ptr CSize -> IO CSize++#else++foreign import ccall unsafe "iconv.h libiconv_open" c_iconv_open+    :: CString -> CString -> IO IConv++foreign import ccall unsafe "iconv.h libiconv_close" c_iconv_close+    :: IConv -> IO CInt++foreign import ccall unsafe "iconv.h libiconv" c_iconv+    :: IConv -> Ptr a -> Ptr CSize -> Ptr b -> Ptr CSize -> IO CSize++#endif
+ UI/HSCurses/Logging.hs view
@@ -0,0 +1,75 @@+{-# LANGUAGE CPP #-}++-- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de+--+-- This library 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 2.1 of the License, or (at your option) any later version.+--+-- This library 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 this library; if not, write to the Free Software+-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA++module UI.HSCurses.Logging (trace,debug) where++import Control.Monad.Trans++#ifdef __DEBUG__++import Data.IORef+import System.IO+import System.IO.Unsafe (unsafePerformIO)+import System.Locale+import System.Time++#endif+++trace :: String -> a -> a+debug :: MonadIO m => String -> m ()++#ifdef __DEBUG__++logFile :: Handle+logFile = unsafePerformIO $ do h <- openFile ".hscurses.log" AppendMode+                               debug_ h "logging initialized"+                               return h+{-# NOINLINE logFile #-}++formatTime :: IO String+formatTime =+    do let fmt = "%Y-%m-%d %H:%M:%S"+       clockT <- getClockTime+       calTime <- toCalendarTime clockT+       let maxSdecLen = 5+           sdec' = show $ ctPicosec calTime+           sdec = if length sdec' > maxSdecLen+                     then take maxSdecLen sdec'+                     else sdec'+       return (formatCalendarTime defaultTimeLocale fmt calTime+               ++ ":" ++ sdec)++trace s x =+    unsafePerformIO $ do debug s+                         return x++debug s = liftIO $ debug_ logFile s++debug_ f s =+    do ts <- formatTime+       hPutStrLn f ("[" ++ ts ++ "] " ++ s)+       hFlush f++#else++trace _ x = x++debug _ = return ()++#endif
+ UI/HSCurses/MonadException.hs view
@@ -0,0 +1,145 @@+-- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de+--+-- This library 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 2.1 of the License, or (at your option) any later version.+--+-- This library 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 this library; if not, write to the Free Software+-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA++module UI.HSCurses.MonadException where++import Prelude hiding (catch)+import Control.Exception+import Control.Monad.State+import Data.Dynamic++class Monad m => MonadExc m where+    catchM      :: m a -> (Exception -> m a) -> m a+    blockM      :: m a -> m a+    unblockM    :: m a -> m a+++class (MonadIO m, MonadExc m) => MonadExcIO m++--+-- Operations implemented in term of catchM, blockM and unblockM+-- (taken from Control.Exception).+--++catchJustM :: MonadExc m =>+       (Exception -> Maybe b) -- ^ Predicate to select exceptions+    -> m a                    -- ^ Computation to run+    -> (b -> m a)             -- ^ Handler+    -> m a+catchJustM p a handler = catchM a handler'+  where handler' e = case p e of+            Nothing -> throw e+            Just b  -> handler b++handleM :: MonadExc m => (Exception -> m a) -> m a -> m a+handleM = flip catchM++handleJustM :: MonadExc m =>+              (Exception -> Maybe b) -> (b -> m a) -> m a -> m a+handleJustM p = flip (catchJustM p)++tryM :: MonadExc m => m a -> m (Either Exception a)+tryM a = catchM (a >>= \ v -> return (Right v)) (\e -> return (Left e))++tryJustM :: MonadExc m => (Exception -> Maybe b) -> m a -> m (Either b a)+tryJustM p a = do+  r <- tryM a+  case r of+    Right v -> return (Right v)+    Left  e -> case p e of+            Nothing -> throw e+            Just b  -> return (Left b)++catchDynM :: (MonadExc m, Typeable exc) =>+             m a -> (exc -> m a) -> m a+catchDynM m k = catchM m handl+  where handl ex = case ex of+               (DynException dyn) ->+                case fromDynamic dyn of+                    Just exception  -> k exception+                    Nothing -> throw ex+               _ -> throw ex++bracketM :: MonadExc m =>+       m a         -- ^ computation to run first (\"acquire resource\")+    -> (a -> m b)  -- ^ computation to run last (\"release resource\")+    -> (a -> m c)  -- ^ computation to run in-between+    -> m c         -- returns the value from the in-between computation+bracketM before after thing =+  blockM (do+    a <- before+    r <- catchM+       (unblockM (thing a))+       (\e -> do { after a; throw e })+    after a+    return r+  )++bracketM_ :: MonadExc m => m a -> m b -> m c -> m c+bracketM_ before after thing = bracketM before (const after) (const thing)++finally :: IO a -- ^ computation to run first+    -> IO b     -- ^ computation to run afterward (even if an exception+                --   was raised)+    -> IO a     -- returns the value from the first computation+a `finally` sequel =+  blockM (do+    r <- catchM+         (unblockM a)+         (\e -> do { sequel; throw e })+    sequel+    return r+  )+++--+-- Instance declarations+--++instance MonadExc IO where+    catchM       = catch+    blockM       = block+    unblockM     = unblock++instance MonadExcIO IO++instance MonadExc m => MonadExc (StateT s m) where+    catchM   = catchState+    blockM   = blockState+    unblockM = unblockState++instance (MonadExc m, MonadIO m) => MonadExcIO (StateT s m)++modifyState :: MonadExc m => (s -> m (a, s)) -> StateT s m a+modifyState f =+    do oldState <- get+       (x, newState) <- lift $ f oldState+       put newState+       return x++catchState :: (MonadExc m) => StateT s m a -> (Exception -> StateT s m a)+           -> StateT s m a+catchState run handler =+    modifyState (\oldState -> runStateT run oldState `catchM`+                              (\e -> runStateT (handler e) oldState))++blockState, unblockState :: (MonadExc m) => StateT s m a -> StateT s m a+blockState run =+    modifyState (\oldState -> blockM (runStateT run oldState))++unblockState run =+    modifyState (\oldState -> unblockM (runStateT run oldState))+
+ UI/HSCurses/Widgets.hs view
@@ -0,0 +1,951 @@+{-# LANGUAGE ScopedTypeVariables, ExistentialQuantification #-}+-- glasgow-exts needed for existentials and multi-parameter type classes.++-- Copyright (c) 2005 Stefan Wehr - http://www.stefanwehr.de+--+-- This library 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 2.1 of the License, or (at your option) any later version.+--+-- This library 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 this library; if not, write to the Free Software+-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA++module UI.HSCurses.Widgets where++import Control.Exception (assert)+import Control.Monad.Trans+import Data.Char+import Data.List+import Data.Maybe++import UI.HSCurses.Logging+import UI.HSCurses.MonadException+import qualified UI.HSCurses.Curses as Curses+import qualified UI.HSCurses.CursesHelper as CursesH++type Pos = (Int, Int)+type Offset = (Int, Int)++type Size = (Int, -- height+             Int  -- width+            )++getHeight :: Size -> Int+getHeight = fst++getWidth :: Size -> Int+getWidth = snd++getYOffset :: Offset -> Int+getYOffset = fst++getXOffset :: Offset -> Int+getXOffset = snd++getYPos :: Pos -> Int+getYPos = fst++getXPos :: Pos -> Int+getXPos = snd++data Direction = DirLeft | DirRight | DirUp | DirDown+               deriving (Eq, Show, Ord)++data HAlignment = AlignLeft | AlignCenter | AlignRight+               deriving (Eq, Show)++data Cont a = Cont a | Done a++class Widget a where+    draw      :: Pos -> Size -> DrawingHint -> a -> IO ()+    minSize   :: a -> Size++class Widget a => ActiveWidget a where+    activate  :: MonadExcIO m => m () -> Pos -> Size -> a -> m (a, String)++type KeyHandler a = Pos -> Size -> a -> IO (Cont a)++mkKeyHandler :: (Pos -> Size -> a -> a)+                -> KeyHandler a+mkKeyHandler f pos sz w = return (Cont (f pos sz w))++--+-- Drawing+--++data DrawingHint = DHNormal+                 | DHFocus+                 | DHActive+                   deriving (Eq, Show, Ord)++data DrawingStyle = DStyle+    { dstyle_normal      :: CursesH.CursesStyle+    , dstyle_focus       :: CursesH.CursesStyle+    , dstyle_active      :: CursesH.CursesStyle+    } deriving (Eq, Show)+++mkDrawingStyle :: CursesH.CursesStyle -> DrawingStyle+mkDrawingStyle defStyle =+    let revStyle = CursesH.changeCursesStyle defStyle [CursesH.Reverse]+        in DStyle { dstyle_normal = defStyle+                  , dstyle_focus = revStyle+                  , dstyle_active = revStyle+                  }++defaultDrawingStyle :: DrawingStyle+defaultDrawingStyle = mkDrawingStyle CursesH.defaultCursesStyle+_draw :: DrawingHint -> DrawingStyle -> IO a -> IO a+_draw DHActive sty io = CursesH.withStyle (dstyle_active sty) io+_draw DHNormal sty io = CursesH.withStyle (dstyle_normal sty) io+_draw DHFocus sty io = CursesH.withStyle (dstyle_focus sty) io++--+-- Helper functions for scrolling+--++scrollFactor :: Double+scrollFactor = 0.8++scrollBy :: Int -> Int+scrollBy displayLen =+    let amount = floor ((fromInteger . toInteger) displayLen * scrollFactor)+    in max (displayLen - 1) (min 1 amount)++-- returns the new offset for scrolling in forward direction+-- dataLen: total number of data items+-- offset: the index of the first data item shown on the current page+-- displayLen: the number of data items that is shown in one page+scrollForward :: Int -> Int -> Int -> Int+scrollForward dataLen offset displayLen =+    if offset + displayLen >= dataLen+       then offset+       else min (offset + scrollBy displayLen) (dataLen - displayLen)++-- returns the new offset for scrolling in backward direction.+-- parameters as for scrollForward+scrollBackward :: t -> Int -> Int -> Int+scrollBackward _ offset displayLen =+    if offset == 0+       then offset+       else max (offset - scrollBy displayLen) 0+++--+-- EmptyWidget+--++data EmptyWidget = EmptyWidget Size++instance Widget EmptyWidget where+    draw _ _ _ _ = return ()+    minSize (EmptyWidget sz) = sz+++--+-- An opaque widget+--++data OpaqueWidget = OpaqueWidget Size++instance Widget OpaqueWidget where+    draw (y,x) (h,w) _ _ =+        let draw' n =+                do Curses.wMove Curses.stdScr (y+n) x+                   CursesH.drawLine w ""+        in do mapM draw' (take h [0..])+              Curses.refresh+    minSize (OpaqueWidget sz) = sz++--+-- Widget for text input+--++data EditWidget = EditWidget+    { ew_content       :: String,+      ew_xoffset       :: Int, -- content!!xoffset is the 1st char shown+      ew_xcursor       :: Int, -- cursor position+      ew_history       :: [String],+      ew_historyIndex  :: Int,+      ew_historySavedContent :: Maybe String,+      ew_options       :: EditWidgetOptions+    }++ew_contentPos :: EditWidget -> Int+ew_contentPos ew = ew_xcursor ew + ew_xoffset ew++instance Widget EditWidget where+    draw = drawEditWidget+    minSize ew = (1, ewopt_minWidth $ ew_options ew)++instance ActiveWidget EditWidget where+    activate = activateEditWidget++data EditWidgetOptions = EWOptions+    { ewopt_keyHandlers    :: [(Curses.Key, KeyHandler EditWidget)],+      ewopt_minWidth       :: Int,+      ewopt_style          :: DrawingStyle+    }++defaultEWOptions :: EditWidgetOptions+defaultEWOptions = EWOptions+                   { ewopt_keyHandlers = editWidgetKeyHandlers,+                     ewopt_minWidth = 8,+                     ewopt_style = defaultDrawingStyle+                   }++newEditWidget :: EditWidgetOptions -> String -> EditWidget+newEditWidget opts =+    editWidgetSetContent+      (EditWidget+       { ew_content = "",+         ew_xoffset = 0,+         ew_xcursor = 0,+         ew_history = [],+         ew_historyIndex = -1,+         ew_historySavedContent = Nothing,+         ew_options = opts+       })++++editWidgetGoLeft :: Pos+                                                -> Size+                                                -> EditWidget+                                                -> IO (Cont EditWidget)+editWidgetGoLeft = mkKeyHandler editWidgetGoLeft'+editWidgetGoRight :: Pos+                                                 -> Size+                                                 -> EditWidget+                                                 -> IO (Cont EditWidget)+editWidgetGoRight = mkKeyHandler editWidgetGoRight'+editWidgetDeleteLeft :: Pos+                                                    -> Size+                                                    -> EditWidget+                                                    -> IO (Cont EditWidget)+editWidgetDeleteLeft = mkKeyHandler editWidgetDeleteLeft'+editWidgetDeleteUnderCursor :: Pos+                                                           -> Size+                                                           -> EditWidget+                                                           -> IO (Cont EditWidget)+editWidgetDeleteUnderCursor = mkKeyHandler editWidgetDeleteUnderCursor'+editWidgetDeleteToEnd :: Pos+                                                     -> Size+                                                     -> EditWidget+                                                     -> IO (Cont EditWidget)+editWidgetDeleteToEnd = mkKeyHandler editWidgetDeleteToEnd'+editWidgetGoHome :: Pos+                                                -> Size+                                                -> EditWidget+                                                -> IO (Cont EditWidget)+editWidgetGoHome = mkKeyHandler editWidgetGoHome'+editWidgetGoEnd :: Pos+                                               -> Size+                                               -> EditWidget+                                               -> IO (Cont EditWidget)+editWidgetGoEnd = mkKeyHandler editWidgetGoEnd'+editWidgetHistoryUp :: Pos+                                                   -> Size+                                                   -> EditWidget+                                                   -> IO (Cont EditWidget)+editWidgetHistoryUp = mkKeyHandler editWidgetHistoryUp'+editWidgetHistoryDown :: Pos+                                                     -> Size+                                                     -> EditWidget+                                                     -> IO (Cont EditWidget)+editWidgetHistoryDown = mkKeyHandler editWidgetHistoryDown'++editWidgetKeyHandlers :: [(Curses.Key,+                                                       Pos+                                                       -> Size+                                                       -> EditWidget+                                                       -> IO (Cont EditWidget))]+editWidgetKeyHandlers =+    [(Curses.KeyLeft, editWidgetGoLeft),+     (Curses.KeyRight, editWidgetGoRight),+     (Curses.KeyBackspace, editWidgetDeleteLeft),+     (Curses.KeyChar '\^D', editWidgetDeleteUnderCursor),+     (Curses.KeyDC, editWidgetDeleteUnderCursor),+     (Curses.KeyChar '\^K', editWidgetDeleteToEnd),+     (Curses.KeyHome, editWidgetGoHome),+     (Curses.KeyChar '\^A', editWidgetGoHome),+     (Curses.KeyEnd, editWidgetGoEnd),+     (Curses.KeyChar '\^E', editWidgetGoEnd),+     (Curses.KeyChar '\r', editWidgetFinish),+     (Curses.KeyChar '\t', editWidgetFinish),+     (Curses.KeyUp, editWidgetHistoryUp),+     (Curses.KeyDown, editWidgetHistoryDown)+    ]++editWidgetGetContent :: EditWidget -> String+editWidgetGetContent ew = ew_content ew+editWidgetSetContent :: EditWidget+                                                    -> String+                                                    -> EditWidget+editWidgetSetContent ew s =+    addToHistory (ew { ew_content = s, ew_xoffset = 0, ew_xcursor = 0 }) s++editWidgetGetOptions :: EditWidget+                                                    -> EditWidgetOptions+editWidgetGetOptions ew = ew_options ew+editWidgetSetOptions :: EditWidget+                                                    -> EditWidgetOptions+                                                    -> EditWidget+editWidgetSetOptions ew opts = ew { ew_options = opts }++drawEditWidget :: Pos -> Size -> DrawingHint -> EditWidget -> IO ()+drawEditWidget (y, x) (_, width) hint ew =+    _draw hint (ewopt_style . ew_options $ ew) $+    do Curses.wMove Curses.stdScr y x+       CursesH.drawLine width (drop (ew_xoffset ew) $ ew_content ew)+       Curses.refresh++activateEditWidget :: MonadExcIO m => m () -> Pos -> Size+                   -> EditWidget -> m (EditWidget, String)+activateEditWidget refresh pos@(y, x) sz@(_, width) ew =+    CursesH.withCursor Curses.CursorVisible $ processKey ew+    where+    processKey ex =+        do liftIO $ drawLocal ex+           k <- CursesH.getKey refresh+           case lookup k (ewopt_keyHandlers $ ew_options ex) of+             Nothing ->+                 case k of+                   Curses.KeyChar c | isAscii c && isPrint c+                       -> processKey $ insertChar ex c+                   _   -> processKey ex+             Just f  ->+                 do x' <- liftIO $ f pos sz ex+                    case x' of+                      Cont ex' -> processKey ex'+                      Done ex' -> do liftIO $ drawEditWidget pos sz DHActive ex'+                                     return (ex', editWidgetGetContent ex')+    insertChar ew' c =+        let pos' = ew_contentPos ew'+            oldContent = ew_content ew'+            newContent = take pos' oldContent ++ (c : drop pos' oldContent)+            in editWidgetGoRight' pos' sz (ew' { ew_content = newContent })+    drawLocal ew' = _draw DHActive  (ewopt_style . ew_options $ ew') $+        do Curses.wMove Curses.stdScr y x+           CursesH.drawLine width (drop (ew_xoffset ew') $ ew_content ew')+           Curses.wMove Curses.stdScr y (x + ew_xcursor ew')+           Curses.refresh++editWidgetGoLeft' :: t -> t1 -> EditWidget -> EditWidget+editWidgetGoLeft' _ _ ew =+    let newXcursor = max (ew_xcursor ew - 1) 0+        newXoffset = if ew_xcursor ew == 0+                        then max (ew_xoffset ew - 1) 0+                        else ew_xoffset ew+        in ew { ew_xoffset = newXoffset,+                ew_xcursor = newXcursor }++editWidgetGoRight' :: t -> (t1, Int) -> EditWidget -> EditWidget+editWidgetGoRight' _ (_, width) ew =+    let len = length (ew_content ew)+        lastChar = len - ew_xoffset ew - 1+        newXcursor = minimum [ew_xcursor ew + 1, lastChar + 1, width - 1]+        newXoffset = if ew_xcursor ew == width - 1+                        then min (ew_xoffset ew + 1) (len - width + 1)+                        else ew_xoffset ew+        in ew { ew_xoffset = newXoffset,+                ew_xcursor = newXcursor }++editWidgetDeleteLeft' :: Pos -> Size -> EditWidget -> EditWidget+editWidgetDeleteLeft' pos sz ew =+    let cpos = ew_contentPos ew - 1+        oldContent = ew_content ew+        newContent = take cpos oldContent ++ drop (cpos+1) oldContent+        ew' = editWidgetGoLeft' pos sz (ew { ew_content = newContent })+        in if ew_xcursor ew == 0 && ew_xoffset ew /= 0+              then editWidgetGoRight' pos sz (editWidgetGoLeft' pos sz ew')+              else ew'++editWidgetDeleteUnderCursor' :: t -> t1 -> EditWidget -> EditWidget+editWidgetDeleteUnderCursor' _ _ ew =+    let pos = ew_contentPos ew+        oldContent = ew_content ew+        newContent = take pos oldContent ++ drop (pos+1) oldContent+        in ew { ew_content = newContent }++editWidgetDeleteToEnd' :: t -> t1 -> EditWidget -> EditWidget+editWidgetDeleteToEnd' _ _ ew =+    let pos = ew_contentPos ew+        oldContent = ew_content ew+        newContent = take pos oldContent+        in ew { ew_content = newContent }++editWidgetGoHome' :: t -> t1 -> EditWidget -> EditWidget+editWidgetGoHome' _ _ ew =+    ew { ew_xcursor = 0,+         ew_xoffset = 0 }++editWidgetGoEnd' :: Pos -> Size -> EditWidget -> EditWidget+editWidgetGoEnd' pos sz ew =+    let cpos = ew_contentPos ew+        len = length (ew_content ew)+        in if cpos == len+              then ew+              else editWidgetGoEnd' pos sz (editWidgetGoRight' pos sz ew)++editWidgetFinish :: (Monad m) => t -> t1 -> EditWidget -> m (Cont EditWidget)+editWidgetFinish _ _ ew =  return (Done (addToHistory ew (ew_content ew)))++maxHistoryLength :: Int+maxHistoryLength = 50++addToHistory :: EditWidget -> [Char] -> EditWidget+addToHistory ew s =+    let newHist = if not (null s)+                     then take maxHistoryLength (s : ew_history ew)+                     else ew_history ew+        in ew { ew_history = newHist, ew_historyIndex = -1,+                ew_historySavedContent = Nothing }++editWidgetHistoryUp' :: t -> t1 -> EditWidget -> EditWidget+editWidgetHistoryUp' _ _ ew = editWidgetHistory (+) ew++editWidgetHistoryDown' :: t -> t1 -> EditWidget -> EditWidget+editWidgetHistoryDown' _ _ ew = editWidgetHistory (-) ew++-- ew_historyList: list of history items, i.e. non-null strings which were+--   entered into the widget and confirmed with ENTER or which were added+--   via editWidgetSetContent.+-- ew_historyIndex: the index of the history item shown in the widget. The+--   value -1 means that the value saved in ew_historySavedContent should+--   be shown.+editWidgetHistory :: (Num t) => (Int -> t -> Int) -> EditWidget -> EditWidget+editWidgetHistory op ew =+    let i = ew_historyIndex ew+        l = ew_history ew+        j =  i `op` 1+        in if j >= 0 && j < length l+              then let savedContent =+                           case ew_historySavedContent ew of+                             Nothing -> Just (ew_content ew)+                             x -> x+                       in ew { ew_historyIndex = j, ew_content = l!!j,+                               ew_historySavedContent = savedContent,+                               ew_xcursor = 0, ew_xoffset = 0 }+              else if j == -1+                      then case ew_historySavedContent ew of+                             Nothing -> ew+                             Just x -> ew { ew_content = x,+                                            ew_historyIndex = j,+                                            ew_xcursor = 0,+                                            ew_xoffset = 0  }+                   else ew++++--+-- Text widget+--++data TextWidget = TextWidget+    { tw_text           :: String,+      tw_yoffset        :: Int,+      tw_xoffset        :: Int,+      tw_options        :: TextWidgetOptions+    }+    deriving (Eq, Show)++instance Widget TextWidget where+    draw = drawTextWidget+    minSize tw =+        case twopt_size $ tw_options tw of+          TWSizeDefault -> let l = lines (tw_text tw)+                           in (length l, if null l then 0 else maximum (map length l))+          TWSizeFixed sz -> sz++data TextWidgetSize = TWSizeDefault    -- minimal size determined by content+                    | TWSizeFixed Size -- minimal size is fixed, content is+                                       -- possibly cut off+                      deriving (Eq, Show)+                                 {-+                    | Autowrap   -- minimal width determined by content,+                                 -- but lines are wrapped if necessary+                                 -}++data TextWidgetOptions = TWOptions+    { twopt_size   :: TextWidgetSize,+      twopt_style  :: DrawingStyle,+      twopt_halign :: HAlignment }+    deriving (Eq, Show)++defaultTWOptions :: TextWidgetOptions+defaultTWOptions = TWOptions+                { twopt_size = TWSizeDefault,+                  twopt_style = defaultDrawingStyle,+                  twopt_halign = AlignLeft }++newTextWidget :: TextWidgetOptions -> String -> TextWidget+newTextWidget opts s = TextWidget+                       { tw_text = s,+                         tw_yoffset = 0,+                         tw_xoffset = 0,+                         tw_options = opts+                       }++drawTextWidget :: Pos -> Size -> DrawingHint -> TextWidget -> IO ()+drawTextWidget (y, x) (height, width) hint tw =+    let ly = take height $ drop (tw_yoffset tw) (lines (tw_text tw))+        l = take height $ (map (drop (tw_xoffset tw)) ly ++ repeat [])+        l' = map (align (twopt_halign $ tw_options tw) width ' ') l+    in --trace ("drawing text widget at " ++ show pos ++ " with size " ++ show sz) $+       do _draw hint (twopt_style . tw_options $ tw)+                      (mapM drawLine $ zip l' [0..])+          Curses.refresh+    where drawLine (s, i) =+              do Curses.wMove Curses.stdScr (y + i) x+                 CursesH.drawLine width s++textWidgetGetText :: TextWidget -> String+textWidgetGetText = tw_text++textWidgetSetText :: TextWidget -> String -> TextWidget+textWidgetSetText tw s = tw { tw_text = s }++textWidgetScrollDown :: Size -> TextWidget -> TextWidget+textWidgetScrollDown (h, _) tw =+    let dataLen = length $ lines (tw_text tw)+        offset = tw_yoffset tw+        in tw { tw_yoffset = scrollForward dataLen offset h }++textWidgetScrollUp :: Size -> TextWidget -> TextWidget+textWidgetScrollUp (h, _) tw =+    let dataLen = length $ lines (tw_text tw)+        offset = tw_yoffset tw+        in tw { tw_yoffset = scrollBackward dataLen offset h }++textWidgetScrollLeft :: Size -> TextWidget -> TextWidget+textWidgetScrollLeft (_, w) tw =+    let dataLen = length $ lines (tw_text tw)+        offset = tw_xoffset tw+        in tw { tw_xoffset = scrollBackward dataLen offset w }++textWidgetScrollRight :: Size -> TextWidget -> TextWidget+textWidgetScrollRight (_, w) tw =+    let dataLen = length $ lines (tw_text tw)+        offset = tw_xoffset tw+        in tw { tw_xoffset = scrollForward dataLen offset w }+++--+-- Table widget+--++data TableCell = forall w. Widget w => TableCell w+               | forall w. ActiveWidget w => ActiveTableCell w++isActive :: TableCell -> Bool+isActive (TableCell _) = False+isActive (ActiveTableCell _) = True++instance Widget TableCell where+    draw pos sz hint (TableCell w) = draw pos sz hint w+    draw pos sz hint (ActiveTableCell w) = draw pos sz hint w+    minSize (TableCell w) = minSize w+    minSize (ActiveTableCell w) = minSize w++_activateTableCell :: MonadExcIO m => m () -> Pos -> Size+                   -> TableCell -> m (TableCell, String)+_activateTableCell _ _ _ (TableCell _) =+    error "_activateTableCell: cannot activate non-active cell!"+_activateTableCell refresh pos sz (ActiveTableCell w) =+    do (new, res) <- activate refresh pos sz w+       return (ActiveTableCell new, res)++type Row = [TableCell]++singletonRow :: TableCell -> Row+singletonRow tc = [tc]++getCellWidget :: TableWidget -> (Int, Int) -> TableCell+getCellWidget tbw (row, col) = (tbw_rows tbw) !! row !! col++setCellWidget :: TableWidget -> (Int, Int) -> TableCell -> TableWidget+setCellWidget tbw (rowIndex, colIndex) w =+    let rows = tbw_rows tbw+        row = rows !! rowIndex+        newRow = listReplace row w colIndex+        newRows = listReplace rows newRow rowIndex+        in tbw { tbw_rows = newRows }++data TableWidget = TableWidget+    { tbw_rows     :: [Row],+      tbw_colOffset  :: Int,+      tbw_pos      :: Maybe Pos,+      tbw_options  :: TableWidgetOptions }++data FillRow = First | Last | None deriving (Eq,Show)++data TableWidgetOptions = TBWOptions+    { tbwopt_fillCol    :: Maybe Int,+      tbwopt_fillRow    :: FillRow,+      tbwopt_activeCols :: [Int],+      tbwopt_minSize    :: Size }+    deriving (Eq, Show)++defaultTBWOptions :: TableWidgetOptions+defaultTBWOptions = TBWOptions+                    { tbwopt_fillCol = Nothing,+                      tbwopt_fillRow = None,+                      tbwopt_activeCols = [],+                      tbwopt_minSize = (4, 10) }++instance Widget TableWidget where+    draw      = drawTableWidget+    minSize   = tbwopt_minSize . tbw_options++newTableWidget :: TableWidgetOptions -> [Row] -> TableWidget+newTableWidget opts rows = TableWidget+                              { tbw_rows = rows,+                                tbw_colOffset = 0,+                                tbw_pos = findFirstActiveCell rows opts,+                                tbw_options = opts }++data TableWidgetDisplayInfo =+    TBWDisplayInfo+    { tbwdisp_height     :: Int   -- height of the display area+    , tbwdisp_width      :: Int   -- width of the display area+    , tbwdisp_firstVis   :: Int   -- index of the first row visible+    , tbwdisp_lastVis    :: Int   -- index of the last row visible+    , tbwdisp_rows       :: [Row] -- the rows which are visible+    , tbwdisp_nrows      :: Int   -- the number of rows visible+    , tbwdisp_heights    :: [Int] -- the heights of the visible rows+    , tbwdisp_widths     :: [Int] -- the widths of the visible rows+      -- free space at the right side (xoffset, size)+    , tbwdisp_rightMargin :: Maybe (Int, Size)+    }++tableWidgetDisplayInfo :: Size -> TableWidget -> TableWidgetDisplayInfo+tableWidgetDisplayInfo (height, width) tbw =+    assert (isQuadratic (tbw_rows tbw)) $+    let allRows = tbw_rows tbw+        ncols = length (allRows!!0)+        colOffset = tbw_colOffset tbw+        allHeights = minSpaces getHeight allRows+        heights' = drop colOffset allHeights+        nrows = getNRows heights' 0 0+        rows = take nrows $ drop colOffset allRows+        (heights, heightDummy) =+            let hs = take nrows heights'+                s = sum hs+                d = height - s+                in case tbwopt_fillRow $ tbw_options tbw of+                     First -> (applyToFirst (+d) hs, 0)+                     Last -> (applyToLast (+d) hs, 0)+                     None -> (hs, d)+        widths' = minSpaces getWidth (transpose $ tbw_rows tbw)+        (widths, rightMargin) =+            if sum widths' > width+               then error ("table to wide: width=" ++ show (sum widths') +++                           ", available width=" ++ show width)+               else case tbwopt_fillCol $ tbw_options tbw of+                      Just i | i >= 0 && i < ncols+                                 -> (take i widths' +++                                     let rest = drop i widths'+                                     in (head rest + width - sum widths') : tail rest+                                    , Nothing)+                      _ -> let diff = width - sum widths'+                               msz = (height, diff)+                               m = if diff > 0 then Just (sum widths', msz)+                                   else Nothing+                           in (widths', m)+        dummyHeights = if heightDummy == 0 then [] else [heightDummy]+        dummyRows = if heightDummy == 0 then []+                    else [map (\w -> TableCell (OpaqueWidget (heightDummy, w)))+                          widths]+        in TBWDisplayInfo+               { tbwdisp_height = height+               , tbwdisp_width = width+               , tbwdisp_firstVis = colOffset+               , tbwdisp_lastVis = colOffset + nrows - 1+               , tbwdisp_rows = rows ++ dummyRows+               , tbwdisp_nrows = nrows + length dummyRows+               , tbwdisp_heights = heights ++ dummyHeights+               , tbwdisp_widths = widths+               , tbwdisp_rightMargin = rightMargin+               }+    where+        minSpaces f ls =+            snd $ mapAccumL+                    (\acc ws ->+                       (acc, acc + maximum (map (f . minSize) ws)))+                    0 ls+        getNRows (h:hs) n acc | h + n <= height = getNRows hs (h+n) (acc+1)+        getNRows _ _ acc = acc+        isQuadratic [] = True+        isQuadratic (x:xs) = isQuadratic' xs (length x)+        isQuadratic' (x:xs) n = length x == n && isQuadratic' xs n+        isQuadratic' [] _ = True+        applyToFirst _ [] = []+        applyToFirst f (x:xs) = f x : xs+        applyToLast _ [] = []+        applyToLast f l =+            let (h, t) = (head $ reverse l, tail $ reverse l)+                in reverse $ f h : t++getCellInfo :: Pos -> Size -> TableWidget -> (Int,Int) -> (Pos, Size)+getCellInfo (y,x) sz tbw (row, col) =+    let info = tableWidgetDisplayInfo sz tbw+        heights = tbwdisp_heights info+        widths = tbwdisp_widths info+        h = heights !! row+        w = widths !! col+        yoff = sum $ take row heights+        xoff = sum $ take col widths+        in ((y+yoff, x+xoff), (h, w))++drawTableWidget :: Pos -> Size -> DrawingHint -> TableWidget -> IO ()+drawTableWidget (y, x) sz hint tbw =+    let info = tableWidgetDisplayInfo sz tbw+        heights = tbwdisp_heights info+        widths = tbwdisp_widths info+        firstVis = tbwdisp_firstVis info+        rows = tbwdisp_rows info+        rightMargin = tbwdisp_rightMargin info+        in do drawRows rows heights widths 0 firstVis hint+              case rightMargin of+                Nothing -> return ()+                Just (xoff,s) -> draw (y,x+xoff) s hint (OpaqueWidget s)+              Curses.refresh+    where drawRows :: [Row] -> [Int] -> [Int] -> Int -> Int+                   -> DrawingHint -> IO ()+          drawRows [] _ _ _ _ _ = return ()+          drawRows (r:rs) (h:hs) widths yoffset rowIndex hint' =+            do drawCols r h widths yoffset 0 (rowIndex, 0) hint'+               drawRows rs hs widths (yoffset + h) (rowIndex + 1) hint'+          drawCols :: Row -> Int -> [Int] -> Int -> Int -> (Int, Int)+                   -> DrawingHint -> IO ()+          drawCols [] _ _ _ _ _ _ = return ()+          drawCols (c:cs) h (w:ws) yoffset xoffset (rowIndex, colIndex) hint' =+            let hint'' = case tbw_pos tbw of+                           Just (z, a) | z == rowIndex && a == colIndex+                               -> DHFocus+                           _ -> hint'+            in do draw (y+yoffset, x+xoffset) (h,w) hint'' c+                  drawCols cs h ws yoffset (xoffset + w)+                           (rowIndex, colIndex+1) hint'+++tableWidgetScrollDown :: Size -> TableWidget -> TableWidget+tableWidgetScrollDown (h, _) tbw =+    let dataLen = length $ tbw_rows tbw+        offset = tbw_colOffset tbw+        newOffset = scrollForward dataLen offset h+        newTbw = tbw { tbw_colOffset = newOffset }+        in case tbw_pos newTbw of+             Nothing -> newTbw+             Just (y,x) -> newTbw { tbw_pos = Just (max newOffset y, x) }++tableWidgetScrollUp :: Size -> TableWidget -> TableWidget+tableWidgetScrollUp sz@(h,_) tbw =+    let dataLen = length $ tbw_rows tbw+        offset = tbw_colOffset tbw+        newOffset = scrollBackward dataLen offset h+        newTbw = tbw { tbw_colOffset = newOffset }+        newLastVis = tbwdisp_lastVis (tableWidgetDisplayInfo sz newTbw)+        in case tbw_pos newTbw of+             Nothing -> newTbw+             Just (y,x) ->+                 newTbw { tbw_pos = Just (min newLastVis y, x) }++tableWidgetActivateCurrent :: MonadExcIO m => m () -> Pos -> Size+                           -> DrawingHint -> TableWidget+                           -> m (TableWidget, Maybe String)+tableWidgetActivateCurrent refresh (y, x) sz _ tbw =+    case tbw_pos tbw of+      Nothing -> do debug "tableWidgetActivateCurrent: pos=Nothing"+                    return (tbw, Nothing)+      Just p -> let w = getCellWidget tbw p+                    in if not $ isActive w+                       then do debug "tableWidgetActivateCurrent: not active"+                               return (tbw, Nothing)+                       else activate' w p+    where+    activate' widget colyx@(coly, colx) =+        let info = tableWidgetDisplayInfo sz tbw+            vcol = colx+            vrow = coly - tbwdisp_firstVis info+            heights = tbwdisp_heights info+            widths = tbwdisp_widths info+            h = heights !! vrow+            w = widths !! vcol+            yoffset = sum (take vrow heights)+            xoffset = sum (take vcol widths)+        in do (new, res) <- _activateTableCell refresh (y+yoffset, x+xoffset)+                              (h, w) widget+              return (setCellWidget tbw colyx new, Just res)++tableWidgetGoLeft :: Size -> TableWidget -> TableWidget+tableWidgetGoLeft =  tableWidgetMove DirLeft++tableWidgetGoRight :: Size -> TableWidget -> TableWidget+tableWidgetGoRight =  tableWidgetMove DirRight++tableWidgetGoUp :: Size -> TableWidget -> TableWidget+tableWidgetGoUp =  tableWidgetMove DirUp++tableWidgetGoDown :: Size -> TableWidget -> TableWidget+tableWidgetGoDown =  tableWidgetMove DirDown++tableWidgetMove :: Direction+                                               -> (Int, Int)+                                               -> TableWidget+                                               -> TableWidget+tableWidgetMove dir sz tbw =+    let pos = tbw_pos tbw+        opts = tbw_options tbw+        nrows = length (tbw_rows tbw)+        in case pos of+             Nothing -> tbw+             Just p -> case findNextActiveCell opts nrows p dir of+                         Nothing -> tbw+                         newP@(Just (y, _)) ->+                             tableWidgetMakeVisible (tbw {tbw_pos=newP}) sz y++tableWidgetMakeVisible :: TableWidget+                                                      -> (Int, Int)+                                                      -> Int+                                                      -> TableWidget+tableWidgetMakeVisible tbw sz@(_,_) y =+    let info = tableWidgetDisplayInfo sz tbw+        firstVis = tbwdisp_firstVis info+        lastVis = tbwdisp_lastVis info+        in if y < firstVis+              then tableWidgetMakeVisible (tableWidgetScrollUp sz tbw) sz y+              else if y > lastVis+                      then tableWidgetMakeVisible+                               (tableWidgetScrollDown sz tbw) sz y+                      else tbw++findFirstActiveCell :: [Row] -> TableWidgetOptions -> Maybe Pos+findFirstActiveCell rows opts =+    let nrows = length rows+        firstActiveCells = map (\y -> findNextActiveCell opts nrows+                                                         (y, -1) DirRight)+                               [0..nrows-1]+        in case catMaybes firstActiveCells of+             [] -> Nothing+             (x:_) -> Just x++findNextActiveCell :: TableWidgetOptions -> Int  -> Pos -> Direction+                   -> Maybe Pos+findNextActiveCell opts nrows (y,x) dir =+--    trace ("findNextActiveCell (opts=" ++ show opts ++ ", nrows=" ++ show nrows+--           ++ ", pos=" ++ show pos ++ ", dir=" ++ show dir) $+    let rows = [0..(nrows - 1)]+        cols = sort (tbwopt_activeCols opts)+        horiz f = case f cols x rows y of+                    Nothing -> Nothing+                    Just z -> Just (y, z)+        vert f = case f rows y cols x of+                   Nothing -> Nothing+                   Just z -> Just (y, z)+        res = case dir of+                DirLeft-> horiz goLeft+                DirRight -> horiz goRight+                DirUp -> vert goLeft+                DirDown -> vert goRight+        in --trace ("result of findNextActiveCell: " ++ show res)+           res+    where goLeft _ _ rows a | not (a `elem` rows) = Nothing+          goLeft cols b _ _ =+              case reverse (takeWhile (<b) cols) of+                [] -> Nothing+                (c:_) -> Just c+          goRight _ _ rows a | not (a `elem` rows) = Nothing+          goRight cols a _ _ =+              case dropWhile (a>=) cols of+                [] -> Nothing+                (b:_) -> Just b++tableWidgetDeleteRow :: Int -> TableWidget -> TableWidget+tableWidgetDeleteRow n tbw =+    let rows = tbw_rows tbw+        rows' = deleteAt n rows+        pos' =+           case tbw_pos tbw of+             Nothing -> Nothing+             Just (row,col) ->+                 let row' = min row (length rows' - 1)+                     in if row' >= 0 then Just (row', col)+                        else Nothing+        in tbw { tbw_rows = rows', tbw_pos = pos' }++--+-- BorderWidget+--+++--+-- Selection Widget+--++--+-- Utility functions+--++-- | Join a list by some delimiter+joinLists :: [[a]] -> [a] -> [a]+joinLists l s = if (null l) then [] else foldr1 (\x -> \y -> x ++ s ++ y) l++-- | Split a list by some delimiter+splitList :: Eq a => [a] -> [a] -> [[a]]+splitList d l =+    unfoldr (\x -> if (null x)+                      then Nothing+                      else Just $ nextToken d [] (snd $ splitAt (length d) x))+            (d++l)+  where nextToken _ r [] = (r, [])+        nextToken e r m@(h:t) | (e `isPrefixOf` m) = (r, m)+                              | otherwise = nextToken e (r++[h]) t++listReplace :: [a] -> a -> Int -> [a]+listReplace l a i =+    case splitAt i l of+      (_, []) -> error ("listReplace: index to large. index="++show i+++                        ", length="++show (length l))+      ([], _) | i < 0 -> error ("listReplace: negative index. index="+++                                show i)+      (xs,(_:ys)) -> xs ++ (a:ys)++--alignRows :: [[String]] -> Char -> String -> [String]+alignRows :: [[[a]]] -> a -> [a] -> [[a]]+alignRows rows fill delim =+    let widths = foldr maxWidths (repeat 0) rows+        in map (alignRow widths) rows+    where+    maxWidths ::  [[a]] -> [Int] -> [Int]+    maxWidths row acc = map (uncurry max) (zip acc (map length row))+    alignRow widths row = concatMap (uncurry alignCell) (zip widths row)+    alignCell width cell =+        let diff = width - length cell+            in cell ++ (take diff $ repeat fill) ++ delim+++align :: HAlignment -> Int -> a -> [a] -> [a]+align a w f l =+    let space = w - length l+        in case a of+             AlignLeft -> l ++ (fill space)+             AlignRight -> (fill space) ++ l+             AlignCenter ->+                 let left = space `div` 2+                     right = left + (space `mod` 2)+                     in fill left ++ l ++ fill right+    where fill n = take n (repeat f)++deleteAt :: Int -> [a] -> [a]+deleteAt n l = if n >= 0 && n < length l+                  then let (a,b) = splitAt n l in a ++ (tail b)+                  else error ("deleteAt: illegal index: " ++ show n)
cbits/HSCurses.h view
@@ -7,7 +7,7 @@ #undef PACKAGE_STRING #undef PACKAGE_TARNAME #undef PACKAGE_VERSION-# include "config.h"+# include "ghcconfig.h" #endif  #if HAVE_NCURSESW_NCURSES_H
cbits/HSCursesUtils.c view
@@ -3,7 +3,7 @@  /*  * A non-macro version of getyx(3), to make writing a Haskell binding- * easier.  Called in HSCurses/Curses.hsc+ * easier.  Called in UI/HSCurses/Curses.hsc  */ void hscurses_nomacro_getyx(WINDOW *win, int *y, int *x) {
− configure
@@ -1,5006 +0,0 @@-#! /bin/sh-# Guess values for system-dependent variables and create Makefiles.-# Generated by GNU Autoconf 2.59.-#-# Copyright (C) 2003 Free Software Foundation, Inc.-# This configure script is free software; the Free Software Foundation-# gives unlimited permission to copy, distribute and modify it.-## --------------------- ##-## M4sh Initialization.  ##-## --------------------- ##--# Be Bourne compatible-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then-  emulate sh-  NULLCMD=:-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which-  # is contrary to our usage.  Disable this feature.-  alias -g '${1+"$@"}'='"$@"'-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then-  set -o posix-fi-DUALCASE=1; export DUALCASE # for MKS sh--# Support unset when possible.-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then-  as_unset=unset-else-  as_unset=false-fi---# Work around bugs in pre-3.0 UWIN ksh.-$as_unset ENV MAIL MAILPATH-PS1='$ '-PS2='> '-PS4='+ '--# NLS nuisances.-for as_var in \-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \-  LC_TELEPHONE LC_TIME-do-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then-    eval $as_var=C; export $as_var-  else-    $as_unset $as_var-  fi-done--# Required to use basename.-if expr a : '\(a\)' >/dev/null 2>&1; then-  as_expr=expr-else-  as_expr=false-fi--if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then-  as_basename=basename-else-  as_basename=false-fi---# Name of the executable.-as_me=`$as_basename "$0" ||-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)$' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X/"$0" |-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }-  	  /^X\/\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`---# PATH needs CR, and LINENO needs CR and PATH.-# Avoid depending upon Character Ranges.-as_cr_letters='abcdefghijklmnopqrstuvwxyz'-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'-as_cr_Letters=$as_cr_letters$as_cr_LETTERS-as_cr_digits='0123456789'-as_cr_alnum=$as_cr_Letters$as_cr_digits--# The user is always right.-if test "${PATH_SEPARATOR+set}" != set; then-  echo "#! /bin/sh" >conf$$.sh-  echo  "exit 0"   >>conf$$.sh-  chmod +x conf$$.sh-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then-    PATH_SEPARATOR=';'-  else-    PATH_SEPARATOR=:-  fi-  rm -f conf$$.sh-fi---  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {-  # Find who we are.  Look in the path if we contain no path at all-  # relative or not.-  case $0 in-    *[\\/]* ) as_myself=$0 ;;-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break-done--       ;;-  esac-  # We did not find ourselves, most probably we were run as `sh COMMAND'-  # in which case we are not to be found in the path.-  if test "x$as_myself" = x; then-    as_myself=$0-  fi-  if test ! -f "$as_myself"; then-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2-   { (exit 1); exit 1; }; }-  fi-  case $CONFIG_SHELL in-  '')-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for as_base in sh bash ksh sh5; do-	 case $as_dir in-	 /*)-	   if ("$as_dir/$as_base" -c '-  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }-	     CONFIG_SHELL=$as_dir/$as_base-	     export CONFIG_SHELL-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}-	   fi;;-	 esac-       done-done-;;-  esac--  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO-  # uniformly replaced by the line number.  The first 'sed' inserts a-  # line-number line before each line; the second 'sed' does the real-  # work.  The second script uses 'N' to pair each line-number line-  # with the numbered line, and appends trailing '-' during-  # substitution so that $LINENO is not a special case at line end.-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)-  sed '=' <$as_myself |-    sed '-      N-      s,$,-,-      : loop-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,-      t loop-      s,-$,,-      s,^['$as_cr_digits']*\n,,-    ' >$as_me.lineno &&-  chmod +x $as_me.lineno ||-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2-   { (exit 1); exit 1; }; }--  # Don't try to exec as it changes $[0], causing all sort of problems-  # (the dirname of $[0] is not the place where we might find the-  # original and so on.  Autoconf is especially sensible to this).-  . ./$as_me.lineno-  # Exit status is that of the last command.-  exit-}---case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in-  *c*,-n*) ECHO_N= ECHO_C='-' ECHO_T='	' ;;-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;-esac--if expr a : '\(a\)' >/dev/null 2>&1; then-  as_expr=expr-else-  as_expr=false-fi--rm -f conf$$ conf$$.exe conf$$.file-echo >conf$$.file-if ln -s conf$$.file conf$$ 2>/dev/null; then-  # We could just check for DJGPP; but this test a) works b) is more generic-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).-  if test -f conf$$.exe; then-    # Don't use ln at all; we don't have any links-    as_ln_s='cp -p'-  else-    as_ln_s='ln -s'-  fi-elif ln conf$$.file conf$$ 2>/dev/null; then-  as_ln_s=ln-else-  as_ln_s='cp -p'-fi-rm -f conf$$ conf$$.exe conf$$.file--if mkdir -p . 2>/dev/null; then-  as_mkdir_p=:-else-  test -d ./-p && rmdir ./-p-  as_mkdir_p=false-fi--as_executable_p="test -f"--# Sed expression to map a string onto a valid CPP name.-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"--# Sed expression to map a string onto a valid variable name.-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"---# IFS-# We need space, tab and new line, in precisely that order.-as_nl='-'-IFS=" 	$as_nl"--# CDPATH.-$as_unset CDPATH---# Name of the host.-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,-# so uname gets run too.-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`--exec 6>&1--#-# Initializations.-#-ac_default_prefix=/usr/local-ac_config_libobj_dir=.-cross_compiling=no-subdirs=-MFLAGS=-MAKEFLAGS=-SHELL=${CONFIG_SHELL-/bin/sh}--# Maximum number of lines to put in a shell here document.-# This variable seems obsolete.  It should probably be removed, and-# only ac_max_sed_lines should be used.-: ${ac_max_here_lines=38}--# Identity of this package.-PACKAGE_NAME=-PACKAGE_TARNAME=-PACKAGE_VERSION=-PACKAGE_STRING=-PACKAGE_BUGREPORT=--ac_unique_file="HSCurses/Curses.hsc"-# Factoring default headers for most tests.-ac_includes_default="\-#include <stdio.h>-#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_STAT_H-# include <sys/stat.h>-#endif-#if STDC_HEADERS-# include <stdlib.h>-# include <stddef.h>-#else-# if HAVE_STDLIB_H-#  include <stdlib.h>-# endif-#endif-#if HAVE_STRING_H-# if !STDC_HEADERS && HAVE_MEMORY_H-#  include <memory.h>-# endif-# include <string.h>-#endif-#if HAVE_STRINGS_H-# include <strings.h>-#endif-#if HAVE_INTTYPES_H-# include <inttypes.h>-#else-# if HAVE_STDINT_H-#  include <stdint.h>-# endif-#endif-#if HAVE_UNISTD_H-# include <unistd.h>-#endif"--ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS GHC WithGhc GhcCodegen GhcPkgCmd Hsc2hsCmd GccCmd HaddockCmd STRIP LdCmd LdXFlag RANLIB ac_ct_RANLIB CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ICONV CURSES CPP EGREP SYMS current_directory LIBOBJS LTLIBOBJS'-ac_subst_files=''--# Initialize some variables set by options.-ac_init_help=-ac_init_version=false-# The variables have the same names as the options, with-# dashes changed to underlines.-cache_file=/dev/null-exec_prefix=NONE-no_create=-no_recursion=-prefix=NONE-program_prefix=NONE-program_suffix=NONE-program_transform_name=s,x,x,-silent=-site=-srcdir=-verbose=-x_includes=NONE-x_libraries=NONE--# Installation directory options.-# These are left unexpanded so users can "make install exec_prefix=/foo"-# and all the variables that are supposed to be based on exec_prefix-# by default will actually change.-# Use braces instead of parens because sh, perl, etc. also accept them.-bindir='${exec_prefix}/bin'-sbindir='${exec_prefix}/sbin'-libexecdir='${exec_prefix}/libexec'-datadir='${prefix}/share'-sysconfdir='${prefix}/etc'-sharedstatedir='${prefix}/com'-localstatedir='${prefix}/var'-libdir='${exec_prefix}/lib'-includedir='${prefix}/include'-oldincludedir='/usr/include'-infodir='${prefix}/info'-mandir='${prefix}/man'--ac_prev=-for ac_option-do-  # If the previous option needs an argument, assign it.-  if test -n "$ac_prev"; then-    eval "$ac_prev=\$ac_option"-    ac_prev=-    continue-  fi--  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`--  # Accept the important Cygnus configure options, so we can diagnose typos.--  case $ac_option in--  -bindir | --bindir | --bindi | --bind | --bin | --bi)-    ac_prev=bindir ;;-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)-    bindir=$ac_optarg ;;--  -build | --build | --buil | --bui | --bu)-    ac_prev=build_alias ;;-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)-    build_alias=$ac_optarg ;;--  -cache-file | --cache-file | --cache-fil | --cache-fi \-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)-    ac_prev=cache_file ;;-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)-    cache_file=$ac_optarg ;;--  --config-cache | -C)-    cache_file=config.cache ;;--  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)-    ac_prev=datadir ;;-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \-  | --da=*)-    datadir=$ac_optarg ;;--  -disable-* | --disable-*)-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2-   { (exit 1); exit 1; }; }-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`-    eval "enable_$ac_feature=no" ;;--  -enable-* | --enable-*)-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2-   { (exit 1); exit 1; }; }-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`-    case $ac_option in-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;-      *) ac_optarg=yes ;;-    esac-    eval "enable_$ac_feature='$ac_optarg'" ;;--  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \-  | --exec | --exe | --ex)-    ac_prev=exec_prefix ;;-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \-  | --exec=* | --exe=* | --ex=*)-    exec_prefix=$ac_optarg ;;--  -gas | --gas | --ga | --g)-    # Obsolete; use --with-gas.-    with_gas=yes ;;--  -help | --help | --hel | --he | -h)-    ac_init_help=long ;;-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)-    ac_init_help=recursive ;;-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)-    ac_init_help=short ;;--  -host | --host | --hos | --ho)-    ac_prev=host_alias ;;-  -host=* | --host=* | --hos=* | --ho=*)-    host_alias=$ac_optarg ;;--  -includedir | --includedir | --includedi | --included | --include \-  | --includ | --inclu | --incl | --inc)-    ac_prev=includedir ;;-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \-  | --includ=* | --inclu=* | --incl=* | --inc=*)-    includedir=$ac_optarg ;;--  -infodir | --infodir | --infodi | --infod | --info | --inf)-    ac_prev=infodir ;;-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)-    infodir=$ac_optarg ;;--  -libdir | --libdir | --libdi | --libd)-    ac_prev=libdir ;;-  -libdir=* | --libdir=* | --libdi=* | --libd=*)-    libdir=$ac_optarg ;;--  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \-  | --libexe | --libex | --libe)-    ac_prev=libexecdir ;;-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \-  | --libexe=* | --libex=* | --libe=*)-    libexecdir=$ac_optarg ;;--  -localstatedir | --localstatedir | --localstatedi | --localstated \-  | --localstate | --localstat | --localsta | --localst \-  | --locals | --local | --loca | --loc | --lo)-    ac_prev=localstatedir ;;-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)-    localstatedir=$ac_optarg ;;--  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)-    ac_prev=mandir ;;-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)-    mandir=$ac_optarg ;;--  -nfp | --nfp | --nf)-    # Obsolete; use --without-fp.-    with_fp=no ;;--  -no-create | --no-create | --no-creat | --no-crea | --no-cre \-  | --no-cr | --no-c | -n)-    no_create=yes ;;--  -no-recursion | --no-recursion | --no-recursio | --no-recursi \-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)-    no_recursion=yes ;;--  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \-  | --oldin | --oldi | --old | --ol | --o)-    ac_prev=oldincludedir ;;-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)-    oldincludedir=$ac_optarg ;;--  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)-    ac_prev=prefix ;;-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)-    prefix=$ac_optarg ;;--  -program-prefix | --program-prefix | --program-prefi | --program-pref \-  | --program-pre | --program-pr | --program-p)-    ac_prev=program_prefix ;;-  -program-prefix=* | --program-prefix=* | --program-prefi=* \-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)-    program_prefix=$ac_optarg ;;--  -program-suffix | --program-suffix | --program-suffi | --program-suff \-  | --program-suf | --program-su | --program-s)-    ac_prev=program_suffix ;;-  -program-suffix=* | --program-suffix=* | --program-suffi=* \-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)-    program_suffix=$ac_optarg ;;--  -program-transform-name | --program-transform-name \-  | --program-transform-nam | --program-transform-na \-  | --program-transform-n | --program-transform- \-  | --program-transform | --program-transfor \-  | --program-transfo | --program-transf \-  | --program-trans | --program-tran \-  | --progr-tra | --program-tr | --program-t)-    ac_prev=program_transform_name ;;-  -program-transform-name=* | --program-transform-name=* \-  | --program-transform-nam=* | --program-transform-na=* \-  | --program-transform-n=* | --program-transform-=* \-  | --program-transform=* | --program-transfor=* \-  | --program-transfo=* | --program-transf=* \-  | --program-trans=* | --program-tran=* \-  | --progr-tra=* | --program-tr=* | --program-t=*)-    program_transform_name=$ac_optarg ;;--  -q | -quiet | --quiet | --quie | --qui | --qu | --q \-  | -silent | --silent | --silen | --sile | --sil)-    silent=yes ;;--  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)-    ac_prev=sbindir ;;-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \-  | --sbi=* | --sb=*)-    sbindir=$ac_optarg ;;--  -sharedstatedir | --sharedstatedir | --sharedstatedi \-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \-  | --sharedst | --shareds | --shared | --share | --shar \-  | --sha | --sh)-    ac_prev=sharedstatedir ;;-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \-  | --sha=* | --sh=*)-    sharedstatedir=$ac_optarg ;;--  -site | --site | --sit)-    ac_prev=site ;;-  -site=* | --site=* | --sit=*)-    site=$ac_optarg ;;--  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)-    ac_prev=srcdir ;;-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)-    srcdir=$ac_optarg ;;--  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \-  | --syscon | --sysco | --sysc | --sys | --sy)-    ac_prev=sysconfdir ;;-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)-    sysconfdir=$ac_optarg ;;--  -target | --target | --targe | --targ | --tar | --ta | --t)-    ac_prev=target_alias ;;-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)-    target_alias=$ac_optarg ;;--  -v | -verbose | --verbose | --verbos | --verbo | --verb)-    verbose=yes ;;--  -version | --version | --versio | --versi | --vers | -V)-    ac_init_version=: ;;--  -with-* | --with-*)-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid package name: $ac_package" >&2-   { (exit 1); exit 1; }; }-    ac_package=`echo $ac_package| sed 's/-/_/g'`-    case $ac_option in-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;-      *) ac_optarg=yes ;;-    esac-    eval "with_$ac_package='$ac_optarg'" ;;--  -without-* | --without-*)-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid package name: $ac_package" >&2-   { (exit 1); exit 1; }; }-    ac_package=`echo $ac_package | sed 's/-/_/g'`-    eval "with_$ac_package=no" ;;--  --x)-    # Obsolete; use --with-x.-    with_x=yes ;;--  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \-  | --x-incl | --x-inc | --x-in | --x-i)-    ac_prev=x_includes ;;-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)-    x_includes=$ac_optarg ;;--  -x-libraries | --x-libraries | --x-librarie | --x-librari \-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)-    ac_prev=x_libraries ;;-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)-    x_libraries=$ac_optarg ;;--  -*) { echo "$as_me: error: unrecognized option: $ac_option-Try \`$0 --help' for more information." >&2-   { (exit 1); exit 1; }; }-    ;;--  *=*)-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`-    # Reject names that are not valid shell variable names.-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2-   { (exit 1); exit 1; }; }-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`-    eval "$ac_envvar='$ac_optarg'"-    export $ac_envvar ;;--  *)-    # FIXME: should be removed in autoconf 3.0.-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}-    ;;--  esac-done--if test -n "$ac_prev"; then-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`-  { echo "$as_me: error: missing argument to $ac_option" >&2-   { (exit 1); exit 1; }; }-fi--# Be sure to have absolute paths.-for ac_var in exec_prefix prefix-do-  eval ac_val=$`echo $ac_var`-  case $ac_val in-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2-   { (exit 1); exit 1; }; };;-  esac-done--# Be sure to have absolute paths.-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \-	      localstatedir libdir includedir oldincludedir infodir mandir-do-  eval ac_val=$`echo $ac_var`-  case $ac_val in-    [\\/$]* | ?:[\\/]* ) ;;-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2-   { (exit 1); exit 1; }; };;-  esac-done--# There might be people who depend on the old broken behavior: `$host'-# used to hold the argument of --host etc.-# FIXME: To remove some day.-build=$build_alias-host=$host_alias-target=$target_alias--# FIXME: To remove some day.-if test "x$host_alias" != x; then-  if test "x$build_alias" = x; then-    cross_compiling=maybe-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.-    If a cross compiler is detected then cross compile mode will be used." >&2-  elif test "x$build_alias" != "x$host_alias"; then-    cross_compiling=yes-  fi-fi--ac_tool_prefix=-test -n "$host_alias" && ac_tool_prefix=$host_alias---test "$silent" = yes && exec 6>/dev/null---# Find the source files, if location was not specified.-if test -z "$srcdir"; then-  ac_srcdir_defaulted=yes-  # Try the directory containing this script, then its parent.-  ac_confdir=`(dirname "$0") 2>/dev/null ||-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$0" : 'X\(//\)[^/]' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X"$0" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }-  	  /^X\(\/\/\)$/{ s//\1/; q; }-  	  /^X\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`-  srcdir=$ac_confdir-  if test ! -r $srcdir/$ac_unique_file; then-    srcdir=..-  fi-else-  ac_srcdir_defaulted=no-fi-if test ! -r $srcdir/$ac_unique_file; then-  if test "$ac_srcdir_defaulted" = yes; then-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2-   { (exit 1); exit 1; }; }-  else-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2-   { (exit 1); exit 1; }; }-  fi-fi-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2-   { (exit 1); exit 1; }; }-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`-ac_env_build_alias_set=${build_alias+set}-ac_env_build_alias_value=$build_alias-ac_cv_env_build_alias_set=${build_alias+set}-ac_cv_env_build_alias_value=$build_alias-ac_env_host_alias_set=${host_alias+set}-ac_env_host_alias_value=$host_alias-ac_cv_env_host_alias_set=${host_alias+set}-ac_cv_env_host_alias_value=$host_alias-ac_env_target_alias_set=${target_alias+set}-ac_env_target_alias_value=$target_alias-ac_cv_env_target_alias_set=${target_alias+set}-ac_cv_env_target_alias_value=$target_alias-ac_env_CC_set=${CC+set}-ac_env_CC_value=$CC-ac_cv_env_CC_set=${CC+set}-ac_cv_env_CC_value=$CC-ac_env_CFLAGS_set=${CFLAGS+set}-ac_env_CFLAGS_value=$CFLAGS-ac_cv_env_CFLAGS_set=${CFLAGS+set}-ac_cv_env_CFLAGS_value=$CFLAGS-ac_env_LDFLAGS_set=${LDFLAGS+set}-ac_env_LDFLAGS_value=$LDFLAGS-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}-ac_cv_env_LDFLAGS_value=$LDFLAGS-ac_env_CPPFLAGS_set=${CPPFLAGS+set}-ac_env_CPPFLAGS_value=$CPPFLAGS-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}-ac_cv_env_CPPFLAGS_value=$CPPFLAGS-ac_env_CPP_set=${CPP+set}-ac_env_CPP_value=$CPP-ac_cv_env_CPP_set=${CPP+set}-ac_cv_env_CPP_value=$CPP--#-# Report the --help message.-#-if test "$ac_init_help" = "long"; then-  # Omit some internal or obsolete options to make the list less imposing.-  # This message is too long to be a string in the A/UX 3.1 sh.-  cat <<_ACEOF-\`configure' configures this package to adapt to many kinds of systems.--Usage: $0 [OPTION]... [VAR=VALUE]...--To assign environment variables (e.g., CC, CFLAGS...), specify them as-VAR=VALUE.  See below for descriptions of some of the useful variables.--Defaults for the options are specified in brackets.--Configuration:-  -h, --help              display this help and exit-      --help=short        display options specific to this package-      --help=recursive    display the short help of all the included packages-  -V, --version           display version information and exit-  -q, --quiet, --silent   do not print \`checking...' messages-      --cache-file=FILE   cache test results in FILE [disabled]-  -C, --config-cache      alias for \`--cache-file=config.cache'-  -n, --no-create         do not create output files-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']--_ACEOF--  cat <<_ACEOF-Installation directories:-  --prefix=PREFIX         install architecture-independent files in PREFIX-			  [$ac_default_prefix]-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX-			  [PREFIX]--By default, \`make install' will install all the files in-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify-an installation prefix other than \`$ac_default_prefix' using \`--prefix',-for instance \`--prefix=\$HOME'.--For better control, use the options below.--Fine tuning of the installation directories:-  --bindir=DIR           user executables [EPREFIX/bin]-  --sbindir=DIR          system admin executables [EPREFIX/sbin]-  --libexecdir=DIR       program executables [EPREFIX/libexec]-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]-  --libdir=DIR           object code libraries [EPREFIX/lib]-  --includedir=DIR       C header files [PREFIX/include]-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]-  --infodir=DIR          info documentation [PREFIX/info]-  --mandir=DIR           man documentation [PREFIX/man]-_ACEOF--  cat <<\_ACEOF-_ACEOF-fi--if test -n "$ac_init_help"; then--  cat <<\_ACEOF--Optional Packages:-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)-  --with-hc=ARG           Use ARG as the path to a Haskell compiler-                          [default=autodetect]--Some influential environment variables:-  CC          C compiler command-  CFLAGS      C compiler flags-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a-              nonstandard directory <lib dir>-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have-              headers in a nonstandard directory <include dir>-  CPP         C preprocessor--Use these variables to override the choices made by `configure' or to help-it to find libraries and programs with nonstandard names/locations.--_ACEOF-fi--if test "$ac_init_help" = "recursive"; then-  # If there are subdirs, report their specific --help.-  ac_popdir=`pwd`-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue-    test -d $ac_dir || continue-    ac_builddir=.--if test "$ac_dir" != .; then-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`-  # A "../" for each directory in $ac_dir_suffix.-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`-else-  ac_dir_suffix= ac_top_builddir=-fi--case $srcdir in-  .)  # No --srcdir option.  We are building in place.-    ac_srcdir=.-    if test -z "$ac_top_builddir"; then-       ac_top_srcdir=.-    else-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`-    fi ;;-  [\\/]* | ?:[\\/]* )  # Absolute path.-    ac_srcdir=$srcdir$ac_dir_suffix;-    ac_top_srcdir=$srcdir ;;-  *) # Relative path.-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix-    ac_top_srcdir=$ac_top_builddir$srcdir ;;-esac--# Do not use `cd foo && pwd` to compute absolute paths, because-# the directories may not exist.-case `pwd` in-.) ac_abs_builddir="$ac_dir";;-*)-  case "$ac_dir" in-  .) ac_abs_builddir=`pwd`;;-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;-  *) ac_abs_builddir=`pwd`/"$ac_dir";;-  esac;;-esac-case $ac_abs_builddir in-.) ac_abs_top_builddir=${ac_top_builddir}.;;-*)-  case ${ac_top_builddir}. in-  .) ac_abs_top_builddir=$ac_abs_builddir;;-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;-  esac;;-esac-case $ac_abs_builddir in-.) ac_abs_srcdir=$ac_srcdir;;-*)-  case $ac_srcdir in-  .) ac_abs_srcdir=$ac_abs_builddir;;-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;-  esac;;-esac-case $ac_abs_builddir in-.) ac_abs_top_srcdir=$ac_top_srcdir;;-*)-  case $ac_top_srcdir in-  .) ac_abs_top_srcdir=$ac_abs_builddir;;-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;-  esac;;-esac--    cd $ac_dir-    # Check for guested configure; otherwise get Cygnus style configure.-    if test -f $ac_srcdir/configure.gnu; then-      echo-      $SHELL $ac_srcdir/configure.gnu  --help=recursive-    elif test -f $ac_srcdir/configure; then-      echo-      $SHELL $ac_srcdir/configure  --help=recursive-    elif test -f $ac_srcdir/configure.ac ||-	   test -f $ac_srcdir/configure.in; then-      echo-      $ac_configure --help-    else-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2-    fi-    cd "$ac_popdir"-  done-fi--test -n "$ac_init_help" && exit 0-if $ac_init_version; then-  cat <<\_ACEOF--Copyright (C) 2003 Free Software Foundation, Inc.-This configure script is free software; the Free Software Foundation-gives unlimited permission to copy, distribute and modify it.-_ACEOF-  exit 0-fi-exec 5>config.log-cat >&5 <<_ACEOF-This file contains any messages produced by compilers while-running configure, to aid debugging if configure makes a mistake.--It was created by $as_me, which was-generated by GNU Autoconf 2.59.  Invocation command line was--  $ $0 $@--_ACEOF-{-cat <<_ASUNAME-## --------- ##-## Platform. ##-## --------- ##--hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`-uname -m = `(uname -m) 2>/dev/null || echo unknown`-uname -r = `(uname -r) 2>/dev/null || echo unknown`-uname -s = `(uname -s) 2>/dev/null || echo unknown`-uname -v = `(uname -v) 2>/dev/null || echo unknown`--/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`--/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`--_ASUNAME--as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  echo "PATH: $as_dir"-done--} >&5--cat >&5 <<_ACEOF---## ----------- ##-## Core tests. ##-## ----------- ##--_ACEOF---# Keep a trace of the command line.-# Strip out --no-create and --no-recursion so they do not pile up.-# Strip out --silent because we don't want to record it for future runs.-# Also quote any args containing shell meta-characters.-# Make two passes to allow for proper duplicate-argument suppression.-ac_configure_args=-ac_configure_args0=-ac_configure_args1=-ac_sep=-ac_must_keep_next=false-for ac_pass in 1 2-do-  for ac_arg-  do-    case $ac_arg in-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \-    | -silent | --silent | --silen | --sile | --sil)-      continue ;;-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;-    esac-    case $ac_pass in-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;-    2)-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"-      if test $ac_must_keep_next = true; then-	ac_must_keep_next=false # Got value, back to normal.-      else-	case $ac_arg in-	  *=* | --config-cache | -C | -disable-* | --disable-* \-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \-	  | -with-* | --with-* | -without-* | --without-* | --x)-	    case "$ac_configure_args0 " in-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;-	    esac-	    ;;-	  -* ) ac_must_keep_next=true ;;-	esac-      fi-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"-      # Get rid of the leading space.-      ac_sep=" "-      ;;-    esac-  done-done-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }--# When interrupted or exit'd, cleanup temporary files, and complete-# config.log.  We remove comments because anyway the quotes in there-# would cause problems or look ugly.-# WARNING: Be sure not to use single quotes in there, as some shells,-# such as our DU 5.0 friend, will then `close' the trap.-trap 'exit_status=$?-  # Save into config.log some information that might help in debugging.-  {-    echo--    cat <<\_ASBOX-## ---------------- ##-## Cache variables. ##-## ---------------- ##-_ASBOX-    echo-    # The following way of writing the cache mishandles newlines in values,-{-  (set) 2>&1 |-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in-    *ac_space=\ *)-      sed -n \-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"-      ;;-    *)-      sed -n \-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"-      ;;-    esac;-}-    echo--    cat <<\_ASBOX-## ----------------- ##-## Output variables. ##-## ----------------- ##-_ASBOX-    echo-    for ac_var in $ac_subst_vars-    do-      eval ac_val=$`echo $ac_var`-      echo "$ac_var='"'"'$ac_val'"'"'"-    done | sort-    echo--    if test -n "$ac_subst_files"; then-      cat <<\_ASBOX-## ------------- ##-## Output files. ##-## ------------- ##-_ASBOX-      echo-      for ac_var in $ac_subst_files-      do-	eval ac_val=$`echo $ac_var`-	echo "$ac_var='"'"'$ac_val'"'"'"-      done | sort-      echo-    fi--    if test -s confdefs.h; then-      cat <<\_ASBOX-## ----------- ##-## confdefs.h. ##-## ----------- ##-_ASBOX-      echo-      sed "/^$/d" confdefs.h | sort-      echo-    fi-    test "$ac_signal" != 0 &&-      echo "$as_me: caught signal $ac_signal"-    echo "$as_me: exit $exit_status"-  } >&5-  rm -f core *.core &&-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&-    exit $exit_status-     ' 0-for ac_signal in 1 2 13 15; do-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal-done-ac_signal=0--# confdefs.h avoids OS command line length limits that DEFS can exceed.-rm -rf conftest* confdefs.h-# AIX cpp loses on an empty file, so make sure it contains at least a newline.-echo >confdefs.h--# Predefined preprocessor variables.--cat >>confdefs.h <<_ACEOF-#define PACKAGE_NAME "$PACKAGE_NAME"-_ACEOF---cat >>confdefs.h <<_ACEOF-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"-_ACEOF---cat >>confdefs.h <<_ACEOF-#define PACKAGE_VERSION "$PACKAGE_VERSION"-_ACEOF---cat >>confdefs.h <<_ACEOF-#define PACKAGE_STRING "$PACKAGE_STRING"-_ACEOF---cat >>confdefs.h <<_ACEOF-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"-_ACEOF---# Let the site file select an alternate cache file if it wants to.-# Prefer explicitly selected file to automatically selected ones.-if test -z "$CONFIG_SITE"; then-  if test "x$prefix" != xNONE; then-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"-  else-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"-  fi-fi-for ac_site_file in $CONFIG_SITE; do-  if test -r "$ac_site_file"; then-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5-echo "$as_me: loading site script $ac_site_file" >&6;}-    sed 's/^/| /' "$ac_site_file" >&5-    . "$ac_site_file"-  fi-done--if test -r "$cache_file"; then-  # Some versions of bash will fail to source /dev/null (special-  # files actually), so we avoid doing that.-  if test -f "$cache_file"; then-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5-echo "$as_me: loading cache $cache_file" >&6;}-    case $cache_file in-      [\\/]* | ?:[\\/]* ) . $cache_file;;-      *)                      . ./$cache_file;;-    esac-  fi-else-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5-echo "$as_me: creating cache $cache_file" >&6;}-  >$cache_file-fi--# Check that the precious variables saved in the cache have kept the same-# value.-ac_cache_corrupted=false-for ac_var in `(set) 2>&1 |-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do-  eval ac_old_set=\$ac_cv_env_${ac_var}_set-  eval ac_new_set=\$ac_env_${ac_var}_set-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"-  eval ac_new_val="\$ac_env_${ac_var}_value"-  case $ac_old_set,$ac_new_set in-    set,)-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}-      ac_cache_corrupted=: ;;-    ,set)-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}-      ac_cache_corrupted=: ;;-    ,);;-    *)-      if test "x$ac_old_val" != "x$ac_new_val"; then-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5-echo "$as_me:   former value:  $ac_old_val" >&2;}-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5-echo "$as_me:   current value: $ac_new_val" >&2;}-	ac_cache_corrupted=:-      fi;;-  esac-  # Pass precious variables to config.status.-  if test "$ac_new_set" = set; then-    case $ac_new_val in-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;-    *) ac_arg=$ac_var=$ac_new_val ;;-    esac-    case " $ac_configure_args " in-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;-    esac-  fi-done-if $ac_cache_corrupted; then-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5-echo "$as_me: error: changes in the environment can compromise the build" >&2;}-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}-   { (exit 1); exit 1; }; }-fi--ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu---------------------# Prepare to generate the config.h.in file-          ac_config_headers="$ac_config_headers cbits/config.h"---# this is arbitrary---#-# Looking for HC, stolen from $fptools-#--# Check whether --with-hc or --without-hc was given.-if test "${with_hc+set}" = set; then-  withval="$with_hc"-   WithGhc="$withval"-  if test "$WithGhc" = "nhc98"; then--cat >>confdefs.h <<\_ACEOF-#define __NHC__-_ACEOF--    SYMS="$SYMS -D__NHC__"-  fi--else--  if test "$GHC" = ""; then-    for ac_prog in ghc-do-  # Extract the first word of "$ac_prog", so it can be a program name with args.-set dummy $ac_prog; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_GHC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$GHC"; then-  ac_cv_prog_GHC="$GHC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_GHC="$ac_prog"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-GHC=$ac_cv_prog_GHC-if test -n "$GHC"; then-  echo "$as_me:$LINENO: result: $GHC" >&5-echo "${ECHO_T}$GHC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--  test -n "$GHC" && break-done--  fi-  if test "$GHC" = ""; then-    for ac_prog in nhc98-do-  # Extract the first word of "$ac_prog", so it can be a program name with args.-set dummy $ac_prog; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_GHC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$GHC"; then-  ac_cv_prog_GHC="$GHC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_GHC="$ac_prog"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-GHC=$ac_cv_prog_GHC-if test -n "$GHC"; then-  echo "$as_me:$LINENO: result: $GHC" >&5-echo "${ECHO_T}$GHC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--  test -n "$GHC" && break-done--  fi-  if test "$GHC" = "nhc98"; then--cat >>confdefs.h <<\_ACEOF-#define __NHC__-_ACEOF--    SYMS="$SYMS -D__NHC__"-  fi-  WithGhc=`which $GHC`--fi;---# code generation option for GHC (normally, we want to use `-fvia-C', however,-# with ghc-6.4 -fvia-C produces a buggy binary, dying with:-#       user error (Curses[-1]:keypad))-if test `$WithGhc --numeric-version 2> /dev/null` = "6.4"; then-  GhcCodegen="-fasm"-else-  GhcCodegen="-fvia-C"-fi---#-# Look for a ghc-pkg that matches our ghc version.-#-ghc_pkg_guess=`dirname $WithGhc`/ghc-pkg-`$WithGhc --numeric-version`-if "$ghc_pkg_guess" -l > /dev/null 2>&1; then-      matching_ghc_pkg=$ghc_pkg_guess-else-      matching_ghc_pkg=no-fi-if test x"$matching_ghc_pkg" = xno; then-    # Extract the first word of "ghc-pkg", so it can be a program name with args.-set dummy ghc-pkg; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_GhcPkgCmd+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$GhcPkgCmd"; then-  ac_cv_prog_GhcPkgCmd="$GhcPkgCmd" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_GhcPkgCmd="ghc-pkg"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-GhcPkgCmd=$ac_cv_prog_GhcPkgCmd-if test -n "$GhcPkgCmd"; then-  echo "$as_me:$LINENO: result: $GhcPkgCmd" >&5-echo "${ECHO_T}$GhcPkgCmd" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--else-    GhcPkgCmd=$matching_ghc_pkg-fi---# check if ghc-pkg has version >= or < 6.4-ghcPkgVersion=`$GhcPkgCmd --version | sed 's/GHC package manager version //'`-echo -e "$ghcPkgVersion\n6.3" | sort -c > /dev/null 2>&1-sorted=$?-if test $sorted -eq 0; then-  cp ./hscurses.conf.m4.in.before64 ./hscurses.conf.m4.in-else-  cp ./hscurses.conf.m4.in.64 ./hscurses.conf.m4.in-fi--#-# Look for a hsc2hs that matches our ghc version.-#-hsc2hs_guess=`dirname $WithGhc`/hsc2hs-if "$hsc2hs_guess" -V > /dev/null 2>&1; then-  Hsc2hsCmd=$hsc2hs_guess-else-  # Extract the first word of "hsc2hs", so it can be a program name with args.-set dummy hsc2hs; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_Hsc2hsCmd+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$Hsc2hsCmd"; then-  ac_cv_prog_Hsc2hsCmd="$Hsc2hsCmd" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_Hsc2hsCmd="hsc2hs"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-Hsc2hsCmd=$ac_cv_prog_Hsc2hsCmd-if test -n "$Hsc2hsCmd"; then-  echo "$as_me:$LINENO: result: $Hsc2hsCmd" >&5-echo "${ECHO_T}$Hsc2hsCmd" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--fi----#-# And some other tools-#-# AC_CHECK_PROG(AlexCmd,alex,alex)-# AC_CHECK_PROG(HappyCmd,happy,happy)-# Extract the first word of "gcc", so it can be a program name with args.-set dummy gcc; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_GccCmd+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$GccCmd"; then-  ac_cv_prog_GccCmd="$GccCmd" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_GccCmd="gcc"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-GccCmd=$ac_cv_prog_GccCmd-if test -n "$GccCmd"; then-  echo "$as_me:$LINENO: result: $GccCmd" >&5-echo "${ECHO_T}$GccCmd" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--# Extract the first word of "haddock", so it can be a program name with args.-set dummy haddock; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_HaddockCmd+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$HaddockCmd"; then-  ac_cv_prog_HaddockCmd="$HaddockCmd" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_HaddockCmd="haddock"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-HaddockCmd=$ac_cv_prog_HaddockCmd-if test -n "$HaddockCmd"; then-  echo "$as_me:$LINENO: result: $HaddockCmd" >&5-echo "${ECHO_T}$HaddockCmd" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi---# Extract the first word of "strip", so it can be a program name with args.-set dummy strip; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_STRIP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$STRIP"; then-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_STRIP="strip"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-STRIP=$ac_cv_prog_STRIP-if test -n "$STRIP"; then-  echo "$as_me:$LINENO: result: $STRIP" >&5-echo "${ECHO_T}$STRIP" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--# Extract the first word of "ld", so it can be a program name with args.-set dummy ld; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_path_LdCmd+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  case $LdCmd in-  [\\/]* | ?:[\\/]*)-  ac_cv_path_LdCmd="$LdCmd" # Let the user override the test with a path.-  ;;-  *)-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_path_LdCmd="$as_dir/$ac_word$ac_exec_ext"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--  ;;-esac-fi-LdCmd=$ac_cv_path_LdCmd--if test -n "$LdCmd"; then-  echo "$as_me:$LINENO: result: $LdCmd" >&5-echo "${ECHO_T}$LdCmd" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi---# check for -x flag to ld. stolen from $fptools---echo "$as_me:$LINENO: checking whether ld understands -x" >&5-echo $ECHO_N "checking whether ld understands -x... $ECHO_C" >&6-if test "${fptools_cv_ld_x+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else--echo 'foo() {}' > conftest.c-${CC-cc} -c conftest.c-if ${LdCmd} -r -x -o foo.o conftest.o; then-   fptools_cv_ld_x=yes-else-   fptools_cv_ld_x=no-fi-rm -rf conftest.c conftest.o foo.o--fi-echo "$as_me:$LINENO: result: $fptools_cv_ld_x" >&5-echo "${ECHO_T}$fptools_cv_ld_x" >&6-if test "$fptools_cv_ld_x" = yes; then-    LdXFlag=-x-else-    LdXFlag=-fi----#-# May as well check for this-#-if test -n "$ac_tool_prefix"; then-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.-set dummy ${ac_tool_prefix}ranlib; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_RANLIB+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$RANLIB"; then-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-RANLIB=$ac_cv_prog_RANLIB-if test -n "$RANLIB"; then-  echo "$as_me:$LINENO: result: $RANLIB" >&5-echo "${ECHO_T}$RANLIB" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--fi-if test -z "$ac_cv_prog_RANLIB"; then-  ac_ct_RANLIB=$RANLIB-  # Extract the first word of "ranlib", so it can be a program name with args.-set dummy ranlib; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$ac_ct_RANLIB"; then-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_ac_ct_RANLIB="ranlib"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"-fi-fi-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB-if test -n "$ac_ct_RANLIB"; then-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5-echo "${ECHO_T}$ac_ct_RANLIB" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--  RANLIB=$ac_ct_RANLIB-else-  RANLIB="$ac_cv_prog_RANLIB"-fi---#-# Curses. If you don't have wchar_t-aware ncurses (Debian package:-# libncursesw5-dev),  uncomment the first line and comment-out the-# two later.-#-# The shell variables should be added to, e.g., $LIBS-#-ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu-if test -n "$ac_tool_prefix"; then-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.-set dummy ${ac_tool_prefix}gcc; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_CC="${ac_tool_prefix}gcc"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--fi-if test -z "$ac_cv_prog_CC"; then-  ac_ct_CC=$CC-  # Extract the first word of "gcc", so it can be a program name with args.-set dummy gcc; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$ac_ct_CC"; then-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_ac_ct_CC="gcc"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-ac_ct_CC=$ac_cv_prog_ac_ct_CC-if test -n "$ac_ct_CC"; then-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5-echo "${ECHO_T}$ac_ct_CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--  CC=$ac_ct_CC-else-  CC="$ac_cv_prog_CC"-fi--if test -z "$CC"; then-  if test -n "$ac_tool_prefix"; then-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.-set dummy ${ac_tool_prefix}cc; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_CC="${ac_tool_prefix}cc"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--fi-if test -z "$ac_cv_prog_CC"; then-  ac_ct_CC=$CC-  # Extract the first word of "cc", so it can be a program name with args.-set dummy cc; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$ac_ct_CC"; then-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_ac_ct_CC="cc"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-ac_ct_CC=$ac_cv_prog_ac_ct_CC-if test -n "$ac_ct_CC"; then-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5-echo "${ECHO_T}$ac_ct_CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--  CC=$ac_ct_CC-else-  CC="$ac_cv_prog_CC"-fi--fi-if test -z "$CC"; then-  # Extract the first word of "cc", so it can be a program name with args.-set dummy cc; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-  ac_prog_rejected=no-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then-       ac_prog_rejected=yes-       continue-     fi-    ac_cv_prog_CC="cc"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--if test $ac_prog_rejected = yes; then-  # We found a bogon in the path, so make sure we never use it.-  set dummy $ac_cv_prog_CC-  shift-  if test $# != 0; then-    # We chose a different compiler from the bogus one.-    # However, it has the same basename, so the bogon will be chosen-    # first if we set CC to just the basename; use the full file name.-    shift-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"-  fi-fi-fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--fi-if test -z "$CC"; then-  if test -n "$ac_tool_prefix"; then-  for ac_prog in cl-  do-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.-set dummy $ac_tool_prefix$ac_prog; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--    test -n "$CC" && break-  done-fi-if test -z "$CC"; then-  ac_ct_CC=$CC-  for ac_prog in cl-do-  # Extract the first word of "$ac_prog", so it can be a program name with args.-set dummy $ac_prog; ac_word=$2-echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if test -n "$ac_ct_CC"; then-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for ac_exec_ext in '' $ac_executable_extensions; do-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_ac_ct_CC="$ac_prog"-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-done--fi-fi-ac_ct_CC=$ac_cv_prog_ac_ct_CC-if test -n "$ac_ct_CC"; then-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5-echo "${ECHO_T}$ac_ct_CC" >&6-else-  echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6-fi--  test -n "$ac_ct_CC" && break-done--  CC=$ac_ct_CC-fi--fi---test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH-See \`config.log' for more details." >&5-echo "$as_me: error: no acceptable C compiler found in \$PATH-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }--# Provide some information about the compiler.-echo "$as_me:$LINENO:" \-     "checking for C compiler version" >&5-ac_compiler=`set X $ac_compile; echo $2`-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5-  (eval $ac_compiler --version </dev/null >&5) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5-  (eval $ac_compiler -v </dev/null >&5) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5-  (eval $ac_compiler -V </dev/null >&5) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }--cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-ac_clean_files_save=$ac_clean_files-ac_clean_files="$ac_clean_files a.out a.exe b.out"-# Try to create an executable without -o first, disregard a.out.-# It will help us diagnose broken compilers, and finding out an intuition-# of exeext.-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5-  (eval $ac_link_default) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; then-  # Find the output, starting from the most likely.  This scheme is-# not robust to junk in `.', hence go to wildcards (a.*) only as a last-# resort.--# Be careful to initialize this variable, since it used to be cached.-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.-ac_cv_exeext=-# b.out is created by i960 compilers.-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out-do-  test -f "$ac_file" || continue-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )-	;;-    conftest.$ac_ext )-	# This is the source file.-	;;-    [ab].out )-	# We found the default executable, but exeext='' is most-	# certainly right.-	break;;-    *.* )-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`-	# FIXME: I believe we export ac_cv_exeext for Libtool,-	# but it would be cool to find out if it's true.  Does anybody-	# maintain Libtool? --akim.-	export ac_cv_exeext-	break;;-    * )-	break;;-  esac-done-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--{ { echo "$as_me:$LINENO: error: C compiler cannot create executables-See \`config.log' for more details." >&5-echo "$as_me: error: C compiler cannot create executables-See \`config.log' for more details." >&2;}-   { (exit 77); exit 77; }; }-fi--ac_exeext=$ac_cv_exeext-echo "$as_me:$LINENO: result: $ac_file" >&5-echo "${ECHO_T}$ac_file" >&6--# Check the compiler produces executables we can run.  If not, either-# the compiler is broken, or we cross compile.-echo "$as_me:$LINENO: checking whether the C compiler works" >&5-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0-# If not cross compiling, check that we can run a simple program.-if test "$cross_compiling" != yes; then-  if { ac_try='./$ac_file'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-    cross_compiling=no-  else-    if test "$cross_compiling" = maybe; then-	cross_compiling=yes-    else-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.-If you meant to cross compile, use \`--host'.-See \`config.log' for more details." >&5-echo "$as_me: error: cannot run C compiled programs.-If you meant to cross compile, use \`--host'.-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-    fi-  fi-fi-echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6--rm -f a.out a.exe conftest$ac_cv_exeext b.out-ac_clean_files=$ac_clean_files_save-# Check the compiler produces executables we can run.  If not, either-# the compiler is broken, or we cross compile.-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6-echo "$as_me:$LINENO: result: $cross_compiling" >&5-echo "${ECHO_T}$cross_compiling" >&6--echo "$as_me:$LINENO: checking for suffix of executables" >&5-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; then-  # If both `conftest.exe' and `conftest' are `present' (well, observable)-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will-# work properly (i.e., refer to `conftest.exe'), while it won't with-# `rm'.-for ac_file in conftest.exe conftest conftest.*; do-  test -f "$ac_file" || continue-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`-	  export ac_cv_exeext-	  break;;-    * ) break;;-  esac-done-else-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link-See \`config.log' for more details." >&5-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-fi--rm -f conftest$ac_cv_exeext-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5-echo "${ECHO_T}$ac_cv_exeext" >&6--rm -f conftest.$ac_ext-EXEEXT=$ac_cv_exeext-ac_exeext=$EXEEXT-echo "$as_me:$LINENO: checking for suffix of object files" >&5-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6-if test "${ac_cv_objext+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.o conftest.obj-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; then-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`-       break;;-  esac-done-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile-See \`config.log' for more details." >&5-echo "$as_me: error: cannot compute suffix of object files: cannot compile-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-fi--rm -f conftest.$ac_cv_objext conftest.$ac_ext-fi-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5-echo "${ECHO_T}$ac_cv_objext" >&6-OBJEXT=$ac_cv_objext-ac_objext=$OBJEXT-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6-if test "${ac_cv_c_compiler_gnu+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{-#ifndef __GNUC__-       choke me-#endif--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_compiler_gnu=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_compiler_gnu=no-fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-ac_cv_c_compiler_gnu=$ac_compiler_gnu--fi-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6-GCC=`test $ac_compiler_gnu = yes && echo yes`-ac_test_CFLAGS=${CFLAGS+set}-ac_save_CFLAGS=$CFLAGS-CFLAGS="-g"-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6-if test "${ac_cv_prog_cc_g+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_prog_cc_g=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_prog_cc_g=no-fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-fi-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6-if test "$ac_test_CFLAGS" = set; then-  CFLAGS=$ac_save_CFLAGS-elif test $ac_cv_prog_cc_g = yes; then-  if test "$GCC" = yes; then-    CFLAGS="-g -O2"-  else-    CFLAGS="-g"-  fi-else-  if test "$GCC" = yes; then-    CFLAGS="-O2"-  else-    CFLAGS=-  fi-fi-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6-if test "${ac_cv_prog_cc_stdc+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_cv_prog_cc_stdc=no-ac_save_CC=$CC-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <stdarg.h>-#include <stdio.h>-#include <sys/types.h>-#include <sys/stat.h>-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */-struct buf { int x; };-FILE * (*rcsopen) (struct buf *, struct stat *, int);-static char *e (p, i)-     char **p;-     int i;-{-  return p[i];-}-static char *f (char * (*g) (char **, int), char **p, ...)-{-  char *s;-  va_list v;-  va_start (v,p);-  s = g (p, va_arg (v,int));-  va_end (v);-  return s;-}--/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has-   function prototypes and stuff, but not '\xHH' hex character constants.-   These don't provoke an error unfortunately, instead are silently treated-   as 'x'.  The following induces an error, until -std1 is added to get-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an-   array size at least.  It's necessary to write '\x00'==0 to get something-   that's true only with -std1.  */-int osf4_cc_array ['\x00' == 0 ? 1 : -1];--int test (int i, double x);-struct s1 {int (*f) (int a);};-struct s2 {int (*f) (double a);};-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);-int argc;-char **argv;-int-main ()-{-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];-  ;-  return 0;-}-_ACEOF-# Don't try gcc -ansi; that turns off useful extensions and-# breaks some systems' header files.-# AIX			-qlanglvl=ansi-# Ultrix and OSF/1	-std1-# HP-UX 10.20 and later	-Ae-# HP-UX older versions	-Aa -D_HPUX_SOURCE-# SVR4			-Xc -D__EXTENSIONS__-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"-do-  CC="$ac_save_CC $ac_arg"-  rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_prog_cc_stdc=$ac_arg-break-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--fi-rm -f conftest.err conftest.$ac_objext-done-rm -f conftest.$ac_ext conftest.$ac_objext-CC=$ac_save_CC--fi--case "x$ac_cv_prog_cc_stdc" in-  x|xno)-    echo "$as_me:$LINENO: result: none needed" >&5-echo "${ECHO_T}none needed" >&6 ;;-  *)-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6-    CC="$CC $ac_cv_prog_cc_stdc" ;;-esac--# Some people use a C++ compiler to compile C.  Since we use `exit',-# in C++ we need to declare it.  In case someone uses the same compiler-# for both compiling C and C++ we need to have the C++ compiler decide-# the declaration of exit, since it's the most demanding environment.-cat >conftest.$ac_ext <<_ACEOF-#ifndef __cplusplus-  choke me-#endif-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  for ac_declaration in \-   '' \-   'extern "C" void std::exit (int) throw (); using std::exit;' \-   'extern "C" void std::exit (int); using std::exit;' \-   'extern "C" void exit (int) throw ();' \-   'extern "C" void exit (int);' \-   'void exit (int);'-do-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_declaration-#include <stdlib.h>-int-main ()-{-exit (42);-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  :-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--continue-fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_declaration-int-main ()-{-exit (42);-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  break-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-done-rm -f conftest*-if test -n "$ac_declaration"; then-  echo '#ifdef __cplusplus' >>confdefs.h-  echo $ac_declaration      >>confdefs.h-  echo '#endif'             >>confdefs.h-fi--else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu----echo "$as_me:$LINENO: checking for addnstr in -lcurses" >&5-echo $ECHO_N "checking for addnstr in -lcurses... $ECHO_C" >&6-if test "${ac_cv_lib_curses_addnstr+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-lcurses  $LIBS"-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--/* Override any gcc2 internal prototype to avoid an error.  */-#ifdef __cplusplus-extern "C"-#endif-/* We use char because int might match the return type of a gcc2-   builtin and then its argument prototype would still apply.  */-char addnstr ();-int-main ()-{-addnstr ();-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_lib_curses_addnstr=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_lib_curses_addnstr=no-fi-rm -f conftest.err conftest.$ac_objext \-      conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-echo "$as_me:$LINENO: result: $ac_cv_lib_curses_addnstr" >&5-echo "${ECHO_T}$ac_cv_lib_curses_addnstr" >&6-if test $ac_cv_lib_curses_addnstr = yes; then-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBCURSES 1-_ACEOF--  LIBS="-lcurses $LIBS"--fi---echo "$as_me:$LINENO: checking for addnstr in -lncurses" >&5-echo $ECHO_N "checking for addnstr in -lncurses... $ECHO_C" >&6-if test "${ac_cv_lib_ncurses_addnstr+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-lncurses  $LIBS"-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--/* Override any gcc2 internal prototype to avoid an error.  */-#ifdef __cplusplus-extern "C"-#endif-/* We use char because int might match the return type of a gcc2-   builtin and then its argument prototype would still apply.  */-char addnstr ();-int-main ()-{-addnstr ();-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_lib_ncurses_addnstr=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_lib_ncurses_addnstr=no-fi-rm -f conftest.err conftest.$ac_objext \-      conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-echo "$as_me:$LINENO: result: $ac_cv_lib_ncurses_addnstr" >&5-echo "${ECHO_T}$ac_cv_lib_ncurses_addnstr" >&6-if test $ac_cv_lib_ncurses_addnstr = yes; then-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBNCURSES 1-_ACEOF--  LIBS="-lncurses $LIBS"--fi---echo "$as_me:$LINENO: checking for waddnwstr in -lncursesw" >&5-echo $ECHO_N "checking for waddnwstr in -lncursesw... $ECHO_C" >&6-if test "${ac_cv_lib_ncursesw_waddnwstr+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-lncursesw  $LIBS"-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--/* Override any gcc2 internal prototype to avoid an error.  */-#ifdef __cplusplus-extern "C"-#endif-/* We use char because int might match the return type of a gcc2-   builtin and then its argument prototype would still apply.  */-char waddnwstr ();-int-main ()-{-waddnwstr ();-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_lib_ncursesw_waddnwstr=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_lib_ncursesw_waddnwstr=no-fi-rm -f conftest.err conftest.$ac_objext \-      conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-echo "$as_me:$LINENO: result: $ac_cv_lib_ncursesw_waddnwstr" >&5-echo "${ECHO_T}$ac_cv_lib_ncursesw_waddnwstr" >&6-if test $ac_cv_lib_ncursesw_waddnwstr = yes; then-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBNCURSESW 1-_ACEOF--  LIBS="-lncursesw $LIBS"--fi----echo "$as_me:$LINENO: checking for iconv in -liconv" >&5-echo $ECHO_N "checking for iconv in -liconv... $ECHO_C" >&6-if test "${ac_cv_lib_iconv_iconv+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-liconv  $LIBS"-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--/* Override any gcc2 internal prototype to avoid an error.  */-#ifdef __cplusplus-extern "C"-#endif-/* We use char because int might match the return type of a gcc2-   builtin and then its argument prototype would still apply.  */-char iconv ();-int-main ()-{-iconv ();-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_lib_iconv_iconv=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_lib_iconv_iconv=no-fi-rm -f conftest.err conftest.$ac_objext \-      conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_iconv" >&5-echo "${ECHO_T}$ac_cv_lib_iconv_iconv" >&6-if test $ac_cv_lib_iconv_iconv = yes; then-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBICONV 1-_ACEOF--  LIBS="-liconv $LIBS"--fi---echo "$as_me:$LINENO: checking for libiconv in -liconv" >&5-echo $ECHO_N "checking for libiconv in -liconv... $ECHO_C" >&6-if test "${ac_cv_lib_iconv_libiconv+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-liconv  $LIBS"-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--/* Override any gcc2 internal prototype to avoid an error.  */-#ifdef __cplusplus-extern "C"-#endif-/* We use char because int might match the return type of a gcc2-   builtin and then its argument prototype would still apply.  */-char libiconv ();-int-main ()-{-libiconv ();-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_lib_iconv_libiconv=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_lib_iconv_libiconv=no-fi-rm -f conftest.err conftest.$ac_objext \-      conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_libiconv" >&5-echo "${ECHO_T}$ac_cv_lib_iconv_libiconv" >&6-if test $ac_cv_lib_iconv_libiconv = yes; then-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBICONV 1-_ACEOF--  LIBS="-liconv $LIBS"--fi---# Bit weird. On OpenBSD you need the 'lib' suffix to iconv functions, it seems--for ac_func in libiconv-do-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`-echo "$as_me:$LINENO: checking for $ac_func" >&5-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6-if eval "test \"\${$as_ac_var+set}\" = set"; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */-#define $ac_func innocuous_$ac_func--/* System header to define __stub macros and hopefully few prototypes,-    which can conflict with char $ac_func (); below.-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since-    <limits.h> exists even on freestanding compilers.  */--#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif--#undef $ac_func--/* Override any gcc2 internal prototype to avoid an error.  */-#ifdef __cplusplus-extern "C"-{-#endif-/* We use char because int might match the return type of a gcc2-   builtin and then its argument prototype would still apply.  */-char $ac_func ();-/* The GNU C library defines this for functions which it implements-    to always fail with ENOSYS.  Some functions are actually named-    something starting with __ and the normal name is an alias.  */-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)-choke me-#else-char (*f) () = $ac_func;-#endif-#ifdef __cplusplus-}-#endif--int-main ()-{-return f != $ac_func;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  eval "$as_ac_var=yes"-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--eval "$as_ac_var=no"-fi-rm -f conftest.err conftest.$ac_objext \-      conftest$ac_exeext conftest.$ac_ext-fi-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6-if test `eval echo '${'$as_ac_var'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1-_ACEOF--cat >>confdefs.h <<\_ACEOF-#define ICONV_LIB_PREFIX 1-_ACEOF--fi-done---# On linux we need to call doupdate() after endwin() to restore the term-if uname -s | grep Linux > /dev/null 2>&1 ; then--cat >>confdefs.h <<\_ACEOF-#define NCURSES_UPDATE_AFTER_END 1-_ACEOF--fi--# some special libs need to be set for package.conf files-if echo "$LIBS" | grep iconv > /dev/null 2>&1 ; then-    ICONV=iconv-fi--if (echo "$LIBS" | grep ncursesw) >/dev/null 2>&1 ; then-    CURSES=ncursesw-elif (echo "$LIBS" | grep ncurses) >/dev/null 2>&1 ; then-    CURSES=ncurses-else-    CURSES=curses-fi----#-# Specific headers to check for-#-ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6-# On Suns, sometimes $CPP names a directory.-if test -n "$CPP" && test -d "$CPP"; then-  CPP=-fi-if test -z "$CPP"; then-  if test "${ac_cv_prog_CPP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-      # Double quotes because CPP needs to be expanded-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"-    do-      ac_preproc_ok=false-for ac_c_preproc_warn_flag in '' yes-do-  # Use a header file that comes with gcc, so configuring glibc-  # with a fresh cross-compiler works.-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since-  # <limits.h> exists even on freestanding compilers.-  # On the NeXT, cc -E runs the code through the compiler's parser,-  # not just through cpp. "Syntax error" is here to catch this case.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif-		     Syntax error-_ACEOF-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null; then-  if test -s conftest.err; then-    ac_cpp_err=$ac_c_preproc_warn_flag-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag-  else-    ac_cpp_err=-  fi-else-  ac_cpp_err=yes-fi-if test -z "$ac_cpp_err"; then-  :-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Broken: fails on valid input.-continue-fi-rm -f conftest.err conftest.$ac_ext--  # OK, works on sane cases.  Now check whether non-existent headers-  # can be detected and how.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <ac_nonexistent.h>-_ACEOF-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null; then-  if test -s conftest.err; then-    ac_cpp_err=$ac_c_preproc_warn_flag-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag-  else-    ac_cpp_err=-  fi-else-  ac_cpp_err=yes-fi-if test -z "$ac_cpp_err"; then-  # Broken: success on invalid input.-continue-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Passes both tests.-ac_preproc_ok=:-break-fi-rm -f conftest.err conftest.$ac_ext--done-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.-rm -f conftest.err conftest.$ac_ext-if $ac_preproc_ok; then-  break-fi--    done-    ac_cv_prog_CPP=$CPP--fi-  CPP=$ac_cv_prog_CPP-else-  ac_cv_prog_CPP=$CPP-fi-echo "$as_me:$LINENO: result: $CPP" >&5-echo "${ECHO_T}$CPP" >&6-ac_preproc_ok=false-for ac_c_preproc_warn_flag in '' yes-do-  # Use a header file that comes with gcc, so configuring glibc-  # with a fresh cross-compiler works.-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since-  # <limits.h> exists even on freestanding compilers.-  # On the NeXT, cc -E runs the code through the compiler's parser,-  # not just through cpp. "Syntax error" is here to catch this case.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif-		     Syntax error-_ACEOF-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null; then-  if test -s conftest.err; then-    ac_cpp_err=$ac_c_preproc_warn_flag-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag-  else-    ac_cpp_err=-  fi-else-  ac_cpp_err=yes-fi-if test -z "$ac_cpp_err"; then-  :-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Broken: fails on valid input.-continue-fi-rm -f conftest.err conftest.$ac_ext--  # OK, works on sane cases.  Now check whether non-existent headers-  # can be detected and how.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <ac_nonexistent.h>-_ACEOF-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null; then-  if test -s conftest.err; then-    ac_cpp_err=$ac_c_preproc_warn_flag-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag-  else-    ac_cpp_err=-  fi-else-  ac_cpp_err=yes-fi-if test -z "$ac_cpp_err"; then-  # Broken: success on invalid input.-continue-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Passes both tests.-ac_preproc_ok=:-break-fi-rm -f conftest.err conftest.$ac_ext--done-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.-rm -f conftest.err conftest.$ac_ext-if $ac_preproc_ok; then-  :-else-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check-See \`config.log' for more details." >&5-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-fi--ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu---echo "$as_me:$LINENO: checking for egrep" >&5-echo $ECHO_N "checking for egrep... $ECHO_C" >&6-if test "${ac_cv_prog_egrep+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1-    then ac_cv_prog_egrep='grep -E'-    else ac_cv_prog_egrep='egrep'-    fi-fi-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5-echo "${ECHO_T}$ac_cv_prog_egrep" >&6- EGREP=$ac_cv_prog_egrep---echo "$as_me:$LINENO: checking for ANSI C header files" >&5-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6-if test "${ac_cv_header_stdc+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <stdlib.h>-#include <stdarg.h>-#include <string.h>-#include <float.h>--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_cv_header_stdc=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_cv_header_stdc=no-fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext--if test $ac_cv_header_stdc = yes; then-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <string.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "memchr" >/dev/null 2>&1; then-  :-else-  ac_cv_header_stdc=no-fi-rm -f conftest*--fi--if test $ac_cv_header_stdc = yes; then-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <stdlib.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "free" >/dev/null 2>&1; then-  :-else-  ac_cv_header_stdc=no-fi-rm -f conftest*--fi--if test $ac_cv_header_stdc = yes; then-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.-  if test "$cross_compiling" = yes; then-  :-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <ctype.h>-#if ((' ' & 0x0FF) == 0x020)-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))-#else-# define ISLOWER(c) \-		   (('a' <= (c) && (c) <= 'i') \-		     || ('j' <= (c) && (c) <= 'r') \-		     || ('s' <= (c) && (c) <= 'z'))-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))-#endif--#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))-int-main ()-{-  int i;-  for (i = 0; i < 256; i++)-    if (XOR (islower (i), ISLOWER (i))-	|| toupper (i) != TOUPPER (i))-      exit(2);-  exit (0);-}-_ACEOF-rm -f conftest$ac_exeext-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5-  (eval $ac_link) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  :-else-  echo "$as_me: program exited with status $ac_status" >&5-echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--( exit $ac_status )-ac_cv_header_stdc=no-fi-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext-fi-fi-fi-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5-echo "${ECHO_T}$ac_cv_header_stdc" >&6-if test $ac_cv_header_stdc = yes; then--cat >>confdefs.h <<\_ACEOF-#define STDC_HEADERS 1-_ACEOF--fi--# On IRIX 5.3, sys/types and inttypes.h are conflicting.----------for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \-		  inttypes.h stdint.h unistd.h-do-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`-echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6-if eval "test \"\${$as_ac_Header+set}\" = set"; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default--#include <$ac_header>-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  eval "$as_ac_Header=yes"-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--eval "$as_ac_Header=no"-fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-fi-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6-if test `eval echo '${'$as_ac_Header'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done------------for ac_header in iconv.h curses.h ncurses.h ncursesw/ncurses.h locale.h langinfo.h wchar.h limits.h signal.h-do-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`-if eval "test \"\${$as_ac_Header+set}\" = set"; then-  echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6-if eval "test \"\${$as_ac_Header+set}\" = set"; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-fi-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6-else-  # Is the header compilable?-echo "$as_me:$LINENO: checking $ac_header usability" >&5-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-#include <$ac_header>-_ACEOF-rm -f conftest.$ac_objext-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5-  (eval $ac_compile) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } &&-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; } &&-	 { ac_try='test -s conftest.$ac_objext'-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5-  (eval $ac_try) 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  ac_header_compiler=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--ac_header_compiler=no-fi-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5-echo "${ECHO_T}$ac_header_compiler" >&6--# Is the header present?-echo "$as_me:$LINENO: checking $ac_header presence" >&5-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <$ac_header>-_ACEOF-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null; then-  if test -s conftest.err; then-    ac_cpp_err=$ac_c_preproc_warn_flag-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag-  else-    ac_cpp_err=-  fi-else-  ac_cpp_err=yes-fi-if test -z "$ac_cpp_err"; then-  ac_header_preproc=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  ac_header_preproc=no-fi-rm -f conftest.err conftest.$ac_ext-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5-echo "${ECHO_T}$ac_header_preproc" >&6--# So?  What about this header?-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in-  yes:no: )-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}-    ac_header_preproc=yes-    ;;-  no:yes:* )-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}-    (-      cat <<\_ASBOX-## ------------------------------------------ ##-## Report this to the AC_PACKAGE_NAME lists.  ##-## ------------------------------------------ ##-_ASBOX-    ) |-      sed "s/^/$as_me: WARNING:     /" >&2-    ;;-esac-echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6-if eval "test \"\${$as_ac_Header+set}\" = set"; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  eval "$as_ac_Header=\$ac_header_preproc"-fi-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6--fi-if test `eval echo '${'$as_ac_Header'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done-----current_directory=`pwd`---                              ac_config_files="$ac_config_files mk/config.mk hscurses.conf.m4 hscurses.buildinfo"--cat >confcache <<\_ACEOF-# This file is a shell script that caches the results of configure-# tests run on this system so they can be shared between configure-# scripts and configure runs, see configure's option --config-cache.-# It is not useful on other systems.  If it contains results you don't-# want to keep, you may remove or edit it.-#-# config.status only pays attention to the cache file if you give it-# the --recheck option to rerun configure.-#-# `ac_cv_env_foo' variables (set or unset) will be overridden when-# loading this file, other *unset* `ac_cv_foo' will be assigned the-# following values.--_ACEOF--# The following way of writing the cache mishandles newlines in values,-# but we know of no workaround that is simple, portable, and efficient.-# So, don't put newlines in cache variables' values.-# Ultrix sh set writes to stderr and can't be redirected directly,-# and sets the high bit in the cache file unless we assign to the vars.-{-  (set) 2>&1 |-    case `(ac_space=' '; set | grep ac_space) 2>&1` in-    *ac_space=\ *)-      # `set' does not quote correctly, so add quotes (double-quote-      # substitution turns \\\\ into \\, and sed turns \\ into \).-      sed -n \-	"s/'/'\\\\''/g;-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"-      ;;-    *)-      # `set' quotes correctly as required by POSIX, so do not add quotes.-      sed -n \-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"-      ;;-    esac;-} |-  sed '-     t clear-     : clear-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/-     t end-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/-     : end' >>confcache-if diff $cache_file confcache >/dev/null 2>&1; then :; else-  if test -w $cache_file; then-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"-    cat confcache >$cache_file-  else-    echo "not updating unwritable cache $cache_file"-  fi-fi-rm -f confcache--test "x$prefix" = xNONE && prefix=$ac_default_prefix-# Let make expand exec_prefix.-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'--# VPATH may cause trouble with some makes, so we remove $(srcdir),-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and-# trailing colons and then remove the whole line if VPATH becomes empty-# (actually we leave an empty line to preserve line numbers).-if test "x$srcdir" = x.; then-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{-s/:*\$(srcdir):*/:/;-s/:*\${srcdir}:*/:/;-s/:*@srcdir@:*/:/;-s/^\([^=]*=[	 ]*\):*/\1/;-s/:*$//;-s/^[^=]*=[	 ]*$//;-}'-fi--DEFS=-DHAVE_CONFIG_H--ac_libobjs=-ac_ltlibobjs=-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue-  # 1. Remove the extension, and $U if already installed.-  ac_i=`echo "$ac_i" |-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`-  # 2. Add them.-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'-done-LIBOBJS=$ac_libobjs--LTLIBOBJS=$ac_ltlibobjs----: ${CONFIG_STATUS=./config.status}-ac_clean_files_save=$ac_clean_files-ac_clean_files="$ac_clean_files $CONFIG_STATUS"-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5-echo "$as_me: creating $CONFIG_STATUS" >&6;}-cat >$CONFIG_STATUS <<_ACEOF-#! $SHELL-# Generated by $as_me.-# Run this file to recreate the current configuration.-# Compiler output produced by configure, useful for debugging-# configure, is in config.log if it exists.--debug=false-ac_cs_recheck=false-ac_cs_silent=false-SHELL=\${CONFIG_SHELL-$SHELL}-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF-## --------------------- ##-## M4sh Initialization.  ##-## --------------------- ##--# Be Bourne compatible-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then-  emulate sh-  NULLCMD=:-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which-  # is contrary to our usage.  Disable this feature.-  alias -g '${1+"$@"}'='"$@"'-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then-  set -o posix-fi-DUALCASE=1; export DUALCASE # for MKS sh--# Support unset when possible.-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then-  as_unset=unset-else-  as_unset=false-fi---# Work around bugs in pre-3.0 UWIN ksh.-$as_unset ENV MAIL MAILPATH-PS1='$ '-PS2='> '-PS4='+ '--# NLS nuisances.-for as_var in \-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \-  LC_TELEPHONE LC_TIME-do-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then-    eval $as_var=C; export $as_var-  else-    $as_unset $as_var-  fi-done--# Required to use basename.-if expr a : '\(a\)' >/dev/null 2>&1; then-  as_expr=expr-else-  as_expr=false-fi--if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then-  as_basename=basename-else-  as_basename=false-fi---# Name of the executable.-as_me=`$as_basename "$0" ||-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)$' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X/"$0" |-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }-  	  /^X\/\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`---# PATH needs CR, and LINENO needs CR and PATH.-# Avoid depending upon Character Ranges.-as_cr_letters='abcdefghijklmnopqrstuvwxyz'-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'-as_cr_Letters=$as_cr_letters$as_cr_LETTERS-as_cr_digits='0123456789'-as_cr_alnum=$as_cr_Letters$as_cr_digits--# The user is always right.-if test "${PATH_SEPARATOR+set}" != set; then-  echo "#! /bin/sh" >conf$$.sh-  echo  "exit 0"   >>conf$$.sh-  chmod +x conf$$.sh-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then-    PATH_SEPARATOR=';'-  else-    PATH_SEPARATOR=:-  fi-  rm -f conf$$.sh-fi---  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {-  # Find who we are.  Look in the path if we contain no path at all-  # relative or not.-  case $0 in-    *[\\/]* ) as_myself=$0 ;;-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break-done--       ;;-  esac-  # We did not find ourselves, most probably we were run as `sh COMMAND'-  # in which case we are not to be found in the path.-  if test "x$as_myself" = x; then-    as_myself=$0-  fi-  if test ! -f "$as_myself"; then-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}-   { (exit 1); exit 1; }; }-  fi-  case $CONFIG_SHELL in-  '')-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  for as_base in sh bash ksh sh5; do-	 case $as_dir in-	 /*)-	   if ("$as_dir/$as_base" -c '-  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }-	     CONFIG_SHELL=$as_dir/$as_base-	     export CONFIG_SHELL-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}-	   fi;;-	 esac-       done-done-;;-  esac--  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO-  # uniformly replaced by the line number.  The first 'sed' inserts a-  # line-number line before each line; the second 'sed' does the real-  # work.  The second script uses 'N' to pair each line-number line-  # with the numbered line, and appends trailing '-' during-  # substitution so that $LINENO is not a special case at line end.-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)-  sed '=' <$as_myself |-    sed '-      N-      s,$,-,-      : loop-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,-      t loop-      s,-$,,-      s,^['$as_cr_digits']*\n,,-    ' >$as_me.lineno &&-  chmod +x $as_me.lineno ||-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}-   { (exit 1); exit 1; }; }--  # Don't try to exec as it changes $[0], causing all sort of problems-  # (the dirname of $[0] is not the place where we might find the-  # original and so on.  Autoconf is especially sensible to this).-  . ./$as_me.lineno-  # Exit status is that of the last command.-  exit-}---case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in-  *c*,-n*) ECHO_N= ECHO_C='-' ECHO_T='	' ;;-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;-esac--if expr a : '\(a\)' >/dev/null 2>&1; then-  as_expr=expr-else-  as_expr=false-fi--rm -f conf$$ conf$$.exe conf$$.file-echo >conf$$.file-if ln -s conf$$.file conf$$ 2>/dev/null; then-  # We could just check for DJGPP; but this test a) works b) is more generic-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).-  if test -f conf$$.exe; then-    # Don't use ln at all; we don't have any links-    as_ln_s='cp -p'-  else-    as_ln_s='ln -s'-  fi-elif ln conf$$.file conf$$ 2>/dev/null; then-  as_ln_s=ln-else-  as_ln_s='cp -p'-fi-rm -f conf$$ conf$$.exe conf$$.file--if mkdir -p . 2>/dev/null; then-  as_mkdir_p=:-else-  test -d ./-p && rmdir ./-p-  as_mkdir_p=false-fi--as_executable_p="test -f"--# Sed expression to map a string onto a valid CPP name.-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"--# Sed expression to map a string onto a valid variable name.-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"---# IFS-# We need space, tab and new line, in precisely that order.-as_nl='-'-IFS=" 	$as_nl"--# CDPATH.-$as_unset CDPATH--exec 6>&1--# Open the log real soon, to keep \$[0] and so on meaningful, and to-# report actual input values of CONFIG_FILES etc. instead of their-# values after options handling.  Logging --version etc. is OK.-exec 5>>config.log-{-  echo-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX-## Running $as_me. ##-_ASBOX-} >&5-cat >&5 <<_CSEOF--This file was extended by $as_me, which was-generated by GNU Autoconf 2.59.  Invocation command line was--  CONFIG_FILES    = $CONFIG_FILES-  CONFIG_HEADERS  = $CONFIG_HEADERS-  CONFIG_LINKS    = $CONFIG_LINKS-  CONFIG_COMMANDS = $CONFIG_COMMANDS-  $ $0 $@--_CSEOF-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5-echo >&5-_ACEOF--# Files that config.status was made for.-if test -n "$ac_config_files"; then-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS-fi--if test -n "$ac_config_headers"; then-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS-fi--if test -n "$ac_config_links"; then-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS-fi--if test -n "$ac_config_commands"; then-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS-fi--cat >>$CONFIG_STATUS <<\_ACEOF--ac_cs_usage="\-\`$as_me' instantiates files from templates according to the-current configuration.--Usage: $0 [OPTIONS] [FILE]...--  -h, --help       print this help, then exit-  -V, --version    print version number, then exit-  -q, --quiet      do not print progress messages-  -d, --debug      don't remove temporary files-      --recheck    update $as_me by reconfiguring in the same conditions-  --file=FILE[:TEMPLATE]-		   instantiate the configuration file FILE-  --header=FILE[:TEMPLATE]-		   instantiate the configuration header FILE--Configuration files:-$config_files--Configuration headers:-$config_headers--Report bugs to <bug-autoconf@gnu.org>."-_ACEOF--cat >>$CONFIG_STATUS <<_ACEOF-ac_cs_version="\\-config.status-configured by $0, generated by GNU Autoconf 2.59,-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"--Copyright (C) 2003 Free Software Foundation, Inc.-This config.status script is free software; the Free Software Foundation-gives unlimited permission to copy, distribute and modify it."-srcdir=$srcdir-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF-# If no file are specified by the user, then we need to provide default-# value.  By we need to know if files were specified by the user.-ac_need_defaults=:-while test $# != 0-do-  case $1 in-  --*=*)-    ac_option=`expr "x$1" : 'x\([^=]*\)='`-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`-    ac_shift=:-    ;;-  -*)-    ac_option=$1-    ac_optarg=$2-    ac_shift=shift-    ;;-  *) # This is not an option, so the user has probably given explicit-     # arguments.-     ac_option=$1-     ac_need_defaults=false;;-  esac--  case $ac_option in-  # Handling of the options.-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)-    ac_cs_recheck=: ;;-  --version | --vers* | -V )-    echo "$ac_cs_version"; exit 0 ;;-  --he | --h)-    # Conflict between --help and --header-    { { echo "$as_me:$LINENO: error: ambiguous option: $1-Try \`$0 --help' for more information." >&5-echo "$as_me: error: ambiguous option: $1-Try \`$0 --help' for more information." >&2;}-   { (exit 1); exit 1; }; };;-  --help | --hel | -h )-    echo "$ac_cs_usage"; exit 0 ;;-  --debug | --d* | -d )-    debug=: ;;-  --file | --fil | --fi | --f )-    $ac_shift-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"-    ac_need_defaults=false;;-  --header | --heade | --head | --hea )-    $ac_shift-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"-    ac_need_defaults=false;;-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \-  | -silent | --silent | --silen | --sile | --sil | --si | --s)-    ac_cs_silent=: ;;--  # This is an error.-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1-Try \`$0 --help' for more information." >&5-echo "$as_me: error: unrecognized option: $1-Try \`$0 --help' for more information." >&2;}-   { (exit 1); exit 1; }; } ;;--  *) ac_config_targets="$ac_config_targets $1" ;;--  esac-  shift-done--ac_configure_extra_args=--if $ac_cs_silent; then-  exec 6>/dev/null-  ac_configure_extra_args="$ac_configure_extra_args --silent"-fi--_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF-if \$ac_cs_recheck; then-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion-fi--_ACEOF------cat >>$CONFIG_STATUS <<\_ACEOF-for ac_config_target in $ac_config_targets-do-  case "$ac_config_target" in-  # Handling of arguments.-  "mk/config.mk" ) CONFIG_FILES="$CONFIG_FILES mk/config.mk" ;;-  "hscurses.conf.m4" ) CONFIG_FILES="$CONFIG_FILES hscurses.conf.m4" ;;-  "hscurses.buildinfo" ) CONFIG_FILES="$CONFIG_FILES hscurses.buildinfo" ;;-  "cbits/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS cbits/config.h" ;;-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}-   { (exit 1); exit 1; }; };;-  esac-done--# If the user did not use the arguments to specify the items to instantiate,-# then the envvar interface is used.  Set only those that are not.-# We use the long form for the default assignment because of an extremely-# bizarre bug on SunOS 4.1.3.-if $ac_need_defaults; then-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers-fi--# Have a temporary directory for convenience.  Make it in the build tree-# simply because there is no reason to put it here, and in addition,-# creating and moving files from /tmp can sometimes cause problems.-# Create a temporary directory, and hook for its removal unless debugging.-$debug ||-{-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0-  trap '{ (exit 1); exit 1; }' 1 2 13 15-}--# Create a (secure) tmp directory for tmp files.--{-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&-  test -n "$tmp" && test -d "$tmp"-}  ||-{-  tmp=./confstat$$-$RANDOM-  (umask 077 && mkdir $tmp)-} ||-{-   echo "$me: cannot create a temporary directory in ." >&2-   { (exit 1); exit 1; }-}--_ACEOF--cat >>$CONFIG_STATUS <<_ACEOF--#-# CONFIG_FILES section.-#--# No need to generate the scripts if there are no CONFIG_FILES.-# This happens for instance when ./config.status config.h-if test -n "\$CONFIG_FILES"; then-  # Protect against being on the right side of a sed subst in config.status.-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF-s,@SHELL@,$SHELL,;t t-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t-s,@exec_prefix@,$exec_prefix,;t t-s,@prefix@,$prefix,;t t-s,@program_transform_name@,$program_transform_name,;t t-s,@bindir@,$bindir,;t t-s,@sbindir@,$sbindir,;t t-s,@libexecdir@,$libexecdir,;t t-s,@datadir@,$datadir,;t t-s,@sysconfdir@,$sysconfdir,;t t-s,@sharedstatedir@,$sharedstatedir,;t t-s,@localstatedir@,$localstatedir,;t t-s,@libdir@,$libdir,;t t-s,@includedir@,$includedir,;t t-s,@oldincludedir@,$oldincludedir,;t t-s,@infodir@,$infodir,;t t-s,@mandir@,$mandir,;t t-s,@build_alias@,$build_alias,;t t-s,@host_alias@,$host_alias,;t t-s,@target_alias@,$target_alias,;t t-s,@DEFS@,$DEFS,;t t-s,@ECHO_C@,$ECHO_C,;t t-s,@ECHO_N@,$ECHO_N,;t t-s,@ECHO_T@,$ECHO_T,;t t-s,@LIBS@,$LIBS,;t t-s,@GHC@,$GHC,;t t-s,@WithGhc@,$WithGhc,;t t-s,@GhcCodegen@,$GhcCodegen,;t t-s,@GhcPkgCmd@,$GhcPkgCmd,;t t-s,@Hsc2hsCmd@,$Hsc2hsCmd,;t t-s,@GccCmd@,$GccCmd,;t t-s,@HaddockCmd@,$HaddockCmd,;t t-s,@STRIP@,$STRIP,;t t-s,@LdCmd@,$LdCmd,;t t-s,@LdXFlag@,$LdXFlag,;t t-s,@RANLIB@,$RANLIB,;t t-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t-s,@CC@,$CC,;t t-s,@CFLAGS@,$CFLAGS,;t t-s,@LDFLAGS@,$LDFLAGS,;t t-s,@CPPFLAGS@,$CPPFLAGS,;t t-s,@ac_ct_CC@,$ac_ct_CC,;t t-s,@EXEEXT@,$EXEEXT,;t t-s,@OBJEXT@,$OBJEXT,;t t-s,@ICONV@,$ICONV,;t t-s,@CURSES@,$CURSES,;t t-s,@CPP@,$CPP,;t t-s,@EGREP@,$EGREP,;t t-s,@SYMS@,$SYMS,;t t-s,@current_directory@,$current_directory,;t t-s,@LIBOBJS@,$LIBOBJS,;t t-s,@LTLIBOBJS@,$LTLIBOBJS,;t t-CEOF--_ACEOF--  cat >>$CONFIG_STATUS <<\_ACEOF-  # Split the substitutions into bite-sized pieces for seds with-  # small command number limits, like on Digital OSF/1 and HP-UX.-  ac_max_sed_lines=48-  ac_sed_frag=1 # Number of current file.-  ac_beg=1 # First line for current file.-  ac_end=$ac_max_sed_lines # Line after last line for current file.-  ac_more_lines=:-  ac_sed_cmds=-  while $ac_more_lines; do-    if test $ac_beg -gt 1; then-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag-    else-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag-    fi-    if test ! -s $tmp/subs.frag; then-      ac_more_lines=false-    else-      # The purpose of the label and of the branching condition is to-      # speed up the sed processing (if there are no `@' at all, there-      # is no need to browse any of the substitutions).-      # These are the two extra sed commands mentioned above.-      (echo ':t-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed-      if test -z "$ac_sed_cmds"; then-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"-      else-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"-      fi-      ac_sed_frag=`expr $ac_sed_frag + 1`-      ac_beg=$ac_end-      ac_end=`expr $ac_end + $ac_max_sed_lines`-    fi-  done-  if test -z "$ac_sed_cmds"; then-    ac_sed_cmds=cat-  fi-fi # test -n "$CONFIG_FILES"--_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".-  case $ac_file in-  - | *:- | *:-:* ) # input from stdin-	cat >$tmp/stdin-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;-  * )   ac_file_in=$ac_file.in ;;-  esac--  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$ac_file" : 'X\(//\)[^/]' \| \-	 X"$ac_file" : 'X\(//\)$' \| \-	 X"$ac_file" : 'X\(/\)' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X"$ac_file" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }-  	  /^X\(\/\/\)$/{ s//\1/; q; }-  	  /^X\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`-  { if $as_mkdir_p; then-    mkdir -p "$ac_dir"-  else-    as_dir="$ac_dir"-    as_dirs=-    while test ! -d "$as_dir"; do-      as_dirs="$as_dir $as_dirs"-      as_dir=`(dirname "$as_dir") 2>/dev/null ||-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$as_dir" : 'X\(//\)[^/]' \| \-	 X"$as_dir" : 'X\(//\)$' \| \-	 X"$as_dir" : 'X\(/\)' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X"$as_dir" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }-  	  /^X\(\/\/\)$/{ s//\1/; q; }-  	  /^X\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`-    done-    test ! -n "$as_dirs" || mkdir $as_dirs-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}-   { (exit 1); exit 1; }; }; }--  ac_builddir=.--if test "$ac_dir" != .; then-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`-  # A "../" for each directory in $ac_dir_suffix.-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`-else-  ac_dir_suffix= ac_top_builddir=-fi--case $srcdir in-  .)  # No --srcdir option.  We are building in place.-    ac_srcdir=.-    if test -z "$ac_top_builddir"; then-       ac_top_srcdir=.-    else-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`-    fi ;;-  [\\/]* | ?:[\\/]* )  # Absolute path.-    ac_srcdir=$srcdir$ac_dir_suffix;-    ac_top_srcdir=$srcdir ;;-  *) # Relative path.-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix-    ac_top_srcdir=$ac_top_builddir$srcdir ;;-esac--# Do not use `cd foo && pwd` to compute absolute paths, because-# the directories may not exist.-case `pwd` in-.) ac_abs_builddir="$ac_dir";;-*)-  case "$ac_dir" in-  .) ac_abs_builddir=`pwd`;;-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;-  *) ac_abs_builddir=`pwd`/"$ac_dir";;-  esac;;-esac-case $ac_abs_builddir in-.) ac_abs_top_builddir=${ac_top_builddir}.;;-*)-  case ${ac_top_builddir}. in-  .) ac_abs_top_builddir=$ac_abs_builddir;;-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;-  esac;;-esac-case $ac_abs_builddir in-.) ac_abs_srcdir=$ac_srcdir;;-*)-  case $ac_srcdir in-  .) ac_abs_srcdir=$ac_abs_builddir;;-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;-  esac;;-esac-case $ac_abs_builddir in-.) ac_abs_top_srcdir=$ac_top_srcdir;;-*)-  case $ac_top_srcdir in-  .) ac_abs_top_srcdir=$ac_abs_builddir;;-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;-  esac;;-esac----  # Let's still pretend it is `configure' which instantiates (i.e., don't-  # use $as_me), people would be surprised to read:-  #    /* config.h.  Generated by config.status.  */-  if test x"$ac_file" = x-; then-    configure_input=-  else-    configure_input="$ac_file.  "-  fi-  configure_input=$configure_input"Generated from `echo $ac_file_in |-				     sed 's,.*/,,'` by configure."--  # First look for the input files in the build tree, otherwise in the-  # src tree.-  ac_file_inputs=`IFS=:-    for f in $ac_file_in; do-      case $f in-      -) echo $tmp/stdin ;;-      [\\/$]*)-	 # Absolute (can't be DOS-style, as IFS=:)-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5-echo "$as_me: error: cannot find input file: $f" >&2;}-   { (exit 1); exit 1; }; }-	 echo "$f";;-      *) # Relative-	 if test -f "$f"; then-	   # Build tree-	   echo "$f"-	 elif test -f "$srcdir/$f"; then-	   # Source tree-	   echo "$srcdir/$f"-	 else-	   # /dev/null tree-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5-echo "$as_me: error: cannot find input file: $f" >&2;}-   { (exit 1); exit 1; }; }-	 fi;;-      esac-    done` || { (exit 1); exit 1; }--  if test x"$ac_file" != x-; then-    { echo "$as_me:$LINENO: creating $ac_file" >&5-echo "$as_me: creating $ac_file" >&6;}-    rm -f "$ac_file"-  fi-_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF-  sed "$ac_vpsub-$extrasub-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF-:t-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b-s,@configure_input@,$configure_input,;t t-s,@srcdir@,$ac_srcdir,;t t-s,@abs_srcdir@,$ac_abs_srcdir,;t t-s,@top_srcdir@,$ac_top_srcdir,;t t-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t-s,@builddir@,$ac_builddir,;t t-s,@abs_builddir@,$ac_abs_builddir,;t t-s,@top_builddir@,$ac_top_builddir,;t t-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out-  rm -f $tmp/stdin-  if test x"$ac_file" != x-; then-    mv $tmp/out $ac_file-  else-    cat $tmp/out-    rm -f $tmp/out-  fi--done-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF--#-# CONFIG_HEADER section.-#--# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where-# NAME is the cpp macro being defined and VALUE is the value it is being given.-#-# ac_d sets the value in "#define NAME VALUE" lines.-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'-ac_dB='[	 ].*$,\1#\2'-ac_dC=' '-ac_dD=',;t'-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'-ac_uB='$,\1#\2define\3'-ac_uC=' '-ac_uD=',;t'--for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".-  case $ac_file in-  - | *:- | *:-:* ) # input from stdin-	cat >$tmp/stdin-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;-  * )   ac_file_in=$ac_file.in ;;-  esac--  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5-echo "$as_me: creating $ac_file" >&6;}--  # First look for the input files in the build tree, otherwise in the-  # src tree.-  ac_file_inputs=`IFS=:-    for f in $ac_file_in; do-      case $f in-      -) echo $tmp/stdin ;;-      [\\/$]*)-	 # Absolute (can't be DOS-style, as IFS=:)-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5-echo "$as_me: error: cannot find input file: $f" >&2;}-   { (exit 1); exit 1; }; }-	 # Do quote $f, to prevent DOS paths from being IFS'd.-	 echo "$f";;-      *) # Relative-	 if test -f "$f"; then-	   # Build tree-	   echo "$f"-	 elif test -f "$srcdir/$f"; then-	   # Source tree-	   echo "$srcdir/$f"-	 else-	   # /dev/null tree-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5-echo "$as_me: error: cannot find input file: $f" >&2;}-   { (exit 1); exit 1; }; }-	 fi;;-      esac-    done` || { (exit 1); exit 1; }-  # Remove the trailing spaces.-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in--_ACEOF--# Transform confdefs.h into two sed scripts, `conftest.defines' and-# `conftest.undefs', that substitutes the proper values into-# config.h.in to produce config.h.  The first handles `#define'-# templates, and the second `#undef' templates.-# And first: Protect against being on the right side of a sed subst in-# config.status.  Protect against being in an unquoted here document-# in config.status.-rm -f conftest.defines conftest.undefs-# Using a here document instead of a string reduces the quoting nightmare.-# Putting comments in sed scripts is not portable.-#-# `end' is used to avoid that the second main sed command (meant for-# 0-ary CPP macros) applies to n-ary macro definitions.-# See the Autoconf documentation for `clear'.-cat >confdef2sed.sed <<\_ACEOF-s/[\\&,]/\\&/g-s,[\\$`],\\&,g-t clear-: clear-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp-t end-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp-: end-_ACEOF-# If some macros were called several times there might be several times-# the same #defines, which is useless.  Nevertheless, we may not want to-# sort them, since we want the *last* AC-DEFINE to be honored.-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs-rm -f confdef2sed.sed--# This sed command replaces #undef with comments.  This is necessary, for-# example, in the case of _POSIX_SOURCE, which is predefined and required-# on some systems where configure will not decide to define it.-cat >>conftest.undefs <<\_ACEOF-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,-_ACEOF--# Break up conftest.defines because some shells have a limit on the size-# of here documents, and old seds have small limits too (100 cmds).-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS-echo '  :' >>$CONFIG_STATUS-rm -f conftest.tail-while grep . conftest.defines >/dev/null-do-  # Write a limited-size here document to $tmp/defines.sed.-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS-  # Speed up: don't consider the non `#define' lines.-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS-  # Work around the forget-to-reset-the-flag bug.-  echo 't clr' >>$CONFIG_STATUS-  echo ': clr' >>$CONFIG_STATUS-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS-  echo 'CEOF-  sed -f $tmp/defines.sed $tmp/in >$tmp/out-  rm -f $tmp/in-  mv $tmp/out $tmp/in-' >>$CONFIG_STATUS-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail-  rm -f conftest.defines-  mv conftest.tail conftest.defines-done-rm -f conftest.defines-echo '  fi # grep' >>$CONFIG_STATUS-echo >>$CONFIG_STATUS--# Break up conftest.undefs because some shells have a limit on the size-# of here documents, and old seds have small limits too (100 cmds).-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS-rm -f conftest.tail-while grep . conftest.undefs >/dev/null-do-  # Write a limited-size here document to $tmp/undefs.sed.-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS-  # Speed up: don't consider the non `#undef'-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS-  # Work around the forget-to-reset-the-flag bug.-  echo 't clr' >>$CONFIG_STATUS-  echo ': clr' >>$CONFIG_STATUS-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS-  echo 'CEOF-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out-  rm -f $tmp/in-  mv $tmp/out $tmp/in-' >>$CONFIG_STATUS-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail-  rm -f conftest.undefs-  mv conftest.tail conftest.undefs-done-rm -f conftest.undefs--cat >>$CONFIG_STATUS <<\_ACEOF-  # Let's still pretend it is `configure' which instantiates (i.e., don't-  # use $as_me), people would be surprised to read:-  #    /* config.h.  Generated by config.status.  */-  if test x"$ac_file" = x-; then-    echo "/* Generated by configure.  */" >$tmp/config.h-  else-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h-  fi-  cat $tmp/in >>$tmp/config.h-  rm -f $tmp/in-  if test x"$ac_file" != x-; then-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5-echo "$as_me: $ac_file is unchanged" >&6;}-    else-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$ac_file" : 'X\(//\)[^/]' \| \-	 X"$ac_file" : 'X\(//\)$' \| \-	 X"$ac_file" : 'X\(/\)' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X"$ac_file" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }-  	  /^X\(\/\/\)$/{ s//\1/; q; }-  	  /^X\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`-      { if $as_mkdir_p; then-    mkdir -p "$ac_dir"-  else-    as_dir="$ac_dir"-    as_dirs=-    while test ! -d "$as_dir"; do-      as_dirs="$as_dir $as_dirs"-      as_dir=`(dirname "$as_dir") 2>/dev/null ||-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$as_dir" : 'X\(//\)[^/]' \| \-	 X"$as_dir" : 'X\(//\)$' \| \-	 X"$as_dir" : 'X\(/\)' \| \-	 .     : '\(.\)' 2>/dev/null ||-echo X"$as_dir" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }-  	  /^X\(\/\/\)$/{ s//\1/; q; }-  	  /^X\(\/\).*/{ s//\1/; q; }-  	  s/.*/./; q'`-    done-    test ! -n "$as_dirs" || mkdir $as_dirs-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}-   { (exit 1); exit 1; }; }; }--      rm -f $ac_file-      mv $tmp/config.h $ac_file-    fi-  else-    cat $tmp/config.h-    rm -f $tmp/config.h-  fi-done-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF--{ (exit 0); exit 0; }-_ACEOF-chmod +x $CONFIG_STATUS-ac_clean_files=$ac_clean_files_save---# configure is writing to config.log, and then calls config.status.-# config.status does its own redirection, appending to config.log.-# Unfortunately, on DOS this fails, as config.log is still kept open-# by configure, so config.status won't be able to write to it; its-# output is simply discarded.  So we exec the FD to /dev/null,-# effectively closing config.log, so it can be properly (re)opened and-# appended to by config.status.  When coming back to configure, we-# need to make the FD available again.-if test "$no_create" != yes; then-  ac_cs_success=:-  ac_config_status_args=-  test "$silent" = yes &&-    ac_config_status_args="$ac_config_status_args --quiet"-  exec 5>/dev/null-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false-  exec 5>>config.log-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which-  # would make configure fail if this is the last instruction.-  $ac_cs_success || { (exit 1); exit 1; }-fi-
− configure.ac
@@ -1,175 +0,0 @@--# sanity-AC_INIT(HSCurses/Curses.hsc)--# Prepare to generate the config.h.in file-AC_CONFIG_HEADERS([cbits/config.h])--# this is arbitrary-AC_PREREQ([2.52])--#-# Looking for HC, stolen from $fptools-#-AC_ARG_WITH(hc,-[AC_HELP_STRING([--with-hc=ARG],-    [Use ARG as the path to a Haskell compiler [default=autodetect]])],-[ WithGhc="$withval" -  if test "$WithGhc" = "nhc98"; then-    AC_DEFINE(__NHC__, [], [Defined if compiling with nhc98])-    SYMS="$SYMS -D__NHC__"-  fi-],-[-  if test "$GHC" = ""; then-    AC_CHECK_PROGS(GHC,ghc)-  fi-  if test "$GHC" = ""; then-    AC_CHECK_PROGS(GHC,nhc98)-  fi-  if test "$GHC" = "nhc98"; then-    AC_DEFINE(__NHC__, [], [Defined if compiling with nhc98])-    SYMS="$SYMS -D__NHC__"-  fi-  WithGhc=`which $GHC`-])-AC_SUBST(WithGhc)--# code generation option for GHC (normally, we want to use `-fvia-C', however,-# with ghc-6.4 -fvia-C produces a buggy binary, dying with:-#       user error (Curses[-1]:keypad))-if test `$WithGhc --numeric-version 2> /dev/null` = "6.4"; then-  GhcCodegen="-fasm"-else-  GhcCodegen="-fvia-C"-fi-AC_SUBST(GhcCodegen)--#-# Look for a ghc-pkg that matches our ghc version.-#-ghc_pkg_guess=`dirname $WithGhc`/ghc-pkg-`$WithGhc --numeric-version`-if "$ghc_pkg_guess" -l > /dev/null 2>&1; then-      matching_ghc_pkg=$ghc_pkg_guess-else-      matching_ghc_pkg=no-fi-if test x"$matching_ghc_pkg" = xno; then-    AC_CHECK_PROG(GhcPkgCmd, ghc-pkg, ghc-pkg)-else-    GhcPkgCmd=$matching_ghc_pkg-fi-AC_SUBST(GhcPkgCmd)--# check if ghc-pkg has version >= or < 6.4-ghcPkgVersion=`$GhcPkgCmd --version | sed 's/GHC package manager version //'`-echo -e "$ghcPkgVersion\n6.3" | sort -c > /dev/null 2>&1-sorted=$?-if test $sorted -eq 0; then-  cp ./hscurses.conf.m4.in.before64 ./hscurses.conf.m4.in-else-  cp ./hscurses.conf.m4.in.64 ./hscurses.conf.m4.in-fi--#-# Look for a hsc2hs that matches our ghc version.-#-hsc2hs_guess=`dirname $WithGhc`/hsc2hs-if "$hsc2hs_guess" -V > /dev/null 2>&1; then-  Hsc2hsCmd=$hsc2hs_guess-else-  AC_CHECK_PROG(Hsc2hsCmd, hsc2hs, hsc2hs)-fi-AC_SUBST(Hsc2hsCmd)---#-# And some other tools-#-# AC_CHECK_PROG(AlexCmd,alex,alex)-# AC_CHECK_PROG(HappyCmd,happy,happy)-AC_CHECK_PROG(GccCmd, gcc, gcc)-AC_CHECK_PROG(HaddockCmd,haddock,haddock)--AC_CHECK_PROG(STRIP,strip,strip)-AC_PATH_PROG(LdCmd,ld)--# check for -x flag to ld. stolen from $fptools-AC_DEFUN(FPTOOLS_LD_X,-[AC_CACHE_CHECK([whether ld understands -x], fptools_cv_ld_x,-[-echo 'foo() {}' > conftest.c-${CC-cc} -c conftest.c-if ${LdCmd} -r -x -o foo.o conftest.o; then-   fptools_cv_ld_x=yes -else-   fptools_cv_ld_x=no-fi-rm -rf conftest.c conftest.o foo.o -])-if test "$fptools_cv_ld_x" = yes; then-    LdXFlag=-x-else-    LdXFlag=-fi-AC_SUBST(LdXFlag)-])--FPTOOLS_LD_X--#-# May as well check for this-#-AC_PROG_RANLIB--#-# Curses. If you don't have wchar_t-aware ncurses (Debian package:-# libncursesw5-dev),  uncomment the first line and comment-out the-# two later. -#-# The shell variables should be added to, e.g., $LIBS-#-AC_CHECK_LIB(curses,  addnstr)-AC_CHECK_LIB(ncurses, addnstr)-AC_CHECK_LIB(ncursesw,waddnwstr)--AC_CHECK_LIB(iconv, iconv)-AC_CHECK_LIB(iconv, libiconv)--# Bit weird. On OpenBSD you need the 'lib' suffix to iconv functions, it seems-AC_CHECK_FUNCS(libiconv, AC_DEFINE( [ICONV_LIB_PREFIX],[1],-                [Define to 1 if you need a 'lib' prefix to iconv functions]))--# On linux we need to call doupdate() after endwin() to restore the term-if uname -s | grep Linux > /dev/null 2>&1 ; then-    AC_DEFINE( [NCURSES_UPDATE_AFTER_END],[1],-               [Define to 1 if you need to call doupdate after endwin])-fi--# some special libs need to be set for package.conf files-if echo "$LIBS" | grep iconv > /dev/null 2>&1 ; then-    ICONV=iconv-fi--if (echo "$LIBS" | grep ncursesw) >/dev/null 2>&1 ; then-    CURSES=ncursesw-elif (echo "$LIBS" | grep ncurses) >/dev/null 2>&1 ; then-    CURSES=ncurses-else-    CURSES=curses-fi-AC_SUBST(ICONV)-AC_SUBST(CURSES)--#-# Specific headers to check for-#-AC_CHECK_HEADERS([iconv.h curses.h ncurses.h ncursesw/ncurses.h locale.h langinfo.h wchar.h limits.h signal.h ])--AC_SUBST(SYMS)--current_directory=`pwd`-AC_SUBST(current_directory)--AC_CONFIG_FILES([mk/config.mk hscurses.conf.m4 hscurses.buildinfo])-AC_OUTPUT
example/ContactManager.hs view
@@ -1,5 +1,5 @@ -- Copyright (c) 2005 Stefan Wehr (http://www.stefanwehr.de)--- +-- -- Permission is hereby granted, free of charge, to any person obtaining a -- copy of this software and associated documentation files (the -- "Software"), to deal in the Software without restriction, including@@ -7,10 +7,10 @@ -- distribute, sublicense, and/or sell copies of the Software, and to -- permit persons to whom the Software is furnished to do so, subject to -- the following conditions:--- +-- -- The above copyright notice and this permission notice shall be included -- in all copies or substantial portions of the Software.--- +-- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.@@ -19,7 +19,7 @@ -- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --- Simple addressbook application to show the capabilities of the hscurses +-- Simple addressbook application to show the capabilities of the hscurses -- library, especially its widget set.  module Main where@@ -31,16 +31,18 @@ * add -} -import List ( sort )-import System import Control.Exception import Control.Monad.State+import Data.List ( sort )+import System.Environment (getArgs, getProgName)+import System.Exit (exitFailure) import Text.PrettyPrint.HughesPJ-import qualified HSCurses.Curses as Curses-import qualified HSCurses.CursesHelper as CursesH-import HSCurses.Widgets-import HSCurses.Logging +import UI.HSCurses.Logging+import UI.HSCurses.Widgets+import qualified UI.HSCurses.Curses as Curses+import qualified UI.HSCurses.CursesHelper as CursesH+ type Name = String type Email = String type Address = String@@ -75,10 +77,10 @@                , phoneNumber      = ""                } -pprContact c = +pprContact c =     pprLine (combine (lastName c) ", " (firstName c)) $     pprLine (address c) $-    pprLine (combine (zipCode c) " " (city c)) $ +    pprLine (combine (zipCode c) " " (city c)) $     pprLine (province c) $     pprLine (country c) $     pprLine (phoneNumber c) $@@ -93,7 +95,7 @@     combine s1 delim s2 = s1 ++ delim ++ s2  contactToLabelValueList :: Contact -> [(String, String)]-contactToLabelValueList c = +contactToLabelValueList c =     [ ("Last Name", lastName c)     , ("First Name", firstName c)     , ("Email", emailAddress c)@@ -105,14 +107,14 @@     , ("Phone", phoneNumber c) ]  readContacts :: FilePath -> IO [Contact]-readContacts f = +readContacts f =     do s <- readFile f        case reads s of          [(contacts, [])] -> return (sort contacts)          _ -> error ("corrupt contact file: " ++ f)  writeContacts :: FilePath -> [Contact] -> IO ()-writeContacts f contacts = +writeContacts f contacts =     writeFile f (show contacts)  sampleContacts =@@ -138,11 +140,11 @@                    , city = "Sydney"                    , country = "Australia" } ] -    + title = "contact-manager"  help = "q:quit, d:delete, a:add"-                              + data CMState = CMState     { cm_styles  :: [CursesH.CursesStyle]     , cm_contacts :: [Contact]@@ -150,29 +152,29 @@ type CM = StateT CMState IO  runCM :: [CursesH.CursesStyle] -> [Contact] -> CM a -> IO a-runCM stys contacts cm = evalStateT cm (CMState { cm_styles = stys +runCM stys contacts cm = evalStateT cm (CMState { cm_styles = stys                                                 , cm_contacts = contacts })  nthStyle :: Int -> CM CursesH.CursesStyle-nthStyle n = +nthStyle n =     do cs <- gets cm_styles        return $ cs !! n  getSize = liftIO $ Curses.scrSize- + styles = [ CursesH.defaultStyle          , CursesH.AttributeStyle [CursesH.Bold] CursesH.GreenF CursesH.DarkBlueB          ] -    + defStyle = nthStyle 0 lineStyle = nthStyle 1 -lineDrawingStyle = +lineDrawingStyle =     do sty <- lineStyle        return $ mkDrawingStyle sty -lineOptions = +lineOptions =     do sz <- getSize        ds <- lineDrawingStyle        return $ TWOptions { twopt_size = TWSizeFixed (1, getWidth sz),@@ -187,13 +189,13 @@ type ContactDetailsWidget = TextWidget type ContactEditWidget = TableWidget -mkToplineWidget = +mkToplineWidget =     do opts <- lineOptions-       return $ newTextWidget (opts { twopt_halign = AlignCenter }) +       return $ newTextWidget (opts { twopt_halign = AlignCenter })                   title  mkMidlineWidget :: ContactListWidget -> CM MidlineWidget-mkMidlineWidget listWidget = +mkMidlineWidget listWidget =     do opts <- lineOptions        contacts <- gets cm_contacts        let s = case tbw_pos listWidget of@@ -201,7 +203,7 @@                  Just (row, _) -> show (1+row) ++ "/" ++ show (length contacts)        return $ newTextWidget  (opts { twopt_halign = AlignRight }) s -mkBotlineWidget = +mkBotlineWidget =     do opts <- lineOptions        return $ newTextWidget opts help @@ -209,7 +211,7 @@ -- i.e. at the lower-right corner of the message line. Otherwise, an -- error occurs because drawing a character to this position moves the -- cursor to the next line, which doesn't exist.-mkMsglineWidget = +mkMsglineWidget =     do sz <- getSize        let width = getWidth sz            opts = TWOptions { twopt_size = TWSizeFixed (1, width - 1),@@ -224,11 +226,11 @@  contactListHeight (h, _) = (h - nlines) `div` 2 -contactDetailsHeight (h, _) = +contactDetailsHeight (h, _) =     let n = h - nlines         in n `div` 2 + (n `mod` 2) -contactListOptions = +contactListOptions =     do sz <- getSize        return $ TBWOptions                   { tbwopt_fillCol = Nothing,@@ -236,39 +238,39 @@                     tbwopt_activeCols = [0],                     tbwopt_minSize = (contactListHeight sz, getWidth sz) } -contactDetailsOptions = +contactDetailsOptions =     do sz <- getSize-       return $ TWOptions { twopt_size = TWSizeFixed (contactDetailsHeight sz, +       return $ TWOptions { twopt_size = TWSizeFixed (contactDetailsHeight sz,                                                          getWidth sz),                             twopt_style = defaultDrawingStyle,                             twopt_halign = AlignLeft }  mkContactListWidget :: CM ContactListWidget-mkContactListWidget = +mkContactListWidget =     do contacts <- gets cm_contacts        sz <- getSize        let lines = alignRows (map contactLine contacts) ' ' "  "            rows = map (contactRow $ getWidth sz) lines-       opts <- contactListOptions +       opts <- contactListOptions        return $ newTableWidget opts rows     where contactLine c = [lastName c, firstName c, emailAddress c]-          contactRow w s = [TableCell $ newTextWidget +          contactRow w s = [TableCell $ newTextWidget                             (defaultTWOptions { twopt_size = TWSizeFixed (1, w) }) s]           lastRow = [TableCell (EmptyWidget (0,0))]  mkContactDetailsWidget :: ContactListWidget -> CM ContactDetailsWidget-mkContactDetailsWidget listWidget = +mkContactDetailsWidget listWidget =     do contacts <- gets cm_contacts        let contact = case tbw_pos listWidget of                        Nothing -> ""-                       Just (row, _) -> +                       Just (row, _) ->                            let c = contacts !! row                                in show $ pprContact c        opts <- contactDetailsOptions        return $ newTextWidget opts contact  mkContactEditWidget :: Contact -> CM ContactEditWidget-mkContactEditWidget contact = +mkContactEditWidget contact =     let l = contactToLabelValueList contact         rows = map mkRow l         in do sz <- getSize@@ -278,12 +280,12 @@                            tbwopt_activeCols = [1],                            tbwopt_minSize = (getHeight sz - 3, getWidth sz) }               return $ newTableWidget opts rows-    where mkRow (label, value) = +    where mkRow (label, value) =               let labelW = newTextWidget defaultTWOptions label                   valueW = newEditWidget defaultEWOptions value                   in [TableCell labelW, ActiveTableCell valueW] -mkMainEditWidget contact = +mkMainEditWidget contact =     do tlw <- mkToplineWidget        blw <- mkBotlineWidget        msglw <- mkMsglineWidget@@ -296,7 +298,7 @@     , msglineEditWidget :: MsglineWidget     , contactEditWidget :: ContactEditWidget } -mkMainWidget = +mkMainWidget =     do tlw <- mkToplineWidget        clw <- mkContactListWidget        mlw <- mkMidlineWidget clw@@ -310,7 +312,7 @@     minSize w = minSize (mkRealMainEditWidget Nothing w)  mkRealMainEditWidget :: (Maybe Size) -> MainEditWidget -> TableWidget-mkRealMainEditWidget msz w = +mkRealMainEditWidget msz w =     let cells = [ TableCell $ toplineEditWidget w                 , TableCell $ contactEditWidget w                 , TableCell $ botlineEditWidget w@@ -333,7 +335,7 @@     draw pos sz hint w = draw pos sz hint (mkRealMainWidget (Just sz) w)     minSize w = minSize (mkRealMainWidget Nothing w) -mkRealMainWidget msz w = +mkRealMainWidget msz w =     let cells = [ TableCell $ toplineWidget w                 , TableCell $ contactListWidget w                 , TableCell $ midlineWidget w@@ -355,12 +357,12 @@                   , midlineWidget = midlineWidget }  move :: Direction -> MainWidget -> CM MainWidget-move dir w = +move dir w =     do sz <- getSize        let listWidget = tableWidgetMove dir sz (contactListWidget w)        updateStateDependentWidgets w listWidget -delete w = +delete w =     let lw = contactListWidget w         in case tbw_pos lw of              Nothing -> return w@@ -386,7 +388,7 @@          _ -> editEventloop w ewm -} -edit w = +edit w =     let lw = contactListWidget w         in case tbw_pos lw of              Nothing -> return w@@ -396,10 +398,10 @@                     ew <- mkMainEditWidget c                     redraw ew                     return w-                    --editEventloop w ew +                    --editEventloop w ew -resize :: Widget w => CM w -> CM ()                   -resize f = +resize :: Widget w => CM w -> CM ()+resize f =     do liftIO $ do Curses.endWin                    Curses.resetParams                    Curses.cursSet Curses.CursorInvisible@@ -408,12 +410,12 @@        redraw w  redraw :: Widget w => w -> CM ()-redraw w = +redraw w =     do sz <- getSize        liftIO $ draw (0, 0) sz DHNormal w        liftIO $ Curses.refresh -eventloop w = +eventloop w =     do k <- CursesH.getKey (resize mkMainWidget)        case k of          Curses.KeyChar 'q' -> return ()@@ -422,19 +424,19 @@          Curses.KeyUp       -> process $ move DirUp w          Curses.KeyDown     -> process $ move DirDown w          _ -> eventloop w-    where process f = +    where process f =               do w' <- f                  redraw w'                  eventloop w' cmMain :: CM ()-cmMain = +cmMain =     do w <- mkMainWidget        redraw w        eventloop w   main :: IO ()-main = +main =     do args <- getArgs        contacts <-              if length args /= 1@@ -443,7 +445,7 @@                         exitFailure                 else readContacts (args!!0)        runCurses contacts `finally` CursesH.end-    where runCurses contacts = +    where runCurses contacts =               do CursesH.start                  cstyles <- CursesH.convertStyles styles                  Curses.cursSet Curses.CursorInvisible
− example/Makefile
@@ -1,9 +0,0 @@-GHC = ghc-PKG_CONF = ../hscurses.conf--cm: ContactManager.hs $(PKG_CONF)-	$(GHC) --make -package-conf $(PKG_CONF) -package hscurses -o $@ $<--.PHONY: clean-clean:-	rm -f *.o *.hi cm	
example/Setup.hs view
@@ -1,3 +1,3 @@ #!/usr/bin/env runhaskell import Distribution.Simple-main = defaultMainWithHooks defaultUserHooks+main = defaultMainWithHooks simpleUserHooks
example/cm.cabal view
@@ -4,7 +4,9 @@ License:       GPL License-file:  ../LICENSE Author:   Stefan Wehr <http://www.informatik.uni-freiburg.de/~wehr>-Build-Depends:       base, hscurses >= 1.0, mtl, haskell98++Build-Depends:       base>3, hscurses >= 1.2, mtl, pretty+Build-Type:          Simple  Executable:          cm Main-Is:             ContactManager.hs
− hscurses.buildinfo.in
@@ -1,1 +0,0 @@-Extra-libraries:  @CURSES@ @ICONV@
hscurses.cabal view
@@ -1,5 +1,5 @@ Name:           hscurses-Version:        1.2+Version:        1.3 License:        LGPL License-file:   LICENSE Author:         John Meacham <john at repetae dot net>@@ -21,29 +21,28 @@     a table widget. Homepage:       http://www.informatik.uni-freiburg.de/~wehr/haskell/ -Build-depends:  base >= 1.0, haskell98 >= 1.0, unix >= 1.0, mtl >= 1.0+Build-depends:  base >= 1.0, unix >= 1.0, mtl >= 1.0, old-time, old-locale Build-Type:     Simple Tested-with:    GHC==6.8.2, GHC==6.6.1  Exposed-modules:-    HSCurses.Curses, HSCurses.CursesHelper, HSCurses.Widgets,-    HSCurses.MonadException, HSCurses.Logging+    UI.HSCurses.Curses, UI.HSCurses.CursesHelper, UI.HSCurses.Widgets,+    UI.HSCurses.MonadException, UI.HSCurses.Logging Other-modules:-    HSCurses.CWString, HSCurses.IConv+    UI.HSCurses.CWString, UI.HSCurses.IConv C-sources:     cbits/HSCursesUtils.c Includes:     HSCurses.h, HSCursesUtils.h Data-files:     README, TODO, example/contacts2, example/Setup.hs, example/ContactManager.hs,-    example/cm.cabal, example/contacts, example/Makefile+    example/cm.cabal, example/contacts Extra-source-files:-    configure, hscurses.conf.m4.in.before64, HSCurses/Curses.hsc,-    HSCurses/CursesHelper.hs, HSCurses/CWString.hsc, HSCurses/Widgets.hs,-    HSCurses/MonadException.hs, HSCurses/Logging.hs, HSCurses/IConv.hsc,-    install-sh, hscurses.conf.m4.in.64, hscurses.buildinfo.in, configure.ac,-    cbits/config.h.in, cbits/HSCursesUtils.h, cbits/HSCurses.h, Makefile,-    mk/config.mk.in, mk/rules.mk, mk/paths.mk-Extensions:       CPP, ForeignFunctionInterface+    UI/HSCurses/Curses.hsc,+    UI/HSCurses/CursesHelper.hs, UI/HSCurses/CWString.hsc, UI/HSCurses/Widgets.hs,+    UI/HSCurses/MonadException.hs, UI/HSCurses/Logging.hs, UI/HSCurses/IConv.hsc,+    cbits/config.h.in, cbits/HSCursesUtils.h, cbits/HSCurses.h++Extensions:       CPP, ForeignFunctionInterface, GeneralizedNewtypeDeriving, ScopedTypeVariables, ExistentialQuantification Include-dirs:     cbits .-Ghc-options:      -funbox-strict-fields+Ghc-options:      -funbox-strict-fields -Wall -fvia-c
− hscurses.conf.m4.in.64
@@ -1,43 +0,0 @@-dnl Package configuration file for use with ghc-pkg >= 6.4--Name:           hscurses-Version:        1.0-License:        LGPL-License-file:   LICENSE-Author:         John Meacham <john at repetae dot net>-                Tuomo Valkonen <tuomov at iki.fi>-                Don Stewart <http://www.cse.unsw.edu.au/~dons>-                Stefan Wehr <http://www.stefanwehr.de>-Maintainer:     Stefan Wehr <http://www.stefanwehr.de>-Copyright:      Stefan Wehr 2004, 2005-                Don Stewart 2004-                Tuomo Valkonen 2004-                John Meacham 2002-2004-Homepage:       http://www.stefanwehr.de/haskell-Category:       User-interface-Depends:        base, haskell98, unix-Synopsis:       NCurses bindings for Haskell-Description:   -  Binding to NCurses, a library of functions that manage an-  application's display on character-cell terminals. Additionally,-  it contains some basic widgets such as a text input widget and-  a table widget.-Exposed-modules:-    HSCurses.Curses, HSCurses.CursesHelper, HSCurses.Widgets,-    HSCurses.MonadException, HSCurses.Logging-Hidden-modules:-    HSCurses.CWString, HSCurses.IConv-C-sources:      -    cbits/HSCursesUtils.c HSCurses/CWString_hsc.c HSCurses/Curses_hsc.c-Includes:         HSCurses.h, HSCursesUtils.h-hs-libraries:     hscurses-Extra-libraries:  @CURSES@ @ICONV@-ifdef(`__INSTALLING__', `-Import-dirs:      @prefix@/lib/hscurses/imports-Library-dirs:     @prefix@/lib/hscurses-Include-dirs:     @prefix@/include/hscurses-',`-Import-dirs:      @current_directory@-Library-dirs:     @current_directory@-Include-dirs:     @current_directory@/cbits-')
− hscurses.conf.m4.in.before64
@@ -1,23 +0,0 @@-dnl Package configuration file for use with ghc-pkg < 6.4--Package {-        name            = "hscurses",-        auto            = False,-        hs_libraries    = [ "hscurses" ],-ifdef(`__INSTALLING__', `-        import_dirs     = [ "@prefix@/lib/hscurses/imports" ],-        library_dirs    = [ "@prefix@/lib/hscurses" ],-        include_dirs    = [ "@prefix@/include/hscurses" ],-',`-        import_dirs     = [ "@current_directory@" ],-        library_dirs    = [ "@current_directory@" ],-        include_dirs    = [ "@current_directory@/cbits" ],-')-        c_includes      = [ "HSCurses.h", "HSCursesUtils.h" ],-        source_dirs     = [],-        extra_libraries = [ "@CURSES@", "@ICONV@" ],-        package_deps    = [ "base", "haskell98", "posix" ],-        extra_ghc_opts  = [],-        extra_cc_opts   = [],-        extra_ld_opts   = []-}
− install-sh
@@ -1,251 +0,0 @@-#!/bin/sh-#-# install - install a program, script, or datafile-# This comes from X11R5 (mit/util/scripts/install.sh).-#-# Copyright 1991 by the Massachusetts Institute of Technology-#-# Permission to use, copy, modify, distribute, and sell this software and its-# documentation for any purpose is hereby granted without fee, provided that-# the above copyright notice appear in all copies and that both that-# copyright notice and this permission notice appear in supporting-# documentation, and that the name of M.I.T. not be used in advertising or-# publicity pertaining to distribution of the software without specific,-# written prior permission.  M.I.T. makes no representations about the-# suitability of this software for any purpose.  It is provided "as is"-# without express or implied warranty.-#-# Calling this script install-sh is preferred over install.sh, to prevent-# `make' implicit rules from creating a file called install from it-# when there is no Makefile.-#-# This script is compatible with the BSD install script, but was written-# from scratch.  It can only install one file at a time, a restriction-# shared with many OS's install programs.---# set DOITPROG to echo to test this script--# Don't use :- since 4.3BSD and earlier shells don't like it.-doit="${DOITPROG-}"---# put in absolute paths if you don't have them in your path; or use env. vars.--mvprog="${MVPROG-mv}"-cpprog="${CPPROG-cp}"-chmodprog="${CHMODPROG-chmod}"-chownprog="${CHOWNPROG-chown}"-chgrpprog="${CHGRPPROG-chgrp}"-stripprog="${STRIPPROG-strip}"-rmprog="${RMPROG-rm}"-mkdirprog="${MKDIRPROG-mkdir}"--transformbasename=""-transform_arg=""-instcmd="$mvprog"-chmodcmd="$chmodprog 0755"-chowncmd=""-chgrpcmd=""-stripcmd=""-rmcmd="$rmprog -f"-mvcmd="$mvprog"-src=""-dst=""-dir_arg=""--while [ x"$1" != x ]; do-    case $1 in-	-c) instcmd="$cpprog"-	    shift-	    continue;;--	-d) dir_arg=true-	    shift-	    continue;;--	-m) chmodcmd="$chmodprog $2"-	    shift-	    shift-	    continue;;--	-o) chowncmd="$chownprog $2"-	    shift-	    shift-	    continue;;--	-g) chgrpcmd="$chgrpprog $2"-	    shift-	    shift-	    continue;;--	-s) stripcmd="$stripprog"-	    shift-	    continue;;--	-t=*) transformarg=`echo $1 | sed 's/-t=//'`-	    shift-	    continue;;--	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`-	    shift-	    continue;;--	*)  if [ x"$src" = x ]-	    then-		src=$1-	    else-		# this colon is to work around a 386BSD /bin/sh bug-		:-		dst=$1-	    fi-	    shift-	    continue;;-    esac-done--if [ x"$src" = x ]-then-	echo "install:	no input file specified"-	exit 1-else-	true-fi--if [ x"$dir_arg" != x ]; then-	dst=$src-	src=""-	-	if [ -d $dst ]; then-		instcmd=:-		chmodcmd=""-	else-		instcmd=mkdir-	fi-else--# Waiting for this to be detected by the "$instcmd $src $dsttmp" command-# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'.--	if [ -f $src -o -d $src ]-	then-		true-	else-		echo "install:  $src does not exist"-		exit 1-	fi-	-	if [ x"$dst" = x ]-	then-		echo "install:	no destination specified"-		exit 1-	else-		true-	fi--# If destination is a directory, append the input filename; if your system-# does not like double slashes in filenames, you may need to add some logic--	if [ -d $dst ]-	then-		dst="$dst"/`basename $src`-	else-		true-	fi-fi--## this sed command emulates the dirname command-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`--# Make sure that the destination directory exists.-#  this part is taken from Noah Friedman's mkinstalldirs script--# Skip lots of stat calls in the usual case.-if [ ! -d "$dstdir" ]; then-defaultIFS='	-'-IFS="${IFS-${defaultIFS}}"--oIFS="${IFS}"-# Some sh's can't handle IFS=/ for some reason.-IFS='%'-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`-IFS="${oIFS}"--pathcomp=''--while [ $# -ne 0 ] ; do-	pathcomp="${pathcomp}${1}"-	shift--	if [ ! -d "${pathcomp}" ] ;-        then-		$mkdirprog "${pathcomp}"-	else-		true-	fi--	pathcomp="${pathcomp}/"-done-fi--if [ x"$dir_arg" != x ]-then-	$doit $instcmd $dst &&--	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi-else--# If we're going to rename the final executable, determine the name now.--	if [ x"$transformarg" = x ] -	then-		dstfile=`basename $dst`-	else-		dstfile=`basename $dst $transformbasename | -			sed $transformarg`$transformbasename-	fi--# don't allow the sed command to completely eliminate the filename--	if [ x"$dstfile" = x ] -	then-		dstfile=`basename $dst`-	else-		true-	fi--# Make a temp file name in the proper directory.--	dsttmp=$dstdir/#inst.$$#--# Move or copy the file name to the temp name--	$doit $instcmd $src $dsttmp &&--	trap "rm -f ${dsttmp}" 0 &&--# and set any options; do chmod last to preserve setuid bits--# If any of these fail, we abort the whole thing.  If we want to-# ignore errors from any of these, just make sure not to ignore-# errors from the above "$doit $instcmd $src $dsttmp" command.--	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&--# Now rename the file to the real destination.--	$doit $rmcmd -f $dstdir/$dstfile &&-	$doit $mvcmd $dsttmp $dstdir/$dstfile --fi &&---exit 0
− mk/config.mk.in
@@ -1,55 +0,0 @@-#-# System-specific settings-#--PREFIX=         @prefix@-BINDIR=         @prefix@/bin-LIBDIR=         @prefix@/lib/$(PKG)-DATADIR=        @prefix@/share/doc/$(PKG)-INCDIR=         @prefix@/include/$(PKG)-IFACEDIR=       $(LIBDIR)/imports--GHC=            @WithGhc@-GCC=            @GccCmd@-INCFLAGS=       -Icbits -I.-HC_OPTS=        @GhcCodegen@ -funbox-strict-fields--GHC_PKG=        @GhcPkgCmd@-HSC2HS=         @Hsc2hsCmd@--HADDOCK=        @HaddockCmd@-HADDOCK_OPTS=   -h--AR=             ar-AR_OPTS=        cr--LD=             @LdCmd@-LD_X=           @LdCmd@ @LdXFlag@--RANLIB=         @RANLIB@-STRIP=          @STRIP@--INSTALL=        sh $(TOPDIR)/install-sh -c-INSTALL_PROGRAM=$(INSTALL) -m 755-INSTALL_DATA=   $(INSTALL) -m 644-INSTALL_DIR=    mkdir -p--CP=             cp-RM=             rm -f--#-# Extra paths to find things-#-LD_OPTS=        @LDFLAGS@-INC_OPTS=       @CPPFLAGS@-C_OPTS=         @CFLAGS@-LIBS=           @LIBS@--#-# Special libs needed in package.conf files-#-CURSES=         @CURSES@-ICONV=          @ICONV@--# extra symbols-SYMS=           @SYMS@
− mk/paths.mk
@@ -1,228 +0,0 @@-################################################################################-#-#			    paths.mk-#-# 	This file defines Make variables for standard directories-#	and file lists-#-################################################################################--#-#-#		Standard variable names-#-#-# The fptools mk setup defines a set of standard names which are used-# by the standard targets provided by mk. One example of this is the-# use of standard names for specifying what files to compile, their-# intermediate/object code, and the name of the final-# executable. Based on the settings of these variables, the standard-# targets will generate/expand rules that automatically compile and-# link your program.-#-# The general rules:-#-#   SRCS - sources, might be prefixed to indicate what type of source-#          they are.-#   OBJS - object files (possibly prefixed).-#-#   PROG - name of final executable-#-# We attempt to automatically devine the list of sources $(SRCS) to-# compile by looking in the directories which may be specified by-# setting the $(ALL_DIRS) variable.  This is complicated by the fact-# that some files are derived from other files: eg. .hsc files give-# rise to -hsc.c and -hsc.h files, .ly files give rise to .hs files,-# and .hs files give rise to .hc files sometimes.--# So we figure out the sources in three stages: first figure out what-# sources we can find (this is $(ALL_SRCS)).  Then figure out all the-# "derived" sources (eg. A.hsc generates A.hs and A_hsc.c), and-# finally put all these together and remove duplicates (GNU make's-# handy sort function does the duplicate removing).--# HS_SRCS:   list of Haskell modules you want to compile.-#             (also use by depend rule).-# HS_OBJS:   list of corresponding object files-# HS_PROG:   program that is ultimately linked.-# HS_IFACES: list of interface files generated-#             (caveat: assuming no funny use of -hisuf and that-#               file name and module name match)--ALL_SRCS    = $(wildcard $(patsubst ./%, %,  \-		   $(patsubst %,%/*.hs,   $(ALL_DIRS)) \-		   $(patsubst %,%/*.lhs,  $(ALL_DIRS)) \-		   $(patsubst %,%/*.y,    $(ALL_DIRS)) \-		   $(patsubst %,%/*.ly,   $(ALL_DIRS)) \-		   $(patsubst %,%/*.x,    $(ALL_DIRS)) \-		   $(patsubst %,%/*.c,    $(ALL_DIRS)) \-		   $(patsubst %,%/*.hc,   $(ALL_DIRS)) \-		   $(patsubst %,%/*.S,    $(ALL_DIRS)) \-		   $(patsubst %,%/*.prl,  $(ALL_DIRS)) \-		   $(patsubst %,%/*.lprl, $(ALL_DIRS)) \-		   $(patsubst %,%/*.lit,  $(ALL_DIRS)) \-		   $(patsubst %,%/*.verb, $(ALL_DIRS)) \-		   $(patsubst %,%/*.hsc,  $(ALL_DIRS)) \-		   $(patsubst %,%/*.gc,   $(ALL_DIRS)) \-	       )) $(EXTRA_SRCS)--# ALL_SRCS is computed once and for all into PRE_SRCS at the top of-# rules.mk.  Otherwise, we end up re-computing ALL_SRCS every time it-# is expanded (it is used in several variables below, and these-# variables are used in several others, etc.), which can really slow-# down make.--PRE_HS_SRCS  = $(filter %.hs,  $(PRE_SRCS))-PRE_LHS_SRCS = $(filter %.lhs, $(PRE_SRCS))--GC_SRCS       = $(filter %.gc,  $(PRE_SRCS))-HSC_SRCS      = $(filter %.hsc, $(PRE_SRCS))-HAPPY_Y_SRCS  = $(filter %.y,   $(PRE_SRCS))-HAPPY_LY_SRCS = $(filter %.ly,   $(PRE_SRCS))-HAPPY_SRCS    = $(HAPPY_Y_SRCS) $(HAPPY_LY_SRCS)-ALEX_SRCS     = $(filter %.x,   $(PRE_SRCS))--DERIVED_GC_SRCS       = $(patsubst %.gc, %.hs, $(GC_SRCS)) \-			$(patsubst %.gc, %_stub_ffi.c, $(GC_SRCS)) \-			$(patsubst %.gc, %_stub_ffi.h, $(GC_SRCS))--DERIVED_HSC_SRCS      = $(patsubst %.hsc, %.hs, $(HSC_SRCS)) \-			$(patsubst %.hsc, %_hsc.c, $(HSC_SRCS)) \-			$(patsubst %.hsc, %_hsc.h, $(HSC_SRCS)) \-			$(patsubst %.hsc, %.hc, $(HSC_SRCS))--DERIVED_HAPPY_SRCS    = $(patsubst %.y,   %.hs, $(HAPPY_Y_SRCS)) \-			$(patsubst %.ly,  %.hs, $(HAPPY_LY_SRCS))--DERIVED_ALEX_SRCS     = $(patsubst %.x,   %.hs, $(ALEX_SRCS))--DERIVED_HC_SRCS       = $(patsubst %.hs,  %.hc, $(PRE_HS_SRCS)) \-			$(patsubst %.lhs, %.hc, $(PRE_LHS_SRCS))--DERIVED_SRCS	      = $(DERIVED_GC_SRCS) \-			$(DERIVED_HSC_SRCS) \-			$(DERIVED_HAPPY_SRCS) \-			$(DERIVED_ALEX_SRCS) \-			$(DERIVED_HC_SRCS)--# EXCLUDED_SRCS can be set in the Makefile, otherwise it defaults to empty.-EXCLUDED_GC_SRCS       = $(filter %.gc,  $(EXCLUDED_SRCS))-EXCLUDED_HSC_SRCS      = $(filter %.hsc, $(EXCLUDED_SRCS))-EXCLUDED_HAPPY_Y_SRCS  = $(filter %.y,   $(EXCLUDED_SRCS))-EXCLUDED_HAPPY_LY_SRCS = $(filter %.ly,  $(EXCLUDED_SRCS))-EXCLUDED_HAPPY_SRCS   = $(EXCLUDED_HAPPY_Y_SRCS) $(EXCLUDED_HAPPY_LY_SRCS)-EXCLUDED_ALEX_SRCS    = $(filter %.x,   $(EXCLUDED_SRCS))-EXCLUDED_HS_SRCS      = $(filter %.hs,  $(EXCLUDED_SRCS))-EXCLUDED_LHS_SRCS     = $(filter %.lhs, $(EXCLUDED_SRCS))-EXCLUDED_DERIVED_SRCS = $(patsubst %.hsc, %.hs, $(EXCLUDED_HSC_SRCS)) \-			$(patsubst %.hsc, %_hsc.h, $(EXCLUDED_HSC_SRCS)) \-			$(patsubst %.hsc, %_hsc.c, $(EXCLUDED_HSC_SRCS)) \-			$(patsubst %.hsc, %.hc, $(EXCLUDED_HSC_SRCS)) \-			$(patsubst %.gc,  %_stub_ffi.c, $(EXCLUDED_GC_SRCS)) \-			$(patsubst %.gc,  %_stub_ffi.h, $(EXCLUDED_GC_SRCS)) \-                        $(patsubst %.y,   %.hs, $(EXCLUDED_HAPPY_Y_SRCS)) \-			$(patsubst %.ly,  %.hs, $(EXCLUDED_HAPPY_LY_SRCS)) \-                        $(patsubst %.x,   %.hs, $(EXCLUDED_ALEX_SRCS)) \-			$(patsubst %.hs,  %.hc, $(EXCLUDED_HS_SRCS)) \-			$(patsubst %.lhs, %.hc, $(EXCLUDED_LHS_SRCS)) \-			$(patsubst %.hs,  %_stub.c, $(EXCLUDED_HS_SRCS)) \-			$(patsubst %.lhs, %_stub.c, $(EXCLUDED_LHS_SRCS))--# Exclude _hsc.c files; they get built as part of the cbits library,-# not part of the main library--CLOSED_EXCLUDED_SRCS  = $(sort $(EXCLUDED_SRCS) $(EXCLUDED_DERIVED_SRCS))--SRCS        = $(filter-out $(CLOSED_EXCLUDED_SRCS), \-	        $(sort $(PRE_SRCS) $(DERIVED_SRCS)))--HS_SRCS	    = $(filter %.lhs %.hs, $(sort $(SRCS) $(BOOT_SRCS)))-HS_OBJS     = $(addsuffix .$(way_)o,$(basename $(HS_SRCS)))-HS_IFACES   = $(addsuffix .$(way_)hi,$(basename $(HS_SRCS)))--GC_C_OBJS   = $(addsuffix _stub_ffi.$(way_)o,$(basename $(filter %.gc,$(SRCS))))-HSC_C_OBJS  = $(addsuffix _hsc.$(way_)o,$(basename $(filter %.hsc,$(SRCS))))--# These are droppings from hsc2hs - ignore them if we see them.-EXCLUDED_C_SRCS += $(patsubst %.hsc, %_hsc_make.c, $(HSC_SRCS))--C_SRCS      = $(filter-out $(EXCLUDED_C_SRCS),$(filter %.c,$(SRCS)))-C_OBJS      = $(addsuffix .$(way_)o,$(basename $(C_SRCS)))--# SCRIPT_SRCS:  list of raw script files (in literate form)-# SCRIPT_OBJS:  de-litted scripts-SCRIPT_SRCS = $(filter %.lprl,$(SRCS))-SCRIPT_OBJS = $(addsuffix .prl,$(basename $(SCRIPT_SRCS)))--OBJS        = $(HS_OBJS) $(C_OBJS) $(GC_C_OBJS) --# The default is for $(LIBOBJS) to be the same as $(OBJS)-LIBOBJS	    = $(OBJS)--#-# Note that as long as you use the standard variables for setting-# which C & Haskell programs you want to work on, you don't have-# to set any of the clean variables - the default should do the Right-# Thing.-#--#-------------------------------------------------------------------#-# make depend defaults-#-# The default set of files for the dependency generators to work on-# is just their source equivalents.-#--MKDEPENDHS_SRCS=$(HS_SRCS)-MKDEPENDC_SRCS=$(C_SRCS)--#-------------------------------------------------------------------# Clean file make-variables.-#-# The following three variables are used to control-# what gets removed when doing `make clean'-#-# MOSTLYCLEAN_FILES   object code etc., but not stuff-#                     that is slow to recompile and/or stable-#-# CLEAN_FILES  all files that are created by running make.-#-# MAINTAINER_CLEAN_FILES also clean out machine-generated files-#                        that may require extra tools to create.-#-#-# NOTE: $(SCRIPT_OBJS) is not in MOSTLY_CLEAN_FILES, because in some-# places in the tree it appears that we have source files in $(SCRIPT_OBJS).-# Specifically glafp-utils/mkdependC/mkdependC.prl and others in ghc/driver and-# possibly others elsewhere in the tree.  ToDo: fix this properly.-MOSTLY_CLEAN_FILES += $(HS_OBJS) $(C_OBJS) $(HSC_C_OBJS) $(GC_C_OBJS)-CLEAN_FILES        += $(HS_PROG) $(C_PROG) $(SCRIPT_PROG) $(SCRIPT_LINK) \-		      $(PROG) $(LIBRARY) a.out \-		      $(DERIVED_HSC_SRCS) \-		      $(DERIVED_GC_SRCS) \-		      $(patsubst %,%/*.$(way_)hi, . $(ALL_DIRS)) \-		      $(patsubst %,%/*.p_hi, . $(ALL_DIRS)) \-		      $(patsubst %,%/*.p_o, . $(ALL_DIRS))--# we delete *all* the .hi files we can find, rather than just-# $(HS_IFACES), because stale interfaces left around by modules which-# don't exist any more can screw up the build.--# Don't clean the .hc files if we're bootstrapping-CLEAN_FILES += $(DERIVED_HC_SRCS)--DIST_CLEAN_FILES 	+= depend* *.hp *.prof configure mk/config.h* mk/config.mk-DIST_CLEAN_DIRS=  *.cache--MAINTAINER_CLEAN_FILES 	+= $(BOOT_SRCS) $(DERIVED_HAPPY_SRCS) $(DERIVED_ALEX_SRCS)--#-# `Standard' set of files to clean out.-#-MOSTLY_CLEAN_FILES += \- *.CKP *.ln *.BAK *.bak .*.bak *.o *.p_o core a.out errs ,* *.a .emacs_*  \- tags TAGS *.ind *.ilg *.idx *.idx-prev *.aux *.aux-prev *.dvi *.log \- *.toc *.lot *.lof *.blg *.cb *_stub.c *_stub.h *.raw_s *.a.list \- *.log *.status-
− mk/rules.mk
@@ -1,292 +0,0 @@-#-# rules.mk : set flags and make rules-#--#-# pull in the file search stuff-#-include $(TOPDIR)/mk/paths.mk--PRE_SRCS:=      $(ALL_SRCS)--HC_OPTS        += $(INCFLAGS) $(INC_OPTS) $(HCFLAGS)-HSC_OPTS       += $(INCFLAGS) $(INC_OPTS)-CC_OPTS        += $(INCFLAGS) -optc-O3 $(INC_OPTS)--# If $(way) is set then we define $(way_) and $(_way) from it in the-# obvious fashion.-ifeq "$(way)" "p"-  way_ := $(way)_-  _way := _$(way)-endif--#-# building the profiled way-#-ifeq "$(way)" "p"-PROF_OPTS	= -prof -auto-all -Icbits-LD_OPTS		+= $(PROF_OPTS)-HC_OPTS     += $(PROF_OPTS)-HC_OPTS 	+= -hisuf $(way_)hi -hcsuf $(way_)hc -osuf $(way_)o-endif--# Distclean files (all files generated by configure)-DIST_CLEAN_FILES+= $(PKG).conf.m4.in $(PKG).conf.m4 aclocal.m4 config.log \-  config.status cbits/config.h-DIST_CLEAN_DIRS+= autom4te.cache--#-# Library flags-#-PKG_OPTS       += -package-name $(PKG)-1.0-GHCI_LIBRARY    = $(patsubst lib%.a,%.o,$(LIBRARY))--#-# Compute dependencies-#-depend: $(MKDEPENDHS_SRCS) $(C_SRCS)-	@echo "Rebuilding dependencies... "-	@$(RM) depend-	@$(GHC) -M -optdep-f -optdepdepend $(HC_OPTS) $(MKDEPENDHS_SRCS)-	@for x in $(C_SRCS) ; do \-	$(GCC) -MM $(INCFLAGS) "$$x" >> $@; \-	done-	@echo "done."--#-#  boot and all targets-#-.PHONY: boot all lib--boot :: depend--#-# Building libraries from $(LIBOBJS)-#--all :: lib-lib :: $(LIBRARY)--$(LIBRARY) :: $(LIBOBJS)-	$(RM) $@-	$(AR) $(AR_OPTS) $@ $(LIBOBJS)-	$(RANLIB) $@--lib :: $(GHCI_LIBRARY)--$(GHCI_LIBRARY) : $(LIBOBJS)-	$(LD_X) -r -o $@ $(STUBOBJS) $(LIBOBJS)--# No need to define .SUFFIXES because we don't use any suffix rules-# Instead we use gmake's pattern rules exlusively--.SUFFIXES:--# This declaration tells GNU make to delete the target if it has-# changed and the command which created it exited with a non-zero exit-# code.--.DELETE_ON_ERROR:--#-# We anticipate wanting to use multiple ways. Particularly prof.-#--%.$(way_)o: %.hs-	$(GHC) $(HC_OPTS) $(PKG_OPTS) -c $< -o $@ -ohi $(basename $@).$(way_)hi--%.$(way_)o : %.lhs-	$(GHC) $(HC_OPTS) $(PKG_OPTS) -c $< -o $@  -ohi $(basename $@).$(way_)hi--%.$(way_)hi : %.$(way_)o-	@:--%_hsc.c %_hsc.h %.hs : %.hsc-	$(HSC2HS) $(HSC_OPTS) $(SYMS) $<-	@touch $(patsubst %.hsc,%_hsc.c,$<)--%.$(way_)o : %.c-	@$(RM) $@-	$(GHC) $(CC_OPTS) -c $< -o $@--# preprocssed files, for haddock docs-%.raw-hs : %.lhs-	$(GHC) $(HC_OPTS) -D__HADDOCK__ -E -optP-P $< -o $@--%.raw-hs : %.hs-	$(GHC) $(HC_OPTS) -D__HADDOCK__ -E -optP-P $< -o $@---#-# Package creation-#--PKG_PREREQS = $(LIBRARY) $(GHCI_LIBRARY)--# in-tree package.conf-$(PKG).conf: $(PKG).conf.m4 $(PKG_PREREQS)-	@if [ ! -f $(PKG).conf ]; then echo [] > $(PKG).conf ; fi-	@m4 $(PKG).conf.m4 \-	  | sed 's/"",//g; s/, ""//g' \-	  | $(GHC_PKG) --force -f $(PKG).conf -u -	@$(RM) $(PKG).conf.old--# installable package.conf-$(PKG).conf.install: $(PKG).conf.m4 $(PKG_PREREQS)-	@if [ ! -f $(PKG).conf.install ]; then echo [] > $(PKG).conf.install; fi-	@m4 -D__INSTALLING__ $(PKG).conf.m4 \-	  | sed 's/"",//g; s/, ""//g' \-	  | $(GHC_PKG) --force -f $(PKG).conf.install -u -	@$(RM) $(PKG).conf.install.old--# (un-)register package.conf (needs usually be done as root-.PHONY: register unregister user-register user-unregister-register: $(PKG).conf.m4 $(PKG_PREREQS)-	@m4 -D__INSTALLING__ $(PKG).conf.m4 \-	  | sed 's/"",//g; s/, ""//g' \-	  | $(GHC_PKG) register ---user-register: $(PKG).conf.m4 $(PKG_PREREQS)-	@m4 -D__INSTALLING__ $(PKG).conf.m4 \-	  | sed 's/"",//g; s/, ""//g' \-	  | $(GHC_PKG) --user register ---unregister:-	$(GHC_PKG) unregister $(PKG)--user-unregister:-	$(GHC_PKG) --user unregister $(PKG)--EXTRA_CLEANS+= $(PKG).conf.install $(PKG).conf--lib :: $(PKG).conf---#-# Building the haddock docs-#-ifneq "$(HADDOCK)" ""--HTML_DIR      = html-HADDOCK_SRCS += $(HS_SRCS)-HS_PPS        = $(addsuffix .raw-hs, \-                        $(filter-out $(basename $(NO_DOCS)), \-                                $(basename $(HADDOCK_SRCS))))--CLEAN_FILES     += $(HS_PPS) $(EXTRA_HS_PPS)-CLEAN_DIRS      += $(HTML_DIR)--INSTALL_DATAS  += $(HTML_DIR)--DOC_INDEX  = html/index.html--# circular (excluded) modules first--$(DOC_INDEX): $(HS_PPS)-	@$(INSTALL_DIR) $(HTML_DIR)-	cd $(HTML_DIR) && $(HADDOCK) -h -k $(PKG) $(addprefix ../,$(HS_PPS))--.PHONY: doc-html:-	mkdir html--doc  :: $(DOC_INDEX)-# all  :: doc-endif---#-# cleaning-#-.PHONY: clean distclean--clean:-	$(RM) $(MOSTLY_CLEAN_FILES) $(EXTRA_CLEANS) $(CLEAN_FILES)-	$(RM) -rf $(CLEAN_DIRS)--distclean :: clean-	$(RM) $(DIST_CLEAN_FILES) *~ */*~-	$(RM) -rf $(DIST_CLEAN_DIRS)--#-# installing-#-# For each of these variables that is defined, you-# get one install rule-#-#       INSTALL_PROGS        executable programs in $(bindir)-#       INSTALL_LIBS         platform-dependent libraries in $(libdir) (ranlib'ed)-#       INSTALL_DATAS        platform-independent files in $(datadir)-#       INSTALL_IFACES       platform-dependent interface files in $(ifacedir)-#--.PHONY: install show-install--INSTALL_IFACES += $(HS_IFACES)-INSTALL_LIBS   += $(LIBRARY) $(GHCI_LIBRARY)--show-install :-	@echo "BINDIR  = $(BINDIR)"-	@echo "LIBDIR  = $(LIBDIR)"-	@echo "DATADIR = $(DATADIR)"-	@echo "INCDIR  = $(INCDIR)"--install :: all--# the sed is to strip any trailing '_' from the inplace bin names.-ifneq "$(INSTALL_PROGS)" ""-install :: $(INSTALL_PROGS)-	@$(INSTALL_DIR) $(BINDIR)-	@for i in $(INSTALL_PROGS); do \-        j=`echo $$i | sed 's/_$$//'` ;\-		echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(BINDIR)/$$j ;\-		$(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(BINDIR)/$$j ;\-	done-endif--ifneq "$(INSTALL_LIBS)" ""-install :: $(INSTALL_LIBS)-	@$(INSTALL_DIR) $(LIBDIR)-	@for i in $(INSTALL_LIBS); do \-		echo $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(LIBDIR) ;\-		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(LIBDIR) ;\-	done-endif--ifneq "$(INSTALL_DATAS)" ""-install :: $(INSTALL_DATAS)-	@$(INSTALL_DIR) $(DATADIR)-	@for i in $(INSTALL_DATAS); do \-		if [ -d $$i ] ; then \-			echo $(CP) -r $$i $(DATADIR)/ ;\-			$(CP) -r $$i $(DATADIR)/ ;\-		else \-			echo $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DATADIR)/ ;\-			$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DATADIR)/ ;\-		fi ;\-	done-endif--ifneq "$(INSTALL_IFACES)" ""-install :: $(INSTALL_IFACES)-	@$(INSTALL_DIR) $(IFACEDIR)-	@for i in $(INSTALL_IFACES); do \-	    $(INSTALL_DIR) $(IFACEDIR)/`dirname $$i` ;\-		echo $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(IFACEDIR)/`dirname $$i`/ ; \-		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(IFACEDIR)/`dirname $$i`/ ; \-	done-endif--ifneq "$(INSTALL_HEADERS)" ""-install :: $(INSTALL_HEADERS)-	@$(INSTALL_DIR) $(INCDIR)-	@for i in $(INSTALL_HEADERS); do \-		echo $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(INCDIR) ; \-		$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(INCDIR) ; \-	done-endif--install :: $(PKG).conf.install-	@$(INSTALL_DIR) $(LIBDIR)-	$(INSTALL_DATA) $(INSTALL_OPTS) $< $(LIBDIR)/$(PKG).conf-