Branch data Line data Source code
1 : : /*
2 : : * Licensed to the Apache Software Foundation (ASF) under one or more
3 : : * contributor license agreements. See the NOTICE file distributed with
4 : : * this work for additional information regarding copyright ownership.
5 : : * The ASF licenses this file to You under the Apache License, Version 2.0
6 : : * (the "License"); you may not use this file except in compliance with
7 : : * the License. You may obtain a copy of the License at
8 : : *
9 : : * http://www.apache.org/licenses/LICENSE-2.0
10 : : *
11 : : * Unless required by applicable law or agreed to in writing, software
12 : : * distributed under the License is distributed on an "AS IS" BASIS,
13 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 : : * See the License for the specific language governing permissions and
15 : : * limitations under the License.
16 : : */
17 : :
18 : : /*
19 : : * $Id: XMLString.hpp 1677605 2015-05-04 14:29:48Z amassari $
20 : : */
21 : :
22 : : #if !defined(XERCESC_INCLUDE_GUARD_XMLSTRING_HPP)
23 : : #define XERCESC_INCLUDE_GUARD_XMLSTRING_HPP
24 : :
25 : : #include <xercesc/util/BaseRefVectorOf.hpp>
26 : : #include <xercesc/framework/XMLBuffer.hpp>
27 : : #include <xercesc/framework/MemoryManager.hpp>
28 : : #include <string.h>
29 : : #include <assert.h>
30 : :
31 : : XERCES_CPP_NAMESPACE_BEGIN
32 : :
33 : : class XMLLCPTranscoder;
34 : : /**
35 : : * Class for representing native character strings and handling common string
36 : : * operations
37 : : *
38 : : * This class is Unicode compliant. This class is designed primarily
39 : : * for internal use, but due to popular demand, it is being made
40 : : * publicly available. Users of this class must understand that this
41 : : * is not an officially supported class. All public methods of this
42 : : * class are <i>static functions</i>.
43 : : *
44 : : */
45 : : class XMLUTIL_EXPORT XMLString
46 : : {
47 : : public:
48 : : /* Static methods for native character mode string manipulation */
49 : :
50 : :
51 : : /** @name String concatenation functions */
52 : : //@{
53 : : /** Concatenates two strings.
54 : : *
55 : : * <code>catString</code> appends <code>src</code> to <code>target</code> and
56 : : * terminates the resulting string with a null character. The initial character
57 : : * of <code>src</code> overwrites the terminating character of <code>target
58 : : * </code>.
59 : : *
60 : : * No overflow checking is performed when strings are copied or appended.
61 : : * The behavior of <code>catString</code> is undefined if source and
62 : : * destination strings overlap.
63 : : *
64 : : * @param target Null-terminated destination string
65 : : * @param src Null-terminated source string
66 : : */
67 : : static void catString
68 : : (
69 : : char* const target
70 : : , const char* const src
71 : : );
72 : :
73 : : /** Concatenates two strings.
74 : : *
75 : : * <code>catString</code> appends <code>src</code> to <code>target</code> and
76 : : * terminates the resulting string with a null character. The initial character of
77 : : * <code>src</code> overwrites the terminating character of <code>target</code>.
78 : : * No overflow checking is performed when strings are copied or appended.
79 : : * The behavior of <code>catString</code> is undefined if source and destination
80 : : * strings overlap.
81 : : *
82 : : * @param target Null-terminated destination string
83 : : * @param src Null-terminated source string
84 : : */
85 : : static void catString
86 : : (
87 : : XMLCh* const target
88 : : , const XMLCh* const src
89 : : );
90 : : //@}
91 : :
92 : : /** @name String comparison functions */
93 : : //@{
94 : : /** Lexicographically compares lowercase versions of <code>str1</code> and
95 : : * <code>str2</code> and returns a value indicating their relationship.
96 : : * @param str1 Null-terminated string to compare
97 : : * @param str2 Null-terminated string to compare
98 : : *
99 : : * @return The return value indicates the relation of <code>str1</code> to
100 : : * <code>str2</code> as follows
101 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
102 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
103 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
104 : : */
105 : : static int compareIString
106 : : (
107 : : const char* const str1
108 : : , const char* const str2
109 : : );
110 : :
111 : : /** Lexicographically compares lowercase versions of <code>str1</code> and
112 : : * <code>str2</code> and returns a value indicating their relationship.
113 : : * @param str1 Null-terminated string to compare
114 : : * @param str2 Null-terminated string to compare
115 : : * @return The return value indicates the relation of <code>str1</code> to
116 : : * <code>str2</code> as follows
117 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
118 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
119 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
120 : : */
121 : : static int compareIString
122 : : (
123 : : const XMLCh* const str1
124 : : , const XMLCh* const str2
125 : : );
126 : :
127 : : /** Lexicographically compares lowercase versions of <code>str1</code> and
128 : : * <code>str2</code> and returns a value indicating their relationship.
129 : : * The routine only lowercases A to Z.
130 : : * @param str1 Null-terminated ASCII string to compare
131 : : * @param str2 Null-terminated ASCII string to compare
132 : : * @return The return value indicates the relation of <code>str1</code> to
133 : : * <code>str2</code> as follows
134 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
135 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
136 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
137 : : */
138 : : static int compareIStringASCII
139 : : (
140 : : const XMLCh* const str1
141 : : , const XMLCh* const str2
142 : : );
143 : :
144 : :
145 : :
146 : : /** Lexicographically compares, at most, the first count characters in
147 : : * <code>str1</code> and <code>str2</code> and returns a value indicating the
148 : : * relationship between the substrings.
149 : : * @param str1 Null-terminated string to compare
150 : : * @param str2 Null-terminated string to compare
151 : : * @param count The number of characters to compare
152 : : *
153 : : * @return The return value indicates the relation of <code>str1</code> to
154 : : * <code>str2</code> as follows
155 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
156 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
157 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
158 : : */
159 : : static int compareNString
160 : : (
161 : : const char* const str1
162 : : , const char* const str2
163 : : , const XMLSize_t count
164 : : );
165 : :
166 : : /** Lexicographically compares, at most, the first count characters in
167 : : * <code>str1</code> and <code>str2</code> and returns a value indicating
168 : : * the relationship between the substrings.
169 : : * @param str1 Null-terminated string to compare
170 : : * @param str2 Null-terminated string to compare
171 : : * @param count The number of characters to compare
172 : : *
173 : : * @return The return value indicates the relation of <code>str1</code> to
174 : : * <code>str2</code> as follows
175 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
176 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
177 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
178 : : */
179 : : static int compareNString
180 : : (
181 : : const XMLCh* const str1
182 : : , const XMLCh* const str2
183 : : , const XMLSize_t count
184 : : );
185 : :
186 : :
187 : : /** Lexicographically compares, at most, the first count characters in
188 : : * <code>str1</code> and <code>str2</code> without regard to case and
189 : : * returns a value indicating the relationship between the substrings.
190 : : *
191 : : * @param str1 Null-terminated string to compare
192 : : * @param str2 Null-terminated string to compare
193 : : * @param count The number of characters to compare
194 : : * @return The return value indicates the relation of <code>str1</code> to
195 : : * <code>str2</code> as follows
196 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
197 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
198 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
199 : : */
200 : : static int compareNIString
201 : : (
202 : : const char* const str1
203 : : , const char* const str2
204 : : , const XMLSize_t count
205 : : );
206 : :
207 : : /** Lexicographically compares, at most, the first count characters in
208 : : * <code>str1</code> and <code>str2</code> without regard to case and
209 : : * returns a value indicating the relationship between the substrings.
210 : : *
211 : : * @param str1 Null-terminated string to compare
212 : : * @param str2 Null-terminated string to compare
213 : : * @param count The number of characters to compare
214 : : *
215 : : * @return The return value indicates the relation of <code>str1</code> to
216 : : * <code>str2</code> as follows
217 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
218 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
219 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
220 : : */
221 : : static int compareNIString
222 : : (
223 : : const XMLCh* const str1
224 : : , const XMLCh* const str2
225 : : , const XMLSize_t count
226 : : );
227 : :
228 : : /** Lexicographically compares <code>str1</code> and <code>str2</code> and
229 : : * returns a value indicating their relationship.
230 : : *
231 : : * @param str1 Null-terminated string to compare
232 : : * @param str2 Null-terminated string to compare
233 : : *
234 : : * @return The return value indicates the relation of <code>str1</code> to
235 : : * <code>str2</code> as follows
236 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
237 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
238 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
239 : : */
240 : : static int compareString
241 : : (
242 : : const char* const str1
243 : : , const char* const str2
244 : : );
245 : :
246 : : /** Lexicographically compares <code>str1</code> and <code>str2</code> and
247 : : * returns a value indicating their relationship.
248 : : *
249 : : * @param str1 Null-terminated string to compare
250 : : * @param str2 Null-terminated string to compare
251 : : * @return The return value indicates the relation of <code>str1</code> to
252 : : * <code>str2</code> as follows
253 : : * Less than 0 means <code>str1</code> is less than <code>str2</code>
254 : : * Equal to 0 means <code>str1</code> is identical to <code>str2</code>
255 : : * Greater than 0 means <code>str1</code> is more than <code>str2</code>
256 : : */
257 : : static int compareString
258 : : (
259 : : const XMLCh* const str1
260 : : , const XMLCh* const str2
261 : : );
262 : :
263 : : /** compares <code>str1</code> and <code>str2</code>
264 : : *
265 : : * @param str1 Null-terminated string to compare
266 : : * @param str2 Null-terminated string to compare
267 : : * @return true if two strings are equal, false if not
268 : : * If one string is null, while the other is zero-length string,
269 : : * it is considered as equal.
270 : : */
271 : : static bool equals
272 : : (
273 : : const XMLCh* str1
274 : : , const XMLCh* str2
275 : : );
276 : :
277 : : /** compares <code>str1</code> and <code>str2</code>
278 : : *
279 : : * @param str1 string to compare
280 : : * @param str2 string to compare
281 : : * @param n number of characters to compare
282 : : * @return true if two strings are equal, false if not
283 : : * If one string is null, while the other is zero-length string,
284 : : * it is considered as equal.
285 : : */
286 : : static bool equalsN
287 : : (
288 : : const XMLCh* str1
289 : : , const XMLCh* str2
290 : : , XMLSize_t n
291 : : );
292 : :
293 : : static bool equals
294 : : (
295 : : const char* str1
296 : : , const char* str2
297 : : );
298 : :
299 : : /** compares <code>str1</code> and <code>str2</code>
300 : : *
301 : : * @param str1 string to compare
302 : : * @param str2 string to compare
303 : : * @param n number of characters to compare
304 : : * @return true if two strings are equal, false if not
305 : : * If one string is null, while the other is zero-length string,
306 : : * it is considered as equal.
307 : : */
308 : : static bool equalsN
309 : : (
310 : : const char* str1
311 : : , const char* str2
312 : : , XMLSize_t n
313 : : );
314 : :
315 : : /** Lexicographically compares <code>str1</code> and <code>str2</code>
316 : : * regions and returns true if they are equal, otherwise false.
317 : : *
318 : : * A substring of <code>str1</code> is compared to a substring of
319 : : * <code>str2</code>. The result is true if these substrings represent
320 : : * identical character sequences. The substring of <code>str1</code>
321 : : * to be compared begins at offset1 and has length charCount. The
322 : : * substring of <code>str2</code> to be compared begins at offset2 and
323 : : * has length charCount. The result is false if and only if at least
324 : : * one of the following is true:
325 : : * offset1 is negative.
326 : : * offset2 is negative.
327 : : * offset1+charCount is greater than the length of str1.
328 : : * offset2+charCount is greater than the length of str2.
329 : : * There is some nonnegative integer k less than charCount such that:
330 : : * str1.charAt(offset1+k) != str2.charAt(offset2+k)
331 : : *
332 : : * @param str1 Null-terminated string to compare
333 : : * @param offset1 Starting offset of str1
334 : : * @param str2 Null-terminated string to compare
335 : : * @param offset2 Starting offset of str2
336 : : * @param charCount The number of characters to compare
337 : : * @return true if the specified subregion of <code>str1</code> exactly
338 : : * matches the specified subregion of <code>str2></code>; false
339 : : * otherwise.
340 : : */
341 : : static bool regionMatches
342 : : (
343 : : const XMLCh* const str1
344 : : , const int offset1
345 : : , const XMLCh* const str2
346 : : , const int offset2
347 : : , const XMLSize_t charCount
348 : : );
349 : :
350 : : /** Lexicographically compares <code>str1</code> and <code>str2</code>
351 : : * regions without regard to case and returns true if they are equal,
352 : : * otherwise false.
353 : : *
354 : : * A substring of <code>str1</code> is compared to a substring of
355 : : * <code>str2</code>. The result is true if these substrings represent
356 : : * identical character sequences. The substring of <code>str1</code>
357 : : * to be compared begins at offset1 and has length charCount. The
358 : : * substring of <code>str2</code> to be compared begins at offset2 and
359 : : * has length charCount. The result is false if and only if at least
360 : : * one of the following is true:
361 : : * offset1 is negative.
362 : : * offset2 is negative.
363 : : * offset1+charCount is greater than the length of str1.
364 : : * offset2+charCount is greater than the length of str2.
365 : : * There is some nonnegative integer k less than charCount such that:
366 : : * str1.charAt(offset1+k) != str2.charAt(offset2+k)
367 : : *
368 : : * @param str1 Null-terminated string to compare
369 : : * @param offset1 Starting offset of str1
370 : : * @param str2 Null-terminated string to compare
371 : : * @param offset2 Starting offset of str2
372 : : * @param charCount The number of characters to compare
373 : : * @return true if the specified subregion of <code>str1</code> exactly
374 : : * matches the specified subregion of <code>str2></code>; false
375 : : * otherwise.
376 : : */
377 : : static bool regionIMatches
378 : : (
379 : : const XMLCh* const str1
380 : : , const int offset1
381 : : , const XMLCh* const str2
382 : : , const int offset2
383 : : , const XMLSize_t charCount
384 : : );
385 : : //@}
386 : :
387 : : /** @name String copy functions */
388 : : //@{
389 : : /** Copies <code>src</code>, including the terminating null character, to the
390 : : * location specified by <code>target</code>.
391 : : *
392 : : * No overflow checking is performed when strings are copied or appended.
393 : : * The behavior of strcpy is undefined if the source and destination strings
394 : : * overlap.
395 : : *
396 : : * @param target Destination string
397 : : * @param src Null-terminated source string
398 : : */
399 : : static void copyString
400 : : (
401 : : char* const target
402 : : , const char* const src
403 : : );
404 : :
405 : : /** Copies <code>src</code>, including the terminating null character, to
406 : : * the location specified by <code>target</code>.
407 : : *
408 : : * No overflow checking is performed when strings are copied or appended.
409 : : * The behavior of <code>copyString</code> is undefined if the source and
410 : : * destination strings overlap.
411 : : *
412 : : * @param target Destination string
413 : : * @param src Null-terminated source string
414 : : */
415 : : static void copyString
416 : : (
417 : : XMLCh* const target
418 : : , const XMLCh* const src
419 : : );
420 : :
421 : : /** Copies <code>src</code>, upto a fixed number of characters, to the
422 : : * location specified by <code>target</code>.
423 : : *
424 : : * No overflow checking is performed when strings are copied or appended.
425 : : * The behavior of <code>copyNString</code> is undefined if the source and
426 : : * destination strings overlap.
427 : : *
428 : : * @param target Destination string. The size of the buffer should
429 : : * atleast be 'maxChars + 1'.
430 : : * @param src Null-terminated source string
431 : : * @param maxChars The maximum number of characters to copy
432 : : */
433 : : static bool copyNString
434 : : (
435 : : XMLCh* const target
436 : : , const XMLCh* const src
437 : : , const XMLSize_t maxChars
438 : : );
439 : : //@}
440 : :
441 : : /** @name Hash functions */
442 : : //@{
443 : : /** Hashes a string given a modulus
444 : : *
445 : : * @param toHash The string to hash
446 : : * @param hashModulus The divisor to be used for hashing
447 : : * @return Returns the hash value
448 : : */
449 : : static XMLSize_t hash
450 : : (
451 : : const char* const toHash
452 : : , const XMLSize_t hashModulus
453 : : );
454 : :
455 : : /** Hashes a string given a modulus
456 : : *
457 : : * @param toHash The string to hash
458 : : * @param hashModulus The divisor to be used for hashing
459 : : * @return Returns the hash value
460 : : */
461 : : static XMLSize_t hash
462 : : (
463 : : const XMLCh* const toHash
464 : : , const XMLSize_t hashModulus
465 : : );
466 : :
467 : : /** Hashes a string given a modulus taking a maximum number of characters
468 : : * as the limit
469 : : *
470 : : * @param toHash The string to hash
471 : : * @param numChars The maximum number of characters to consider for hashing
472 : : * @param hashModulus The divisor to be used for hashing
473 : : * @return Returns the hash value
474 : : */
475 : : static XMLSize_t hashN
476 : : (
477 : : const XMLCh* const toHash
478 : : , const XMLSize_t numChars
479 : : , const XMLSize_t hashModulus
480 : : );
481 : :
482 : : //@}
483 : :
484 : : /** @name Search functions */
485 : : //@{
486 : : /**
487 : : * Provides the index of the first occurrence of a character within a string
488 : : *
489 : : * @param toSearch The string to search
490 : : * @param ch The character to search within the string
491 : : * @return If found, returns the index of the character within the string,
492 : : * else returns -1.
493 : : */
494 : : static int indexOf(const char* const toSearch, const char ch);
495 : :
496 : : /**
497 : : * Provides the index of the first occurrence of a character within a string
498 : : *
499 : : * @param toSearch The string to search
500 : : * @param ch The character to search within the string
501 : : * @return If found, returns the index of the character within the string,
502 : : * else returns -1.
503 : : */
504 : : static int indexOf(const XMLCh* const toSearch, const XMLCh ch);
505 : :
506 : : /**
507 : : * Provides the index of the first occurrence of a character within a string
508 : : * starting from a given index
509 : : *
510 : : * @param toSearch The string to search
511 : : * @param chToFind The character to search within the string
512 : : * @param fromIndex The index to start searching from
513 : : * @param manager The MemoryManager to use to allocate objects
514 : : * @return If found, returns the index of the character within the string,
515 : : * else returns -1.
516 : : */
517 : : static int indexOf
518 : : (
519 : : const char* const toSearch
520 : : , const char chToFind
521 : : , const XMLSize_t fromIndex
522 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
523 : : );
524 : :
525 : : /**
526 : : * Provides the index of the first occurrence of a character within a string
527 : : * starting from a given index
528 : : *
529 : : * @param toSearch The string to search
530 : : * @param chToFind The character to search within the string
531 : : * @param fromIndex The index to start searching from
532 : : * @param manager The MemoryManager to use to allocate objects
533 : : * @return If found, returns the index of the character within the string,
534 : : * else returns -1.
535 : : */
536 : : static int indexOf
537 : : (
538 : : const XMLCh* const toSearch
539 : : , const XMLCh chToFind
540 : : , const XMLSize_t fromIndex
541 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
542 : : );
543 : :
544 : : /**
545 : : * Provides the index of the last occurrence of a character within a string
546 : : *
547 : : * @param toSearch The string to search
548 : : * @param ch The character to search within the string
549 : : * @return If found, returns the index of the character within the string,
550 : : * else returns -1.
551 : : */
552 : : static int lastIndexOf(const char* const toSearch, const char ch);
553 : :
554 : : /**
555 : : * Provides the index of the last occurrence of a character within a string
556 : : *
557 : : * @param toSearch The string to search
558 : : * @param ch The character to search within the string
559 : : * @return If found, returns the index of the character within the string,
560 : : * else returns -1.
561 : : */
562 : : static int lastIndexOf(const XMLCh* const toSearch, const XMLCh ch);
563 : :
564 : : /**
565 : : * Provides the index of the last occurrence of a character within a string
566 : : *
567 : : * @param ch The character to search within the string
568 : : * @param toSearch The string to search
569 : : * @param toSearchLen The length of the string to search
570 : : * @return If found, returns the index of the character within the string,
571 : : * else returns -1.
572 : : */
573 : : static int lastIndexOf
574 : : (
575 : : const XMLCh ch
576 : : , const XMLCh* const toSearch
577 : : , const XMLSize_t toSearchLen
578 : : );
579 : :
580 : : /**
581 : : * Provides the index of the last occurrence of a character within a string
582 : : * starting backward from a given index
583 : : *
584 : : * @param toSearch The string to search
585 : : * @param chToFind The character to search within the string
586 : : * @param fromIndex The index to start backward search from
587 : : * @param manager The MemoryManager to use to allocate objects
588 : : * @return If found, returns the index of the character within the string,
589 : : * else returns -1.
590 : : */
591 : : static int lastIndexOf
592 : : (
593 : : const char* const toSearch
594 : : , const char chToFind
595 : : , const XMLSize_t fromIndex
596 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
597 : : );
598 : :
599 : : /**
600 : : * Provides the index of the last occurrence of a character within a string
601 : : * starting backward from a given index
602 : : *
603 : : * @param toSearch The string to search
604 : : * @param ch The character to search within the string
605 : : * @param fromIndex The index to start backward search from
606 : : * @param manager The MemoryManager to use to allocate objects
607 : : * @return If found, returns the index of the character within the string,
608 : : * else returns -1.
609 : : */
610 : : static int lastIndexOf
611 : : (
612 : : const XMLCh* const toSearch
613 : : , const XMLCh ch
614 : : , const XMLSize_t fromIndex
615 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
616 : : );
617 : : //@}
618 : :
619 : : /** @name Fixed size string movement */
620 : : //@{
621 : : /** Moves X number of chars
622 : : * @param targetStr The string to copy the chars to
623 : : * @param srcStr The string to copy the chars from
624 : : * @param count The number of chars to move
625 : : */
626 : : static void moveChars
627 : : (
628 : : XMLCh* const targetStr
629 : : , const XMLCh* const srcStr
630 : : , const XMLSize_t count
631 : : );
632 : :
633 : : //@}
634 : :
635 : : /** @name Substring function */
636 : : //@{
637 : : /** Create a substring of a given string. The substring begins at the
638 : : * specified beginIndex and extends to the character at index
639 : : * endIndex - 1.
640 : : * @param targetStr The string to copy the chars to
641 : : * @param srcStr The string to copy the chars from
642 : : * @param startIndex beginning index, inclusive.
643 : : * @param endIndex the ending index, exclusive.
644 : : * @param manager The MemoryManager to use to allocate objects
645 : : */
646 : : static void subString
647 : : (
648 : : char* const targetStr
649 : : , const char* const srcStr
650 : : , const XMLSize_t startIndex
651 : : , const XMLSize_t endIndex
652 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
653 : : );
654 : :
655 : : /** Create a substring of a given string. The substring begins at the
656 : : * specified beginIndex and extends to the character at index
657 : : * endIndex - 1.
658 : : * @param targetStr The string to copy the chars to
659 : : * @param srcStr The string to copy the chars from
660 : : * @param startIndex beginning index, inclusive.
661 : : * @param endIndex the ending index, exclusive.
662 : : * @param manager The MemoryManager to use to allocate objects
663 : : */
664 : : static void subString
665 : : (
666 : : XMLCh* const targetStr
667 : : , const XMLCh* const srcStr
668 : : , const XMLSize_t startIndex
669 : : , const XMLSize_t endIndex
670 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
671 : : );
672 : :
673 : : /** Create a substring of a given string. The substring begins at the
674 : : * specified beginIndex and extends to the character at index
675 : : * endIndex - 1.
676 : : * @param targetStr The string to copy the chars to
677 : : * @param srcStr The string to copy the chars from
678 : : * @param startIndex beginning index, inclusive.
679 : : * @param endIndex the ending index, exclusive.
680 : : * @param srcStrLength the length of srcStr
681 : : * @param manager The MemoryManager to use to allocate objects
682 : : */
683 : : static void subString
684 : : (
685 : : XMLCh* const targetStr
686 : : , const XMLCh* const srcStr
687 : : , const XMLSize_t startIndex
688 : : , const XMLSize_t endIndex
689 : : , const XMLSize_t srcStrLength
690 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
691 : : );
692 : :
693 : : //@}
694 : :
695 : : /** @name Replication function */
696 : : //@{
697 : : /** Replicates a string
698 : : * NOTE: The returned buffer is allocated with the MemoryManager. It is the
699 : : * responsibility of the caller to delete it when not longer needed.
700 : : * You can call XMLString::release to release this returned buffer.
701 : : *
702 : : * @param toRep The string to replicate
703 : : * @param manager The MemoryManager to use to allocate the string
704 : : * @return Returns a pointer to the replicated string
705 : : * @see XMLString::release(char**, MemoryManager*)
706 : : */
707 : : static char* replicate(const char* const toRep,
708 : : MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
709 : :
710 : : /** Replicates a string
711 : : * NOTE: The returned buffer is allocated with the MemoryManager. It is the
712 : : * responsibility of the caller to delete it when not longer needed.
713 : : * You can call XMLString::release to release this returned buffer.
714 : : *
715 : : * @param toRep The string to replicate
716 : : * @param manager The MemoryManager to use to allocate the string
717 : : * @return Returns a pointer to the replicated string
718 : : * @see XMLString::release(XMLCh**, MemoryManager*)
719 : : */
720 : : static XMLCh* replicate(const XMLCh* const toRep,
721 : : MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
722 : :
723 : : //@}
724 : :
725 : : /** @name String query function */
726 : : //@{
727 : : /** Tells if the sub-string appears within a string at the beginning
728 : : * @param toTest The string to test
729 : : * @param prefix The sub-string that needs to be checked
730 : : * @return Returns true if the sub-string was found at the beginning of
731 : : * <code>toTest</code>, else false
732 : : */
733 : : static bool startsWith
734 : : (
735 : : const char* const toTest
736 : : , const char* const prefix
737 : : );
738 : :
739 : : /** Tells if the sub-string appears within a string at the beginning
740 : : * @param toTest The string to test
741 : : * @param prefix The sub-string that needs to be checked
742 : : * @return Returns true if the sub-string was found at the beginning of
743 : : * <code>toTest</code>, else false
744 : : */
745 : : static bool startsWith
746 : : (
747 : : const XMLCh* const toTest
748 : : , const XMLCh* const prefix
749 : : );
750 : :
751 : : /** Tells if the sub-string appears within a string at the beginning
752 : : * without regard to case
753 : : *
754 : : * @param toTest The string to test
755 : : * @param prefix The sub-string that needs to be checked
756 : : * @return Returns true if the sub-string was found at the beginning of
757 : : * <code>toTest</code>, else false
758 : : */
759 : : static bool startsWithI
760 : : (
761 : : const char* const toTest
762 : : , const char* const prefix
763 : : );
764 : :
765 : : /** Tells if the sub-string appears within a string at the beginning
766 : : * without regard to case
767 : : *
768 : : * @param toTest The string to test
769 : : * @param prefix The sub-string that needs to be checked
770 : : *
771 : : * @return Returns true if the sub-string was found at the beginning
772 : : * of <code>toTest</code>, else false
773 : : */
774 : : static bool startsWithI
775 : : (
776 : : const XMLCh* const toTest
777 : : , const XMLCh* const prefix
778 : : );
779 : :
780 : : /** Tells if the sub-string appears within a string at the end.
781 : : * @param toTest The string to test
782 : : * @param suffix The sub-string that needs to be checked
783 : : * @return Returns true if the sub-string was found at the end of
784 : : * <code>toTest</code>, else false
785 : : */
786 : : static bool endsWith
787 : : (
788 : : const XMLCh* const toTest
789 : : , const XMLCh* const suffix
790 : : );
791 : :
792 : :
793 : : /** Tells if a string has any occurrence of any character of another
794 : : * string within itself
795 : : * @param toSearch The string to be searched
796 : : * @param searchList The string from which characters to be searched for are drawn
797 : : * @return Returns the pointer to the location where the first occurrence of any
798 : : * character from searchList is found,
799 : : * else returns 0
800 : : */
801 : : static const XMLCh* findAny
802 : : (
803 : : const XMLCh* const toSearch
804 : : , const XMLCh* const searchList
805 : : );
806 : :
807 : : /** Tells if a string has any occurrence of any character of another
808 : : * string within itself
809 : : * @param toSearch The string to be searched
810 : : * @param searchList The string from which characters to be searched for are drawn
811 : : * @return Returns the pointer to the location where the first occurrence of any
812 : : * character from searchList is found,
813 : : * else returns 0
814 : : */
815 : : static XMLCh* findAny
816 : : (
817 : : XMLCh* const toSearch
818 : : , const XMLCh* const searchList
819 : : );
820 : :
821 : : /** Tells if a string has pattern within itself
822 : : * @param toSearch The string to be searched
823 : : * @param pattern The pattern to be located within the string
824 : : * @return Returns index to the location where the pattern was
825 : : * found, else returns -1
826 : : */
827 : : static int patternMatch
828 : : (
829 : : const XMLCh* const toSearch
830 : : , const XMLCh* const pattern
831 : : );
832 : :
833 : : /** Get the length of the string
834 : : * @param src The string whose length is to be determined
835 : : * @return Returns the length of the string
836 : : */
837 : : static XMLSize_t stringLen(const char* const src);
838 : :
839 : : /** Get the length of the string
840 : : * @param src The string whose length is to be determined
841 : : * @return Returns the length of the string
842 : : */
843 : : static XMLSize_t stringLen(const XMLCh* const src);
844 : :
845 : : /**
846 : : *
847 : : * Checks whether an name is a valid NOTATION according to XML 1.0
848 : : * @param name The string to check its NOTATION validity
849 : : * @param manager The memory manager
850 : : * @return Returns true if name is NOTATION valid, otherwise false
851 : : */
852 : : static bool isValidNOTATION(const XMLCh* const name
853 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
854 : :
855 : : /**
856 : : * Checks whether an name is a valid EncName.
857 : : * @param name The string to check its EncName validity
858 : : * @return Returns true if name is EncName valid, otherwise false
859 : : */
860 : : static bool isValidEncName(const XMLCh* const name);
861 : :
862 : : /**
863 : : * Checks whether a character is within [a-zA-Z].
864 : : * @param theChar the character to check
865 : : * @return Returns true if within the range, otherwise false
866 : : */
867 : :
868 : : static bool isAlpha(XMLCh const theChar);
869 : :
870 : : /**
871 : : * Checks whether a character is within [0-9].
872 : : * @param theChar the character to check
873 : : * @return Returns true if within the range, otherwise false
874 : : */
875 : : static bool isDigit(XMLCh const theChar);
876 : :
877 : : /**
878 : : * Checks whether a character is within [0-9a-zA-Z].
879 : : * @param theChar the character to check
880 : : * @return Returns true if within the range, otherwise false
881 : : */
882 : : static bool isAlphaNum(XMLCh const theChar);
883 : :
884 : : /**
885 : : * Checks whether a character is within [0-9a-fA-F].
886 : : * @param theChar the character to check
887 : : * @return Returns true if within the range, otherwise false
888 : : */
889 : : static bool isHex(XMLCh const theChar);
890 : :
891 : : /** Find is the string appears in the enum list
892 : : * @param toFind the string to be found
893 : : * @param enumList the list
894 : : * return true if found
895 : : */
896 : : static bool isInList(const XMLCh* const toFind, const XMLCh* const enumList);
897 : :
898 : : //@}
899 : :
900 : : /** @name Conversion functions */
901 : : //@{
902 : :
903 : : /** Converts size to a text string based a given radix
904 : : *
905 : : * @param toFormat The size to convert
906 : : * @param toFill The buffer that will hold the output on return. The
907 : : * size of this buffer should at least be 'maxChars + 1'.
908 : : * @param maxChars The maximum number of output characters that can be
909 : : * accepted. If the result will not fit, it is an error.
910 : : * @param radix The radix of the input data, based on which the conversion
911 : : * @param manager The MemoryManager to use to allocate objects
912 : : * will be done
913 : : */
914 : : static void sizeToText
915 : : (
916 : : const XMLSize_t toFormat
917 : : , char* const toFill
918 : : , const XMLSize_t maxChars
919 : : , const unsigned int radix
920 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
921 : : );
922 : :
923 : : /** Converts size to a text string based a given radix
924 : : *
925 : : * @param toFormat The size to convert
926 : : * @param toFill The buffer that will hold the output on return. The
927 : : * size of this buffer should at least be 'maxChars + 1'.
928 : : * @param maxChars The maximum number of output characters that can be
929 : : * accepted. If the result will not fit, it is an error.
930 : : * @param radix The radix of the input data, based on which the conversion
931 : : * @param manager The MemoryManager to use to allocate objects
932 : : * will be done
933 : : */
934 : : static void sizeToText
935 : : (
936 : : const XMLSize_t toFormat
937 : : , XMLCh* const toFill
938 : : , const XMLSize_t maxChars
939 : : , const unsigned int radix
940 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
941 : : );
942 : :
943 : : /** Converts binary data to a text string based a given radix
944 : : *
945 : : * @param toFormat The number to convert
946 : : * @param toFill The buffer that will hold the output on return. The
947 : : * size of this buffer should at least be 'maxChars + 1'.
948 : : * @param maxChars The maximum number of output characters that can be
949 : : * accepted. If the result will not fit, it is an error.
950 : : * @param radix The radix of the input data, based on which the conversion
951 : : * @param manager The MemoryManager to use to allocate objects
952 : : * will be done
953 : : */
954 : : static void binToText
955 : : (
956 : : const unsigned int toFormat
957 : : , char* const toFill
958 : : , const XMLSize_t maxChars
959 : : , const unsigned int radix
960 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
961 : : );
962 : :
963 : : /** Converts binary data to a text string based a given radix
964 : : *
965 : : * @param toFormat The number to convert
966 : : * @param toFill The buffer that will hold the output on return. The
967 : : * size of this buffer should at least be 'maxChars + 1'.
968 : : * @param maxChars The maximum number of output characters that can be
969 : : * accepted. If the result will not fit, it is an error.
970 : : * @param radix The radix of the input data, based on which the conversion
971 : : * @param manager The MemoryManager to use to allocate objects
972 : : * will be done
973 : : */
974 : : static void binToText
975 : : (
976 : : const unsigned int toFormat
977 : : , XMLCh* const toFill
978 : : , const XMLSize_t maxChars
979 : : , const unsigned int radix
980 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
981 : : );
982 : :
983 : : /** Converts binary data to a text string based a given radix
984 : : *
985 : : * @param toFormat The number to convert
986 : : * @param toFill The buffer that will hold the output on return. The
987 : : * size of this buffer should at least be 'maxChars + 1'.
988 : : * @param maxChars The maximum number of output characters that can be
989 : : * accepted. If the result will not fit, it is an error.
990 : : * @param radix The radix of the input data, based on which the conversion
991 : : * @param manager The MemoryManager to use to allocate objects
992 : : * will be done
993 : : */
994 : : static void binToText
995 : : (
996 : : const unsigned long toFormat
997 : : , char* const toFill
998 : : , const XMLSize_t maxChars
999 : : , const unsigned int radix
1000 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1001 : : );
1002 : :
1003 : : /** Converts binary data to a text string based a given radix
1004 : : *
1005 : : * @param toFormat The number to convert
1006 : : * @param toFill The buffer that will hold the output on return. The
1007 : : * size of this buffer should at least be 'maxChars + 1'.
1008 : : * @param maxChars The maximum number of output characters that can be
1009 : : * accepted. If the result will not fit, it is an error.
1010 : : * @param radix The radix of the input data, based on which the conversion
1011 : : * @param manager The MemoryManager to use to allocate objects
1012 : : * will be done
1013 : : */
1014 : : static void binToText
1015 : : (
1016 : : const unsigned long toFormat
1017 : : , XMLCh* const toFill
1018 : : , const XMLSize_t maxChars
1019 : : , const unsigned int radix
1020 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1021 : : );
1022 : :
1023 : : /** Converts binary data to a text string based a given radix
1024 : : *
1025 : : * @param toFormat The number to convert
1026 : : * @param toFill The buffer that will hold the output on return. The
1027 : : * size of this buffer should at least be 'maxChars + 1'.
1028 : : * @param maxChars The maximum number of output characters that can be
1029 : : * accepted. If the result will not fit, it is an error.
1030 : : * @param radix The radix of the input data, based on which the conversion
1031 : : * @param manager The MemoryManager to use to allocate objects
1032 : : * will be done
1033 : : */
1034 : : static void binToText
1035 : : (
1036 : : const int toFormat
1037 : : , char* const toFill
1038 : : , const XMLSize_t maxChars
1039 : : , const unsigned int radix
1040 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1041 : : );
1042 : :
1043 : : /** Converts binary data to a text string based a given radix
1044 : : *
1045 : : * @param toFormat The number to convert
1046 : : * @param toFill The buffer that will hold the output on return. The
1047 : : * size of this buffer should at least be 'maxChars + 1'.
1048 : : * @param maxChars The maximum number of output characters that can be
1049 : : * accepted. If the result will not fit, it is an error.
1050 : : * @param radix The radix of the input data, based on which the conversion
1051 : : * @param manager The MemoryManager to use to allocate objects
1052 : : * will be done
1053 : : */
1054 : : static void binToText
1055 : : (
1056 : : const int toFormat
1057 : : , XMLCh* const toFill
1058 : : , const XMLSize_t maxChars
1059 : : , const unsigned int radix
1060 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1061 : : );
1062 : :
1063 : : /** Converts binary data to a text string based a given radix
1064 : : *
1065 : : * @param toFormat The number to convert
1066 : : * @param toFill The buffer that will hold the output on return. The
1067 : : * size of this buffer should at least be 'maxChars + 1'.
1068 : : * @param maxChars The maximum number of output characters that can be
1069 : : * accepted. If the result will not fit, it is an error.
1070 : : * @param radix The radix of the input data, based on which the conversion
1071 : : * @param manager The MemoryManager to use to allocate objects
1072 : : * will be done
1073 : : */
1074 : : static void binToText
1075 : : (
1076 : : const long toFormat
1077 : : , char* const toFill
1078 : : , const XMLSize_t maxChars
1079 : : , const unsigned int radix
1080 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1081 : : );
1082 : :
1083 : : /** Converts binary data to a text string based a given radix
1084 : : *
1085 : : * @param toFormat The number to convert
1086 : : * @param toFill The buffer that will hold the output on return. The
1087 : : * size of this buffer should at least be 'maxChars + 1'.
1088 : : * @param maxChars The maximum number of output characters that can be
1089 : : * accepted. If the result will not fit, it is an error.
1090 : : * @param radix The radix of the input data, based on which the conversion
1091 : : * @param manager The MemoryManager to use to allocate objects
1092 : : * will be done
1093 : : */
1094 : : static void binToText
1095 : : (
1096 : : const long toFormat
1097 : : , XMLCh* const toFill
1098 : : , const XMLSize_t maxChars
1099 : : , const unsigned int radix
1100 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1101 : : );
1102 : :
1103 : : /**
1104 : : * Converts a string of decimal chars to a binary value
1105 : : *
1106 : : * Note that leading and trailing whitespace is legal and will be ignored
1107 : : * but the remainder must be all decimal digits.
1108 : : *
1109 : : * @param toConvert The string of digits to convert
1110 : : * @param toFill The unsigned int value to fill with the converted
1111 : : * value.
1112 : : * @param manager The MemoryManager to use to allocate objects
1113 : : */
1114 : : static bool textToBin
1115 : : (
1116 : : const XMLCh* const toConvert
1117 : : , unsigned int& toFill
1118 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1119 : : );
1120 : :
1121 : : /**
1122 : : * Converts a string of decimal chars to a binary value
1123 : : *
1124 : : * Note that leading and trailing whitespace is legal and will be ignored,
1125 : : *
1126 : : * Only one and either of (+,-) after the leading whitespace, before
1127 : : * any other characters are allowed.
1128 : : *
1129 : : * but the remainder must be all decimal digits.
1130 : : *
1131 : : * @param toConvert The string of digits to convert
1132 : : * @param manager The MemoryManager to use to allocate objects
1133 : : */
1134 : : static int parseInt
1135 : : (
1136 : : const XMLCh* const toConvert
1137 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1138 : : );
1139 : :
1140 : : /** Cut leading chars from a string
1141 : : *
1142 : : * @param toCutFrom The string to cut chars from
1143 : : * @param count The count of leading chars to cut
1144 : : */
1145 : : static void cut
1146 : : (
1147 : : XMLCh* const toCutFrom
1148 : : , const XMLSize_t count
1149 : : );
1150 : :
1151 : : /** Transcodes a string to native code-page
1152 : : *
1153 : : * NOTE: The returned buffer is dynamically allocated and is the
1154 : : * responsibility of the caller to delete it when not longer needed.
1155 : : * You can call XMLString::release to release this returned buffer.
1156 : : *
1157 : : * @param toTranscode The string to be transcoded
1158 : : * @param manager The MemoryManager to use to allocate objects
1159 : : * @return Returns the transcoded string
1160 : : * @see XMLString::release(XMLCh**, MemoryManager*)
1161 : : */
1162 : : static char* transcode
1163 : : (
1164 : : const XMLCh* const toTranscode
1165 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1166 : : );
1167 : :
1168 : : /** Transcodes a string to native code-page (DEPRECATED)
1169 : : *
1170 : : * Be aware that when transcoding to an external encoding, that each
1171 : : * Unicode char can create multiple output bytes. So you cannot assume
1172 : : * a one to one correspondence of input chars to output bytes.
1173 : : *
1174 : : * @param toTranscode The string tobe transcoded
1175 : : * @param toFill The buffer that is filled with the transcoded value.
1176 : : * The size of this buffer should atleast be 'maxChars + 1'.
1177 : : * @param maxChars The maximum number of bytes that the output
1178 : : * buffer can hold (not including the null, which is why
1179 : : * toFill should be at least maxChars+1.).
1180 : : * @param manager The MemoryManager to use to allocate objects
1181 : : * @return Returns true if successful, false if there was an error
1182 : : */
1183 : : static bool transcode
1184 : : (
1185 : : const XMLCh* const toTranscode
1186 : : , char* const toFill
1187 : : , const XMLSize_t maxChars
1188 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1189 : : );
1190 : :
1191 : : /** Transcodes a string to native code-page
1192 : : *
1193 : : * NOTE: The returned buffer is dynamically allocated and is the
1194 : : * responsibility of the caller to delete it when not longer needed.
1195 : : * You can call XMLString::release to release this returned buffer.
1196 : : *
1197 : : * @param toTranscode The string to be transcoded
1198 : : * @param manager The MemoryManager to use to allocate objects
1199 : : * @return Returns the transcoded string
1200 : : * @see XMLString::release(char**, MemoryManager*)
1201 : : */
1202 : : static XMLCh* transcode
1203 : : (
1204 : : const char* const toTranscode
1205 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1206 : : );
1207 : :
1208 : : /** Transcodes a string to native code-page (DEPRECATED)
1209 : : * @param toTranscode The string tobe transcoded
1210 : : * @param toFill The buffer that is filled with the transcoded value.
1211 : : * The size of this buffer should atleast be 'maxChars + 1'.
1212 : : * @param maxChars The maximum number of characters that the output
1213 : : * buffer can hold (not including the null, which is why
1214 : : * toFill should be at least maxChars+1.).
1215 : : * @param manager The MemoryManager to use to allocate objects
1216 : : * @return Returns true if successful, false if there was an error
1217 : : */
1218 : : static bool transcode
1219 : : (
1220 : : const char* const toTranscode
1221 : : , XMLCh* const toFill
1222 : : , const XMLSize_t maxChars
1223 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1224 : : );
1225 : :
1226 : : /** Trims off extra space characters from the start and end of the string,
1227 : : * moving the non-space string content back to the start.
1228 : : * @param toTrim The string to be trimmed. On return this contains the
1229 : : * trimmed string
1230 : : */
1231 : : static void trim(char* const toTrim);
1232 : :
1233 : : /** Trims off extra space characters from the start and end of the string,
1234 : : * moving the non-space string content back to the start.
1235 : : * @param toTrim The string to be trimmed. On return this contains
1236 : : * the trimmed string
1237 : : */
1238 : : static void trim(XMLCh* const toTrim);
1239 : :
1240 : : /** Break a string into tokens with space as delimiter, and
1241 : : * stored in a string vector. The caller owns the string vector
1242 : : * that is returned, and is responsible for deleting it.
1243 : : * @param tokenizeSrc String to be tokenized
1244 : : * @param manager The MemoryManager to use to allocate objects
1245 : : * @return a vector of all the tokenized string
1246 : : */
1247 : : static BaseRefVectorOf<XMLCh>* tokenizeString(const XMLCh* const tokenizeSrc
1248 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
1249 : :
1250 : : //@}
1251 : :
1252 : : /** @name Formatting functions */
1253 : : //@{
1254 : : /** Creates a UName from a URI and base name. It is in the form
1255 : : * {url}name, and is commonly used internally to represent fully
1256 : : * qualified names when namespaces are enabled.
1257 : : *
1258 : : * @param pszURI The URI part of the name
1259 : : * @param pszName The base part of the name
1260 : : * @return Returns the complete formatted UName
1261 : : */
1262 : : static XMLCh* makeUName
1263 : : (
1264 : : const XMLCh* const pszURI
1265 : : , const XMLCh* const pszName
1266 : : );
1267 : :
1268 : : /**
1269 : : * Internal function to perform token replacement for strings.
1270 : : *
1271 : : * @param errText The text (NULL terminated) where the replacement
1272 : : * is to be done. The size of this buffer should be
1273 : : * 'maxChars + 1' to account for the final NULL.
1274 : : * @param maxChars The size of the output buffer, i.e. the maximum
1275 : : * number of characters that it will hold. If the result is
1276 : : * larger, it will be truncated.
1277 : : * @param text1 Replacement text-one
1278 : : * @param text2 Replacement text-two
1279 : : * @param text3 Replacement text-three
1280 : : * @param text4 Replacement text-four
1281 : : * @param manager The MemoryManager to use to allocate objects
1282 : : * @return Returns the count of characters that are outputted
1283 : : */
1284 : : static XMLSize_t replaceTokens
1285 : : (
1286 : : XMLCh* const errText
1287 : : , const XMLSize_t maxChars
1288 : : , const XMLCh* const text1
1289 : : , const XMLCh* const text2
1290 : : , const XMLCh* const text3
1291 : : , const XMLCh* const text4
1292 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1293 : : );
1294 : :
1295 : : /** Converts a string to uppercase
1296 : : * @param toUpperCase The string which needs to be converted to uppercase.
1297 : : * On return, this buffer also holds the converted uppercase string
1298 : : */
1299 : : static void upperCase(XMLCh* const toUpperCase);
1300 : :
1301 : : /** Converts a string to uppercase
1302 : : * The routine only uppercases A to Z (other characters not changed).
1303 : : * @param toUpperCase The string which needs to be converted to uppercase.
1304 : : * On return, this buffer also holds the converted uppercase string
1305 : : */
1306 : : static void upperCaseASCII(XMLCh* const toUpperCase);
1307 : :
1308 : : /** Converts a string to lowercase
1309 : : * @param toLowerCase The string which needs to be converted to lowercase.
1310 : : * On return, this buffer also holds the converted lowercase string
1311 : : */
1312 : : static void lowerCase(XMLCh* const toLowerCase);
1313 : :
1314 : : /** Converts a string to lowercase
1315 : : * The routine only lowercases a to z (other characters not changed).
1316 : : * @param toLowerCase The string which needs to be converted to lowercase.
1317 : : * On return, this buffer also holds the converted lowercase string
1318 : : */
1319 : : static void lowerCaseASCII(XMLCh* const toLowerCase);
1320 : :
1321 : : /** Check if string is WhiteSpace:replace
1322 : : * @param toCheck The string which needs to be checked.
1323 : : */
1324 : : static bool isWSReplaced(const XMLCh* const toCheck);
1325 : :
1326 : : /** Check if string is WhiteSpace:collapse
1327 : : * @param toCheck The string which needs to be checked.
1328 : : */
1329 : : static bool isWSCollapsed(const XMLCh* const toCheck);
1330 : :
1331 : : /** Replace whitespace
1332 : : * @param toConvert The string which needs to be whitespace replaced.
1333 : : * On return , this buffer also holds the converted string
1334 : : * @param manager The MemoryManager to use to allocate objects
1335 : : */
1336 : : static void replaceWS(XMLCh* toConvert
1337 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
1338 : :
1339 : : /** Collapse whitespace
1340 : : * @param toConvert The string which needs to be whitespace collapsed.
1341 : : * On return , this buffer also holds the converted string
1342 : : * @param manager The MemoryManager to use to allocate objects
1343 : : */
1344 : : static void collapseWS(XMLCh* toConvert
1345 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
1346 : :
1347 : : /** Remove whitespace
1348 : : * @param toConvert The string which needs to be whitespace removed.
1349 : : * On return , this buffer also holds the converted string
1350 : : * @param manager The MemoryManager to use to allocate objects
1351 : : */
1352 : : static void removeWS(XMLCh* toConvert
1353 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
1354 : :
1355 : :
1356 : : /** Remove character
1357 : : * @param srcString The string
1358 : : * @param toRemove The character needs to be removed from the string
1359 : : * @param dstBuffer The buffer containing the result
1360 : : */
1361 : : static void removeChar(const XMLCh* const srcString
1362 : : , const XMLCh& toRemove
1363 : : , XMLBuffer& dstBuffer);
1364 : :
1365 : : /**
1366 : : * Fixes a platform dependent absolute path filename to standard URI form.
1367 : : * 1. Windows: fix 'x:' to 'file:///x:' and convert any backslash to forward slash
1368 : : * 2. UNIX: fix '/blah/blahblah' to 'file:///blah/blahblah'
1369 : : * @param str The string that has the absolute path filename
1370 : : * @param target The target string pre-allocated to store the fixed uri
1371 : : */
1372 : : static void fixURI(const XMLCh* const str, XMLCh* const target);
1373 : :
1374 : : //@}
1375 : : /** @name String Memory Management functions */
1376 : : //@{
1377 : : /**
1378 : : * Release the parameter string that was allocated by XMLString::transcode and XMLString::replicate.
1379 : : * The implementation will call MemoryManager::deallocate and then turn the string to a null pointer.
1380 : : *
1381 : : * @param buf The string to be deleted and become a null pointer.
1382 : : * @param manager The MemoryManager used to allocate the string
1383 : : */
1384 : : static void release
1385 : : (
1386 : : char** buf
1387 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1388 : : );
1389 : :
1390 : : /**
1391 : : * Release the parameter string that was allocated by XMLString::transcode and XMLString::replicate.
1392 : : * The implementation will call MemoryManager::deallocate and then turn the string to a null pointer.
1393 : : *
1394 : : * @param buf The string to be deleted and become a null pointer.
1395 : : * @param manager The MemoryManager used to allocate the string
1396 : : */
1397 : : static void release
1398 : : (
1399 : : XMLCh** buf
1400 : : , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
1401 : : );
1402 : : //@}
1403 : :
1404 : :
1405 : : private :
1406 : :
1407 : : /** @name Constructors and Destructor */
1408 : : //@{
1409 : : /** Unimplemented default constructor */
1410 : : XMLString();
1411 : : /** Unimplemented destructor */
1412 : : ~XMLString();
1413 : : //@}
1414 : :
1415 : :
1416 : : /** @name Initialization */
1417 : : //@{
1418 : : /** Init/Term methods called from XMLPlatformUtils class */
1419 : : static void initString(XMLLCPTranscoder* const defToUse,
1420 : : MemoryManager* const manager);
1421 : : static void termString();
1422 : : //@}
1423 : :
1424 : : /**
1425 : : * Called by regionMatches/regionIMatches to validate that we
1426 : : * have a valid input
1427 : : */
1428 : : static bool validateRegion(const XMLCh* const str1, const int offset1,
1429 : : const XMLCh* const str2, const int offset2,
1430 : : const XMLSize_t charCount);
1431 : :
1432 : : static MemoryManager* fgMemoryManager;
1433 : :
1434 : : friend class XMLPlatformUtils;
1435 : : };
1436 : :
1437 : :
1438 : : // ---------------------------------------------------------------------------
1439 : : // Inline some methods that are either just passthroughs to other string
1440 : : // methods, or which are key for performance.
1441 : : // ---------------------------------------------------------------------------
1442 : : inline void XMLString::moveChars( XMLCh* const targetStr
1443 : : , const XMLCh* const srcStr
1444 : : , const XMLSize_t count)
1445 : : {
1446 : : memmove(targetStr, srcStr, count * sizeof(XMLCh));
1447 : : }
1448 : :
1449 : : inline XMLSize_t XMLString::stringLen(const XMLCh* const src)
1450 : : {
1451 [ + - ]: 16 : if (src == 0)
1452 : : return 0;
1453 : :
1454 : : const XMLCh* pszTmp = src;
1455 : :
1456 [ + + ]: 169 : while (*pszTmp++) ;
1457 : :
1458 : 16 : return (pszTmp - src - 1);
1459 : : }
1460 : :
1461 : : inline XMLCh* XMLString::replicate(const XMLCh* const toRep,
1462 : : MemoryManager* const manager)
1463 : : {
1464 : : // If a null string, return a null string!
1465 : : XMLCh* ret = 0;
1466 : : if (toRep)
1467 : : {
1468 : : const XMLSize_t len = stringLen(toRep);
1469 : : ret = (XMLCh*) manager->allocate((len+1) * sizeof(XMLCh)); //new XMLCh[len + 1];
1470 : : memcpy(ret, toRep, (len + 1) * sizeof(XMLCh));
1471 : : }
1472 : : return ret;
1473 : : }
1474 : :
1475 : : inline bool XMLString::startsWith( const XMLCh* const toTest
1476 : : , const XMLCh* const prefix)
1477 : : {
1478 : : return (compareNString(toTest, prefix, stringLen(prefix)) == 0);
1479 : : }
1480 : :
1481 : : inline bool XMLString::startsWithI( const XMLCh* const toTest
1482 : : , const XMLCh* const prefix)
1483 : : {
1484 : : return (compareNIString(toTest, prefix, stringLen(prefix)) == 0);
1485 : : }
1486 : :
1487 : : inline bool XMLString::endsWith(const XMLCh* const toTest,
1488 : : const XMLCh* const suffix)
1489 : : {
1490 : :
1491 : : XMLSize_t suffixLen = XMLString::stringLen(suffix);
1492 : :
1493 : : return regionMatches(toTest, (int)(XMLString::stringLen(toTest) - suffixLen),
1494 : : suffix, 0, suffixLen);
1495 : : }
1496 : :
1497 : : inline bool XMLString::validateRegion(const XMLCh* const str1,
1498 : : const int offset1,
1499 : : const XMLCh* const str2,
1500 : : const int offset2,
1501 : : const XMLSize_t charCount)
1502 : : {
1503 : :
1504 : : if (offset1 < 0 || offset2 < 0 ||
1505 : : (offset1 + charCount) > XMLString::stringLen(str1) ||
1506 : : (offset2 + charCount) > XMLString::stringLen(str2) )
1507 : : return false;
1508 : :
1509 : : return true;
1510 : : }
1511 : :
1512 : : inline bool XMLString::equals( const XMLCh* str1
1513 : : , const XMLCh* str2)
1514 : : {
1515 : : if (str1 == str2)
1516 : : return true;
1517 : :
1518 : : if (str1 == 0 || str2 == 0)
1519 : : return ((!str1 || !*str1) && (!str2 || !*str2));
1520 : :
1521 : : while (*str1)
1522 : : if(*str1++ != *str2++) // they are different (or str2 is shorter and we hit the NULL)
1523 : : return false;
1524 : :
1525 : : // either both ended (and *str2 is 0 too), or str2 is longer
1526 : : return (*str2==0);
1527 : : }
1528 : :
1529 : : inline bool XMLString::equalsN(const XMLCh* str1,
1530 : : const XMLCh* str2,
1531 : : XMLSize_t n)
1532 : : {
1533 : : if (str1 == str2 || n == 0)
1534 : : return true;
1535 : :
1536 : : if (str1 == 0 || str2 == 0)
1537 : : return ((!str1 || !*str1) && (!str2 || !*str2));
1538 : :
1539 : : for (; n != 0 && *str1 && *str2; --n, ++str1, ++str2)
1540 : : if(*str1 != *str2)
1541 : : break;
1542 : :
1543 : : return n == 0 || *str1 == *str2; // either equal or both ended premat.
1544 : : }
1545 : :
1546 : : inline bool XMLString::equals( const char* str1
1547 : : , const char* str2)
1548 : : {
1549 : : if (str1 == str2)
1550 : : return true;
1551 : :
1552 : : if (str1 == 0 || str2 == 0)
1553 : : return ((!str1 || !*str1) && (!str2 || !*str2));
1554 : :
1555 : : while (*str1)
1556 : : if(*str1++ != *str2++) // they are different (or str2 is shorter and we hit the NULL)
1557 : : return false;
1558 : :
1559 : : // either both ended (and *str2 is 0 too), or str2 is longer
1560 : : return (*str2==0);
1561 : : }
1562 : :
1563 : : inline bool XMLString::equalsN(const char* str1,
1564 : : const char* str2,
1565 : : XMLSize_t n)
1566 : : {
1567 : : if (str1 == str2 || n == 0)
1568 : : return true;
1569 : :
1570 : : if (str1 == 0 || str2 == 0)
1571 : : return ((!str1 || !*str1) && (!str2 || !*str2));
1572 : :
1573 : : for (; n != 0 && *str1 && *str2; --n, ++str1, ++str2)
1574 : : if(*str1 != *str2)
1575 : : break;
1576 : :
1577 : : return n == 0 || *str1 == *str2; // either equal or both ended premat.
1578 : : }
1579 : :
1580 : : inline int XMLString::lastIndexOf(const XMLCh* const toSearch, const XMLCh ch)
1581 : : {
1582 : : return XMLString::lastIndexOf(ch, toSearch, stringLen(toSearch));
1583 : : }
1584 : :
1585 : : inline XMLSize_t XMLString::hash(const XMLCh* const tohash
1586 : : , const XMLSize_t hashModulus)
1587 : : {
1588 : : if (tohash == 0 || *tohash == 0)
1589 : : return 0;
1590 : :
1591 : : const XMLCh* curCh = tohash;
1592 : : XMLSize_t hashVal = (XMLSize_t)(*curCh++);
1593 : :
1594 : : while (*curCh)
1595 : : hashVal = (hashVal * 38) + (hashVal >> 24) + (XMLSize_t)(*curCh++);
1596 : :
1597 : : // Divide by modulus
1598 : : return hashVal % hashModulus;
1599 : : }
1600 : :
1601 : : inline XMLSize_t XMLString::hashN(const XMLCh* const tohash
1602 : : , const XMLSize_t n
1603 : : , const XMLSize_t hashModulus)
1604 : : {
1605 : : if (tohash == 0 || n == 0)
1606 : : return 0;
1607 : :
1608 : : const XMLCh* curCh = tohash;
1609 : : XMLSize_t hashVal = (XMLSize_t)(*curCh++);
1610 : :
1611 : : for(XMLSize_t i=0;i<n;i++)
1612 : : hashVal = (hashVal * 38) + (hashVal >> 24) + (XMLSize_t)(*curCh++);
1613 : :
1614 : : // Divide by modulus
1615 : : return hashVal % hashModulus;
1616 : : }
1617 : :
1618 : : XERCES_CPP_NAMESPACE_END
1619 : :
1620 : : #endif
|