This file is indexed.

/usr/share/doc/libghc-text-doc/html/src/Data-Text-Foreign.html is in libghc-text-doc 1.2.2.1-3.

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
179
180
181
182
183
184
<?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/Foreign.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, GeneralizedNewtypeDeriving #-}</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      : Data.Text.Foreign</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'>--</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'>-- Support for using 'Text' data with native code via the Haskell</span>
<a name="line-12"></a><span class='hs-comment'>-- foreign function interface.</span>
<a name="line-13"></a>
<a name="line-14"></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'>Foreign</span>
<a name="line-15"></a>    <span class='hs-layout'>(</span>
<a name="line-16"></a>    <span class='hs-comment'>-- * Interoperability with native code</span>
<a name="line-17"></a>    <span class='hs-comment'>-- $interop</span>
<a name="line-18"></a>      <span class='hs-conid'>I16</span>
<a name="line-19"></a>    <span class='hs-comment'>-- * Safe conversion functions</span>
<a name="line-20"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>fromPtr</span>
<a name="line-21"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>useAsPtr</span>
<a name="line-22"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>asForeignPtr</span>
<a name="line-23"></a>    <span class='hs-comment'>-- ** Encoding as UTF-8</span>
<a name="line-24"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>peekCStringLen</span>
<a name="line-25"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>withCStringLen</span>
<a name="line-26"></a>    <span class='hs-comment'>-- * Unsafe conversion code</span>
<a name="line-27"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>lengthWord16</span>
<a name="line-28"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>unsafeCopyToPtr</span>
<a name="line-29"></a>    <span class='hs-comment'>-- * Low-level manipulation</span>
<a name="line-30"></a>    <span class='hs-comment'>-- $lowlevel</span>
<a name="line-31"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>dropWord16</span>
<a name="line-32"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>takeWord16</span>
<a name="line-33"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-34"></a>
<a name="line-35"></a><span class='hs-cpp'>#if defined(ASSERTS)</span>
<a name="line-36"></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'>assert</span><span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-cpp'>#endif</span>
<a name="line-38"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 702</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>ST</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeIOToST</span><span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-cpp'>#else</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>ST</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeIOToST</span><span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-cpp'>#endif</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafePackCStringLen</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeUseAsCStringLen</span><span class='hs-layout'>)</span>
<a name="line-44"></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'>Encoding</span> <span class='hs-layout'>(</span><span class='hs-varid'>decodeUtf8</span><span class='hs-layout'>,</span> <span class='hs-varid'>encodeUtf8</span><span class='hs-layout'>)</span>
<a name="line-45"></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-layout'>(</span><span class='hs-conid'>Text</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>empty</span><span class='hs-layout'>)</span>
<a name="line-46"></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'>lengthWord16</span><span class='hs-layout'>)</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span> <span class='hs-layout'>(</span><span class='hs-conid'>Word16</span><span class='hs-layout'>)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>CStringLen</span><span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>ForeignPtr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mallocForeignPtrArray</span><span class='hs-layout'>,</span> <span class='hs-varid'>withForeignPtr</span><span class='hs-layout'>)</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>Marshal</span><span class='hs-varop'>.</span><span class='hs-conid'>Alloc</span> <span class='hs-layout'>(</span><span class='hs-varid'>allocaBytes</span><span class='hs-layout'>)</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>Ptr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span><span class='hs-layout'>,</span> <span class='hs-varid'>castPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusPtr</span><span class='hs-layout'>)</span>
<a name="line-52"></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'>peek</span><span class='hs-layout'>,</span> <span class='hs-varid'>poke</span><span class='hs-layout'>)</span>
<a name="line-53"></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-varop'>.</span><span class='hs-conid'>Array</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>A</span>
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-comment'>-- $interop</span>
<a name="line-56"></a><span class='hs-comment'>--</span>
<a name="line-57"></a><span class='hs-comment'>-- The 'Text' type is implemented using arrays that are not guaranteed</span>
<a name="line-58"></a><span class='hs-comment'>-- to have a fixed address in the Haskell heap. All communication with</span>
<a name="line-59"></a><span class='hs-comment'>-- native code must thus occur by copying data back and forth.</span>
<a name="line-60"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><span class='hs-comment'>-- The 'Text' type's internal representation is UTF-16, using the</span>
<a name="line-62"></a><span class='hs-comment'>-- platform's native endianness.  This makes copied data suitable for</span>
<a name="line-63"></a><span class='hs-comment'>-- use with native libraries that use a similar representation, such</span>
<a name="line-64"></a><span class='hs-comment'>-- as ICU.  To interoperate with native libraries that use different</span>
<a name="line-65"></a><span class='hs-comment'>-- internal representations, such as UTF-8 or UTF-32, consider using</span>
<a name="line-66"></a><span class='hs-comment'>-- the functions in the 'Data.Text.Encoding' module.</span>
<a name="line-67"></a>
<a name="line-68"></a><a name="I16"></a><span class='hs-comment'>-- | A type representing a number of UTF-16 code units.</span>
<a name="line-69"></a><a name="I16"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>I16</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>I16</span> <span class='hs-conid'>Int</span>
<a name="line-70"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bounded</span><span class='hs-layout'>,</span> <span class='hs-conid'>Enum</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Integral</span><span class='hs-layout'>,</span> <span class='hs-conid'>Num</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Real</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="fromPtr"></a><span class='hs-comment'>-- | /O(n)/ Create a new 'Text' from a 'Ptr' 'Word16' by copying the</span>
<a name="line-73"></a><span class='hs-comment'>-- contents of the array.</span>
<a name="line-74"></a><span class='hs-definition'>fromPtr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word16</span>           <span class='hs-comment'>-- ^ source array</span>
<a name="line-75"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>I16</span>                  <span class='hs-comment'>-- ^ length of source array (in 'Word16' units)</span>
<a name="line-76"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Text</span>
<a name="line-77"></a><span class='hs-definition'>fromPtr</span> <span class='hs-keyword'>_</span>   <span class='hs-layout'>(</span><span class='hs-conid'>I16</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>empty</span>
<a name="line-78"></a><span class='hs-definition'>fromPtr</span> <span class='hs-varid'>ptr</span> <span class='hs-layout'>(</span><span class='hs-conid'>I16</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-79"></a><span class='hs-cpp'>#if defined(ASSERTS)</span>
<a name="line-80"></a>    <span class='hs-varid'>assert</span> <span class='hs-layout'>(</span><span class='hs-varid'>len</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-81"></a><span class='hs-cpp'>#endif</span>
<a name="line-82"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-num'>0</span> <span class='hs-varid'>len</span>
<a name="line-83"></a>  <span class='hs-keyword'>where</span>
<a name="line-84"></a>    <span class='hs-varid'>arr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>new</span> <span class='hs-varid'>len</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>copy</span><span class='hs-layout'>)</span>
<a name="line-85"></a>    <span class='hs-varid'>copy</span> <span class='hs-varid'>marr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>ptr</span> <span class='hs-num'>0</span>
<a name="line-86"></a>      <span class='hs-keyword'>where</span>
<a name="line-87"></a>        <span class='hs-varid'>loop</span> <span class='hs-varop'>!</span><span class='hs-varid'>p</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'>len</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>marr</span>
<a name="line-88"></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-89"></a>          <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>i</span> <span class='hs-varop'>=&lt;&lt;</span> <span class='hs-varid'>unsafeIOToST</span> <span class='hs-layout'>(</span><span class='hs-varid'>peek</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-90"></a>          <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-num'>2</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-91"></a>
<a name="line-92"></a><span class='hs-comment'>-- $lowlevel</span>
<a name="line-93"></a><span class='hs-comment'>--</span>
<a name="line-94"></a><span class='hs-comment'>-- Foreign functions that use UTF-16 internally may return indices in</span>
<a name="line-95"></a><span class='hs-comment'>-- units of 'Word16' instead of characters.  These functions may</span>
<a name="line-96"></a><span class='hs-comment'>-- safely be used with such indices, as they will adjust offsets if</span>
<a name="line-97"></a><span class='hs-comment'>-- necessary to preserve the validity of a Unicode string.</span>
<a name="line-98"></a>
<a name="line-99"></a><a name="takeWord16"></a><span class='hs-comment'>-- | /O(1)/ Return the prefix of the 'Text' of @n@ 'Word16' units in</span>
<a name="line-100"></a><span class='hs-comment'>-- length.</span>
<a name="line-101"></a><span class='hs-comment'>--</span>
<a name="line-102"></a><span class='hs-comment'>-- If @n@ would cause the 'Text' to end inside a surrogate pair, the</span>
<a name="line-103"></a><span class='hs-comment'>-- end of the prefix will be advanced by one additional 'Word16' unit</span>
<a name="line-104"></a><span class='hs-comment'>-- to maintain its validity.</span>
<a name="line-105"></a><span class='hs-definition'>takeWord16</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>I16</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span>
<a name="line-106"></a><span class='hs-definition'>takeWord16</span> <span class='hs-layout'>(</span><span class='hs-conid'>I16</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span>
<a name="line-107"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-108"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>len</span> <span class='hs-varop'>||</span> <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>len</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span>
<a name="line-109"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>m</span>
<a name="line-110"></a>  <span class='hs-keyword'>where</span>
<a name="line-111"></a>    <span class='hs-varid'>m</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0xDB00</span> <span class='hs-varop'>||</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0xD8FF</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-112"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span>
<a name="line-113"></a>    <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeIndex</span> <span class='hs-varid'>arr</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="dropWord16"></a><span class='hs-comment'>-- | /O(1)/ Return the suffix of the 'Text', with @n@ 'Word16' units</span>
<a name="line-116"></a><span class='hs-comment'>-- dropped from its beginning.</span>
<a name="line-117"></a><span class='hs-comment'>--</span>
<a name="line-118"></a><span class='hs-comment'>-- If @n@ would cause the 'Text' to begin inside a surrogate pair, the</span>
<a name="line-119"></a><span class='hs-comment'>-- beginning of the suffix will be advanced by one additional 'Word16'</span>
<a name="line-120"></a><span class='hs-comment'>-- unit to maintain its validity.</span>
<a name="line-121"></a><span class='hs-definition'>dropWord16</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>I16</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span>
<a name="line-122"></a><span class='hs-definition'>dropWord16</span> <span class='hs-layout'>(</span><span class='hs-conid'>I16</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span>
<a name="line-123"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span>
<a name="line-124"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>len</span> <span class='hs-varop'>||</span> <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>len</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-125"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>len</span><span class='hs-comment'>-</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-126"></a>  <span class='hs-keyword'>where</span>
<a name="line-127"></a>    <span class='hs-varid'>m</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0xD800</span> <span class='hs-varop'>||</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0xDBFF</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-128"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span>
<a name="line-129"></a>    <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeIndex</span> <span class='hs-varid'>arr</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="unsafeCopyToPtr"></a><span class='hs-comment'>-- | /O(n)/ Copy a 'Text' to an array.  The array is assumed to be big</span>
<a name="line-132"></a><span class='hs-comment'>-- enough to hold the contents of the entire 'Text'.</span>
<a name="line-133"></a><span class='hs-definition'>unsafeCopyToPtr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word16</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-134"></a><span class='hs-definition'>unsafeCopyToPtr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span> <span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>ptr</span> <span class='hs-varid'>off</span>
<a name="line-135"></a>  <span class='hs-keyword'>where</span>
<a name="line-136"></a>    <span class='hs-varid'>end</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>off</span> <span class='hs-varop'>+</span> <span class='hs-varid'>len</span>
<a name="line-137"></a>    <span class='hs-varid'>loop</span> <span class='hs-varop'>!</span><span class='hs-varid'>p</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'>end</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-138"></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-139"></a>      <span class='hs-varid'>poke</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeIndex</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-140"></a>      <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-num'>2</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-141"></a>
<a name="line-142"></a><a name="useAsPtr"></a><span class='hs-comment'>-- | /O(n)/ Perform an action on a temporary, mutable copy of a</span>
<a name="line-143"></a><span class='hs-comment'>-- 'Text'.  The copy is freed as soon as the action returns.</span>
<a name="line-144"></a><span class='hs-definition'>useAsPtr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word16</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>I16</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-145"></a><span class='hs-definition'>useAsPtr</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-sel'>_arr</span> <span class='hs-sel'>_off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span> <span class='hs-varid'>action</span> <span class='hs-keyglyph'>=</span>
<a name="line-146"></a>    <span class='hs-varid'>allocaBytes</span> <span class='hs-layout'>(</span><span class='hs-varid'>len</span> <span class='hs-varop'>*</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>buf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-147"></a>      <span class='hs-varid'>unsafeCopyToPtr</span> <span class='hs-varid'>t</span> <span class='hs-varid'>buf</span>
<a name="line-148"></a>      <span class='hs-varid'>action</span> <span class='hs-layout'>(</span><span class='hs-varid'>castPtr</span> <span class='hs-varid'>buf</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span>
<a name="line-149"></a>
<a name="line-150"></a><a name="asForeignPtr"></a><span class='hs-comment'>-- | /O(n)/ Make a mutable copy of a 'Text'.</span>
<a name="line-151"></a><span class='hs-definition'>asForeignPtr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignPtr</span> <span class='hs-conid'>Word16</span><span class='hs-layout'>,</span> <span class='hs-conid'>I16</span><span class='hs-layout'>)</span>
<a name="line-152"></a><span class='hs-definition'>asForeignPtr</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-sel'>_arr</span> <span class='hs-sel'>_off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-153"></a>  <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mallocForeignPtrArray</span> <span class='hs-varid'>len</span>
<a name="line-154"></a>  <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>fp</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeCopyToPtr</span> <span class='hs-varid'>t</span>
<a name="line-155"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fp</span><span class='hs-layout'>,</span> <span class='hs-conid'>I16</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span>
<a name="line-156"></a>
<a name="line-157"></a><a name="peekCStringLen"></a><span class='hs-comment'>-- | /O(n)/ Decode a C string with explicit length, which is assumed</span>
<a name="line-158"></a><span class='hs-comment'>-- to have been encoded as UTF-8. If decoding fails, a</span>
<a name="line-159"></a><span class='hs-comment'>-- 'UnicodeException' is thrown.</span>
<a name="line-160"></a><span class='hs-definition'>peekCStringLen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CStringLen</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Text</span>
<a name="line-161"></a><span class='hs-definition'>peekCStringLen</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-162"></a>  <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafePackCStringLen</span> <span class='hs-varid'>cs</span>
<a name="line-163"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>decodeUtf8</span> <span class='hs-varid'>bs</span>
<a name="line-164"></a>
<a name="line-165"></a><a name="withCStringLen"></a><span class='hs-comment'>-- | Marshal a 'Text' into a C string encoded as UTF-8 in temporary</span>
<a name="line-166"></a><span class='hs-comment'>-- storage, with explicit length information. The encoded string may</span>
<a name="line-167"></a><span class='hs-comment'>-- contain NUL bytes, and is not followed by a trailing NUL byte.</span>
<a name="line-168"></a><span class='hs-comment'>--</span>
<a name="line-169"></a><span class='hs-comment'>-- The temporary storage is freed when the subcomputation terminates</span>
<a name="line-170"></a><span class='hs-comment'>-- (either normally or via an exception), so the pointer to the</span>
<a name="line-171"></a><span class='hs-comment'>-- temporary storage must /not/ be used after this function returns.</span>
<a name="line-172"></a><span class='hs-definition'>withCStringLen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>CStringLen</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-173"></a><span class='hs-definition'>withCStringLen</span> <span class='hs-varid'>t</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeUseAsCStringLen</span> <span class='hs-layout'>(</span><span class='hs-varid'>encodeUtf8</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>act</span>
</pre></body>
</html>