Files

shexy.src
  • // command: shexy (shellexec) v0.3.6
  • // command: shexy (shellexec) v0.4.0
  • // Changelog
  • // * Added Debug Message: Build Time and Run Time
  • // * Fixed a bug where shexy is located in /bin
  • // * Added more checks to search paths
  • // * Simplify search paths
  • // * Added command line
  • // * Added Help Text
  • // * Added build - compiles source just in place
  • // * Preparation for make function
  • // * Preparation for watch function
  • DebugOn = 0
  • BinaryOn = 0
  • filepath = ""
  • tocolor = function(color)
  • return "<color="+color+">"+self.str+"</color>"
  • end function
  • convert = function(text)
  • obj = {}
  • obj.str = str(text)
  • obj.tocolor = @tocolor
  • return obj
  • end function
  • debug = function(msg)
  • if DebugOn == 1 then
  • print( convert("[DEBUG] "+msg).tocolor("purple") )
  • end if
  • end function
  • cmd = function()
  • help = function()
  • helptext = []
  • sl = []
  • sl.push(convert("Help Text:"+char(9)).tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("help").tocolor("#B1B629FF"))
  • helptext.push(sl.join(char(9)))
  • sl = []
  • sl.push(convert("Run Source:"+char(9)).tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("[source] [args]").tocolor("#B1B629FF"))
  • helptext.push(sl.join(char(9)))
  • sl = []
  • sl.push(convert("Build Source:").tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("build [source] [|allowimport]").tocolor("#B1B629FF"))
  • sl.push(convert("(only pwd)").tocolor("#96528CFF"))
  • helptext.push(sl.join(char(9)))
  • sl = []
  • sl.push(convert("Command Line:").tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("line").tocolor("#B1B629FF"))
  • helptext.push(sl.join(char(9)))
  • sl = []
  • sl.push(convert("Make Binary:").tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("make").tocolor("#B1B629FF"))
  • helptext.push(sl.join(char(9)))
  • sl = []
  • sl.push(convert("Run on change:").tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("watch").tocolor("#B1B629FF"))
  • helptext.push(sl.join(char(9)))
  • sl = []
  • sl.push(convert("Debug:"+char(9)*2).tocolor("#5E6EBBFF"))
  • sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
  • sl.push(convert("-d [ source [args] | build | line ]").tocolor("#B1B629FF"))
  • helptext.push(sl.join(char(9)))
  • for line in helptext
  • print(line)
  • end for
  • end function
  • commandline = function()
  • filename = "tmp.src"
  • tmp_path = home_dir+"/"+"Cache"
  • ful_path = tmp_path+"/"+filename
  • if typeof(get_shell.host_computer.File(ful_path)) != "file" then
  • get_shell.host_computer.create_folder(home_dir,"Cache")
  • end if
  • get_shell.host_computer.touch(tmp_path,filename)
  • clear_screen
  • print("~ Shexy - Command Line ~")
  • print("(Here you can run GreyHackCode.)")
  • print(convert("~ Shexy - Command Line ~").tocolor("#5E6EBBFF"))
  • print(convert("(Here you can run GreyHackCode instantly.)").tocolor("#96528CFF"))
  • while true
  • input = user_input("> ",false,false)
  • get_shell.host_computer.File(ful_path).set_content(input)
  • get_shell.build(ful_path,tmp_path,false)
  • get_shell.launch(tmp_path+"/"+filename.remove(".src"))
  • end while
  • end function
  • compile = function()
  • allowimport = false
  • if params[1] == "allowimport" then allowimport = true
  • Path = current_path
  • Filename = params[1]
  • Source = Path+"/"+Filename
  • Target = Path
  • get_shell.build(Source,Target,allowimport)
  • end function
  • make = function()
  • print(" ")
  • print("This will be a function, that will read a MakeFile.")
  • print(" ")
  • print("Possible Features:")
  • print("* Create a Template of a MakeFile.")
  • print("* Build binaries by reading rules of a MakeFile")
  • print("* Include dependencies automatically/dynamically and don't mess with import_code alone.")
  • print("* Install and Uninstall binaries and purge remaining data.")
  • print("* Include Patches.")
  • print("That are just ideas. I will see if it possible.")
  • end function
  • watch = function()
  • print(" ")
  • print("This function will watch a source file.")
  • print("* It will read the file and generate a md5sum.")
  • print("* If the md5sum has been changed (so you saved the source), it will build and run it automatically.")
  • print("* After running it will wait again.")
  • end function
  • for parm in params
  • if parm == "-h" or parm == "--help" then
  • exit(launch_path.split("/")[-1]+" [source] [args]")
  • if parm == "help" then
  • help()
  • exit
  • end if
  • if parm == "-d" then
  • DebugOn = 1
  • continue
  • end if
  • if parm == "-c" then
  • cmd()
  • if parm == "line" then
  • commandline()
  • exit
  • end if
  • if parm == "build" then
  • compile()
  • exit
  • end if
  • if parm == "make" then
  • read_config()
  • make()
  • exit
  • end if
  • if parm == "watch" then
  • watch()
  • exit
  • end if
  • check_path = function(input)
  • for x in input
  • NewPath = x
  • Object = get_shell.host_computer.File(NewPath)
  • Type = typeof(Object)
  • if Type != "file" and Type == "null" then
  • debug(NewPath+" is "+Type)
  • continue
  • else if Type == "file" and Type != "null" then
  • debug(NewPath+" is "+Type)
  • output = NewPath
  • return output
  • break
  • end if
  • end for
  • end function
  • Paths = []
  • Paths.push(parent_path(launch_path)+"/"+parm)
  • Paths.push(parent_path(program_path)+"/"+parm)
  • Paths.push(current_path+"/"+parm)
  • Paths.push(parm)
  • filepath = check_path(Paths)
  • args = params[1:].join(" ")
  • debug("Arguments: "+args)
  • end for
  • debug("Path: "+filepath)
  • if filepath == "" then
  • debug("No valid path")
  • exit()
  • end if
  • cache_path = home_dir+"/"+"Cache"+"/"+"shex"
  • source = get_shell.host_computer.File(filepath)
  • if source.is_binary then
  • debug("Target is not a Source File.")
  • exit
  • else if not source.has_permission("r") then
  • debug("Target has no read permissions.")
  • exit
  • else if not filepath.indexOf(".src") then
  • debug("Target must have the suffix [*.src].")
  • exit
  • end if
  • if filepath.indexOf(".src") then
  • if source != null then
  • if typeof(get_shell.host_computer.File(cache_path)) != "file" then
  • get_shell.host_computer.create_folder(home_dir,"Cache")
  • get_shell.host_computer.create_folder(home_dir+"/"+"Cache","shex")
  • end if
  • src = get_shell.host_computer.File(current_path+"/"+params[0])
  • md5sum = md5(get_shell.host_computer.File(filepath).get_content)
  • BinName = filepath.split("/")[-1].remove(".src")
  • program = cache_path+"/"+BinName+"-"+md5sum
  • for file in get_shell.host_computer.File(cache_path).get_files
  • FileName = file.name.split("-")[0]
  • FileSum = file.name.split("-")[1]
  • debug(FileName+"-"+FileSum)
  • if FileSum != md5sum and FileName == BinName then
  • file.delete
  • continue
  • end if
  • if FileSum == md5sum and FileName == BinName then
  • get_shell.launch(file.path, args)
  • OnlyRuntime = round(time,2)
  • debug("Run Time => "+str(OnlyRuntime)+" sec")
  • exit
  • end if
  • end for
  • debug("Source file: "+filepath)
  • debug("Target Path: "+cache_path)
  • print( get_shell.build(filepath,cache_path,false) )
  • BinPath = get_shell.host_computer.File(cache_path+"/"+BinName)
  • if BinPath != null then
  • get_shell.host_computer.File(cache_path+"/"+BinName).rename(BinName+"-"+md5sum)
  • BuildTime = round(time,2)
  • debug("Build Time => "+str(BuildTime)+" sec")
  • else
  • exit("File not compiled")
  • end if
  • get_shell.launch(cache_path+"/"+BinName+"-"+md5sum, args)
  • RunTime = time
  • RunTime = round(RunTime - BuildTime,2)
  • debug("Run Time => "+str(RunTime)+" sec")
  • exit
  • end if
  • end if
  • end ifif
  • end if