
import Slurp
import Glob
import Test

-- Compare two s files.

import System.Environment
import Data.List
import Control.Monad
import Control.Monad.State

import Data.Map	(Map)
import qualified Data.Map	as Map

main 
 = do	args	<- getArgs
 	let (fileName1, fileName2)	= slurpArgs args

	-- load the files
	(seq1, bits1)	<- loadFile fileName1
	(seq2, bits2)	<- loadFile fileName2

	-- check for missing closures
	let missing1	= seq1 \\ seq2
	when (not $ null missing1)
	 $ do	putStr $ "hmm, keys " ++ show missing1 ++ " missing from " ++ fileName2 ++ "\n"

	let missing2	= seq2 \\ seq1
	when (not $ null missing2)
	 $ do	putStr $ "hmm, keys " ++ show missing2 ++ " missing from " ++ fileName1 ++ "\n"

	-- write the file back to test
	putStr "Writing back\n"
	let file1_back	= makeFile bits1 
	writeFile "grind.s" file1_back
	
	-- testing file
	putStr "Testing\n"
--	testFile "grind.s" "grind.o" "./grind"
	
	grindBits bits1 bits2
	
	return ()
	
		
loadFile  :: String -> IO ([String], Map String [String])
loadFile fileName
 = do	
	-- read the file
	putStr	$ "Loading " ++ fileName ++ "\n"
	file	<- readFile fileName

	-- parse the assembly code
	let (leftover, seq1, bits1)
		= slurpFile file

	-- if there are any lines not taken by the slurper then something is wrong.
	when (not $ null leftover)
	 $ do	putStr	$ "leftover: " ++ leftover ++ "\n"	
	 	error "parse failed " 
	
	-- print the number of closures found
	putStr	$ "      bits: " ++ (show $ Map.size $ bits1) ++ "\n"

	-- write back split file
	writeFile (fileName ++ ".seq")
		$ concat $ intersperse "\n" $ seq1
		
	writeFile (fileName ++ ".bits")
		$ prettyBits $ bits1


	-- glob together related bits
	let diag	= diagSeq seq1
	writeFile (fileName ++ ".diag")
		$ concat $ intersperse "\n" $ map show $ Map.toList diag

	let bits2	= glob (expandDiag diag) bits1
	let seq2	= Map.keys bits2

		
	writeFile (fileName ++ ".bits2")
		$ prettyBits $ bits2

	writeFile (fileName ++ ".back")
		$ makeFile bits2
		
	---
	return	(Map.keys bits2, bits2)
	
	
	

slurpArgs :: [String] -> (String, String)
slurpArgs (fileName1 : fileName2 : [])
	= (fileName1, fileName2)
