1 karl 1.32 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.8 //
|
3 karl 1.27 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.23 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.27 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.28 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.32 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.8 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 kumpf 1.11 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.8 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.32 //
|
21 kumpf 1.11 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.8 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 kumpf 1.11 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.8 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include <cctype>
35 #include "CIMName.h"
|
36 david 1.19 #include "CommonUTF.h"
|
37 r.kieninger 1.31 #include "CharSet.h"
|
38 mike 1.8
39 PEGASUS_NAMESPACE_BEGIN
40
|
41 kumpf 1.14 ////////////////////////////////////////////////////////////////////////////////
42 //
43 // CIMName
44 //
45 ////////////////////////////////////////////////////////////////////////////////
46
47 #define PEGASUS_ARRAY_T CIMName
48 # include "ArrayImpl.h"
49 #undef PEGASUS_ARRAY_T
50
|
51 r.kieninger 1.31 CIMName::CIMName(const String& name) : cimName(name)
|
52 kumpf 1.14 {
|
53 r.kieninger 1.31 if (!legal(name))
54 throw InvalidNameException(name);
|
55 kumpf 1.14 }
56
|
57 r.kieninger 1.31 CIMName::CIMName(const char* name) : cimName(name)
|
58 kumpf 1.14 {
59 if (!legal(name))
|
60 kumpf 1.16 throw InvalidNameException(name);
|
61 kumpf 1.14 }
62
|
63 r.kieninger 1.31 CIMName& CIMName::operator=(const String& name)
|
64 kumpf 1.14 {
65 if (!legal(name))
|
66 kumpf 1.16 throw InvalidNameException(name);
|
67 kumpf 1.14
|
68 r.kieninger 1.31 cimName=name;
|
69 kumpf 1.14 return *this;
70 }
71
|
72 r.kieninger 1.31 CIMName& CIMName::operator=(const char* name)
|
73 kumpf 1.14 {
74 if (!legal(name))
|
75 kumpf 1.16 throw InvalidNameException(name);
|
76 r.kieninger 1.31
77 cimName = name;
|
78 kumpf 1.14 return *this;
79 }
80
|
81 r.kieninger 1.31 Boolean CIMName::legal(const String& name)
|
82 kumpf 1.14 {
|
83 r.kieninger 1.31 // Check first character.
|
84 kumpf 1.14
|
85 r.kieninger 1.31 const Uint16* p = (const Uint16*)name.getChar16Data();
86 size_t n = name.size();
|
87 kumpf 1.14
|
88 r.kieninger 1.31 if (!(*p < 128 && CharSet::isAlphaUnder(*p)))
89 {
|
90 kumpf 1.33 if (!(*p >= 0x0080 && *p <= 0xFFEF))
|
91 r.kieninger 1.31 return false;
92 }
|
93 kumpf 1.14
|
94 r.kieninger 1.31 p++;
95 n--;
|
96 mike 1.8
|
97 r.kieninger 1.31 // Use loop unrolling to skip over good ASCII 7-bit characters.
|
98 mike 1.8
|
99 r.kieninger 1.31 while (n >= 4)
100 {
|
101 kumpf 1.33 if (p[0] < 128 && CharSet::isAlNumUnder(p[0]) &&
102 p[1] < 128 && CharSet::isAlNumUnder(p[1]) &&
103 p[2] < 128 && CharSet::isAlNumUnder(p[2]) &&
104 p[3] < 128 && CharSet::isAlNumUnder(p[3]))
105 {
106 p += 4;
107 n -= 4;
108 continue;
109 }
|
110 david 1.19
|
111 kumpf 1.33 break;
|
112 david 1.20 }
|
113 kumpf 1.21
|
114 r.kieninger 1.31 // Process remaining charcters.
115
116 while (n)
|
117 mike 1.8 {
|
118 kumpf 1.33 if (!(*p < 128 && CharSet::isAlNumUnder(*p)))
119 {
120 if (!(*p >= 0x0080 && *p <= 0xFFEF))
121 return false;
122 }
123 p++;
124 n--;
|
125 mike 1.8 }
126
127 return true;
|
128 kumpf 1.10 }
129
|
130 kumpf 1.14 ////////////////////////////////////////////////////////////////////////////////
131 //
132 // CIMNamespaceName
133 //
134 ////////////////////////////////////////////////////////////////////////////////
135
|
136 kumpf 1.17 #define PEGASUS_ARRAY_T CIMNamespaceName
137 # include "ArrayImpl.h"
138 #undef PEGASUS_ARRAY_T
139
|
140 r.kieninger 1.31 inline void _check_namespace_name(String& name)
|
141 kumpf 1.14 {
|
142 r.kieninger 1.31 if (!CIMNamespaceName::legal(name))
143 throw InvalidNamespaceNameException(name);
144
145 if (name[0] == '/')
146 name.remove(0, 1);
|
147 kumpf 1.14 }
148
|
149 kumpf 1.33 CIMNamespaceName::CIMNamespaceName(const String& name)
|
150 r.kieninger 1.31 : cimNamespaceName(name)
|
151 kumpf 1.14 {
|
152 r.kieninger 1.31 _check_namespace_name(cimNamespaceName);
|
153 kumpf 1.14 }
154
|
155 kumpf 1.33 CIMNamespaceName::CIMNamespaceName(const char* name)
|
156 r.kieninger 1.31 : cimNamespaceName(name)
|
157 kumpf 1.14 {
|
158 r.kieninger 1.31 _check_namespace_name(cimNamespaceName);
|
159 kumpf 1.14 }
160
161 CIMNamespaceName& CIMNamespaceName::operator=(const CIMNamespaceName& name)
162 {
|
163 r.kieninger 1.31 cimNamespaceName = name.cimNamespaceName;
|
164 kumpf 1.14 return *this;
165 }
166
167 CIMNamespaceName& CIMNamespaceName::operator=(const String& name)
168 {
|
169 r.kieninger 1.31 cimNamespaceName = name;
170 _check_namespace_name(cimNamespaceName);
|
171 kumpf 1.14 return *this;
172 }
173
|
174 r.kieninger 1.31 CIMNamespaceName& CIMNamespaceName::operator=(const char* name)
|
175 kumpf 1.14 {
|
176 r.kieninger 1.31 cimNamespaceName = name;
177 _check_namespace_name(cimNamespaceName);
178 return *this;
|
179 kumpf 1.14 }
180
|
181 kumpf 1.18 Boolean CIMNamespaceName::legal(const String& name)
|
182 kumpf 1.14 {
|
183 kumpf 1.21 Uint32 length = name.size();
184 Uint32 index = 0;
|
185 kumpf 1.14
|
186 kumpf 1.21 // Skip a leading '/' because the CIM specification is ambiguous
187 if (name[0] == '/')
|
188 david 1.19 {
|
189 kumpf 1.21 index++;
|
190 kumpf 1.14 }
191
|
192 kumpf 1.21 Boolean moreElements = true;
|
193 kumpf 1.14
|
194 kumpf 1.21 // Check each namespace element (delimited by '/' characters)
195 while (moreElements)
|
196 kumpf 1.14 {
|
197 kumpf 1.21 moreElements = false;
|
198 kumpf 1.14
|
199 kumpf 1.21 if (index == length)
200 {
201 return false;
202 }
|
203 kumpf 1.14
|
204 r.kieninger 1.31 Uint16 ch = name[index++];
|
205 kumpf 1.14
|
206 kumpf 1.21 // First character must be alphabetic or '_' if ASCII
|
207 r.kieninger 1.31
208 if (!((ch >= 0x0080 && ch <= 0xFFEF) || CharSet::isAlphaUnder(ch)))
|
209 kumpf 1.14 return false;
|
210 kumpf 1.21
211 // Remaining characters must be alphanumeric or '_' if ASCII
212 while (index < length)
213 {
|
214 r.kieninger 1.31 ch = name[index++];
|
215 kumpf 1.21
216 // A '/' indicates another namespace element follows
|
217 r.kieninger 1.31 if (ch == '/')
|
218 kumpf 1.21 {
219 moreElements = true;
220 break;
221 }
222
|
223 kumpf 1.33 if (!((ch >= 0x0080 && ch <= 0xFFEF) || CharSet::isAlNumUnder(ch)))
|
224 kumpf 1.21 return false;
225 }
|
226 kumpf 1.14 }
227
228 return true;
229 }
230
|
231 r.kieninger 1.31 Boolean operator==(const CIMNamespaceName& name1, const CIMNamespaceName& name2)
|
232 kumpf 1.14 {
|
233 r.kieninger 1.31 return name1.equal(name2);
|
234 kumpf 1.14 }
|
235 kumpf 1.17
|
236 r.kieninger 1.31 Boolean operator==(const CIMNamespaceName& name1, const char* name2)
|
237 kumpf 1.17 {
238 return name1.equal(name2);
239 }
|
240 mike 1.8
|
241 r.kieninger 1.31 Boolean operator==(const char* name1, const CIMNamespaceName& name2)
242 {
243 return name2.equal(name1);
244 }
245
|
246 david.dillard 1.29 Boolean operator!=(const CIMNamespaceName& name1, const CIMNamespaceName& name2)
247 {
248 return !name1.equal(name2);
249 }
250
|
251 r.kieninger 1.31 Boolean operator!=(const CIMNamespaceName& name1, const char* name2)
252 {
253 return !name1.equal(name2);
254 }
255
256 Boolean operator!=(const char* name1, const CIMNamespaceName& name2)
257 {
258 return !name2.equal(name1);
259 }
260
|
261 mike 1.8 PEGASUS_NAMESPACE_END
|
262 r.kieninger 1.31
263 /*
264 ================================================================================
265
266 Optimizations:
267
268 1. Optimized legal().
269 2. Implmented "char*" version of operator=().
270 3. Added conditional inlining (for Pegaus internal use).
271 4. Added comparison functions for "char*".
272 5. Implemented "unchecked" version of constructors and assignment operators
273 that take String or "char*".
274 6. Added loop unrolling to CIMName::legal()
275
276 ================================================================================
277 */
|