]> git.saurik.com Git - cycript.git/blob - String.hpp
56f2eee088b64915f2a5aeac17dddcd7eb786e0c
[cycript.git] / String.hpp
1 #ifndef CYCRIPT_STRING_HPP
2 #define CYCRIPT_STRING_HPP
3
4 #include "cycript.hpp"
5
6 struct CYUTF8String {
7 const char *data;
8 size_t size;
9
10 CYUTF8String(const char *data, size_t size) :
11 data(data),
12 size(size)
13 {
14 }
15
16 bool operator ==(const char *value) const {
17 size_t length(strlen(data));
18 return length == size && memcmp(value, data, length) == 0;
19 }
20 };
21
22 struct CYUTF16String {
23 const uint16_t *data;
24 size_t size;
25
26 CYUTF16String(const uint16_t *data, size_t size) :
27 data(data),
28 size(size)
29 {
30 }
31 };
32
33 JSStringRef CYCopyJSString(const char *value);
34 JSStringRef CYCopyJSString(JSStringRef value);
35 JSStringRef CYCopyJSString(CYUTF8String value);
36 JSStringRef CYCopyJSString(JSContextRef context, JSValueRef value);
37
38 class CYJSString {
39 private:
40 JSStringRef string_;
41
42 void Clear_() {
43 if (string_ != NULL)
44 JSStringRelease(string_);
45 }
46
47 public:
48 CYJSString(const CYJSString &rhs) :
49 string_(CYCopyJSString(rhs.string_))
50 {
51 }
52
53 template <typename Arg0_>
54 CYJSString(Arg0_ arg0) :
55 string_(CYCopyJSString(arg0))
56 {
57 }
58
59 template <typename Arg0_, typename Arg1_>
60 CYJSString(Arg0_ arg0, Arg1_ arg1) :
61 string_(CYCopyJSString(arg0, arg1))
62 {
63 }
64
65 CYJSString &operator =(const CYJSString &rhs) {
66 Clear_();
67 string_ = CYCopyJSString(rhs.string_);
68 return *this;
69 }
70
71 ~CYJSString() {
72 Clear_();
73 }
74
75 void Clear() {
76 Clear_();
77 string_ = NULL;
78 }
79
80 operator JSStringRef() const {
81 return string_;
82 }
83 };
84
85 size_t CYGetIndex(const CYUTF8String &value);
86 bool CYIsKey(CYUTF8String value);
87 bool CYGetOffset(const char *value, ssize_t &index);
88
89 const char *CYPoolCString(apr_pool_t *pool, JSContextRef context, JSValueRef value);
90
91 #endif/*CYCRIPT_STRING_HPP*/