001/* 002 * $Id: StringUtil.java 5160 2015-03-26 21:52:03Z 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 114 /** 115 * Select stack trace parts. 116 * @param expr regular matching expression. 117 * @return stack trace with elements matching expr. 118 */ 119 public static String selectStackTrace(String expr) { 120 StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 121 StringBuffer sb = new StringBuffer(); 122 for (int i = 0; i < stack.length; i++) { 123 String s = stack[i].toString(); 124 if (s.indexOf("selectStackTrace") >= 0) { 125 continue; 126 } 127 if (s.matches(expr)) { 128 sb.append("\nstack[" + i + "] = "); 129 sb.append(s); 130 } 131 //System.out.println("stack["+i+"] = " + s); 132 } 133 return sb.toString(); 134 } 135 136}