#!/usr/bin/python

import os
import sys

DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".dbg.ml"
OPT_DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".dbg.opt.ml"
NATIVE_DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".native.dbg.ml"
NATIVE_OPT_DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".native.dbg.opt.ml"
XFAIL_FILE = sys.argv[2] + "/lineinfo.xfail"

REPORT_FILE = "Output/" + sys.argv[1] + ".dbg.missing_lines.report.txt"


def read_inputfile(filename, dict):
    f = open(filename, "r")
    lines = f.readlines()
    for l in range(len(lines)):
        columns = lines[l].split()
        s = dict.get(columns[0])
        if s is None:
            s = set()
        s.add(columns[1])
        dict[columns[0]] = s
    f.close()
    return


dbg_lines = {}
read_inputfile(DBG_OUTPUT_FILE, dbg_lines)

dbg_opt_lines = {}
read_inputfile(OPT_DBG_OUTPUT_FILE, dbg_opt_lines)

native_dbg_lines = {}
read_inputfile(NATIVE_DBG_OUTPUT_FILE, native_dbg_lines)

native_dbg_opt_lines = {}
read_inputfile(NATIVE_OPT_DBG_OUTPUT_FILE, native_dbg_opt_lines)

xfailed_lines = {}
read_inputfile(XFAIL_FILE, xfailed_lines)

dbg_line_items = dbg_lines.items()
for fname, fset in dbg_line_items:
    optset = dbg_opt_lines.get(fname)
    nativeoptset = native_dbg_opt_lines.get(fname)
    xfailedset = xfailed_lines.get(os.path.basename(fname))
    if optset is not None:
        src = open(fname, "r")
        srclines = src.readlines()
        src_output = open("Output/" + sys.argv[1] + ".lineinfo", "w")
        for l in range(len(srclines)):
            l1 = l + 1
            l1s = str(l1)
            if l1s in fset:
                if l1s in optset:
                    if nativeoptset is not None and l1s in nativeoptset:
                        src_output.write(".|")
                    else:
                        src_output.write("+|")
                else:
                    if nativeoptset is not None and l1s in nativeoptset:
                        if xfailedset is not None and l1s in xfailedset:
                            src_output.write(" |")
                        else:
                            src_output.write("x|")
                    else:
                        src_output.write("-|")
            else:
                src_output.write(" |")
            src_output.write(srclines[l])
        src.close()
        src_output.close()
