1 21 22 27 28 package javax.mail.internet; 29 30 import java.util.*; 31 32 43 44 public class HeaderTokenizer { 45 46 50 public static class Token { 51 52 private int type; 53 private String value; 54 55 58 public static final int ATOM = -1; 59 60 64 public static final int QUOTEDSTRING = -2; 65 66 71 public static final int COMMENT = -3; 72 73 76 public static final int EOF = -4; 77 78 83 public Token(int type, String value) { 84 this.type = type; 85 this.value = value; 86 } 87 88 104 public int getType() { 105 return type; 106 } 107 108 116 public String getValue() { 117 return value; 118 } 119 } 120 121 private String string; private boolean skipComments; private String delimiters; private int currentPos; private int maxPos; private int nextPos; private int peekPos; 129 132 public final static String RFC822 = "()<>@,;:\\\"\t .[]"; 133 134 137 public final static String MIME = "()<>@,;:\\\"\t []/?="; 138 139 private final static Token EOFToken = new Token(Token.EOF, null); 141 142 153 public HeaderTokenizer(String header, String delimiters, 154 boolean skipComments) { 155 string = (header == null) ? "" : header; this.skipComments = skipComments; 157 this.delimiters = delimiters; 158 currentPos = nextPos = peekPos = 0; 159 maxPos = string.length(); 160 } 161 162 168 public HeaderTokenizer(String header, String delimiters) { 169 this(header, delimiters, true); 170 } 171 172 177 public HeaderTokenizer(String header) { 178 this(header, RFC822); 179 } 180 181 190 public Token next() throws ParseException { 191 Token tk; 192 193 currentPos = nextPos; tk = getNext(); 195 nextPos = peekPos = currentPos; return tk; 197 } 198 199 208 public Token peek() throws ParseException { 209 Token tk; 210 211 currentPos = peekPos; tk = getNext(); 213 peekPos = currentPos; return tk; 215 } 216 217 223 public String getRemainder() { 224 return string.substring(nextPos); 225 } 226 227 232 private Token getNext() throws ParseException { 233 if (currentPos >= maxPos) 235 return EOFToken; 236 237 if (skipWhiteSpace() == Token.EOF) 239 return EOFToken; 240 241 char c; 242 int start; 243 boolean filter = false; 244 245 c = string.charAt(currentPos); 246 247 while (c == '(') { 250 int nesting; 252 for (start = ++currentPos, nesting = 1; 253 nesting > 0 && currentPos < maxPos; 254 currentPos++) { 255 c = string.charAt(currentPos); 256 if (c == '\\') { currentPos++; filter = true; 259 } else if (c == '\r') 260 filter = true; 261 else if (c == '(') 262 nesting++; 263 else if (c == ')') 264 nesting--; 265 } 266 if (nesting != 0) 267 throw new ParseException ("Unbalanced comments"); 268 269 if (!skipComments) { 270 String s; 273 if (filter) s = filterToken(string, start, currentPos-1); 275 else 276 s = string.substring(start,currentPos-1); 277 278 return new Token(Token.COMMENT, s); 279 } 280 281 if (skipWhiteSpace() == Token.EOF) 283 return EOFToken; 284 c = string.charAt(currentPos); 285 } 286 287 if (c == '"') { 290 for (start = ++currentPos; currentPos < maxPos; currentPos++) { 291 c = string.charAt(currentPos); 292 if (c == '\\') { currentPos++; 294 filter = true; 295 } else if (c == '\r') 296 filter = true; 297 else if (c == '"') { 298 currentPos++; 299 String s; 300 301 if (filter) 302 s = filterToken(string, start, currentPos-1); 303 else 304 s = string.substring(start,currentPos-1); 305 306 return new Token(Token.QUOTEDSTRING, s); 307 } 308 } 309 throw new ParseException ("Unbalanced quoted string"); 310 } 311 312 if (c < 040 || c >= 0177 || delimiters.indexOf(c) >= 0) { 314 currentPos++; char ch[] = new char[1]; 316 ch[0] = c; 317 return new Token((int)c, new String (ch)); 318 } 319 320 for (start = currentPos; currentPos < maxPos; currentPos++) { 322 c = string.charAt(currentPos); 323 if (c < 040 || c >= 0177 || c == '(' || c == ' ' || 326 c == '"' || delimiters.indexOf(c) >= 0) 327 break; 328 } 329 return new Token(Token.ATOM, string.substring(start, currentPos)); 330 } 331 332 private int skipWhiteSpace() { 334 char c; 335 for (; currentPos < maxPos; currentPos++) 336 if (((c = string.charAt(currentPos)) != ' ') && 337 (c != '\t') && (c != '\r') && (c != '\n')) 338 return currentPos; 339 return Token.EOF; 340 } 341 342 345 private static String filterToken(String s, int start, int end) { 346 StringBuffer sb = new StringBuffer (); 347 char c; 348 boolean gotEscape = false; 349 boolean gotCR = false; 350 351 for (int i = start; i < end; i++) { 352 c = s.charAt(i); 353 if (c == '\n' && gotCR) { 354 gotCR = false; 357 continue; 358 } 359 360 gotCR = false; 361 if (!gotEscape) { 362 if (c == '\\') gotEscape = true; 365 else if (c == '\r') gotCR = true; 367 else sb.append(c); 369 } else { 370 sb.append(c); 374 gotEscape = false; 375 } 376 } 377 return sb.toString(); 378 } 379 } 380
| Popular Tags
|