This file is indexed.

/usr/share/doc/libghc-text-doc/html/src/Data-Text-IO-Internal.html is in libghc-text-doc 0.11.1.13-1build1.

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
178
<?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/IO/Internal.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.IO.Internal</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'>-- Low-level support for text I\/O.</span>
<a name="line-12"></a>
<a name="line-13"></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'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-14"></a>    <span class='hs-layout'>(</span>
<a name="line-15"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 612</span>
<a name="line-16"></a>      <span class='hs-varid'>hGetLineWith</span>
<a name="line-17"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>readChunk</span>
<a name="line-18"></a><span class='hs-cpp'>#endif</span>
<a name="line-19"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 612</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-layout'>(</span><span class='hs-varid'>catch</span><span class='hs-layout'>)</span>
<a name="line-23"></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-24"></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-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-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-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'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</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-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'>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-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'>Unsafe</span> <span class='hs-layout'>(</span><span class='hs-varid'>inlinePerformIO</span><span class='hs-layout'>)</span>
<a name="line-29"></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-30"></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-31"></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-32"></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-33"></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-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'>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-35"></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'>catch</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'>-&gt;</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;&gt;=</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'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;-</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'>&lt;-</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'>&lt;-</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'>&lt;-</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'>&lt;-</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-&gt;</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-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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;=</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'>&gt;=</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'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;=</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'>&gt;=</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'>&lt;</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'>-&gt;</span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>&lt;-</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'>&lt;-</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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>CharBuffer</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;-</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'>&lt;-</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'>&lt;-</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'>-&gt;</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>
<a name="line-167"></a><span class='hs-cpp'>#endif</span>
</pre></body>
</html>