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

📄 jsstr.c

📁 java script test programing source code
💻 C
📖 第 1 页 / 共 5 页
字号:
                if ((size_t)i == length)                    return -1;                i++;                goto again;            }            if ((size_t)i == length) {                /*                 * If there was a trivial zero-length match at the end of the                 * split, then we shouldn't output the matched string at the end                 * of the split array. See ECMA-262 Ed. 3, 15.5.4.14, Step 15.                 */                sep->chars = NULL;            }        }        JS_ASSERT((size_t)i >= sep->length);        return i - sep->length;    }    /*     * Deviate from ECMA by never splitting an empty string by any separator     * string into a non-empty array (an array of length 1 that contains the     * empty string).     */    if (!JS_VERSION_IS_ECMA(cx) && length == 0)        return -1;    /*     * Special case: if sep is the empty string, split str into one character     * substrings.  Let our caller worry about whether to split once at end of     * string into an empty substring.     */    if (sep->length == 0)        return ((size_t)i == length) ? -1 : i + 1;    /*     * Now that we know sep is non-empty, search starting at i in str for an     * occurrence of all of sep's chars.  If we find them, return the index of     * the first separator char.  Otherwise, return length.     */    j = 0;    while ((size_t)(k = i + j) < length) {        if (chars[k] == sep->chars[j]) {            if ((size_t)++j == sep->length)                return i;        } else {            i++;            j = 0;        }    }    return k;}static JSBoolstr_split(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    JSString *str, *sub;    JSObject *arrayobj;    jsval v;    JSBool ok, limited;    JSRegExp *re;    JSSubString *sep, tmp;    jsdouble d;    jsint i, j;    uint32 len, limit;    str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));    if (!str)        return JS_FALSE;    argv[-1] = STRING_TO_JSVAL(str);    arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL, 0, NULL);    if (!arrayobj)        return JS_FALSE;    *rval = OBJECT_TO_JSVAL(arrayobj);    if (argc == 0) {        v = STRING_TO_JSVAL(str);        ok = JS_SetElement(cx, arrayobj, 0, &v);    } else {        if (JSVAL_IS_REGEXP(cx, argv[0])) {            re = (JSRegExp *) JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[0]));            sep = &tmp;            /* Set a magic value so we can detect a successful re match. */            sep->chars = NULL;            sep->length = 0;        } else {            JSString *str2 = js_ValueToString(cx, argv[0]);            if (!str2)                return JS_FALSE;            argv[0] = STRING_TO_JSVAL(str2);            /*             * Point sep at a local copy of str2's header because find_split             * will modify sep->length.             */            tmp.length = JSSTRING_LENGTH(str2);            tmp.chars = JSSTRING_CHARS(str2);            sep = &tmp;            re = NULL;        }        /* Use the second argument as the split limit, if given. */        limited = (argc > 1) && !JSVAL_IS_VOID(argv[1]);        limit = 0; /* Avoid warning. */        if (limited) {            if (!js_ValueToNumber(cx, argv[1], &d))                return JS_FALSE;            /* Clamp limit between 0 and 1 + string length. */            if (!js_DoubleToECMAUint32(cx, d, &limit))                return JS_FALSE;            if (limit > JSSTRING_LENGTH(str))                limit = 1 + JSSTRING_LENGTH(str);        }        len = i = 0;        while ((j = find_split(cx, str, re, &i, sep)) >= 0) {            if (limited && len >= limit)                break;            sub = js_NewDependentString(cx, str, i, (size_t)(j - i), 0);            if (!sub)                return JS_FALSE;            v = STRING_TO_JSVAL(sub);            if (!JS_SetElement(cx, arrayobj, len, &v))                return JS_FALSE;            len++;            /*             * Imitate perl's feature of including parenthesized substrings             * that matched part of the delimiter in the new array, after the             * split substring that was delimited.             */            if (re && sep->chars) {                uintN num;                JSSubString *parsub;                for (num = 0; num < cx->regExpStatics.parenCount; num++) {                    if (limited && len >= limit)                        break;                    parsub = REGEXP_PAREN_SUBSTRING(&cx->regExpStatics, num);                    sub = js_NewStringCopyN(cx, parsub->chars, parsub->length,                                            0);                    if (!sub)                        return JS_FALSE;                    v = STRING_TO_JSVAL(sub);                    if (!JS_SetElement(cx, arrayobj, len, &v))                        return JS_FALSE;                    len++;                }                sep->chars = NULL;            }            i = j + sep->length;            if (!JS_VERSION_IS_ECMA(cx)) {                /*                 * Deviate from ECMA to imitate Perl, which omits a final                 * split unless a limit argument is given and big enough.                 */                if (!limited && (size_t)i == JSSTRING_LENGTH(str))                    break;            }        }        ok = (j != -2);    }    return ok;}#if JS_HAS_PERL_SUBSTRstatic JSBoolstr_substr(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 += length;            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;            end += begin;            if (end > length)                end = length;        }        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;}#endif /* JS_HAS_PERL_SUBSTR *//* * Python-esque sequence operations. */static JSBoolstr_concat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    JSString *str, *str2;    uintN i;    str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));    if (!str)        return JS_FALSE;    argv[-1] = STRING_TO_JSVAL(str);    for (i = 0; i < argc; i++) {        str2 = js_ValueToString(cx, argv[i]);        if (!str2)            return JS_FALSE;        argv[i] = STRING_TO_JSVAL(str2);        str = js_ConcatStrings(cx, str, str2);        if (!str)            return JS_FALSE;    }    *rval = STRING_TO_JSVAL(str);    return JS_TRUE;}static JSBoolstr_slice(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 += length;            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 += length;                if (end < 0)                    end = 0;            } else if (end > length) {                end = length;            }            if (end < begin)                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;}#if JS_HAS_STR_HTML_HELPERS/* * HTML composition aids. */static JSBooltagify(JSContext *cx, JSObject *obj, jsval *argv,       const char *begin, JSString *param, const char *end,       jsval *rval){    JSString *str;    jschar *tagbuf;    size_t beglen, endlen, parlen, taglen;    size_t i, j;    if (JSVAL_IS_STRING((jsval)obj)) {        str = JSVAL_TO_STRING((jsval)obj);    } else {        str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));        if (!str)            return JS_FALSE;        argv[-1] = STRING_TO_JSVAL(str);    }    if (!end)        end = begin;    beglen = strlen(begin);    taglen = 1 + beglen + 1;                            /* '<begin' + '>' */    parlen = 0; /* Avoid warning. */    if (param) {        parlen = JSSTRING_LENGTH(param);        taglen += 2 + parlen + 1;                       /* '="param"' */    }    endlen = strlen(end);    taglen += JSSTRING_LENGTH(str) + 2 + endlen + 1;    /* 'str</end>' */    if (taglen >= ~(size_t)0 / sizeof(jschar)) {        JS_ReportOutOfMemory(cx);        return JS_FALSE;    }    tagbuf = (jschar *) JS_malloc(cx, (taglen + 1) * sizeof(jschar));    if (!tagbuf)        return JS_FALSE;    j = 0;    tagbuf[j++] = '<';    for (i = 0; i < beglen; i++)        tagbuf[j++] = (jschar)begin[i];    if (param) {        tagbuf[j++] = '=';        tagbuf[j++] = '"';        js_strncpy(&tagbuf[j], JSSTRING_CHARS(param), parlen);        j += parlen;        tagbuf[j++] = '"';    }    tagbuf[j++] = '>';    js_strncpy(&tagbuf[j], JSSTRING_CHARS(str), JSSTRING_LENGTH(str));    j += JSSTRING_LENGTH(str);    tagbuf[j++] = '<';    tagbuf[j++] = '/';    for (i = 0; i < endlen; i++)        tagbuf[j++] = (jschar)end[i];    tagbuf[j++] = '>';    JS_ASSERT(j == taglen);    tagbuf[j] = 0;    str = js_NewString(cx, tagbuf, taglen, 0);    if (!str) {        free((char *)tagbuf);        return JS_FALSE;    }    *rval = STRING_TO_JSVAL(str);    return JS_TRUE;}static JSBooltagify_value(JSContext *cx, JSObject *obj, jsval *argv,             const char *begin, const char *end,             jsval *rval){    JSString *param;    param = js_ValueToString(cx, argv[0]);    if (!param)        return JS_FALSE;    argv[0] = STRING_TO_JSVAL(param);    return tagify(cx, obj, argv, begin, param, end, rval);}static JSBoolstr_bold(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify(cx, obj, argv, "b", NULL, NULL, rval);}static JSBoolstr_italics(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify(cx, obj, argv, "i", NULL, NULL, rval);}static JSBoolstr_fixed(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify(cx, obj, argv, "tt", NULL, NULL, rval);}static JSBoolstr_fontsize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify_value(cx, obj, argv, "font size", "font", rval);}static JSBoolstr_fontcolor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,              jsval *rval){    return tagify_value(cx, obj, argv, "font color", "font", rval);}static JSBoolstr_link(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify_value(cx, obj, argv, "a href", "a", rval);}static JSBoolstr_anchor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify_value(cx, obj, argv, "a name", "a", rval);}static JSBoolstr_strike(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    return tagify(cx, obj, argv, "strike", NULL, NULL, rval);}static JSBoolstr_small(JSContext *cx, JSObject *

⌨️ 快捷键说明

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