--- Convert-UUlib/UUlib.xs 2002/03/31 20:19:09 1.4 +++ Convert-UUlib/UUlib.xs 2002/10/13 13:47:09 1.7 @@ -43,25 +43,26 @@ if (strEQ(name, "MSG_PANIC")) return UUMSG_PANIC; if (strEQ(name, "MSG_WARNING")) return UUMSG_WARNING; case 'O': + if (strEQ(name, "OPT_VERSION")) return UUOPT_VERSION; + if (strEQ(name, "OPT_FAST")) return UUOPT_FAST; + if (strEQ(name, "OPT_DUMBNESS")) return UUOPT_DUMBNESS; if (strEQ(name, "OPT_BRACKPOL")) return UUOPT_BRACKPOL; - if (strEQ(name, "OPT_DEBUG")) return UUOPT_DEBUG; + if (strEQ(name, "OPT_VERBOSE")) return UUOPT_VERBOSE; if (strEQ(name, "OPT_DESPERATE")) return UUOPT_DESPERATE; - if (strEQ(name, "OPT_DUMBNESS")) return UUOPT_DUMBNESS; - if (strEQ(name, "OPT_ENCEXT")) return UUOPT_ENCEXT; - if (strEQ(name, "OPT_ERRNO")) return UUOPT_ERRNO; - if (strEQ(name, "OPT_FAST")) return UUOPT_FAST; - if (strEQ(name, "OPT_IGNMODE")) return UUOPT_IGNMODE; if (strEQ(name, "OPT_IGNREPLY")) return UUOPT_IGNREPLY; if (strEQ(name, "OPT_OVERWRITE")) return UUOPT_OVERWRITE; - if (strEQ(name, "OPT_PREAMB")) return UUOPT_PREAMB; - if (strEQ(name, "OPT_PROGRESS")) return UUOPT_PROGRESS; if (strEQ(name, "OPT_SAVEPATH")) return UUOPT_SAVEPATH; - if (strEQ(name, "OPT_TINYB64")) return UUOPT_TINYB64; + if (strEQ(name, "OPT_IGNMODE")) return UUOPT_IGNMODE; + if (strEQ(name, "OPT_DEBUG")) return UUOPT_DEBUG; + if (strEQ(name, "OPT_ERRNO")) return UUOPT_ERRNO; + if (strEQ(name, "OPT_PROGRESS")) return UUOPT_PROGRESS; if (strEQ(name, "OPT_USETEXT")) return UUOPT_USETEXT; - if (strEQ(name, "OPT_VERBOSE")) return UUOPT_VERBOSE; - if (strEQ(name, "OPT_VERSION")) return UUOPT_VERSION; + if (strEQ(name, "OPT_PREAMB")) return UUOPT_PREAMB; + if (strEQ(name, "OPT_TINYB64")) return UUOPT_TINYB64; + if (strEQ(name, "OPT_ENCEXT")) return UUOPT_ENCEXT; if (strEQ(name, "OPT_REMOVE")) return UUOPT_REMOVE; if (strEQ(name, "OPT_MOREMIME")) return UUOPT_MOREMIME; + if (strEQ(name, "OPT_DOTDOT")) return UUOPT_DOTDOT; case 'R': if (strEQ(name, "RET_CANCEL")) return UURET_CANCEL; if (strEQ(name, "RET_CONT")) return UURET_CONT; @@ -74,7 +75,7 @@ if (strEQ(name, "RET_OK")) return UURET_OK; if (strEQ(name, "RET_UNSUP")) return UURET_UNSUP; case 'B': - if (strEQ(name, "B64ENCODED")) return B64ENCODED; + if (strEQ(name, "B64_ENCODED")) return B64ENCODED; if (strEQ(name, "BH_ENCODED")) return BH_ENCODED; case 'P': if (strEQ(name, "PT_ENCODED")) return PT_ENCODED; @@ -181,7 +182,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 +366,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 +629,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);