Imported Upstream version 3.2.0
[debian/amanda] / perl / Amanda / Archive.c
1 /* ----------------------------------------------------------------------------
2  * This file was automatically generated by SWIG (http://www.swig.org).
3  * Version 1.3.39
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 and 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_NewPointerObj(p, type, flags)              SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags)
901
902 /* for raw packed data */
903 #define SWIG_ConvertPacked(obj, p, s, type)             SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type)
904 #define SWIG_NewPackedObj(p, s, type)                   SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type)
905
906 /* for class or struct pointers */
907 #define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
908 #define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
909
910 /* for C or C++ function pointers */
911 #define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_ConvertPtr(obj, pptr, type, 0)
912 #define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_NewPointerObj(ptr, type, 0)
913
914 /* for C++ member pointers, ie, member methods */
915 #define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_ConvertPacked(obj, ptr, sz, ty)
916 #define SWIG_NewMemberObj(ptr, sz, type)                SWIG_NewPackedObj(ptr, sz, type)
917
918
919 /* Runtime API */
920
921 #define SWIG_GetModule(clientdata)                      SWIG_Perl_GetModule()
922 #define SWIG_SetModule(clientdata, pointer)             SWIG_Perl_SetModule(pointer)
923
924
925 /* Error manipulation */
926
927 #define SWIG_ErrorType(code)                            SWIG_Perl_ErrorType(code)               
928 #define SWIG_Error(code, msg)                           sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg)
929 #define SWIG_fail                                       goto fail                                                   
930
931 /* Perl-specific SWIG API */
932
933 #define SWIG_MakePtr(sv, ptr, type, flags)              SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags)
934 #define SWIG_MakePackedObj(sv, p, s, type)              SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type)
935 #define SWIG_SetError(str)                              SWIG_Error(SWIG_RuntimeError, str)
936
937
938 #define SWIG_PERL_DECL_ARGS_1(arg1)                     (SWIG_PERL_OBJECT_DECL arg1)
939 #define SWIG_PERL_CALL_ARGS_1(arg1)                     (SWIG_PERL_OBJECT_CALL arg1)
940 #define SWIG_PERL_DECL_ARGS_2(arg1, arg2)               (SWIG_PERL_OBJECT_DECL arg1, arg2)
941 #define SWIG_PERL_CALL_ARGS_2(arg1, arg2)               (SWIG_PERL_OBJECT_CALL arg1, arg2)
942
943 /* -----------------------------------------------------------------------------
944  * pointers/data manipulation
945  * ----------------------------------------------------------------------------- */
946
947 /* For backward compatibility only */
948 #define SWIG_POINTER_EXCEPTION  0
949
950 #ifdef __cplusplus
951 extern "C" {
952 #endif
953
954 #define SWIG_OWNER   SWIG_POINTER_OWN
955 #define SWIG_SHADOW  SWIG_OWNER << 1
956
957 #define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL
958
959 /* SWIG Perl macros */
960
961 /* Macro to declare an XS function */
962 #ifndef XSPROTO
963 #   define XSPROTO(name) void name(pTHX_ CV* cv)
964 #endif
965
966 /* Macro to call an XS function */
967 #ifdef PERL_OBJECT 
968 #  define SWIG_CALLXS(_name) _name(cv,pPerl) 
969 #else 
970 #  ifndef MULTIPLICITY 
971 #    define SWIG_CALLXS(_name) _name(cv) 
972 #  else 
973 #    define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) 
974 #  endif 
975 #endif 
976
977 #ifdef PERL_OBJECT
978 #define MAGIC_PPERL  CPerlObj *pPerl = (CPerlObj *) this;
979
980 #ifdef __cplusplus
981 extern "C" {
982 #endif
983 typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *);
984 #ifdef __cplusplus
985 }
986 #endif
987
988 #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b)
989 #define SWIGCLASS_STATIC
990
991 #else /* PERL_OBJECT */
992
993 #define MAGIC_PPERL
994 #define SWIGCLASS_STATIC static SWIGUNUSED
995
996 #ifndef MULTIPLICITY
997 #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b)
998
999 #ifdef __cplusplus
1000 extern "C" {
1001 #endif
1002 typedef int (*SwigMagicFunc)(SV *, MAGIC *);
1003 #ifdef __cplusplus
1004 }
1005 #endif
1006
1007 #else /* MULTIPLICITY */
1008
1009 #define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b)
1010
1011 #ifdef __cplusplus
1012 extern "C" {
1013 #endif
1014 typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *);
1015 #ifdef __cplusplus
1016 }
1017 #endif
1018
1019 #endif /* MULTIPLICITY */
1020 #endif /* PERL_OBJECT */
1021
1022 /* Workaround for bug in perl 5.6.x croak and earlier */
1023 #if (PERL_VERSION < 8)
1024 #  ifdef PERL_OBJECT
1025 #    define SWIG_croak_null() SWIG_Perl_croak_null(pPerl)
1026 static void SWIG_Perl_croak_null(CPerlObj *pPerl)
1027 #  else
1028 static void SWIG_croak_null()
1029 #  endif
1030 {
1031   SV *err=ERRSV;
1032 #  if (PERL_VERSION < 6)
1033   croak("%_", err);
1034 #  else
1035   if (SvOK(err) && !SvROK(err)) croak("%_", err);
1036   croak(Nullch);
1037 #  endif
1038 }
1039 #else
1040 #  define SWIG_croak_null() croak(Nullch)
1041 #endif
1042
1043
1044 /* 
1045    Define how strict is the cast between strings and integers/doubles
1046    when overloading between these types occurs.
1047    
1048    The default is making it as strict as possible by using SWIG_AddCast
1049    when needed.
1050    
1051    You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to
1052    disable the SWIG_AddCast, making the casting between string and
1053    numbers less strict.
1054
1055    In the end, we try to solve the overloading between strings and
1056    numerical types in the more natural way, but if you can avoid it,
1057    well, avoid it using %rename, for example.
1058 */
1059 #ifndef SWIG_PERL_NO_STRICT_STR2NUM
1060 # ifndef SWIG_PERL_STRICT_STR2NUM
1061 #  define SWIG_PERL_STRICT_STR2NUM
1062 # endif
1063 #endif
1064 #ifdef SWIG_PERL_STRICT_STR2NUM
1065 /* string takes precedence */
1066 #define SWIG_Str2NumCast(x) SWIG_AddCast(x)  
1067 #else
1068 /* number takes precedence */
1069 #define SWIG_Str2NumCast(x) x
1070 #endif
1071
1072
1073
1074 #include <stdlib.h>
1075
1076 SWIGRUNTIME const char *
1077 SWIG_Perl_TypeProxyName(const swig_type_info *type) {
1078   if (!type) return NULL;
1079   if (type->clientdata != NULL) {
1080     return (const char*) type->clientdata;
1081   } 
1082   else {
1083     return type->name;
1084   }
1085 }
1086
1087 /* Identical to SWIG_TypeCheck, except for strcmp comparison */
1088 SWIGRUNTIME swig_cast_info *
1089 SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) {
1090   if (ty) {
1091     swig_cast_info *iter = ty->cast;
1092     while (iter) {
1093       if ( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) ||
1094             (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0)) ) {
1095         if (iter == ty->cast)
1096           return iter;
1097         /* Move iter to the top of the linked list */
1098         iter->prev->next = iter->next;
1099         if (iter->next)
1100           iter->next->prev = iter->prev;
1101         iter->next = ty->cast;
1102         iter->prev = 0;
1103         if (ty->cast) ty->cast->prev = iter;
1104         ty->cast = iter;
1105         return iter;
1106       }
1107       iter = iter->next;
1108     }
1109   }
1110   return 0;
1111 }
1112
1113 /* Function for getting a pointer value */
1114
1115 SWIGRUNTIME int
1116 SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) {
1117   swig_cast_info *tc;
1118   void *voidptr = (void *)0;
1119   SV *tsv = 0;
1120   /* If magical, apply more magic */
1121   if (SvGMAGICAL(sv))
1122     mg_get(sv);
1123
1124   /* Check to see if this is an object */
1125   if (sv_isobject(sv)) {
1126     IV tmp = 0;
1127     tsv = (SV*) SvRV(sv);
1128     if ((SvTYPE(tsv) == SVt_PVHV)) {
1129       MAGIC *mg;
1130       if (SvMAGICAL(tsv)) {
1131         mg = mg_find(tsv,'P');
1132         if (mg) {
1133           sv = mg->mg_obj;
1134           if (sv_isobject(sv)) {
1135             tsv = (SV*)SvRV(sv);
1136             tmp = SvIV(tsv);
1137           }
1138         }
1139       } else {
1140         return SWIG_ERROR;
1141       }
1142     } else {
1143       tmp = SvIV(tsv);
1144     }
1145     voidptr = INT2PTR(void *,tmp);
1146   } else if (! SvOK(sv)) {            /* Check for undef */
1147     *(ptr) = (void *) 0;
1148     return SWIG_OK;
1149   } else if (SvTYPE(sv) == SVt_RV) {  /* Check for NULL pointer */
1150     if (!SvROK(sv)) {
1151       *(ptr) = (void *) 0;
1152       return SWIG_OK;
1153     } else {
1154       return SWIG_ERROR;
1155     }
1156   } else {                            /* Don't know what it is */
1157     return SWIG_ERROR;
1158   }
1159   if (_t) {
1160     /* Now see if the types match */
1161     char *_c = HvNAME(SvSTASH(SvRV(sv)));
1162     tc = SWIG_TypeProxyCheck(_c,_t);
1163     if (!tc) {
1164       return SWIG_ERROR;
1165     }
1166     {
1167       int newmemory = 0;
1168       *ptr = SWIG_TypeCast(tc,voidptr,&newmemory);
1169       assert(!newmemory); /* newmemory handling not yet implemented */
1170     }
1171   } else {
1172     *ptr = voidptr;
1173   }
1174
1175   /* 
1176    *  DISOWN implementation: we need a perl guru to check this one.
1177    */
1178   if (tsv && (flags & SWIG_POINTER_DISOWN)) {
1179     /* 
1180      *  almost copy paste code from below SWIG_POINTER_OWN setting
1181      */
1182     SV *obj = sv;
1183     HV *stash = SvSTASH(SvRV(obj));
1184     GV *gv = *(GV**) hv_fetch(stash, "OWNER", 5, TRUE);
1185     if (isGV(gv)) {
1186       HV *hv = GvHVn(gv);
1187       /*
1188        * To set ownership (see below), a newSViv(1) entry is added. 
1189        * Hence, to remove ownership, we delete the entry.
1190        */
1191       if (hv_exists_ent(hv, obj, 0)) {
1192         hv_delete_ent(hv, obj, 0, 0);
1193       }
1194     }
1195   }
1196   return SWIG_OK;
1197 }
1198
1199 SWIGRUNTIME void
1200 SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) {
1201   if (ptr && (flags & SWIG_SHADOW)) {
1202     SV *self;
1203     SV *obj=newSV(0);
1204     HV *hash=newHV();
1205     HV *stash;
1206     sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr);
1207     stash=SvSTASH(SvRV(obj));
1208     if (flags & SWIG_POINTER_OWN) {
1209       HV *hv;
1210       GV *gv=*(GV**)hv_fetch(stash, "OWNER", 5, TRUE);
1211       if (!isGV(gv))
1212         gv_init(gv, stash, "OWNER", 5, FALSE);
1213       hv=GvHVn(gv);
1214       hv_store_ent(hv, obj, newSViv(1), 0);
1215     }
1216     sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0);
1217     SvREFCNT_dec(obj);
1218     self=newRV_noinc((SV *)hash);
1219     sv_setsv(sv, self);
1220     SvREFCNT_dec((SV *)self);
1221     sv_bless(sv, stash);
1222   }
1223   else {
1224     sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr);
1225   }
1226 }
1227
1228 SWIGRUNTIMEINLINE SV *
1229 SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) {
1230   SV *result = sv_newmortal();
1231   SWIG_MakePtr(result, ptr, t, flags);
1232   return result;
1233 }
1234
1235 SWIGRUNTIME void
1236 SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) {
1237   char result[1024];
1238   char *r = result;
1239   if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return;
1240   *(r++) = '_';
1241   r = SWIG_PackData(r,ptr,sz);
1242   strcpy(r,SWIG_Perl_TypeProxyName(type));
1243   sv_setpv(sv, result);
1244 }
1245
1246 SWIGRUNTIME SV *
1247 SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) {
1248   SV *result = sv_newmortal();
1249   SWIG_Perl_MakePackedObj(result, ptr, sz, type);
1250   return result;
1251 }
1252
1253 /* Convert a packed value value */
1254 SWIGRUNTIME int
1255 SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) {
1256   swig_cast_info *tc;
1257   const char  *c = 0;
1258
1259   if ((!obj) || (!SvOK(obj))) return SWIG_ERROR;
1260   c = SvPV_nolen(obj);
1261   /* Pointer values must start with leading underscore */
1262   if (*c != '_') return SWIG_ERROR;
1263   c++;
1264   c = SWIG_UnpackData(c,ptr,sz);
1265   if (ty) {
1266     tc = SWIG_TypeCheck(c,ty);
1267     if (!tc) return SWIG_ERROR;
1268   }
1269   return SWIG_OK;
1270 }
1271
1272
1273 /* Macros for low-level exception handling */
1274 #define SWIG_croak(x)    { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; }
1275
1276
1277 typedef XSPROTO(SwigPerlWrapper);
1278 typedef SwigPerlWrapper *SwigPerlWrapperPtr;
1279
1280 /* Structure for command table */
1281 typedef struct {
1282   const char         *name;
1283   SwigPerlWrapperPtr  wrapper;
1284 } swig_command_info;
1285
1286 /* Information for constant table */
1287
1288 #define SWIG_INT     1
1289 #define SWIG_FLOAT   2
1290 #define SWIG_STRING  3
1291 #define SWIG_POINTER 4
1292 #define SWIG_BINARY  5
1293
1294 /* Constant information structure */
1295 typedef struct swig_constant_info {
1296     int              type;
1297     const char      *name;
1298     long             lvalue;
1299     double           dvalue;
1300     void            *pvalue;
1301     swig_type_info **ptype;
1302 } swig_constant_info;
1303
1304
1305 /* Structure for variable table */
1306 typedef struct {
1307   const char   *name;
1308   SwigMagicFunc   set;
1309   SwigMagicFunc   get;
1310   swig_type_info  **type;
1311 } swig_variable_info;
1312
1313 /* Magic variable code */
1314 #ifndef PERL_OBJECT
1315 #define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c)
1316   #ifndef MULTIPLICITY
1317      SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) 
1318   #else
1319      SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) 
1320   #endif
1321 #else
1322 #  define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c)
1323 SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) 
1324 #endif
1325 {
1326   MAGIC *mg;
1327   sv_magic(sv,sv,'U',(char *) name,strlen(name));
1328   mg = mg_find(sv,'U');
1329   mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL));
1330   mg->mg_virtual->svt_get = (SwigMagicFunc) get;
1331   mg->mg_virtual->svt_set = (SwigMagicFunc) set;
1332   mg->mg_virtual->svt_len = 0;
1333   mg->mg_virtual->svt_clear = 0;
1334   mg->mg_virtual->svt_free = 0;
1335 }
1336
1337
1338 SWIGRUNTIME swig_module_info *
1339 SWIG_Perl_GetModule(void) {
1340   static void *type_pointer = (void *)0;
1341   SV *pointer;
1342
1343   /* first check if pointer already created */
1344   if (!type_pointer) {
1345     pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI);
1346     if (pointer && SvOK(pointer)) {
1347       type_pointer = INT2PTR(swig_type_info **, SvIV(pointer));
1348     }
1349   }
1350
1351   return (swig_module_info *) type_pointer;
1352 }
1353
1354 SWIGRUNTIME void
1355 SWIG_Perl_SetModule(swig_module_info *module) {
1356   SV *pointer;
1357
1358   /* create a new pointer */
1359   pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI);
1360   sv_setiv(pointer, PTR2IV(module));
1361 }
1362
1363 #ifdef __cplusplus
1364 }
1365 #endif
1366
1367 /* Workaround perl5 global namespace pollution. Note that undefining library
1368  * functions like fopen will not solve the problem on all platforms as fopen
1369  * might be a macro on Windows but not necessarily on other operating systems. */
1370 #ifdef do_open
1371   #undef do_open
1372 #endif
1373 #ifdef do_close
1374   #undef do_close
1375 #endif
1376 #ifdef scalar
1377   #undef scalar
1378 #endif
1379 #ifdef list
1380   #undef list
1381 #endif
1382 #ifdef apply
1383   #undef apply
1384 #endif
1385 #ifdef convert
1386   #undef convert
1387 #endif
1388 #ifdef Error
1389   #undef Error
1390 #endif
1391 #ifdef form
1392   #undef form
1393 #endif
1394 #ifdef vform
1395   #undef vform
1396 #endif
1397 #ifdef LABEL
1398   #undef LABEL
1399 #endif
1400 #ifdef METHOD
1401   #undef METHOD
1402 #endif
1403 #ifdef Move
1404   #undef Move
1405 #endif
1406 #ifdef yylex
1407   #undef yylex
1408 #endif
1409 #ifdef yyparse
1410   #undef yyparse
1411 #endif
1412 #ifdef yyerror
1413   #undef yyerror
1414 #endif
1415 #ifdef invert
1416   #undef invert
1417 #endif
1418 #ifdef ref
1419   #undef ref
1420 #endif
1421 #ifdef read
1422   #undef read
1423 #endif
1424 #ifdef write
1425   #undef write
1426 #endif
1427 #ifdef eof
1428   #undef eof
1429 #endif
1430 #ifdef bool
1431   #undef bool
1432 #endif
1433 #ifdef close
1434   #undef close
1435 #endif
1436 #ifdef rewind
1437   #undef rewind
1438 #endif
1439 #ifdef free
1440   #undef free
1441 #endif
1442 #ifdef malloc
1443   #undef malloc
1444 #endif
1445 #ifdef calloc
1446   #undef calloc
1447 #endif
1448 #ifdef Stat
1449   #undef Stat
1450 #endif
1451 #ifdef check
1452   #undef check
1453 #endif
1454 #ifdef seekdir
1455   #undef seekdir
1456 #endif
1457 #ifdef open
1458   #undef open
1459 #endif
1460 #ifdef readdir
1461   #undef readdir
1462 #endif
1463 #ifdef bind
1464   #undef bind
1465 #endif
1466
1467
1468
1469 #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
1470
1471 #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
1472
1473
1474
1475   #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) 
1476
1477
1478 /* -------- TYPES TABLE (BEGIN) -------- */
1479
1480 #define SWIGTYPE_p_amar_attr_t swig_types[0]
1481 #define SWIGTYPE_p_amar_file_t swig_types[1]
1482 #define SWIGTYPE_p_amar_t swig_types[2]
1483 #define SWIGTYPE_p_char swig_types[3]
1484 #define SWIGTYPE_p_double swig_types[4]
1485 #define SWIGTYPE_p_float swig_types[5]
1486 #define SWIGTYPE_p_gsize swig_types[6]
1487 #define SWIGTYPE_p_guint16 swig_types[7]
1488 #define SWIGTYPE_p_int swig_types[8]
1489 #define SWIGTYPE_p_off_t swig_types[9]
1490 #define SWIGTYPE_p_unsigned_char swig_types[10]
1491 static swig_type_info *swig_types[12];
1492 static swig_module_info swig_module = {swig_types, 11, 0, 0, 0, 0};
1493 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
1494 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
1495
1496 /* -------- TYPES TABLE (END) -------- */
1497
1498 #define SWIG_init    boot_Amanda__Archive
1499
1500 #define SWIG_name   "Amanda::Archivec::boot_Amanda__Archive"
1501 #define SWIG_prefix "Amanda::Archivec::"
1502
1503 #define SWIGVERSION 0x010339 
1504 #define SWIG_VERSION SWIGVERSION
1505
1506
1507 #define SWIG_as_voidptr(a) (void *)((const void *)(a)) 
1508 #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) 
1509
1510
1511 #ifdef __cplusplus
1512 extern "C"
1513 #endif
1514 #ifndef PERL_OBJECT
1515 #ifndef MULTIPLICITY
1516 SWIGEXPORT void SWIG_init (CV* cv);
1517 #else
1518 SWIGEXPORT void SWIG_init (pTHXo_ CV* cv);
1519 #endif
1520 #else
1521 SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *);
1522 #endif
1523
1524
1525 #include "amglue.h"
1526
1527
1528 #include "amglue.h"
1529
1530
1531 #include "amglue.h"
1532
1533
1534 #include "amar.h"
1535
1536
1537 /* Support code (not directly available from perl) */
1538
1539 #define AMANDA_ARCHIVE_ERROR_DOMAIN "Amanda archive"
1540
1541 /* A C object to contain all of the relevant callbacks and other state during a
1542  * read operation; this becomes the user_data during the read */
1543 typedef struct perl_read_data_s {
1544     SV *user_data;
1545     SV *file_start_sub;
1546     SV *file_finish_sub;
1547
1548     amar_attr_handling_t *handling_array;
1549 } perl_read_data_t;
1550
1551 static gboolean
1552 read_start_file_cb(
1553         gpointer user_data,
1554         uint16_t filenum,
1555         gpointer filename,
1556         gsize filename_len,
1557         gboolean *ignore,
1558         gpointer *file_data)
1559 {
1560     dSP;
1561     perl_read_data_t *dat = user_data;
1562     SV *rv = NULL;
1563     STRLEN len;
1564     int count;
1565
1566     *file_data = NULL;
1567
1568     g_assert(dat->file_start_sub != NULL);
1569
1570     ENTER;
1571     SAVETMPS;
1572
1573     PUSHMARK(SP);
1574     XPUSHs(dat->user_data);
1575     XPUSHs(sv_2mortal(newSViv(filenum)));
1576     XPUSHs(sv_2mortal(newSVpvn(filename, filename_len)));
1577     PUTBACK;
1578
1579     count = call_sv(dat->file_start_sub, G_EVAL|G_SCALAR);
1580
1581     SPAGAIN;
1582
1583     if (count != 1)
1584         croak("file_start_sub returned nothing");
1585
1586     rv = POPs;
1587
1588     /* if it's the string "IGNORE", then ignore it */
1589     if (SvPOK(rv)) {
1590         static const char *ign = "IGNORE";
1591         char *rvstr = SvPV(rv, len);
1592         if (strlen(ign) == len && 0 == strncmp(ign, rvstr, len))
1593             *ignore = TRUE;
1594     }
1595
1596     /* otherwise, keep the value */
1597     if (!*ignore)
1598         *(SV **)(file_data) = SvREFCNT_inc(rv);
1599
1600     PUTBACK;
1601     FREETMPS;
1602     LEAVE;
1603
1604     if (SvTRUE(ERRSV))
1605         return FALSE;
1606     return TRUE;
1607 }
1608
1609 static gboolean
1610 read_finish_file_cb(
1611         gpointer user_data,
1612         uint16_t filenum,
1613         gpointer *file_data,
1614         gboolean truncated)
1615 {
1616     dSP;
1617     perl_read_data_t *dat = user_data;
1618
1619     g_assert(dat->file_finish_sub != NULL);
1620
1621     ENTER;
1622     SAVETMPS;
1623
1624     PUSHMARK(SP); XPUSHs(dat->user_data); XPUSHs(*(SV **)file_data);
1625     XPUSHs(sv_2mortal(newSViv(filenum)));
1626     XPUSHs(sv_2mortal(newSViv(truncated))); PUTBACK;
1627
1628     call_sv(dat->file_finish_sub, G_EVAL|G_DISCARD);
1629
1630     /* we're done with this file's file_data */
1631     SvREFCNT_dec(*(SV **)file_data);
1632
1633     FREETMPS;
1634     LEAVE;
1635
1636     if (SvTRUE(ERRSV))
1637         return FALSE;
1638     return TRUE;
1639 }
1640
1641 static gboolean
1642 read_frag_cb(
1643         gpointer user_data,
1644         uint16_t filenum,
1645         gpointer file_data,
1646         uint16_t attrid,
1647         gpointer attrid_data,
1648         gpointer *attr_data,
1649         gpointer data,
1650         gsize size,
1651         gboolean eoa,
1652         gboolean truncated)
1653 {
1654     dSP;
1655     perl_read_data_t *dat = user_data;
1656     SV *rv;
1657     int count;
1658
1659     if (!attrid_data)
1660         return TRUE;
1661
1662     ENTER;
1663     SAVETMPS;
1664
1665     PUSHMARK(SP);
1666     XPUSHs(dat->user_data);
1667     XPUSHs(sv_2mortal(newSViv(filenum)));
1668     XPUSHs((SV *)file_data);
1669     XPUSHs(sv_2mortal(newSViv(attrid)));
1670     if (*attr_data)
1671         XPUSHs((SV *)(*attr_data));
1672     else
1673         XPUSHs(&PL_sv_undef);
1674     XPUSHs(sv_2mortal(newSVpvn(data, size)));
1675     XPUSHs(sv_2mortal(newSViv(eoa)));
1676     XPUSHs(sv_2mortal(newSViv(truncated)));
1677     PUTBACK;
1678
1679     count = call_sv(attrid_data, G_EVAL|G_SCALAR);
1680
1681     SPAGAIN;
1682
1683     if (count != 1)
1684         croak("fragment callback returned nothing");
1685
1686     rv = POPs;
1687
1688     if (eoa) {
1689         SvREFCNT_dec(*attr_data);
1690     } else {
1691         /* increment before decrement here, in case they're the same object */
1692         SvREFCNT_inc(rv);
1693         SvREFCNT_dec(*attr_data);
1694         *attr_data = rv;
1695     }
1696
1697     FREETMPS;
1698     LEAVE;
1699
1700     if (SvTRUE(ERRSV))
1701         return FALSE;
1702     return TRUE;
1703 }
1704
1705 /* generic function to recognize when a string+len represents a number and
1706  * incidentally return the resulting value.  Note that this does not handle
1707  * negative numbers. */
1708 static gboolean
1709 is_number(char *str, int len, int *result)
1710 {
1711     char *end = str+len;
1712     int r = 0;
1713
1714     while (str < end) {
1715         if (!g_ascii_isdigit(*str)) return FALSE;
1716         r = r * 10 + (int)(*str - '0');
1717         if (r < 0) {
1718             /* overflow */
1719             return FALSE;
1720         }
1721         str++;
1722     }
1723
1724     *result = r;
1725     return TRUE;
1726 }
1727
1728
1729
1730
1731 /* Wrapper functions, mostly dealing with error handling */
1732
1733 amar_t *amar_new_(int fd, char *modestr) {
1734     GError *error = NULL;
1735     amar_t *rv;
1736     int mode;
1737
1738     if (strcmp(modestr, ">") == 0)
1739         mode = O_WRONLY;
1740     else if (strcmp(modestr, "<") == 0)
1741         mode = O_RDONLY;
1742     else
1743         croak("mode must be '<' or '>'");
1744
1745     if ((rv = amar_new(fd, mode, &error))) {
1746         return rv;
1747     }
1748
1749     croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1750     return NULL;
1751 }
1752
1753 void amar_close_(amar_t *arch) {
1754     GError *error = NULL;
1755     if (!amar_close(arch, &error))
1756         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1757 }
1758
1759 amar_file_t *
1760 amar_new_file_(amar_t *arch, char *filename, gsize filename_len, off_t *want_position) {
1761     GError *error = NULL;
1762     amar_file_t *file;
1763     g_assert(arch != NULL);
1764
1765     file = amar_new_file(arch, filename, filename_len, want_position, &error);
1766     if (file)
1767         return file;
1768
1769     croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1770     return NULL;
1771 }
1772
1773 void amar_file_close_(amar_file_t *file) {
1774     GError *error = NULL;
1775     if (!amar_file_close(file, &error))
1776         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1777 }
1778
1779 amar_attr_t *
1780 amar_new_attr_(amar_file_t *file, guint16 attrid) {
1781     GError *error = NULL;
1782     amar_attr_t *attr;
1783
1784     g_assert(file != NULL);
1785
1786     attr = amar_new_attr(file, attrid, &error);
1787     if (attr)
1788         return attr;
1789
1790     croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1791     return NULL;
1792 }
1793
1794 void amar_attr_close_(amar_attr_t *attr) {
1795     GError *error = NULL;
1796     if (!amar_attr_close(attr, &error))
1797         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1798 }
1799
1800 void amar_attr_add_data_buffer_(amar_attr_t *attr, char *buffer, gsize size, gboolean eoa) {
1801     GError *error = NULL;
1802     if (!amar_attr_add_data_buffer(attr, buffer, size, eoa, &error))
1803         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1804 }
1805
1806 size_t
1807 amar_attr_add_data_fd_(amar_attr_t *attr, int fd, gboolean eoa) {
1808     GError *error = NULL;
1809     size_t rv = amar_attr_add_data_fd(attr, fd, eoa, &error);
1810     if (rv < 0)
1811         croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1812     return rv;
1813 }
1814
1815 /* reading */
1816
1817 void amar_read_(amar_t *archive, SV *params_hashref) {
1818     perl_read_data_t *dat = g_new0(perl_read_data_t, 1);
1819     GError *error = NULL;
1820     gboolean success;
1821     HV *params;
1822     HE *param;
1823     I32 len;
1824     int maxhandlers;
1825     int hdl_idx;
1826
1827     /* make sure we got a hashref */
1828     if (!SvROK(params_hashref) || SvTYPE(SvRV(params_hashref)) != SVt_PVHV)
1829         croak("read() expects a single hashref");
1830     params = (HV *)SvRV(params_hashref);
1831     len = hv_iterinit(params);
1832
1833     maxhandlers = hdl_idx = len;
1834     dat->handling_array = g_new0(amar_attr_handling_t, len+1);
1835
1836     /* loop through the parameters */
1837     while ((param = hv_iternext(params))) {
1838         I32 keylen;
1839         char *key = hv_iterkey(param, &keylen);
1840         int attrid;
1841
1842         /* if it's a number, it's handling information for an attrid */
1843         if (is_number(key, keylen, &attrid)) {
1844             SV *val = hv_iterval(params, param);
1845             SV *coderef;
1846             UV bufsize = 0;
1847             int i;
1848
1849             if (!SvROK(val)) goto croak_hdl;
1850
1851             switch (SvTYPE(SvRV(val))) {
1852                 case SVt_PVCV:
1853                     coderef = val;
1854                     break;
1855
1856                 case SVt_PVAV: {
1857                     AV *arr = (AV *)SvRV(val);
1858                     SV **svp;
1859
1860                     if (av_len(arr) != 1) /* av_len == largest index, not length */
1861                         goto croak_hdl;
1862
1863                     /* get the bufsize */
1864                     svp = av_fetch(arr, 0, 0);
1865                     if (!SvIOK(*svp))
1866                         goto croak_hdl;
1867                     bufsize = SvUV(*svp);
1868
1869                     /* and the coderef */
1870                     svp = av_fetch(arr, 1, 0);
1871                     if (!SvROK(*svp) || SvTYPE(SvRV(*svp)) != SVt_PVCV)
1872                         goto croak_hdl;
1873                     coderef = *svp;
1874                     break;
1875                 }
1876
1877                 default:
1878                     goto croak_hdl;
1879             }
1880
1881             /* fill in the handling array, putting attrid 0 at the end, and
1882              * filling in entries backward from there */
1883             i = (attrid == 0)? maxhandlers : --hdl_idx;
1884             dat->handling_array[i].attrid = attrid;
1885             dat->handling_array[i].min_size = bufsize;
1886             dat->handling_array[i].callback = read_frag_cb;
1887             dat->handling_array[i].attrid_data = coderef;
1888             SvREFCNT_inc(coderef);
1889             continue;
1890
1891         croak_hdl:
1892             croak("Expected CODEREF or [ MIN_SIZE, CODEREF ] for attrid %d", attrid);
1893         }
1894
1895 #define key_compare(key, val, keylen) \
1896     (keylen == sizeof(val)-1) && (0 == strncmp(key, val, keylen))
1897
1898         if (key_compare(key, "file_start", keylen)) {
1899             SV *val = hv_iterval(params, param);
1900             if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVCV)
1901                 croak("Expected a CODEREF for file_start");
1902             dat->file_start_sub = val;
1903             SvREFCNT_inc(val);
1904             continue;
1905         }
1906
1907         if (key_compare(key, "file_finish", keylen)) {
1908             SV *val = hv_iterval(params, param);
1909             if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVCV)
1910                 croak("Expected a CODEREF for file_finish");
1911             dat->file_finish_sub = val;
1912             SvREFCNT_inc(val);
1913             continue;
1914         }
1915
1916         if (key_compare(key, "user_data", keylen)) {
1917             SV *val = hv_iterval(params, param);
1918             dat->user_data = val;
1919             SvREFCNT_inc(val);
1920             continue;
1921         }
1922 #undef key_compare
1923         croak("Invalid parameter named '%*s'", (int)keylen, key);
1924     }
1925
1926     if (!dat->user_data)
1927         dat->user_data = &PL_sv_undef;
1928
1929     success = amar_read(archive, dat, dat->handling_array + hdl_idx,
1930         dat->file_start_sub? read_start_file_cb : NULL,
1931         dat->file_finish_sub? read_finish_file_cb : NULL,
1932         &error);
1933
1934     /* now unreference and free everything we referenced earlier */
1935     if (dat->file_start_sub)
1936         SvREFCNT_dec(dat->file_start_sub);
1937     if (dat->file_finish_sub)
1938         SvREFCNT_dec(dat->file_finish_sub);
1939     if (dat->user_data && dat->user_data != &PL_sv_undef)
1940         SvREFCNT_dec(dat->user_data);
1941
1942     for (hdl_idx = 0; hdl_idx <= maxhandlers; hdl_idx++) {
1943         if (dat->handling_array[hdl_idx].attrid_data)
1944             SvREFCNT_dec(dat->handling_array[hdl_idx].attrid_data);
1945     }
1946
1947     g_free(dat->handling_array);
1948     g_free(dat);
1949
1950     /* if amar_read returned FALSE, then either we hit an internal
1951      * error, or one of the perl callbacks raised an exception, and $@
1952      * is still set */
1953     if (!success) {
1954         if (error)
1955             croak_gerror(AMANDA_ARCHIVE_ERROR_DOMAIN, &error);
1956         else
1957             croak(NULL);
1958     }
1959 }
1960
1961
1962
1963 SWIGINTERN swig_type_info*
1964 SWIG_pchar_descriptor(void)
1965 {
1966   static int init = 0;
1967   static swig_type_info* info = 0;
1968   if (!init) {
1969     info = SWIG_TypeQuery("_p_char");
1970     init = 1;
1971   }
1972   return info;
1973 }
1974
1975
1976 SWIGINTERN int
1977 SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc)
1978 {
1979   if (SvMAGICAL(obj)) {
1980      SV *tmp = sv_newmortal();
1981      SvSetSV(tmp, obj);
1982      obj = tmp;
1983   }
1984   if (SvPOK(obj)) {
1985     STRLEN len = 0;
1986     char *cstr = SvPV(obj, len); 
1987     size_t size = len + 1;
1988     if (cptr)  {
1989       if (alloc) {
1990         if (*alloc == SWIG_NEWOBJ) {
1991           *cptr = (char *)memcpy((char *)malloc((size)*sizeof(char)), cstr, sizeof(char)*(size));
1992         } else {
1993           *cptr = cstr;
1994           *alloc = SWIG_OLDOBJ;
1995         }
1996       }
1997     }
1998     if (psize) *psize = size;
1999     return SWIG_OK;
2000   } else {
2001     swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
2002     if (pchar_descriptor) {
2003       char* vptr = 0; 
2004       if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) {
2005         if (cptr) *cptr = vptr;
2006         if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0;
2007         if (alloc) *alloc = SWIG_OLDOBJ;
2008         return SWIG_OK;
2009       }
2010     }
2011   }
2012   return SWIG_TypeError;
2013 }
2014
2015
2016
2017
2018
2019 #include <limits.h>
2020 #if !defined(SWIG_NO_LLONG_MAX)
2021 # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
2022 #   define LLONG_MAX __LONG_LONG_MAX__
2023 #   define LLONG_MIN (-LLONG_MAX - 1LL)
2024 #   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
2025 # endif
2026 #endif
2027
2028
2029 SWIGINTERN int
2030 SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val)
2031 {
2032   if (SvNIOK(obj)) {
2033     if (val) *val = SvNV(obj);
2034     return SWIG_OK;
2035   } else if (SvIOK(obj)) {
2036     if (val) *val = (double) SvIV(obj);
2037     return SWIG_AddCast(SWIG_OK);
2038   } else {
2039     const char *nptr = SvPV_nolen(obj);
2040     if (nptr) {
2041       char *endptr;
2042       double v = strtod(nptr, &endptr);
2043       if (errno == ERANGE) {
2044         errno = 0;
2045         return SWIG_OverflowError;
2046       } else {
2047         if (*endptr == '\0') {
2048           if (val) *val = v;
2049           return SWIG_Str2NumCast(SWIG_OK);
2050         }
2051       }
2052     }
2053   }
2054   return SWIG_TypeError;
2055 }
2056
2057
2058 #include <float.h>
2059
2060
2061 #include <math.h>
2062
2063
2064 SWIGINTERNINLINE int
2065 SWIG_CanCastAsInteger(double *d, double min, double max) {
2066   double x = *d;
2067   if ((min <= x && x <= max)) {
2068    double fx = floor(x);
2069    double cx = ceil(x);
2070    double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
2071    if ((errno == EDOM) || (errno == ERANGE)) {
2072      errno = 0;
2073    } else {
2074      double summ, reps, diff;
2075      if (rd < x) {
2076        diff = x - rd;
2077      } else if (rd > x) {
2078        diff = rd - x;
2079      } else {
2080        return 1;
2081      }
2082      summ = rd + x;
2083      reps = diff/summ;
2084      if (reps < 8*DBL_EPSILON) {
2085        *d = rd;
2086        return 1;
2087      }
2088    }
2089   }
2090   return 0;
2091 }
2092
2093
2094 SWIGINTERN int
2095 SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val)
2096 {
2097   if (SvIOK(obj)) {
2098     if (val) *val = SvIV(obj);
2099     return SWIG_OK;
2100   } else {
2101     int dispatch = 0;
2102     const char *nptr = SvPV_nolen(obj);
2103     if (nptr) {
2104       char *endptr;
2105       long v;
2106       errno = 0;
2107       v = strtol(nptr, &endptr,0);
2108       if (errno == ERANGE) {
2109         errno = 0;
2110         return SWIG_OverflowError;
2111       } else {
2112         if (*endptr == '\0') {
2113           if (val) *val = v;
2114           return SWIG_Str2NumCast(SWIG_OK);
2115         }
2116       }
2117     }
2118     if (!dispatch) {
2119       double d;
2120       int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d));
2121       if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
2122         if (val) *val = (long)(d);
2123         return res;
2124       }
2125     }
2126   }
2127   return SWIG_TypeError;
2128 }
2129
2130
2131 SWIGINTERN int
2132 SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val)
2133 {
2134   long v;
2135   int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v);
2136   if (SWIG_IsOK(res)) {
2137     if ((v < INT_MIN || v > INT_MAX)) {
2138       return SWIG_OverflowError;
2139     } else {
2140       if (val) *val = (int)(v);
2141     }
2142   }  
2143   return res;
2144 }
2145
2146 #ifdef __cplusplus
2147 extern "C" {
2148 #endif
2149
2150 #ifdef PERL_OBJECT
2151 #define MAGIC_CLASS _wrap_Amanda__Archive_var::
2152 class _wrap_Amanda__Archive_var : public CPerlObj {
2153 public:
2154 #else
2155 #define MAGIC_CLASS
2156 #endif
2157 SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) {
2158     MAGIC_PPERL
2159     croak("Value is read-only.");
2160     return 0;
2161 }
2162
2163
2164 #ifdef PERL_OBJECT
2165 };
2166 #endif
2167
2168 #ifdef __cplusplus
2169 }
2170 #endif
2171
2172 #ifdef __cplusplus
2173 extern "C" {
2174 #endif
2175 XS(_wrap_amar_new) {
2176   {
2177     int arg1 ;
2178     char *arg2 = (char *) 0 ;
2179     int res2 ;
2180     char *buf2 = 0 ;
2181     int alloc2 = 0 ;
2182     int argvi = 0;
2183     amar_t *result = 0 ;
2184     dXSARGS;
2185     
2186     if ((items < 2) || (items > 2)) {
2187       SWIG_croak("Usage: amar_new(fd,modestr);");
2188     }
2189     {
2190       IO *io = NULL;
2191       PerlIO *pio = NULL;
2192       int fd = -1;
2193       
2194       if (SvIOK(ST(0))) {
2195         /* plain old integer */
2196         arg1 = SvIV(ST(0));
2197       } else {
2198         /* try extracting as filehandle */
2199         
2200         /* note: sv_2io may call die() */
2201         io = sv_2io(ST(0));
2202         if (io) {
2203           pio = IoIFP(io);
2204         }
2205         if (pio) {
2206           fd = PerlIO_fileno(pio);
2207         }
2208         if (fd >= 0) {
2209           arg1 = fd;
2210         } else {
2211           SWIG_exception(SWIG_TypeError, "Expected integer file descriptor "
2212             "or file handle for argument 1");
2213         }
2214       }
2215     }
2216     res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
2217     if (!SWIG_IsOK(res2)) {
2218       SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "amar_new" "', argument " "2"" of type '" "char *""'");
2219     }
2220     arg2 = (char *)(buf2);
2221     result = (amar_t *)amar_new_(arg1,arg2);
2222     ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_amar_t, 0 | 0); argvi++ ;
2223     
2224     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2225     XSRETURN(argvi);
2226   fail:
2227     
2228     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2229     SWIG_croak_null();
2230   }
2231 }
2232
2233
2234 XS(_wrap_amar_close) {
2235   {
2236     amar_t *arg1 = (amar_t *) 0 ;
2237     void *argp1 = 0 ;
2238     int res1 = 0 ;
2239     int argvi = 0;
2240     dXSARGS;
2241     
2242     if ((items < 1) || (items > 1)) {
2243       SWIG_croak("Usage: amar_close(arch);");
2244     }
2245     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_t, 0 |  0 );
2246     if (!SWIG_IsOK(res1)) {
2247       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_close" "', argument " "1"" of type '" "amar_t *""'"); 
2248     }
2249     arg1 = (amar_t *)(argp1);
2250     amar_close_(arg1);
2251     ST(argvi) = sv_newmortal();
2252     
2253     XSRETURN(argvi);
2254   fail:
2255     
2256     SWIG_croak_null();
2257   }
2258 }
2259
2260
2261 XS(_wrap_amar_new_file) {
2262   {
2263     amar_t *arg1 = (amar_t *) 0 ;
2264     char *arg2 = (char *) 0 ;
2265     gsize arg3 ;
2266     off_t *arg4 = (off_t *) 0 ;
2267     void *argp1 = 0 ;
2268     int res1 = 0 ;
2269     int res2 ;
2270     char *buf2 = 0 ;
2271     size_t size2 = 0 ;
2272     int alloc2 = 0 ;
2273     off_t position4 ;
2274     int argvi = 0;
2275     SV * _saved[1] ;
2276     amar_file_t *result = 0 ;
2277     dXSARGS;
2278     
2279     if ((items < 3) || (items > 3)) {
2280       SWIG_croak("Usage: amar_new_file(arch,filename,filename_len,want_position);");
2281     }
2282     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_t, 0 |  0 );
2283     if (!SWIG_IsOK(res1)) {
2284       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_new_file" "', argument " "1"" of type '" "amar_t *""'"); 
2285     }
2286     arg1 = (amar_t *)(argp1);
2287     res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, &size2, &alloc2);
2288     if (!SWIG_IsOK(res2)) {
2289       SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "amar_new_file" "', argument " "2"" of type '" "char *""'");
2290     }  
2291     arg2 = (char *)(buf2);
2292     arg3 = (gsize)(size2 - 1);
2293     {
2294       if (SvTRUE(ST(2))) {
2295         position4 = 0;
2296         arg4 = &position4;
2297       } else {
2298         arg4 = NULL;
2299       }
2300     }
2301     _saved[0] = ST(2);
2302     result = (amar_file_t *)amar_new_file_(arg1,arg2,arg3,arg4);
2303     ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_amar_file_t, 0 | 0); argvi++ ;
2304     {
2305       if (arg4) {
2306         SP += argvi; PUTBACK;
2307         ST(argvi) = sv_2mortal(amglue_newSVi64(*arg4));
2308         SPAGAIN; SP -= argvi; argvi++;
2309       }
2310     }
2311     
2312     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2313     
2314     XSRETURN(argvi);
2315   fail:
2316     
2317     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2318     
2319     SWIG_croak_null();
2320   }
2321 }
2322
2323
2324 XS(_wrap_amar_file_close) {
2325   {
2326     amar_file_t *arg1 = (amar_file_t *) 0 ;
2327     void *argp1 = 0 ;
2328     int res1 = 0 ;
2329     int argvi = 0;
2330     dXSARGS;
2331     
2332     if ((items < 1) || (items > 1)) {
2333       SWIG_croak("Usage: amar_file_close(file);");
2334     }
2335     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_file_t, 0 |  0 );
2336     if (!SWIG_IsOK(res1)) {
2337       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_file_close" "', argument " "1"" of type '" "amar_file_t *""'"); 
2338     }
2339     arg1 = (amar_file_t *)(argp1);
2340     amar_file_close_(arg1);
2341     ST(argvi) = sv_newmortal();
2342     
2343     XSRETURN(argvi);
2344   fail:
2345     
2346     SWIG_croak_null();
2347   }
2348 }
2349
2350
2351 XS(_wrap_amar_new_attr) {
2352   {
2353     amar_file_t *arg1 = (amar_file_t *) 0 ;
2354     guint16 arg2 ;
2355     void *argp1 = 0 ;
2356     int res1 = 0 ;
2357     int argvi = 0;
2358     amar_attr_t *result = 0 ;
2359     dXSARGS;
2360     
2361     if ((items < 2) || (items > 2)) {
2362       SWIG_croak("Usage: amar_new_attr(file,attrid);");
2363     }
2364     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_file_t, 0 |  0 );
2365     if (!SWIG_IsOK(res1)) {
2366       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_new_attr" "', argument " "1"" of type '" "amar_file_t *""'"); 
2367     }
2368     arg1 = (amar_file_t *)(argp1);
2369     {
2370       arg2 = amglue_SvU16(ST(1));
2371     }
2372     result = (amar_attr_t *)amar_new_attr_(arg1,arg2);
2373     ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_amar_attr_t, 0 | 0); argvi++ ;
2374     
2375     XSRETURN(argvi);
2376   fail:
2377     
2378     SWIG_croak_null();
2379   }
2380 }
2381
2382
2383 XS(_wrap_amar_attr_close) {
2384   {
2385     amar_attr_t *arg1 = (amar_attr_t *) 0 ;
2386     void *argp1 = 0 ;
2387     int res1 = 0 ;
2388     int argvi = 0;
2389     dXSARGS;
2390     
2391     if ((items < 1) || (items > 1)) {
2392       SWIG_croak("Usage: amar_attr_close(attr);");
2393     }
2394     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_attr_t, 0 |  0 );
2395     if (!SWIG_IsOK(res1)) {
2396       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_attr_close" "', argument " "1"" of type '" "amar_attr_t *""'"); 
2397     }
2398     arg1 = (amar_attr_t *)(argp1);
2399     amar_attr_close_(arg1);
2400     ST(argvi) = sv_newmortal();
2401     
2402     XSRETURN(argvi);
2403   fail:
2404     
2405     SWIG_croak_null();
2406   }
2407 }
2408
2409
2410 XS(_wrap_amar_attr_add_data_buffer) {
2411   {
2412     amar_attr_t *arg1 = (amar_attr_t *) 0 ;
2413     char *arg2 = (char *) 0 ;
2414     gsize arg3 ;
2415     gboolean arg4 ;
2416     void *argp1 = 0 ;
2417     int res1 = 0 ;
2418     int res2 ;
2419     char *buf2 = 0 ;
2420     size_t size2 = 0 ;
2421     int alloc2 = 0 ;
2422     int argvi = 0;
2423     dXSARGS;
2424     
2425     if ((items < 3) || (items > 3)) {
2426       SWIG_croak("Usage: amar_attr_add_data_buffer(attr,buffer,size,eoa);");
2427     }
2428     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_attr_t, 0 |  0 );
2429     if (!SWIG_IsOK(res1)) {
2430       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_attr_add_data_buffer" "', argument " "1"" of type '" "amar_attr_t *""'"); 
2431     }
2432     arg1 = (amar_attr_t *)(argp1);
2433     res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, &size2, &alloc2);
2434     if (!SWIG_IsOK(res2)) {
2435       SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "amar_attr_add_data_buffer" "', argument " "2"" of type '" "char *""'");
2436     }  
2437     arg2 = (char *)(buf2);
2438     arg3 = (gsize)(size2 - 1);
2439     {
2440       arg4 = SvTRUE(ST(2));
2441     }
2442     amar_attr_add_data_buffer_(arg1,arg2,arg3,arg4);
2443     ST(argvi) = sv_newmortal();
2444     
2445     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2446     
2447     XSRETURN(argvi);
2448   fail:
2449     
2450     if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
2451     
2452     SWIG_croak_null();
2453   }
2454 }
2455
2456
2457 XS(_wrap_amar_attr_add_data_fd) {
2458   {
2459     amar_attr_t *arg1 = (amar_attr_t *) 0 ;
2460     int arg2 ;
2461     gboolean arg3 ;
2462     void *argp1 = 0 ;
2463     int res1 = 0 ;
2464     int argvi = 0;
2465     size_t result;
2466     dXSARGS;
2467     
2468     if ((items < 3) || (items > 3)) {
2469       SWIG_croak("Usage: amar_attr_add_data_fd(attr,fd,eoa);");
2470     }
2471     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_attr_t, 0 |  0 );
2472     if (!SWIG_IsOK(res1)) {
2473       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_attr_add_data_fd" "', argument " "1"" of type '" "amar_attr_t *""'"); 
2474     }
2475     arg1 = (amar_attr_t *)(argp1);
2476     {
2477       IO *io = NULL;
2478       PerlIO *pio = NULL;
2479       int fd = -1;
2480       
2481       if (SvIOK(ST(1))) {
2482         /* plain old integer */
2483         arg2 = SvIV(ST(1));
2484       } else {
2485         /* try extracting as filehandle */
2486         
2487         /* note: sv_2io may call die() */
2488         io = sv_2io(ST(1));
2489         if (io) {
2490           pio = IoIFP(io);
2491         }
2492         if (pio) {
2493           fd = PerlIO_fileno(pio);
2494         }
2495         if (fd >= 0) {
2496           arg2 = fd;
2497         } else {
2498           SWIG_exception(SWIG_TypeError, "Expected integer file descriptor "
2499             "or file handle for argument 2");
2500         }
2501       }
2502     }
2503     {
2504       arg3 = SvTRUE(ST(2));
2505     }
2506     result = amar_attr_add_data_fd_(arg1,arg2,arg3);
2507     {
2508       SV *for_stack;
2509       SP += argvi; PUTBACK;
2510       for_stack = sv_2mortal(amglue_newSVu64(result));
2511       SPAGAIN; SP -= argvi;
2512       ST(argvi) = for_stack;
2513       argvi++;
2514     }
2515     
2516     
2517     
2518     XSRETURN(argvi);
2519   fail:
2520     
2521     
2522     
2523     SWIG_croak_null();
2524   }
2525 }
2526
2527
2528 XS(_wrap_amar_read) {
2529   {
2530     amar_t *arg1 = (amar_t *) 0 ;
2531     SV *arg2 = (SV *) 0 ;
2532     void *argp1 = 0 ;
2533     int res1 = 0 ;
2534     int argvi = 0;
2535     dXSARGS;
2536     
2537     if ((items < 2) || (items > 2)) {
2538       SWIG_croak("Usage: amar_read(archive,params_hashref);");
2539     }
2540     res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_amar_t, 0 |  0 );
2541     if (!SWIG_IsOK(res1)) {
2542       SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "amar_read" "', argument " "1"" of type '" "amar_t *""'"); 
2543     }
2544     arg1 = (amar_t *)(argp1);
2545     arg2 = ST(1);
2546     amar_read_(arg1,arg2);
2547     ST(argvi) = sv_newmortal();
2548     
2549     
2550     XSRETURN(argvi);
2551   fail:
2552     
2553     
2554     SWIG_croak_null();
2555   }
2556 }
2557
2558
2559
2560 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
2561
2562 static swig_type_info _swigt__p_amar_attr_t = {"_p_amar_attr_t", "amar_attr_t *", 0, 0, (void*)0, 0};
2563 static swig_type_info _swigt__p_amar_file_t = {"_p_amar_file_t", "amar_file_t *", 0, 0, (void*)0, 0};
2564 static swig_type_info _swigt__p_amar_t = {"_p_amar_t", "amar_t *", 0, 0, (void*)0, 0};
2565 static swig_type_info _swigt__p_char = {"_p_char", "gchar *|char *", 0, 0, (void*)0, 0};
2566 static swig_type_info _swigt__p_double = {"_p_double", "double *|gdouble *", 0, 0, (void*)0, 0};
2567 static swig_type_info _swigt__p_float = {"_p_float", "float *|gfloat *", 0, 0, (void*)0, 0};
2568 static swig_type_info _swigt__p_gsize = {"_p_gsize", "gsize *", 0, 0, (void*)0, 0};
2569 static swig_type_info _swigt__p_guint16 = {"_p_guint16", "guint16 *", 0, 0, (void*)0, 0};
2570 static swig_type_info _swigt__p_int = {"_p_int", "int *|gboolean *", 0, 0, (void*)0, 0};
2571 static swig_type_info _swigt__p_off_t = {"_p_off_t", "off_t *", 0, 0, (void*)0, 0};
2572 static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "guchar *|unsigned char *", 0, 0, (void*)0, 0};
2573
2574 static swig_type_info *swig_type_initial[] = {
2575   &_swigt__p_amar_attr_t,
2576   &_swigt__p_amar_file_t,
2577   &_swigt__p_amar_t,
2578   &_swigt__p_char,
2579   &_swigt__p_double,
2580   &_swigt__p_float,
2581   &_swigt__p_gsize,
2582   &_swigt__p_guint16,
2583   &_swigt__p_int,
2584   &_swigt__p_off_t,
2585   &_swigt__p_unsigned_char,
2586 };
2587
2588 static swig_cast_info _swigc__p_amar_attr_t[] = {  {&_swigt__p_amar_attr_t, 0, 0, 0},{0, 0, 0, 0}};
2589 static swig_cast_info _swigc__p_amar_file_t[] = {  {&_swigt__p_amar_file_t, 0, 0, 0},{0, 0, 0, 0}};
2590 static swig_cast_info _swigc__p_amar_t[] = {  {&_swigt__p_amar_t, 0, 0, 0},{0, 0, 0, 0}};
2591 static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
2592 static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
2593 static swig_cast_info _swigc__p_float[] = {  {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}};
2594 static swig_cast_info _swigc__p_gsize[] = {  {&_swigt__p_gsize, 0, 0, 0},{0, 0, 0, 0}};
2595 static swig_cast_info _swigc__p_guint16[] = {  {&_swigt__p_guint16, 0, 0, 0},{0, 0, 0, 0}};
2596 static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
2597 static swig_cast_info _swigc__p_off_t[] = {  {&_swigt__p_off_t, 0, 0, 0},{0, 0, 0, 0}};
2598 static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
2599
2600 static swig_cast_info *swig_cast_initial[] = {
2601   _swigc__p_amar_attr_t,
2602   _swigc__p_amar_file_t,
2603   _swigc__p_amar_t,
2604   _swigc__p_char,
2605   _swigc__p_double,
2606   _swigc__p_float,
2607   _swigc__p_gsize,
2608   _swigc__p_guint16,
2609   _swigc__p_int,
2610   _swigc__p_off_t,
2611   _swigc__p_unsigned_char,
2612 };
2613
2614
2615 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
2616
2617 static swig_constant_info swig_constants[] = {
2618 {0,0,0,0,0,0}
2619 };
2620 #ifdef __cplusplus
2621 }
2622 #endif
2623 static swig_variable_info swig_variables[] = {
2624 {0,0,0,0}
2625 };
2626 static swig_command_info swig_commands[] = {
2627 {"Amanda::Archivec::amar_new", _wrap_amar_new},
2628 {"Amanda::Archivec::amar_close", _wrap_amar_close},
2629 {"Amanda::Archivec::amar_new_file", _wrap_amar_new_file},
2630 {"Amanda::Archivec::amar_file_close", _wrap_amar_file_close},
2631 {"Amanda::Archivec::amar_new_attr", _wrap_amar_new_attr},
2632 {"Amanda::Archivec::amar_attr_close", _wrap_amar_attr_close},
2633 {"Amanda::Archivec::amar_attr_add_data_buffer", _wrap_amar_attr_add_data_buffer},
2634 {"Amanda::Archivec::amar_attr_add_data_fd", _wrap_amar_attr_add_data_fd},
2635 {"Amanda::Archivec::amar_read", _wrap_amar_read},
2636 {0,0}
2637 };
2638 /* -----------------------------------------------------------------------------
2639  * Type initialization:
2640  * This problem is tough by the requirement that no dynamic 
2641  * memory is used. Also, since swig_type_info structures store pointers to 
2642  * swig_cast_info structures and swig_cast_info structures store pointers back
2643  * to swig_type_info structures, we need some lookup code at initialization. 
2644  * The idea is that swig generates all the structures that are needed. 
2645  * The runtime then collects these partially filled structures. 
2646  * The SWIG_InitializeModule function takes these initial arrays out of 
2647  * swig_module, and does all the lookup, filling in the swig_module.types
2648  * array with the correct data and linking the correct swig_cast_info
2649  * structures together.
2650  *
2651  * The generated swig_type_info structures are assigned staticly to an initial 
2652  * array. We just loop through that array, and handle each type individually.
2653  * First we lookup if this type has been already loaded, and if so, use the
2654  * loaded structure instead of the generated one. Then we have to fill in the
2655  * cast linked list. The cast data is initially stored in something like a
2656  * two-dimensional array. Each row corresponds to a type (there are the same
2657  * number of rows as there are in the swig_type_initial array). Each entry in
2658  * a column is one of the swig_cast_info structures for that type.
2659  * The cast_initial array is actually an array of arrays, because each row has
2660  * a variable number of columns. So to actually build the cast linked list,
2661  * we find the array of casts associated with the type, and loop through it 
2662  * adding the casts to the list. The one last trick we need to do is making
2663  * sure the type pointer in the swig_cast_info struct is correct.
2664  *
2665  * First off, we lookup the cast->type name to see if it is already loaded. 
2666  * There are three cases to handle:
2667  *  1) If the cast->type has already been loaded AND the type we are adding
2668  *     casting info to has not been loaded (it is in this module), THEN we
2669  *     replace the cast->type pointer with the type pointer that has already
2670  *     been loaded.
2671  *  2) If BOTH types (the one we are adding casting info to, and the 
2672  *     cast->type) are loaded, THEN the cast info has already been loaded by
2673  *     the previous module so we just ignore it.
2674  *  3) Finally, if cast->type has not already been loaded, then we add that
2675  *     swig_cast_info to the linked list (because the cast->type) pointer will
2676  *     be correct.
2677  * ----------------------------------------------------------------------------- */
2678
2679 #ifdef __cplusplus
2680 extern "C" {
2681 #if 0
2682 } /* c-mode */
2683 #endif
2684 #endif
2685
2686 #if 0
2687 #define SWIGRUNTIME_DEBUG
2688 #endif
2689
2690
2691 SWIGRUNTIME void
2692 SWIG_InitializeModule(void *clientdata) {
2693   size_t i;
2694   swig_module_info *module_head, *iter;
2695   int found, init;
2696   
2697   clientdata = clientdata;
2698   
2699   /* check to see if the circular list has been setup, if not, set it up */
2700   if (swig_module.next==0) {
2701     /* Initialize the swig_module */
2702     swig_module.type_initial = swig_type_initial;
2703     swig_module.cast_initial = swig_cast_initial;
2704     swig_module.next = &swig_module;
2705     init = 1;
2706   } else {
2707     init = 0;
2708   }
2709   
2710   /* Try and load any already created modules */
2711   module_head = SWIG_GetModule(clientdata);
2712   if (!module_head) {
2713     /* This is the first module loaded for this interpreter */
2714     /* so set the swig module into the interpreter */
2715     SWIG_SetModule(clientdata, &swig_module);
2716     module_head = &swig_module;
2717   } else {
2718     /* the interpreter has loaded a SWIG module, but has it loaded this one? */
2719     found=0;
2720     iter=module_head;
2721     do {
2722       if (iter==&swig_module) {
2723         found=1;
2724         break;
2725       }
2726       iter=iter->next;
2727     } while (iter!= module_head);
2728     
2729     /* if the is found in the list, then all is done and we may leave */
2730     if (found) return;
2731     /* otherwise we must add out module into the list */
2732     swig_module.next = module_head->next;
2733     module_head->next = &swig_module;
2734   }
2735   
2736   /* When multiple interpeters are used, a module could have already been initialized in
2737        a different interpreter, but not yet have a pointer in this interpreter.
2738        In this case, we do not want to continue adding types... everything should be
2739        set up already */
2740   if (init == 0) return;
2741   
2742   /* Now work on filling in swig_module.types */
2743 #ifdef SWIGRUNTIME_DEBUG
2744   printf("SWIG_InitializeModule: size %d\n", swig_module.size);
2745 #endif
2746   for (i = 0; i < swig_module.size; ++i) {
2747     swig_type_info *type = 0;
2748     swig_type_info *ret;
2749     swig_cast_info *cast;
2750     
2751 #ifdef SWIGRUNTIME_DEBUG
2752     printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
2753 #endif
2754     
2755     /* if there is another module already loaded */
2756     if (swig_module.next != &swig_module) {
2757       type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
2758     }
2759     if (type) {
2760       /* Overwrite clientdata field */
2761 #ifdef SWIGRUNTIME_DEBUG
2762       printf("SWIG_InitializeModule: found type %s\n", type->name);
2763 #endif
2764       if (swig_module.type_initial[i]->clientdata) {
2765         type->clientdata = swig_module.type_initial[i]->clientdata;
2766 #ifdef SWIGRUNTIME_DEBUG
2767         printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
2768 #endif
2769       }
2770     } else {
2771       type = swig_module.type_initial[i];
2772     }
2773     
2774     /* Insert casting types */
2775     cast = swig_module.cast_initial[i];
2776     while (cast->type) {
2777       /* Don't need to add information already in the list */
2778       ret = 0;
2779 #ifdef SWIGRUNTIME_DEBUG
2780       printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
2781 #endif
2782       if (swig_module.next != &swig_module) {
2783         ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
2784 #ifdef SWIGRUNTIME_DEBUG
2785         if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
2786 #endif
2787       }
2788       if (ret) {
2789         if (type == swig_module.type_initial[i]) {
2790 #ifdef SWIGRUNTIME_DEBUG
2791           printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
2792 #endif
2793           cast->type = ret;
2794           ret = 0;
2795         } else {
2796           /* Check for casting already in the list */
2797           swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
2798 #ifdef SWIGRUNTIME_DEBUG
2799           if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
2800 #endif
2801           if (!ocast) ret = 0;
2802         }
2803       }
2804       
2805       if (!ret) {
2806 #ifdef SWIGRUNTIME_DEBUG
2807         printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
2808 #endif
2809         if (type->cast) {
2810           type->cast->prev = cast;
2811           cast->next = type->cast;
2812         }
2813         type->cast = cast;
2814       }
2815       cast++;
2816     }
2817     /* Set entry in modules->types array equal to the type */
2818     swig_module.types[i] = type;
2819   }
2820   swig_module.types[i] = 0;
2821   
2822 #ifdef SWIGRUNTIME_DEBUG
2823   printf("**** SWIG_InitializeModule: Cast List ******\n");
2824   for (i = 0; i < swig_module.size; ++i) {
2825     int j = 0;
2826     swig_cast_info *cast = swig_module.cast_initial[i];
2827     printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
2828     while (cast->type) {
2829       printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
2830       cast++;
2831       ++j;
2832     }
2833     printf("---- Total casts: %d\n",j);
2834   }
2835   printf("**** SWIG_InitializeModule: Cast List ******\n");
2836 #endif
2837 }
2838
2839 /* This function will propagate the clientdata field of type to
2840 * any new swig_type_info structures that have been added into the list
2841 * of equivalent types.  It is like calling
2842 * SWIG_TypeClientData(type, clientdata) a second time.
2843 */
2844 SWIGRUNTIME void
2845 SWIG_PropagateClientData(void) {
2846   size_t i;
2847   swig_cast_info *equiv;
2848   static int init_run = 0;
2849   
2850   if (init_run) return;
2851   init_run = 1;
2852   
2853   for (i = 0; i < swig_module.size; i++) {
2854     if (swig_module.types[i]->clientdata) {
2855       equiv = swig_module.types[i]->cast;
2856       while (equiv) {
2857         if (!equiv->converter) {
2858           if (equiv->type && !equiv->type->clientdata)
2859           SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
2860         }
2861         equiv = equiv->next;
2862       }
2863     }
2864   }
2865 }
2866
2867 #ifdef __cplusplus
2868 #if 0
2869 {
2870   /* c-mode */
2871 #endif
2872 }
2873 #endif
2874
2875
2876
2877 #ifdef __cplusplus
2878 extern "C"
2879 #endif
2880
2881 XS(SWIG_init) {
2882   dXSARGS;
2883   int i;
2884   
2885   SWIG_InitializeModule(0);
2886   
2887   /* Install commands */
2888   for (i = 0; swig_commands[i].name; i++) {
2889     newXS((char*) swig_commands[i].name,swig_commands[i].wrapper, (char*)__FILE__);
2890   }
2891   
2892   /* Install variables */
2893   for (i = 0; swig_variables[i].name; i++) {
2894     SV *sv;
2895     sv = get_sv((char*) swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI);
2896     if (swig_variables[i].type) {
2897       SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0);
2898     } else {
2899       sv_setiv(sv,(IV) 0);
2900     }
2901     swig_create_magic(sv, (char *) swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); 
2902   }
2903   
2904   /* Install constant */
2905   for (i = 0; swig_constants[i].type; i++) {
2906     SV *sv;
2907     sv = get_sv((char*)swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI);
2908     switch(swig_constants[i].type) {
2909     case SWIG_INT:
2910       sv_setiv(sv, (IV) swig_constants[i].lvalue);
2911       break;
2912     case SWIG_FLOAT:
2913       sv_setnv(sv, (double) swig_constants[i].dvalue);
2914       break;
2915     case SWIG_STRING:
2916       sv_setpv(sv, (char *) swig_constants[i].pvalue);
2917       break;
2918     case SWIG_POINTER:
2919       SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0);
2920       break;
2921     case SWIG_BINARY:
2922       SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype));
2923       break;
2924     default:
2925       break;
2926     }
2927     SvREADONLY_on(sv);
2928   }
2929   
2930   ST(0) = &PL_sv_yes;
2931   XSRETURN(1);
2932 }
2933