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

Reply via email to