packages feed

hsshellscript-3.3.1: test/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 -> {#call puts#} str
   return ()

print_utf8 :: String -> IO ()
print_utf8 str = do
   i <- withCString str $ \str -> {#call print_utf8_c#} str
   return ()


#c

#include <stdio.h>

void print_utf8_c(char* puf);

#endc