[tor-commits] [tordnsel/master] stub hGetLine
arlo at torproject.org
arlo at torproject.org
Sat Apr 16 06:08:43 UTC 2016
commit d3976bd028ca1a476e24fea1d7d67acbd545592e
Author: David Kaloper <david at numm.org>
Date: Thu Aug 8 03:14:21 2013 +0200
stub hGetLine
This function knows *way* too much about the IO manager. Go to sleep,
Frankenstein.
---
src/TorDNSEL/Util.hsc | 201 +++++++++++++++++++++++++-------------------------
1 file changed, 101 insertions(+), 100 deletions(-)
diff --git a/src/TorDNSEL/Util.hsc b/src/TorDNSEL/Util.hsc
index 57ada86..13303ac 100644
--- a/src/TorDNSEL/Util.hsc
+++ b/src/TorDNSEL/Util.hsc
@@ -363,106 +363,107 @@ foreign import ccall unsafe "ntohl" ntohl :: Word32 -> Word32
-- bytes. If EOF is encountered, return the bytes preceding it. The handle
-- should be in 'LineBuffering' mode.
hGetLine :: Handle -> ByteString -> Int -> IO ByteString
-hGetLine h eol maxLen | B.null eol = B.hGet h maxLen
-hGetLine h eol@(B.PS _ _ eolLen) maxLen
- = wantReadableHandle "TorDNSEL.Util.hGetLine" h $ \handle_ -> do
- case haBufferMode handle_ of
- NoBuffering -> error "no buffering"
- _other -> hGetLineBuffered handle_
-
- where
- hGetLineBuffered handle_ = do
- let ref = haBuffer handle_
- buf <- readIORef ref
- hGetLineBufferedLoop handle_ ref buf 0 0 []
-
- hGetLineBufferedLoop handle_ ref
- buf at Buffer{ bufRPtr=r, bufWPtr=w, bufBuf=raw } !len !eolIx xss = do
- (new_eolIx,off) <- findEOL eolIx r w raw
- let new_len = len + off - r
-
- if maxLen > 0 && new_len - new_eolIx > maxLen
- -- If the line length exceeds maxLen, return a partial line.
- then do
- let maxOff = off - (new_len - maxLen)
- writeIORef ref buf{ bufRPtr = maxOff }
- mkBigPS . (:xss) =<< mkPS raw r maxOff
- else if new_eolIx == eolLen
- -- We have a complete line; strip the EOL sequence and return it.
- then do
- if w == off
- then writeIORef ref buf{ bufRPtr=0, bufWPtr=0 }
- else writeIORef ref buf{ bufRPtr = off }
- if eolLen <= off - r
- then mkBigPS . (:xss) =<< mkPS raw r (off - eolLen)
- else fmap stripEOL . mkBigPS . (:xss) =<< mkPS raw r off
- else do
- xs <- mkPS raw r off
- maybe_buf <- maybeFillReadBuffer (haFD handle_) True
- (haIsStream handle_) buf{ bufWPtr=0, bufRPtr=0 }
- case maybe_buf of
- -- Nothing indicates we caught an EOF, and we may have a
- -- partial line to return.
- Nothing -> do
- writeIORef ref buf{ bufRPtr=0, bufWPtr=0 }
- if new_len > 0
- then mkBigPS (xs:xss)
- else ioe_EOF
- Just new_buf ->
- hGetLineBufferedLoop handle_ ref new_buf new_len new_eolIx
- (xs:xss)
-
- maybeFillReadBuffer fd is_line is_stream buf
- = catch (Just `fmap` fillReadBuffer fd is_line is_stream buf)
- (\e -> if isEOFError e then return Nothing else ioError e)
-
- findEOL eolIx
- | eolLen == 1 = findEOLChar (B.w2c $ B.unsafeHead eol)
- | otherwise = findEOLSeq eolIx
-
- findEOLChar eolChar r w raw
- | r == w = return (0, r)
- | otherwise = do
- (!c,!r') <- readCharFromBuffer raw r
- if c == eolChar
- then return (1, r')
- else findEOLChar eolChar r' w raw
-
- -- find the end-of-line sequence, if there is one
- findEOLSeq !eolIx r w raw
- | eolIx == eolLen || r == w = return (eolIx, r)
- | otherwise = do
- (!c,!r') <- readCharFromBuffer raw r
- findEOLSeq (next c eolIx + 1) r' w raw
-
- -- get the next index into the EOL sequence we should match against
- next !c !i = if i >= 0 && c /= eolIndex i then next c (table ! i) else i
-
- eolIndex = B.w2c . B.unsafeIndex eol
-
- -- build a match table for the Knuth-Morris-Pratt algorithm
- table = runSTUArray (do
- arr <- newArray_ (0, if eolLen == 1 then 1 else eolLen - 1)
- zipWithM_ (writeArray arr) [0,1] [-1,0]
- loop arr 2 0)
- where
- loop arr !t !p
- | t >= eolLen = return arr
- | eolIndex (t - 1) == eolIndex p
- = let p' = p + 1 in writeArray arr t p' >> loop arr (t + 1) p'
- | p > 0 = readArray arr p >>= loop arr t
- | otherwise = writeArray arr t 0 >> loop arr (t + 1) p
-
- stripEOL (B.PS p s l) = E.assert (new_len >= 0) . B.copy $ B.PS p s new_len
- where new_len = l - eolLen
-
- mkPS buf start end = B.create len $ \p -> do
- B.memcpy_ptr_baoff p buf (fromIntegral start) (fromIntegral len)
- return ()
- where len = end - start
-
- mkBigPS [ps] = return ps
- mkBigPS pss = return $! B.concat (reverse pss)
+hGetLine = error "hGetLine" -- XXX STUB
+-- hGetLine h eol maxLen | B.null eol = B.hGet h maxLen
+-- hGetLine h eol@(B.PS _ _ eolLen) maxLen
+-- = wantReadableHandle "TorDNSEL.Util.hGetLine" h $ \handle_ -> do
+-- case haBufferMode handle_ of
+-- NoBuffering -> error "no buffering"
+-- _other -> hGetLineBuffered handle_
+--
+-- where
+-- hGetLineBuffered handle_ = do
+-- let ref = haBuffer handle_
+-- buf <- readIORef ref
+-- hGetLineBufferedLoop handle_ ref buf 0 0 []
+--
+-- hGetLineBufferedLoop handle_ ref
+-- buf at Buffer{ bufRPtr=r, bufWPtr=w, bufBuf=raw } !len !eolIx xss = do
+-- (new_eolIx,off) <- findEOL eolIx r w raw
+-- let new_len = len + off - r
+--
+-- if maxLen > 0 && new_len - new_eolIx > maxLen
+-- -- If the line length exceeds maxLen, return a partial line.
+-- then do
+-- let maxOff = off - (new_len - maxLen)
+-- writeIORef ref buf{ bufRPtr = maxOff }
+-- mkBigPS . (:xss) =<< mkPS raw r maxOff
+-- else if new_eolIx == eolLen
+-- -- We have a complete line; strip the EOL sequence and return it.
+-- then do
+-- if w == off
+-- then writeIORef ref buf{ bufRPtr=0, bufWPtr=0 }
+-- else writeIORef ref buf{ bufRPtr = off }
+-- if eolLen <= off - r
+-- then mkBigPS . (:xss) =<< mkPS raw r (off - eolLen)
+-- else fmap stripEOL . mkBigPS . (:xss) =<< mkPS raw r off
+-- else do
+-- xs <- mkPS raw r off
+-- maybe_buf <- maybeFillReadBuffer (haFD handle_) True
+-- (haIsStream handle_) buf{ bufWPtr=0, bufRPtr=0 }
+-- case maybe_buf of
+-- -- Nothing indicates we caught an EOF, and we may have a
+-- -- partial line to return.
+-- Nothing -> do
+-- writeIORef ref buf{ bufRPtr=0, bufWPtr=0 }
+-- if new_len > 0
+-- then mkBigPS (xs:xss)
+-- else ioe_EOF
+-- Just new_buf ->
+-- hGetLineBufferedLoop handle_ ref new_buf new_len new_eolIx
+-- (xs:xss)
+--
+-- maybeFillReadBuffer fd is_line is_stream buf
+-- = catch (Just `fmap` fillReadBuffer fd is_line is_stream buf)
+-- (\e -> if isEOFError e then return Nothing else ioError e)
+--
+-- findEOL eolIx
+-- | eolLen == 1 = findEOLChar (B.w2c $ B.unsafeHead eol)
+-- | otherwise = findEOLSeq eolIx
+--
+-- findEOLChar eolChar r w raw
+-- | r == w = return (0, r)
+-- | otherwise = do
+-- (!c,!r') <- readCharFromBuffer raw r
+-- if c == eolChar
+-- then return (1, r')
+-- else findEOLChar eolChar r' w raw
+--
+-- -- find the end-of-line sequence, if there is one
+-- findEOLSeq !eolIx r w raw
+-- | eolIx == eolLen || r == w = return (eolIx, r)
+-- | otherwise = do
+-- (!c,!r') <- readCharFromBuffer raw r
+-- findEOLSeq (next c eolIx + 1) r' w raw
+--
+-- -- get the next index into the EOL sequence we should match against
+-- next !c !i = if i >= 0 && c /= eolIndex i then next c (table ! i) else i
+--
+-- eolIndex = B.w2c . B.unsafeIndex eol
+--
+-- -- build a match table for the Knuth-Morris-Pratt algorithm
+-- table = runSTUArray (do
+-- arr <- newArray_ (0, if eolLen == 1 then 1 else eolLen - 1)
+-- zipWithM_ (writeArray arr) [0,1] [-1,0]
+-- loop arr 2 0)
+-- where
+-- loop arr !t !p
+-- | t >= eolLen = return arr
+-- | eolIndex (t - 1) == eolIndex p
+-- = let p' = p + 1 in writeArray arr t p' >> loop arr (t + 1) p'
+-- | p > 0 = readArray arr p >>= loop arr t
+-- | otherwise = writeArray arr t 0 >> loop arr (t + 1) p
+--
+-- stripEOL (B.PS p s l) = E.assert (new_len >= 0) . B.copy $ B.PS p s new_len
+-- where new_len = l - eolLen
+--
+-- mkPS buf start end = B.create len $ \p -> do
+-- B.memcpy_ptr_baoff p buf (fromIntegral start) (fromIntegral len)
+-- return ()
+-- where len = end - start
+--
+-- mkBigPS [ps] = return ps
+-- mkBigPS pss = return $! B.concat (reverse pss)
-- | Split @bs@ into pieces delimited by @delimiter@, consuming the delimiter.
-- The result for overlapping delimiters is undefined.
More information about the tor-commits
mailing list