(file) Return to CIMName.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  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                    */

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2