include("WBInclusions")

APFS = "022" # Hexprint:APFS
version = "v" * APFS * " +2023.07.21"
# Adding the kludge speeded up a search of 600K file from 175 sec to > 1 sec

global MYARGS = ARGS
global DOSSY = false

t = time() 

function myPrint(fn, offshit::Int64=0, maxShit::Int64=9999999)  
    offset = Int(floor(offshit / 16)) * 16
    maxLen = Int(floor((maxShit + 15) / 16)) * 16
    if (length(fn)) < 1
        return("\n         NO ARGUMENT\n\n")
    end
    notGood = false
    hexChars = "0123456789ABCDEF"
    everything = ""
    everyin = ""
    p4 = 0
    
    try
        t = RRead(fn, "raw")
        if length(MYARGS) > 3
            if MYARGS[4] == "="
                MYARGS[4] = MYARGS[2]
            end
            p4 = tryparse(Int64, MYARGS[4])   
            p4 = Int(floor(p4 / 16)) * 16 + 1
            t = t[p4:length(t)]
            p4 -= 1
        end 
        rlim = lent = length(t)
        if offset < 0
            offset = Int(floor((rlim + offset) / 16)) * 16
        end
        taboo = offset + maxLen
        if rlim > taboo
            rlim = taboo
        end
        for i = 1:rlim                                     # length(t)
            r = hexChars[1 + (Int(floor(t[i] % 16)))]    
            q = hexChars[1 + (Int(floor(t[i] / 16)))]    
            everything *= string(q,r, " ")
            if t[i] < 32 || t[i] > 127
                if t[i] == 13 || t[i] == 9
                    global DOSSY = true
                end 
                everyin *= "." 
            else
                everyin *= string(Char(t[i])) 
            end
        end
        hx = string(offset, base = 16)
        println("\n         HexPrint " * version * "\n         " * fn *
                " (" * string(lent) * ": " * string(offset) * " ~ " * string(rlim) * ", 0x" * hx * 
                (p4 == 0 ? "" : "  \033[31;1mKLUDGE!\033[0m") * ")\n")

        shit = Int(floor(length(everyin) % 16))
        if shit > 0
            shit = 16 - shit 
            everyin *= "                                               "[1:shit]
            everything *= "                                               "[1:( 3 * shit)]
        end

#    30   2F 54 65 78 74 42 75 62 62 6C 65 2E 6A 70 67 22   | /TextBubble.jpg" |   48

        rl = offset    #    tryparse(Int64,offset) 
        while rl < rlim 
            stain = "        " * string(string(rl + p4, base = 16))
            stain = stain[(length(stain) - 5):length(stain)]
            omg = everything[(3 * rl + 1):(3 * rl + 23)] * " " * everything[(3 * rl + 24):(3 * rl + 48)]
            stain2 = stain * "   " * 
                replace(omg, r"([89ABCDEF][0123456789ABCDEF]|0[0123456789BCDEF])" => s"\e[31;1m\1\e[0m") * 
                        hilite(HI_YELLOW, "  |") * " " * 
                        everyin[(rl + 1):(rl + 16)]  * " " * hilite(HI_YELLOW, "|") * "   " * 
                        string(rl + p4)
            println(stain2)
            rl += 16
        end
    catch ex
        println("Exception: ", ex)
        notGood = true
    finally
        if notGood == false
            print("\n         CLOSED: ")
        else
            print("\n         NOTGOOD: ")
        end
        println(fn) #  * "\n")
    end
end

p1 = ""
p2 = 0
p3 = 99999999
if length(MYARGS) > 2  #  3
    p1 = MYARGS[1]                    # filename
    p2 = length(MYARGS) > 3 ? 0 : tryparse(Int64, MYARGS[2])   # offset
    p3 = tryparse(Int64, MYARGS[3])   # length
elseif length(MYARGS) == 2
    p1 = MYARGS[1]
    p2 = tryparse(Int64, MYARGS[2])
elseif length(MYARGS) == 1
    p1 = MYARGS[1]
else
    println("\n    Hexprint  Filename  [start  [ length  [ kludge ] ] ]")
    exit(16)
end
myPrint(p1,p2,p3)
println("         E/t: " , formatDecimal(time() - t, 3), 
            DOSSY ? "   " * hilite(HI_RED * "DOS lineend(s) or tab(s) detected") : "")
