#ifndef util_Text_h
#define util_Text_h
#include "mozilla/ArrayUtils.h"
#include "mozilla/Assertions.h"
#include "mozilla/Attributes.h"
#include "mozilla/TextUtils.h"
#include "mozilla/Utf8.h"
#include <ctype.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <string>
#include "jsutil.h"
#include "NamespaceImports.h"
#include "js/Utility.h"
#include "util/Unicode.h"
#include "vm/Printer.h"
class JSLinearString;
#define JS7_ISA2F(c) \
((((((unsigned)(c)) - 'a') <= 5) || (((unsigned)(c)) - 'A') <= 5))
#define JS7_UNDEC(c) ((c) - '0')
#define JS7_ISOCT(c) ((((unsigned)(c)) - '0') <= 7)
#define JS7_UNOCT(c) (JS7_UNDEC(c))
#define JS7_ISHEX(c) ((c) < 128 && (mozilla::IsAsciiDigit(c) || JS7_ISA2F(c)))
#define JS7_UNHEX(c) \
(unsigned)(mozilla::IsAsciiDigit(c) ? (c) - '0' : 10 + tolower(c) - 'a')
static MOZ_ALWAYS_INLINE size_t js_strlen(const char16_t* s) {
return std::char_traits<char16_t>::length(s);
}
template <typename CharT>
extern const CharT* js_strchr_limit(const CharT* s, char16_t c,
const CharT* limit);
extern int32_t js_fputs(const char16_t* s, FILE* f);
namespace js {
class StringBuffer;
template <typename Char1, typename Char2>
inline bool EqualChars(const Char1* s1, const Char2* s2, size_t len) {
return mozilla::ArrayEqual(s1, s2, len);
}
template <typename Char1, typename Char2>
inline int32_t CompareChars(const Char1* s1, size_t len1, const Char2* s2,
size_t len2) {
size_t n = Min(len1, len2);
for (size_t i = 0; i < n; i++) {
if (int32_t cmp = s1[i] - s2[i]) {
return cmp;
}
}
return int32_t(len1 - len2);
}
template <typename CharT>
static inline const CharT* SkipSpace(const CharT* s, const CharT* end) {
MOZ_ASSERT(s <= end);
while (s < end && unicode::IsSpace(*s)) {
s++;
}
return s;
}
extern UniqueChars DuplicateString(JSContext* cx, const char* s);
extern UniqueTwoByteChars DuplicateString(JSContext* cx, const char16_t* s);
extern UniqueChars DuplicateString(const char* s);
extern UniqueChars DuplicateString(const char* s, size_t n);
extern UniqueTwoByteChars DuplicateString(const char16_t* s);
extern UniqueTwoByteChars DuplicateString(const char16_t* s, size_t n);
extern char16_t* InflateString(JSContext* cx, const char* bytes, size_t length);
inline void CopyAndInflateChars(char16_t* dst, const char* src, size_t srclen) {
for (size_t i = 0; i < srclen; i++) {
dst[i] = (unsigned char)src[i];
}
}
inline void CopyAndInflateChars(char16_t* dst, const JS::Latin1Char* src,
size_t srclen) {
for (size_t i = 0; i < srclen; i++) {
dst[i] = src[i];
}
}
extern uint32_t OneUcs4ToUtf8Char(uint8_t* utf8Buffer, uint32_t ucs4Char);
extern size_t PutEscapedStringImpl(char* buffer, size_t size,
GenericPrinter* out, JSLinearString* str,
uint32_t quote);
template <typename CharT>
extern size_t PutEscapedStringImpl(char* buffer, size_t bufferSize,
GenericPrinter* out, const CharT* chars,
size_t length, uint32_t quote);
inline size_t PutEscapedString(char* buffer, size_t size, JSLinearString* str,
uint32_t quote) {
size_t n = PutEscapedStringImpl(buffer, size, nullptr, str, quote);
MOZ_ASSERT(n != size_t(-1));
return n;
}
template <typename CharT>
inline size_t PutEscapedString(char* buffer, size_t bufferSize,
const CharT* chars, size_t length,
uint32_t quote) {
size_t n =
PutEscapedStringImpl(buffer, bufferSize, nullptr, chars, length, quote);
MOZ_ASSERT(n != size_t(-1));
return n;
}
inline bool EscapedStringPrinter(GenericPrinter& out, JSLinearString* str,
uint32_t quote) {
return PutEscapedStringImpl(nullptr, 0, &out, str, quote) != size_t(-1);
}
inline bool EscapedStringPrinter(GenericPrinter& out, const char* chars,
size_t length, uint32_t quote) {
return PutEscapedStringImpl(nullptr, 0, &out, chars, length, quote) !=
size_t(-1);
}
inline bool FileEscapedString(FILE* fp, JSLinearString* str, uint32_t quote) {
Fprinter out(fp);
bool res = EscapedStringPrinter(out, str, quote);
out.finish();
return res;
}
inline bool FileEscapedString(FILE* fp, const char* chars, size_t length,
uint32_t quote) {
Fprinter out(fp);
bool res = EscapedStringPrinter(out, chars, length, quote);
out.finish();
return res;
}
JSString* EncodeURI(JSContext* cx, const char* chars, size_t length);
bool ContainsFlag(const char* str, const char* flag);
namespace unicode {
extern size_t CountCodePoints(const mozilla::Utf8Unit* begin,
const mozilla::Utf8Unit* end);
extern size_t CountCodePoints(const char16_t* begin, const char16_t* end);
}
}
#endif