]> git.saurik.com Git - cycript.git/blobdiff - String.hpp
With -p on all platforms, we can't use asprintf().
[cycript.git] / String.hpp
index ec45c47d4535e7e89f5c6eebe5c38512e34dce8c..0bc55199754e354241e69827658748e987388e9a 100644 (file)
@@ -1,54 +1,42 @@
-/* Cycript - Inlining/Optimizing JavaScript Compiler
- * Copyright (C) 2009  Jay Freeman (saurik)
+/* Cycript - The Truly Universal Scripting Language
+ * Copyright (C) 2009-2016  Jay Freeman (saurik)
 */
 
-/* Modified BSD License {{{ */
+/* GNU Affero General Public License, Version 3 {{{ */
 /*
- *        Redistribution and use in source and binary
- * forms, with or without modification, are permitted
- * provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the
- *    above copyright notice, this list of conditions
- *    and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the
- *    above copyright notice, this list of conditions
- *    and the following disclaimer in the documentation
- *    and/or other materials provided with the
- *    distribution.
- * 3. The name of the author may not be used to endorse
- *    or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+**/
 /* }}} */
 
 #ifndef CYCRIPT_STRING_HPP
 #define CYCRIPT_STRING_HPP
 
-#include "cycript.hpp"
-#include "Pooling.hpp"
-
 #include <iostream>
+#include <string>
+
+#include "Pooling.hpp"
 
 struct CYUTF8String {
     const char *data;
     size_t size;
 
+    CYUTF8String() :
+        data(NULL),
+        size(0)
+    {
+    }
+
     CYUTF8String(const char *data) :
         data(data),
         size(strlen(data))
@@ -65,9 +53,18 @@ struct CYUTF8String {
         size_t length(strlen(data));
         return length == size && memcmp(value, data, length) == 0;
     }
+
+    bool operator !=(const char *value) const {
+        size_t length(strlen(data));
+        return length != size || memcmp(value, data, length) != 0;
+    }
+
+    operator std::string() const {
+        return std::string(data, size);
+    }
 };
 
-static inline std::ostream &operator <<(std::ostream &lhs, CYUTF8String &rhs) {
+static inline std::ostream &operator <<(std::ostream &lhs, const CYUTF8String &rhs) {
     lhs.write(rhs.data, rhs.size);
     return lhs;
 }
@@ -85,9 +82,24 @@ struct CYUTF16String {
 
 size_t CYGetIndex(const CYUTF8String &value);
 bool CYIsKey(CYUTF8String value);
+
 bool CYGetOffset(const char *value, ssize_t &index);
 
-CYUTF8String CYPoolUTF8String(apr_pool_t *pool, CYUTF16String utf16);
-CYUTF16String CYPoolUTF16String(apr_pool_t *pool, CYUTF8String utf8);
+bool CYStartsWith(const CYUTF8String &haystack, const CYUTF8String &needle);
+
+_finline const char *CYPoolCString(CYPool &pool, CYUTF8String utf8) {
+    return pool.strndup(utf8.data, utf8.size);
+}
+
+_finline CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF8String utf8) {
+    return {pool.strndup(utf8.data, utf8.size), utf8.size};
+}
+
+_finline CYUTF8String CYPoolUTF8String(CYPool &pool, const std::string &value) {
+    return {pool.strndup(value.data(), value.size()), value.size()};
+}
+
+CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF16String utf16);
+CYUTF16String CYPoolUTF16String(CYPool &pool, CYUTF8String utf8);
 
 #endif/*CYCRIPT_STRING_HPP*/