GHC sources in CVS repositry can't be build on our environment
(FreeBSD 3.1R). Error messages is:
|------------------------------------------------------------------------
|==fptools== gmake all --no-print-directory -r;
| in /usr/local/fptools/ghc/lib/std
|------------------------------------------------------------------------
|
| rm -f PrelRead.o ; if [ ! -d PrelRead ]; then mkdir PrelRead; else find PrelRead
|-name '*.o' -print | xargs rm -f __rm_food ; fi ;
| ../../../ghc/driver/ghc -recomp -cpp -fglasgow-exts -fvia-C -Rghc-timing -O
|-split-objs -odir PrelRead -fcompiling-prelude -static -H20m -c PrelRead.lhs -o
|PrelRead.o -osuf o
|
| lexer: misplaced NUL?
|
| lexer: misplaced NUL?
| (...)
| lexer: misplaced NUL?
| PrelRead.lhs:564: parse error on input `'
|
| Compilation had errors
| gmake: *** [PrelRead.o] Error 1
This mail has a patch for the file below to fix this problem.
% ls -lF utils/StringBuffer.lhs
-rw-r--r-- 1 onoue user 16325 Jun 7 10:40 utils/StringBuffer.lhs
(In "trySlurp", a reallocated chunk will be never passed
to "slurpFileExpandTabs" and "hGetStringBuffer."
Therefore, an source program including many tabs
will cause buffer overrun error.)
Yoshiyuki ONOUE ([EMAIL PROTECTED])
Dept. of Info. Eng., Fac. of Eng., Univ. of Tokyo
--- ghc/compiler/utils/StringBuffer.lhs.orig Mon Jun 7 10:40:44 1999
+++ ghc/compiler/utils/StringBuffer.lhs Thu Jun 10 21:17:14 1999
@@ -225,11 +225,11 @@
tAB_SIZE = 8#
- slurpFile :: Int# -> Int# -> Addr -> Int# -> Int# -> IO Int
+ slurpFile :: Int# -> Int# -> Addr -> Int# -> Int# -> IO (Addr, Int)
slurpFile c off chunk chunk_sz max_off = slurp c off
where
- slurp :: Int# -> Int# -> IO Int
+ slurp :: Int# -> Int# -> IO (Addr, Int)
slurp c off | off >=# max_off = do
let new_sz = chunk_sz *# 2#
chunk' <- reAllocMem chunk (I# new_sz)
@@ -239,7 +239,7 @@
if intc == ((-1)::Int)
then do errtype <- getErrType
if errtype == (ERR_EOF :: Int)
- then return (I# off)
+ then return (chunk, I# off)
else constructErrorAndFail "slurpFile"
else case chr intc of
'\t' -> tabIt c off
@@ -248,7 +248,7 @@
| otherwise = c +# 1#
slurp c' (off +# 1#)
- tabIt :: Int# -> Int# -> IO Int
+ tabIt :: Int# -> Int# -> IO (Addr, Int)
-- can't run out of buffer in here, because we reserved an
-- extra tAB_SIZE bytes at the end earlier.
tabIt c off = do
@@ -262,11 +262,11 @@
-- allow space for a full tab at the end of the buffer
-- (that's what the max_off thing is for)
- rc <- slurpFile 0# 0# chunk chunk_sz (chunk_sz -# tAB_SIZE)
+ (chunk', rc) <- slurpFile 0# 0# chunk chunk_sz (chunk_sz -# tAB_SIZE)
writeHandle handle handle_
if rc < (0::Int)
then constructErrorAndFail "slurpFile"
- else return (chunk, rc)
+ else return (chunk', rc)
reAllocMem :: Addr -> Int -> IO Addr