KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > ristretto > imap > parser > ParenthesisParser


1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is Ristretto Mail API.
15  *
16  * The Initial Developers of the Original Code are
17  * Timo Stich and Frederik Dietz.
18  * Portions created by the Initial Developers are Copyright (C) 2004
19  * All Rights Reserved.
20  *
21  * Contributor(s):
22  *
23  * Alternatively, the contents of this file may be used under the terms of
24  * either the GNU General Public License Version 2 or later (the "GPL"), or
25  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26  * in which case the provisions of the GPL or the LGPL are applicable instead
27  * of those above. If you wish to allow use of your version of this file only
28  * under the terms of either the GPL or the LGPL, and not to allow others to
29  * use your version of this file under the terms of the MPL, indicate your
30  * decision by deleting the provisions above and replace them with the notice
31  * and other provisions required by the GPL or the LGPL. If you do not delete
32  * the provisions above, a recipient may use your version of this file under
33  * the terms of any one of the MPL, the GPL or the LGPL.
34  *
35  * ***** END LICENSE BLOCK ***** */

36 package org.columba.ristretto.imap.parser;
37
38 import org.columba.ristretto.parser.ParserException;
39
40 /**
41  * Parser for findind the closing position of a given parenthesis.
42  *
43  * @author tstich
44   */

45 public class ParenthesisParser {
46     private static final int NORMAL = 0;
47     private static final int IN_QUOTES = 1;
48     
49     /**
50      * Finds the closing parenthesis.
51      *
52      * @param s
53      * @param openPos
54      * @return the position of the closing parenthesis
55      * @throws ParserException
56      */

57     public static int getClosingPos(CharSequence JavaDoc s, int openPos) throws ParserException {
58         int mode = NORMAL;
59         int depth = 1;
60         int idx = openPos + 1;
61         
62         while( idx < s.length() ) {
63             switch( s.charAt(idx) ) {
64                 case '\"' : {
65                     // toggle Quotes mode
66
mode ^= 1;
67                     break;
68                 }
69                 
70                 case '(' : {
71                     if( mode == NORMAL ) {
72                         depth++;
73                     }
74                     break;
75                 }
76                 
77                 case ')' : {
78                     if( mode == NORMAL ) {
79                         depth--;
80                         if( depth == 0 ) return idx;
81                     }
82                     break;
83                 }
84             }
85             
86             idx++;
87         }
88         
89         throw new ParserException("No matching Parenthesis found :" + s.toString() );
90     }
91
92 }
93
Popular Tags