📄 jsstr.c
字号:
i += 2; } else if (i + 4 < length && chars[i] == 'u' && JS7_ISHEX(chars[i + 1]) && JS7_ISHEX(chars[i + 2]) && JS7_ISHEX(chars[i + 3]) && JS7_ISHEX(chars[i + 4])) { ch = (((((JS7_UNHEX(chars[i + 1]) << 4) + JS7_UNHEX(chars[i + 2])) << 4) + JS7_UNHEX(chars[i + 3])) << 4) + JS7_UNHEX(chars[i + 4]); i += 5; } } newchars[ni++] = ch; } newchars[ni] = 0; str = js_NewString(cx, newchars, ni, 0); if (!str) { JS_free(cx, newchars); return JS_FALSE; } *rval = STRING_TO_JSVAL(str); return JS_TRUE;}#if JS_HAS_UNEVALstatic JSBoolstr_uneval(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; str = js_ValueToSource(cx, argv[0]); if (!str) return JS_FALSE; *rval = STRING_TO_JSVAL(str); return JS_TRUE;}#endifconst char js_escape_str[] = "escape";const char js_unescape_str[] = "unescape";#if JS_HAS_UNEVALconst char js_uneval_str[] = "uneval";#endifconst char js_decodeURI_str[] = "decodeURI";const char js_encodeURI_str[] = "encodeURI";const char js_decodeURIComponent_str[] = "decodeURIComponent";const char js_encodeURIComponent_str[] = "encodeURIComponent";static JSFunctionSpec string_functions[] = { {js_escape_str, js_str_escape, 1,0,0}, {js_unescape_str, str_unescape, 1,0,0},#if JS_HAS_UNEVAL {js_uneval_str, str_uneval, 1,0,0},#endif {js_decodeURI_str, str_decodeURI, 1,0,0}, {js_encodeURI_str, str_encodeURI, 1,0,0}, {js_decodeURIComponent_str, str_decodeURI_Component, 1,0,0}, {js_encodeURIComponent_str, str_encodeURI_Component, 1,0,0}, {0,0,0,0,0}};jschar js_empty_ucstr[] = {0};JSSubString js_EmptySubString = {0, js_empty_ucstr};enum string_tinyid { STRING_LENGTH = -1};static JSPropertySpec string_props[] = { {js_length_str, STRING_LENGTH, JSPROP_READONLY|JSPROP_PERMANENT|JSPROP_SHARED, 0,0}, {0,0,0,0,0}};static JSBoolstr_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ jsval v; JSString *str; jsint slot; if (!JSVAL_IS_INT(id)) return JS_TRUE; slot = JSVAL_TO_INT(id); if (slot == STRING_LENGTH) { if (OBJ_GET_CLASS(cx, obj) == &js_StringClass) { /* Follow ECMA-262 by fetching intrinsic length of our string. */ v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); JS_ASSERT(JSVAL_IS_STRING(v)); str = JSVAL_TO_STRING(v); } else { /* Preserve compatibility: convert obj to a string primitive. */ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; } *vp = INT_TO_JSVAL((jsint) JSSTRING_LENGTH(str)); } return JS_TRUE;}#define STRING_ELEMENT_ATTRS (JSPROP_ENUMERATE|JSPROP_READONLY|JSPROP_PERMANENT)static JSBoolstr_enumerate(JSContext *cx, JSObject *obj){ jsval v; JSString *str, *str1; size_t i, length; v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); JS_ASSERT(JSVAL_IS_STRING(v)); str = JSVAL_TO_STRING(v); length = JSSTRING_LENGTH(str); for (i = 0; i < length; i++) { str1 = js_NewDependentString(cx, str, i, 1, 0); if (!str1) return JS_FALSE; if (!OBJ_DEFINE_PROPERTY(cx, obj, INT_TO_JSID(i), STRING_TO_JSVAL(str1), NULL, NULL, STRING_ELEMENT_ATTRS, NULL)) { return JS_FALSE; } } return JS_TRUE;}static JSBoolstr_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp){ jsval v; JSString *str, *str1; jsint slot; if (!JSVAL_IS_INT(id) || (flags & JSRESOLVE_ASSIGNING)) return JS_TRUE; v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); JS_ASSERT(JSVAL_IS_STRING(v)); str = JSVAL_TO_STRING(v); slot = JSVAL_TO_INT(id); if ((size_t)slot < JSSTRING_LENGTH(str)) { str1 = js_NewDependentString(cx, str, (size_t)slot, 1, 0); if (!str1) return JS_FALSE; if (!OBJ_DEFINE_PROPERTY(cx, obj, INT_TO_JSID(slot), STRING_TO_JSVAL(str1), NULL, NULL, STRING_ELEMENT_ATTRS, NULL)) { return JS_FALSE; } *objp = obj; } return JS_TRUE;}JSClass js_StringClass = { "js_String_str", JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_HAS_CACHED_PROTO(JSProto_String), JS_PropertyStub, JS_PropertyStub, str_getProperty, JS_PropertyStub, str_enumerate, (JSResolveOp)str_resolve, JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS};#if JS_HAS_TOSOURCE/* * String.prototype.quote is generic (as are most string methods), unlike * toSource, toString, and valueOf. */static JSBoolstr_quote(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); str = js_QuoteString(cx, str, '"'); if (!str) return JS_FALSE; *rval = STRING_TO_JSVAL(str); return JS_TRUE;}static JSBoolstr_toSource(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsval v; JSString *str; size_t i, j, k, n; char buf[16]; jschar *s, *t; if (JSVAL_IS_STRING((jsval)obj)) { v = (jsval)obj; } else { if (!JS_InstanceOf(cx, obj, &js_StringClass, argv)) return JS_FALSE; v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (!JSVAL_IS_STRING(v)) return js_obj_toSource(cx, obj, argc, argv, rval); } str = js_QuoteString(cx, JSVAL_TO_STRING(v), '"'); if (!str) return JS_FALSE; j = JS_snprintf(buf, sizeof buf, "(new %s(", js_StringClass.name); s = JSSTRING_CHARS(str); k = JSSTRING_LENGTH(str); n = j + k + 2; t = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar)); if (!t) return JS_FALSE; for (i = 0; i < j; i++) t[i] = buf[i]; for (j = 0; j < k; i++, j++) t[i] = s[j]; t[i++] = ')'; t[i++] = ')'; t[i] = 0; str = js_NewString(cx, t, n, 0); if (!str) { JS_free(cx, t); return JS_FALSE; } *rval = STRING_TO_JSVAL(str); return JS_TRUE;}#endif /* JS_HAS_TOSOURCE */static JSBoolstr_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsval v; if (JSVAL_IS_STRING((jsval)obj)) { *rval = (jsval)obj; return JS_TRUE; } if (!JS_InstanceOf(cx, obj, &js_StringClass, argv)) return JS_FALSE; v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); if (!JSVAL_IS_STRING(v)) return js_obj_toString(cx, obj, argc, argv, rval); *rval = v; return JS_TRUE;}static JSBoolstr_valueOf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ if (JSVAL_IS_STRING((jsval)obj)) { *rval = (jsval)obj; return JS_TRUE; } if (!JS_InstanceOf(cx, obj, &js_StringClass, argv)) return JS_FALSE; *rval = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE); return JS_TRUE;}/* * Java-like string native methods. */static JSBoolstr_substring(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; jsdouble d; jsdouble length, begin, end; str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); if (argc != 0) { if (!js_ValueToNumber(cx, argv[0], &d)) return JS_FALSE; length = JSSTRING_LENGTH(str); begin = js_DoubleToInteger(d); if (begin < 0) begin = 0; else if (begin > length) begin = length; if (argc == 1) { end = length; } else { if (!js_ValueToNumber(cx, argv[1], &d)) return JS_FALSE; end = js_DoubleToInteger(d); if (end < 0) end = 0; else if (end > length) end = length; if (end < begin) { /* ECMA emulates old JDK1.0 java.lang.String.substring. */ jsdouble tmp = begin; begin = end; end = tmp; } } str = js_NewDependentString(cx, str, (size_t)begin, (size_t)(end - begin), 0); if (!str) return JS_FALSE; } *rval = STRING_TO_JSVAL(str); return JS_TRUE;}static JSBoolstr_toLowerCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; size_t i, n; jschar *s, *news; str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); n = JSSTRING_LENGTH(str); news = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar)); if (!news) return JS_FALSE; s = JSSTRING_CHARS(str); for (i = 0; i < n; i++) news[i] = JS_TOLOWER(s[i]); news[n] = 0; str = js_NewString(cx, news, n, 0); if (!str) { JS_free(cx, news); return JS_FALSE; } *rval = STRING_TO_JSVAL(str); return JS_TRUE;}static JSBoolstr_toLocaleLowerCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; /* * Forcefully ignore the first (or any) argument and return toLowerCase(), * ECMA has reserved that argument, presumably for defining the locale. */ if (cx->localeCallbacks && cx->localeCallbacks->localeToLowerCase) { str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); return cx->localeCallbacks->localeToLowerCase(cx, str, rval); } return str_toLowerCase(cx, obj, 0, argv, rval);}static JSBoolstr_toUpperCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; size_t i, n; jschar *s, *news; str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); n = JSSTRING_LENGTH(str); news = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar)); if (!news) return JS_FALSE; s = JSSTRING_CHARS(str); for (i = 0; i < n; i++) news[i] = JS_TOUPPER(s[i]); news[n] = 0; str = js_NewString(cx, news, n, 0); if (!str) { JS_free(cx, news); return JS_FALSE; } *rval = STRING_TO_JSVAL(str); return JS_TRUE;}static JSBoolstr_toLocaleUpperCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str; /* * Forcefully ignore the first (or any) argument and return toUpperCase(), * ECMA has reserved that argument, presumbaly for defining the locale. */ if (cx->localeCallbacks && cx->localeCallbacks->localeToUpperCase) { str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); return cx->localeCallbacks->localeToUpperCase(cx, str, rval); } return str_toUpperCase(cx, obj, 0, argv, rval);}static JSBoolstr_localeCompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString *str, *thatStr; str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); if (!str) return JS_FALSE; argv[-1] = STRING_TO_JSVAL(str); if (argc == 0) { *rval = JSVAL_ZERO; } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -