Alien-SVN

 view release on metacpan or  search on metacpan

src/subversion/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c  view on Meta::CPAN

  return convert_hash(hash, (element_converter_t)convert_to_swig_type,
                      tinfo);
}

/* c -> perl array convertors */
static SV *convert_array(const apr_array_header_t *array,
		  element_converter_t converter_func, void *ctx)
{
    AV *list = newAV();
    int i;

    for (i = 0; i < array->nelts; ++i) {
	void *element = APR_ARRAY_IDX(array, i, void *);
	SV *item = converter_func(element, ctx);
	av_push(list, item);
	SvREFCNT_inc(item);
    }
    return sv_2mortal(newRV_noinc((SV*)list));
}

SV *svn_swig_pl_array_to_list(const apr_array_header_t *array)
{
  return convert_array(array, (element_converter_t)convert_string, NULL);
}

/* Formerly used by pre-1.0 APIs. Now unused
SV *svn_swig_pl_ints_to_list(const apr_array_header_t *array)
{
    return convert_array (array, (element_converter_t)convert_int, NULL);
}
*/

SV *svn_swig_pl_convert_array(const apr_array_header_t *array,
                              swig_type_info *tinfo)
{
  return convert_array(array, (element_converter_t)convert_to_swig_type,
                       tinfo);
}

SV *svn_swig_pl_revnums_to_list(const apr_array_header_t *array)
{
    return convert_array(array, (element_converter_t)convert_svn_revnum_t,
                         NULL);
}

/* perl -> c svn_opt_revision_t conversion */
svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev, 
                                             SV *source, 
                                             svn_boolean_t croak_on_error)
{
#define maybe_croak(argv) do { if (croak_on_error) croak argv; \
                               else return NULL; } while (0)

    if (source == NULL || source == &PL_sv_undef || !SvOK(source)) {
        rev->kind = svn_opt_revision_unspecified;
    }
    else if (sv_isobject(source) && sv_derived_from(source, "_p_svn_opt_revision_t")) {
        /* this will assign to rev */
        SWIG_ConvertPtr(source, (void **)&rev, _SWIG_TYPE("svn_opt_revision_t *"), 0);
    }
    else if (looks_like_number(source)) {
        rev->kind = svn_opt_revision_number;
        rev->value.number = SvIV(source);
    }
    else if (SvPOK(source)) {
        char *input = SvPV_nolen(source);
        if (svn_cstring_casecmp(input, "BASE") == 0)
            rev->kind = svn_opt_revision_base;
        else if (svn_cstring_casecmp(input, "HEAD") == 0)
            rev->kind = svn_opt_revision_head;
        else if (svn_cstring_casecmp(input, "WORKING") == 0)
            rev->kind = svn_opt_revision_working;
        else if (svn_cstring_casecmp(input, "COMMITTED") == 0)
            rev->kind = svn_opt_revision_committed;
        else if (svn_cstring_casecmp(input, "PREV") == 0)
            rev->kind = svn_opt_revision_previous;
        else if (*input == '{') {
            svn_boolean_t matched;
            apr_time_t tm;
            svn_error_t *err;

            char *end = strchr(input,'}');
            if (!end)
                maybe_croak(("unknown opt_revision_t string \"%s\": "
                             "missing closing brace for \"{DATE}\"", input));
            *end = '\0';
            err = svn_parse_date (&matched, &tm, input + 1, apr_time_now(),
                                  svn_swig_pl_make_pool ((SV *)NULL));
            if (err) {
                svn_error_clear (err);
                maybe_croak(("unknown opt_revision_t string \"{%s}\": "
                             "internal svn_parse_date error", input + 1));
            }
            if (!matched)
                maybe_croak(("unknown opt_revision_t string \"{%s}\": "
                             "svn_parse_date failed to parse it", input + 1));

            rev->kind = svn_opt_revision_date;
            rev->value.date = tm;
        } else
            maybe_croak(("unknown opt_revision_t string \"%s\": must be one of "
                         "\"BASE\", \"HEAD\", \"WORKING\", \"COMMITTED\", "
                         "\"PREV\" or a \"{DATE}\"", input));
    } else
        maybe_croak(("unknown opt_revision_t type: must be undef, a number, "
                     "a string (one of \"BASE\", \"HEAD\", \"WORKING\", "
                     "\"COMMITTED\", \"PREV\" or a \"{DATE}\") "
                     "or a _p_svn_opt_revision_t object"));

    return rev;
#undef maybe_croak
}

/* put the va_arg in stack and invoke caller_func with func.
   fmt:
   * O: perl object
   * i: apr_int32_t
   * u: apr_uint32_t
   * L: apr_int64_t
   * U: apr_uint64_t
   * s: string



( run in 0.883 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )