/usr/share/doc/libghc-text-doc/html/src/Data-Text-Internal-IO.html is in libghc-text-doc 1.2.2.0-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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | <?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>Data/Text/Internal/IO.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE BangPatterns, CPP, RecordWildCards #-}</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module : Data.Text.Internal.IO</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright : (c) 2009, 2010 Bryan O'Sullivan,</span>
<a name="line-5"></a><span class='hs-comment'>-- (c) 2009 Simon Marlow</span>
<a name="line-6"></a><span class='hs-comment'>-- License : BSD-style</span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer : bos@serpentine.com</span>
<a name="line-8"></a><span class='hs-comment'>-- Stability : experimental</span>
<a name="line-9"></a><span class='hs-comment'>-- Portability : GHC</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- /Warning/: this is an internal module, and does not have a stable</span>
<a name="line-12"></a><span class='hs-comment'>-- API or name. Functions in this module may not check or enforce</span>
<a name="line-13"></a><span class='hs-comment'>-- preconditions expected by public modules. Use at your own risk!</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- Low-level support for text I\/O.</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span>
<a name="line-18"></a> <span class='hs-layout'>(</span>
<a name="line-19"></a> <span class='hs-varid'>hGetLineWith</span>
<a name="line-20"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>readChunk</span>
<a name="line-21"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>E</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>IORef</span> <span class='hs-layout'>(</span><span class='hs-varid'>readIORef</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeIORef</span><span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span> <span class='hs-layout'>(</span><span class='hs-conid'>Text</span><span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span> <span class='hs-layout'>(</span><span class='hs-varid'>unstream</span><span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Stream</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Size</span> <span class='hs-layout'>(</span><span class='hs-varid'>exactSize</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxSize</span><span class='hs-layout'>)</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-layout'>(</span><span class='hs-varid'>inlinePerformIO</span><span class='hs-layout'>)</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>Storable</span> <span class='hs-layout'>(</span><span class='hs-varid'>peekElemOff</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Buffer</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>CharBuffer</span><span class='hs-layout'>,</span> <span class='hs-conid'>RawCharBuffer</span><span class='hs-layout'>,</span> <span class='hs-varid'>bufferAdjustL</span><span class='hs-layout'>,</span>
<a name="line-32"></a> <span class='hs-varid'>bufferElems</span><span class='hs-layout'>,</span> <span class='hs-varid'>charSize</span><span class='hs-layout'>,</span> <span class='hs-varid'>isEmptyBuffer</span><span class='hs-layout'>,</span> <span class='hs-varid'>readCharBuf</span><span class='hs-layout'>,</span>
<a name="line-33"></a> <span class='hs-varid'>withRawBuffer</span><span class='hs-layout'>,</span> <span class='hs-varid'>writeCharBuf</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span><span class='hs-varop'>.</span><span class='hs-conid'>Internals</span> <span class='hs-layout'>(</span><span class='hs-varid'>ioe_EOF</span><span class='hs-layout'>,</span> <span class='hs-varid'>readTextDevice</span><span class='hs-layout'>,</span> <span class='hs-varid'>wantReadableHandle_</span><span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span> <span class='hs-layout'>(</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Newline</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-36"></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-layout'>(</span><span class='hs-conid'>Handle</span><span class='hs-layout'>)</span>
<a name="line-37"></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-varop'>.</span><span class='hs-conid'>Error</span> <span class='hs-layout'>(</span><span class='hs-varid'>isEOFError</span><span class='hs-layout'>)</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>T</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="hGetLineWith"></a><span class='hs-comment'>-- | Read a single line of input from a handle, constructing a list of</span>
<a name="line-41"></a><span class='hs-comment'>-- decoded chunks as we go. When we're done, transform them into the</span>
<a name="line-42"></a><span class='hs-comment'>-- destination type.</span>
<a name="line-43"></a><span class='hs-definition'>hGetLineWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>t</span>
<a name="line-44"></a><span class='hs-definition'>hGetLineWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wantReadableHandle_</span> <span class='hs-str'>"hGetLine"</span> <span class='hs-varid'>h</span> <span class='hs-varid'>go</span>
<a name="line-45"></a> <span class='hs-keyword'>where</span>
<a name="line-46"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>hh</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haCharBuffer</span> <span class='hs-varop'>>>=</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hGetLineLoop</span> <span class='hs-varid'>hh</span> <span class='hs-conid'>[]</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="hGetLineLoop"></a><span class='hs-definition'>hGetLineLoop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle__</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span>
<a name="line-49"></a><span class='hs-definition'>hGetLineLoop</span> <span class='hs-varid'>hh</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-keyword'>where</span>
<a name="line-50"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>ts</span> <span class='hs-varid'>buf</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Buffer</span><span class='hs-layout'>{</span> <span class='hs-varid'>bufL</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>r0</span><span class='hs-layout'>,</span> <span class='hs-varid'>bufR</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>bufRaw</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>raw0</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-51"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>findEOL</span> <span class='hs-varid'>raw</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>False</span><span class='hs-layout'>,</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-52"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-53"></a> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>readCharBuf</span> <span class='hs-varid'>raw</span> <span class='hs-varid'>r</span>
<a name="line-54"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\n'</span>
<a name="line-55"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>True</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-56"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>findEOL</span> <span class='hs-varid'>raw</span> <span class='hs-varid'>r'</span>
<a name="line-57"></a> <span class='hs-layout'>(</span><span class='hs-varid'>eol</span><span class='hs-layout'>,</span> <span class='hs-varid'>off</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>findEOL</span> <span class='hs-varid'>raw0</span> <span class='hs-varid'>r0</span>
<a name="line-58"></a> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>haInputNL</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CRLF</span>
<a name="line-59"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>unpack_nl</span> <span class='hs-varid'>raw0</span> <span class='hs-varid'>r0</span> <span class='hs-varid'>off</span>
<a name="line-60"></a> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>unpack</span> <span class='hs-varid'>raw0</span> <span class='hs-varid'>r0</span> <span class='hs-varid'>off</span>
<a name="line-61"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>off</span><span class='hs-layout'>)</span>
<a name="line-62"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>eol</span>
<a name="line-63"></a> <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>haCharBuffer</span> <span class='hs-layout'>(</span><span class='hs-varid'>bufferAdjustL</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>buf</span><span class='hs-layout'>)</span>
<a name="line-64"></a> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reverse</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-varid'>ts</span><span class='hs-layout'>)</span>
<a name="line-65"></a> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-66"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>buf1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bufferAdjustL</span> <span class='hs-varid'>r'</span> <span class='hs-varid'>buf</span>
<a name="line-67"></a> <span class='hs-varid'>maybe_buf</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>maybeFillReadBuffer</span> <span class='hs-varid'>hh</span> <span class='hs-varid'>buf1</span>
<a name="line-68"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>maybe_buf</span> <span class='hs-keyword'>of</span>
<a name="line-69"></a> <span class='hs-comment'>-- Nothing indicates we caught an EOF, and we may have a</span>
<a name="line-70"></a> <span class='hs-comment'>-- partial line to return.</span>
<a name="line-71"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-72"></a> <span class='hs-comment'>-- we reached EOF. There might be a lone \r left</span>
<a name="line-73"></a> <span class='hs-comment'>-- in the buffer, so check for that and</span>
<a name="line-74"></a> <span class='hs-comment'>-- append it to the line if necessary.</span>
<a name="line-75"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>pre</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isEmptyBuffer</span> <span class='hs-varid'>buf1</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-76"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>singleton</span> <span class='hs-chr'>'\r'</span>
<a name="line-77"></a> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>haCharBuffer</span> <span class='hs-varid'>buf1</span><span class='hs-layout'>{</span> <span class='hs-varid'>bufL</span><span class='hs-keyglyph'>=</span><span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>bufR</span><span class='hs-keyglyph'>=</span><span class='hs-num'>0</span> <span class='hs-layout'>}</span>
<a name="line-78"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>.</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>pre</span><span class='hs-conop'>:</span><span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-varid'>ts</span>
<a name="line-79"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>str</span>
<a name="line-80"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>ioe_EOF</span>
<a name="line-81"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-varid'>str</span>
<a name="line-82"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>new_buf</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-varid'>ts</span><span class='hs-layout'>)</span> <span class='hs-varid'>new_buf</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="maybeFillReadBuffer"></a><span class='hs-comment'>-- This function is lifted almost verbatim from GHC.IO.Handle.Text.</span>
<a name="line-85"></a><span class='hs-definition'>maybeFillReadBuffer</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle__</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>CharBuffer</span><span class='hs-layout'>)</span>
<a name="line-86"></a><span class='hs-definition'>maybeFillReadBuffer</span> <span class='hs-varid'>handle_</span> <span class='hs-varid'>buf</span>
<a name="line-87"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-varid'>catch</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>getSomeCharacters</span> <span class='hs-varid'>handle_</span> <span class='hs-varid'>buf</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-></span>
<a name="line-88"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>isEOFError</span> <span class='hs-varid'>e</span>
<a name="line-89"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-90"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>ioError</span> <span class='hs-varid'>e</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="unpack"></a><span class='hs-definition'>unpack</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RawCharBuffer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Text</span>
<a name="line-93"></a><a name="!"></a><span class='hs-definition'>unpack</span> <span class='hs-varop'>!</span><span class='hs-varid'>buf</span> <span class='hs-varop'>!</span><span class='hs-varid'>r</span> <span class='hs-varop'>!</span><span class='hs-varid'>w</span>
<a name="line-94"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>charSize</span> <span class='hs-varop'>/=</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sizeError</span> <span class='hs-str'>"unpack"</span>
<a name="line-95"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-96"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRawBuffer</span> <span class='hs-varid'>buf</span> <span class='hs-varid'>go</span>
<a name="line-97"></a> <span class='hs-keyword'>where</span>
<a name="line-98"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>pbuf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>unstream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>next</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>exactSize</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-comment'>-</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-99"></a> <span class='hs-keyword'>where</span>
<a name="line-100"></a> <span class='hs-varid'>next</span> <span class='hs-varop'>!</span><span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span>
<a name="line-101"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Yield</span> <span class='hs-layout'>(</span><span class='hs-varid'>ix</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-102"></a> <span class='hs-varid'>ix</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePerformIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>peekElemOff</span> <span class='hs-varid'>pbuf</span> <span class='hs-varid'>i</span>
<a name="line-103"></a>
<a name="line-104"></a><a name="unpack_nl"></a><span class='hs-definition'>unpack_nl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RawCharBuffer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Text</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-105"></a><span class='hs-definition'>unpack_nl</span> <span class='hs-varop'>!</span><span class='hs-varid'>buf</span> <span class='hs-varop'>!</span><span class='hs-varid'>r</span> <span class='hs-varop'>!</span><span class='hs-varid'>w</span>
<a name="line-106"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>charSize</span> <span class='hs-varop'>/=</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sizeError</span> <span class='hs-str'>"unpack_nl"</span>
<a name="line-107"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-108"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withRawBuffer</span> <span class='hs-varid'>buf</span> <span class='hs-varop'>$</span> <span class='hs-varid'>go</span>
<a name="line-109"></a> <span class='hs-keyword'>where</span>
<a name="line-110"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>pbuf</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-111"></a> <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unstream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>next</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>maxSize</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-comment'>-</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-112"></a> <span class='hs-varid'>w'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span>
<a name="line-113"></a> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>ix</span> <span class='hs-varid'>w'</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\r'</span>
<a name="line-114"></a> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>w'</span><span class='hs-layout'>)</span>
<a name="line-115"></a> <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-116"></a> <span class='hs-keyword'>where</span>
<a name="line-117"></a> <span class='hs-varid'>next</span> <span class='hs-varop'>!</span><span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span>
<a name="line-118"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\r'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span>
<a name="line-119"></a> <span class='hs-keyword'>in</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>i'</span> <span class='hs-varop'><</span> <span class='hs-varid'>w</span>
<a name="line-120"></a> <span class='hs-keyword'>then</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>ix</span> <span class='hs-varid'>i'</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\n'</span>
<a name="line-121"></a> <span class='hs-keyword'>then</span> <span class='hs-conid'>Yield</span> <span class='hs-chr'>'\n'</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-122"></a> <span class='hs-keyword'>else</span> <span class='hs-conid'>Yield</span> <span class='hs-chr'>'\n'</span> <span class='hs-varid'>i'</span>
<a name="line-123"></a> <span class='hs-keyword'>else</span> <span class='hs-conid'>Done</span>
<a name="line-124"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Yield</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-125"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ix</span> <span class='hs-varid'>i</span>
<a name="line-126"></a> <span class='hs-varid'>ix</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inlinePerformIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>peekElemOff</span> <span class='hs-varid'>pbuf</span> <span class='hs-varid'>i</span>
<a name="line-127"></a>
<a name="line-128"></a><a name="getSomeCharacters"></a><span class='hs-comment'>-- This function is completely lifted from GHC.IO.Handle.Text.</span>
<a name="line-129"></a><span class='hs-definition'>getSomeCharacters</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle__</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>CharBuffer</span>
<a name="line-130"></a><span class='hs-definition'>getSomeCharacters</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>buf</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Buffer</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span>
<a name="line-131"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>bufferElems</span> <span class='hs-varid'>buf</span> <span class='hs-keyword'>of</span>
<a name="line-132"></a> <span class='hs-comment'>-- buffer empty: read some more</span>
<a name="line-133"></a> <span class='hs-num'>0</span> <span class='hs-keyglyph'>-></span> <span class='hs-comment'>{-# SCC "readTextDevice" #-}</span> <span class='hs-varid'>readTextDevice</span> <span class='hs-varid'>handle_</span> <span class='hs-varid'>buf</span>
<a name="line-134"></a>
<a name="line-135"></a> <span class='hs-comment'>-- if the buffer has a single '\r' in it and we're doing newline</span>
<a name="line-136"></a> <span class='hs-comment'>-- translation: read some more</span>
<a name="line-137"></a> <span class='hs-num'>1</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>haInputNL</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CRLF</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-138"></a> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>readCharBuf</span> <span class='hs-varid'>bufRaw</span> <span class='hs-varid'>bufL</span>
<a name="line-139"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\r'</span>
<a name="line-140"></a> <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-comment'>-- shuffle the '\r' to the beginning. This is only safe</span>
<a name="line-141"></a> <span class='hs-comment'>-- if we're about to call readTextDevice, otherwise it</span>
<a name="line-142"></a> <span class='hs-comment'>-- would mess up flushCharBuffer.</span>
<a name="line-143"></a> <span class='hs-comment'>-- See [note Buffer Flushing], GHC.IO.Handle.Types</span>
<a name="line-144"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>writeCharBuf</span> <span class='hs-varid'>bufRaw</span> <span class='hs-num'>0</span> <span class='hs-chr'>'\r'</span>
<a name="line-145"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>buf'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>buf</span><span class='hs-layout'>{</span> <span class='hs-varid'>bufL</span><span class='hs-keyglyph'>=</span><span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>bufR</span><span class='hs-keyglyph'>=</span><span class='hs-num'>1</span> <span class='hs-layout'>}</span>
<a name="line-146"></a> <span class='hs-varid'>readTextDevice</span> <span class='hs-varid'>handle_</span> <span class='hs-varid'>buf'</span>
<a name="line-147"></a> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-148"></a> <span class='hs-varid'>return</span> <span class='hs-varid'>buf</span>
<a name="line-149"></a>
<a name="line-150"></a> <span class='hs-comment'>-- buffer has some chars in it already: just return it</span>
<a name="line-151"></a> <span class='hs-sel'>_otherwise</span> <span class='hs-keyglyph'>-></span> <span class='hs-comment'>{-# SCC "otherwise" #-}</span> <span class='hs-varid'>return</span> <span class='hs-varid'>buf</span>
<a name="line-152"></a>
<a name="line-153"></a><a name="readChunk"></a><span class='hs-comment'>-- | Read a single chunk of strict text from a buffer. Used by both</span>
<a name="line-154"></a><span class='hs-comment'>-- the strict and lazy implementations of hGetContents.</span>
<a name="line-155"></a><span class='hs-definition'>readChunk</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle__</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Text</span>
<a name="line-156"></a><span class='hs-definition'>readChunk</span> <span class='hs-varid'>hh</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>buf</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-157"></a> <span class='hs-varid'>buf'</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Buffer</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>getSomeCharacters</span> <span class='hs-varid'>hh</span> <span class='hs-varid'>buf</span>
<a name="line-158"></a> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>haInputNL</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CRLF</span>
<a name="line-159"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>unpack_nl</span> <span class='hs-varid'>bufRaw</span> <span class='hs-varid'>bufL</span> <span class='hs-varid'>bufR</span>
<a name="line-160"></a> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>unpack</span> <span class='hs-varid'>bufRaw</span> <span class='hs-varid'>bufL</span> <span class='hs-varid'>bufR</span>
<a name="line-161"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-layout'>,</span><span class='hs-varid'>bufR</span><span class='hs-layout'>)</span>
<a name="line-162"></a> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>haCharBuffer</span> <span class='hs-layout'>(</span><span class='hs-varid'>bufferAdjustL</span> <span class='hs-varid'>r</span> <span class='hs-varid'>buf'</span><span class='hs-layout'>)</span>
<a name="line-163"></a> <span class='hs-varid'>return</span> <span class='hs-varid'>t</span>
<a name="line-164"></a>
<a name="line-165"></a><a name="sizeError"></a><span class='hs-definition'>sizeError</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-166"></a><span class='hs-definition'>sizeError</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Data.Text.IO."</span> <span class='hs-varop'>++</span> <span class='hs-varid'>loc</span> <span class='hs-varop'>++</span> <span class='hs-str'>": bad internal buffer size"</span>
</pre></body>
</html>
|