# Perkedel Compilers, interpreters, and database systems bundle for Windows Author: Noprianto , 2020-2022 Website: nopri.github.io License: public domain Developed using: Singkong, Batch file, C Bundled using: 7-Zip, IExpress Bundled: Java Runtime Environment (AdoptOpenJDK) ECJ (Eclipse) MinGW (Code::Blocks) Tcl/Tk (cross compiled from source) Python (python.org, pip, 2.7 (ReportLab, web.py, PyOTP, psycopg2 (binary), SQLiteBoy), 3.5) CHICKEN Scheme (compiled from source) PostgreSQL (cross compiled from source) Singkong.jar Thank you for using Perkedel ; var name = "Perkedel" var about = name + lf() + "Compilers, interpreters, and database systems bundle" + lf() + "for Windows" + lf() + lf() + "Author: Noprianto , 2020-2022" + lf() + "Website: nopri.github.io" + lf() + "License: public domain" + lf() + lf() + "Developed using: Singkong, Batch file, C" + lf() + "Bundled using: 7-Zip, IExpress" + lf() + "Bundled: " + lf() + " Java Runtime Environment (AdoptOpenJDK)" + lf() + " ECJ (Eclipse)" + lf() + " MinGW (Code::Blocks)" + lf() + " Tcl/Tk (cross compiled from source)" + lf() + " Python 2.7 (python.org; pip, ReportLab, web.py, PyOTP, psycopg2 (binary), et_xmlfile, jdcal, openpyxl, XlsxWriter, SQLiteBoy)" + lf() + " Python 3.5 (python.org)" + lf() + " CHICKEN Scheme (compiled from source)" + lf() + " PostgreSQL (cross compiled from source)" + lf() + " Singkong.jar" + lf() + lf() + "Thank you for using Perkedel" + lf() + lf() + "Singkong version: " + singkong()["version_string"] + lf() + "Directory: " + cwd() require(4.0) var percent = 0.8 var temp = "temp" var pattern = "[a-zA-Z]+" var whitespace = [" ", tab(), cr(), lf()] var title_confirm = "Please confirm" var title_error = "Error" var title_info = "Information" var confirm_quit = "Are you sure you want to quit this application?" var confirm_replace = "Replace contents in editor?" var confirm_rebuild = "Are you sure you want to rebuild CHICKEN using the following prefix?" var info_minutes = "This might take several minutes" var info_additional = "pip will be installed for Python 2/Python 3 (offline)" var cmd_open = "Open" var cmd_c = "C" var cmd_cpp = "C++" var cmd_java = "Java" var cmd_python2 = "Python 2" var cmd_python3 = "Python 3" var cmd_scheme = "Scheme" var cmd_tcl = "Tcl" var cmd_singkong = "Singkong" var cmd_scheme_i = "CHICKEN" var cmd_python2_i = "Python 2" var cmd_python3_i = "Python 3" var cmd_tcl_i = "Tcl" var cmd_singkong_i = "Singkong" var cmd_pgsql = "PostgreSQL" var cmd_examples = "Examples" var cmd_rebuild = "Rebuild" var cmd_update = "Update" var cmd_info = "Information" var msg_code = "Please enter code in " var msg_lang = " programming language" var msg_error_class = "Cannot find Java class name in source code" var msg_error_allow = "Class name is not allowed (a-z, A-Z only; limitation of Perkedel)" var msg_error_dll = "Please install Visual C++ Redistributable (for running Python 3.5)" var color_0 = ["orange", null] var color_1 = ["yellow", null] var color_2 = ["green", null] var color_3 = ["blue", "white"] var color_4 = ["pink", null] var color_5 = ["cyan", null] var color_6 = ["white", "black"] var color_7 = ["red", null] var color_8 = ["gray", "white"] var color_9 = ["black", "white"] var color_10 = ["white", "blue"] var hash_run = { cmd_scheme_i: ["perkedel\perkedel-run.exe", "chicken\bin\csi.exe"], cmd_python2_i: ["perkedel\perkedel-run.exe", "python\python.exe"], cmd_python3_i: ["perkedel\perkedel-run.exe", "python3\python.exe"], cmd_tcl_i: ["perkedel\perkedel-run.exe", "tcl\bin\tclsh86.exe"], cmd_singkong_i: ["jre\bin\javaw.exe", "-jar", "Singkong.jar"], cmd_pgsql: ["perkedel\perkedel-run.exe", "perkedel\perkedel-command-pgsql.bat"], cmd_examples: ["perkedel\perkedel-run.exe", "perkedel\perkedel-open-examples.bat"], cmd_rebuild: ["perkedel\perkedel-run.exe", "temp\perkedel-rebuild-chicken.bat"], cmd_update: ["perkedel\perkedel-run.exe", "perkedel\perkedel-update-singkong.bat"] } var f_run = fn(command) { system(hash_run[command]) } var hash_translate = { cmd_c: [ "code.c", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-c.bat"] ], cmd_cpp: [ "code.cpp", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-cpp.bat"] ], cmd_python2: [ "code.py", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-python2.bat"] ], cmd_python3: [ "code.py", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-python3.bat"] ], cmd_scheme: [ "code.scm", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-scheme.bat"] ], cmd_tcl: [ "code.tcl", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-tcl.bat"] ], cmd_singkong: [ "code.singkong", ["perkedel\perkedel-run.exe", "perkedel\perkedel-run-singkong.bat"] ] } var f_translate = fn(command, code) { var a = hash_translate[command] var f = temp + "\" + a[0] var cmd = a[1] write(f, code) system(cmd) } var f_lang = fn(editor, button) { var code = trim(get(editor, "contents")) var lang = get(button, "text") if (!empty(code)) { f_translate(lang, code) } else { message(msg_code + lang + msg_lang, title_error) } } var is_allowed = fn(c) { return matches(c, pattern) } var f_lang_java = fn(editor, button) { var code = trim(get(editor, "contents")) var lang = get(button, "text") if (empty(code)) { message(msg_code + lang + msg_lang, title_error) } else { var x = split(code, "class") if (len(x) < 2) { message(msg_error_class, title_error) } else { var y = split(x[1], "{") if (len(y) > 1) { var z = trim(y[0]) if (empty(z)) { message(msg_error_class, title_error) } else { var test = "" var i = 0 repeat { var s = slice(z, i, i+1) if (in(whitespace, s)) { return i } else { var test = test + s } var i = i + 1 if (i >= len(z)) { return i } } var z = test if (is_allowed(z) == true) { var n = z + ".java" var f = temp + "\" + n var b = temp + "\perkedel-generated-java.bat" write(f, code) write(b, "@echo off" + crlf() + "cd temp" + crlf() + "del *.class 2>nul" + crlf() + "..\jre\bin\java.exe -jar ..\ecj\ecj.jar -1.8 " + n + crlf() + "..\jre\bin\java.exe " + z + crlf() + "echo. " + crlf() + "pause") system(["perkedel\perkedel-run.exe", "temp\perkedel-generated-java.bat"] ) } else { message(msg_error_allow + lf() + z, title_error) } } } else { message(msg_error_class, title_error) } } } } var f_run_py_pip = fn() { if (!(stat("pip\installed")["exists"])) { message(info_additional, title_info) system(["perkedel\perkedel-run.exe", "perkedel\perkedel-install-pip.bat"]) write("pip\installed", string(@)) } } var config_c = fn(b, c) { if (c[0]) { config(b, "background", c[0]) } if (c[1]) { config(b, "foreground", c[1]) } } var test_run_py3 = fn () { var r = system(["python3\python.exe", "--version"]) if (empty(trim(r[0]))) { return false; } else { return true; } } reset() title(name) closing(confirm_quit, title_confirm) var b_open = component("button", cmd_open) config(b_open, "active", 0) config_c(b_open, color_0) var l_info = component("label", "Run code: ") var b_c = component("button", cmd_c) config(b_c, "active", 0) config_c(b_c, color_1) var b_cpp = component("button", cmd_cpp) config_c(b_cpp, color_1) var b_java = component("button", cmd_java) config(b_java, "active", 0) config_c(b_java, color_2) var b_python2 = component("button", cmd_python2) config(b_python2, "active", 0) config_c(b_python2, color_3) var b_python3 = component("button", cmd_python3) config_c(b_python3, color_3) var b_scheme = component("button", cmd_scheme) config(b_scheme, "active", 2) config_c(b_scheme, color_4) var b_tcl = component("button", cmd_tcl) config(b_tcl, "active", 0) config_c(b_tcl, color_5) var b_singkong = component("button", cmd_singkong) config(b_singkong, "active", 0) config_c(b_singkong, color_6) var e_code = component("edit", "") config(e_code, "font", ["monospaced", 0, 18]) var b_scheme_i = component("button", cmd_scheme_i) config_c(b_scheme_i, color_4) var b_python2_i = component("button", cmd_python2_i) var b_python3_i = component("button", cmd_python3_i) config_c(b_python2_i, color_3) config_c(b_python3_i, color_3) var b_tcl_i = component("button", cmd_tcl_i) config_c(b_tcl_i, color_5) var b_singkong_i = component("button", cmd_singkong_i) config_c(b_singkong_i, color_6) var b_pgsql = component("button", cmd_pgsql) config_c(b_pgsql, color_10) var b_examples = component("button", cmd_examples) config_c(b_examples, color_8) var b_rebuild = component("button", cmd_rebuild) config_c(b_rebuild, color_7) var b_update = component("button", cmd_update) config_c(b_update, color_7) var b_info = component("button", cmd_info) config(b_info, "active", 0) config_c(b_info, color_9) add_n([b_scheme_i, b_python2_i, b_python3_i, b_tcl_i, b_singkong_i, b_pgsql, b_examples, b_rebuild, b_update, b_info]) add(e_code) add_s([b_open, l_info, b_c, b_cpp, b_java, b_python2, b_python3, b_scheme, b_tcl, b_singkong]) config(e_code, "focus", true) event(b_examples, fn() { f_run(cmd_examples) }) event(b_info, fn() { message(about, title_info) }) event(b_scheme_i, fn() { f_run(cmd_scheme_i) }) event(b_python2_i, fn() { f_run_py_pip() f_run(cmd_python2_i) }) event(b_python3_i, fn() { if (!test_run_py3()) { message(msg_error_dll, title_info) } else { f_run_py_pip() f_run(cmd_python3_i) } }) event(b_tcl_i, fn() { f_run(cmd_tcl_i) }) event(b_singkong_i, fn() { f_run(cmd_singkong_i) }) event(b_pgsql, fn() { f_run(cmd_pgsql) }) event(b_rebuild, fn() { var p = replace(cwd(), "\", "/") + "/chicken/" var m = confirm_rebuild + lf() + p + lf() + lf() + info_minutes if (confirm(m, title_confirm) == "OK") { var f = temp+ "\perkedel-rebuild-chicken.bat" write(f, "@echo off" + crlf() + "PATH=mingw\bin;%PATH%" + crlf() + "cd chicken-src" + crlf() + "PATH=..\mingw\bin;%PATH%" + crlf() + "mingw32-make -f Makefile.mingw " + quote() + "PREFIX=" + p + quote() + " clean" + crlf() + "mingw32-make -f Makefile.mingw " + quote() + "PREFIX=" + p + quote() + " confclean" + crlf() + "mingw32-make -f Makefile.mingw " + quote() + "PREFIX=" + p + quote() + crlf() + "mingw32-make -f Makefile.mingw " + quote() + "PREFIX=" + p + quote() + " install " + crlf() + "pause" ) f_run(cmd_rebuild) } }) event(b_update, fn() { f_run(cmd_update) }) event(b_open, fn() { var c = trim(get(e_code, "contents")) var a = [false] if (!empty(c)) { if (confirm(confirm_replace, title_confirm) == "OK") { set(a, 0, true) } } else { set(a, 0, true) } if (a[0]) { var f = open() if (!empty(f)) { config(e_code, "contents", read(f)) } } }) event(b_c, fn() { f_lang(e_code, b_c) }) event(b_cpp, fn() { f_lang(e_code, b_cpp) }) event(b_python2, fn() { f_lang(e_code, b_python2) }) event(b_python3, fn() { if (!test_run_py3()) { message(msg_error_dll, title_info) } else { f_lang(e_code, b_python3) } }) event(b_scheme, fn() { f_lang(e_code, b_scheme) }) event(b_tcl, fn() { f_lang(e_code, b_tcl) }) event(b_singkong, fn() { f_lang(e_code, b_singkong) }) event(b_java, fn() { f_lang_java(e_code, b_java) }) var screen_size = screen() size(screen_size[0] * percent, screen_size[1] * percent) show()