/usr/share/doc/libghc-hledger-lib-doc/html/src/Hledger-Utils-UTF8IOCompat.html is in libghc-hledger-lib-doc 0.22-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Hledger/Utils/UTF8IOCompat.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</span>
<a name="line-2"></a><span class='hs-comment'>{- |
<a name="line-3"></a>
<a name="line-4"></a>UTF-8 aware string IO functions that will work across multiple platforms
<a name="line-5"></a>and GHC versions. Includes code from Text.Pandoc.UTF8 ((C) 2010 John
<a name="line-6"></a>MacFarlane).
<a name="line-7"></a>
<a name="line-8"></a>Example usage:
<a name="line-9"></a>
<a name="line-10"></a> import Prelude hiding (readFile,writeFile,appendFile,getContents,putStr,putStrLn)
<a name="line-11"></a> import UTF8IOCompat (readFile,writeFile,appendFile,getContents,putStr,putStrLn)
<a name="line-12"></a> import UTF8IOCompat (SystemString,fromSystemString,toSystemString,error',userError')
<a name="line-13"></a>
<a name="line-14"></a>2013/4/10 update: we now trust that current GHC versions & platforms
<a name="line-15"></a>do the right thing, so this file is a no-op and on its way to being removed.
<a name="line-16"></a>Not carefully tested.
<a name="line-17"></a>
<a name="line-18"></a>-}</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Hledger</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span><span class='hs-varop'>.</span><span class='hs-conid'>UTF8IOCompat</span> <span class='hs-layout'>(</span>
<a name="line-21"></a> <span class='hs-varid'>readFile</span><span class='hs-layout'>,</span>
<a name="line-22"></a> <span class='hs-varid'>writeFile</span><span class='hs-layout'>,</span>
<a name="line-23"></a> <span class='hs-varid'>appendFile</span><span class='hs-layout'>,</span>
<a name="line-24"></a> <span class='hs-varid'>getContents</span><span class='hs-layout'>,</span>
<a name="line-25"></a> <span class='hs-varid'>hGetContents</span><span class='hs-layout'>,</span>
<a name="line-26"></a> <span class='hs-varid'>putStr</span><span class='hs-layout'>,</span>
<a name="line-27"></a> <span class='hs-varid'>putStrLn</span><span class='hs-layout'>,</span>
<a name="line-28"></a> <span class='hs-varid'>hPutStr</span><span class='hs-layout'>,</span>
<a name="line-29"></a> <span class='hs-varid'>hPutStrLn</span><span class='hs-layout'>,</span>
<a name="line-30"></a> <span class='hs-comment'>--</span>
<a name="line-31"></a> <span class='hs-conid'>SystemString</span><span class='hs-layout'>,</span>
<a name="line-32"></a> <span class='hs-varid'>fromSystemString</span><span class='hs-layout'>,</span>
<a name="line-33"></a> <span class='hs-varid'>toSystemString</span><span class='hs-layout'>,</span>
<a name="line-34"></a> <span class='hs-varid'>error'</span><span class='hs-layout'>,</span>
<a name="line-35"></a> <span class='hs-varid'>userError'</span><span class='hs-layout'>,</span>
<a name="line-36"></a><span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>where</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-comment'>-- import Control.Monad (liftM)</span>
<a name="line-40"></a><span class='hs-comment'>-- import qualified Data.ByteString.Lazy as B</span>
<a name="line-41"></a><span class='hs-comment'>-- import qualified Data.ByteString.Lazy.Char8 as B8</span>
<a name="line-42"></a><span class='hs-comment'>-- import qualified Data.ByteString.Lazy.UTF8 as U8 (toString, fromString)</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>readFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>appendFile</span><span class='hs-layout'>,</span> <span class='hs-varid'>getContents</span><span class='hs-layout'>,</span> <span class='hs-varid'>putStr</span><span class='hs-layout'>,</span> <span class='hs-varid'>putStrLn</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span> <span class='hs-comment'>-- (Handle)</span>
<a name="line-45"></a><span class='hs-comment'>-- #if __GLASGOW_HASKELL__ < 702</span>
<a name="line-46"></a><span class='hs-comment'>-- import Codec.Binary.UTF8.String as UTF8 (decodeString, encodeString, isUTF8Encoded)</span>
<a name="line-47"></a><span class='hs-comment'>-- import System.Info (os)</span>
<a name="line-48"></a><span class='hs-comment'>-- #endif</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-comment'>-- bom :: B.ByteString</span>
<a name="line-51"></a><span class='hs-comment'>-- bom = B.pack [0xEF, 0xBB, 0xBF]</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-comment'>-- stripBOM :: B.ByteString -> B.ByteString</span>
<a name="line-54"></a><span class='hs-comment'>-- stripBOM s | bom `B.isPrefixOf` s = B.drop 3 s</span>
<a name="line-55"></a><span class='hs-comment'>-- stripBOM s = s</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-comment'>-- readFile :: FilePath -> IO String</span>
<a name="line-58"></a><span class='hs-comment'>-- readFile = liftM (U8.toString . stripBOM) . B.readFile</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-comment'>-- writeFile :: FilePath -> String -> IO ()</span>
<a name="line-61"></a><span class='hs-comment'>-- writeFile f = B.writeFile f . U8.fromString</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-comment'>-- appendFile :: FilePath -> String -> IO ()</span>
<a name="line-64"></a><span class='hs-comment'>-- appendFile f = B.appendFile f . U8.fromString</span>
<a name="line-65"></a>
<a name="line-66"></a><span class='hs-comment'>-- getContents :: IO String</span>
<a name="line-67"></a><span class='hs-comment'>-- getContents = liftM (U8.toString . stripBOM) B.getContents</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-comment'>-- hGetContents :: Handle -> IO String</span>
<a name="line-70"></a><span class='hs-comment'>-- hGetContents h = liftM (U8.toString . stripBOM) (B.hGetContents h)</span>
<a name="line-71"></a>
<a name="line-72"></a><span class='hs-comment'>-- putStr :: String -> IO ()</span>
<a name="line-73"></a><span class='hs-comment'>-- putStr = bs_putStr . U8.fromString</span>
<a name="line-74"></a>
<a name="line-75"></a><span class='hs-comment'>-- putStrLn :: String -> IO ()</span>
<a name="line-76"></a><span class='hs-comment'>-- putStrLn = bs_putStrLn . U8.fromString</span>
<a name="line-77"></a>
<a name="line-78"></a><span class='hs-comment'>-- hPutStr :: Handle -> String -> IO ()</span>
<a name="line-79"></a><span class='hs-comment'>-- hPutStr h = bs_hPutStr h . U8.fromString</span>
<a name="line-80"></a>
<a name="line-81"></a><span class='hs-comment'>-- hPutStrLn :: Handle -> String -> IO ()</span>
<a name="line-82"></a><span class='hs-comment'>-- hPutStrLn h = bs_hPutStrLn h . U8.fromString</span>
<a name="line-83"></a>
<a name="line-84"></a><span class='hs-comment'>-- -- span GHC versions including 6.12.3 - 7.4.1:</span>
<a name="line-85"></a><span class='hs-comment'>-- bs_putStr = B8.putStr</span>
<a name="line-86"></a><span class='hs-comment'>-- bs_putStrLn = B8.putStrLn</span>
<a name="line-87"></a><span class='hs-comment'>-- bs_hPutStr = B8.hPut</span>
<a name="line-88"></a><span class='hs-comment'>-- bs_hPutStrLn h bs = B8.hPut h bs >> B8.hPut h (B.singleton 0x0a)</span>
<a name="line-89"></a>
<a name="line-90"></a>
<a name="line-91"></a><a name="SystemString"></a><span class='hs-comment'>-- | A string received from or being passed to the operating system, such</span>
<a name="line-92"></a><a name="SystemString"></a><span class='hs-comment'>-- as a file path, command-line argument, or environment variable name or</span>
<a name="line-93"></a><a name="SystemString"></a><span class='hs-comment'>-- value. With GHC versions before 7.2 on some platforms (posix) these are</span>
<a name="line-94"></a><a name="SystemString"></a><span class='hs-comment'>-- typically encoded. When converting, we assume the encoding is UTF-8 (cf</span>
<a name="line-95"></a><a name="SystemString"></a><span class='hs-comment'>-- <<a href="http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html#UTF8">http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html#UTF8</a>>).</span>
<a name="line-96"></a><a name="SystemString"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SystemString</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="fromSystemString"></a><span class='hs-comment'>-- | Convert a system string to an ordinary string, decoding from UTF-8 if</span>
<a name="line-99"></a><span class='hs-comment'>-- it appears to be UTF8-encoded and GHC version is less than 7.2.</span>
<a name="line-100"></a><span class='hs-definition'>fromSystemString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SystemString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span>
<a name="line-101"></a><span class='hs-comment'>-- #if __GLASGOW_HASKELL__ < 702</span>
<a name="line-102"></a><span class='hs-comment'>-- fromSystemString s = if UTF8.isUTF8Encoded s then UTF8.decodeString s else s</span>
<a name="line-103"></a><span class='hs-comment'>-- #else</span>
<a name="line-104"></a><span class='hs-definition'>fromSystemString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-105"></a><span class='hs-comment'>-- #endif</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="toSystemString"></a><span class='hs-comment'>-- | Convert a unicode string to a system string, encoding with UTF-8 if</span>
<a name="line-108"></a><span class='hs-comment'>-- we are on a posix platform with GHC < 7.2.</span>
<a name="line-109"></a><span class='hs-definition'>toSystemString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SystemString</span>
<a name="line-110"></a><span class='hs-comment'>-- #if __GLASGOW_HASKELL__ < 702</span>
<a name="line-111"></a><span class='hs-comment'>-- toSystemString = case os of</span>
<a name="line-112"></a><span class='hs-comment'>-- "unix" -> UTF8.encodeString</span>
<a name="line-113"></a><span class='hs-comment'>-- "linux" -> UTF8.encodeString</span>
<a name="line-114"></a><span class='hs-comment'>-- "darwin" -> UTF8.encodeString</span>
<a name="line-115"></a><span class='hs-comment'>-- _ -> id</span>
<a name="line-116"></a><span class='hs-comment'>-- #else</span>
<a name="line-117"></a><span class='hs-definition'>toSystemString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-118"></a><span class='hs-comment'>-- #endif</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="error'"></a><span class='hs-comment'>-- | A SystemString-aware version of error.</span>
<a name="line-121"></a><span class='hs-definition'>error'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span>
<a name="line-122"></a><span class='hs-definition'>error'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toSystemString</span>
<a name="line-123"></a>
<a name="line-124"></a><a name="userError'"></a><span class='hs-comment'>-- | A SystemString-aware version of userError.</span>
<a name="line-125"></a><span class='hs-definition'>userError'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IOError</span>
<a name="line-126"></a><span class='hs-definition'>userError'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>userError</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toSystemString</span>
</pre></body>
</html>
|