+/* C Strings {{{ */
+// XXX: this macro is unhygenic
+#define CYCastCString_(string) ({ \
+ char *utf8; \
+ if (string == NULL) \
+ utf8 = NULL; \
+ else { \
+ size_t size(JSStringGetMaximumUTF8CStringSize(string)); \
+ utf8 = reinterpret_cast<char *>(alloca(size)); \
+ JSStringGetUTF8CString(string, utf8, size); \
+ } \
+ utf8; \
+})
+
+// XXX: this macro is unhygenic
+#define CYCastCString(context, value) ({ \
+ char *utf8; \
+ if (value == NULL) \
+ utf8 = NULL; \
+ else if (JSStringRef string = CYCopyJSString(context, value)) { \
+ utf8 = CYCastCString_(string); \
+ JSStringRelease(string); \
+ } else \
+ utf8 = NULL; \
+ utf8; \
+})
+/* }}} */