% % % Generate module definition files (Win32 specific). \begin{code} module DefGen (defGen) where import List import AbstractH import Utils \end{code} \begin{code} defGen :: [(String, Bool, [HTopDecl])] -> [(String,String)] defGen code = map genDef $ groupBy eqMod $ sortBy cmpMod (foldr getLocSpecs [] (map (\ (_,_,x) -> getDecl x) code)) where eqMod (x,_,_,_) (y,_,_,_) = x == y cmpMod (x,_,_,_) (y,_,_,_) = compare x y getDecl [] = error "defGen.getDecls: not supposed to happen!" getDecl ((HMod (HModule _ _ _ _ h)):_) = h getDecl (_:hs) = getDecl hs getLocSpecs (AndDecl h1 h2) acc = getLocSpecs h1 (getLocSpecs h2 acc) getLocSpecs (Primitive _ _ ls _ _ _ _ _) acc = ls:acc getLocSpecs _ acc = acc genDef ls = (defName ls, defExports ls) defName [] = "Anon" defName ((l,_,_,_):_) = (dropSuffix l) ++ ".def" defExports ls = unlines ("EXPORTS" : nub (map genExp ls)) genExp (_,Nothing,nm,_) = nm genExp (_,Just x,nm,dec) = nm' ++ ' ':'@':show x where nm' = case dec of Nothing -> nm Just i -> nm ++ '@':show i \end{code}