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