diff --git a/build.gradle b/build.gradle index f6bbede..54c4c93 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ repositories { } archivesBaseName = 'Simple Code Generator' -version = '1.1.4' +version = '1.2.0' apply plugin: 'maven' tasks.withType(JavaCompile) { diff --git a/src/main/java/speiger/src/builder/base/ConditionedSegment.java b/src/main/java/speiger/src/builder/base/ConditionedSegment.java index 147fc6e..3452cca 100644 --- a/src/main/java/speiger/src/builder/base/ConditionedSegment.java +++ b/src/main/java/speiger/src/builder/base/ConditionedSegment.java @@ -2,12 +2,12 @@ package speiger.src.builder.base; import java.util.ArrayList; import java.util.List; -import java.util.Set; import java.util.StringJoiner; import java.util.regex.Pattern; import speiger.src.builder.conditions.ICondition; import speiger.src.builder.misc.IdGenerator; +import speiger.src.builder.processor.CompiledArguments; public class ConditionedSegment { @@ -27,13 +27,13 @@ public class ConditionedSegment segments.add(segment); } - public int build(Set parsePool, StringBuilder builder, int baseIndex) + public int build(CompiledArguments process, StringBuilder builder, int baseIndex) { baseIndex += index; int length = builder.length(); for(int i = 0,m=segments.size();i parsePool, StringBuilder builder, int index) + public boolean build(CompiledArguments process, StringBuilder builder, int index) { - if(condition.isValid(parsePool)) + if(condition.isValid(process)) { builder.insert(index, text); for(int i = 0,offset=0,m=segments.size();i parsePool, List mappers, boolean printNoWork, Set done) + public String build(CompiledArguments process, boolean printNoWork, Set done) { StringBuilder builder = new StringBuilder(textFile); for(int i = 0,offset=0,m=segments.size();i mappers = process.getMapper(); String result = builder.toString(); for(int i = 0,m=mappers.size();i conditions = new ArrayList<>(); + public AndCondition() {} + public AndCondition(ICondition base) { - conditions.add(base); + addCondition(base); } public void addCondition(ICondition e) { + if(e == null) return; conditions.add(e); } @Override - public boolean isValid(Set parsePool) + public boolean isValid(CompiledArguments args) { for(int i = 0,m=conditions.size();i parsePool) + public boolean isValid(CompiledArguments args) { - return parsePool.contains(flag) != inverted; + return args.test(flag) != inverted; } } diff --git a/src/main/java/speiger/src/builder/conditions/ICondition.java b/src/main/java/speiger/src/builder/conditions/ICondition.java index e0c9997..cad11f8 100644 --- a/src/main/java/speiger/src/builder/conditions/ICondition.java +++ b/src/main/java/speiger/src/builder/conditions/ICondition.java @@ -1,49 +1,55 @@ package speiger.src.builder.conditions; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Set; +import speiger.src.builder.misc.RegexUtil; +import speiger.src.builder.processor.CompiledArguments; + public interface ICondition { + public static final Set VALID_CHARACTERS = new HashSet<>(Arrays.asList('(', ')')); public static final ICondition ALWAYS_TRUE = T -> true; - public boolean isValid(Set parsePool); - - public static ICondition parse(String condition) - { - String[] elements = condition.split(" "); - List conditions = new ArrayList(); - for(int i = 0;i elements) { + List conditions = new ArrayList<>(); + AndCondition activeAnd = null; + for(int i = 0,m=elements.size();i="), + GREATER(">"), + SMALLER_EQUALS("<="), + SMALLER("<"), + NOT_EQUALS("!="), + BIT_EQUALS_ALL("&="), + BIT_EQUALS_ANY("|="), + BIT_EQUALS_NOT("~="); + + static final Map DATA = Arrays.stream(values()).collect(Collectors.toMap(Operation::getId, Function.identity())); + String key; + + private Operation(String key) + { + this.key = key; + } + + public static String buildReggex() + { + StringJoiner joiner = new StringJoiner("|\\", "\\", ""); + for(Operation entry : values()) + { + joiner.add(entry.getId()); + } + return joiner.toString(); + } + + public String getId() + { + return key; + } + + public boolean matches(int key, int value) + { + switch(this) + { + case EQUALS: return key == value; + case NOT_EQUALS: return key != value; + case GREATER: return key > value; + case SMALLER: return key < value; + case BIT_EQUALS_ALL: return (key & value) == value; + case BIT_EQUALS_ANY: return (key & value) != 0; + case BIT_EQUALS_NOT: return (key & value) == 0; + default: return false; + } + } + + public static Operation byId(String key) + { + return DATA.get(key); + } + } +} \ No newline at end of file diff --git a/src/main/java/speiger/src/builder/conditions/OrCondition.java b/src/main/java/speiger/src/builder/conditions/OrCondition.java index b8eeb02..9f662cb 100644 --- a/src/main/java/speiger/src/builder/conditions/OrCondition.java +++ b/src/main/java/speiger/src/builder/conditions/OrCondition.java @@ -1,7 +1,8 @@ package speiger.src.builder.conditions; import java.util.List; -import java.util.Set; + +import speiger.src.builder.processor.CompiledArguments; public class OrCondition implements ICondition { @@ -13,11 +14,11 @@ public class OrCondition implements ICondition } @Override - public boolean isValid(Set parsePool) + public boolean isValid(CompiledArguments args) { for(int i = 0,m=conditions.size();i list, int startIndex, String increase, String decrease) + { + if(!list.get(startIndex).equalsIgnoreCase(increase)) return -1; + int inc = 0; + for(int i = startIndex;i set) { + StringBuilder builder = new StringBuilder(s); + for(int i = s.length()-1;i>=0;i--) { + char entry = builder.charAt(i); + if(entry != ' ' && set.contains(entry)) { + if(builder.charAt(i+1) != ' ') builder.insert(i+1, ' '); + if(builder.charAt(i-1) != ' ') builder.insert(i, ' '); + } + } + return builder.toString(); + } } \ No newline at end of file diff --git a/src/main/java/speiger/src/builder/processor/BuildTask.java b/src/main/java/speiger/src/builder/processor/BuildTask.java index 864bcfe..5396897 100644 --- a/src/main/java/speiger/src/builder/processor/BuildTask.java +++ b/src/main/java/speiger/src/builder/processor/BuildTask.java @@ -28,7 +28,7 @@ public class BuildTask implements Runnable @Override public void run() { - String s = template.build(process.parsePool, process.mappers, mappers != null, mappers != null ? mappers[1] : null); + String s = template.build(new CompiledArguments(process), mappers != null, mappers != null ? mappers[1] : null); if(mappers != null) { mappers[0].addAll(process.mappers); diff --git a/src/main/java/speiger/src/builder/processor/CompiledArguments.java b/src/main/java/speiger/src/builder/processor/CompiledArguments.java new file mode 100644 index 0000000..418170a --- /dev/null +++ b/src/main/java/speiger/src/builder/processor/CompiledArguments.java @@ -0,0 +1,36 @@ +package speiger.src.builder.processor; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import speiger.src.builder.mappers.IMapper; + +public class CompiledArguments +{ + List mapper; + Set flags; + Map flaggedValues; + + public CompiledArguments(TemplateProcess process) + { + mapper = process.mappers; + flags = process.parsePool; + flaggedValues = process.parseValues; + } + + public List getMapper() + { + return mapper; + } + + public boolean test(String key) + { + return flags.contains(key); + } + + public int get(String key) + { + return flaggedValues.getOrDefault(key, 0); + } +} diff --git a/src/main/java/speiger/src/builder/processor/TemplateProcess.java b/src/main/java/speiger/src/builder/processor/TemplateProcess.java index ec2bc4c..9079449 100644 --- a/src/main/java/speiger/src/builder/processor/TemplateProcess.java +++ b/src/main/java/speiger/src/builder/processor/TemplateProcess.java @@ -4,8 +4,10 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.UnaryOperator; @@ -16,6 +18,7 @@ public class TemplateProcess UnaryOperator pathBuilder; String fileName; Set parsePool = new HashSet<>(); + Map parseValues = new HashMap<>(); List mappers = new ArrayList<>(); public TemplateProcess(String fileName) @@ -41,6 +44,18 @@ public class TemplateProcess return this; } + public TemplateProcess addValue(String key, int value) + { + parseValues.put(key, value); + return this; + } + + public TemplateProcess addValues(Map values) + { + parseValues.putAll(values); + return this; + } + public TemplateProcess addMapper(IMapper mapper) { mappers.add(mapper); diff --git a/src/main/java/speiger/src/builder/processor/TemplateProcessor.java b/src/main/java/speiger/src/builder/processor/TemplateProcessor.java index 235323c..1cf3214 100644 --- a/src/main/java/speiger/src/builder/processor/TemplateProcessor.java +++ b/src/main/java/speiger/src/builder/processor/TemplateProcessor.java @@ -158,7 +158,7 @@ public abstract class TemplateProcessor System.out.println("Finished Building ["+counters[0].get()+"] Files from ["+counters[1].get()+"] in "+(System.currentTimeMillis() - start)+"ms (Template Parsing: "+counters[2].get()+"ms (avg: "+((counters[2].get() / Math.max(1D, counters[1].get())))+"ms)"); FileUtils.saveMappings(existing, dataFolder); afterFinish(); - System.out.print("Saved Changes"); + System.out.println("Saved Changes"); return true; } }