override fun extract()

in src/main/kotlin/com/github/mkartashev/hserr/miner/artifact/SignalInfo.kt [91:136]


    override fun extract(log: HsErrLog): SignalInfoArtifact {
        val line1Start = log.start.moveToLineWith("pc=")
        val line1String = line1Start.selectUpToEOL().toString()
        var sel1: TextRange? = null
        if (line1String.startsWith("#")) {
            sel1 = line1Start.moveToNextWord().selectCurrentWord()
        }

        var sel2: TextRange? = null
        var signalName = sel1.toString()
        var signalCode = ""
        var addr = ""
        val line2Start = log.start.moveToLineStartsWithString("siginfo: ")
        if (line2Start.isValid()) {
            sel2 = line2Start.selectUpToEOL()
            // Examples:
            // siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), reading address 0x000001d474dcbfc0
            // siginfo: si_signo: 4 (SIGILL), si_code: 2 (ILL_ILLTRP), si_addr: 0x000000019064ac70
            val litmusTestWord = line2Start.moveToNextWord().selectCurrentWord()
            if (litmusTestWord.toString().contains("si_signo")) {
                // Unix-style info
                val tokens = line2Start.selectUpToEOL().toString().split(" ")
                for ((i, t) in tokens.withIndex()) {
                    if (t.contains("si_signo")) {
                        signalName = tokens.getOrElse(i + 2) { "" }.trim('(', ')', ',')
                    } else if (t.contains("si_code")) {
                        signalCode = tokens.getOrElse(i + 2) { "" }.trim('(', ')', ',')
                    } else if (t.contains("si_addr")) {
                        addr = tokens.getOrElse(i + 1) { "" }
                    }
                }
            } else {
                // Assuming Windows-style info
                signalName = line2Start.moveToNextWord().selectCurrentWord().toString()
                val tokens = line2Start.selectUpToEOL().toString().split(" ")
                if (tokens.isNotEmpty()) addr = tokens.last()
            }
        }

        val sel = mutableSetOf<TextRange>()
        if (sel1 != null) sel.add(sel1)
        if (sel2 != null) sel.add(sel2)
        if (sel.isEmpty()) fail("Couldn't locate signal info anywhere")

        return SignalInfoArtifact(log, sel, signalName, signalCode, addr)
    }