001: /*
002:
003: ============================================================================
004: The Apache Software License, Version 1.1
005: ============================================================================
006:
007: Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
008:
009: Redistribution and use in source and binary forms, with or without modifica-
010: tion, are permitted provided that the following conditions are met:
011:
012: 1. Redistributions of source code must retain the above copyright notice,
013: this list of conditions and the following disclaimer.
014:
015: 2. Redistributions in binary form must reproduce the above copyright notice,
016: this list of conditions and the following disclaimer in the documentation
017: and/or other materials provided with the distribution.
018:
019: 3. The end-user documentation included with the redistribution, if any, must
020: include the following acknowledgment: "This product includes software
021: developed by the Apache Software Foundation (http://www.apache.org/)."
022: Alternately, this acknowledgment may appear in the software itself, if
023: and wherever such third-party acknowledgments normally appear.
024:
025: 4. The names "Batik" and "Apache Software Foundation" must not be
026: used to endorse or promote products derived from this software without
027: prior written permission. For written permission, please contact
028: apache@apache.org.
029:
030: 5. Products derived from this software may not be called "Apache", nor may
031: "Apache" appear in their name, without prior written permission of the
032: Apache Software Foundation.
033:
034: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
035: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
036: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
037: APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
038: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
039: DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
040: OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
041: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
042: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
043: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
044:
045: This software consists of voluntary contributions made by many individuals
046: on behalf of the Apache Software Foundation. For more information on the
047: Apache Software Foundation, please see <http://www.apache.org/>.
048:
049: */
050:
051: package org.apache.batik.css.parser;
052:
053: /**
054: * A collection of utility functions for a CSS scanner.
055: *
056: * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
057: * @version $Id$
058: */
059: public class ScannerUtilities {
060:
061: /**
062: * The set of the valid identifier start characters.
063: */
064: // BEGIN RAVE MODIFICATIONS
065: //protected final static int[] IDENTIFIER_START = { 0, 0, 134217726, 134217726 };
066: // "-" is a valid identifier start character per the css2 grammar (CSS2.1 section 4.1.1)
067: // ident [-]?{nmstart}{nmchar}*
068: // So we need to mark it as valid. This is the 13th character of the second 32-character
069: // block (ascii 45), and 1<<13 = 8192, so I've changed the second array item from 0 to 8192
070: // Ditto for underscore: underscore is ASCII 95 decimal. That's the 31st character in the third 32-character block.
071: protected final static int[] IDENTIFIER_START = { 0, 0 | 8192,
072: 134217726 | 1 << 31, 134217726 };
073: // END RAVE MODIFICATIONS
074:
075: /**
076: * The set of the valid name characters.
077: */
078: // BEGIN RAVE MODIFICATIONS
079: //protected final static int[] NAME = { 0, 67051520, 134217726, 134217726 };
080: // Merge in _ and - as valid identifier characters. See under IDENTIFIER_START above.
081: protected final static int[] NAME = { 0, 67051520 | 1 << 13,
082: 134217726 | 1 << 31, 134217726 };
083: // END RAVE MODIFICATIONS
084:
085: /**
086: * The set of the valid hexadecimal characters.
087: */
088: protected final static int[] HEXADECIMAL = { 0, 67043328, 126, 126 };
089:
090: /**
091: * The set of the valid string characters.
092: */
093: protected final static int[] STRING = { 512, -133, -1, 2147483647 };
094:
095: /**
096: * The set of the valid uri characters.
097: */
098: protected final static int[] URI = { 0, -902, -1, 2147483647 };
099:
100: /**
101: * This class does not need to be instantiated.
102: */
103: protected ScannerUtilities() {
104: }
105:
106: /**
107: * Tests whether the given character is a valid space.
108: */
109: public static boolean isCSSSpace(char c) {
110: return (c <= 0x0020)
111: && (((((1L << '\t') | (1L << '\n') | (1L << '\r')
112: | (1L << '\f') | (1L << 0x0020)) >> c) & 1L) != 0);
113: }
114:
115: /**
116: * Tests whether the given character is a valid identifier start character.
117: */
118: public static boolean isCSSIdentifierStartCharacter(char c) {
119: return c >= 128
120: || ((IDENTIFIER_START[c / 32] & (1 << (c % 32))) != 0);
121: }
122:
123: /**
124: * Tests whether the given character is a valid name character.
125: */
126: public static boolean isCSSNameCharacter(char c) {
127: return c >= 128 || ((NAME[c / 32] & (1 << (c % 32))) != 0);
128: }
129:
130: /**
131: * Tests whether the given character is a valid hexadecimal character.
132: */
133: public static boolean isCSSHexadecimalCharacter(char c) {
134: return c < 128
135: && ((HEXADECIMAL[c / 32] & (1 << (c % 32))) != 0);
136: }
137:
138: /**
139: * Tests whether the given character is a valid string character.
140: */
141: public static boolean isCSSStringCharacter(char c) {
142: return c >= 128 || ((STRING[c / 32] & (1 << (c % 32))) != 0);
143: }
144:
145: /**
146: * Tests whether the given character is a valid URI character.
147: */
148: public static boolean isCSSURICharacter(char c) {
149: return c >= 128 || ((URI[c / 32] & (1 << (c % 32))) != 0);
150: }
151: }
|