static int ropes_cmp(jsstr_rope_t *left, jsstr_rope_t *right) { WCHAR left_buf[TMP_BUF_SIZE], right_buf[TMP_BUF_SIZE]; unsigned left_len = jsstr_length(&left->str); unsigned right_len = jsstr_length(&right->str); unsigned cmp_off = 0, cmp_size; int ret; /* FIXME: We can avoid temporary buffers here. */ while(cmp_off < min(left_len, right_len)) { cmp_size = min(left_len, right_len) - cmp_off; if(cmp_size > TMP_BUF_SIZE) cmp_size = TMP_BUF_SIZE; jsstr_rope_extract(left, cmp_off, cmp_size, left_buf); jsstr_rope_extract(right, cmp_off, cmp_size, right_buf); ret = memcmp(left_buf, right_buf, cmp_size); if(ret) return ret; cmp_off += cmp_size; } return left_len - right_len; }
void jsstr_extract(jsstr_t *str, unsigned off, unsigned len, WCHAR *buf) { switch(jsstr_tag(str)) { case JSSTR_INLINE: memcpy(buf, jsstr_as_inline(str)->buf+off, len*sizeof(WCHAR)); return; case JSSTR_HEAP: memcpy(buf, jsstr_as_heap(str)->buf+off, len*sizeof(WCHAR)); return; case JSSTR_ROPE: return jsstr_rope_extract(jsstr_as_rope(str), off, len, buf); } }