aboutsummaryrefslogtreecommitdiff
path: root/project/QBarInterpreter/src/com/modulus/qbar/lang/QBString.java
diff options
context:
space:
mode:
Diffstat (limited to 'project/QBarInterpreter/src/com/modulus/qbar/lang/QBString.java')
-rw-r--r--project/QBarInterpreter/src/com/modulus/qbar/lang/QBString.java111
1 files changed, 111 insertions, 0 deletions
diff --git a/project/QBarInterpreter/src/com/modulus/qbar/lang/QBString.java b/project/QBarInterpreter/src/com/modulus/qbar/lang/QBString.java
new file mode 100644
index 0000000..4e931f8
--- /dev/null
+++ b/project/QBarInterpreter/src/com/modulus/qbar/lang/QBString.java
@@ -0,0 +1,111 @@
+package com.modulus.qbar.lang;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.modulus.qbar.core.QBObject;
+import com.modulus.qbar.core.QBStruct;
+import com.modulus.qbar.core.exceptions.ParseException;
+import com.modulus.qbar.core.primitive.QBChar;
+
+public class QBString extends QBArrayList {
+
+ public static final QBStruct string = new QBStruct("String", QBList.list){
+
+ };
+
+ private static Map<String, String> escapes = new HashMap<String, String>();
+
+ static{
+ string.addSuperStruct(QBArrayList.arrayListStruct);
+
+ escapes.put("\\n", "\n");
+ escapes.put("\\\\", "\\");
+ escapes.put("\\r", "\r");
+ escapes.put("\\t", "\t");
+ escapes.put("\\\"", "\"");
+ escapes.put("\\'", "'");
+ }
+
+ public QBString(QBChar[] objs) {
+ super(objs, string);
+ }
+
+ public QBString(String str, boolean parse){
+ this( dynamicCast(str,parse) );
+ }
+
+ @Override
+ public String getWrapped(){
+ StringBuffer buf = new StringBuffer();
+
+ for(int i = 0;i < this.size();i++)
+ buf.append( this.get(i) );
+
+ return buf.toString();
+ }
+
+ private static QBChar[] dynamicCast(String str, boolean parse){
+ if(parse)
+ str = parseString(str);
+
+ char[] chars = str.toCharArray();
+ QBChar[] chars2 = new QBChar[chars.length];
+
+ for(int i =0 ;i < chars.length;i++)
+ chars2[i] = new QBChar(chars[i]);
+
+ return chars2;
+ }
+
+ public String toString(){
+ return this.getWrapped();
+ }
+
+ @Override
+ public QBArrayList append(QBObject obj){
+ String str1 = this.toString();
+ String str2 = obj.toString();
+
+ return new QBString(str1 + str2, false);
+ }
+
+ @Override
+ public QBObject add(QBObject obj){
+ String str = obj.toString();
+
+ for(int i = 0;i < str.length();i++){
+ super.add( new QBChar(str.charAt(i)) );
+ }
+
+ return this;
+ }
+
+ private static String parseString(String str){
+ StringBuffer buf = new StringBuffer();
+ boolean escaped = false;
+ for( int i = 0;i < str.length();i ++){
+ if(str.startsWith("\\", i)){
+ for ( String key : escapes.keySet() ){
+ // System.out.printf("str.startsWith( %s, %s )\n", key, i);
+ if( str.startsWith(key, i) ){
+ buf.append( escapes.get(key) );
+ i++;
+
+ escaped = true;
+ break;
+ }
+ }
+ }
+
+ if(!escaped){
+ buf.append(str.charAt(i));
+ } else {
+ escaped = false;
+ }
+ }
+
+ return buf.toString();
+ }
+
+}