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/. */
7 /* String utility functions used by the module loader. */
9 #ifndef shell_StringUtils_h
10 #define shell_StringUtils_h
12 #include "js/StableStringChars.h"
13 #include "js/String.h"
18 inline char16_t
CharAt(JSLinearString
* str
, size_t index
) {
19 return str
->latin1OrTwoByteChar(index
);
22 inline JSLinearString
* SubString(JSContext
* cx
, JSLinearString
* str
,
23 size_t start
, size_t end
) {
24 MOZ_ASSERT(start
<= str
->length());
25 MOZ_ASSERT(end
>= start
&& end
<= str
->length());
26 return NewDependentString(cx
, str
, start
, end
- start
);
29 inline JSLinearString
* SubString(JSContext
* cx
, JSLinearString
* str
,
31 return SubString(cx
, str
, start
, str
->length());
34 template <size_t NullTerminatedLength
>
35 bool StringStartsWith(JSLinearString
* str
,
36 const char16_t (&chars
)[NullTerminatedLength
]) {
37 MOZ_ASSERT(NullTerminatedLength
> 0);
38 const size_t length
= NullTerminatedLength
- 1;
39 MOZ_ASSERT(chars
[length
] == '\0');
41 if (str
->length() < length
) {
45 for (size_t i
= 0; i
< length
; i
++) {
46 if (CharAt(str
, i
) != chars
[i
]) {
54 template <size_t NullTerminatedLength
>
55 bool StringEquals(JSLinearString
* str
,
56 const char16_t (&chars
)[NullTerminatedLength
]) {
57 MOZ_ASSERT(NullTerminatedLength
> 0);
58 const size_t length
= NullTerminatedLength
- 1;
59 MOZ_ASSERT(chars
[length
] == '\0');
61 return str
->length() == length
&& StringStartsWith(str
, chars
);
64 inline int32_t IndexOf(Handle
<JSLinearString
*> str
, char16_t target
,
66 int32_t length
= str
->length();
67 for (int32_t i
= start
; i
< length
; i
++) {
68 if (CharAt(str
, i
) == target
) {
76 inline int32_t LastIndexOf(Handle
<JSLinearString
*> str
, char16_t target
) {
77 int32_t length
= str
->length();
78 for (int32_t i
= length
- 1; i
>= 0; i
--) {
79 if (CharAt(str
, i
) == target
) {
87 inline JSLinearString
* ReplaceCharGlobally(JSContext
* cx
,
88 Handle
<JSLinearString
*> str
,
90 char16_t replacement
) {
91 int32_t i
= IndexOf(str
, target
);
96 JS::AutoStableStringChars
chars(cx
);
97 if (!chars
.initTwoByte(cx
, str
)) {
101 Vector
<char16_t
> buf(cx
);
102 if (!buf
.append(chars
.twoByteChars(), str
->length())) {
106 for (; i
< int32_t(buf
.length()); i
++) {
107 if (buf
[i
] == target
) {
108 buf
[i
] = replacement
;
112 RootedString
result(cx
, JS_NewUCStringCopyN(cx
, buf
.begin(), buf
.length()));
117 return JS_EnsureLinearString(cx
, result
);
120 inline JSString
* JoinStrings(JSContext
* cx
,
121 Handle
<GCVector
<JSLinearString
*>> strings
,
122 Handle
<JSLinearString
*> separator
) {
123 RootedString
result(cx
, JS_GetEmptyString(cx
));
125 for (size_t i
= 0; i
< strings
.length(); i
++) {
126 HandleString str
= strings
[i
];
128 result
= JS_ConcatStrings(cx
, result
, separator
);
134 result
= JS_ConcatStrings(cx
, result
, str
);
146 #endif // shell_StringUtils_h