java/ch/wlkl/env/Ut.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ch.wlkl.env;

import static ch.wlkl.env.Env.dy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author walter
 */
public class Ut {

    public final static Pattern spacePlus = Pattern.compile("\\s+");
    final private static Matcher xQuoteMatcher = Pattern.compile("[^\"\\\\\n]+").matcher("");
    public static String xUnquote(String src) {
        if (src == null || src.length() <= 1)
            dy("cannot unquote this string: <" + src + ">");
        
        StringBuilder buf = new StringBuilder("");
        final char qu = src.charAt(0);
        char c = 0;
        int sx = 1, qx = 0, bx = 0; 
        
        while (true) {
            if (qx < sx)
                if ((qx = src.indexOf(qu, sx)) < 0)
                    qx = src.length();
            if (bx < sx)
                if ((bx = src.indexOf('\\', sx)) < 0)
                    bx = src.length();
            if (bx < qx) {
                if (bx + 1>= src.length())
                    dy("backslash at end of String: <" + src + ">");
                buf.append(src, sx, bx).append((c = src.charAt(bx+1)) == 'n' ? '\n' : c == 't' ? 't' : c);
                sx = bx+2;
            } else {
                if (qx + 1 == src.length())
                    return buf.append(src, sx, qx).toString();
                else
                    dy("quote within String: <" + src + ">");
            }
        }
    }

    public static String xQuote(String src) {
        if (src == null)
            return "\"\"";
        StringBuffer buf = new StringBuffer("\"");
        int nx = 0;
        xQuoteMatcher.reset(src);
        while (true) {
            if (xQuoteMatcher.lookingAt()) {
                buf.append(xQuoteMatcher.group());
                nx = xQuoteMatcher.end();
            } 
            if (nx >= src.length())
                return buf.append('"').toString();
            buf.append('\\').append(src.charAt(nx) == '\n' ? 'n' : src.charAt(nx));
            xQuoteMatcher.region(++nx, src.length());
        }
    }

    public static String fill(String rep, int len) {
        StringBuffer b = new StringBuffer(rep == null || rep.equals("") ? " " : rep);
        while (b.length() < len)
            b.append(b);
        return b.substring(0, len);
    }


    public static  <T extends ArrayList> T[] clone2(T[] s) {
        T[] c = s.clone();
        for (int i = 0; i < c.length; i++) {
            if (c[i] != null) {
                c[i] = (T) c[i].clone();
            }
        }
        return c;
    }
    
    public static <T> T[] array(T... eles) {
        return eles;
    }

    public static <T, C extends Collection<T>, U extends T> C add(C l, U... eles) {
        for(T e: eles)
            l.add(e);
        return l;    
    }

    public static <C extends Collection<String>> C addWords(C l, String s) {
        return add(l, spacePlus.split(s));
    }

    
    public static <T> List<T> list(T... eles) {
        T n = (T) new Object();
        return add(new ArrayList<T>(), eles);
    } 
    
    static StringBuilder spaces = new StringBuilder("                ");
    public static CharSequence spaces(int l) {
        while (l >= spaces.length())
            spaces.append(spaces);
        return spaces.subSequence(0, l);
    }
}