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

📄 jsstr.c

📁 java script test programing source code
💻 C
📖 第 1 页 / 共 5 页
字号:
                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 + -