RESOLVED - # 99: Change StringBuffer deleteCharAt() to integer

http://bugs.koc.se/view.php?id=99
This commit is contained in:
Ziver Koc 2011-09-20 17:18:25 +00:00
parent a1acca0545
commit e46ecc1dca
10 changed files with 99 additions and 66 deletions

View file

@ -9,7 +9,7 @@
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="lib" path="libs/commons-fileupload-1.2.1.jar" sourcepath="C:/Users/Ziver/Documents/Programmering/Java/libs/commons/commons-fileupload-1.2.1-sources.jar"/>
<classpathentry kind="lib" path="libs/commons-io-1.4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="lib" path="libs/mysql-connector-java-5.1.14-bin.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -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

View file

@ -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");

View file

@ -38,7 +38,7 @@ public class TorrentTracker {
private URL trackerURL;
// TODO: incomplete
public void update() throws IOException {
HttpClient request = HttpClient.GET();
request.setURL( trackerURL );

View file

@ -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<String, String> 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 <br />"));
}
/**
* 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();
}

View file

@ -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 );
}

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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();

View file

@ -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("<i>1234</i>", parser.read("[i]1234[/i]"));
assertEquals("[apa]lol[/apa]", parser.read("[apa]lol[/apa]"));
assertEquals("jshdkj <u>lol [apa]lol[/apa]</u>", parser.read("jshdkj [u]lol [apa]lol[/apa]"));
//assertEquals("jshdkj [m]lol[/k] <i>lol</i>", 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 <br />", parser.read("jshdkj <br />"));
}
}