Convert-UUlib
view release on metacpan or search on metacpan
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "perlmulticore.h"
#include "uulib/fptools.h"
#include "uulib/uudeview.h"
#include "uulib/uuint.h"
static int perlinterp_released;
#define RELEASE do { perlinterp_released = 1; perlinterp_release (); } while (0)
#define ACQUIRE do { perlinterp_acquire (); perlinterp_released = 0; } while (0)
#define TEMP_ACQUIRE if (perlinterp_released) perlinterp_acquire ();
#define TEMP_RELEASE if (perlinterp_released) perlinterp_release ();
static void
uu_msg_callback (void *cb, char *msg, int level)
{
TEMP_ACQUIRE {
dSP;
ENTER; SAVETMPS; PUSHMARK (SP); EXTEND (SP, 2);
PUSHs (sv_2mortal (newSVpv (msg, 0)));
PUSHs (sv_2mortal (newSViv (level)));
PUTBACK; (void) perl_call_sv ((SV *)cb, G_VOID|G_DISCARD); SPAGAIN;
PUTBACK; FREETMPS; LEAVE;
} TEMP_RELEASE;
}
static int
uu_busy_callback (void *cb, uuprogress *uup)
{
int retval;
TEMP_ACQUIRE {
dSP;
int count;
ENTER; SAVETMPS; PUSHMARK (SP); EXTEND (SP, 6);
PUSHs (sv_2mortal (newSViv (uup->action)));
PUSHs (sv_2mortal (newSVpv (uup->curfile, 0)));
PUSHs (sv_2mortal (newSViv (uup->partno)));
PUSHs (sv_2mortal (newSViv (uup->numparts)));
PUSHs (sv_2mortal (newSViv (uup->fsize)));
PUSHs (sv_2mortal (newSViv (uup->percent)));
PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
if (count != 1)
croak ("busycallback perl callback returned more than one argument");
retval = POPi;
PUTBACK; FREETMPS; LEAVE;
} TEMP_RELEASE;
return retval;
}
static char *
uu_fnamefilter_callback (void *cb, char *fname)
{
static char *str;
TEMP_ACQUIRE {
dSP;
int count;
ENTER; SAVETMPS; PUSHMARK (SP); EXTEND (SP, 1);
PUSHs (sv_2mortal (newSVpv (fname, 0)));
PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
if (count != 1)
croak ("fnamefilter perl callback MUST return a single filename exactly");
_FP_free (str); str = _FP_strdup (SvPV_nolen (TOPs));
PUTBACK; FREETMPS; LEAVE;
} TEMP_RELEASE;
return str;
}
static int
uu_file_callback (void *cb, char *id, char *fname, int retrieve)
{
int retval;
TEMP_ACQUIRE {
dSP;
int count;
SV *xfname = newSVpv ("", 0);
ENTER; SAVETMPS; PUSHMARK (SP); EXTEND (SP, 3);
PUSHs (sv_2mortal (newSVpv (id, 0)));
PUSHs (sv_2mortal (xfname));
PUSHs (sv_2mortal (newSViv (retrieve)));
PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
if (count != 1)
croak ("filecallback perl callback must return a single return status");
strcpy (fname, SvPV_nolen (xfname));
retval = POPi;
PUTBACK; FREETMPS; LEAVE;
} TEMP_RELEASE;
return retval;
}
static char *
uu_filename_callback (void *cb, char *subject, char *filename)
{
TEMP_ACQUIRE {
dSP;
int count;
ENTER; SAVETMPS; PUSHMARK (SP); EXTEND (SP, 2);
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 must return nothing or a single filename");
if (count)
{
_FP_free (filename);
filename = SvOK (TOPs)
? _FP_strdup (SvPV_nolen (TOPs))
: 0;
}
PUTBACK; FREETMPS; LEAVE;
} TEMP_RELEASE;
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
static int
uu_info_file (void *cb, char *info)
{
int retval;
TEMP_ACQUIRE {
dSP;
int count;
ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,1);
PUSHs(sv_2mortal(newSVpv(info,0)));
PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
if (count != 1)
croak ("info_file perl callback returned more than one argument");
retval = POPi;
PUTBACK; FREETMPS; LEAVE;
} TEMP_RELEASE;
return retval;
}
static int
uu_opt_isstring (int opt)
{
switch (opt)
{
case UUOPT_VERSION:
case UUOPT_SAVEPATH:
case UUOPT_ENCEXT:
return 1;
default:
return 0;
}
}
static void
initialise (void)
{
int retval = UUInitialize ();
if (retval != UURET_OK)
croak ("unable to initialize uudeview library (%s)", UUstrerror (retval));
}
MODULE = Convert::UUlib PACKAGE = Convert::UUlib PREFIX = UU
PROTOTYPES: ENABLE
void
UUCleanUp ()
CODE:
UUCleanUp ();
initialise ();
SV *
UUGetOption (opt)
int opt
CODE:
{
if (opt == UUOPT_PROGRESS)
croak ("GetOption(UUOPT_PROGRESS) is not yet implemented");
else if (uu_opt_isstring (opt))
{
char cval[8192];
UUGetOption (opt, 0, cval, sizeof cval);
RETVAL = newSVpv (cval, 0);
}
else
{
RETVAL = newSViv (UUGetOption (opt, 0, 0, 0));
}
}
OUTPUT:
RETVAL
int
UUSetOption (opt, val)
int opt
SV * val
CODE:
{
STRLEN dc;
if (uu_opt_isstring (opt))
RETVAL = UUSetOption (opt, 0, SvPV (val, dc));
else
RETVAL = UUSetOption (opt, SvIV (val), (void *)0);
}
OUTPUT:
RETVAL
char *
UUstrerror (errcode)
int errcode
void
UUSetMsgCallback (func = 0)
SV * func
CODE:
UUSetMsgCallback (FUNC_CB (uu_msg));
void
UUSetBusyCallback (func = 0,msecs = 1000)
SV * func
long msecs
CODE:
UUSetBusyCallback (FUNC_CB (uu_busy), msecs);
void
UUSetFileCallback (func = 0)
SV * func
CODE:
UUSetFileCallback (FUNC_CB (uu_file));
void
UUSetFNameFilter (func = 0)
SV * func
CODE:
UUSetFNameFilter (FUNC_CB (uu_fnamefilter));
void
UUSetFileNameCallback (func = 0)
SV * func
CODE:
UUSetFileNameCallback (FUNC_CB (uu_filename));
char *
UUFNameFilter (fname)
char * fname
void
UULoadFile (fname, id = 0, delflag = 0, partno = -1)
char * fname
char * id
int delflag
int partno
PPCODE:
{
int count;
IV ret;
RELEASE;
ret = UULoadFileWithPartNo (fname, id, delflag, partno, &count);
ACQUIRE;
XPUSHs (sv_2mortal (newSViv (ret)));
if (GIMME_V == G_ARRAY)
XPUSHs (sv_2mortal (newSViv (count)));
}
int
UUSmerge (pass)
int pass
int
UUQuickDecode(datain,dataout,boundary,maxpos)
FILE * datain
FILE * dataout
char * boundary
long maxpos
int
UUEncodeMulti(outfile,infile,infname,encoding,outfname,mimetype,filemode)
FILE * outfile
FILE * infile
char * infname
int encoding
const_iv (FILE_ERROR , UUFILE_ERROR)
const_iv (FILE_MISPART , UUFILE_MISPART)
const_iv (FILE_NOBEGIN , UUFILE_NOBEGIN)
const_iv (FILE_NODATA , UUFILE_NODATA)
const_iv (FILE_NOEND , UUFILE_NOEND)
const_iv (FILE_OK , UUFILE_OK)
const_iv (FILE_READ , UUFILE_READ)
const_iv (FILE_TMPFILE , UUFILE_TMPFILE)
const_iv (MSG_ERROR , UUMSG_ERROR)
const_iv (MSG_FATAL , UUMSG_FATAL)
const_iv (MSG_MESSAGE , UUMSG_MESSAGE)
const_iv (MSG_NOTE , UUMSG_NOTE)
const_iv (MSG_PANIC , UUMSG_PANIC)
const_iv (MSG_WARNING , UUMSG_WARNING)
const_iv (OPT_VERSION , UUOPT_VERSION)
const_iv (OPT_FAST , UUOPT_FAST)
const_iv (OPT_DUMBNESS , UUOPT_DUMBNESS)
const_iv (OPT_BRACKPOL , UUOPT_BRACKPOL)
const_iv (OPT_VERBOSE , UUOPT_VERBOSE)
const_iv (OPT_DESPERATE, UUOPT_DESPERATE)
const_iv (OPT_IGNREPLY , UUOPT_IGNREPLY)
const_iv (OPT_OVERWRITE, UUOPT_OVERWRITE)
const_iv (OPT_SAVEPATH , UUOPT_SAVEPATH)
const_iv (OPT_IGNMODE , UUOPT_IGNMODE)
const_iv (OPT_DEBUG , UUOPT_DEBUG)
const_iv (OPT_ERRNO , UUOPT_ERRNO)
const_iv (OPT_PROGRESS , UUOPT_PROGRESS)
const_iv (OPT_USETEXT , UUOPT_USETEXT)
const_iv (OPT_PREAMB , UUOPT_PREAMB)
const_iv (OPT_TINYB64 , UUOPT_TINYB64)
const_iv (OPT_ENCEXT , UUOPT_ENCEXT)
const_iv (OPT_REMOVE , UUOPT_REMOVE)
const_iv (OPT_MOREMIME , UUOPT_MOREMIME)
const_iv (OPT_DOTDOT , UUOPT_DOTDOT)
const_iv (OPT_RBUF , UUOPT_RBUF)
const_iv (OPT_WBUF , UUOPT_WBUF)
const_iv (OPT_AUTOCHECK, UUOPT_AUTOCHECK)
const_iv (RET_CANCEL , UURET_CANCEL)
const_iv (RET_CONT , UURET_CONT)
const_iv (RET_EXISTS , UURET_EXISTS)
const_iv (RET_ILLVAL , UURET_ILLVAL)
const_iv (RET_IOERR , UURET_IOERR)
const_iv (RET_NODATA , UURET_NODATA)
const_iv (RET_NOEND , UURET_NOEND)
const_iv (RET_NOMEM , UURET_NOMEM)
const_iv (RET_OK , UURET_OK)
const_iv (RET_UNSUP , UURET_UNSUP)
const_iv (B64_ENCODED , B64ENCODED)
const_iv (BH_ENCODED , BH_ENCODED)
const_iv (PT_ENCODED , PT_ENCODED)
const_iv (QP_ENCODED , QP_ENCODED)
const_iv (UU_ENCODED , UU_ENCODED)
const_iv (XX_ENCODED , XX_ENCODED)
const_iv (YENC_ENCODED , YENC_ENCODED)
};
for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
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);
initialise ();
}
( run in 2.296 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )