kpmy 8 سال پیش
والد
کامیت
28a9416fba

+ 5 - 0
.gitignore

@@ -12,3 +12,8 @@
 # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
 hs_err_pid*
 
+/target
+/tools
+/*.iml
+/*.ipr
+/*.iws

+ 84 - 0
pom.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>in.ocsf</groupId>
+    <artifactId>dialij</artifactId>
+    <version>0.0.1</version>
+    <packaging>war</packaging>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>1.5.2.RELEASE</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+            <version>2.4.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.inject</groupId>
+            <artifactId>javax.inject</artifactId>
+            <version>1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>co.paralleluniverse</groupId>
+            <artifactId>quasar-core</artifactId>
+            <version>0.7.7</version>
+            <classifier>jdk8</classifier>
+        </dependency>
+    </dependencies>
+    <build>
+        <finalName>dialij</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.0.0</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <compilerVersion>1.8</compilerVersion>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>com.vlkan</groupId>
+                <artifactId>quasar-maven-plugin</artifactId>
+                <version>0.7.5</version>
+                <configuration>
+                    <check>true</check>
+                    <debug>true</debug>
+                    <verbose>true</verbose>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>instrument</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 19 - 0
src/main/java/in/ocsf/dialij/app/App.java

@@ -0,0 +1,19 @@
+package in.ocsf.dialij.app;/* kpmy 16.03.2017 */
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
+
+@SpringBootApplication
+public class App extends SpringBootServletInitializer {
+    public static void main(String[] args) throws Exception {
+        SpringApplication.run(App.class, args);
+    }
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+        return application.sources(App.class);
+    }
+
+}

+ 33 - 0
src/main/java/in/ocsf/dialij/app/ctrl/DevController.java

@@ -0,0 +1,33 @@
+package in.ocsf.dialij.app.ctrl;/* kpmy 16.03.2017 */
+
+import co.paralleluniverse.fibers.Fiber;
+import co.paralleluniverse.fibers.SuspendExecution;
+import in.ocsf.dialij.app.obj.Processor;
+import in.ocsf.dialij.app.srv.CompilerService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.inject.Inject;
+
+@RestController
+public class DevController {
+
+    @Inject
+    private CompilerService compiler;
+
+    @RequestMapping("/dev/bf")
+    public ResponseEntity<String> bf() {
+        Processor pr = compiler.compile("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++\n" +
+                " .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.\n" +
+                " ------.--------.>+.>.");
+        Fiber<String> fib = new Fiber<String>() {
+            @Override
+            protected String run() throws SuspendExecution, InterruptedException {
+                return pr.process();
+            }
+        }.start();
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+}

+ 5 - 0
src/main/java/in/ocsf/dialij/app/obj/Processor.java

@@ -0,0 +1,5 @@
+package in.ocsf.dialij.app.obj;/* kpmy 16.03.2017 */
+
+public interface Processor {
+    String process();
+}

+ 101 - 0
src/main/java/in/ocsf/dialij/app/srv/CompilerService.java

@@ -0,0 +1,101 @@
+package in.ocsf.dialij.app.srv;/* kpmy 16.03.2017 */
+
+import groovy.lang.GroovyShell;
+import in.ocsf.dialij.app.obj.Processor;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Service;
+
+import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+@Service
+public class CompilerService {
+
+    private Logger log = Logger.getLogger(getClass());
+
+    private Processor proxify(Object obj) {
+        return (Processor) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
+                new Class[]{Processor.class},
+                (proxy, method, args) -> {
+                    try {
+                        Method m = obj.getClass().getMethod(method.getName());
+                        return m.invoke(obj, args);
+                    } catch (InvocationTargetException e) {
+                        throw new RuntimeException(e.getTargetException());
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                });
+    }
+
+    public Processor compile(String source) {
+        BFctx ctx = new BFctx();
+        for (int i = 0; i < source.length(); i++)
+            ctx.parse(source.charAt(i));
+
+        String code = ctx.close();
+        GroovyShell groovyShell = new GroovyShell();
+        try {
+            Processor p = proxify(groovyShell.evaluate(new StringReader(code)));
+            return p;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private class BFctx {
+        private StringBuilder src = new StringBuilder();
+
+        BFctx() {
+            src.append("package groovy.in.ocsf.dialij.script;\n");
+            src.append("def String process(){\n");
+            src.append("List<Integer> mem = new ArrayList<>();\n");
+            src.append("for(int i = 0; i < 2048; i++) mem.add(0);\n");
+            src.append("def int p = 0;\n");
+            src.append("def int v = 0;\n");
+            src.append("StringBuilder out = new StringBuilder();\n");
+        }
+
+        private String close() {
+            src.append("return out.toString(); } \n");
+            src.append("return this;");
+            return src.toString();
+        }
+
+        private void parse(char c) {
+            switch (c) {
+                case '+':
+                    src.append("v = mem.get(p); v++;\n");
+                    src.append("mem.set(p, v <= 255 ? v : 0);\n");
+                    break;
+                case '-':
+                    src.append("v = mem.get(p); v--;\n");
+                    src.append("mem.set(p, v >= 0 ? v : 255);\n");
+                    break;
+                case '.':
+                    src.append("v = mem.get(p);\n");
+                    src.append("out.append((char) v);\n");
+                    break;
+                case '[':
+                    src.append("v = mem.get(p);\n");
+                    src.append("while(v > 0){\n");
+                    break;
+                case ']':
+                    src.append("v = mem.get(p);\n");
+                    src.append("}\n");
+                    break;
+                case '>':
+                    src.append("p++;\n");
+                    src.append("if (p >= mem.size()) p = 0;\n");
+                    break;
+                case '<':
+                    src.append("p--;\n");
+                    src.append("if (p < 0) p = mem.size() - 1;\n");
+                    break;
+                default:
+            }
+        }
+    }
+}

+ 23 - 0
src/main/resources/banner.txt

@@ -0,0 +1,23 @@
+DDDDDDDDDDDDD          iiii                    lllllll   iiii   jjjj 
+D::::::::::::DDD      i::::i                   l:::::l  i::::i j::::j
+D:::::::::::::::DD     iiii                    l:::::l   iiii   jjjj 
+DDD:::::DDDDD:::::D                            l:::::l               
+  D:::::D    D:::::D iiiiiii   aaaaaaaaaaaaa    l::::l iiiiiiijjjjjjj
+  D:::::D     D:::::Di:::::i   a::::::::::::a   l::::l i:::::ij:::::j
+  D:::::D     D:::::D i::::i   aaaaaaaaa:::::a  l::::l  i::::i j::::j
+  D:::::D     D:::::D i::::i            a::::a  l::::l  i::::i j::::j
+  D:::::D     D:::::D i::::i     aaaaaaa:::::a  l::::l  i::::i j::::j
+  D:::::D     D:::::D i::::i   aa::::::::::::a  l::::l  i::::i j::::j
+  D:::::D     D:::::D i::::i  a::::aaaa::::::a  l::::l  i::::i j::::j
+  D:::::D    D:::::D  i::::i a::::a    a:::::a  l::::l  i::::i j::::j
+DDD:::::DDDDD:::::D  i::::::ia::::a    a:::::a l::::::li::::::ij::::j
+D:::::::::::::::DD   i::::::ia:::::aaaa::::::a l::::::li::::::ij::::j
+D::::::::::::DDD     i::::::i a::::::::::aa:::al::::::li::::::ij::::j
+DDDDDDDDDDDDD        iiiiiiii  aaaaaaaaaa  aaaalllllllliiiiiiiij::::j
+                                                               j::::j
+                                                     jjjj      j::::j
+                                                    j::::jj   j:::::j
+                                                    j::::::jjj::::::j
+                                                     jj::::::::::::j 
+                                                       jjj::::::jjj  
+                                                          jjjjjj     

+ 236 - 0
src/main/resources/groovy/in/ocsf/dialij/script/test0.groovy

@@ -0,0 +1,236 @@
+package groovy.in.ocsf.dialij.script
+
+/* kpmy 16.03.2017 */
+
+String process() {
+    List<Integer> mem = new ArrayList<>()
+    for (int i = 0; i < 2048; i++) mem.add(0)
+    int p = 0
+    int v = 0
+    StringBuilder out = new StringBuilder()
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    while (v > 0) {
+        p++
+        if (p >= mem.size()) p = 0
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        p++
+        if (p >= mem.size()) p = 0
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        p++
+        if (p >= mem.size()) p = 0
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        p++
+        if (p >= mem.size()) p = 0
+        v = mem.get(p); v++
+        mem.set(p, v <= 255 ? v : 0)
+        p--
+        if (p < 0) p = mem.size() - 1
+        p--
+        if (p < 0) p = mem.size() - 1
+        p--
+        if (p < 0) p = mem.size() - 1
+        p--
+        if (p < 0) p = mem.size() - 1
+        v = mem.get(p); v--
+        mem.set(p, v >= 0 ? v : 255)
+        v = mem.get(p)
+    }
+    p++
+    if (p >= mem.size()) p = 0
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    p++
+    if (p >= mem.size()) p = 0
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    v = mem.get(p)
+    out.append((char) v)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    p++
+    if (p >= mem.size()) p = 0
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    p--
+    if (p < 0) p = mem.size() - 1
+    p--
+    if (p < 0) p = mem.size() - 1
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    p++
+    if (p >= mem.size()) p = 0
+    v = mem.get(p)
+    out.append((char) v)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p)
+    out.append((char) v)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p); v--
+    mem.set(p, v >= 0 ? v : 255)
+    v = mem.get(p)
+    out.append((char) v)
+    p++
+    if (p >= mem.size()) p = 0
+    v = mem.get(p); v++
+    mem.set(p, v <= 255 ? v : 0)
+    v = mem.get(p)
+    out.append((char) v)
+    p++
+    if (p >= mem.size()) p = 0
+    v = mem.get(p)
+    out.append((char) v)
+    return out.toString()
+}
+
+return this

+ 10 - 0
src/main/resources/static/index.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>dialiJ</title>
+</head>
+<body>
+
+</body>
+</html>