#include "HsVersions.h"
import FastString
-import GlaExts
-import Numeric (fromRat)
import PrimPacked ( strLength )
+
+import GLAEXTS
+
+import Numeric (fromRat)
import IO
#if __GLASGOW_HASKELL__ < 503
import System.IO ( hPutBuf )
#endif
-import PrimPacked ( strLength )
+#if __GLASGOW_HASKELL__ < 503
+import PrelBase ( unpackCString# )
+#else
+import GHC.Base ( unpackCString# )
+#endif
+
+import PrimPacked ( Ptr(..) )
-- Don't import Util( assertPanic ) because it makes a loop in the module structure
char c = textBeside_ (Chr c) 1# Empty
text s = case length s of {IBOX(sl) -> textBeside_ (Str s) sl Empty}
ftext s = case lengthFS s of {IBOX(sl) -> textBeside_ (PStr s) sl Empty}
-ptext (A# s) = case strLength (A# s) of {IBOX(sl) -> textBeside_ (LStr s sl) sl Empty}
+ptext (Ptr s) = case strLength (Ptr s) of {IBOX(sl) -> textBeside_ (LStr s sl) sl Empty}
+
+-- RULE that turns (text "abc") into (ptext (A# "abc"#)) to avoid the
+-- intermediate packing/unpacking of the string.
+{-# RULES
+ "text/str" forall a. text (unpackCString# a) = ptext (Ptr a)
+ #-}
nest IBOX(k) p = mkNest k (reduceDoc p) -- Externally callable version
printDoc :: Mode -> Handle -> Doc -> IO ()
printDoc mode hdl doc
- = fullRender mode pprCols 1.5 put done doc
+ = do { fullRender mode pprCols 1.5 put done doc ;
+ hFlush hdl }
where
put (Chr c) next = hPutChar hdl c >> next
put (Str s) next = hPutStr hdl s >> next
hPutBuf = hPutBufFull
#endif
+ -- some versions of hPutBuf will barf if the length is zero
+hPutLitString handle a# 0# = return ()
hPutLitString handle a# l#
#if __GLASGOW_HASKELL__ < 411
= hPutBuf handle (A# a#) (I# l#)