-- GENERATED by C->Haskell Compiler, version 0.16.2 Crystal Seed, 24 Jan 2009 (Haskell) -- Edit the ORIGNAL .chs file instead! {-# LINE 1 "textmode.chs" #-}{- * withCString konvertiert von Haskell (d.h. Unicode) nach UTF-8 (je nach Locale) * puts aus der C-Bibliothek fügt einen Zeilenumbruch am Ende ein. -} import HsShellScript import System.IO import System.Posix.Process import System.Posix.Types import Foreign.C import Foreign.Ptr main = mainwrapper $ do h <- openFile "/home/v/src/hsskripte/tmp/txt" ReadMode hSetBinaryMode h True c <- hGetContents h seq (length c) (return ()) hClose h putStr ("Datei im Binär-Modus: " ++ c) h <- openFile "/home/v/src/hsskripte/tmp/txt" ReadMode hSetBinaryMode h False c <- hGetContents h seq (length c) (return ()) hClose h putStr ("Datei im Text-Modus: " ++ c) h <- openFile "/home/v/src/hsskripte/tmp/txt" ReadMode c <- hGetContents h seq (length c) (return ()) hClose h putStr ("Datei im voreingestellten Modus: " ++ c) let str = "-äöü-" putStrLn ("Haskell-Seite\n-------------"); putStrLn ("str = \"" ++ str ++ "\"\nLänge = " ++ show (length str)) putStrLn "\n1. withCString\n--------------" putStr ("Per withCString an die C-Seite übergeben = ") hFlush stdout print_utf8 str putStrLn "\n2. pipe_to zu einer IO-Aktion\n-----------------------------" pipe_to str lies_stdin putStrLn "\n2a. pipe_to zu einer IO-Aktion, im Binärmodus\n---------------------------------------------\n" pipe_to str lies_stdin_binary putStrLn "\n3. h_pipe_to' zu einer IO-Aktion\n-------------------------------" (h, pid) <- h_pipe_to' lies_stdin hPutStr h str hClose h getProcessStatus True False pid putStrLn "" putStrLn "\n4. h_pipe_to' zu /bin/cat\n------------------------\n" (h, pid) <- h_pipe_to' (do exec "/bin/cat" []) hPutStr h str hClose h getProcessStatus True False pid putStrLn "" putStrLn "\n5. pipes zu tmp/z\n--------------------\n" (Just h, _, _, pid) <- pipes (do exec "./z" []) True False False hSetBinaryMode h False hPutStr h str hClose h getProcessStatus True False pid putStrLn "" h_pipe_to' :: IO a -- ^ Action to run as a separate process, and to pipe to -> IO (Handle, ProcessID) -- ^ Returns handle connected to the standard input of the child process, and the child's process ID h_pipe_to' io = do (Just h, _, _, pid) <- pipes io True False False return (h, pid) lies_stdin = do hSetBinaryMode stdin False --XX daten <- hGetContents stdin putStrLn ("Angekommen: \"" ++ daten ++ "\", Länge = " ++ show (length daten)) hFlush stdout lies_stdin_binary = do hSetBinaryMode stdin True daten <- hGetContents stdin putStrLn ("Angekommen: \"" ++ daten ++ "\", Länge = " ++ show (length daten)) hFlush stdout puts_hs :: String -> IO () puts_hs str = do i <- withCString str $ \str -> puts str return () print_utf8 :: String -> IO () print_utf8 str = do i <- withCString str $ \str -> print_utf8_c str return () foreign import ccall safe "textmode.chs.h puts" puts :: ((Ptr CChar) -> (IO CInt)) foreign import ccall safe "textmode.chs.h print_utf8_c" print_utf8_c :: ((Ptr CChar) -> (IO ()))