svn_checksum_t * svn_checksum_dup(const svn_checksum_t *checksum, apr_pool_t *pool) { /* The duplicate of a NULL checksum is a NULL... */ if (checksum == NULL) return NULL; return svn_checksum__from_digest(checksum->digest, checksum->kind, pool); }
/* Do the work of applying the text delta. */ static svn_error_t * window_handler(svn_txdelta_window_t *window, void *window_baton) { struct file_baton *b = window_baton; SVN_ERR(b->apply_handler(window, b->apply_baton)); if (!window) { b->result_md5_checksum = svn_checksum__from_digest(b->result_digest, svn_checksum_md5, b->pool); } return SVN_NO_ERROR; }
svn_checksum_t * svn_checksum_empty_checksum(svn_checksum_kind_t kind, apr_pool_t *pool) { const unsigned char *digest; switch (kind) { case svn_checksum_md5: digest = svn_md5__empty_string_digest(); break; case svn_checksum_sha1: digest = svn_sha1__empty_string_digest(); break; default: /* We really shouldn't get here, but if we do... */ return NULL; } return svn_checksum__from_digest(digest, kind, pool); }
static svn_error_t * stream_window_test(const char **msg, svn_boolean_t msg_only, svn_test_opts_t *opts, apr_pool_t *pool) { /* Note: put these in data segment, not the stack */ static char source[109001]; static char target[109001]; int i; char *p = &source[9]; svn_checksum_t *expected; svn_checksum_t *actual; svn_string_t source_str; svn_string_t target_str; svn_stream_t *source_stream; svn_stream_t *target_stream; svn_txdelta_stream_t *txstream; *msg = "txdelta stream and windows test"; if (msg_only) return SVN_NO_ERROR; memcpy(source, "a\nb\nc\nd\ne", 9); for (i = 100; i--; ) *p++ = '\n'; for (i = 999; i--; p += 109) memcpy(p, source, 109); source[109000] = '\0'; memcpy(target, source, 109001); for (i = 1000; i--; ) target[i*109 + 4] = 'X'; SVN_ERR(svn_checksum(&expected, svn_checksum_md5, target, 109000, pool)); /* f6fd44565e14c6e44b35292719deb77e */ printf("expected: %s\n", svn_checksum_to_cstring(expected, pool)); source_str.data = source; source_str.len = 109000; source_stream = svn_stream_from_string(&source_str, pool); target_str.data = target; target_str.len = 109000; target_stream = svn_stream_from_string(&target_str, pool); svn_txdelta(&txstream, source_stream, target_stream, pool); while (1) { svn_txdelta_window_t *window; SVN_ERR(svn_txdelta_next_window(&window, txstream, pool)); if (window == NULL) break; /* ### examine the window */ } actual = svn_checksum__from_digest(svn_txdelta_md5_digest(txstream), svn_checksum_md5, pool);; printf(" actual: %s\n", svn_checksum_to_cstring(actual, pool)); if (!svn_checksum_match(expected, actual)) { return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "Checksums did not match."); } return SVN_NO_ERROR; }