/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__ >= 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'>-></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'>-></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'>></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'>>>=</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'>=<<</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'>-></span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-></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'><=</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'>>=</span> <span class='hs-varid'>len</span> <span class='hs-varop'>||</span> <span class='hs-varid'>m</span> <span class='hs-varop'>>=</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'><</span> <span class='hs-num'>0xDB00</span> <span class='hs-varop'>||</span> <span class='hs-varid'>w</span> <span class='hs-varop'>></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'>-></span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-></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'><=</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'>>=</span> <span class='hs-varid'>len</span> <span class='hs-varop'>||</span> <span class='hs-varid'>m</span> <span class='hs-varop'>>=</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'><</span> <span class='hs-num'>0xD800</span> <span class='hs-varop'>||</span> <span class='hs-varid'>w</span> <span class='hs-varop'>></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'>-></span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word16</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word16</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>I16</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'><-</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'>-></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'><-</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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>CStringLen</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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>
|