module Main where import Char ( isSpace ) {- Compares a .sorted file with a raw printout of instructions and shows differences. First file (REF) is has lines of format hex-digits SPACEs insn(possibly with spaces) Second file (TEST) has lines of format insn(possibly with spaces) Purpose is to extract the insn (text), remove spaces, and compare. How to use: (cd .. && make) && (../vex test1.orig | grep LALALA | cut -b 22- > out.txt) /home/sewardj/Tools/HugsInst/bin/runhugs Compare.hs | grep FAIL -} main = mayn "test2.sorted" "out.txt" mayn :: String -> String -> IO () mayn sorted_fn dump_fn = do sorted <- readFile sorted_fn dump <- readFile dump_fn let ress = zipWith check (lines (deTab sorted)) (lines (deTab dump)) putStrLn (unlines ress) check :: String -> String -> String check ref test = let ref_clean = dropWhile isHex ref ok = compere ref_clean test summary = grok ("REF: " ++ trim ref_clean) ++ " " ++ grok ("TEST: " ++ trim test) in if ok then "pass: " ++ summary else "FAIL: " ++ summary trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace compere s1 s2 = filter (not . isSpace) s1 == filter (not . isSpace) s2 isHex c = c `elem` "ABCDEF0123456789abcdef" grok str = let n = length str limit = 40 in if n >= limit then str else take limit (str ++ repeat ' ') deTab [] = [] deTab (c:cs) = if c == '\t' then " " ++ deTab cs else c: deTab cs