001/*
002 * $Id: StringUtil.java 4055 2012-07-26 17:37:29Z kredel $
003 */
004
005package edu.jas.kern;
006
007
008import java.io.IOException;
009import java.io.Reader;
010import java.io.StringWriter;
011
012
013/**
014 * Static String and Reader methods.
015 * @author Heinz Kredel
016 */
017
018public class StringUtil {
019
020
021    /**
022     * Parse white space delimited String from Reader.
023     * @param r Reader.
024     * @return next non white space String from r.
025     */
026    public static String nextString(Reader r) {
027        StringWriter sw = new StringWriter();
028        try {
029            char buffer;
030            int i;
031            // skip white space
032            while ((i = r.read()) > -1) {
033                buffer = (char) i;
034                if (!Character.isWhitespace(buffer)) {
035                    sw.write(buffer);
036                    break;
037                }
038            }
039            // read non white space, ignore new lines ?
040            while ((i = r.read()) > -1) {
041                buffer = (char) i;
042                if (Character.isWhitespace(buffer)) {
043                    break;
044                }
045                sw.write(buffer);
046            }
047        } catch (IOException e) {
048            e.printStackTrace();
049        }
050        return sw.toString();
051    }
052
053
054    /**
055     * Parse String with given delimiter from Reader.
056     * @param c delimiter.
057     * @param r Reader.
058     * @return next String up to c from r.
059     */
060    public static String nextString(Reader r, char c) {
061        StringWriter sw = new StringWriter();
062        try {
063            char buffer;
064            int i;
065            // read chars != c, ignore new lines ?
066            while ((i = r.read()) > -1) {
067                buffer = (char) i;
068                if (buffer == c) {
069                    break;
070                }
071                sw.write(buffer);
072            }
073        } catch (IOException e) {
074            e.printStackTrace();
075        }
076        return sw.toString();
077    }
078
079
080    /**
081     * Parse paired String with given delimiters from Reader.
082     * @param b opposite delimiter.
083     * @param c delimiter.
084     * @param r Reader.
085     * @return next nested matching String up to c from r.
086     */
087    public static String nextPairedString(Reader r, char b, char c) {
088        StringWriter sw = new StringWriter();
089        try {
090            int level = 0;
091            char buffer;
092            int i;
093            // read chars != c, ignore new lines ?
094            while ((i = r.read()) > -1) {
095                buffer = (char) i;
096                if (buffer == b) {
097                    level++;
098                }
099                if (buffer == c) {
100                    level--;
101                    if (level < 0) {
102                        break; // skip last closing 'brace' 
103                    }
104                }
105                sw.write(buffer);
106            }
107        } catch (IOException e) {
108            e.printStackTrace();
109        }
110        return sw.toString();
111    }
112
113}