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
case 'i': /* apr_int32_t */
XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_int32_t))));
break;
case 'u': /* apr_uint32_t */
XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_uint32_t))));
break;
case 'r': /* svn_revnum_t */
XPUSHs(sv_2mortal(newSViv(va_arg(ap, svn_revnum_t))));
break;
case 'b': /* svn_boolean_t */
XPUSHs(sv_2mortal(newSViv(va_arg(ap, svn_boolean_t))));
break;
case 't': /* svn_string_t */
str = va_arg(ap, svn_string_t *);
XPUSHs(str ? sv_2mortal(newSVpv(str->data, str->len))
: &PL_sv_undef);
break;
case 'L': /* apr_int64_t */
/* Pass into perl as a string because some implementations may
* not be able to handle a 64-bit int. If it's too long to
* fit in Perl's interal IV size then perl will only make
* it available as a string. If not then perl will convert
* it to an IV for us. So this handles the problem gracefully */
c = malloc(30);
snprintf(c,30,"%" APR_INT64_T_FMT,va_arg(ap, apr_int64_t));
XPUSHs(sv_2mortal(newSVpv(c, 0)));
free(c);
break;
case 'U': /* apr_uint64_t */
c = malloc(30);
snprintf(c,30,"%" APR_UINT64_T_FMT,va_arg(ap, apr_uint64_t));
XPUSHs(sv_2mortal(newSVpv(c, 0)));
free(c);
break;
case 'z': /* apr_size_t */
if (sizeof(apr_size_t) >= 8)
{
c = malloc(30);
snprintf(c,30,"%" APR_SIZE_T_FMT,va_arg(ap, apr_size_t));
XPUSHs(sv_2mortal(newSVpv(c, 0)));
free(c);
}
else
{
XPUSHs(sv_2mortal(newSViv(va_arg(ap, apr_size_t))));
}
break;
}
}
va_end(ap);
PUTBACK;
switch (caller_func) {
case CALL_SV:
count = call_sv(func, call_flags );
break;
case CALL_METHOD:
count = call_method(func, call_flags );
break;
default:
croak("unkonwn calling type");
break;
}
SPAGAIN ;
if (((call_flags & G_SCALAR) && count != 1) ||
((call_flags & G_VOID) && count != 0))
croak("Wrong number of returns");
if (result) {
*result = POPs;
SvREFCNT_inc(*result);
}
PUTBACK;
FREETMPS ;
LEAVE ;
return SVN_NO_ERROR;
}
/*** Editor Wrapping ***/
/* this could be more perlish */
typedef struct item_baton {
SV *editor; /* the editor handling the callbacks */
SV *baton; /* the dir/file baton (or NULL for edit baton) */
} item_baton;
static item_baton * make_baton(apr_pool_t *pool,
SV *editor, SV *baton)
{
item_baton *newb = apr_palloc(pool, sizeof(*newb));
newb->editor = editor;
newb->baton = baton;
return newb;
}
static svn_error_t * close_baton(void *baton, const char *method, apr_pool_t *pool)
{
item_baton *ib = baton;
if (ib->baton) {
SVN_ERR(svn_swig_pl_callback_thunk(CALL_METHOD,
(void *)method, NULL,
"OOS", ib->editor, ib->baton,
pool, POOLINFO));
SvREFCNT_dec(ib->baton);
}
else {
SVN_ERR(svn_swig_pl_callback_thunk(CALL_METHOD,
(void *)method, NULL,
"OS", ib->editor, pool, POOLINFO));
}
return SVN_NO_ERROR;
}
static svn_error_t * thunk_set_target_revision(void *edit_baton,
svn_revnum_t target_revision,
apr_pool_t *pool)
{
item_baton *ib = edit_baton;
SVN_ERR(svn_swig_pl_callback_thunk(CALL_METHOD,
(void *)"set_target_revision", NULL,
"Or", ib->editor, target_revision));
return SVN_NO_ERROR;
}
static svn_error_t * thunk_open_root(void *edit_baton,
svn_revnum_t base_revision,
( run in 1.083 second using v1.01-cache-2.11-cpan-ceb78f64989 )