--- Convert-UUlib/UUlib.xs 2002/03/31 20:19:09 1.4 +++ Convert-UUlib/UUlib.xs 2002/03/31 21:42:35 1.5 @@ -181,7 +181,52 @@ return retval; } -static SV *uu_msg_sv, *uu_busy_sv, *uu_file_sv, *uu_fnamefilter_sv; +static char *uu_filename_callback (void *cb, char *subject, char *filename) +{ + dSP; + int count; + SV *retval; + STRLEN dc; + + ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,3); + + PUSHs(sv_2mortal(newSVpv(subject, 0))); + PUSHs(filename ? sv_2mortal(newSVpv(filename, 0)) : &PL_sv_undef); + + PUTBACK; count = perl_call_sv ((SV *)cb, G_ARRAY); SPAGAIN; + + if (count > 1) + croak ("filenamecallback perl callback returned more than one argument"); + + if (count) + { + _FP_free (filename); + + retval = POPs; + + if (SvOK (retval)) + { + STRLEN len; + char *fn = SvPV (retval, len); + + filename = malloc (len + 1); + + if (filename) + { + memcpy (filename, fn, len); + filename[len] = 0; + } + } + else + filename = 0; + } + + PUTBACK; FREETMPS; LEAVE; + + return filename; +} + +static SV *uu_msg_sv, *uu_busy_sv, *uu_file_sv, *uu_fnamefilter_sv, *uu_filename_sv; #define FUNC_CB(cb) (void *)(sv_setsv (cb ## _sv, func), cb ## _sv), func ? cb ## _callback : NULL @@ -320,6 +365,12 @@ CODE: UUSetFNameFilter (FUNC_CB(uu_fnamefilter)); +void +UUSetFileNameCallback(func=0) + SV * func + CODE: + UUSetFileNameCallback (FUNC_CB(uu_filename)); + char * UUFNameFilter(fname) char * fname @@ -577,8 +628,9 @@ } BOOT: -uu_msg_sv = newSVsv(&PL_sv_undef); -uu_busy_sv = newSVsv(&PL_sv_undef); -uu_file_sv = newSVsv(&PL_sv_undef); -uu_fnamefilter_sv = newSVsv(&PL_sv_undef); + uu_msg_sv = newSVsv(&PL_sv_undef); + uu_busy_sv = newSVsv(&PL_sv_undef); + uu_file_sv = newSVsv(&PL_sv_undef); + uu_fnamefilter_sv = newSVsv(&PL_sv_undef); + uu_filename_sv = newSVsv(&PL_sv_undef);