Imported Upstream version 3.3.1
[debian/amanda] / perl / Amanda / Archive.c
1 /* ----------------------------------------------------------------------------
2  * This file was automatically generated by SWIG (http://www.swig.org).
3  * Version 2.0.4
4  * 
5  * This file is not intended to be easily readable and contains a number of 
6  * coding conventions designed to improve portability and efficiency. Do not make
7  * changes to this file unless you know what you are doing--modify the SWIG 
8  * interface file instead. 
9  * ----------------------------------------------------------------------------- */
10
11 #include "../config/config.h"
12
13
14 #define SWIGPERL
15 #define SWIG_CASTRANK_MODE
16
17 /* -----------------------------------------------------------------------------
18  *  This section contains generic SWIG labels for method/variable
19  *  declarations/attributes, and other compiler dependent labels.
20  * ----------------------------------------------------------------------------- */
21
22 /* template workaround for compilers that cannot correctly implement the C++ standard */
23 #ifndef SWIGTEMPLATEDISAMBIGUATOR
24 # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
25 #  define SWIGTEMPLATEDISAMBIGUATOR template
26 # elif defined(__HP_aCC)
27 /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
28 /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
29 #  define SWIGTEMPLATEDISAMBIGUATOR template
30 # else
31 #  define SWIGTEMPLATEDISAMBIGUATOR
32 # endif
33 #endif
34
35 /* inline attribute */
36 #ifndef SWIGINLINE
37 # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
38 #   define SWIGINLINE inline
39 # else
40 #   define SWIGINLINE
41 # endif
42 #endif
43
44 /* attribute recognised by some compilers to avoid 'unused' warnings */
45 #ifndef SWIGUNUSED
46 # if defined(__GNUC__)
47 #   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
48 #     define SWIGUNUSED __attribute__ ((__unused__)) 
49 #   else
50 #     define SWIGUNUSED
51 #   endif
52 # elif defined(__ICC)
53 #   define SWIGUNUSED __attribute__ ((__unused__)) 
54 # else
55 #   define SWIGUNUSED 
56 # endif
57 #endif
58
59 #ifndef SWIG_MSC_UNSUPPRESS_4505
60 # if defined(_MSC_VER)
61 #   pragma warning(disable : 4505) /* unreferenced local function has been removed */
62 # endif 
63 #endif
64
65 #ifndef SWIGUNUSEDPARM
66 # ifdef __cplusplus
67 #   define SWIGUNUSEDPARM(p)
68 # else
69 #   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
70 # endif
71 #endif
72
73 /* internal SWIG method */
74 #ifndef SWIGINTERN
75 # define SWIGINTERN static SWIGUNUSED
76 #endif
77
78 /* internal inline SWIG method */
79 #ifndef SWIGINTERNINLINE
80 # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
81 #endif
82
83 /* exporting methods */
84 #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
85 #  ifndef GCC_HASCLASSVISIBILITY
86 #    define GCC_HASCLASSVISIBILITY
87 #  endif
88 #endif
89
90 #ifndef SWIGEXPORT
91 # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
92 #   if defined(STATIC_LINKED)
93 #     define SWIGEXPORT
94 #   else
95 #     define SWIGEXPORT __declspec(dllexport)
96 #   endif
97 # else
98 #   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
99 #     define SWIGEXPORT __attribute__ ((visibility("default")))
100 #   else
101 #     define SWIGEXPORT
102 #   endif
103 # endif
104 #endif
105
106 /* calling conventions for Windows */
107 #ifndef SWIGSTDCALL
108 # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
109 #   define SWIGSTDCALL __stdcall
110 # else
111 #   define SWIGSTDCALL
112 # endif 
113 #endif
114
115 /* Deal with Microsoft's attempt at deprecating C standard runtime functions */
116 #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
117 # define _CRT_SECURE_NO_DEPRECATE
118 #endif
119
120 /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
121 #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
122 # define _SCL_SECURE_NO_DEPRECATE
123 #endif
124
125
126 /* -----------------------------------------------------------------------------
127  * swigrun.swg
128  *
129  * This file contains generic C API SWIG runtime support for pointer
130  * type checking.
131  * ----------------------------------------------------------------------------- */
132
133 /* This should only be incremented when either the layout of swig_type_info changes,
134    or for whatever reason, the runtime changes incompatibly */
135 #define SWIG_RUNTIME_VERSION "4"
136
137 /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
138 #ifdef SWIG_TYPE_TABLE
139 # define SWIG_QUOTE_STRING(x) #x
140 # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
141 # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
142 #else
143 # define SWIG_TYPE_TABLE_NAME
144 #endif
145
146 /*
147   You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
148   creating a static or dynamic library from the SWIG runtime code.
149   In 99.9% of the cases, SWIG just needs to declare them as 'static'.
150   
151   But only do this if strictly necessary, ie, if you have problems
152   with your compiler or suchlike.
153 */
154
155 #ifndef SWIGRUNTIME
156 # define SWIGRUNTIME SWIGINTERN
157 #endif
158
159 #ifndef SWIGRUNTIMEINLINE
160 # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
161 #endif
162
163 /*  Generic buffer size */
164 #ifndef SWIG_BUFFER_SIZE
165 # define SWIG_BUFFER_SIZE 1024
166 #endif
167
168 /* Flags for pointer conversions */
169 #define SWIG_POINTER_DISOWN        0x1
170 #define SWIG_CAST_NEW_MEMORY       0x2
171
172 /* Flags for new pointer objects */
173 #define SWIG_POINTER_OWN           0x1
174
175
176 /* 
177    Flags/methods for returning states.
178    
179    The SWIG conversion methods, as ConvertPtr, return an integer 
180    that tells if the conversion was successful or not. And if not,
181    an error code can be returned (see swigerrors.swg for the codes).
182    
183    Use the following macros/flags to set or process the returning
184    states.
185    
186    In old versions of SWIG, code such as the following was usually written:
187
188      if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
189        // success code
190      } else {
191        //fail code
192      }
193
194    Now you can be more explicit:
195
196     int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
197     if (SWIG_IsOK(res)) {
198       // success code
199     } else {
200       // fail code
201     }
202
203    which is the same really, but now you can also do
204
205     Type *ptr;
206     int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
207     if (SWIG_IsOK(res)) {
208       // success code
209       if (SWIG_IsNewObj(res) {
210         ...
211         delete *ptr;
212       } else {
213         ...
214       }
215     } else {
216       // fail code
217     }
218     
219    I.e., now SWIG_ConvertPtr can return new objects and you can
220    identify the case and take care of the deallocation. Of course that
221    also requires SWIG_ConvertPtr to return new result values, such as
222
223       int SWIG_ConvertPtr(obj, ptr,...) {         
224         if (<obj is ok>) {                             
225           if (<need new object>) {                     
226             *ptr = <ptr to new allocated object>; 
227             return SWIG_NEWOBJ;                
228           } else {                                     
229             *ptr = <ptr to old object>;        
230             return SWIG_OLDOBJ;                
231           }                                    
232         } else {                                       
233           return SWIG_BADOBJ;                  
234         }                                              
235       }
236
237    Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
238    more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
239    SWIG errors code.
240
241    Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
242    allows to return the 'cast rank', for example, if you have this
243
244        int food(double)
245        int fooi(int);
246
247    and you call
248  
249       food(1)   // cast rank '1'  (1 -> 1.0)
250       fooi(1)   // cast rank '0'
251
252    just use the SWIG_AddCast()/SWIG_CheckState()
253 */
254
255 #define SWIG_OK                    (0) 
256 #define SWIG_ERROR                 (-1)
257 #define SWIG_IsOK(r)               (r >= 0)
258 #define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)  
259
260 /* The CastRankLimit says how many bits are used for the cast rank */
261 #define SWIG_CASTRANKLIMIT         (1 << 8)
262 /* The NewMask denotes the object was created (using new/malloc) */
263 #define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
264 /* The TmpMask is for in/out typemaps that use temporal objects */
265 #define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
266 /* Simple returning values */
267 #define SWIG_BADOBJ                (SWIG_ERROR)
268 #define SWIG_OLDOBJ                (SWIG_OK)
269 #define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
270 #define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
271 /* Check, add and del mask methods */
272 #define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
273 #define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
274 #define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
275 #define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
276 #define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
277 #define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
278
279 /* Cast-Rank Mode */
280 #if defined(SWIG_CASTRANK_MODE)
281 #  ifndef SWIG_TypeRank
282 #    define SWIG_TypeRank             unsigned long
283 #  endif
284 #  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
285 #    define SWIG_MAXCASTRANK          (2)
286 #  endif
287 #  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
288 #  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
289 SWIGINTERNINLINE int SWIG_AddCast(int r) { 
290   return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
291 }
292 SWIGINTERNINLINE int SWIG_CheckState(int r) { 
293   return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; 
294 }
295 #else /* no cast-rank mode */
296 #  define SWIG_AddCast
297 #  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
298 #endif
299
300
301 #include <string.h>
302
303 #ifdef __cplusplus
304 extern "C" {
305 #endif
306
307 typedef void *(*swig_converter_func)(void *, int *);
308 typedef struct swig_type_info *(*swig_dycast_func)(void **);
309
310 /* Structure to store information on one type */
311 typedef struct swig_type_info {
312   const char             *name;                 /* mangled name of this type */
313   const char             *str;                  /* human readable name of this type */
314   swig_dycast_func        dcast;                /* dynamic cast function down a hierarchy */
315   struct swig_cast_info  *cast;                 /* linked list of types that can cast into this type */
316   void                   *clientdata;           /* language specific type data */
317   int                    owndata;               /* flag if the structure owns the clientdata */
318 } swig_type_info;
319
320 /* Structure to store a type and conversion function used for casting */
321 typedef struct swig_cast_info {
322   swig_type_info         *type;                 /* pointer to type that is equivalent to this type */
323   swig_converter_func     converter;            /* function to cast the void pointers */
324   struct swig_cast_info  *next;                 /* pointer to next cast in linked list */
325   struct swig_cast_info  *prev;                 /* pointer to the previous cast */
326 } swig_cast_info;
327
328 /* Structure used to store module information
329  * Each module generates one structure like this, and the runtime collects
330  * all of these structures and stores them in a circularly linked list.*/
331 typedef struct swig_module_info {
332   swig_type_info         **types;               /* Array of pointers to swig_type_info structures that are in this module */
333   size_t                 size;                  /* Number of types in this module */
334   struct swig_module_info *next;                /* Pointer to next element in circularly linked list */
335   swig_type_info         **type_initial;        /* Array of initially generated type structures */
336   swig_cast_info         **cast_initial;        /* Array of initially generated casting structures */
337   void                    *clientdata;          /* Language specific module data */
338 } swig_module_info;
339
340 /* 
341   Compare two type names skipping the space characters, therefore
342   "char*" == "char *" and "Class<int>" == "Class<int >", etc.
343
344   Return 0 when the two name types are equivalent, as in
345   strncmp, but skipping ' '.
346 */
347 SWIGRUNTIME int
348 SWIG_TypeNameComp(const char *f1, const char *l1,
349                   const char *f2, const char *l2) {
350   for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
351     while ((*f1 == ' ') && (f1 != l1)) ++f1;
352     while ((*f2 == ' ') && (f2 != l2)) ++f2;
353     if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
354   }
355   return (int)((l1 - f1) - (l2 - f2));
356 }
357
358 /*
359   Check type equivalence in a name list like <name1>|<name2>|...
360   Return 0 if not equal, 1 if equal
361 */
362 SWIGRUNTIME int
363 SWIG_TypeEquiv(const char *nb, const char *tb) {
364   int equiv = 0;
365   const char* te = tb + strlen(tb);
366   const char* ne = nb;
367   while (!equiv && *ne) {
368     for (nb = ne; *ne; ++ne) {
369       if (*ne == '|') break;
370     }
371     equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
372     if (*ne) ++ne;
373   }
374   return equiv;
375 }
376
377 /*
378   Check type equivalence in a name list like <name1>|<name2>|...
379   Return 0 if equal, -1 if nb < tb, 1 if nb > tb
380 */
381 SWIGRUNTIME int
382 SWIG_TypeCompare(const char *nb, const char *tb) {
383   int equiv = 0;
384   const char* te = tb + strlen(tb);
385   const char* ne = nb;
386   while (!equiv && *ne) {
387     for (nb = ne; *ne; ++ne) {
388       if (*ne == '|') break;
389     }
390     equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
391     if (*ne) ++ne;
392   }
393   return equiv;
394 }
395
396
397 /*
398   Check the typename
399 */
400 SWIGRUNTIME swig_cast_info *
401 SWIG_TypeCheck(const char *c, swig_type_info *ty) {
402   if (ty) {
403     swig_cast_info *iter = ty->cast;
404     while (iter) {
405       if (strcmp(iter->type->name, c) == 0) {
406         if (iter == ty->cast)
407           return iter;
408         /* Move iter to the top of the linked list */
409         iter->prev->next = iter->next;
410         if (iter->next)
411           iter->next->prev = iter->prev;
412         iter->next = ty->cast;
413         iter->prev = 0;
414         if (ty->cast) ty->cast->prev = iter;
415         ty->cast = iter;
416         return iter;
417       }
418       iter = iter->next;
419     }
420   }
421   return 0;
422 }
423
424 /* 
425   Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
426 */
427 SWIGRUNTIME swig_cast_info *
428 SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
429   if (ty) {
430     swig_cast_info *iter = ty->cast;
431     while (iter) {
432       if (iter->type == from) {
433         if (iter == ty->cast)
434           return iter;
435         /* Move iter to the top of the linked list */
436         iter->prev->next = iter->next;
437         if (iter->next)
438           iter->next->prev = iter->prev;
439         iter->next = ty->cast;
440         iter->prev = 0;
441         if (ty->cast) ty->cast->prev = iter;
442         ty->cast = iter;
443         return iter;
444       }
445       iter = iter->next;
446     }
447   }
448   return 0;
449 }
450
451 /*
452   Cast a pointer up an inheritance hierarchy
453 */
454 SWIGRUNTIMEINLINE void *
455 SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
456   return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
457 }
458
459 /* 
460    Dynamic pointer casting. Down an inheritance hierarchy
461 */
462 SWIGRUNTIME swig_type_info *
463 SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
464   swig_type_info *lastty = ty;
465   if (!ty || !ty->dcast) return ty;
466   while (ty && (ty->dcast)) {
467     ty = (*ty->dcast)(ptr);
468     if (ty) lastty = ty;
469   }
470   return lastty;
471 }
472
473 /*
474   Return the name associated with this type
475 */
476 SWIGRUNTIMEINLINE const char *
477 SWIG_TypeName(const swig_type_info *ty) {
478   return ty->name;
479 }
480
481 /*
482   Return the pretty name associated with this type,
483   that is an unmangled type name in a form presentable to the user.
484 */
485 SWIGRUNTIME const char *
486 SWIG_TypePrettyName(const swig_type_info *type) {
487   /* The "str" field contains the equivalent pretty names of the
488      type, separated by vertical-bar characters.  We choose
489      to print the last name, as it is often (?) the most
490      specific. */
491   if (!type) return NULL;
492   if (type->str != NULL) {
493     const char *last_name = type->str;
494     const char *s;
495     for (s = type->str; *s; s++)
496       if (*s == '|') last_name = s+1;
497     return last_name;
498   }
499   else
500     return type->name;
501 }
502
503 /* 
504    Set the clientdata field for a type
505 */
506 SWIGRUNTIME void
507 SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
508   swig_cast_info *cast = ti->cast;
509   /* if (ti->clientdata == clientdata) return; */
510   ti->clientdata = clientdata;
511   
512   while (cast) {
513     if (!cast->converter) {
514       swig_type_info *tc = cast->type;
515       if (!tc->clientdata) {
516         SWIG_TypeClientData(tc, clientdata);
517       }
518     }    
519     cast = cast->next;
520   }
521 }
522 SWIGRUNTIME void
523 SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
524   SWIG_TypeClientData(ti, clientdata);
525   ti->owndata = 1;
526 }
527   
528 /*
529   Search for a swig_type_info structure only by mangled name
530   Search is a O(log #types)
531   
532   We start searching at module start, and finish searching when start == end.  
533   Note: if start == end at the beginning of the function, we go all the way around
534   the circular list.
535 */
536 SWIGRUNTIME swig_type_info *
537 SWIG_MangledTypeQueryModule(swig_module_info *start, 
538                             swig_module_info *end, 
539                             const char *name) {
540   swig_module_info *iter = start;
541   do {
542     if (iter->size) {
543       register size_t l = 0;
544       register size_t r = iter->size - 1;
545       do {
546         /* since l+r >= 0, we can (>> 1) instead (/ 2) */
547         register size_t i = (l + r) >> 1; 
548         const char *iname = iter->types[i]->name;
549         if (iname) {
550           register int compare = strcmp(name, iname);
551           if (compare == 0) {       
552             return iter->types[i];
553           } else if (compare < 0) {
554             if (i) {
555               r = i - 1;
556             } else {
557               break;
558             }
559           } else if (compare > 0) {
560             l = i + 1;
561           }
562         } else {
563           break; /* should never happen */
564         }
565       } while (l <= r);
566     }
567     iter = iter->next;
568   } while (iter != end);
569   return 0;
570 }
571
572 /*
573   Search for a swig_type_info structure for either a mangled name or a human readable name.
574   It first searches the mangled names of the types, which is a O(log #types)
575   If a type is not found it then searches the human readable names, which is O(#types).
576   
577   We start searching at module start, and finish searching when start == end.  
578   Note: if start == end at the beginning of the function, we go all the way around
579   the circular list.
580 */
581 SWIGRUNTIME swig_type_info *
582 SWIG_TypeQueryModule(swig_module_info *start, 
583                      swig_module_info *end, 
584                      const char *name) {
585   /* STEP 1: Search the name field using binary search */
586   swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
587   if (ret) {
588     return ret;
589   } else {
590     /* STEP 2: If the type hasn't been found, do a complete search
591        of the str field (the human readable name) */
592     swig_module_info *iter = start;
593     do {
594       register size_t i = 0;
595       for (; i < iter->size; ++i) {
596         if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
597           return iter->types[i];
598       }
599       iter = iter->next;
600     } while (iter != end);
601   }
602   
603   /* neither found a match */
604   return 0;
605 }
606
607 /* 
608    Pack binary data into a string
609 */
610 SWIGRUNTIME char *
611 SWIG_PackData(char *c, void *ptr, size_t sz) {
612   static const char hex[17] = "0123456789abcdef";
613   register const unsigned char *u = (unsigned char *) ptr;
614   register const unsigned char *eu =  u + sz;
615   for (; u != eu; ++u) {
616     register unsigned char uu = *u;
617     *(c++) = hex[(uu & 0xf0) >> 4];
618     *(c++) = hex[uu & 0xf];
619   }
620   return c;
621 }
622
623 /* 
624    Unpack binary data from a string
625 */
626 SWIGRUNTIME const char *
627 SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
628   register unsigned char *u = (unsigned char *) ptr;
629   register const unsigned char *eu = u + sz;
630   for (; u != eu; ++u) {
631     register char d = *(c++);
632     register unsigned char uu;
633     if ((d >= '0') && (d <= '9'))
634       uu = ((d - '0') << 4);
635     else if ((d >= 'a') && (d <= 'f'))
636       uu = ((d - ('a'-10)) << 4);
637     else 
638       return (char *) 0;
639     d = *(c++);
640     if ((d >= '0') && (d <= '9'))
641       uu |= (d - '0');
642     else if ((d >= 'a') && (d <= 'f'))
643       uu |= (d - ('a'-10));
644     else 
645       return (char *) 0;
646     *u = uu;
647   }
648   return c;
649 }
650
651 /* 
652    Pack 'void *' into a string buffer.
653 */
654 SWIGRUNTIME char *
655 SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
656   char *r = buff;
657   if ((2*sizeof(void *) + 2) > bsz) return 0;
658   *(r++) = '_';
659   r = SWIG_PackData(r,&ptr,sizeof(void *));
660   if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
661   strcpy(r,name);
662   return buff;
663 }
664
665 SWIGRUNTIME const char *
666 SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
667   if (*c != '_') {
668     if (strcmp(c,"NULL") == 0) {
669       *ptr = (void *) 0;
670       return name;
671     } else {
672       return 0;
673     }
674   }
675   return SWIG_UnpackData(++c,ptr,sizeof(void *));
676 }
677
678 SWIGRUNTIME char *
679 SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
680   char *r = buff;
681   size_t lname = (name ? strlen(name) : 0);
682   if ((2*sz + 2 + lname) > bsz) return 0;
683   *(r++) = '_';
684   r = SWIG_PackData(r,ptr,sz);
685   if (lname) {
686     strncpy(r,name,lname+1);
687   } else {
688     *r = 0;
689   }
690   return buff;
691 }
692
693 SWIGRUNTIME const char *
694 SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
695   if (*c != '_') {
696     if (strcmp(c,"NULL") == 0) {
697       memset(ptr,0,sz);
698       return name;
699     } else {
700       return 0;
701     }
702   }
703   return SWIG_UnpackData(++c,ptr,sz);
704 }
705
706 #ifdef __cplusplus
707 }
708 #endif
709
710 /*  Errors in SWIG */
711 #define  SWIG_UnknownError         -1 
712 #define  SWIG_IOError              -2 
713 #define  SWIG_RuntimeError         -3 
714 #define  SWIG_IndexError           -4 
715 #define  SWIG_TypeError            -5 
716 #define  SWIG_DivisionByZero       -6 
717 #define  SWIG_OverflowError        -7 
718 #define  SWIG_SyntaxError          -8 
719 #define  SWIG_ValueError           -9 
720 #define  SWIG_SystemError          -10
721 #define  SWIG_AttributeError       -11
722 #define  SWIG_MemoryError          -12 
723 #define  SWIG_NullReferenceError   -13
724
725
726
727 #ifdef __cplusplus
728 /* Needed on some windows machines---since MS plays funny games with the header files under C++ */
729 #include <math.h>
730 #include <stdlib.h>
731 extern "C" {
732 #endif
733 #include "EXTERN.h"
734 #include "perl.h"
735 #include "XSUB.h"
736
737 /* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */
738
739 /* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */
740 #ifndef PERL_REVISION
741 #  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
742 #    define PERL_PATCHLEVEL_H_IMPLICIT
743 #    include <patchlevel.h>
744 #  endif
745 #  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
746 #    include <could_not_find_Perl_patchlevel.h>
747 #  endif
748 #  ifndef PERL_REVISION
749 #    define PERL_REVISION       (5)
750 #    define PERL_VERSION        PATCHLEVEL
751 #    define PERL_SUBVERSION     SUBVERSION
752 #  endif
753 #endif
754
755 #if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE)
756 #define PerlIO_exportFILE(fh,fl) (FILE*)(fh)
757 #endif
758
759 #ifndef SvIOK_UV
760 # define SvIOK_UV(sv)       (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv)))
761 #endif
762
763 #ifndef SvUOK
764 # define SvUOK(sv)           SvIOK_UV(sv)
765 #endif
766
767 #if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5)))
768 #  define PL_sv_undef               sv_undef
769 #  define PL_na                     na
770 #  define PL_errgv                  errgv
771 #  define PL_sv_no                  sv_no
772 #  define PL_sv_yes                 sv_yes
773 #  define PL_markstack_ptr          markstack_ptr
774 #endif
775
776 #ifndef IVSIZE
777 #  ifdef LONGSIZE
778 #    define IVSIZE LONGSIZE
779 #  else
780 #    define IVSIZE 4 /* A bold guess, but the best we can make. */
781 #  endif
782 #endif
783
784 #ifndef INT2PTR
785 #  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
786 #    define PTRV                  UV
787 #    define INT2PTR(any,d)        (any)(d)
788 #  else
789 #    if PTRSIZE == LONGSIZE
790 #      define PTRV                unsigned long
791 #    else
792 #      define PTRV                unsigned
793 #    endif
794 #    define INT2PTR(any,d)        (any)(PTRV)(d)
795 #  endif
796
797 #  define NUM2PTR(any,d)  (any)(PTRV)(d)
798 #  define PTR2IV(p)       INT2PTR(IV,p)
799 #  define PTR2UV(p)       INT2PTR(UV,p)
800 #  define PTR2NV(p)       NUM2PTR(NV,p)
801
802 #  if PTRSIZE == LONGSIZE
803 #    define PTR2ul(p)     (unsigned long)(p)
804 #  else
805 #    define PTR2ul(p)     INT2PTR(unsigned long,p)
806 #  endif
807 #endif /* !INT2PTR */
808
809 #ifndef SvPV_nolen
810 # define SvPV_nolen(x) SvPV(x,PL_na)
811 #endif
812
813 #ifndef get_sv
814 #  define get_sv perl_get_sv
815 #endif
816
817 #ifndef ERRSV
818 #  define ERRSV get_sv("@",FALSE)
819 #endif
820
821 #ifndef pTHX_
822 #define pTHX_
823 #endif   
824
825 #include <string.h>
826 #ifdef __cplusplus
827 }
828 #endif
829
830 /* -----------------------------------------------------------------------------
831  * error manipulation
832  * ----------------------------------------------------------------------------- */
833
834 SWIGINTERN const char*
835 SWIG_Perl_ErrorType(int code) {
836   const char* type = 0;
837   switch(code) {
838   case SWIG_MemoryError:
839     type = "MemoryError";
840     break;
841   case SWIG_IOError:
842     type = "IOError";
843     break;
844   case SWIG_RuntimeError:
845     type = "RuntimeError";
846     break;
847   case SWIG_IndexError:
848     type = "IndexError";
849     break;
850   case SWIG_TypeError:
851     type = "TypeError";
852     break;
853   case SWIG_DivisionByZero:
854     type = "ZeroDivisionError";
855     break;
856   case SWIG_OverflowError:
857     type = "OverflowError";
858     break;
859   case SWIG_SyntaxError:
860     type = "SyntaxError";
861     break;
862   case SWIG_ValueError:
863     type = "ValueError";
864     break;
865   case SWIG_SystemError:
866     type = "SystemError";
867     break;
868   case SWIG_AttributeError:
869     type = "AttributeError";
870     break;
871   default:
872     type = "RuntimeError";
873   }
874   return type;
875 }
876
877
878
879
880 /* -----------------------------------------------------------------------------
881  * perlrun.swg
882  *
883  * This file contains the runtime support for Perl modules
884  * and includes code for managing global variables and pointer
885  * type checking.
886  * ----------------------------------------------------------------------------- */
887
888 #ifdef PERL_OBJECT
889 #define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl),
890 #define SWIG_PERL_OBJECT_CALL pPerl,
891 #else
892 #define SWIG_PERL_OBJECT_DECL
893 #define SWIG_PERL_OBJECT_CALL
894 #endif
895
896 /* Common SWIG API */
897
898 /* for raw pointers */
899 #define SWIG_ConvertPtr(obj, pp, type, flags)           SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags)
900 #define SWIG_ConvertPtrAndOwn(obj, pp, type, flags,own) SWIG_Perl_ConvertPtrAndOwn(SWIG_PERL_OBJECT_CALL obj, pp, type, flags, own)
901 #define SWIG_NewPointerObj(p, type, flags)              SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags)
902
903 /* for raw packed data */
904 #define SWIG_ConvertPacked(obj, p, s, type)             SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type)
905 #define SWIG_NewPackedObj(p, s, type)                   SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type)
906
907 /* for class or struct pointers */
908 #define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
909 #define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
910
911 /* for C or C++ function pointers */
912 #define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_ConvertPtr(obj, pptr, type, 0)
913 #define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_NewPointerObj(ptr, type, 0)
914
915 /* for C++ member pointers, ie, member methods */
916 #define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_ConvertPacked(obj, ptr, sz, ty)
917 #define SWIG_NewMemberObj(ptr, sz, type)                SWIG_NewPackedObj(ptr, sz, type)
918
919
920 /* Runtime API */
921
922 #define SWIG_GetModule(clientdata)                      SWIG_Perl_GetModule()
923 #define SWIG_SetModule(clientdata, pointer)             SWIG_Perl_SetModule(pointer)
924
925
926 /* Error manipulation */
927
928 #define SWIG_ErrorType(code)                            SWIG_Perl_ErrorType(code)               
929 #define SWIG_Error(code, msg)                           sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg)
930 #define SWIG_fail                                       goto fail                                                   
931
932 /* Perl-specific SWIG API */
933
934 #define SWIG_MakePtr(sv, ptr, type, flags)              SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags)
935 #define SWIG_MakePackedObj(sv, p, s, type)              SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type)
936 #define SWIG_SetError(str)                              SWIG_Error(SWIG_RuntimeError, str)
937
938
939 #define SWIG_PERL_DECL_ARGS_1(arg1)                     (SWIG_PERL_OBJECT_DECL arg1)
940 #define SWIG_PERL_CALL_ARGS_1(arg1)                     (SWIG_PERL_OBJECT_CALL arg1)
941 #define SWIG_PERL_DECL_ARGS_2(arg1, arg2)               (SWIG_PERL_OBJECT_DECL arg1, arg2)
942 #define SWIG_PERL_CALL_ARGS_2(arg1, arg2)               (SWIG_PERL_OBJECT_CALL arg1, arg2)
943
944 /* -----------------------------------------------------------------------------
945  * pointers/data manipulation
946  * ----------------------------------------------------------------------------- */
947
948 /* For backward compatibility only */
949 #define SWIG_POINTER_EXCEPTION  0
950
951 #ifdef __cplusplus
952 extern "C" {
953 #endif
954
955 #define SWIG_OWNER   SWIG_POINTER_OWN
956 #define SWIG_SHADOW  SWIG_OWNER << 1
957
958 #define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL
959
960 /* SWIG Perl macros */
961
962 /* Macro to declare an XS function */
963 #ifndef XSPROTO
964 #   define XSPROTO(name) void name(pTHX_ CV* cv)
965 #endif
966
967 /* Macro to call an XS function */
968 #ifdef PERL_OBJECT 
969 #  define SWIG_CALLXS(_name) _name(cv,pPerl) 
970 #else 
971 #  ifndef MULTIPLICITY 
972 #    define SWIG_CALLXS(_name) _name(cv) 
973 #  else 
974 #    define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) 
975 #  endif 
976 #endif 
977
978 #ifdef PERL_OBJECT
979 #define MAGIC_PPERL  CPerlObj *pPerl = (CPerlObj *) this;
980
981 #ifdef __cplusplus
982 extern "C" {
983 #endif
984 typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *);
985 #ifdef __cplusplus
986 }
987 #endif
988
989 #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b)
990 #define SWIGCLASS_STATIC
991
992 #else /* PERL_OBJECT */
993
994 #define MAGIC_PPERL
995 #define SWIGCLASS_STATIC static SWIGUNUSED
996
997 #ifndef MULTIPLICITY
998 #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b)
999
1000 #ifdef __cplusplus
1001 extern "C" {
1002 #endif
1003 typedef int (*SwigMagicFunc)(SV *, MAGIC *);
1004 #ifdef __cplusplus
1005 }
1006 #endif
1007
1008 #else /* MULTIPLICITY */
1009
1010 #define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b)
1011
1012 #ifdef __cplusplus
1013 extern "C" {
1014 #endif
1015 typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *);
1016 #ifdef __cplusplus
1017 }
1018 #endif
1019
1020 #endif /* MULTIPLICITY */
1021 #endif /* PERL_OBJECT */
1022
1023 /* Workaround for bug in perl 5.6.x croak and earlier */
1024 #if (PERL_VERSION < 8)
1025 #  ifdef PERL_OBJECT
1026 #    define SWIG_croak_null() SWIG_Perl_croak_null(pPerl)
1027 static void SWIG_Perl_croak_null(CPerlObj *pPerl)
1028 #  else
1029 static void SWIG_croak_null()
1030 #  endif
1031 {
1032   SV *err=ERRSV;
1033 #  if (PERL_VERSION < 6)
1034   croak("%_", err);
1035 #  else
1036   if (SvOK(err) && !SvROK(err)) croak("%_", err);
1037   croak(Nullch);
1038 #  endif
1039 }
1040 #else
1041 #  define SWIG_croak_null() croak(Nullch)
1042 #endif
1043
1044
1045 /* 
1046    Define how strict is the cast between strings and integers/doubles
1047    when overloading between these types occurs.
1048    
1049    The default is making it as strict as possible by using SWIG_AddCast
1050    when needed.
1051    
1052    You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to
1053    disable the SWIG_AddCast, making the casting between string and
1054    numbers less strict.
1055
1056    In the end, we try to solve the overloading between strings and
1057    numerical types in the more natural way, but if you can avoid it,
1058    well, avoid it using %rename, for example.
1059 */
1060 #ifndef SWIG_PERL_NO_STRICT_STR2NUM
1061 # ifndef SWIG_PERL_STRICT_STR2NUM
1062 #  define SWIG_PERL_STRICT_STR2NUM
1063 # endif
1064 #endif
1065 #ifdef SWIG_PERL_STRICT_STR2NUM
1066 /* string takes precedence */
1067 #define SWIG_Str2NumCast(x) SWIG_AddCast(x)  
1068 #else
1069 /* number takes precedence */
1070 #define SWIG_Str2NumCast(x) x
1071 #endif
1072
1073
1074
1075 #include <stdlib.h>
1076
1077 SWIGRUNTIME const char *
1078 SWIG_Perl_TypeProxyName(const swig_type_info *type) {
1079   if (!type) return NULL;
1080   if (type->clientdata != NULL) {
1081     return (const char*) type->clientdata;
1082   } 
1083   else {
1084     return type->name;
1085   }
1086 }
1087
1088 /* Identical to SWIG_TypeCheck, except for strcmp comparison */
1089 SWIGRUNTIME swig_cast_info *
1090 SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) {
1091   if (ty) {
1092     swig_cast_info *iter = ty->cast;
1093     while (iter) {
1094       if ( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) ||
1095             (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0)) ) {
1096         if (iter == ty->cast)
1097           return iter;
1098         /* Move iter to the top of the linked list */
1099         iter->prev->next = iter->next;
1100         if (iter->next)
1101           iter->next->prev = iter->prev;
1102         iter->next = ty->cast;
1103         iter->prev = 0;
1104         if (ty->cast) ty->cast->prev = iter;
1105         ty->cast = iter;
1106         return iter;
1107       }
1108       iter = iter->next;
1109     }
1110   }
1111   return 0;
1112 }
1113
1114 /* Function for getting a pointer value */
1115
1116 SWIGRUNTIME int
1117 SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) {
1118   swig_cast_info *tc;
1119   void *voidptr = (void *)0;
1120   SV *tsv = 0;
1121
1122   if (own)
1123     *own = 0;
1124
1125   /* If magical, apply more magic */
1126   if (SvGMAGICAL(sv))
1127     mg_get(sv);
1128
1129   /* Check to see if this is an object */
1130   if (sv_isobject(sv)) {
1131     IV tmp = 0;
1132     tsv = (SV*) SvRV(sv);
1133     if ((SvTYPE(tsv) == SVt_PVHV)) {
1134       MAGIC *mg;
1135       if (SvMAGICAL(tsv)) {
1136         mg = mg_find(tsv,'P');
1137         if (mg) {
1138           sv = mg->mg_obj;
1139           if (sv_isobject(sv)) {
1140             tsv = (SV*)SvRV(sv);
1141             tmp = SvIV(tsv);
1142           }
1143         }
1144       } else {
1145         return SWIG_ERROR;
1146       }
1147     } else {
1148       tmp = SvIV(tsv);
1149     }
1150     voidptr = INT2PTR(void *,tmp);
1151   } else if (! SvOK(sv)) {            /* Check for undef */
1152     *(ptr) = (void *) 0;
1153     return SWIG_OK;
1154   } else if (SvTYPE(sv) == SVt_RV) {  /* Check for NULL pointer */
1155     if (!SvROK(sv)) {
1156       /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value.  */
1157       if (SvIOK(sv)) {
1158         return SWIG_ERROR;
1159       } else {
1160         /* NULL pointer (reference to undef). */
1161         *(ptr) = (void *) 0;
1162         return SWIG_OK;
1163       }
1164     } else {
1165       return SWIG_ERROR;
1166     }
1167   } else {                            /* Don't know what it is */
1168     return SWIG_ERROR;
1169   }
1170   if (_t) {
1171     /* Now see if the types match */
1172     char *_c = HvNAME(SvSTASH(SvRV(sv)));
1173     tc = SWIG_TypeProxyCheck(_c,_t);
1174     if (!tc) {
1175       return SWIG_ERROR;
1176     }
1177     {
1178       int newmemory = 0;
1179       *ptr = SWIG_TypeCast(tc,voidptr,&newmemory);
1180       if (newmemory == SWIG_CAST_NEW_MEMORY) {
1181         assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
1182         if (own)
1183           *own = *own | SWIG_CAST_NEW_MEMORY;
1184       }
1185     }
1186   } else {
1187     *ptr = voidptr;
1188   }
1189
1190   /* 
1191    *  DISOWN implementation: we need a perl guru to check this one.
1192    */
1193   if (tsv && (flags & SWIG_POINTER_DISOWN)) {
1194     /* 
1195      *  almost copy paste code from below SWIG_POINTER_OWN setting
1196      */
1197     SV *obj = sv;
1198     HV *stash = SvSTASH(SvRV(obj));
1199     GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE);
1200     if (isGV(gv)) {
1201       HV *hv = GvHVn(gv);
1202       /*
1203        * To set ownership (see below), a newSViv(1) entry is added. 
1204        * Hence, to remove ownership, we delete the entry.
1205        */
1206       if (hv_exists_ent(hv, obj, 0)) {
1207         hv_delete_ent(hv, obj, 0, 0);
1208       }
1209     }
1210   }
1211   return SWIG_OK;
1212 }
1213
1214 SWIGRUNTIME int
1215 SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) {
1216   return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0);
1217 }
1218
1219 SWIGRUNTIME void
1220 SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) {
1221   if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) {
1222     SV *self;
1223     SV *obj=newSV(0);
1224     HV *hash=newHV();
1225     HV *stash;
1226     sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr);
1227     stash=SvSTASH(SvRV(obj));
1228     if (flags & SWIG_POINTER_OWN) {
1229       HV *hv;
1230       GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE);
1231       if (!isGV(gv))
1232         gv_init(gv, stash, "OWNER", 5, FALSE);
1233       hv=GvHVn(gv);
1234       hv_store_ent(hv, obj, newSViv(1), 0);
1235     }
1236     sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0);
1237     SvREFCNT_dec(obj);
1238     self=newRV_noinc((SV *)hash);
1239     sv_setsv(sv, self);
1240     SvREFCNT_dec((SV *)self);
1241     sv_bless(sv, stash);
1242   }
1243   else {
1244     sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr);
1245   }
1246 }
1247
1248 SWIGRUNTIMEINLINE SV *
1249 SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) {
1250   SV *result = sv_newmortal();
1251   SWIG_MakePtr(result, ptr, t, flags);
1252   return result;
1253 }
1254
1255 SWIGRUNTIME void
1256 SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) {
1257   char result[1024];
1258   char *r = result;
1259   if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return;
1260   *(r++) = '_';
1261   r = SWIG_PackData(r,ptr,sz);
1262   strcpy(r,SWIG_Perl_TypeProxyName(type));
1263   sv_setpv(sv, result);
1264 }
1265
1266 SWIGRUNTIME SV *
1267 SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) {
1268   SV *result = sv_newmortal();
1269   SWIG_Perl_MakePackedObj(result, ptr, sz, type);
1270   return result;
1271 }
1272
1273 /* Convert a packed value value */
1274 SWIGRUNTIME int
1275 SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) {
1276   swig_cast_info *tc;
1277   const char  *c = 0;
1278
1279   if ((!obj) || (!SvOK(obj))) return SWIG_ERROR;
1280   c = SvPV_nolen(obj);
1281   /* Pointer values must start with leading underscore */
1282   if (*c != '_') return SWIG_ERROR;
1283   c++;
1284   c = SWIG_UnpackData(c,ptr,sz);
1285   if (ty) {
1286     tc = SWIG_TypeCheck(c,ty);
1287     if (!tc) return SWIG_ERROR;
1288   }
1289   return SWIG_OK;
1290 }
1291
1292
1293 /* Macros for low-level exception handling */
1294 #define SWIG_croak(x)    { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; }
1295
1296
1297 typedef XSPROTO(SwigPerlWrapper);
1298 typedef SwigPerlWrapper *SwigPerlWrapperPtr;
1299
1300 /* Structure for command table */
1301 typedef struct {
1302   const char         *name;
1303   SwigPerlWrapperPtr  wrapper;
1304 } swig_command_info;
1305
1306 /* Information for constant table */
1307
1308 #define SWIG_INT     1
1309 #define SWIG_FLOAT   2
1310 #define SWIG_STRING  3
1311 #define SWIG_POINTER 4
1312 #define SWIG_BINARY  5
1313
1314 /* Constant information structure */
1315 typedef struct swig_constant_info {
1316     int              type;
1317     const char      *name;
1318     long             lvalue;
1319     double           dvalue;
1320     void            *pvalue;
1321     swig_type_info **ptype;
1322 } swig_constant_info;
1323
1324
1325 /* Structure for variable table */
1326 typedef struct {
1327   const char   *name;
1328   SwigMagicFunc   set;
1329   SwigMagicFunc   get;
1330   swig_type_info  **type;
1331 } swig_variable_info;
1332
1333 /* Magic variable code */
1334 #ifndef PERL_OBJECT
1335 #define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c)
1336   #ifndef MULTIPLICITY
1337      SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) 
1338   #else
1339      SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) 
1340   #endif
1341 #else
1342 #  define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c)
1343 SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) 
1344 #endif
1345 {
1346   MAGIC *mg;
1347   sv_magic(sv,sv,'U',(char *) name,strlen(name));
1348   mg = mg_find(sv,'U');
1349   mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL));
1350   mg->mg_virtual->svt_get = (SwigMagicFunc) get;
1351   mg->mg_virtual->svt_set = (SwigMagicFunc) set;
1352   mg->mg_virtual->svt_len = 0;
1353   mg->mg_virtual->svt_clear = 0;
1354   mg->mg_virtual->svt_free = 0;
1355 }
1356
1357
1358 SWIGRUNTIME swig_module_info *
1359 SWIG_Perl_GetModule(void) {
1360   static void *type_pointer = (void *)0;
1361   SV *pointer;
1362
1363   /* first check if pointer already created */
1364   if (!type_pointer) {
1365     pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI);
1366     if (pointer && SvOK(pointer)) {
1367       type_pointer = INT2PTR(swig_type_info **, SvIV(pointer));
1368     }
1369   }
1370
1371   return (swig_module_info *) type_pointer;
1372 }
1373
1374 SWIGRUNTIME void
1375 SWIG_Perl_SetModule(swig_module_info *module) {
1376   SV *pointer;
1377
1378   /* create a new pointer */
1379   pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI);
1380   sv_setiv(pointer, PTR2IV(module));
1381 }
1382
1383 #ifdef __cplusplus
1384 }
1385 #endif
1386
1387 /* Workaround perl5 global namespace pollution. Note that undefining library
1388  * functions like fopen will not solve the problem on all platforms as fopen
1389  * might be a macro on Windows but not necessarily on other operating systems. */
1390 #ifdef do_open
1391   #undef do_open
1392 #endif
1393 #ifdef do_close
1394   #undef do_close
1395 #endif
1396 #ifdef do_exec
1397   #undef do_exec
1398 #endif
1399 #ifdef scalar
1400   #undef scalar
1401 #endif
1402 #ifdef list
1403   #undef list
1404 #endif
1405 #ifdef apply
1406   #undef apply
1407 #endif
1408 #ifdef convert
1409   #undef convert
1410 #endif
1411 #ifdef Error
1412   #undef Error
1413 #endif
1414 #ifdef form
1415   #undef form
1416 #endif
1417 #ifdef vform
1418   #undef vform
1419 #endif
1420 #ifdef LABEL
1421   #undef LABEL
1422 #endif
1423 #ifdef METHOD
1424   #undef METHOD
1425 #endif
1426 #ifdef Move
1427   #undef Move
1428 #endif
1429 #ifdef yylex
1430   #undef yylex
1431 #endif
1432 #ifdef yyparse
1433   #undef yyparse
1434 #endif
1435 #ifdef yyerror
1436   #undef yyerror
1437 #endif
1438 #ifdef invert
1439   #undef invert
1440 #endif
1441 #ifdef ref
1442   #undef ref
1443 #endif
1444 #ifdef read
1445   #undef read
1446 #endif
1447 #ifdef write
1448   #undef write
1449 #endif
1450 #ifdef eof
1451   #undef eof
1452 #endif
1453 #ifdef bool
1454   #undef bool
1455 #endif
1456 #ifdef close
1457   #undef close
1458 #endif
1459 #ifdef rewind
1460   #undef rewind
1461 #endif
1462 #ifdef free
1463   #undef free
1464 #endif
1465 #ifdef malloc
1466   #undef malloc
1467 #endif
1468 #ifdef calloc
1469   #undef calloc
1470 #endif
1471 #ifdef Stat
1472   #undef Stat
1473 #endif
1474 #ifdef check
1475   #undef check
1476 #endif
1477 #ifdef seekdir
1478   #undef seekdir
1479 #endif
1480 #ifdef open
1481   #undef open
1482 #endif
1483 #ifdef readdir
1484   #undef readdir
1485 #endif
1486 #ifdef bind
1487   #undef bind
1488 #endif
1489 #ifdef access
1490   #undef access
1491 #endif
1492 #ifdef stat
1493   #undef stat
1494 #endif
1495
1496
1497
1498 #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
1499
1500 #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
1501
1502
1503
1504   #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) 
1505
1506
1507 /* -------- TYPES TABLE (BEGIN) -------- */
1508
1509 #define SWIGTYPE_p_amar_attr_t swig_types[0]
1510 #define SWIGTYPE_p_amar_file_t swig_types[1]
1511 #define SWIGTYPE_p_amar_t swig_types[2]
1512 #define SWIGTYPE_p_char swig_types[3]
1513 #define SWIGTYPE_p_double swig_types[4]
1514 #define SWIGTYPE_p_float swig_types[5]
1515 #define SWIGTYPE_p_gsize swig_types[6]
1516 #define SWIGTYPE_p_guint16 swig_types[7]
1517 #define SWIGTYPE_p_int swig_types[8]
1518 #define SWIGTYPE_p_off_t swig_types[9]
1519 #define SWIGTYPE_p_unsigned_char swig_types[10]
1520 static swig_type_info *swig_types[12];
1521 static swig_module_info swig_module = {swig_types, 11, 0, 0, 0, 0};
1522 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
1523 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
1524
1525 /* -------- TYPES TABLE (END) -------- */
1526
1527 #define SWIG_init    boot_Amanda__Archive
1528
1529 #define SWIG_name   "Amanda::Archivec::boot_Amanda__Archive"
1530 #define SWIG_prefix "Amanda::Archivec::"
1531
1532 #define SWIGVERSION 0x020004 
1533 #define SWIG_VERSION SWIGVERSION
1534
1535
1536 #define SWIG_as_voidptr(a) (void *)((const void *)(a)) 
1537 #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) 
1538
1539
1540 #ifdef __cplusplus
1541 extern "C"
1542 #endif
1543 #ifndef PERL_OBJECT
1544 #ifndef MULTIPLICITY
1545 SWIGEXPORT void SWIG_init (CV* cv);
1546 #else
1547 SWIGEXPORT void SWIG_init (pTHXo_ CV* cv);
1548 #endif
1549 #else
1550 SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *);
1551 #endif
1552
1553
1554 #include "amglue.h"
1555
1556
1557 #include "amglue.h"
1558
1559
1560 #include "amglue.h"
1561
1562
1563 #include "amar.h"
1564
1565
1566 /* Support code (not directly available from perl) */
1567
1568 #define AMANDA_ARCHIVE_ERROR_DOMAIN "Amanda archive"
1569
1570 /* A C object to contain all of the relevant callbacks and other state during a
1571  * read operation; this becomes the user_data during the read */
1572 typedef struct perl_read_data_s {
1573     SV *user_data;
1574     SV *file_start_sub;
1575     SV *file_finish_sub;
1576
1577     amar_attr_handling_t *handling_array;
1578 } perl_read_data_t;
1579
1580 static gboolean
1581 read_start_file_cb(
1582         gpointer user_data,
1583         uint16_t filenum,
1584         gpointer filename,
1585         gsize filename_len,
1586         gboolean *ignore,
1587         gpointer *file_data)
1588 {
1589     dSP;
1590     perl_read_data_t *dat = user_data;
1591     SV *rv = NULL;
1592     STRLEN len;
1593     int count;
1594
1595     *file_data = NULL;
1596
1597     g_assert(dat->file_start_sub != NULL);
1598
1599     ENTER;
1600     SAVETMPS;
1601
1602     PUSHMARK(SP);
1603     XPUSHs(dat->user_data);
1604     XPUSHs(sv_2mortal(newSViv(filenum)));
1605     XPUSHs(sv_2mortal(newSVpvn(filename, filename_len)));
1606     PUTBACK;
1607
1608     count = call_sv(dat->file_start_sub, G_EVAL|G_SCALAR);
1609
1610     SPAGAIN;
1611
1612     if (count != 1)
1613         croak("file_start_sub returned nothing");
1614
1615     rv = POPs;
1616
1617     /* if it's the string "IGNORE", then ignore it */
1618     if (SvPOK(rv)) {
1619         static const char *ign = "IGNORE";
1620         char *rvstr = SvPV(rv, len);
1621         if (strlen(ign) == len && 0 == strncmp(ign, rvstr, len))
1622             *ignore = TRUE;
1623     }
1624
1625     /* otherwise, keep the value */
1626     if (!*ignore)
1627         *(SV **)(file_data) = SvREFCNT_inc(rv);
1628
1629     PUTBACK;
1630     FREETMPS;
1631     LEAVE;
1632
1633     if (SvTRUE(ERRSV))
1634         return FALSE;
1635     return TRUE;
1636 }
1637
1638 static gboolean
1639 read_finish_file_cb(
1640         gpointer user_data,
1641         uint16_t filenum,
1642         gpointer *file_data,
1643         gboolean truncated)
1644 {
1645     dSP;
1646     perl_read_data_t *dat = user_data;
1647
1648     g_assert(dat->file_finish_sub != NULL);
1649
1650     ENTER;
1651     SAVETMPS;
1652
1653     PUSHMARK(SP); XPUSHs(dat->user_data); XPUSHs(*(SV **)file_data);
1654     XPUSHs(sv_2mortal(newSViv(filenum)));
1655     XPUSHs(sv_2mortal(newSViv(truncated))); PUTBACK;
1656
1657     call_sv(dat->file_finish_sub, G_EVAL|G_DISCARD);
1658
1659     /* we're done with this file's file_data */
1660     SvREFCNT_dec(*(SV **)file_data);
1661
1662     FREETMPS;
1663     LEAVE;
1664
1665     if (SvTRUE(ERRSV))
1666         return FALSE;
1667     return TRUE;
1668 }
1669
1670 static gboolean
1671 read_frag_cb(
1672         gpointer user_data,
1673         uint16_t filenum,
1674         gpointer file_data,
1675         uint16_t attrid,
1676         gpointer attrid_data,
1677         gpointer *attr_data,
1678         gpointer data,
1679         gsize size,
1680         gboolean eoa,
1681         gboolean truncated)
1682 {
1683     dSP;
1684     perl_read_data_t *dat = user_data;
1685     SV *rv;
1686     int count;
1687
1688     if (!attrid_data)
1689         return TRUE;
1690
1691     ENTER;
1692     SAVETMPS;
1693
1694     PUSHMARK(SP);
1695     XPUSHs(dat->user_data);
1696     XPUSHs(sv_2mortal(newSViv(filenum)));
1697     XPUSHs((SV *)file_data);
1698     XPUSHs(sv_2mortal(newSViv(attrid)));
1699     if (*attr_data)
1700         XPUSHs((SV *)(*attr_data));
1701     else
1702         XPUSHs(&PL_sv_undef);
1703     XPUSHs(sv_2mortal(newSVpvn(data, size)));
1704     XPUSHs(sv_2mortal(newSViv(eoa)));
1705     XPUSHs(sv_2mortal(newSViv(truncated)));
1706     PUTBACK;
1707
1708     count = call_sv(attrid_data, G_EVAL|G_SCALAR);
1709
1710     SPAGAIN;
1711
1712     if (count != 1)
1713         croak("fragment callback returned nothing");
1714
1715     rv = POPs;
1716
1717     if (eoa) {
1718         SvREFCNT_dec(*attr_data);
1719     } else {
1720         /* increment before decrement here, in case they're the same object */
1721         SvREFCNT_inc(rv);
1722         SvREFCNT_dec(*attr_data);
1723         *attr_data = rv;
1724     }
1725
1726     FREETMPS;
1727     LEAVE;
1728
1729     if (SvTRUE(ERRSV))
1730         return FALSE;
1731     return TRUE;
1732 }
1733
1734 /* generic function to recognize when a string+len represents a number and
1735  * incidentally return the resulting value.  Note that this does not handle
1736  * negative numbers. */
1737 static gboolean
1738 is_number(char *str, int len, int *result)
1739 {
1740     char *end = str+len;
1741     int r = 0;
1742
1743     while (str < end) {
1744         if (!g_ascii_isdigit(*str)) return FALSE;
1745         r = r * 10 + (int)(*str - '0');
1746         if (r < 0) {
1747             /* overflow */
1748             return FALSE;
1749         }
1750         str++;
1751     }
1752
1753     *result = r;
1754     return TRUE;
1755 }
1756
1757
1758
1759
1760 /* Wrapper functions, mostly dealing with error handling */
1761
1762 amar_t *amar_new_(int fd, char *modestr) {
1763     GError *error = NULL;
1764     amar_t *rv;
1765     int mode;
1766
1767     if (strcmp(modestr, ">") == 0)
1768         mode = O_WRONLY;
1769     else if (strcmp(modestr, "<") == 0)
1770         mode = O_RDONLY;
1771     else
1772         croak("mode must be '<' or '>'");
1773
1774     if ((rv = amar_new(fd, mode, &error))) {
1775         return rv;
1776     }
1777
1778     croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1779     return NULL;
1780 }
1781
1782 void amar_close_(amar_t *arch) {
1783     GError *error = NULL;
1784     if (!amar_close(arch, &error))
1785         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1786 }
1787
1788 amar_file_t *
1789 amar_new_file_(amar_t *arch, char *filename, gsize filename_len, off_t *want_position) {
1790     GError *error = NULL;
1791     amar_file_t *file;
1792     g_assert(arch != NULL);
1793
1794     file = amar_new_file(arch, filename, filename_len, want_position, &error);
1795     if (file)
1796         return file;
1797
1798     croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1799     return NULL;
1800 }
1801
1802 void amar_file_close_(amar_file_t *file) {
1803     GError *error = NULL;
1804     if (!amar_file_close(file, &error))
1805         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1806 }
1807
1808 amar_attr_t *
1809 amar_new_attr_(amar_file_t *file, guint16 attrid) {
1810     GError *error = NULL;
1811     amar_attr_t *attr;
1812
1813     g_assert(file != NULL);
1814
1815     attr = amar_new_attr(file, attrid, &error);
1816     if (attr)
1817         return attr;
1818
1819     croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1820     return NULL;
1821 }
1822
1823 void amar_attr_close_(amar_attr_t *attr) {
1824     GError *error = NULL;
1825     if (!amar_attr_close(attr, &error))
1826         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1827 }
1828
1829 void amar_attr_add_data_buffer_(amar_attr_t *attr, char *buffer, gsize size, gboolean eoa) {
1830     GError *error = NULL;
1831     if (!amar_attr_add_data_buffer(attr, buffer, size, eoa, &error))
1832         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1833 }
1834
1835 size_t
1836 amar_attr_add_data_fd_(amar_attr_t *attr, int fd, gboolean eoa) {
1837     GError *error = NULL;
1838     size_t rv = amar_attr_add_data_fd(attr, fd, eoa, &error);
1839     if (rv < 0)
1840         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1841     return rv;
1842 }
1843
1844 /* reading */
1845
1846 void amar_read_(amar_t *archive, SV *params_hashref) {
1847     perl_read_data_t *dat = g_new0(perl_read_data_t, 1);
1848     GError *error = NULL;
1849     gboolean success;
1850     HV *params;
1851     HE *param;
1852     I32 len;
1853     int maxhandlers;
1854     int hdl_idx;
1855
1856     /* make sure we got a hashref */
1857     if (!SvROK(params_hashref) || SvTYPE(SvRV(params_hashref)) != SVt_PVHV)
1858         croak("read() expects a single hashref");
1859     params = (HV *)SvRV(params_hashref);
1860     len = hv_iterinit(params);
1861
1862     maxhandlers = hdl_idx = len;
1863     dat->handling_array = g_new0(amar_attr_handling_t, len+1);
1864
1865     /* loop through the parameters */
1866     while ((param = hv_iternext(params))) {
1867         I32 keylen;
1868         char *key = hv_iterkey(param, &keylen);
1869         int attrid;
1870
1871         /* if it's a number, it's handling information for an attrid */
1872         if (is_number(key, keylen, &attrid)) {
1873             SV *val = hv_iterval(params, param);
1874             SV *coderef;
1875             UV bufsize = 0;
1876             int i;
1877
1878             if (!SvROK(val)) goto croak_hdl;
1879
1880             switch (SvTYPE(SvRV(val))) {
1881                 case SVt_PVCV:
1882                     coderef = val;
1883                     break;
1884
1885                 case SVt_PVAV: {
1886                     AV *arr = (AV *)SvRV(val);
1887                     SV **svp;
1888
1889                     if (av_len(arr) != 1) /* av_len == largest index, not length */
1890                         goto croak_hdl;
1891
1892                     /* get the bufsize */
1893                     svp = av_fetch(arr, 0, 0);
1894                     if (!SvIOK(*svp))
1895                         goto croak_hdl;
1896                     bufsize = SvUV(*svp);
1897
1898                     /* and the coderef */
1899                     svp = av_fetch(arr, 1, 0);
1900                     if (!SvROK(*svp) || SvTYPE(SvRV(*svp)) != SVt_PVCV)
1901                         goto croak_hdl;
1902                     coderef = *svp;
1903                     break;
1904                 }
1905
1906                 default:
1907                     goto croak_hdl;
1908             }
1909
1910             /* fill in the handling array, putting attrid 0 at the end, and
1911              * filling in entries backward from there */
1912             i = (attrid == 0)? maxhandlers : --hdl_idx;
1913             dat->handling_array[i].attrid = attrid;
1914             dat->handling_array[i].min_size = bufsize;
1915             dat->handling_array[i].callback = read_frag_cb;
1916             dat->handling_array[i].attrid_data = coderef;
1917             SvREFCNT_inc(coderef);
1918             continue;
1919
1920         croak_hdl:
1921             croak("Expected CODEREF or [ MIN_SIZE, CODEREF ] for attrid %d", attrid);
1922         }
1923
1924 #define key_compare(key, val, keylen) \
1925     (keylen == sizeof(val)-1) && (0 == strncmp(key, val, keylen))
1926
1927         if (key_compare(key, "file_start", keylen)) {
1928             SV *val = hv_iterval(params, param);
1929             if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVCV)
1930                 croak("Expected a CODEREF for file_start");
1931             dat->file_start_sub = val;
1932             SvREFCNT_inc(val);
1933             continue;
1934         }
1935
1936         if (key_compare(key, "file_finish", keylen)) {
1937             SV *val = hv_iterval(params, param);
1938             if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVCV)
1939                 croak("Expected a CODEREF for file_finish");
1940             dat->file_finish_sub = val;
1941             SvREFCNT_inc(val);
1942             continue;
1943         }
1944
1945         if (key_compare(key, "user_data", keylen)) {
1946             SV *val = hv_iterval(params, param);
1947             dat->user_data = val;
1948             SvREFCNT_inc(val);
1949             continue;
1950         }
1951 #undef key_compare
1952         croak("Invalid parameter named '%*s'", (int)keylen, key);
1953     }
1954
1955     if (!dat->user_data)
1956         dat->user_data = &PL_sv_undef;
1957
1958     success = amar_read(archive, dat, dat->handling_array + hdl_idx,
1959         dat->file_start_sub? read_start_file_cb : NULL,
1960         dat->file_finish_sub? read_finish_file_cb : NULL,
1961         &error);
1962
1963     /* now unreference and free everything we referenced earlier */
1964     if (dat->file_start_sub)
1965         SvREFCNT_dec(dat->file_start_sub);
1966     if (dat->file_finish_sub)
1967         SvREFCNT_dec(dat->file_finish_sub);
1968     if (dat->user_data && dat->user_data != &PL_sv_undef)
1969         SvREFCNT_dec(dat->user_data);
1970
1971     for (hdl_idx = 0; hdl_idx <= maxhandlers; hdl_idx++) {
1972         if (dat->handling_array[hdl_idx].attrid_data)
1973             SvREFCNT_dec(dat->handling_array[hdl_idx].attrid_data);
1974     }
1975
1976     g_free(dat->handling_array);
1977     g_free(dat);
1978
1979     /* if amar_read returned FALSE, then either we hit an internal
1980      * error, or one of the perl callbacks raised an exception, and $@
1981      * is still set */
1982     if (!success) {
1983         if (error)
1984             croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1985         else
1986             croak(NULL);
1987     }
1988 }
1989
1990
1991
1992 SWIGINTERN swig_type_info*
1993 SWIG_pchar_descriptor(void)
1994 {
1995   static int init = 0;
1996   static swig_type_info* info = 0;
1997   if (!init) {
1998     info = SWIG_TypeQuery("_p_char");
1999     init = 1;
2000   }
2001   return info;
2002 }
2003
2004
2005 SWIGINTERN int
2006 SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc)
2007 {
2008   if (SvMAGICAL(obj)) {
2009      SV *tmp = sv_newmortal();
2010      SvSetSV(tmp, obj);
2011      obj = tmp;
2012   }
2013   if (SvPOK(obj)) {
2014     STRLEN len = 0;
2015     char *cstr = SvPV(obj, len); 
2016     size_t size = len + 1;
2017     if (cptr)  {
2018       if (alloc) {
2019         if (*alloc == SWIG_NEWOBJ) {
2020           *cptr = (char *)memcpy((char *)malloc((size)*sizeof(char)), cstr, sizeof(char)*(size));
2021         } else {
2022           *cptr = cstr;
2023           *alloc = SWIG_OLDOBJ;
2024         }
2025       }
2026     }
2027     if (psize) *psize = size;
2028     return SWIG_OK;
2029   } else {
2030     swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
2031     if (pchar_descriptor) {
2032       char* vptr = 0; 
2033       if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) {
2034         if (cptr) *cptr = vptr;
2035         if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0;
2036         if (alloc) *alloc = SWIG_OLDOBJ;
2037         return SWIG_OK;
2038       }
2039     }
2040   }
2041   return SWIG_TypeError;
2042 }
2043
2044
2045
2046
2047
2048 #include <limits.h>
2049 #if !defined(SWIG_NO_LLONG_MAX)
2050 # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
2051 #   define LLONG_MAX __LONG_LONG_MAX__
2052 #   define LLONG_MIN (-LLONG_MAX - 1LL)
2053 #   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
2054 # endif
2055 #endif
2056
2057
2058 SWIGINTERN int
2059 SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val)
2060 {
2061   if (SvNIOK(obj)) {
2062     if (val) *val = SvNV(obj);
2063     return SWIG_OK;
2064   } else if (SvIOK(obj)) {
2065     if (val) *val = (double) SvIV(obj);
2066     return SWIG_AddCast(SWIG_OK);
2067   } else {
2068     const char *nptr = SvPV_nolen(obj);
2069     if (nptr) {
2070       char *endptr;
2071       double v;
2072       errno = 0;
2073       v = strtod(nptr, &endptr);
2074       if (errno == ERANGE) {
2075         errno = 0;
2076         return SWIG_OverflowError;
2077       } else {
2078         if (*endptr == '\0') {
2079           if (val) *val = v;
2080           return SWIG_Str2NumCast(SWIG_OK);
2081         }
2082       }
2083     }
2084   }
2085   return SWIG_TypeError;
2086 }
2087
2088
2089 #include <float.h>
2090
2091
2092 #include <math.h>
2093
2094
2095 SWIGINTERNINLINE int
2096 SWIG_CanCastAsInteger(double *d, double min, double max) {
2097   double x = *d;
2098   if ((min <= x && x <= max)) {
2099    double fx = floor(x);
2100    double cx = ceil(x);
2101    double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
2102    if ((errno == EDOM) || (errno == ERANGE)) {
2103      errno = 0;
2104    } else {
2105      double summ, reps, diff;
2106      if (rd < x) {
2107        diff = x - rd;
2108      } else if (rd > x) {
2109        diff = rd - x;
2110      } else {
2111        return 1;
2112      }
2113      summ = rd + x;
2114      reps = diff/summ;
2115      if (reps < 8*DBL_EPSILON) {
2116        *d = rd;
2117        return 1;
2118      }
2119    }
2120   }
2121   return 0;
2122 }
2123
2124
2125 SWIGINTERN int
2126 SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val)
2127 {
2128   if (SvIOK(obj)) {
2129     if (val) *val = SvIV(obj);
2130     return SWIG_OK;
2131   } else {
2132     int dispatch = 0;
2133     const char *nptr = SvPV_nolen(obj);
2134     if (nptr) {
2135       char *endptr;
2136       long v;
2137       errno = 0;
2138       v = strtol(nptr, &endptr,0);
2139       if (errno == ERANGE) {
2140         errno = 0;
2141         return SWIG_OverflowError;
2142       } else {
2143         if (*endptr == '\0') {
2144           if (val) *val = v;
2145           return SWIG_Str2NumCast(SWIG_OK);
2146         }
2147       }
2148     }
2149     if (!dispatch) {
2150       double d;
2151       int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d));
2152       if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
2153         if (val) *val = (long)(d);
2154         return res;
2155       }
2156     }
2157   }
2158   return SWIG_TypeError;
2159 }
2160
2161
2162 SWIGINTERN int
2163 SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val)
2164 {
2165   long v;
2166   int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v);
2167   if (SWIG_IsOK(res)) {
2168     if ((v < INT_MIN || v > INT_MAX)) {
2169       return SWIG_OverflowError;
2170     } else {
2171       if (val) *val = (int)(v);
2172     }
2173   }  
2174   return res;
2175 }
2176
2177 #ifdef __cplusplus
2178 extern "C" {
2179 #endif
2180
2181 #ifdef PERL_OBJECT
2182 #define MAGIC_CLASS _wrap_Amanda__Archive_var::
2183 class _wrap_Amanda__Archive_var : public CPerlObj {
2184 public:
2185 #else
2186 #define MAGIC_CLASS
2187 #endif
2188 SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) {
2189     MAGIC_PPERL
2190     croak("Value is read-only.");
2191     return 0;
2192 }
2193
2194
2195 #ifdef PERL_OBJECT
2196 };
2197 #endif
2198
2199 #ifdef __cplusplus
2200 }
2201 #endif
2202
2203 #ifdef __cplusplus
2204 extern "C" {
2205 #endif
2206 XS(_wrap_amar_new) {
2207   {
2208     int arg1 ;
2209     char *arg2 = (char *) 0 ;
2210     int res2 ;
2211     char *buf2 = 0 ;
2212     int alloc2 = 0 ;
2213     int argvi = 0;
2214     amar_t *result = 0 ;
2215     dXSARGS;
2216     
2217     if ((items < 2) || (items > 2)) {
2218       SWIG_croak("Usage: amar_new(fd,modestr);");
2219     }
2220     {
2221       IO *io = NULL;
2222       PerlIO *pio = NULL;
2223       int fd = -1;
2224       
2225       if (SvIOK(ST(0))) {
2226         /* plain old integer */
2227         arg1 = SvIV(ST(0));
2228       } else {
2229         /* try extracting as filehandle */
2230         
2231         /* note: sv_2io may call die() */
2232         io = sv_2io(ST(0));
2233         if (io) {
2234           pio = IoIFP(io);
2235         }
2236         if (pio) {
2237           fd = PerlIO_fileno(pio);
2238         }
2239         if (fd >= 0) {
2240           arg1 = fd;
2241         } else {
2242           SWIG_exception(SWIG_TypeError, "Expected integer file descriptor "
2243             "or file handle for argument 1");
2244         }
2245       }
2246     }
2247     res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
2248     if (!SWIG_IsOK(res2)) {
2249       SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "amar_new" "', argument " "2"" of type '" "char *""'");
2250     }
2251     arg2 = (char *)(buf2);
2252     result = (amar_t *)amar_new_(arg1,arg2);
2253     ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_amar_t, 0 | 0); argvi++ ;
2254     
2255     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2256     XSRETURN(argvi);
2257   fail:
2258     
2259     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2260     SWIG_croak_null();
2261   }
2262 }
2263
2264
2265 XS(_wrap_amar_close) {
2266   {
2267     amar_t *arg1 = (amar_t *) 0 ;
2268     void *argp1 = 0 ;
2269     int res1 = 0 ;
2270     int argvi = 0;
2271     dXSARGS;
2272     
2273     if ((items < 1) || (items > 1)) {
2274       SWIG_croak("Usage: amar_close(arch);");
2275     }
2276     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_t, 0 |  0 );
2277     if (!SWIG_IsOK(res1)) {
2278       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_close" "', argument " "1"" of type '" "amar_t *""'"); 
2279     }
2280     arg1 = (amar_t *)(argp1);
2281     amar_close_(arg1);
2282     ST(argvi) = sv_newmortal();
2283     
2284     XSRETURN(argvi);
2285   fail:
2286     
2287     SWIG_croak_null();
2288   }
2289 }
2290
2291
2292 XS(_wrap_amar_new_file) {
2293   {
2294     amar_t *arg1 = (amar_t *) 0 ;
2295     char *arg2 = (char *) 0 ;
2296     gsize arg3 ;
2297     off_t *arg4 = (off_t *) 0 ;
2298     void *argp1 = 0 ;
2299     int res1 = 0 ;
2300     int res2 ;
2301     char *buf2 = 0 ;
2302     size_t size2 = 0 ;
2303     int alloc2 = 0 ;
2304     off_t position4 ;
2305     int argvi = 0;
2306     SV * _saved[1] ;
2307     amar_file_t *result = 0 ;
2308     dXSARGS;
2309     
2310     if ((items < 3) || (items > 3)) {
2311       SWIG_croak("Usage: amar_new_file(arch,filename,filename_len,want_position);");
2312     }
2313     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_t, 0 |  0 );
2314     if (!SWIG_IsOK(res1)) {
2315       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_new_file" "', argument " "1"" of type '" "amar_t *""'"); 
2316     }
2317     arg1 = (amar_t *)(argp1);
2318     res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, &size2, &alloc2);
2319     if (!SWIG_IsOK(res2)) {
2320       SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "amar_new_file" "', argument " "2"" of type '" "char *""'");
2321     }  
2322     arg2 = (char *)(buf2);
2323     arg3 = (gsize)(size2 - 1);
2324     {
2325       if (SvTRUE(ST(2))) {
2326         position4 = 0;
2327         arg4 = &position4;
2328       } else {
2329         arg4 = NULL;
2330       }
2331     }
2332     _saved[0] = ST(2);
2333     result = (amar_file_t *)amar_new_file_(arg1,arg2,arg3,arg4);
2334     ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_amar_file_t, 0 | 0); argvi++ ;
2335     {
2336       if (arg4) {
2337         SP += argvi; PUTBACK;
2338         ST(argvi) = sv_2mortal(amglue_newSVi64(*arg4));
2339         SPAGAIN; SP -= argvi; argvi++;
2340       }
2341     }
2342     
2343     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2344     
2345     XSRETURN(argvi);
2346   fail:
2347     
2348     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2349     
2350     SWIG_croak_null();
2351   }
2352 }
2353
2354
2355 XS(_wrap_amar_file_close) {
2356   {
2357     amar_file_t *arg1 = (amar_file_t *) 0 ;
2358     void *argp1 = 0 ;
2359     int res1 = 0 ;
2360     int argvi = 0;
2361     dXSARGS;
2362     
2363     if ((items < 1) || (items > 1)) {
2364       SWIG_croak("Usage: amar_file_close(file);");
2365     }
2366     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_file_t, 0 |  0 );
2367     if (!SWIG_IsOK(res1)) {
2368       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_file_close" "', argument " "1"" of type '" "amar_file_t *""'"); 
2369     }
2370     arg1 = (amar_file_t *)(argp1);
2371     amar_file_close_(arg1);
2372     ST(argvi) = sv_newmortal();
2373     
2374     XSRETURN(argvi);
2375   fail:
2376     
2377     SWIG_croak_null();
2378   }
2379 }
2380
2381
2382 XS(_wrap_amar_new_attr) {
2383   {
2384     amar_file_t *arg1 = (amar_file_t *) 0 ;
2385     guint16 arg2 ;
2386     void *argp1 = 0 ;
2387     int res1 = 0 ;
2388     int argvi = 0;
2389     amar_attr_t *result = 0 ;
2390     dXSARGS;
2391     
2392     if ((items < 2) || (items > 2)) {
2393       SWIG_croak("Usage: amar_new_attr(file,attrid);");
2394     }
2395     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_file_t, 0 |  0 );
2396     if (!SWIG_IsOK(res1)) {
2397       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_new_attr" "', argument " "1"" of type '" "amar_file_t *""'"); 
2398     }
2399     arg1 = (amar_file_t *)(argp1);
2400     {
2401       arg2 = amglue_SvU16(ST(1));
2402     }
2403     result = (amar_attr_t *)amar_new_attr_(arg1,arg2);
2404     ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_amar_attr_t, 0 | 0); argvi++ ;
2405     
2406     XSRETURN(argvi);
2407   fail:
2408     
2409     SWIG_croak_null();
2410   }
2411 }
2412
2413
2414 XS(_wrap_amar_attr_close) {
2415   {
2416     amar_attr_t *arg1 = (amar_attr_t *) 0 ;
2417     void *argp1 = 0 ;
2418     int res1 = 0 ;
2419     int argvi = 0;
2420     dXSARGS;
2421     
2422     if ((items < 1) || (items > 1)) {
2423       SWIG_croak("Usage: amar_attr_close(attr);");
2424     }
2425     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_attr_t, 0 |  0 );
2426     if (!SWIG_IsOK(res1)) {
2427       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_attr_close" "', argument " "1"" of type '" "amar_attr_t *""'"); 
2428     }
2429     arg1 = (amar_attr_t *)(argp1);
2430     amar_attr_close_(arg1);
2431     ST(argvi) = sv_newmortal();
2432     
2433     XSRETURN(argvi);
2434   fail:
2435     
2436     SWIG_croak_null();
2437   }
2438 }
2439
2440
2441 XS(_wrap_amar_attr_add_data_buffer) {
2442   {
2443     amar_attr_t *arg1 = (amar_attr_t *) 0 ;
2444     char *arg2 = (char *) 0 ;
2445     gsize arg3 ;
2446     gboolean arg4 ;
2447     void *argp1 = 0 ;
2448     int res1 = 0 ;
2449     int res2 ;
2450     char *buf2 = 0 ;
2451     size_t size2 = 0 ;
2452     int alloc2 = 0 ;
2453     int argvi = 0;
2454     dXSARGS;
2455     
2456     if ((items < 3) || (items > 3)) {
2457       SWIG_croak("Usage: amar_attr_add_data_buffer(attr,buffer,size,eoa);");
2458     }
2459     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_attr_t, 0 |  0 );
2460     if (!SWIG_IsOK(res1)) {
2461       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_attr_add_data_buffer" "', argument " "1"" of type '" "amar_attr_t *""'"); 
2462     }
2463     arg1 = (amar_attr_t *)(argp1);
2464     res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, &size2, &alloc2);
2465     if (!SWIG_IsOK(res2)) {
2466       SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "amar_attr_add_data_buffer" "', argument " "2"" of type '" "char *""'");
2467     }  
2468     arg2 = (char *)(buf2);
2469     arg3 = (gsize)(size2 - 1);
2470     {
2471       arg4 = SvTRUE(ST(2));
2472     }
2473     amar_attr_add_data_buffer_(arg1,arg2,arg3,arg4);
2474     ST(argvi) = sv_newmortal();
2475     
2476     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2477     
2478     XSRETURN(argvi);
2479   fail:
2480     
2481     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2482     
2483     SWIG_croak_null();
2484   }
2485 }
2486
2487
2488 XS(_wrap_amar_attr_add_data_fd) {
2489   {
2490     amar_attr_t *arg1 = (amar_attr_t *) 0 ;
2491     int arg2 ;
2492     gboolean arg3 ;
2493     void *argp1 = 0 ;
2494     int res1 = 0 ;
2495     int argvi = 0;
2496     size_t result;
2497     dXSARGS;
2498     
2499     if ((items < 3) || (items > 3)) {
2500       SWIG_croak("Usage: amar_attr_add_data_fd(attr,fd,eoa);");
2501     }
2502     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_attr_t, 0 |  0 );
2503     if (!SWIG_IsOK(res1)) {
2504       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_attr_add_data_fd" "', argument " "1"" of type '" "amar_attr_t *""'"); 
2505     }
2506     arg1 = (amar_attr_t *)(argp1);
2507     {
2508       IO *io = NULL;
2509       PerlIO *pio = NULL;
2510       int fd = -1;
2511       
2512       if (SvIOK(ST(1))) {
2513         /* plain old integer */
2514         arg2 = SvIV(ST(1));
2515       } else {
2516         /* try extracting as filehandle */
2517         
2518         /* note: sv_2io may call die() */
2519         io = sv_2io(ST(1));
2520         if (io) {
2521           pio = IoIFP(io);
2522         }
2523         if (pio) {
2524           fd = PerlIO_fileno(pio);
2525         }
2526         if (fd >= 0) {
2527           arg2 = fd;
2528         } else {
2529           SWIG_exception(SWIG_TypeError, "Expected integer file descriptor "
2530             "or file handle for argument 2");
2531         }
2532       }
2533     }
2534     {
2535       arg3 = SvTRUE(ST(2));
2536     }
2537     result = amar_attr_add_data_fd_(arg1,arg2,arg3);
2538     {
2539       SV *for_stack;
2540       SP += argvi; PUTBACK;
2541       for_stack = sv_2mortal(amglue_newSVu64(result));
2542       SPAGAIN; SP -= argvi;
2543       ST(argvi) = for_stack;
2544       argvi++;
2545     }
2546     
2547     
2548     
2549     XSRETURN(argvi);
2550   fail:
2551     
2552     
2553     
2554     SWIG_croak_null();
2555   }
2556 }
2557
2558
2559 XS(_wrap_amar_read) {
2560   {
2561     amar_t *arg1 = (amar_t *) 0 ;
2562     SV *arg2 = (SV *) 0 ;
2563     void *argp1 = 0 ;
2564     int res1 = 0 ;
2565     int argvi = 0;
2566     dXSARGS;
2567     
2568     if ((items < 2) || (items > 2)) {
2569       SWIG_croak("Usage: amar_read(archive,params_hashref);");
2570     }
2571     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_t, 0 |  0 );
2572     if (!SWIG_IsOK(res1)) {
2573       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_read" "', argument " "1"" of type '" "amar_t *""'"); 
2574     }
2575     arg1 = (amar_t *)(argp1);
2576     arg2 = ST(1);
2577     amar_read_(arg1,arg2);
2578     ST(argvi) = sv_newmortal();
2579     
2580     
2581     XSRETURN(argvi);
2582   fail:
2583     
2584     
2585     SWIG_croak_null();
2586   }
2587 }
2588
2589
2590
2591 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
2592
2593 static swig_type_info _swigt__p_amar_attr_t = {"_p_amar_attr_t", "amar_attr_t *", 0, 0, (void*)0, 0};
2594 static swig_type_info _swigt__p_amar_file_t = {"_p_amar_file_t", "amar_file_t *", 0, 0, (void*)0, 0};
2595 static swig_type_info _swigt__p_amar_t = {"_p_amar_t", "amar_t *", 0, 0, (void*)0, 0};
2596 static swig_type_info _swigt__p_char = {"_p_char", "gchar *|char *", 0, 0, (void*)0, 0};
2597 static swig_type_info _swigt__p_double = {"_p_double", "double *|gdouble *", 0, 0, (void*)0, 0};
2598 static swig_type_info _swigt__p_float = {"_p_float", "float *|gfloat *", 0, 0, (void*)0, 0};
2599 static swig_type_info _swigt__p_gsize = {"_p_gsize", "gsize *", 0, 0, (void*)0, 0};
2600 static swig_type_info _swigt__p_guint16 = {"_p_guint16", "guint16 *", 0, 0, (void*)0, 0};
2601 static swig_type_info _swigt__p_int = {"_p_int", "int *|gboolean *", 0, 0, (void*)0, 0};
2602 static swig_type_info _swigt__p_off_t = {"_p_off_t", "off_t *", 0, 0, (void*)0, 0};
2603 static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "guchar *|unsigned char *", 0, 0, (void*)0, 0};
2604
2605 static swig_type_info *swig_type_initial[] = {
2606   &_swigt__p_amar_attr_t,
2607   &_swigt__p_amar_file_t,
2608   &_swigt__p_amar_t,
2609   &_swigt__p_char,
2610   &_swigt__p_double,
2611   &_swigt__p_float,
2612   &_swigt__p_gsize,
2613   &_swigt__p_guint16,
2614   &_swigt__p_int,
2615   &_swigt__p_off_t,
2616   &_swigt__p_unsigned_char,
2617 };
2618
2619 static swig_cast_info _swigc__p_amar_attr_t[] = {  {&_swigt__p_amar_attr_t, 0, 0, 0},{0, 0, 0, 0}};
2620 static swig_cast_info _swigc__p_amar_file_t[] = {  {&_swigt__p_amar_file_t, 0, 0, 0},{0, 0, 0, 0}};
2621 static swig_cast_info _swigc__p_amar_t[] = {  {&_swigt__p_amar_t, 0, 0, 0},{0, 0, 0, 0}};
2622 static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
2623 static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
2624 static swig_cast_info _swigc__p_float[] = {  {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}};
2625 static swig_cast_info _swigc__p_gsize[] = {  {&_swigt__p_gsize, 0, 0, 0},{0, 0, 0, 0}};
2626 static swig_cast_info _swigc__p_guint16[] = {  {&_swigt__p_guint16, 0, 0, 0},{0, 0, 0, 0}};
2627 static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
2628 static swig_cast_info _swigc__p_off_t[] = {  {&_swigt__p_off_t, 0, 0, 0},{0, 0, 0, 0}};
2629 static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
2630
2631 static swig_cast_info *swig_cast_initial[] = {
2632   _swigc__p_amar_attr_t,
2633   _swigc__p_amar_file_t,
2634   _swigc__p_amar_t,
2635   _swigc__p_char,
2636   _swigc__p_double,
2637   _swigc__p_float,
2638   _swigc__p_gsize,
2639   _swigc__p_guint16,
2640   _swigc__p_int,
2641   _swigc__p_off_t,
2642   _swigc__p_unsigned_char,
2643 };
2644
2645
2646 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
2647
2648 static swig_constant_info swig_constants[] = {
2649 {0,0,0,0,0,0}
2650 };
2651 #ifdef __cplusplus
2652 }
2653 #endif
2654 static swig_variable_info swig_variables[] = {
2655 {0,0,0,0}
2656 };
2657 static swig_command_info swig_commands[] = {
2658 {"Amanda::Archivec::amar_new", _wrap_amar_new},
2659 {"Amanda::Archivec::amar_close", _wrap_amar_close},
2660 {"Amanda::Archivec::amar_new_file", _wrap_amar_new_file},
2661 {"Amanda::Archivec::amar_file_close", _wrap_amar_file_close},
2662 {"Amanda::Archivec::amar_new_attr", _wrap_amar_new_attr},
2663 {"Amanda::Archivec::amar_attr_close", _wrap_amar_attr_close},
2664 {"Amanda::Archivec::amar_attr_add_data_buffer", _wrap_amar_attr_add_data_buffer},
2665 {"Amanda::Archivec::amar_attr_add_data_fd", _wrap_amar_attr_add_data_fd},
2666 {"Amanda::Archivec::amar_read", _wrap_amar_read},
2667 {0,0}
2668 };
2669 /* -----------------------------------------------------------------------------
2670  * Type initialization:
2671  * This problem is tough by the requirement that no dynamic 
2672  * memory is used. Also, since swig_type_info structures store pointers to 
2673  * swig_cast_info structures and swig_cast_info structures store pointers back
2674  * to swig_type_info structures, we need some lookup code at initialization. 
2675  * The idea is that swig generates all the structures that are needed. 
2676  * The runtime then collects these partially filled structures. 
2677  * The SWIG_InitializeModule function takes these initial arrays out of 
2678  * swig_module, and does all the lookup, filling in the swig_module.types
2679  * array with the correct data and linking the correct swig_cast_info
2680  * structures together.
2681  *
2682  * The generated swig_type_info structures are assigned staticly to an initial 
2683  * array. We just loop through that array, and handle each type individually.
2684  * First we lookup if this type has been already loaded, and if so, use the
2685  * loaded structure instead of the generated one. Then we have to fill in the
2686  * cast linked list. The cast data is initially stored in something like a
2687  * two-dimensional array. Each row corresponds to a type (there are the same
2688  * number of rows as there are in the swig_type_initial array). Each entry in
2689  * a column is one of the swig_cast_info structures for that type.
2690  * The cast_initial array is actually an array of arrays, because each row has
2691  * a variable number of columns. So to actually build the cast linked list,
2692  * we find the array of casts associated with the type, and loop through it 
2693  * adding the casts to the list. The one last trick we need to do is making
2694  * sure the type pointer in the swig_cast_info struct is correct.
2695  *
2696  * First off, we lookup the cast->type name to see if it is already loaded. 
2697  * There are three cases to handle:
2698  *  1) If the cast->type has already been loaded AND the type we are adding
2699  *     casting info to has not been loaded (it is in this module), THEN we
2700  *     replace the cast->type pointer with the type pointer that has already
2701  *     been loaded.
2702  *  2) If BOTH types (the one we are adding casting info to, and the 
2703  *     cast->type) are loaded, THEN the cast info has already been loaded by
2704  *     the previous module so we just ignore it.
2705  *  3) Finally, if cast->type has not already been loaded, then we add that
2706  *     swig_cast_info to the linked list (because the cast->type) pointer will
2707  *     be correct.
2708  * ----------------------------------------------------------------------------- */
2709
2710 #ifdef __cplusplus
2711 extern "C" {
2712 #if 0
2713 } /* c-mode */
2714 #endif
2715 #endif
2716
2717 #if 0
2718 #define SWIGRUNTIME_DEBUG
2719 #endif
2720
2721
2722 SWIGRUNTIME void
2723 SWIG_InitializeModule(void *clientdata) {
2724   size_t i;
2725   swig_module_info *module_head, *iter;
2726   int found, init;
2727   
2728   clientdata = clientdata;
2729   
2730   /* check to see if the circular list has been setup, if not, set it up */
2731   if (swig_module.next==0) {
2732     /* Initialize the swig_module */
2733     swig_module.type_initial = swig_type_initial;
2734     swig_module.cast_initial = swig_cast_initial;
2735     swig_module.next = &swig_module;
2736     init = 1;
2737   } else {
2738     init = 0;
2739   }
2740   
2741   /* Try and load any already created modules */
2742   module_head = SWIG_GetModule(clientdata);
2743   if (!module_head) {
2744     /* This is the first module loaded for this interpreter */
2745     /* so set the swig module into the interpreter */
2746     SWIG_SetModule(clientdata, &swig_module);
2747     module_head = &swig_module;
2748   } else {
2749     /* the interpreter has loaded a SWIG module, but has it loaded this one? */
2750     found=0;
2751     iter=module_head;
2752     do {
2753       if (iter==&swig_module) {
2754         found=1;
2755         break;
2756       }
2757       iter=iter->next;
2758     } while (iter!= module_head);
2759     
2760     /* if the is found in the list, then all is done and we may leave */
2761     if (found) return;
2762     /* otherwise we must add out module into the list */
2763     swig_module.next = module_head->next;
2764     module_head->next = &swig_module;
2765   }
2766   
2767   /* When multiple interpeters are used, a module could have already been initialized in
2768        a different interpreter, but not yet have a pointer in this interpreter.
2769        In this case, we do not want to continue adding types... everything should be
2770        set up already */
2771   if (init == 0) return;
2772   
2773   /* Now work on filling in swig_module.types */
2774 #ifdef SWIGRUNTIME_DEBUG
2775   printf("SWIG_InitializeModule: size %d\n", swig_module.size);
2776 #endif
2777   for (i = 0; i < swig_module.size; ++i) {
2778     swig_type_info *type = 0;
2779     swig_type_info *ret;
2780     swig_cast_info *cast;
2781     
2782 #ifdef SWIGRUNTIME_DEBUG
2783     printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
2784 #endif
2785     
2786     /* if there is another module already loaded */
2787     if (swig_module.next != &swig_module) {
2788       type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
2789     }
2790     if (type) {
2791       /* Overwrite clientdata field */
2792 #ifdef SWIGRUNTIME_DEBUG
2793       printf("SWIG_InitializeModule: found type %s\n", type->name);
2794 #endif
2795       if (swig_module.type_initial[i]->clientdata) {
2796         type->clientdata = swig_module.type_initial[i]->clientdata;
2797 #ifdef SWIGRUNTIME_DEBUG
2798         printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
2799 #endif
2800       }
2801     } else {
2802       type = swig_module.type_initial[i];
2803     }
2804     
2805     /* Insert casting types */
2806     cast = swig_module.cast_initial[i];
2807     while (cast->type) {
2808       /* Don't need to add information already in the list */
2809       ret = 0;
2810 #ifdef SWIGRUNTIME_DEBUG
2811       printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
2812 #endif
2813       if (swig_module.next != &swig_module) {
2814         ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
2815 #ifdef SWIGRUNTIME_DEBUG
2816         if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
2817 #endif
2818       }
2819       if (ret) {
2820         if (type == swig_module.type_initial[i]) {
2821 #ifdef SWIGRUNTIME_DEBUG
2822           printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
2823 #endif
2824           cast->type = ret;
2825           ret = 0;
2826         } else {
2827           /* Check for casting already in the list */
2828           swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
2829 #ifdef SWIGRUNTIME_DEBUG
2830           if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
2831 #endif
2832           if (!ocast) ret = 0;
2833         }
2834       }
2835       
2836       if (!ret) {
2837 #ifdef SWIGRUNTIME_DEBUG
2838         printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
2839 #endif
2840         if (type->cast) {
2841           type->cast->prev = cast;
2842           cast->next = type->cast;
2843         }
2844         type->cast = cast;
2845       }
2846       cast++;
2847     }
2848     /* Set entry in modules->types array equal to the type */
2849     swig_module.types[i] = type;
2850   }
2851   swig_module.types[i] = 0;
2852   
2853 #ifdef SWIGRUNTIME_DEBUG
2854   printf("**** SWIG_InitializeModule: Cast List ******\n");
2855   for (i = 0; i < swig_module.size; ++i) {
2856     int j = 0;
2857     swig_cast_info *cast = swig_module.cast_initial[i];
2858     printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
2859     while (cast->type) {
2860       printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
2861       cast++;
2862       ++j;
2863     }
2864     printf("---- Total casts: %d\n",j);
2865   }
2866   printf("**** SWIG_InitializeModule: Cast List ******\n");
2867 #endif
2868 }
2869
2870 /* This function will propagate the clientdata field of type to
2871 * any new swig_type_info structures that have been added into the list
2872 * of equivalent types.  It is like calling
2873 * SWIG_TypeClientData(type, clientdata) a second time.
2874 */
2875 SWIGRUNTIME void
2876 SWIG_PropagateClientData(void) {
2877   size_t i;
2878   swig_cast_info *equiv;
2879   static int init_run = 0;
2880   
2881   if (init_run) return;
2882   init_run = 1;
2883   
2884   for (i = 0; i < swig_module.size; i++) {
2885     if (swig_module.types[i]->clientdata) {
2886       equiv = swig_module.types[i]->cast;
2887       while (equiv) {
2888         if (!equiv->converter) {
2889           if (equiv->type && !equiv->type->clientdata)
2890           SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
2891         }
2892         equiv = equiv->next;
2893       }
2894     }
2895   }
2896 }
2897
2898 #ifdef __cplusplus
2899 #if 0
2900 {
2901   /* c-mode */
2902 #endif
2903 }
2904 #endif
2905
2906
2907
2908 #ifdef __cplusplus
2909 extern "C"
2910 #endif
2911
2912 XS(SWIG_init) {
2913   dXSARGS;
2914   int i;
2915   
2916   SWIG_InitializeModule(0);
2917   
2918   /* Install commands */
2919   for (i = 0; swig_commands[i].name; i++) {
2920     newXS((char*) swig_commands[i].name,swig_commands[i].wrapper, (char*)__FILE__);
2921   }
2922   
2923   /* Install variables */
2924   for (i = 0; swig_variables[i].name; i++) {
2925     SV *sv;
2926     sv = get_sv((char*) swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI);
2927     if (swig_variables[i].type) {
2928       SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0);
2929     } else {
2930       sv_setiv(sv,(IV) 0);
2931     }
2932     swig_create_magic(sv, (char *) swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); 
2933   }
2934   
2935   /* Install constant */
2936   for (i = 0; swig_constants[i].type; i++) {
2937     SV *sv;
2938     sv = get_sv((char*)swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI);
2939     switch(swig_constants[i].type) {
2940     case SWIG_INT:
2941       sv_setiv(sv, (IV) swig_constants[i].lvalue);
2942       break;
2943     case SWIG_FLOAT:
2944       sv_setnv(sv, (double) swig_constants[i].dvalue);
2945       break;
2946     case SWIG_STRING:
2947       sv_setpv(sv, (char *) swig_constants[i].pvalue);
2948       break;
2949     case SWIG_POINTER:
2950       SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0);
2951       break;
2952     case SWIG_BINARY:
2953       SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype));
2954       break;
2955     default:
2956       break;
2957     }
2958     SvREADONLY_on(sv);
2959   }
2960   
2961   ST(0) = &PL_sv_yes;
2962   XSRETURN(1);
2963 }
2964