summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gf.cabal34
-rw-r--r--src/binary/Data/Binary.hs (renamed from src/runtime/haskell/Data/Binary.hs)0
-rw-r--r--src/binary/Data/Binary/Builder.hs (renamed from src/runtime/haskell/Data/Binary/Builder.hs)0
-rw-r--r--src/binary/Data/Binary/Get.hs (renamed from src/runtime/haskell/Data/Binary/Get.hs)0
-rw-r--r--src/binary/Data/Binary/IEEE754.lhs (renamed from src/runtime/haskell/Data/Binary/IEEE754.lhs)0
-rw-r--r--src/binary/Data/Binary/Put.hs (renamed from src/runtime/haskell/Data/Binary/Put.hs)0
-rw-r--r--src/compiler/GF/Grammar/Binary.hs48
7 files changed, 61 insertions, 21 deletions
diff --git a/gf.cabal b/gf.cabal
index cec15550b..7922eb556 100644
--- a/gf.cabal
+++ b/gf.cabal
@@ -10,7 +10,7 @@ synopsis: Grammatical Framework
description: GF, Grammatical Framework, is a programming language for multilingual grammar applications
homepage: http://www.grammaticalframework.org/
bug-reports: http://code.google.com/p/grammatical-framework/issues/list
-tested-with: GHC==7.4.2, GHC==7.6.2
+tested-with: GHC==7.4.2, GHC==7.6.3
data-dir: src
data-files: www/*.html
@@ -53,6 +53,10 @@ flag new-comp
Description: Make -new-comp the default
Default: True
+flag custom-binary
+ Description: Use a customised version of the binary package
+ Default: True
+
library
build-depends: base >= 4.2 && <5,
array,
@@ -63,6 +67,19 @@ library
pretty,
mtl
hs-source-dirs: src/compiler src/runtime/haskell
+
+ if flag(custom-binary)
+ hs-source-dirs: src/binary
+ other-modules:
+ -- not really part of GF but I have changed the original binary library
+ -- and we have to keep the copy for now.
+ Data.Binary
+ Data.Binary.Put
+ Data.Binary.Get
+ Data.Binary.Builder
+ else
+ build-depends: binary
+
extensions:
exposed-modules:
PGF
@@ -94,13 +111,6 @@ library
GF.Data.ErrM
GF.Data.Relation
GF.Data.Operations
--- not really part of GF but I have changed the original binary library
--- and we have to keep the copy for now.
- Data.Binary
- Data.Binary.Put
- Data.Binary.Get
- Data.Binary.Builder
- Data.Binary.IEEE754
executable gf
build-depends: base >= 4.2 && <5,
@@ -143,6 +153,13 @@ executable gf
if impl(ghc>=7.0)
ghc-options: -rtsopts
hs-source-dirs: src/compiler src/runtime/haskell
+
+ if flag(custom-binary)
+ hs-source-dirs: src/binary
+ other-modules: Data.Binary.IEEE754
+ else
+ build-depends: binary, data-binary-ieee754
+
extensions:
main-is: GF.hs
other-modules:
@@ -221,7 +238,6 @@ executable gf
PGF.Binary
PGF.Paraphrase
PGF.TypeCheck
- PGF.Binary
PGF.Printer
PGF.Optimize
GFC
diff --git a/src/runtime/haskell/Data/Binary.hs b/src/binary/Data/Binary.hs
index 4b3f06a80..4b3f06a80 100644
--- a/src/runtime/haskell/Data/Binary.hs
+++ b/src/binary/Data/Binary.hs
diff --git a/src/runtime/haskell/Data/Binary/Builder.hs b/src/binary/Data/Binary/Builder.hs
index 20e287237..20e287237 100644
--- a/src/runtime/haskell/Data/Binary/Builder.hs
+++ b/src/binary/Data/Binary/Builder.hs
diff --git a/src/runtime/haskell/Data/Binary/Get.hs b/src/binary/Data/Binary/Get.hs
index 728720b3e..728720b3e 100644
--- a/src/runtime/haskell/Data/Binary/Get.hs
+++ b/src/binary/Data/Binary/Get.hs
diff --git a/src/runtime/haskell/Data/Binary/IEEE754.lhs b/src/binary/Data/Binary/IEEE754.lhs
index 96cbefc5a..96cbefc5a 100644
--- a/src/runtime/haskell/Data/Binary/IEEE754.lhs
+++ b/src/binary/Data/Binary/IEEE754.lhs
diff --git a/src/runtime/haskell/Data/Binary/Put.hs b/src/binary/Data/Binary/Put.hs
index a1f78dfba..a1f78dfba 100644
--- a/src/runtime/haskell/Data/Binary/Put.hs
+++ b/src/binary/Data/Binary/Put.hs
diff --git a/src/compiler/GF/Grammar/Binary.hs b/src/compiler/GF/Grammar/Binary.hs
index 34cb153d2..ba12fde06 100644
--- a/src/compiler/GF/Grammar/Binary.hs
+++ b/src/compiler/GF/Grammar/Binary.hs
@@ -7,7 +7,7 @@
--
-----------------------------------------------------------------------------
-module GF.Grammar.Binary where
+module GF.Grammar.Binary(decodeModule,decodeModuleHeader,encodeModule) where
import Prelude hiding (catch)
import Control.Exception(catch,ErrorCall(..),throwIO)
@@ -28,7 +28,6 @@ import PGF.Binary
-- Please change this every time when the GFO format is changed
gfoVersion = "GF02"
-
instance Binary Ident where
put id = put (ident2bs id)
get = do bs <- get
@@ -295,13 +294,32 @@ instance Binary RawIdent where
put = put . rawId2bs
get = fmap rawIdentC get
-putGFOVersion = mapM_ (putWord8 . fromIntegral . ord) gfoVersion
-getGFOVersion = replicateM (length gfoVersion) (fmap (chr . fromIntegral) getWord8)
+--putGFOVersion = mapM_ (putWord8 . fromIntegral . ord) gfoVersion
+--getGFOVersion = replicateM (length gfoVersion) (fmap (chr . fromIntegral) getWord8)
+--putGFOVersion = put gfoVersion
+--getGFOVersion = get :: Get VersionMagic
-decodeModule :: FilePath -> IO SourceModule
-decodeModule fpath = decodeFile' fpath (getGFOVersion >> get)
-decodeModuleHeader fpath = decodeFile' fpath getVersionedMod
+data VersionTagged a = Tagged {unV::a} | WrongVersion
+
+instance Binary a => Binary (VersionTagged a) where
+ put (Tagged a) = put (gfoBinVersion,a)
+ get = do ver <- get
+ if ver==gfoBinVersion
+ then fmap Tagged get
+ else return WrongVersion
+
+gfoBinVersion = (b1,b2,b3,b4)
+ where [b1,b2,b3,b4] = map (toEnum.fromEnum) gfoVersion :: [Word8]
+
+
+decodeModule :: FilePath -> IO SourceModule
+decodeModule fpath = check =<< decodeFile' fpath
+ where
+ check (Tagged m) = return m
+ check _ = fail ".gfo file version mismatch"
+{-
+decodeModuleHeader fpath = decodeFile_ fpath getVersionedMod
where
getVersionedMod = do
ver <- getGFOVersion
@@ -309,13 +327,19 @@ decodeModuleHeader fpath = decodeFile' fpath getVersionedMod
then do (m,mtype,mstatus,mflags,mextend,mwith,mopens,med,msrc) <- get
return (Just (m,ModInfo mtype mstatus mflags mextend mwith mopens med msrc Nothing Map.empty))
else return Nothing
-
+--}
+--{-
+decodeModuleHeader fpath = fmap check $ decodeFile' fpath
+ where
+ check (Tagged (m,mtype,mstatus,mflags,mextend,mwith,mopens,med,msrc)) =
+ (Just (m,ModInfo mtype mstatus mflags mextend mwith mopens med msrc Nothing Map.empty))
+ check _ = Nothing
+--}
encodeModule :: FilePath -> SourceModule -> IO ()
-encodeModule fpath mo =
- encodeFile_ fpath (putGFOVersion >> put mo)
+encodeModule fpath mo = encodeFile fpath (Tagged mo)
--- | like decodeFile_ but adds file name to error message if there was an error
-decodeFile' fpath get = addFPath fpath (decodeFile_ fpath get)
+-- | like 'decodeFile' but adds file name to error message if there was an error
+decodeFile' fpath = addFPath fpath (decodeFile fpath)
-- | Adds file name to error message if there was an error,
-- | but laziness can cause errors to slip through