
All, So far as I know c2hs doesn't support hierarchical modules well. I've not tried the latest version, so apologies if this has already been addressed. Under the Hierarchical Module Namespace Extension http://www.haskell.org/hierarchical-modules/ module names can have dots '.' in them and when mapping these to filenames they are converted to directory separators. Foo.Bar.Baz -> Foo/Bar/Bas(.hs|.chi|etc) I've knocked up a patch that I think solves the problem (works for me), but an expert eye would be appreciated. I've made a change in two places: * CHSLexer.hs: identOrKW function, added '.' as an allowable character in an identifier within binding hooks. * CHS.hs: parseImport function, inserted a call to a new function moduleNameToFileName before calling loadCHI. The new function does the module name to file path conversion. Here's a patch (it's against the gtk2hs fork of c2hs but it's quite small so the idea should be clear) diff -U2 -r1.2 CHSLexer.hs --- CHSLexer.hs 1 Oct 2002 15:17:07 -0000 1.2 +++ CHSLexer.hs 16 Jul 2004 18:52:26 -0000 @@ -557,5 +557,5 @@ -- identOrKW = - letter +> (letter >|< digit >|< char '\'')`star` epsilon + letter +> (letter >|< digit >|< char '\'' >|< char '.')`star` epsilon `lexactionName` \cs pos name -> (idkwtok $!pos) cs name where diff -U2 -r1.4 CHS.hs --- CHS.hs 20 May 2004 16:42:17 -0000 1.4 +++ CHS.hs 16 Jul 2004 18:52:26 -0000 @@ -747,9 +747,14 @@ CHSTokQualif _: CHSTokIdent _ ide:toks -> return (True , ide, toks) _ -> syntaxError toks - chi <- loadCHI . identToLexeme $ modid + chi <- loadCHI . moduleNameToFileName . identToLexeme $ modid toks'' <- parseEndHook toks' frags <- parseFrags toks'' return $ CHSHook (CHSImport qual modid chi pos) : frags +moduleNameToFileName :: String -> FilePath +moduleNameToFileName = map dotToSlash + where dotToSlash '.' = '/' + dotToSlash c = c + parseContext :: Position -> [CHSToken] -> CST s [CHSFrag] parseContext pos toks = do Does this seem ok? It makes me a bit nervous changing the lexical definition of an identifier (we really only want to change the module identifier definition, not all identifiers). Duncan