Deleted Added
full compact
deprecated.c (309511) deprecated.c (362181)
1/*
2 * deprecated.c: holding file for all deprecated APIs.
3 * "we can't lose 'em, but we can shun 'em!"
4 *
5 * ====================================================================
6 * Licensed to the Apache Software Foundation (ASF) under one
7 * or more contributor license agreements. See the NOTICE file
8 * distributed with this work for additional information

--- 32 unchanged lines hidden (view full) ---

41#include "svn_cmdline.h"
42#include "svn_version.h"
43#include "svn_pools.h"
44#include "svn_dso.h"
45#include "svn_mergeinfo.h"
46#include "svn_utf.h"
47#include "svn_xml.h"
48#include "svn_auth.h"
1/*
2 * deprecated.c: holding file for all deprecated APIs.
3 * "we can't lose 'em, but we can shun 'em!"
4 *
5 * ====================================================================
6 * Licensed to the Apache Software Foundation (ASF) under one
7 * or more contributor license agreements. See the NOTICE file
8 * distributed with this work for additional information

--- 32 unchanged lines hidden (view full) ---

41#include "svn_cmdline.h"
42#include "svn_version.h"
43#include "svn_pools.h"
44#include "svn_dso.h"
45#include "svn_mergeinfo.h"
46#include "svn_utf.h"
47#include "svn_xml.h"
48#include "svn_auth.h"
49#include "svn_base64.h"
49
50#include "opt.h"
51#include "auth.h"
52#include "private/svn_opt_private.h"
53#include "private/svn_mergeinfo_private.h"
54
55#include "svn_private_config.h"
56

--- 327 unchanged lines hidden (view full) ---

384
385 if (have_options)
386 SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
387 }
388
389 return SVN_NO_ERROR;
390}
391
50
51#include "opt.h"
52#include "auth.h"
53#include "private/svn_opt_private.h"
54#include "private/svn_mergeinfo_private.h"
55
56#include "svn_private_config.h"
57

--- 327 unchanged lines hidden (view full) ---

385
386 if (have_options)
387 SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
388 }
389
390 return SVN_NO_ERROR;
391}
392
393const svn_opt_subcommand_desc2_t *
394svn_opt_get_canonical_subcommand2(const svn_opt_subcommand_desc2_t *table,
395 const char *cmd_name)
396{
397 int i = 0;
398
399 if (cmd_name == NULL)
400 return NULL;
401
402 while (table[i].name) {
403 int j;
404 if (strcmp(cmd_name, table[i].name) == 0)
405 return table + i;
406 for (j = 0; (j < SVN_OPT_MAX_ALIASES) && table[i].aliases[j]; j++)
407 if (strcmp(cmd_name, table[i].aliases[j]) == 0)
408 return table + i;
409
410 i++;
411 }
412
413 /* If we get here, there was no matching subcommand name or alias. */
414 return NULL;
415}
416
392const svn_opt_subcommand_desc_t *
393svn_opt_get_canonical_subcommand(const svn_opt_subcommand_desc_t *table,
394 const char *cmd_name)
395{
396 int i = 0;
397
398 if (cmd_name == NULL)
399 return NULL;

--- 8 unchanged lines hidden (view full) ---

408
409 i++;
410 }
411
412 /* If we get here, there was no matching subcommand name or alias. */
413 return NULL;
414}
415
417const svn_opt_subcommand_desc_t *
418svn_opt_get_canonical_subcommand(const svn_opt_subcommand_desc_t *table,
419 const char *cmd_name)
420{
421 int i = 0;
422
423 if (cmd_name == NULL)
424 return NULL;

--- 8 unchanged lines hidden (view full) ---

433
434 i++;
435 }
436
437 /* If we get here, there was no matching subcommand name or alias. */
438 return NULL;
439}
440
441const apr_getopt_option_t *
442svn_opt_get_option_from_code2(int code,
443 const apr_getopt_option_t *option_table,
444 const svn_opt_subcommand_desc2_t *command,
445 apr_pool_t *pool)
446{
447 apr_size_t i;
448
449 for (i = 0; option_table[i].optch; i++)
450 if (option_table[i].optch == code)
451 {
452 if (command)
453 {
454 int j;
455
456 for (j = 0; ((j < SVN_OPT_MAX_OPTIONS) &&
457 command->desc_overrides[j].optch); j++)
458 if (command->desc_overrides[j].optch == code)
459 {
460 apr_getopt_option_t *tmpopt =
461 apr_palloc(pool, sizeof(*tmpopt));
462 *tmpopt = option_table[i];
463 tmpopt->description = command->desc_overrides[j].desc;
464 return tmpopt;
465 }
466 }
467 return &(option_table[i]);
468 }
469
470 return NULL;
471}
472
473const apr_getopt_option_t *
474svn_opt_get_option_from_code(int code,
475 const apr_getopt_option_t *option_table)
476{
477 apr_size_t i;
478
479 for (i = 0; option_table[i].optch; i++)
480 if (option_table[i].optch == code)
481 return &(option_table[i]);
482
483 return NULL;
484}
485
486/* Like svn_opt_get_option_from_code2(), but also, if CODE appears a second
487 * time in OPTION_TABLE with a different name, then set *LONG_ALIAS to that
488 * second name, else set it to NULL. */
489static const apr_getopt_option_t *
490get_option_from_code(const char **long_alias,
491 int code,
492 const apr_getopt_option_t *option_table,
493 const svn_opt_subcommand_desc2_t *command,
494 apr_pool_t *pool)
495{
496 const apr_getopt_option_t *i;
497 const apr_getopt_option_t *opt
498 = svn_opt_get_option_from_code2(code, option_table, command, pool);
499
500 /* Find a long alias in the table, if there is one. */
501 *long_alias = NULL;
502 for (i = option_table; i->optch; i++)
503 {
504 if (i->optch == code && i->name != opt->name)
505 {
506 *long_alias = i->name;
507 break;
508 }
509 }
510
511 return opt;
512}
513
514/* Print an option OPT nicely into a STRING allocated in POOL.
515 * If OPT has a single-character short form, then print OPT->name (if not
516 * NULL) as an alias, else print LONG_ALIAS (if not NULL) as an alias.
517 * If DOC is set, include the generic documentation string of OPT,
518 * localized to the current locale if a translation is available.
519 */
520static void
521format_option(const char **string,
522 const apr_getopt_option_t *opt,
523 const char *long_alias,
524 svn_boolean_t doc,
525 apr_pool_t *pool)
526{
527 char *opts;
528
529 if (opt == NULL)
530 {
531 *string = "?";
532 return;
533 }
534
535 /* We have a valid option which may or may not have a "short
536 name" (a single-character alias for the long option). */
537 if (opt->optch <= 255)
538 opts = apr_psprintf(pool, "-%c [--%s]", opt->optch, opt->name);
539 else if (long_alias)
540 opts = apr_psprintf(pool, "--%s [--%s]", opt->name, long_alias);
541 else
542 opts = apr_psprintf(pool, "--%s", opt->name);
543
544 if (opt->has_arg)
545 opts = apr_pstrcat(pool, opts, _(" ARG"), SVN_VA_NULL);
546
547 if (doc)
548 opts = apr_psprintf(pool, "%-24s : %s", opts, _(opt->description));
549
550 *string = opts;
551}
552
553/* Print the canonical command name for CMD, and all its aliases, to
554 STREAM. If HELP is set, print CMD's help string too, in which case
555 obtain option usage from OPTIONS_TABLE. */
556static svn_error_t *
557print_command_info2(const svn_opt_subcommand_desc2_t *cmd,
558 const apr_getopt_option_t *options_table,
559 const int *global_options,
560 svn_boolean_t help,
561 apr_pool_t *pool,
562 FILE *stream)
563{
564 svn_boolean_t first_time;
565 apr_size_t i;
566
567 /* Print the canonical command name. */
568 SVN_ERR(svn_cmdline_fputs(cmd->name, stream, pool));
569
570 /* Print the list of aliases. */
571 first_time = TRUE;
572 for (i = 0; i < SVN_OPT_MAX_ALIASES; i++)
573 {
574 if (cmd->aliases[i] == NULL)
575 break;
576
577 if (first_time) {
578 SVN_ERR(svn_cmdline_fputs(" (", stream, pool));
579 first_time = FALSE;
580 }
581 else
582 SVN_ERR(svn_cmdline_fputs(", ", stream, pool));
583
584 SVN_ERR(svn_cmdline_fputs(cmd->aliases[i], stream, pool));
585 }
586
587 if (! first_time)
588 SVN_ERR(svn_cmdline_fputs(")", stream, pool));
589
590 if (help)
591 {
592 const apr_getopt_option_t *option;
593 const char *long_alias;
594 svn_boolean_t have_options = FALSE;
595
596 SVN_ERR(svn_cmdline_fprintf(stream, pool, ": %s", _(cmd->help)));
597
598 /* Loop over all valid option codes attached to the subcommand */
599 for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
600 {
601 if (cmd->valid_options[i])
602 {
603 if (!have_options)
604 {
605 SVN_ERR(svn_cmdline_fputs(_("\nValid options:\n"),
606 stream, pool));
607 have_options = TRUE;
608 }
609
610 /* convert each option code into an option */
611 option = get_option_from_code(&long_alias, cmd->valid_options[i],
612 options_table, cmd, pool);
613
614 /* print the option's docstring */
615 if (option && option->description)
616 {
617 const char *optstr;
618 format_option(&optstr, option, long_alias, TRUE, pool);
619 SVN_ERR(svn_cmdline_fprintf(stream, pool, " %s\n",
620 optstr));
621 }
622 }
623 }
624 /* And global options too */
625 if (global_options && *global_options)
626 {
627 SVN_ERR(svn_cmdline_fputs(_("\nGlobal options:\n"),
628 stream, pool));
629 have_options = TRUE;
630
631 for (i = 0; global_options[i]; i++)
632 {
633
634 /* convert each option code into an option */
635 option = get_option_from_code(&long_alias, global_options[i],
636 options_table, cmd, pool);
637
638 /* print the option's docstring */
639 if (option && option->description)
640 {
641 const char *optstr;
642 format_option(&optstr, option, long_alias, TRUE, pool);
643 SVN_ERR(svn_cmdline_fprintf(stream, pool, " %s\n",
644 optstr));
645 }
646 }
647 }
648
649 if (have_options)
650 SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
651 }
652
653 return SVN_NO_ERROR;
654}
655
656/* The body for svn_opt_print_generic_help2() function with standard error
657 * handling semantic. Handling of errors implemented at caller side. */
658static svn_error_t *
659print_generic_help_body(const char *header,
660 const svn_opt_subcommand_desc2_t *cmd_table,
661 const apr_getopt_option_t *opt_table,
662 const char *footer,
663 apr_pool_t *pool, FILE *stream)
664{
665 int i = 0;
666
667 if (header)
668 SVN_ERR(svn_cmdline_fputs(header, stream, pool));
669
670 while (cmd_table[i].name)
671 {
672 SVN_ERR(svn_cmdline_fputs(" ", stream, pool));
673 SVN_ERR(print_command_info2(cmd_table + i, opt_table,
674 NULL, FALSE,
675 pool, stream));
676 SVN_ERR(svn_cmdline_fputs("\n", stream, pool));
677 i++;
678 }
679
680 SVN_ERR(svn_cmdline_fputs("\n", stream, pool));
681
682 if (footer)
683 SVN_ERR(svn_cmdline_fputs(footer, stream, pool));
684
685 return SVN_NO_ERROR;
686}
687
416void
688void
689svn_opt_print_generic_help2(const char *header,
690 const svn_opt_subcommand_desc2_t *cmd_table,
691 const apr_getopt_option_t *opt_table,
692 const char *footer,
693 apr_pool_t *pool, FILE *stream)
694{
695 svn_error_t *err;
696
697 err = print_generic_help_body(header, cmd_table, opt_table, footer, pool,
698 stream);
699
700 /* Issue #3014:
701 * Don't print anything on broken pipes. The pipe was likely
702 * closed by the process at the other end. We expect that
703 * process to perform error reporting as necessary.
704 *
705 * ### This assumes that there is only one error in a chain for
706 * ### SVN_ERR_IO_PIPE_WRITE_ERROR. See svn_cmdline_fputs(). */
707 if (err && err->apr_err != SVN_ERR_IO_PIPE_WRITE_ERROR)
708 svn_handle_error2(err, stderr, FALSE, "svn: ");
709 svn_error_clear(err);
710}
711
712svn_boolean_t
713svn_opt_subcommand_takes_option3(const svn_opt_subcommand_desc2_t *command,
714 int option_code,
715 const int *global_options)
716{
717 apr_size_t i;
718
719 for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
720 if (command->valid_options[i] == option_code)
721 return TRUE;
722
723 if (global_options)
724 for (i = 0; global_options[i]; i++)
725 if (global_options[i] == option_code)
726 return TRUE;
727
728 return FALSE;
729}
730
731svn_boolean_t
732svn_opt_subcommand_takes_option2(const svn_opt_subcommand_desc2_t *command,
733 int option_code)
734{
735 return svn_opt_subcommand_takes_option3(command,
736 option_code,
737 NULL);
738}
739
740svn_boolean_t
741svn_opt_subcommand_takes_option(const svn_opt_subcommand_desc_t *command,
742 int option_code)
743{
744 apr_size_t i;
745
746 for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
747 if (command->valid_options[i] == option_code)
748 return TRUE;
749
750 return FALSE;
751}
752
753void
754svn_opt_subcommand_help3(const char *subcommand,
755 const svn_opt_subcommand_desc2_t *table,
756 const apr_getopt_option_t *options_table,
757 const int *global_options,
758 apr_pool_t *pool)
759{
760 const svn_opt_subcommand_desc2_t *cmd =
761 svn_opt_get_canonical_subcommand2(table, subcommand);
762 svn_error_t *err;
763
764 if (cmd)
765 err = print_command_info2(cmd, options_table, global_options,
766 TRUE, pool, stdout);
767 else
768 err = svn_cmdline_fprintf(stderr, pool,
769 _("\"%s\": unknown command.\n\n"), subcommand);
770
771 if (err) {
772 /* Issue #3014: Don't print anything on broken pipes. */
773 if (err->apr_err != SVN_ERR_IO_PIPE_WRITE_ERROR)
774 svn_handle_error2(err, stderr, FALSE, "svn: ");
775 svn_error_clear(err);
776 }
777}
778
779void
417svn_opt_subcommand_help2(const char *subcommand,
418 const svn_opt_subcommand_desc2_t *table,
419 const apr_getopt_option_t *options_table,
420 apr_pool_t *pool)
421{
422 svn_opt_subcommand_help3(subcommand, table, options_table,
423 NULL, pool);
424}

--- 91 unchanged lines hidden (view full) ---

516 }
517 }
518
519 *targets_p = output_targets;
520 return SVN_NO_ERROR;
521}
522
523svn_error_t *
780svn_opt_subcommand_help2(const char *subcommand,
781 const svn_opt_subcommand_desc2_t *table,
782 const apr_getopt_option_t *options_table,
783 apr_pool_t *pool)
784{
785 svn_opt_subcommand_help3(subcommand, table, options_table,
786 NULL, pool);
787}

--- 91 unchanged lines hidden (view full) ---

879 }
880 }
881
882 *targets_p = output_targets;
883 return SVN_NO_ERROR;
884}
885
886svn_error_t *
887svn_opt_print_help4(apr_getopt_t *os,
888 const char *pgm_name,
889 svn_boolean_t print_version,
890 svn_boolean_t quiet,
891 svn_boolean_t verbose,
892 const char *version_footer,
893 const char *header,
894 const svn_opt_subcommand_desc2_t *cmd_table,
895 const apr_getopt_option_t *option_table,
896 const int *global_options,
897 const char *footer,
898 apr_pool_t *pool)
899{
900 apr_array_header_t *targets = NULL;
901
902 if (os)
903 SVN_ERR(svn_opt_parse_all_args(&targets, os, pool));
904
905 if (os && targets->nelts) /* help on subcommand(s) requested */
906 {
907 int i;
908
909 for (i = 0; i < targets->nelts; i++)
910 {
911 svn_opt_subcommand_help3(APR_ARRAY_IDX(targets, i, const char *),
912 cmd_table, option_table,
913 global_options, pool);
914 }
915 }
916 else if (print_version) /* just --version */
917 {
918 SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
919 svn_version_extended(verbose, pool),
920 quiet, verbose, pool));
921 }
922 else if (os && !targets->nelts) /* `-h', `--help', or `help' */
923 svn_opt_print_generic_help2(header,
924 cmd_table,
925 option_table,
926 footer,
927 pool,
928 stdout);
929 else /* unknown option or cmd */
930 SVN_ERR(svn_cmdline_fprintf(stderr, pool,
931 _("Type '%s help' for usage.\n"), pgm_name));
932
933 return SVN_NO_ERROR;
934}
935
936svn_error_t *
524svn_opt_print_help3(apr_getopt_t *os,
525 const char *pgm_name,
526 svn_boolean_t print_version,
527 svn_boolean_t quiet,
528 const char *version_footer,
529 const char *header,
530 const svn_opt_subcommand_desc2_t *cmd_table,
531 const apr_getopt_option_t *option_table,

--- 352 unchanged lines hidden (view full) ---

884 svn_io_stat_dirent2(dirent_p,
885 path,
886 FALSE,
887 ignore_enoent,
888 result_pool,
889 scratch_pool));
890}
891
937svn_opt_print_help3(apr_getopt_t *os,
938 const char *pgm_name,
939 svn_boolean_t print_version,
940 svn_boolean_t quiet,
941 const char *version_footer,
942 const char *header,
943 const svn_opt_subcommand_desc2_t *cmd_table,
944 const apr_getopt_option_t *option_table,

--- 352 unchanged lines hidden (view full) ---

1297 svn_io_stat_dirent2(dirent_p,
1298 path,
1299 FALSE,
1300 ignore_enoent,
1301 result_pool,
1302 scratch_pool));
1303}
1304
1305svn_error_t *
1306svn_io_file_rename(const char *from_path, const char *to_path,
1307 apr_pool_t *pool)
1308{
1309 return svn_error_trace(svn_io_file_rename2(from_path, to_path,
1310 FALSE, pool));
1311}
1312
1313svn_error_t *
1314svn_io_write_atomic(const char *final_path,
1315 const void *buf,
1316 apr_size_t nbytes,
1317 const char *copy_perms_path,
1318 apr_pool_t *scratch_pool)
1319{
1320 return svn_error_trace(svn_io_write_atomic2(final_path, buf, nbytes,
1321 copy_perms_path, TRUE,
1322 scratch_pool));
1323}
1324
892/*** From constructors.c ***/
893svn_log_changed_path_t *
894svn_log_changed_path_dup(const svn_log_changed_path_t *changed_path,
895 apr_pool_t *pool)
896{
897 svn_log_changed_path_t *new_changed_path
898 = apr_palloc(pool, sizeof(*new_changed_path));
899

--- 153 unchanged lines hidden (view full) ---

1053
1054svn_stream_t *
1055svn_stream_from_aprfile(apr_file_t *file, apr_pool_t *pool)
1056{
1057 return svn_stream_from_aprfile2(file, TRUE, pool);
1058}
1059
1060svn_error_t *
1325/*** From constructors.c ***/
1326svn_log_changed_path_t *
1327svn_log_changed_path_dup(const svn_log_changed_path_t *changed_path,
1328 apr_pool_t *pool)
1329{
1330 svn_log_changed_path_t *new_changed_path
1331 = apr_palloc(pool, sizeof(*new_changed_path));
1332

--- 153 unchanged lines hidden (view full) ---

1486
1487svn_stream_t *
1488svn_stream_from_aprfile(apr_file_t *file, apr_pool_t *pool)
1489{
1490 return svn_stream_from_aprfile2(file, TRUE, pool);
1491}
1492
1493svn_error_t *
1494svn_stream_for_stdin(svn_stream_t **in, apr_pool_t *pool)
1495{
1496 return svn_error_trace(svn_stream_for_stdin2(in, FALSE, pool));
1497}
1498
1499svn_error_t *
1061svn_stream_contents_same(svn_boolean_t *same,
1062 svn_stream_t *stream1,
1063 svn_stream_t *stream2,
1064 apr_pool_t *pool)
1065{
1066 return svn_error_trace(svn_stream_contents_same2(
1067 same,
1068 svn_stream_disown(stream1, pool),

--- 109 unchanged lines hidden (view full) ---

1178 s = svn_stream_create(baton, pool);
1179 svn_stream_set_read2(s, read_handler_md5, read_full_handler_md5);
1180 svn_stream_set_skip(s, skip_handler_md5);
1181 svn_stream_set_write(s, write_handler_md5);
1182 svn_stream_set_close(s, close_handler_md5);
1183 return s;
1184}
1185
1500svn_stream_contents_same(svn_boolean_t *same,
1501 svn_stream_t *stream1,
1502 svn_stream_t *stream2,
1503 apr_pool_t *pool)
1504{
1505 return svn_error_trace(svn_stream_contents_same2(
1506 same,
1507 svn_stream_disown(stream1, pool),

--- 109 unchanged lines hidden (view full) ---

1617 s = svn_stream_create(baton, pool);
1618 svn_stream_set_read2(s, read_handler_md5, read_full_handler_md5);
1619 svn_stream_set_skip(s, skip_handler_md5);
1620 svn_stream_set_write(s, write_handler_md5);
1621 svn_stream_set_close(s, close_handler_md5);
1622 return s;
1623}
1624
1625svn_error_t *
1626svn_string_from_stream(svn_string_t **result,
1627 svn_stream_t *stream,
1628 apr_pool_t *result_pool,
1629 apr_pool_t *scratch_pool)
1630{
1631 return svn_error_trace(svn_string_from_stream2(result, stream, 0,
1632 result_pool));
1633}
1634
1186/*** From path.c ***/
1187
1188const char *
1189svn_path_internal_style(const char *path, apr_pool_t *pool)
1190{
1191 if (svn_path_is_url(path))
1192 return svn_uri_canonicalize(path, pool);
1193 else

--- 52 unchanged lines hidden (view full) ---

1246svn_rangelist_merge(svn_rangelist_t **rangelist,
1247 const svn_rangelist_t *changes,
1248 apr_pool_t *pool)
1249{
1250 SVN_ERR(svn_rangelist_merge2(*rangelist, changes,
1251 pool, pool));
1252
1253 return svn_error_trace(
1635/*** From path.c ***/
1636
1637const char *
1638svn_path_internal_style(const char *path, apr_pool_t *pool)
1639{
1640 if (svn_path_is_url(path))
1641 return svn_uri_canonicalize(path, pool);
1642 else

--- 52 unchanged lines hidden (view full) ---

1695svn_rangelist_merge(svn_rangelist_t **rangelist,
1696 const svn_rangelist_t *changes,
1697 apr_pool_t *pool)
1698{
1699 SVN_ERR(svn_rangelist_merge2(*rangelist, changes,
1700 pool, pool));
1701
1702 return svn_error_trace(
1254 svn_rangelist__combine_adjacent_ranges(*rangelist, pool));
1703 svn_rangelist__canonicalize(*rangelist, pool));
1255}
1256
1257svn_error_t *
1258svn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added,
1259 svn_mergeinfo_t from, svn_mergeinfo_t to,
1260 svn_boolean_t consider_inheritance,
1261 apr_pool_t *pool)
1262{

--- 280 unchanged lines hidden (view full) ---

1543 FALSE,
1544 FALSE,
1545 FALSE,
1546 cfg,
1547 cancel_func,
1548 cancel_baton,
1549 pool));
1550}
1704}
1705
1706svn_error_t *
1707svn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added,
1708 svn_mergeinfo_t from, svn_mergeinfo_t to,
1709 svn_boolean_t consider_inheritance,
1710 apr_pool_t *pool)
1711{

--- 280 unchanged lines hidden (view full) ---

1992 FALSE,
1993 FALSE,
1994 FALSE,
1995 cfg,
1996 cancel_func,
1997 cancel_baton,
1998 pool));
1999}
2000
2001/*** From base64.c ***/
2002svn_stream_t *
2003svn_base64_encode(svn_stream_t *output, apr_pool_t *pool)
2004{
2005 return svn_base64_encode2(output, TRUE, pool);
2006}
2007
2008/*** From string.c ***/
2009char *
2010svn_cstring_join(const apr_array_header_t *strings,
2011 const char *separator,
2012 apr_pool_t *pool)
2013{
2014 return svn_cstring_join2(strings, separator, TRUE, pool);
2015}