static JSBool XDRChars(JSXDRState *xdr, jschar *chars, uint32 nchars) { uint32 i, padlen, nbytes; jschar *raw; nbytes = nchars * sizeof(jschar); padlen = nbytes % JSXDR_ALIGN; if (padlen) { padlen = JSXDR_ALIGN - padlen; nbytes += padlen; } if (!(raw = (jschar *) xdr->ops->raw(xdr, nbytes))) return JS_FALSE; if (xdr->mode == JSXDR_ENCODE) { for (i = 0; i != nchars; i++) raw[i] = JSXDR_SWAB16(chars[i]); if (padlen) memset((char *)raw + nbytes - padlen, 0, padlen); } else if (xdr->mode == JSXDR_DECODE) { for (i = 0; i != nchars; i++) chars[i] = JSXDR_SWAB16(raw[i]); } return JS_TRUE; }
JS_XDRString(JSXDRState *xdr, JSString **strp) { uint32 i, len, padlen, nbytes; jschar *chars = NULL, *raw; if (xdr->mode == JSXDR_ENCODE) len = JSSTRING_LENGTH(*strp); if (!JS_XDRUint32(xdr, &len)) return JS_FALSE; nbytes = len * sizeof(jschar); if (xdr->mode == JSXDR_DECODE) { if (!(chars = (jschar *) JS_malloc(xdr->cx, nbytes + sizeof(jschar)))) return JS_FALSE; } else { chars = JSSTRING_CHARS(*strp); } padlen = nbytes % JSXDR_ALIGN; if (padlen) { padlen = JSXDR_ALIGN - padlen; nbytes += padlen; } if (!(raw = (jschar *) xdr->ops->raw(xdr, nbytes))) goto bad; if (xdr->mode == JSXDR_ENCODE) { for (i = 0; i < len; i++) raw[i] = JSXDR_SWAB16(chars[i]); if (padlen) memset((char *)raw + nbytes - padlen, 0, padlen); } else if (xdr->mode == JSXDR_DECODE) { for (i = 0; i < len; i++) chars[i] = JSXDR_SWAB16(raw[i]); chars[len] = 0; if (!(*strp = JS_NewUCString(xdr->cx, chars, len))) goto bad; } return JS_TRUE; bad: if (xdr->mode == JSXDR_DECODE) JS_free(xdr->cx, chars); return JS_FALSE; }