01: /*
02: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
03: *
04: * This file is part of Resin(R) Open Source
05: *
06: * Each copy or derived work must preserve the copyright notice and this
07: * notice unmodified.
08: *
09: * Resin Open Source is free software; you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation; either version 2 of the License, or
12: * (at your option) any later version.
13: *
14: * Resin Open Source is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17: * of NON-INFRINGEMENT. See the GNU General Public License for more
18: * details.
19: *
20: * You should have received a copy of the GNU General Public License
21: * along with Resin Open Source; if not, write to the
22: * Free SoftwareFoundation, Inc.
23: * 59 Temple Place, Suite 330
24: * Boston, MA 02111-1307 USA
25: *
26: * @author Scott Ferguson
27: */
28:
29: package com.caucho.xml2;
30:
31: import com.caucho.util.L10N;
32: import com.caucho.vfs.ReadStream;
33: import com.caucho.vfs.TempCharBuffer;
34: import com.caucho.vfs.Vfs;
35: import com.caucho.xml.ExtendedLocator;
36: import com.caucho.xml.QName;
37: import com.caucho.xml.XmlChar;
38:
39: import org.xml.sax.*;
40:
41: import java.io.IOException;
42: import java.io.InputStream;
43: import java.io.Reader;
44: import java.util.HashMap;
45:
46: /**
47: * Interning names
48: */
49: public class Intern {
50: private static final int SIZE = 203;
51:
52: private final InternQName[] _entries = new InternQName[SIZE];
53:
54: InternQName add(char[] buffer, int offset, int length, int colon) {
55: int hash = 0;
56:
57: for (int i = length - 1; i >= 0; i--) {
58: hash = 37 * hash + buffer[offset + i];
59: }
60:
61: int bucket = (hash & 0x7fffffff) % SIZE;
62:
63: InternQName qName;
64:
65: for (qName = _entries[bucket]; qName != null; qName = qName._next) {
66: if (qName.match(buffer, offset, length))
67: return qName;
68: }
69:
70: qName = new InternQName(_entries[bucket], buffer, offset,
71: length, colon);
72: _entries[bucket] = qName;
73:
74: return qName;
75: }
76: }
|