ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-UUlib/UUlib.xs
Revision: 1.1
Committed: Mon Jun 11 19:48:55 2001 UTC (22 years, 11 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

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