⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsstr.c

📁 Swfdec still is development software, but has also followed a rigid no-crashes-allowed policy. I b
💻 C
📖 第 1 页 / 共 5 页
字号:
                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){    JSString *str;    jsint slot;    if (!JSVAL_IS_INT(id))        return JS_TRUE;    str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));    if (!str)        return JS_FALSE;    slot = JSVAL_TO_INT(id);    if (slot == STRING_LENGTH)        *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){    JSString *str, *str1;    size_t i, length;    str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));    if (!str)        return JS_FALSE;    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_JSVAL(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){    JSString *str, *str1;    jsint slot;    if (!JSVAL_IS_INT(id))        return JS_TRUE;    str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));    if (!str)        return JS_FALSE;    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_JSVAL(slot),                                 STRING_TO_JSVAL(str1), NULL, NULL,                                 STRING_ELEMENT_ATTRS, NULL)) {            return JS_FALSE;        }    }    return JS_TRUE;}static JSClass string_class = {    js_String_str,    JSCLASS_HAS_PRIVATE,    JS_PropertyStub,  JS_PropertyStub,  str_getProperty,  JS_PropertyStub,    str_enumerate,    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;    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 (!JS_InstanceOf(cx, obj, &string_class, 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(", string_class.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 (!JS_InstanceOf(cx, obj, &string_class, 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 (!JS_InstanceOf(cx, obj, &string_class, 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) {                if (cx->version != JSVERSION_1_2) {                    /* XXX emulate old JDK1.0 java.lang.String.substring. */                    jsdouble tmp = begin;                    begin = end;                    end = tmp;                } else {                    end = begin;                }            }        }        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;    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;        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;    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;        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 {        thatStr = js_ValueToString(cx, argv[0]);        if (!thatStr)            return JS_FALSE;        if (cx->localeCallbacks && cx->localeCallbacks->localeCompare)            return cx->localeCallbacks->localeCompare(cx, str, thatStr, rval);        *rval = INT_TO_JSVAL(js_CompareStrings(str, thatStr));    }    return JS_TRUE;}static JSBoolstr_charAt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    JSString *str;    jsdouble d;    size_t index;    str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));    if (!str)        return JS_FALSE;    argv[-1] = STRING_TO_JSVAL(str);    if (argc == 0) {        d = 0.0;    } else {        if (!js_ValueToNumber(cx, argv[0], &d))            return JS_FALSE;        d = js_DoubleToInteger(d);    }    if (d < 0 || JSSTRING_LENGTH(str) <= d) {        *rval = JS_GetEmptyStringValue(cx);    } else {        index = (size_t)d;        str = js_NewDependentString(cx, str, index, 1, 0);        if (!str)            return JS_FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -