#include #include #include #include #include #include #include #include #include #include #include #include "svn_types.h" #include "svn_error_codes.h" #include "svn_error.h" #include "svn_string.h" #include "svn_io.h" #include "svn_subst.h" #ifndef APR_STATUS_IS_SUCCESS #define APR_STATUS_IS_SUCCESS(s) ((s) == APR_SUCCESS) #endif static char s_1KiB_buf[1024]; int main(int argc, const char *const *argv, const char *const *env) { apr_status_t apr_status = apr_app_initialize(&argc, &argv, &env); if (! APR_STATUS_IS_SUCCESS(apr_status)) { fprintf(stderr, "`apr_app_initialize` failed: %s\n", apr_strerror(apr_status, s_1KiB_buf, sizeof s_1KiB_buf/sizeof s_1KiB_buf[0])); return EXIT_FAILURE; } atexit(apr_terminate); apr_pool_t *root_pool = NULL; apr_status = apr_pool_create(&root_pool, NULL); if (! APR_STATUS_IS_SUCCESS(apr_status)) { fprintf(stderr, "`apr_pool_create` failed: %s\n", apr_strerror(apr_status, s_1KiB_buf, sizeof s_1KiB_buf/sizeof s_1KiB_buf[0])); return EXIT_FAILURE; } struct stat st; if (-1 == stat("2600.txt", &st)) { fprintf(stderr, "Failed to stat `2600.txt`. errno = %d\n", (int) errno); apr_pool_destroy(root_pool); return EXIT_FAILURE; } char *const data = (char*) malloc((size_t) (st.st_size + 1)); if (data == NULL) { fprintf(stderr, "`malloc` failed to allocate %d bytes.\n", (int) (st.st_size + 1)); apr_pool_destroy(root_pool); return EXIT_FAILURE; } FILE *fp = fopen("2600.txt", "r"); if (fp == NULL) { fprintf(stderr, "Failed to open `2600.txt` for reading\n"); free(data); apr_pool_destroy(root_pool); return EXIT_FAILURE; } off_t bytes_read = 0; char *p = data + bytes_read; size_t size = fread(p, 1, st.st_size - bytes_read, fp); bytes_read += size; p += size; while (bytes_read < st.st_size && ! ferror(fp) && ! feof(fp)) { size = fread(p, 1, st.st_size - bytes_read, fp); bytes_read += size; p += size; } *p = '\0'; if (ferror(fp)) { fprintf(stderr, "An I/O error occurred.\n"); fclose(fp); free(data); apr_pool_destroy(root_pool); return EXIT_FAILURE; } fclose(fp); const clock_t before_clocks = clock(); for (size = 0; size < 100; ++size) { apr_pool_t *pool = NULL; apr_status = apr_pool_create(&pool, root_pool); if (! APR_STATUS_IS_SUCCESS(apr_status)) { fprintf(stderr, "`apr_pool_create` failed: %s\n", apr_strerror(apr_status, s_1KiB_buf, sizeof s_1KiB_buf/sizeof s_1KiB_buf[0])); free(data); apr_pool_destroy(root_pool); return EXIT_FAILURE; } svn_string_t *translated_string = NULL; svn_boolean_t translated_eol = -1; svn_error_t *svn_error = svn_subst_translate_string2(&translated_string, NULL, &translated_eol, svn_string_create(data, pool), "UTF-8", pool, pool); if (svn_error) { fprintf(stderr, "`svn_subst_translate_string` failed: %s\n", svn_err_best_message(svn_error, s_1KiB_buf, sizeof s_1KiB_buf/sizeof s_1KiB_buf[0])); apr_pool_destroy(pool); free(data); apr_pool_destroy(root_pool); return EXIT_FAILURE; } apr_pool_destroy(pool); } const clock_t after_clocks = clock(); printf("(after_clocks - before_clocks) = %d\n", (int) (after_clocks - before_clocks)); free(data); apr_pool_destroy(root_pool); return EXIT_SUCCESS; }