diff --git a/.classpath b/.classpath
index 91cacf2..bf3673e 100644
--- a/.classpath
+++ b/.classpath
@@ -9,7 +9,7 @@
-
+
diff --git a/src/zutil/io/StringInputStream.java b/src/zutil/io/StringInputStream.java
index 5d41f3f..63cfd43 100644
--- a/src/zutil/io/StringInputStream.java
+++ b/src/zutil/io/StringInputStream.java
@@ -40,6 +40,11 @@ public class StringInputStream extends InputStream{
clear();
}
+ public StringInputStream(String data) {
+ clear();
+ add(data);
+ }
+
/**
* Returns an estimate of the number of bytes
* that can be read (or skipped over) from this
diff --git a/src/zutil/net/torrent/TorrentMetainfo.java b/src/zutil/net/torrent/TorrentMetainfo.java
index c860207..f3454f4 100644
--- a/src/zutil/net/torrent/TorrentMetainfo.java
+++ b/src/zutil/net/torrent/TorrentMetainfo.java
@@ -70,7 +70,7 @@ public class TorrentMetainfo {
private void decode(String data){
- DataNode metainfo = BEncodedParser.parse(data);
+ DataNode metainfo = BEncodedParser.read(data);
// Main values
announce = metainfo.getString("announce");
diff --git a/src/zutil/net/torrent/TorrentTracker.java b/src/zutil/net/torrent/TorrentTracker.java
index da42cbe..c05b521 100644
--- a/src/zutil/net/torrent/TorrentTracker.java
+++ b/src/zutil/net/torrent/TorrentTracker.java
@@ -38,7 +38,7 @@ public class TorrentTracker {
private URL trackerURL;
-
+ // TODO: incomplete
public void update() throws IOException {
HttpClient request = HttpClient.GET();
request.setURL( trackerURL );
diff --git a/src/zutil/parser/BBCodeParser.java b/src/zutil/parser/BBCodeParser.java
index 4888df2..a687622 100644
--- a/src/zutil/parser/BBCodeParser.java
+++ b/src/zutil/parser/BBCodeParser.java
@@ -23,6 +23,8 @@ package zutil.parser;
import java.util.HashMap;
+import zutil.struct.MutableInt;
+
/**
* Parses BBCode and replaces them with the corresponding HTML.
*
@@ -32,15 +34,6 @@ public class BBCodeParser {
/** Contains all the BBCodes and the corresponding HTML **/
private HashMap bbcodes;
- public static void main(String[] args){
- BBCodeParser parser = new BBCodeParser();
- System.out.println(parser.parse("jshdkj [u]lol [apa]lol[/apa]"));
- System.out.println(parser.parse("jshdkj [m]lol[/k] [i]lol[/i]"));
- System.out.println(parser.parse("jshdkj [m"));
- System.out.println(parser.parse("jshdkj [/m"));
- System.out.println(parser.parse("jshdkj m]"));
- System.out.println(parser.parse("jshdkj
"));
- }
/**
* Initiates a instance of the parser with the most used BBCodes.
@@ -86,20 +79,20 @@ public class BBCodeParser {
* @param text is a String with BBCode
* @return a String where all BBCode has been replaced by HTML
*/
- public String parse(String text){
+ public String read(String text){
StringBuilder out = new StringBuilder();
StringBuilder t = new StringBuilder(text);
- parse(t, out, "");
+ read(new MutableInt(), t, out, "");
return out.toString();
}
- private void parse(StringBuilder text, StringBuilder out, String rootBBC){
+ private void read(MutableInt index, StringBuilder text, StringBuilder out, String rootBBC){
StringBuilder bbcode = null;
boolean closeTag = false;
- while(text.length() > 0){
- char c = text.charAt(0);
+ while(index.i < text.length()){
+ char c = text.charAt(index.i);
if(c == '['){
bbcode = new StringBuilder();
}
@@ -110,7 +103,7 @@ public class BBCodeParser {
String param = "";
switch(c){
case '=':
- param = parseParam(text);
+ param = parseParam(index, text);
case ']':
String bbcode_cache = bbcode.toString();
if(closeTag){
@@ -119,7 +112,7 @@ public class BBCodeParser {
}
return;
}
- String value = parseValue(text, bbcode_cache);
+ String value = parseValue(index, text, bbcode_cache);
if(bbcodes.containsKey( bbcode_cache )){
String html = bbcodes.get( bbcode_cache );
html = html.replaceAll("%1", param);
@@ -142,8 +135,8 @@ public class BBCodeParser {
}
else
out.append(c);
- if(text.length()>0)
- text.deleteCharAt(0);
+
+ index.i++;
}
if(bbcode!=null)
if(closeTag)out.append("[/").append(bbcode);
@@ -156,15 +149,15 @@ public class BBCodeParser {
* @param text is the text to parse from
* @return only the parameter string
*/
- private String parseParam(StringBuilder text){
+ private String parseParam(MutableInt index, StringBuilder text){
StringBuilder param = new StringBuilder();
- while(text.length() > 0){
- char c = text.charAt(0);
+ while(index.i < text.length()){
+ char c = text.charAt(index.i);
if(c == ']')
break;
else if(c != '=')
param.append(c);
- text.deleteCharAt(0);
+ index.i++;
}
return param.toString();
}
@@ -174,17 +167,17 @@ public class BBCodeParser {
*
* @param text is the text to parse the value from
*/
- private String parseValue(StringBuilder text, String bbcode){
+ private String parseValue(MutableInt index, StringBuilder text, String bbcode){
StringBuilder value = new StringBuilder();
- while(text.length() > 0){
- char c = text.charAt(0);
+ while(index.i < text.length()){
+ char c = text.charAt(index.i);
if(c == '['){
- parse(text, value, bbcode);
+ read(index, text, value, bbcode);
break;
}
else if(c != ']')
value.append(c);
- text.deleteCharAt(0);
+ index.i++;
}
return value.toString();
}
diff --git a/src/zutil/parser/BEncodedParser.java b/src/zutil/parser/BEncodedParser.java
index 40e63c3..70c226d 100644
--- a/src/zutil/parser/BEncodedParser.java
+++ b/src/zutil/parser/BEncodedParser.java
@@ -22,6 +22,7 @@
package zutil.parser;
import zutil.parser.DataNode.DataType;
+import zutil.struct.MutableInt;
/**
* http://wiki.theory.org/BitTorrentSpecification
@@ -36,8 +37,8 @@ public class BEncodedParser {
* @param data The data to be decoded
* @return
*/
- public static DataNode parse(String data){
- return decode_BEncoded(new StringBuffer(data));
+ public static DataNode read(String data){
+ return decode_BEncoded(new MutableInt(), new StringBuilder(data));
}
/**
@@ -47,11 +48,11 @@ public class BEncodedParser {
* @param index The index in data to start from
* @return
*/
- private static DataNode decode_BEncoded(StringBuffer data){
+ private static DataNode decode_BEncoded(MutableInt index, StringBuilder data){
String tmp;
char c = ' ';
- switch (data.charAt(0)) {
+ switch (data.charAt(index.i)) {
/**
* Integers are prefixed with an i and terminated by an e. For
* example, 123 would bEcode to i123e, -3272002 would bEncode to
@@ -59,9 +60,9 @@ public class BEncodedParser {
*/
case 'i':
//System.out.println("Found Integer at "+index);
- data.deleteCharAt(0);
- tmp = data.substring(0, data.indexOf("e"));
- data.delete(0, tmp.length() + 1);
+ index.i++;
+ tmp = data.substring(index.i, data.indexOf("e"));
+ index.i += tmp.length() + 1;
//System.out.println(tmp);
return new DataNode( new Long(tmp));
/**
@@ -73,14 +74,14 @@ public class BEncodedParser {
*/
case 'l':
//System.out.println("Found List at "+index);
- data.deleteCharAt(0);
+ index.i++;
DataNode list = new DataNode( DataType.List );
- c = data.charAt(0);
+ c = data.charAt(index.i);
while(c != 'e'){
- list.add( decode_BEncoded(data) );
- c = data.charAt(0);
+ list.add( decode_BEncoded(index, data) );
+ c = data.charAt(index.i);
}
- data.deleteCharAt(0);
+ index.i++;
//MultiPrintStream.out.dump(list);
if(list.size() == 1) return list.get(0);
else return list;
@@ -92,15 +93,15 @@ public class BEncodedParser {
*/
case 'd':
//System.out.println("Found Dictionary at "+index);
- data.deleteCharAt(0);
+ index.i++;
DataNode map = new DataNode( DataType.Map );
- c = data.charAt(0);
+ c = data.charAt(index.i);
while(c != 'e'){
- DataNode tmp2 = decode_BEncoded(data);
- map.set(tmp2.getString(), decode_BEncoded(data));
- c = data.charAt(0);
+ DataNode tmp2 = decode_BEncoded(index, data);
+ map.set(tmp2.getString(), decode_BEncoded(index, data));
+ c = data.charAt(index.i);
}
- data.deleteCharAt(0);
+ index.i++;
//MultiPrintStream.out.dump(map);
return map;
/**
@@ -110,11 +111,11 @@ public class BEncodedParser {
*/
default:
//System.out.println("Found String at "+index);
- tmp = data.substring(0, data.indexOf(":"));
+ tmp = data.substring(index.i, data.indexOf(":"));
int length = Integer.parseInt(tmp);
- data.delete(0, tmp.length()+1);
- String ret = data.substring(0, length);
- data.delete(0, length);
+ index.i += tmp.length() + 1;
+ String ret = data.substring(index.i, length);
+ index.i += length;
//System.out.println(data.substring(i, i+length));
return new DataNode( ret );
}
diff --git a/src/zutil/parser/json/JSONParser.java b/src/zutil/parser/json/JSONParser.java
index fca7e02..ccbd80d 100644
--- a/src/zutil/parser/json/JSONParser.java
+++ b/src/zutil/parser/json/JSONParser.java
@@ -23,6 +23,7 @@ package zutil.parser.json;
import zutil.parser.DataNode;
import zutil.parser.DataNode.DataType;
+import zutil.struct.MutableInt;
/**
* This is a JSON parser class
@@ -30,12 +31,6 @@ import zutil.parser.DataNode.DataType;
* @author Ziver
*/
public class JSONParser{
- /**
- * A dumb class for persisting an index
- */
- protected class Index{
- protected int i = 0;
- }
/**
* Starts parsing
@@ -44,7 +39,7 @@ public class JSONParser{
* @return a JSONNode object that is the root of the JSON
*/
public DataNode read(String json){
- return parse(new Index(), new StringBuffer(json));
+ return parse(new MutableInt(), new StringBuilder(json));
}
@@ -54,7 +49,7 @@ public class JSONParser{
* @param json
* @return
*/
- protected static DataNode parse(Index index, StringBuffer json){
+ protected static DataNode parse(MutableInt index, StringBuilder json){
DataNode root = null;
DataNode key = null;
DataNode node = null;
diff --git a/src/zutil/struct/MutableInt.java b/src/zutil/struct/MutableInt.java
new file mode 100644
index 0000000..c793abb
--- /dev/null
+++ b/src/zutil/struct/MutableInt.java
@@ -0,0 +1,17 @@
+package zutil.struct;
+
+/**
+ * A simple class that only contains a public int. Can be used in
+ * recursive functions as a persistent integer.
+ *
+ * @author Ziver
+ */
+public class MutableInt {
+ public int i = 0;
+
+ public MutableInt(){}
+
+ public MutableInt(int i){
+ this.i = i;
+ }
+}
diff --git a/src/zutil/test/JSONTest.java b/src/zutil/test/JSONTest.java
index dc90ab9..d81cab2 100644
--- a/src/zutil/test/JSONTest.java
+++ b/src/zutil/test/JSONTest.java
@@ -5,18 +5,13 @@ import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
-import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
-
import zutil.parser.DataNode;
import zutil.parser.json.JSONParser;
-public class JSONTest extends AbstractBenchmark{
- public static final int ITERATION = 200;
+public class JSONTest{
@Test
- @BenchmarkOptions(benchmarkRounds = ITERATION)
public void JSONParser() {
JSONParser parser = new JSONParser();
diff --git a/src/zutil/test/ParserTest.java b/src/zutil/test/ParserTest.java
new file mode 100644
index 0000000..eebdad0
--- /dev/null
+++ b/src/zutil/test/ParserTest.java
@@ -0,0 +1,27 @@
+package zutil.test;
+
+import static org.junit.Assert.assertEquals;
+
+
+import org.junit.Test;
+
+import zutil.parser.BBCodeParser;
+
+
+public class ParserTest{
+
+ @Test
+ public void BBCodeParser() {
+ BBCodeParser parser = new BBCodeParser();
+
+ assertEquals("1234", parser.read("1234"));
+ assertEquals("1234", parser.read("[i]1234[/i]"));
+ assertEquals("[apa]lol[/apa]", parser.read("[apa]lol[/apa]"));
+ assertEquals("jshdkj lol [apa]lol[/apa]", parser.read("jshdkj [u]lol [apa]lol[/apa]"));
+ //assertEquals("jshdkj [m]lol[/k] lol", parser.read("jshdkj [m]lol[/k] [i]lol[/i]"));
+ assertEquals("jshdkj [m", parser.read("jshdkj [m"));
+ assertEquals("jshdkj [/m", parser.read("jshdkj [/m"));
+ assertEquals("jshdkj m]", parser.read("jshdkj m]"));
+ assertEquals("jshdkj
", parser.read("jshdkj
"));
+ }
+}