sascha@199: package de.intevation.flys.utils;
sascha@199: 
sascha@199: /**
sascha@199:  * Copyright (c) 2006 by Intevation GmbH
sascha@199:  *
sascha@199:  * @author Sascha L. Teichmann (teichmann@intevation.de)
sascha@199:  * @author Ludwig Reiter       (ludwig@intevation.de)
sascha@199:  *
sascha@199:  * This program is free software under the LGPL (>=v2.1)
sascha@199:  * Read the file LGPL coming with FLYS for details.
sascha@199:  */
sascha@199: import java.util.Arrays;
sascha@199: import java.util.ArrayList;
sascha@199: import java.util.Locale;
sascha@199: 
sascha@199: import java.net.URLEncoder;
sascha@199: import java.net.URLDecoder;
sascha@199: 
sascha@199: import java.io.UnsupportedEncodingException;
sascha@199: import java.io.IOException;
sascha@199: import java.io.BufferedReader;
sascha@199: import java.io.StringReader;
sascha@199: import java.io.StringWriter;
sascha@199: import java.io.PrintWriter;
sascha@199: 
felix@2343: 
sascha@199: public final class StringUtil {
sascha@199:     final static String NUMBER_SEPERATOR = ";";
sascha@199:     final static String LINE_SEPERATOR = ":";
sascha@199: 
sascha@199:     private StringUtil() {
sascha@199:     }
sascha@199: 
sascha@199:     public static final String double2DArrayToString(double[][] values) {
sascha@199: 
sascha@199:         if (values == null) {
sascha@199:             throw new IllegalArgumentException("keine double[][]-Werte");
sascha@199:         }
sascha@199: 
sascha@199:         StringBuilder strbuf = new StringBuilder();
sascha@199: 
sascha@199:         for (int i=0; i < values.length; i++) {
sascha@199:             if (i>0) {
sascha@199:                 strbuf.append(LINE_SEPERATOR);
sascha@199:             }
sascha@199:             for (int j=0; j < values[i].length; j++) {
sascha@199:                 if (j > 0) {
sascha@199:                     strbuf.append(NUMBER_SEPERATOR);
sascha@199:                 }
sascha@199:                 strbuf.append(values[i][j]);
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         return strbuf.toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static final double[][] stringToDouble2DArray(String str) {
sascha@199:         if (str == null || str.length() == 0) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         String[] lineSplit = str.split(LINE_SEPERATOR);
sascha@199:         double[][] array2D = new double[lineSplit.length][];
sascha@199:         for (int i=0; i < lineSplit.length; i++) {
sascha@199:             String[] numberSplit =  lineSplit[i].split(NUMBER_SEPERATOR);
sascha@199: 
sascha@199:             double[] numbers = new double[numberSplit.length];
sascha@199:             for (int j=0; j < numberSplit.length; j++) {
sascha@199:                 numbers[j] = Double.valueOf(numberSplit[j]).doubleValue();
sascha@199:             }
sascha@199: 
sascha@199:             array2D[i] = numbers;
sascha@199:         }
sascha@199: 
sascha@199:         return array2D;
sascha@199:     }
sascha@199: 
felix@2343:     /**
felix@2343:      * Remove first occurrence of "[" and "]" (if both do occur).
felix@2343:      * @param value String to be stripped of [] (might be null).
felix@2343:      * @return input string but with [ and ] removed, or input string if no
felix@2343:      *         brackets were found.
felix@2343:      */
felix@2343:     public static final String unbracket(String value) {
felix@2343:         // null- guard
felix@2343:         if (value == null) return value;
felix@2343: 
felix@2343:         int start = value.indexOf("[");
felix@2343:         int end   = value.indexOf("]");
felix@2343: 
felix@2343:         if (start < 0 || end < 0) {
felix@2343:             return value;
felix@2343:         }
felix@2343: 
felix@2343:         value = value.substring(start + 1, end);
felix@2343: 
felix@2343:         return value;
felix@2343:     }
felix@2343: 
felix@2343: 
felix@2344:     /**
felix@2344:      * From "Q=1" make "W(Q=1)".
felix@2344:      * @return original string wraped in "W()" if it contains a "Q", original
felix@2344:      *         string otherwise.
felix@2344:      */
felix@2344:     public static String wWrap(String wOrQ) {
felix@2344:         return (wOrQ != null && wOrQ.indexOf("Q") >=0)
felix@2344:                ? "W(" + wOrQ + ")"
felix@2344:                : wOrQ;
felix@2344:         }
felix@2344: 
felix@2344: 
sascha@199:     public static final String [] splitLines(String s) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         ArrayList<String> list = new ArrayList<String>();
sascha@199: 
sascha@199:         BufferedReader in = null;
sascha@199: 
sascha@199:         try {
sascha@199:             in =
sascha@199:                 new BufferedReader(
sascha@199:                 new StringReader(s));
sascha@199: 
sascha@199:             String line;
sascha@199: 
sascha@199:             while ((line = in.readLine()) != null) {
sascha@199:                 list.add(line);
sascha@199:             }
sascha@199:         }
sascha@199:         catch (IOException ioe) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         finally {
sascha@199:             if (in != null)
sascha@199:                 try {
sascha@199:                     in.close();
sascha@199:                 }
sascha@199:                 catch (IOException ioe) {}
sascha@199:         }
sascha@199: 
sascha@199:         return list.toArray(new String[list.size()]);
sascha@199:     }
sascha@199: 
sascha@199:     public static final String concat(String [] s) {
sascha@199:         return concat(s, null);
sascha@199:     }
sascha@199: 
sascha@199:     public static final String concat(String [] s, String glue) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         StringBuilder sb = new StringBuilder();
sascha@199:         for (int i = 0; i < s.length; ++i) {
sascha@199:             if (i > 0 && glue != null) {
sascha@199:                 sb.append(glue);
sascha@199:             }
sascha@199:             sb.append(s[i]);
sascha@199:         }
sascha@199:         return sb.toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitAfter(String [] src, int N) {
sascha@199:         if (src == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         ArrayList<String> list = new ArrayList<String>(src.length);
sascha@199:         for (int i = 0; i < src.length; ++i) {
sascha@199:             String s = src[i];
sascha@199:             int R;
sascha@199:             if (s == null || (R = s.length()) == 0) {
sascha@199:                 list.add(s);
sascha@199:             }
sascha@199:             else {
sascha@199:                 while (R > N) {
sascha@199:                     list.add(s.substring(0, N));
sascha@199:                     s = s.substring(N);
sascha@199:                     R = s.length();
sascha@199:                 }
sascha@199:                 list.add(s);
sascha@199:             }
sascha@199:         }
sascha@199:         return list.toArray(new String[list.size()]);
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitQuoted(String s) {
sascha@199:         return splitQuoted(s, '"');
sascha@199:     }
sascha@199: 
sascha@199:     public static final String[] fitArray(String [] src, String [] dst) {
sascha@199:         if (src == null) {
sascha@199:             return dst;
sascha@199:         }
sascha@199:         if (dst == null) {
sascha@199:             return src;
sascha@199:         }
sascha@199: 
sascha@199:         if (src.length == dst.length) {
sascha@199:             return src;
sascha@199:         }
sascha@199: 
sascha@199:         System.arraycopy(src, 0, dst, 0, Math.min(dst.length, src.length));
sascha@199: 
sascha@199:         return dst;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitQuoted(String s, char quoteChar) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         ArrayList<String> l = new ArrayList<String>();
sascha@199:         int mode = 0, last_mode = 0;
sascha@199:         StringBuilder sb = new StringBuilder();
sascha@199:         for (int N = s.length(), i = 0; i < N; ++i) {
sascha@199:             char c = s.charAt(i);
sascha@199:             switch (mode) {
sascha@199:                 case 0: // unquoted mode
sascha@199:                     if (c == quoteChar) {
sascha@199:                         mode = 1; // to quoted mode
sascha@199:                         if (sb.length() > 0) {
sascha@199:                             l.add(sb.toString());
sascha@199:                             sb.setLength(0);
sascha@199:                         }
sascha@199:                     }
sascha@199:                     else if (c == '\\') {
sascha@199:                         last_mode = 0;
sascha@199:                         mode = 2; // escape mode
sascha@199:                     }
sascha@199:                     else if (!Character.isWhitespace(c)) {
sascha@199:                         sb.append(c);
sascha@199:                     }
sascha@199:                     else if (sb.length() > 0) {
sascha@199:                         l.add(sb.toString());
sascha@199:                         sb.setLength(0);
sascha@199:                     }
sascha@199:                     break;
sascha@199:                 case 1: // quote mode
sascha@199:                     if (c == '\\') {
sascha@199:                         last_mode = 1;
sascha@199:                         mode = 2; // escape mode
sascha@199:                     }
sascha@199:                     else if (c == quoteChar) { // leave quote mode
sascha@199:                         l.add(sb.toString());
sascha@199:                         sb.setLength(0);
sascha@199:                         mode = 0; // to unquoted mode
sascha@199:                     }
sascha@199:                     else {
sascha@199:                         sb.append(c);
sascha@199:                     }
sascha@199:                     break;
sascha@199:                 case 2: // escape mode
sascha@199:                     sb.append(c);
sascha@199:                     mode = last_mode;
sascha@199:                     break;
sascha@199:             }
sascha@199:         }
sascha@199:         if (sb.length() > 0) {
sascha@199:             l.add(sb.toString());
sascha@199:         }
sascha@199:         return l.toArray(new String[l.size()]);
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitUnique(String s) {
sascha@199:         return splitUnique(s, "[\\s,]+");
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitUnique(String s, String sep) {
sascha@199:         return s != null ? unique(s.split(sep)) : null;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] unique(String [] str) {
sascha@199:         if (str == null || str.length == 1) {
sascha@199:             return str;
sascha@199:         }
sascha@199: 
sascha@199:         Arrays.sort(str);
sascha@199: 
sascha@199:         for (int i = 1; i < str.length; ++i)
sascha@199:             if (str[i].equals(str[i-1])) {
sascha@199:                 ArrayList<String> list = new ArrayList<String>(str.length);
sascha@199: 
sascha@199:                 for (int j = 0; j < i; ++j) {
sascha@199:                     list.add(str[j]);
sascha@199:                 }
sascha@199: 
sascha@199:                 String last = str[i];
sascha@199: 
sascha@199:                 for (++i; i < str.length; ++i)
sascha@199:                     if (!last.equals(str[i])) {
sascha@199:                         list.add(last = str[i]);
sascha@199:                     }
sascha@199: 
sascha@199:                 return list.toArray(new String[list.size()]);
sascha@199:             }
sascha@199: 
sascha@199:         return str;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] ensureEmptyExistence(String [] str) {
sascha@199:         if (str == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         for (int i = 0; i < str.length; ++i)
sascha@199:             if (str[i].length() == 0) {
sascha@199:                 if (i != 0) { // copy to front
sascha@199:                     String t = str[0];
sascha@199:                     str[0] = str[i];
sascha@199:                     str[i] = t;
sascha@199:                 }
sascha@199:                 return str;
sascha@199:             }
sascha@199: 
sascha@199:         String [] n = new String[str.length+1];
sascha@199:         n[0] = "";
sascha@199:         System.arraycopy(str, 0, n, 1, str.length);
sascha@199:         return n;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String ensureWidthPadLeft(String s, int width, char pad) {
sascha@199:         int N = s.length();
sascha@199:         if (N >= width) {
sascha@199:             return s;
sascha@199:         }
sascha@199:         StringBuilder sb = new StringBuilder(width);
sascha@199:         for (; N < width; ++N) {
sascha@199:             sb.append(pad);
sascha@199:         }
sascha@199:         sb.append(s);
sascha@199:         return sb.toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitWhiteSpaceWithNAsPad(
sascha@199:         String s,
sascha@199:         int    N,
sascha@199:         String pad
sascha@199:     ) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         boolean copyChars = true;
sascha@199:         int     count     = 0; // number of WS
sascha@199: 
sascha@199:         int S = s.length();
sascha@199: 
sascha@199:         ArrayList<String> parts = new ArrayList<String>();
sascha@199: 
sascha@199:         StringBuilder part = new StringBuilder(S);
sascha@199: 
sascha@199:         for (int i = 0; i < S; ++i) {
sascha@199:             char c = s.charAt(i);
sascha@199:             if (copyChars) { // char mode
sascha@199:                 if (Character.isWhitespace(c)) {
sascha@199:                     if (part.length() > 0) {
sascha@199:                         parts.add(part.toString());
sascha@199:                         part.setLength(0);
sascha@199:                     }
sascha@199:                     count     = 1;
sascha@199:                     copyChars = false; // to WS mode
sascha@199:                 }
sascha@199:                 else {
sascha@199:                     part.append(c);
sascha@199:                 }
sascha@199:             }
sascha@199:             else { // counting WS
sascha@199:                 if (Character.isWhitespace(c)) {
sascha@199:                     ++count;
sascha@199:                 }
sascha@199:                 else {
sascha@199:                     while (count >= N) {// enough to insert pad?
sascha@199:                         parts.add(pad);
sascha@199:                         count -= N;
sascha@199:                     }
sascha@199:                     part.append(c);
sascha@199:                     count     = 0;
sascha@199:                     copyChars = true; // back to char mode
sascha@199:                 }
sascha@199:             }
sascha@199:         } // for all chars
sascha@199: 
sascha@199:         if (copyChars) {
sascha@199:             if (part.length() > 0) {
sascha@199:                 parts.add(part.toString());
sascha@199:             }
sascha@199:         }
sascha@199:         else {
sascha@199:             while (count >= N) { // enough to insert pad?
sascha@199:                 parts.add(pad);
sascha@199:                 count -= N;
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         return parts.toArray(new String[parts.size()]);
sascha@199:     }
sascha@199: 
sascha@199:     public static final String encodeURL(String url) {
sascha@199:         try {
sascha@199:             return url != null
sascha@199:                    ? URLEncoder.encode(url, "UTF-8")
sascha@199:                    : "";
sascha@199:         }
sascha@199:         catch (UnsupportedEncodingException usee) {
sascha@199:             throw new RuntimeException(usee.getLocalizedMessage());
sascha@199:         }
sascha@199:     }
sascha@199: 
sascha@199:     public static final String decodeURL(String url) {
sascha@199:         try {
sascha@199:             return url != null
sascha@199:                    ? URLDecoder.decode(url, "UTF-8")
sascha@199:                    : "";
sascha@199:         }
sascha@199:         catch (UnsupportedEncodingException usee) {
sascha@199:             throw new RuntimeException(usee.getLocalizedMessage());
sascha@199:         }
sascha@199:     }
sascha@199: 
sascha@199:     public static final boolean isEmpty(String s) {
sascha@199:         return s == null || s.length() == 0;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String empty(String s) {
sascha@199:         return s == null ? "" : s;
sascha@199:     }
sascha@199: 
sascha@199: 
sascha@199:     public static final String trim(String s) {
sascha@199:         return s != null ? s.trim() : null;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String uniqueWhitespaces(String s) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         boolean wasWS = false;
sascha@199:         StringBuilder sb = new StringBuilder();
sascha@199: 
sascha@199:         for (int N = s.length(), i = 0; i < N; ++i) {
sascha@199:             char c = s.charAt(i);
sascha@199:             if (Character.isWhitespace(c)) {
sascha@199:                 if (!wasWS) {
sascha@199:                     sb.append(c);
sascha@199:                     wasWS = true;
sascha@199:                 }
sascha@199:             }
sascha@199:             else {
sascha@199:                 sb.append(c);
sascha@199:                 wasWS = false;
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         return sb.toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static final String replaceNewlines(String s) {
sascha@199:         return s == null
sascha@199:                ? null
sascha@199:                : s.replace('\r', ' ').replace('\n', ' ');
sascha@199:     }
sascha@199: 
sascha@199:     /*
sascha@199:     public static final String quoteReplacement(String s) {
sascha@199: 
sascha@199:         if (s == null || (s.indexOf('\\') == -1 && s.indexOf('$') == -1))
sascha@199:             return s;
sascha@199: 
sascha@199:         StringBuilder sb = new StringBuilder();
sascha@199: 
sascha@199:         for (int N = s.length(), i = 0; i < N; ++i) {
sascha@199:             char c = s.charAt(i);
sascha@199:             if (c == '\\' || c == '$') sb.append('\\');
sascha@199:             sb.append(c);
sascha@199:         }
sascha@199: 
sascha@199:         return sb.toString();
sascha@199:     }
sascha@199:     */
sascha@199: 
sascha@199:     public static final String quoteReplacement(String s) {
sascha@199: 
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         for (int N = s.length(), i = 0; i < N; ++i) { // plain check loop
sascha@199:             char c = s.charAt(i);
sascha@199:             if (c == '$' || c == '\\') { // first special -> StringBuilder
sascha@199:                 StringBuilder sb = new StringBuilder(s.substring(0, i))
sascha@199:                 .append('\\')
sascha@199:                 .append(c);
sascha@199:                 for (++i; i < N; ++i) { // build StringBuilder with rest
sascha@199:                     if ((c = s.charAt(i)) == '$' || c == '\\') {
sascha@199:                         sb.append('\\');
sascha@199:                     }
sascha@199:                     sb.append(c);
sascha@199:                 }
sascha@199:                 return sb.toString();
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         return s;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String repeat(String what, int times) {
sascha@199:         return repeat(what, times, new StringBuilder()).toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static final StringBuilder repeat(String what, int times, StringBuilder sb) {
sascha@199:         while (times-- > 0) {
sascha@199:             sb.append(what);
sascha@199:         }
sascha@199:         return sb;
sascha@199:     }
sascha@199: 
sascha@199:     /**
sascha@3792:      * Returns the file name without extension.
sascha@199:      */
sascha@199:     public static final String cutExtension(String s) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         int dot = s.lastIndexOf('.');
sascha@199:         return dot >= 0
sascha@199:                ? s.substring(0, dot)
sascha@199:                : s;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String extension(String s) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         int dot = s.lastIndexOf('.');
sascha@199:         return dot >= 0
sascha@199:                ? s.substring(dot+1)
sascha@199:                : s;
sascha@199:     }
sascha@199: 
sascha@199:     public static final String [] splitExtension(String x) {
sascha@199:         if (x == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199:         int i = x.lastIndexOf('.');
sascha@199:         return i < 0
sascha@199:                ? new String[] { x, null }
sascha@199:                : new String[] { x.substring(0, Math.max(0, i)), x.substring(i+1).toLowerCase() };
sascha@199:     }
sascha@199: 
sascha@199:     public static String entityEncode(String s) {
sascha@199:         if (s == null || s.length() == 0) {
sascha@199:             return s;
sascha@199:         }
sascha@199: 
sascha@199:         StringBuilder sb = new StringBuilder();
sascha@199:         for (int i=0, N =s.length(); i < N; i++) {
sascha@199:             char c = s.charAt(i);
sascha@199:             switch (c) {
sascha@199:                 case '<':
sascha@199:                     sb.append("&lt;");
sascha@199:                     break;
sascha@199:                 case '>':
sascha@199:                     sb.append("&gt;");
sascha@199:                     break;
sascha@199:                 case '&':
sascha@199:                     sb.append("&amp;");
sascha@199:                     break;
sascha@199:                 default:
sascha@199:                     sb.append(c);
sascha@199:             }
sascha@199:         }
sascha@199:         return sb.toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static String entityDecode(String s) {
sascha@199:         if (s == null || s.length() == 0) {
sascha@199:             return s;
sascha@199:         }
sascha@199: 
sascha@199:         boolean amp = false;
sascha@199:         StringBuilder sb = new StringBuilder();
sascha@199:         StringBuilder ampbuf = new StringBuilder();
sascha@199:         for (int i=0, N =s.length(); i < N; i++) {
sascha@199:             char c = s.charAt(i);
sascha@199:             if (amp) {
sascha@199:                 if (c == ';') {
sascha@199:                     amp = false;
sascha@199:                     String str = ampbuf.toString();
sascha@199:                     ampbuf.setLength(0);
sascha@199:                     if (str.equals("lt")) {
sascha@199:                         sb.append('<');
sascha@199:                     }
sascha@199:                     else if (str.equals("gt")) {
sascha@199:                         sb.append('>');
sascha@199:                     }
sascha@199:                     else if (str.equals("amp")) {
sascha@199:                         sb.append('&');
sascha@199:                     }
sascha@199:                     else {
sascha@199:                         sb.append('&').append(str).append(';');
sascha@199:                     }
sascha@199:                 }
sascha@199:                 else {
sascha@199:                     ampbuf.append(c);
sascha@199:                 }
sascha@199:             }
sascha@199:             else if (c=='&') {
sascha@199:                 amp = true;
sascha@199:             }
sascha@199:             else {
sascha@199:                 sb.append(c);
sascha@199:             }
sascha@199: 
sascha@199:         }
sascha@199:         return sb.toString();
sascha@199:     }
sascha@199: 
sascha@199:     public static final String quote(String s) {
sascha@199:         return quote(s, '"');
sascha@199:     }
sascha@199: 
sascha@199:     public static final String quote(String s, char quoteChar) {
sascha@199:         if (s == null) {
sascha@199:             return null;
sascha@199:         }
sascha@199: 
sascha@199:         int N = s.length();
sascha@199: 
sascha@199:         if (N == 0)
sascha@199:             return new StringBuilder(2)
sascha@199:                    .append(quoteChar)
sascha@199:                    .append(quoteChar)
sascha@199:                    .toString();
sascha@199: 
sascha@199:         StringBuilder sb = null;
sascha@199: 
sascha@199:         int i = 0;
sascha@199: 
sascha@199:         for (; i < N; ++i) {
sascha@199:             char c = s.charAt(i);
sascha@199: 
sascha@199:             if (Character.isWhitespace(c)) {
sascha@199:                 sb = new StringBuilder()
sascha@199:                 .append(quoteChar)
sascha@199:                 .append(s.substring(0, i+1));
sascha@199:                 break;
sascha@199:             }
sascha@199:             else if (c == quoteChar) {
sascha@199:                 sb = new StringBuilder()
sascha@199:                 .append(quoteChar)
sascha@199:                 .append(s.substring(0, i))
sascha@199:                 .append('\\')
sascha@199:                 .append(quoteChar);
sascha@199:                 break;
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         if (sb == null) {
sascha@199:             return s;
sascha@199:         }
sascha@199: 
sascha@199:         for (++i; i < N; ++i) {
sascha@199:             char c = s.charAt(i);
sascha@199:             if (c == quoteChar || c == '\\') {
sascha@199:                 sb.append('\\');
sascha@199:             }
sascha@199: 
sascha@199:             sb.append(c);
sascha@199:         }
sascha@199: 
sascha@199:         return sb.append(quoteChar).toString();
sascha@199:     }
sascha@199: 
sascha@199:     /*
sascha@199:     public static String sprintf(String format, Object... args) {
sascha@199:         return sprintf(null, format, args);
sascha@199:     }
sascha@199:     */
sascha@199: 
sascha@199:     public static String sprintf(Locale locale, String format, Object ... args) {
sascha@199:         StringWriter sw = new StringWriter();
sascha@199:         PrintWriter pw = new PrintWriter(sw);
sascha@199:         pw.printf(locale, format, args);
sascha@199:         pw.flush();
sascha@199:         return sw.toString();
sascha@199:     }
sascha@199: 
sascha@199: 
sascha@199:     public static void testQuote() {
sascha@199:         System.err.println("testing quote:");
sascha@199: 
sascha@199:         String cases []  = {
sascha@199:             "",          "''",
sascha@199:             "test",      "test",
sascha@199:             "test test", "'test test'",
sascha@199:             "  test",    "'  test'",
sascha@199:             "test   ",   "'test   '",
sascha@199:             " test ",    "' test '",
sascha@199:             "'test",     "'\\'test'",
sascha@199:             "'",         "'\\''",
sascha@199:             " ' ' ",     "' \\' \\' '",
sascha@199:             "te'st",     "'te\\'st'"
sascha@199:         };
sascha@199: 
sascha@199:         int failed = 0;
sascha@199: 
sascha@199:         for (int i = 0; i < cases.length; i += 2) {
sascha@199:             String in  = cases[i];
sascha@199:             String out = cases[i+1];
sascha@199: 
sascha@199:             String res = quote(in, '\'');
sascha@199:             if (!res.equals(out)) {
sascha@199:                 ++failed;
sascha@199:                 System.err.println(
sascha@199:                     "quote failed on: >" + in +
sascha@199:                     "< result: >" + res +
sascha@199:                     "< expected: >" + out + "<");
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         int T = cases.length/2;
sascha@199: 
sascha@199:         System.err.println("tests total: "  + T);
sascha@199:         System.err.println("tests failed: " + failed);
sascha@199:         System.err.println("tests passed: " + (T - failed));
sascha@199:     }
sascha@199: 
sascha@199:     public static void testQuoteReplacement() {
sascha@199:         System.err.println("testing quoteReplacement:");
sascha@199: 
sascha@199:         String cases []  = {
sascha@199:             "",          "",
sascha@199:             "test",      "test",
sascha@199:             "$",         "\\$",
sascha@199:             "\\",        "\\\\",
sascha@199:             "\\$",       "\\\\\\$",
sascha@199:             "test\\$",   "test\\\\\\$",
sascha@199:             "\\test",    "\\\\test",
sascha@199:             "test$",     "test\\$",
sascha@199:             "test$test", "test\\$test",
sascha@199:             "$test$",    "\\$test\\$"
sascha@199:         };
sascha@199: 
sascha@199:         int failed = 0;
sascha@199: 
sascha@199:         for (int i = 0; i < cases.length; i += 2) {
sascha@199:             String in  = cases[i];
sascha@199:             String out = cases[i+1];
sascha@199: 
sascha@199:             String res = quoteReplacement(in);
sascha@199:             if (!res.equals(out)) {
sascha@199:                 ++failed;
sascha@199:                 System.err.println(
sascha@199:                     "quoteReplacement failed on: '" + in +
sascha@199:                     "' result: '" + res +
sascha@199:                     "' expected: '" + out + "'");
sascha@199:             }
sascha@199:         }
sascha@199: 
sascha@199:         int T = cases.length/2;
sascha@199: 
sascha@199:         System.err.println("tests total: "  + T);
sascha@199:         System.err.println("tests failed: " + failed);
sascha@199:         System.err.println("tests passed: " + (T - failed));
sascha@199:     }
sascha@199: 
sascha@199:     public static void testStringArray2D() {
sascha@199:         int total = 0;
sascha@199:         int fail = 0;
sascha@199:         int passed = 0;
sascha@199: 
sascha@199:         System.err.println("testing StringArray2D:");
sascha@199: 
sascha@199:         double[][] testarray = {{1.0, 2.0, 3.0},
sascha@199:             {1.1, 2.1, 3.1},
sascha@199:             {100.2, 200.2}
sascha@199:         };
sascha@199:         String str = double2DArrayToString(testarray);
sascha@199: 
sascha@199:         total += 1;
sascha@199:         if (str.equals("1.0;2.0;3.0:1.1;2.1;3.1:100.2;200.2")) {
sascha@199:             passed +=1;
sascha@199:         }
sascha@199:         else {
sascha@199:             fail +=1;
sascha@199:             System.err.println("Der Ergebnis-String ist nicht richtig:");
sascha@199:             System.err.println(str);
sascha@199:         }
sascha@199: 
sascha@199: 
sascha@199: 
sascha@199:         double[][] testarray2 = stringToDouble2DArray(str);
sascha@199:         boolean failed = false;
sascha@199: 
sascha@199:         total +=1;
sascha@199:         for (int i=0; i < testarray.length; i++)
sascha@199:             for (int j=0; j < testarray[i].length; j++)
sascha@199:                 if (testarray[i][j] != testarray2[i][j]) {
sascha@199:                     System.err.println("Test scheitert bei i=" +i +" j=" +j);
sascha@199:                     System.err.println("alter Wert=" + testarray[i][j] +" neuer Wert=" +testarray2[i][j]);
sascha@199:                     failed = true;
sascha@199:                 }
sascha@199:         if (failed) {
sascha@199:             fail +=1;
sascha@199:         }
sascha@199:         else {
sascha@199:             passed +=1;
sascha@199:         }
sascha@199:         System.err.println("tests total: "+ total);
sascha@199:         System.err.println("tests failed: "+ fail);
sascha@199:         System.err.println("tests passed: "+ passed);
sascha@199:     }
sascha@199: 
sascha@199:     public static void main(String [] args) {
sascha@199: 
sascha@199:         testQuoteReplacement();
sascha@199:         testQuote();
sascha@199:         testStringArray2D();
sascha@199:     }
felix@5021: 
felix@5021:     /** Check for occurence of needle in hay, converting both to lowercase
felix@5021:      * to be ignorant of cases. */
felix@5021:     public static boolean containsIgnoreCase(String hay, String needle) {
felix@5021:         return hay.toLowerCase().contains(needle.toLowerCase());
felix@5021:     }
sascha@199: }
sascha@199: // end of file