ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-UUlib/UUlib.xs
Revision: 1.7
Committed: Sun Oct 13 13:47:09 2002 UTC (21 years, 7 months ago) by root
Branch: MAIN
Changes since 1.6: +12 -12 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #include "EXTERN.h"
2     #include "perl.h"
3     #include "XSUB.h"
4    
5     #include "uulib/fptools.h"
6 root 1.2 #include "uulib/uudeview.h"
7 root 1.1 #include "uulib/uuint.h"
8    
9     static int
10     not_here(char *s)
11     {
12     croak("%s not implemented on this architecture", s);
13     return -1;
14     }
15    
16     static int
17     constant(char *name)
18     {
19     errno = 0;
20     switch (*name) {
21     case 'A':
22     if (strEQ(name, "ACT_COPYING")) return UUACT_COPYING;
23     if (strEQ(name, "ACT_DECODING")) return UUACT_DECODING;
24     if (strEQ(name, "ACT_ENCODING")) return UUACT_ENCODING;
25     if (strEQ(name, "ACT_IDLE")) return UUACT_IDLE;
26     if (strEQ(name, "ACT_SCANNING")) return UUACT_SCANNING;
27     case 'F':
28     if (strEQ(name, "FILE_DECODED")) return UUFILE_DECODED;
29     if (strEQ(name, "FILE_ERROR")) return UUFILE_ERROR;
30     if (strEQ(name, "FILE_MISPART")) return UUFILE_MISPART;
31     if (strEQ(name, "FILE_NOBEGIN")) return UUFILE_NOBEGIN;
32     if (strEQ(name, "FILE_NODATA")) return UUFILE_NODATA;
33     if (strEQ(name, "FILE_NOEND")) return UUFILE_NOEND;
34     if (strEQ(name, "FILE_OK")) return UUFILE_OK;
35     if (strEQ(name, "FILE_READ")) return UUFILE_READ;
36     if (strEQ(name, "FILE_TMPFILE")) return UUFILE_TMPFILE;
37     break;
38     case 'M':
39     if (strEQ(name, "MSG_ERROR")) return UUMSG_ERROR;
40     if (strEQ(name, "MSG_FATAL")) return UUMSG_FATAL;
41     if (strEQ(name, "MSG_MESSAGE")) return UUMSG_MESSAGE;
42     if (strEQ(name, "MSG_NOTE")) return UUMSG_NOTE;
43     if (strEQ(name, "MSG_PANIC")) return UUMSG_PANIC;
44     if (strEQ(name, "MSG_WARNING")) return UUMSG_WARNING;
45     case 'O':
46 root 1.7 if (strEQ(name, "OPT_VERSION")) return UUOPT_VERSION;
47     if (strEQ(name, "OPT_FAST")) return UUOPT_FAST;
48     if (strEQ(name, "OPT_DUMBNESS")) return UUOPT_DUMBNESS;
49 root 1.1 if (strEQ(name, "OPT_BRACKPOL")) return UUOPT_BRACKPOL;
50 root 1.7 if (strEQ(name, "OPT_VERBOSE")) return UUOPT_VERBOSE;
51 root 1.1 if (strEQ(name, "OPT_DESPERATE")) return UUOPT_DESPERATE;
52     if (strEQ(name, "OPT_IGNREPLY")) return UUOPT_IGNREPLY;
53     if (strEQ(name, "OPT_OVERWRITE")) return UUOPT_OVERWRITE;
54 root 1.7 if (strEQ(name, "OPT_SAVEPATH")) return UUOPT_SAVEPATH;
55     if (strEQ(name, "OPT_IGNMODE")) return UUOPT_IGNMODE;
56     if (strEQ(name, "OPT_DEBUG")) return UUOPT_DEBUG;
57     if (strEQ(name, "OPT_ERRNO")) return UUOPT_ERRNO;
58     if (strEQ(name, "OPT_PROGRESS")) return UUOPT_PROGRESS;
59     if (strEQ(name, "OPT_USETEXT")) return UUOPT_USETEXT;
60 root 1.1 if (strEQ(name, "OPT_PREAMB")) return UUOPT_PREAMB;
61     if (strEQ(name, "OPT_TINYB64")) return UUOPT_TINYB64;
62 root 1.7 if (strEQ(name, "OPT_ENCEXT")) return UUOPT_ENCEXT;
63 root 1.2 if (strEQ(name, "OPT_REMOVE")) return UUOPT_REMOVE;
64     if (strEQ(name, "OPT_MOREMIME")) return UUOPT_MOREMIME;
65 root 1.6 if (strEQ(name, "OPT_DOTDOT")) return UUOPT_DOTDOT;
66 root 1.1 case 'R':
67     if (strEQ(name, "RET_CANCEL")) return UURET_CANCEL;
68     if (strEQ(name, "RET_CONT")) return UURET_CONT;
69     if (strEQ(name, "RET_EXISTS")) return UURET_EXISTS;
70     if (strEQ(name, "RET_ILLVAL")) return UURET_ILLVAL;
71     if (strEQ(name, "RET_IOERR")) return UURET_IOERR;
72     if (strEQ(name, "RET_NODATA")) return UURET_NODATA;
73     if (strEQ(name, "RET_NOEND")) return UURET_NOEND;
74     if (strEQ(name, "RET_NOMEM")) return UURET_NOMEM;
75     if (strEQ(name, "RET_OK")) return UURET_OK;
76     if (strEQ(name, "RET_UNSUP")) return UURET_UNSUP;
77     case 'B':
78 root 1.7 if (strEQ(name, "B64_ENCODED")) return B64ENCODED;
79 root 1.1 if (strEQ(name, "BH_ENCODED")) return BH_ENCODED;
80     case 'P':
81     if (strEQ(name, "PT_ENCODED")) return PT_ENCODED;
82     case 'Q':
83     if (strEQ(name, "QP_ENCODED")) return QP_ENCODED;
84     case 'U':
85     if (strEQ(name, "UU_ENCODED")) return UU_ENCODED;
86     case 'X':
87     if (strEQ(name, "XX_ENCODED")) return XX_ENCODED;
88 root 1.3 case 'Y':
89     if (strEQ(name, "YENC_ENCODED")) return YENC_ENCODED;
90 root 1.1 }
91     errno = EINVAL;
92     return 0;
93     }
94    
95     static void uu_msg_callback (void *cb, char *msg, int level)
96     {
97     dSP;
98    
99     ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,2);
100    
101     PUSHs(sv_2mortal(newSVpv(msg,0)));
102     PUSHs(sv_2mortal(newSViv(level)));
103    
104     PUTBACK; (void) perl_call_sv ((SV *)cb, G_VOID|G_DISCARD); SPAGAIN;
105     PUTBACK; FREETMPS; LEAVE;
106     }
107    
108     static int uu_busy_callback (void *cb, uuprogress *uup)
109     {
110     dSP;
111     int count;
112     int retval;
113    
114     ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,6);
115    
116     PUSHs(sv_2mortal(newSViv(uup->action)));
117     PUSHs(sv_2mortal(newSVpv(uup->curfile,0)));
118     PUSHs(sv_2mortal(newSViv(uup->partno)));
119     PUSHs(sv_2mortal(newSViv(uup->numparts)));
120     PUSHs(sv_2mortal(newSViv(uup->fsize)));
121     PUSHs(sv_2mortal(newSViv(uup->percent)));
122    
123     PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
124    
125     if (count != 1)
126     croak ("busycallback perl callback returned more than one argument");
127    
128     retval = POPi;
129    
130     PUTBACK; FREETMPS; LEAVE;
131    
132     return retval;
133     }
134    
135     static char *uu_fnamefilter_callback (void *cb, char *fname)
136     {
137     dSP;
138     int count;
139     static char *str;
140    
141     ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,1);
142    
143     PUSHs(sv_2mortal(newSVpv(fname,0)));
144    
145     PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
146    
147     if (count != 1)
148     croak ("fnamefilter perl callback returned more than one argument");
149    
150 root 1.4 _FP_free(str); str = _FP_strdup (POPp);
151 root 1.1
152     PUTBACK; FREETMPS; LEAVE;
153    
154     return str;
155     }
156    
157     static int uu_file_callback (void *cb, char *id, char *fname, int retrieve)
158     {
159     dSP;
160     int count;
161     int retval;
162     SV *xfname = newSVpv ("", 0);
163     STRLEN dc;
164    
165     ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,3);
166    
167     PUSHs(sv_2mortal(newSVpv(id,0)));
168     PUSHs(sv_2mortal(xfname));
169     PUSHs(sv_2mortal(newSViv(retrieve)));
170    
171     PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
172    
173     if (count != 1)
174     croak ("filecallback perl callback returned more than one argument");
175    
176     strcpy (fname, SvPV (xfname, dc));
177    
178     retval = POPi;
179    
180     PUTBACK; FREETMPS; LEAVE;
181    
182     return retval;
183     }
184    
185 root 1.5 static char *uu_filename_callback (void *cb, char *subject, char *filename)
186     {
187     dSP;
188     int count;
189     SV *retval;
190     STRLEN dc;
191    
192     ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,3);
193    
194     PUSHs(sv_2mortal(newSVpv(subject, 0)));
195     PUSHs(filename ? sv_2mortal(newSVpv(filename, 0)) : &PL_sv_undef);
196    
197     PUTBACK; count = perl_call_sv ((SV *)cb, G_ARRAY); SPAGAIN;
198    
199     if (count > 1)
200     croak ("filenamecallback perl callback returned more than one argument");
201    
202     if (count)
203     {
204     _FP_free (filename);
205    
206     retval = POPs;
207    
208     if (SvOK (retval))
209     {
210     STRLEN len;
211     char *fn = SvPV (retval, len);
212    
213     filename = malloc (len + 1);
214    
215     if (filename)
216     {
217     memcpy (filename, fn, len);
218     filename[len] = 0;
219     }
220     }
221     else
222     filename = 0;
223     }
224    
225     PUTBACK; FREETMPS; LEAVE;
226    
227     return filename;
228     }
229    
230     static SV *uu_msg_sv, *uu_busy_sv, *uu_file_sv, *uu_fnamefilter_sv, *uu_filename_sv;
231 root 1.1
232     #define FUNC_CB(cb) (void *)(sv_setsv (cb ## _sv, func), cb ## _sv), func ? cb ## _callback : NULL
233    
234     static int uu_info_file(void *cb, char *info)
235     {
236     dSP;
237     int count;
238     int retval;
239    
240     ENTER; SAVETMPS; PUSHMARK(SP); EXTEND(SP,1);
241    
242     PUSHs(sv_2mortal(newSVpv(info,0)));
243    
244     PUTBACK; count = perl_call_sv ((SV *)cb, G_SCALAR); SPAGAIN;
245    
246     if (count != 1)
247     croak ("info_file perl callback returned more than one argument");
248    
249     retval = POPi;
250    
251     PUTBACK; FREETMPS; LEAVE;
252    
253     return retval;
254     }
255    
256     static int
257     uu_opt_isstring (int opt)
258     {
259     switch (opt)
260     {
261     case UUOPT_VERSION:
262     case UUOPT_SAVEPATH:
263     case UUOPT_ENCEXT:
264     return 1;
265     default:
266     return 0;
267     }
268     }
269    
270     static int uu_initialized;
271    
272     MODULE = Convert::UUlib PACKAGE = Convert::UUlib PREFIX = UU
273    
274     PROTOTYPES: ENABLE
275    
276     int
277     constant(name)
278     char * name
279    
280    
281     void
282     UUInitialize()
283     CODE:
284     if (!uu_initialized)
285     {
286     int retval;
287    
288     if ((retval = UUInitialize ()) != UURET_OK)
289     croak ("unable to initialize uudeview library (%s)", UUstrerror (retval));
290    
291     uu_initialized = 1;
292     }
293    
294     void
295     UUCleanUp()
296     CODE:
297     if (uu_initialized)
298     UUCleanUp ();
299    
300     uu_initialized = 0;
301    
302     SV *
303     UUGetOption(opt)
304     int opt
305     CODE:
306     {
307     if (opt == UUOPT_PROGRESS)
308     croak ("GetOption(UUOPT_PROGRESS) is not yet implemented");
309     else if (uu_opt_isstring (opt))
310     {
311     char cval[8192];
312    
313     UUGetOption (opt, 0, cval, sizeof cval);
314     RETVAL = newSVpv (cval, 0);
315     }
316     else
317     {
318     RETVAL = newSViv (UUGetOption (opt, 0, 0, 0));
319     }
320     }
321     OUTPUT:
322     RETVAL
323    
324     int
325     UUSetOption(opt,val)
326     int opt
327     SV * val
328     CODE:
329     {
330     STRLEN dc;
331    
332     if (uu_opt_isstring (opt))
333     RETVAL = UUSetOption (opt, 0, SvPV (val, dc));
334     else
335     RETVAL = UUSetOption (opt, SvIV (val), (void *)0);
336     }
337     OUTPUT:
338     RETVAL
339    
340     char *
341     UUstrerror(errcode)
342     int errcode
343    
344     void
345     UUSetMsgCallback(func=0)
346     SV * func
347     CODE:
348     UUSetMsgCallback (FUNC_CB(uu_msg));
349    
350     void
351     UUSetBusyCallback(func=0,msecs=1000)
352     SV * func
353     long msecs
354     CODE:
355     UUSetBusyCallback (FUNC_CB(uu_busy), msecs);
356    
357     void
358     UUSetFileCallback(func=0)
359     SV * func
360     CODE:
361     UUSetFileCallback (FUNC_CB(uu_file));
362    
363     void
364     UUSetFNameFilter(func=0)
365     SV * func
366     CODE:
367     UUSetFNameFilter (FUNC_CB(uu_fnamefilter));
368    
369 root 1.5 void
370     UUSetFileNameCallback(func=0)
371     SV * func
372     CODE:
373     UUSetFileNameCallback (FUNC_CB(uu_filename));
374    
375 root 1.1 char *
376     UUFNameFilter(fname)
377     char * fname
378    
379     void
380     UULoadFile(fname,id=0,delflag=0)
381     char * fname
382     char * id
383     int delflag
384     PPCODE:
385     {
386     int count;
387    
388     XPUSHs(sv_2mortal(newSViv(UULoadFile (fname, id, delflag, &count))));
389     if (GIMME_V == G_ARRAY)
390     XPUSHs(sv_2mortal(newSViv(count)));
391     }
392    
393     int
394     UUSmerge(pass)
395     int pass
396    
397     int
398     UUQuickDecode(datain,dataout,boundary,maxpos)
399     FILE * datain
400     FILE * dataout
401     char * boundary
402     long maxpos
403    
404     int
405     UUEncodeMulti(outfile,infile,infname,encoding,outfname,mimetype,filemode)
406     FILE * outfile
407     FILE * infile
408     char * infname
409     int encoding
410     char * outfname
411     char * mimetype
412     int filemode
413    
414     int
415     UUEncodePartial(outfile,infile,infname,encoding,outfname,mimetype,filemode,partno,linperfile)
416     FILE * outfile
417     FILE * infile
418     char * infname
419     int encoding
420     char * outfname
421     char * mimetype
422     int filemode
423     int partno
424     long linperfile
425    
426     int
427     UUEncodeToStream(outfile,infile,infname,encoding,outfname,filemode)
428     FILE * outfile
429     FILE * infile
430     char * infname
431     int encoding
432     char * outfname
433     int filemode
434    
435     int
436     UUEncodeToFile(infile,infname,encoding,outfname,diskname,linperfile)
437     FILE * infile
438     char * infname
439     int encoding
440     char * outfname
441     char * diskname
442     long linperfile
443    
444     int
445     UUE_PrepSingle(outfile,infile,infname,encoding,outfname,filemode,destination,from,subject,isemail)
446     FILE * outfile
447     FILE * infile
448     char * infname
449     int encoding
450     char * outfname
451     int filemode
452     char * destination
453     char * from
454     char * subject
455     int isemail
456    
457     int
458     UUE_PrepPartial(outfile,infile,infname,encoding,outfname,filemode,partno,linperfile,filesize,destination,from,subject,isemail)
459     FILE * outfile
460     FILE * infile
461     char * infname
462     int encoding
463     char * outfname
464     int filemode
465     int partno
466     long linperfile
467     long filesize
468     char * destination
469     char * from
470     char * subject
471     int isemail
472    
473     uulist *
474     UUGetFileListItem(num)
475     int num
476    
477     int
478     UURenameFile(item,newname)
479     uulist *item
480     char * newname
481     ALIAS:
482     Convert::UUlib::Item::rename = 1
483    
484     int
485     UUDecodeToTemp(item)
486     uulist *item
487     ALIAS:
488     Convert::UUlib::Item::decode_temp = 1
489    
490     int
491     UURemoveTemp(item)
492     uulist *item
493     ALIAS:
494     Convert::UUlib::Item::remove_temp = 1
495    
496     int
497     UUDecodeFile(item,target=0)
498     uulist *item
499     char * target
500     ALIAS:
501     Convert::UUlib::Item::decode = 1
502    
503     void
504     UUInfoFile(item,func)
505     uulist *item
506     SV * func
507     CODE:
508     UUInfoFile(item,(void *)func,uu_info_file);
509     ALIAS:
510     Convert::UUlib::Item::info = 1
511    
512     MODULE = Convert::UUlib PACKAGE = Convert::UUlib::Item
513    
514     short
515     state(li)
516     uulist *li
517     CODE:
518     RETVAL = li->state;
519     OUTPUT:
520     RETVAL
521    
522     short
523     mode(li,newmode=0)
524     uulist *li
525     short newmode
526     CODE:
527     if (newmode)
528     li->mode = newmode;
529     RETVAL = li->mode;
530     OUTPUT:
531     RETVAL
532    
533     short
534     uudet(li)
535     uulist *li
536     CODE:
537     RETVAL = li->uudet;
538     OUTPUT:
539     RETVAL
540    
541     long
542     size(li)
543     uulist *li
544     CODE:
545     RETVAL = li->size;
546     OUTPUT:
547     RETVAL
548    
549     char *
550     filename(li,newfilename=0)
551     uulist *li
552     char * newfilename
553     CODE:
554     if (newfilename)
555     {
556 root 1.4 _FP_free (li->filename);
557     li->filename = _FP_strdup (newfilename);
558 root 1.1 }
559     RETVAL = li->filename;
560     OUTPUT:
561     RETVAL
562    
563     char *
564     subfname(li)
565     uulist *li
566     CODE:
567     RETVAL = li->subfname;
568     OUTPUT:
569     RETVAL
570    
571     char *
572     mimeid(li)
573     uulist *li
574     CODE:
575     RETVAL = li->mimeid;
576     OUTPUT:
577     RETVAL
578    
579     char *
580     mimetype(li)
581     uulist *li
582     CODE:
583     RETVAL = li->mimetype;
584     OUTPUT:
585     RETVAL
586    
587     char *
588     binfile(li)
589     uulist *li
590     CODE:
591     RETVAL = li->binfile;
592     OUTPUT:
593     RETVAL
594    
595     # functions accessing internal data(!)
596    
597     void
598     parts(li)
599     uulist *li
600     PPCODE:
601     {
602     struct _uufile *p = li->thisfile;
603    
604     while (p)
605     {
606     HV *pi = newHV ();
607    
608     hv_store (pi, "partno" , 6, newSViv (p->partno) , 0);
609    
610     if (p->filename)
611     hv_store (pi, "filename", 8, newSVpv (p->filename, 0) , 0);
612     if(p->subfname)
613     hv_store (pi, "subfname", 8, newSVpv (p->subfname, 0) , 0);
614     if(p->mimeid)
615     hv_store (pi, "mimeid" , 6, newSVpv (p->mimeid , 0) , 0);
616     if(p->mimetype)
617     hv_store (pi, "mimetype", 8, newSVpv (p->mimetype, 0) , 0);
618     if (p->data->subject)
619     hv_store (pi, "subject" , 7, newSVpv (p->data->subject,0), 0);
620     if (p->data->origin)
621     hv_store (pi, "origin" , 6, newSVpv (p->data->origin ,0), 0);
622     if (p->data->sfname)
623     hv_store (pi, "sfname" , 6, newSVpv (p->data->sfname ,0), 0);
624    
625     XPUSHs (sv_2mortal (newRV_noinc ((SV *)pi)));
626    
627     p = p->NEXT;
628     }
629     }
630    
631     BOOT:
632 root 1.5 uu_msg_sv = newSVsv(&PL_sv_undef);
633     uu_busy_sv = newSVsv(&PL_sv_undef);
634     uu_file_sv = newSVsv(&PL_sv_undef);
635     uu_fnamefilter_sv = newSVsv(&PL_sv_undef);
636     uu_filename_sv = newSVsv(&PL_sv_undef);
637 root 1.1