1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
10 #include "nsStringAPI.h"
11 #include "nsXPCOMStrings.h"
17 #define snprintf _snprintf
23 nsAString::BeginReading(const char_type
** aBegin
, const char_type
** aEnd
) const
25 uint32_t len
= NS_StringGetData(*this, aBegin
);
27 *aEnd
= *aBegin
+ len
;
33 const nsAString::char_type
*
34 nsAString::BeginReading() const
36 const char_type
* data
;
37 NS_StringGetData(*this, &data
);
41 const nsAString::char_type
*
42 nsAString::EndReading() const
44 const char_type
* data
;
45 uint32_t len
= NS_StringGetData(*this, &data
);
50 nsAString::BeginWriting(char_type
** aBegin
, char_type
** aEnd
, uint32_t aNewSize
)
52 uint32_t len
= NS_StringGetMutableData(*this, aNewSize
, aBegin
);
54 *aEnd
= *aBegin
+ len
;
61 nsAString::BeginWriting(uint32_t aLen
)
64 NS_StringGetMutableData(*this, aLen
, &data
);
69 nsAString::EndWriting()
72 uint32_t len
= NS_StringGetMutableData(*this, UINT32_MAX
, &data
);
77 nsAString::SetLength(uint32_t aLen
)
80 NS_StringGetMutableData(*this, aLen
, &data
);
81 return data
!= nullptr;
85 nsAString::AssignLiteral(const char* aStr
)
87 uint32_t len
= strlen(aStr
);
88 char16_t
* buf
= BeginWriting(len
);
93 for (; *aStr
; ++aStr
, ++buf
) {
99 nsAString::AppendLiteral(const char* aASCIIStr
)
101 uint32_t appendLen
= strlen(aASCIIStr
);
103 uint32_t thisLen
= Length();
106 BeginWriting(&begin
, &end
, appendLen
+ thisLen
);
111 for (begin
+= thisLen
; begin
< end
; ++begin
, ++aASCIIStr
) {
117 nsAString::StripChars(const char* aSet
)
119 nsString
copy(*this);
121 const char_type
* source
;
122 const char_type
* sourceEnd
;
123 copy
.BeginReading(&source
, &sourceEnd
);
131 char_type
* curDest
= dest
;
133 for (; source
< sourceEnd
; ++source
) {
135 for (test
= aSet
; *test
; ++test
) {
136 if (*source
== char_type(*test
)) {
142 // not stripped, copy this char
148 SetLength(curDest
- dest
);
152 nsAString::Trim(const char* aSet
, bool aLeading
, bool aTrailing
)
154 NS_ASSERTION(aLeading
|| aTrailing
, "Ineffective Trim");
156 const char16_t
* start
;
161 BeginReading(&start
, &end
);
162 for (cutLen
= 0; start
< end
; ++start
, ++cutLen
) {
164 for (test
= aSet
; *test
; ++test
) {
165 if (*test
== *start
) {
174 NS_StringCutData(*this, 0, cutLen
);
178 uint32_t len
= BeginReading(&start
, &end
);
180 for (cutLen
= 0; end
>= start
; --end
, ++cutLen
) {
182 for (test
= aSet
; *test
; ++test
) {
192 NS_StringCutData(*this, len
- cutLen
, cutLen
);
198 nsAString::DefaultComparator(const char_type
* aStrA
, const char_type
* aStrB
,
201 for (const char_type
* end
= aStrA
+ aLen
; aStrA
< end
; ++aStrA
, ++aStrB
) {
202 if (*aStrA
== *aStrB
) {
206 return *aStrA
< *aStrB
? -1 : 1;
213 nsAString::Compare(const char_type
* aOther
, ComparatorFunc aComparator
) const
215 const char_type
* cself
;
216 uint32_t selflen
= NS_StringGetData(*this, &cself
);
217 uint32_t otherlen
= NS_strlen(aOther
);
218 uint32_t comparelen
= selflen
<= otherlen
? selflen
: otherlen
;
220 int32_t result
= aComparator(cself
, aOther
, comparelen
);
222 if (selflen
< otherlen
) {
224 } else if (selflen
> otherlen
) {
232 nsAString::Compare(const self_type
& aOther
, ComparatorFunc aComparator
) const
234 const char_type
* cself
;
235 const char_type
* cother
;
236 uint32_t selflen
= NS_StringGetData(*this, &cself
);
237 uint32_t otherlen
= NS_StringGetData(aOther
, &cother
);
238 uint32_t comparelen
= selflen
<= otherlen
? selflen
: otherlen
;
240 int32_t result
= aComparator(cself
, cother
, comparelen
);
242 if (selflen
< otherlen
) {
244 } else if (selflen
> otherlen
) {
252 nsAString::Equals(const char_type
* aOther
, ComparatorFunc aComparator
) const
254 const char_type
* cself
;
255 uint32_t selflen
= NS_StringGetData(*this, &cself
);
256 uint32_t otherlen
= NS_strlen(aOther
);
258 if (selflen
!= otherlen
) {
262 return aComparator(cself
, aOther
, selflen
) == 0;
266 nsAString::Equals(const self_type
& aOther
, ComparatorFunc aComparator
) const
268 const char_type
* cself
;
269 const char_type
* cother
;
270 uint32_t selflen
= NS_StringGetData(*this, &cself
);
271 uint32_t otherlen
= NS_StringGetData(aOther
, &cother
);
273 if (selflen
!= otherlen
) {
277 return aComparator(cself
, cother
, selflen
) == 0;
281 nsAString::EqualsLiteral(const char* aASCIIString
) const
283 const char16_t
* begin
;
285 BeginReading(&begin
, &end
);
287 for (; begin
< end
; ++begin
, ++aASCIIString
) {
288 if (!*aASCIIString
|| !NS_IsAscii(*begin
) ||
289 (char)*begin
!= *aASCIIString
) {
294 return *aASCIIString
== '\0';
298 nsAString::LowerCaseEqualsLiteral(const char* aASCIIString
) const
300 const char16_t
* begin
;
302 BeginReading(&begin
, &end
);
304 for (; begin
< end
; ++begin
, ++aASCIIString
) {
305 if (!*aASCIIString
|| !NS_IsAscii(*begin
) ||
306 NS_ToLower((char)*begin
) != *aASCIIString
) {
311 return *aASCIIString
== '\0';
315 nsAString::Find(const self_type
& aStr
, uint32_t aOffset
,
316 ComparatorFunc aComparator
) const
318 const char_type
* begin
;
319 const char_type
* end
;
320 uint32_t selflen
= BeginReading(&begin
, &end
);
322 if (aOffset
> selflen
) {
326 const char_type
* other
;
327 uint32_t otherlen
= aStr
.BeginReading(&other
);
329 if (otherlen
> selflen
- aOffset
) {
333 // We want to stop searching otherlen characters before the end of the string
336 for (const char_type
* cur
= begin
+ aOffset
; cur
<= end
; ++cur
) {
337 if (!aComparator(cur
, other
, otherlen
)) {
345 ns_strnmatch(const char16_t
* aStr
, const char* aSubstring
, uint32_t aLen
)
347 for (; aLen
; ++aStr
, ++aSubstring
, --aLen
) {
348 if (!NS_IsAscii(*aStr
)) {
352 if ((char)*aStr
!= *aSubstring
) {
361 ns_strnimatch(const char16_t
* aStr
, const char* aSubstring
, uint32_t aLen
)
363 for (; aLen
; ++aStr
, ++aSubstring
, --aLen
) {
364 if (!NS_IsAscii(*aStr
)) {
368 if (NS_ToLower((char)*aStr
) != NS_ToLower(*aSubstring
)) {
377 nsAString::Find(const char* aStr
, uint32_t aOffset
, bool aIgnoreCase
) const
379 bool (*match
)(const char16_t
*, const char*, uint32_t) =
380 aIgnoreCase
? ns_strnimatch
: ns_strnmatch
;
382 const char_type
* begin
;
383 const char_type
* end
;
384 uint32_t selflen
= BeginReading(&begin
, &end
);
386 if (aOffset
> selflen
) {
390 uint32_t otherlen
= strlen(aStr
);
392 if (otherlen
> selflen
- aOffset
) {
396 // We want to stop searching otherlen characters before the end of the string
399 for (const char_type
* cur
= begin
+ aOffset
; cur
<= end
; ++cur
) {
400 if (match(cur
, aStr
, otherlen
)) {
408 nsAString::RFind(const self_type
& aStr
, int32_t aOffset
,
409 ComparatorFunc aComparator
) const
411 const char_type
* begin
;
412 const char_type
* end
;
413 uint32_t selflen
= BeginReading(&begin
, &end
);
415 const char_type
* other
;
416 uint32_t otherlen
= aStr
.BeginReading(&other
);
418 if (selflen
< otherlen
) {
422 if (aOffset
< 0 || uint32_t(aOffset
) > (selflen
- otherlen
)) {
425 end
= begin
+ aOffset
;
428 for (const char_type
* cur
= end
; cur
>= begin
; --cur
) {
429 if (!aComparator(cur
, other
, otherlen
)) {
437 nsAString::RFind(const char* aStr
, int32_t aOffset
, bool aIgnoreCase
) const
439 bool (*match
)(const char16_t
*, const char*, uint32_t) =
440 aIgnoreCase
? ns_strnimatch
: ns_strnmatch
;
442 const char_type
* begin
;
443 const char_type
* end
;
444 uint32_t selflen
= BeginReading(&begin
, &end
);
445 uint32_t otherlen
= strlen(aStr
);
447 if (selflen
< otherlen
) {
451 if (aOffset
< 0 || uint32_t(aOffset
) > (selflen
- otherlen
)) {
454 end
= begin
+ aOffset
;
457 for (const char_type
* cur
= end
; cur
>= begin
; --cur
) {
458 if (match(cur
, aStr
, otherlen
)) {
466 nsAString::FindChar(char_type aChar
, uint32_t aOffset
) const
468 const char_type
* start
;
469 const char_type
* end
;
470 uint32_t len
= BeginReading(&start
, &end
);
475 const char_type
* cur
;
477 for (cur
= start
+ aOffset
; cur
< end
; ++cur
) {
487 nsAString::RFindChar(char_type aChar
) const
489 const char16_t
* start
;
491 BeginReading(&start
, &end
);
500 } while (end
>= start
);
506 nsAString::AppendInt(int aInt
, int32_t aRadix
)
523 NS_ERROR("Unrecognized radix");
528 int len
= snprintf(buf
, sizeof(buf
), fmt
, aInt
);
529 buf
[sizeof(buf
) - 1] = '\0';
531 Append(NS_ConvertASCIItoUTF16(buf
, len
));
536 #ifndef XPCOM_GLUE_AVOID_NSPR
538 nsAString::ToInteger(nsresult
* aErrorCode
, uint32_t aRadix
) const
540 NS_ConvertUTF16toUTF8
narrow(*this);
553 NS_ERROR("Unrecognized radix!");
554 *aErrorCode
= NS_ERROR_INVALID_ARG
;
559 if (PR_sscanf(narrow
.get(), fmt
, &result
) == 1) {
562 *aErrorCode
= NS_ERROR_FAILURE
;
569 nsAString::ToInteger64(nsresult
* aErrorCode
, uint32_t aRadix
) const
571 NS_ConvertUTF16toUTF8
narrow(*this);
584 NS_ERROR("Unrecognized radix!");
585 *aErrorCode
= NS_ERROR_INVALID_ARG
;
590 if (PR_sscanf(narrow
.get(), fmt
, &result
) == 1) {
593 *aErrorCode
= NS_ERROR_FAILURE
;
598 #endif // XPCOM_GLUE_AVOID_NSPR
603 nsACString::BeginReading(const char_type
** aBegin
, const char_type
** aEnd
) const
605 uint32_t len
= NS_CStringGetData(*this, aBegin
);
607 *aEnd
= *aBegin
+ len
;
613 const nsACString::char_type
*
614 nsACString::BeginReading() const
616 const char_type
* data
;
617 NS_CStringGetData(*this, &data
);
621 const nsACString::char_type
*
622 nsACString::EndReading() const
624 const char_type
* data
;
625 uint32_t len
= NS_CStringGetData(*this, &data
);
630 nsACString::BeginWriting(char_type
** aBegin
, char_type
** aEnd
,
633 uint32_t len
= NS_CStringGetMutableData(*this, aNewSize
, aBegin
);
635 *aEnd
= *aBegin
+ len
;
641 nsACString::char_type
*
642 nsACString::BeginWriting(uint32_t aLen
)
645 NS_CStringGetMutableData(*this, aLen
, &data
);
649 nsACString::char_type
*
650 nsACString::EndWriting()
653 uint32_t len
= NS_CStringGetMutableData(*this, UINT32_MAX
, &data
);
658 nsACString::SetLength(uint32_t aLen
)
661 NS_CStringGetMutableData(*this, aLen
, &data
);
662 return data
!= nullptr;
666 nsACString::StripChars(const char* aSet
)
668 nsCString
copy(*this);
670 const char_type
* source
;
671 const char_type
* sourceEnd
;
672 copy
.BeginReading(&source
, &sourceEnd
);
680 char_type
* curDest
= dest
;
682 for (; source
< sourceEnd
; ++source
) {
684 for (test
= aSet
; *test
; ++test
) {
685 if (*source
== char_type(*test
)) {
691 // not stripped, copy this char
697 SetLength(curDest
- dest
);
701 nsACString::Trim(const char* aSet
, bool aLeading
, bool aTrailing
)
703 NS_ASSERTION(aLeading
|| aTrailing
, "Ineffective Trim");
710 BeginReading(&start
, &end
);
711 for (cutLen
= 0; start
< end
; ++start
, ++cutLen
) {
713 for (test
= aSet
; *test
; ++test
) {
714 if (*test
== *start
) {
723 NS_CStringCutData(*this, 0, cutLen
);
727 uint32_t len
= BeginReading(&start
, &end
);
729 for (cutLen
= 0; end
>= start
; --end
, ++cutLen
) {
731 for (test
= aSet
; *test
; ++test
) {
741 NS_CStringCutData(*this, len
- cutLen
, cutLen
);
747 nsACString::DefaultComparator(const char_type
* aStrA
, const char_type
* aStrB
,
750 return memcmp(aStrA
, aStrB
, aLen
);
754 nsACString::Compare(const char_type
* aOther
, ComparatorFunc aComparator
) const
756 const char_type
* cself
;
757 uint32_t selflen
= NS_CStringGetData(*this, &cself
);
758 uint32_t otherlen
= strlen(aOther
);
759 uint32_t comparelen
= selflen
<= otherlen
? selflen
: otherlen
;
761 int32_t result
= aComparator(cself
, aOther
, comparelen
);
763 if (selflen
< otherlen
) {
765 } else if (selflen
> otherlen
) {
773 nsACString::Compare(const self_type
& aOther
, ComparatorFunc aComparator
) const
775 const char_type
* cself
;
776 const char_type
* cother
;
777 uint32_t selflen
= NS_CStringGetData(*this, &cself
);
778 uint32_t otherlen
= NS_CStringGetData(aOther
, &cother
);
779 uint32_t comparelen
= selflen
<= otherlen
? selflen
: otherlen
;
781 int32_t result
= aComparator(cself
, cother
, comparelen
);
783 if (selflen
< otherlen
) {
785 } else if (selflen
> otherlen
) {
793 nsACString::Equals(const char_type
* aOther
, ComparatorFunc aComparator
) const
795 const char_type
* cself
;
796 uint32_t selflen
= NS_CStringGetData(*this, &cself
);
797 uint32_t otherlen
= strlen(aOther
);
799 if (selflen
!= otherlen
) {
803 return aComparator(cself
, aOther
, selflen
) == 0;
807 nsACString::Equals(const self_type
& aOther
, ComparatorFunc aComparator
) const
809 const char_type
* cself
;
810 const char_type
* cother
;
811 uint32_t selflen
= NS_CStringGetData(*this, &cself
);
812 uint32_t otherlen
= NS_CStringGetData(aOther
, &cother
);
814 if (selflen
!= otherlen
) {
818 return aComparator(cself
, cother
, selflen
) == 0;
822 nsACString::Find(const self_type
& aStr
, uint32_t aOffset
,
823 ComparatorFunc aComparator
) const
825 const char_type
* begin
;
826 const char_type
* end
;
827 uint32_t selflen
= BeginReading(&begin
, &end
);
829 if (aOffset
> selflen
) {
833 const char_type
* other
;
834 uint32_t otherlen
= aStr
.BeginReading(&other
);
836 if (otherlen
> selflen
- aOffset
) {
840 // We want to stop searching otherlen characters before the end of the string
843 for (const char_type
* cur
= begin
+ aOffset
; cur
<= end
; ++cur
) {
844 if (!aComparator(cur
, other
, otherlen
)) {
852 nsACString::Find(const char_type
* aStr
, ComparatorFunc aComparator
) const
854 return Find(aStr
, strlen(aStr
), aComparator
);
858 nsACString::Find(const char_type
* aStr
, uint32_t aLen
,
859 ComparatorFunc aComparator
) const
861 const char_type
* begin
;
862 const char_type
* end
;
863 uint32_t selflen
= BeginReading(&begin
, &end
);
866 NS_WARNING("Searching for zero-length string.");
870 if (aLen
> selflen
) {
874 // We want to stop searching otherlen characters before the end of the string
877 for (const char_type
* cur
= begin
; cur
<= end
; ++cur
) {
878 if (!aComparator(cur
, aStr
, aLen
)) {
886 nsACString::RFind(const self_type
& aStr
, int32_t aOffset
,
887 ComparatorFunc aComparator
) const
889 const char_type
* begin
;
890 const char_type
* end
;
891 uint32_t selflen
= BeginReading(&begin
, &end
);
893 const char_type
* other
;
894 uint32_t otherlen
= aStr
.BeginReading(&other
);
896 if (selflen
< otherlen
) {
900 if (aOffset
< 0 || uint32_t(aOffset
) > (selflen
- otherlen
)) {
903 end
= begin
+ aOffset
;
906 for (const char_type
* cur
= end
; cur
>= begin
; --cur
) {
907 if (!aComparator(cur
, other
, otherlen
)) {
915 nsACString::RFind(const char_type
* aStr
, ComparatorFunc aComparator
) const
917 return RFind(aStr
, strlen(aStr
), aComparator
);
921 nsACString::RFind(const char_type
* aStr
, int32_t aLen
,
922 ComparatorFunc aComparator
) const
924 const char_type
* begin
;
925 const char_type
* end
;
926 uint32_t selflen
= BeginReading(&begin
, &end
);
929 NS_WARNING("Searching for zero-length string.");
933 if (uint32_t(aLen
) > selflen
) {
937 // We want to start searching otherlen characters before the end of the string
940 for (const char_type
* cur
= end
; cur
>= begin
; --cur
) {
941 if (!aComparator(cur
, aStr
, aLen
)) {
949 nsACString::FindChar(char_type aChar
, uint32_t aOffset
) const
951 const char_type
* start
;
952 const char_type
* end
;
953 uint32_t len
= BeginReading(&start
, &end
);
958 const char_type
* cur
;
960 for (cur
= start
+ aOffset
; cur
< end
; ++cur
) {
970 nsACString::RFindChar(char_type aChar
) const
974 BeginReading(&start
, &end
);
976 for (; end
>= start
; --end
) {
986 nsACString::AppendInt(int aInt
, int32_t aRadix
)
1003 NS_ERROR("Unrecognized radix");
1008 int len
= snprintf(buf
, sizeof(buf
), fmt
, aInt
);
1009 buf
[sizeof(buf
) - 1] = '\0';
1014 #ifndef XPCOM_GLUE_AVOID_NSPR
1016 nsACString::ToInteger(nsresult
* aErrorCode
, uint32_t aRadix
) const
1029 NS_ERROR("Unrecognized radix!");
1030 *aErrorCode
= NS_ERROR_INVALID_ARG
;
1035 if (PR_sscanf(nsCString(*this).get(), fmt
, &result
) == 1) {
1036 *aErrorCode
= NS_OK
;
1038 *aErrorCode
= NS_ERROR_FAILURE
;
1045 nsACString::ToInteger64(nsresult
* aErrorCode
, uint32_t aRadix
) const
1058 NS_ERROR("Unrecognized radix!");
1059 *aErrorCode
= NS_ERROR_INVALID_ARG
;
1064 if (PR_sscanf(nsCString(*this).get(), fmt
, &result
) == 1) {
1065 *aErrorCode
= NS_OK
;
1067 *aErrorCode
= NS_ERROR_FAILURE
;
1072 #endif // XPCOM_GLUE_AVOID_NSPR
1076 nsDependentSubstring::nsDependentSubstring(const abstract_string_type
& aStr
,
1079 const char16_t
* data
;
1080 uint32_t len
= NS_StringGetData(aStr
, &data
);
1082 if (aStartPos
> len
) {
1086 NS_StringContainerInit2(*this, data
+ aStartPos
, len
- aStartPos
,
1087 NS_STRING_CONTAINER_INIT_DEPEND
|
1088 NS_STRING_CONTAINER_INIT_SUBSTRING
);
1091 nsDependentSubstring::nsDependentSubstring(const abstract_string_type
& aStr
,
1095 const char16_t
* data
;
1096 uint32_t len
= NS_StringGetData(aStr
, &data
);
1098 if (aStartPos
> len
) {
1102 if (aStartPos
+ aLength
> len
) {
1103 aLength
= len
- aStartPos
;
1106 NS_StringContainerInit2(*this, data
+ aStartPos
, aLength
,
1107 NS_STRING_CONTAINER_INIT_DEPEND
|
1108 NS_STRING_CONTAINER_INIT_SUBSTRING
);
1111 nsDependentCSubstring::nsDependentCSubstring(const abstract_string_type
& aStr
,
1115 uint32_t len
= NS_CStringGetData(aStr
, &data
);
1117 if (aStartPos
> len
) {
1121 NS_CStringContainerInit2(*this, data
+ aStartPos
, len
- aStartPos
,
1122 NS_CSTRING_CONTAINER_INIT_DEPEND
|
1123 NS_CSTRING_CONTAINER_INIT_SUBSTRING
);
1126 nsDependentCSubstring::nsDependentCSubstring(const abstract_string_type
& aStr
,
1131 uint32_t len
= NS_CStringGetData(aStr
, &data
);
1133 if (aStartPos
> len
) {
1137 if (aStartPos
+ aLength
> len
) {
1138 aLength
= len
- aStartPos
;
1141 NS_CStringContainerInit2(*this, data
+ aStartPos
, aLength
,
1142 NS_CSTRING_CONTAINER_INIT_DEPEND
|
1143 NS_CSTRING_CONTAINER_INIT_SUBSTRING
);
1149 ToNewUTF8String(const nsAString
& aSource
)
1152 CopyUTF16toUTF8(aSource
, temp
);
1153 return NS_CStringCloneData(temp
);
1157 CompressWhitespace(nsAString
& aString
)
1160 uint32_t len
= NS_StringGetMutableData(aString
, UINT32_MAX
, &start
);
1161 char16_t
* end
= start
+ len
;
1162 char16_t
* from
= start
;
1163 char16_t
* to
= start
;
1165 // Skip any leading whitespace
1166 while (from
< end
&& NS_IsAsciiWhitespace(*from
)) {
1170 while (from
< end
) {
1171 char16_t theChar
= *from
++;
1173 if (NS_IsAsciiWhitespace(theChar
)) {
1174 // We found a whitespace char, so skip over any more
1175 while (from
< end
&& NS_IsAsciiWhitespace(*from
)) {
1179 // Turn all whitespace into spaces
1186 // Drop any trailing space
1187 if (to
> start
&& to
[-1] == ' ') {
1191 // Re-terminate the string
1194 // Set the new length
1195 aString
.SetLength(to
- start
);
1199 ToLowerCase(nsACString
& aStr
)
1203 uint32_t len
= aStr
.BeginWriting(&begin
, &end
);
1205 for (; begin
< end
; ++begin
) {
1206 *begin
= NS_ToLower(*begin
);
1213 ToUpperCase(nsACString
& aStr
)
1217 uint32_t len
= aStr
.BeginWriting(&begin
, &end
);
1219 for (; begin
< end
; ++begin
) {
1220 *begin
= NS_ToUpper(*begin
);
1227 ToLowerCase(const nsACString
& aSrc
, nsACString
& aDest
)
1231 uint32_t len
= aSrc
.BeginReading(&begin
, &end
);
1234 NS_CStringGetMutableData(aDest
, len
, &dest
);
1236 for (; begin
< end
; ++begin
, ++dest
) {
1237 *dest
= NS_ToLower(*begin
);
1244 ToUpperCase(const nsACString
& aSrc
, nsACString
& aDest
)
1248 uint32_t len
= aSrc
.BeginReading(&begin
, &end
);
1251 NS_CStringGetMutableData(aDest
, len
, &dest
);
1253 for (; begin
< end
; ++begin
, ++dest
) {
1254 *dest
= NS_ToUpper(*begin
);
1261 CaseInsensitiveCompare(const char* aStrA
, const char* aStrB
,
1264 for (const char* aend
= aStrA
+ aLen
; aStrA
< aend
; ++aStrA
, ++aStrB
) {
1265 char la
= NS_ToLower(*aStrA
);
1266 char lb
= NS_ToLower(*aStrB
);
1272 return la
< lb
? -1 : 1;
1279 ParseString(const nsACString
& aSource
, char aDelimiter
,
1280 nsTArray
<nsCString
>& aArray
)
1283 int32_t end
= aSource
.Length();
1285 uint32_t oldLength
= aArray
.Length();
1288 int32_t delimiter
= aSource
.FindChar(aDelimiter
, start
);
1289 if (delimiter
< 0) {
1293 if (delimiter
!= start
) {
1294 if (!aArray
.AppendElement(Substring(aSource
, start
, delimiter
- start
))) {
1295 aArray
.RemoveElementsAt(oldLength
, aArray
.Length() - oldLength
);
1300 if (delimiter
== end
) {
1303 start
= ++delimiter
;