blob: 43ef7c45971f210a51ea4f88a71781cf772a66f8 [file] [log] [blame]
Stuart McCulloch26e7a5a2011-10-17 10:31:43 +00001package aQute.libg.qtokens;
2
3import java.util.*;
4
5import aQute.libg.generics.*;
6
7public class QuotedTokenizer {
8 String string;
9 int index = 0;
10 String separators;
11 boolean returnTokens;
12 boolean ignoreWhiteSpace = true;
13 String peek;
14 char separator;
15
16 public QuotedTokenizer(String string, String separators, boolean returnTokens ) {
17 if ( string == null )
18 throw new IllegalArgumentException("string argument must be not null");
19 this.string = string;
20 this.separators = separators;
21 this.returnTokens = returnTokens;
22 }
23 public QuotedTokenizer(String string, String separators) {
24 this(string,separators,false);
25 }
26
27 public String nextToken(String separators) {
28 separator = 0;
29 if ( peek != null ) {
30 String tmp = peek;
31 peek = null;
32 return tmp;
33 }
34
35 if ( index == string.length())
36 return null;
37
38 StringBuffer sb = new StringBuffer();
39
40 while (index < string.length()) {
41 char c = string.charAt(index++);
42
43 if ( Character.isWhitespace(c)) {
44 if ( index == string.length())
45 break;
46 else {
47 sb.append(c);
48 continue;
49 }
50 }
51
52 if (separators.indexOf(c) >= 0) {
53 if (returnTokens)
54 peek = Character.toString(c);
55 else
56 separator = c;
57 break;
58 }
59
60 switch (c) {
61 case '"' :
62 case '\'' :
63 quotedString(sb, c);
64 break;
65
66 default :
67 sb.append(c);
68 }
69 }
70 String result = sb.toString().trim();
71 if ( result.length()==0 && index==string.length())
72 return null;
73 return result;
74 }
75
76 public String nextToken() {
77 return nextToken(separators);
78 }
79
80 private void quotedString(StringBuffer sb, char c) {
81 char quote = c;
82 while (index < string.length()) {
83 c = string.charAt(index++);
84 if (c == quote)
85 break;
86 if (c == '\\' && index < string.length()
87 && string.charAt(index + 1) == quote)
88 c = string.charAt(index++);
89 sb.append(c);
90 }
91 }
92
93 public String[] getTokens() {
94 return getTokens(0);
95 }
96
97 private String [] getTokens(int cnt){
98 String token = nextToken();
99 if ( token == null )
100 return new String[cnt];
101
102 String result[] = getTokens(cnt+1);
103 result[cnt]=token;
104 return result;
105 }
106
107 public char getSeparator() { return separator; }
108
109 public List<String> getTokenSet() {
110 List<String> list = Create.list();
111 String token = nextToken();
112 while ( token != null ) {
113 list.add(token);
114 token = nextToken();
115 }
116 return list;
117 }
118}