+static int
+val_t_to_sv(val_t *val, SV **results) {
+ if (!val) {
+ results[0] = &PL_sv_undef;
+ return 1;
+ } else {
+ switch (val->type) {
+ case CONFTYPE_RATE: {
+ results[0] = sv_newmortal();
+ sv_setnv(results[0], val_t__rate(val)[0]);
+
+ results[1] = sv_newmortal();
+ sv_setnv(results[1], val_t__rate(val)[1]);
+ return 2;
+ }
+
+ case CONFTYPE_INTRANGE: {
+ results[0] = sv_newmortal();
+ sv_setiv(results[0], val_t__intrange(val)[0]);
+
+ results[1] = sv_newmortal();
+ sv_setiv(results[1], val_t__intrange(val)[1]);
+ return 2;
+ }
+
+ case CONFTYPE_EXINCLUDE: {
+ /* exincludes are represented in perl as {
+ * 'list' : [ 'list1', 'list2', ..],
+ * 'file' : [ 'file1', 'file2', ..],
+ * 'optional' : 1,
+ * }
+ */
+ exinclude_t *ei = &val_t__exinclude(val);
+ AV *list_entries = (AV *)sv_2mortal((SV *)newAV());
+ AV *file_entries = (AV *)sv_2mortal((SV *)newAV());
+ SV *optional = sv_newmortal();
+ HV *hv;
+ sle_t *iter;
+
+ /* first set up each of the hash values */
+
+ if (ei->sl_list) {
+ for (iter = ei->sl_list->first; iter != NULL; iter = iter->next) {
+ av_push(list_entries, newSVpv(iter->name, 0));
+ }
+ }
+
+ if(ei->sl_file) {
+ for (iter = ei->sl_file->first; iter != NULL; iter = iter->next) {
+ av_push(file_entries, newSVpv(iter->name, 0));
+ }
+ }
+
+ sv_setiv(optional, ei->optional);
+
+ /* now build the hash */
+ hv = (HV *)sv_2mortal((SV *)newHV());
+
+ hv_store(hv, "file", 4, newRV((SV *)file_entries), 0);
+ hv_store(hv, "list", 4, newRV((SV *)list_entries), 0);
+ hv_store(hv, "optional", 8, optional, 0);
+ SvREFCNT_inc(optional);
+
+ results[0] = sv_2mortal(newRV((SV *)hv));
+ return 1;
+ }
+
+ case CONFTYPE_PROPLIST:
+ results[0] = sv_2mortal(g_hash_table_to_hashref_property(val_t__proplist(val)));
+ return 1;
+
+ case CONFTYPE_SIZE:
+ results[0] = sv_2mortal(amglue_newSVi64(val_t__size(val)));
+ return 1;
+
+ case CONFTYPE_INT64:
+ results[0] = sv_2mortal(amglue_newSVi64(val_t__int64(val)));
+ return 1;
+
+ case CONFTYPE_BOOLEAN: /* all same as INT.. */
+ case CONFTYPE_COMPRESS:
+ case CONFTYPE_ENCRYPT:
+ case CONFTYPE_STRATEGY:
+ case CONFTYPE_TAPERALGO:
+ case CONFTYPE_PRIORITY:
+ case CONFTYPE_HOLDING:
+ case CONFTYPE_EXECUTE_ON:
+ case CONFTYPE_EXECUTE_WHERE:
+ case CONFTYPE_SEND_AMREPORT_ON:
+ case CONFTYPE_DATA_PATH:
+ case CONFTYPE_PART_CACHE_TYPE:
+ case CONFTYPE_INT:
+ results[0] = sv_2mortal(amglue_newSVi64(val_t__int(val)));
+ return 1;
+
+ case CONFTYPE_ESTIMATELIST: {
+ AV *elist = newAV();
+ estimatelist_t el;
+ for (el=val_t__estimatelist(val); el != NULL; el = el->next) {
+ av_push(elist, newSVuv(GPOINTER_TO_INT(el->data)));
+ }
+ results[0] = sv_2mortal(newRV_noinc((SV *)elist));
+ return 1;
+ }
+
+ case CONFTYPE_TIME:
+ results[0] = sv_2mortal(amglue_newSVi64(val_t__time(val)));
+ return 1;
+
+ case CONFTYPE_REAL:
+ results[0] = sv_newmortal();
+ sv_setnv(results[0], val_t__real(val));
+ return 1;
+
+ case CONFTYPE_IDENT: /* same as STRING */
+ case CONFTYPE_STR:
+ case CONFTYPE_APPLICATION:
+ results[0] = sv_newmortal();
+ sv_setpv(results[0], val_t__str(val));
+ return 1;
+
+ case CONFTYPE_IDENTLIST: {
+ AV *ilist = newAV();
+
+ identlist_t il;
+ for (il=val_t__identlist(val); il != NULL; il = il->next) {
+ av_push(ilist, newSVpv((char *)il->data, 0));
+ }
+
+ results[0] = sv_2mortal(newRV_noinc((SV *)ilist));
+ return 1;
+ }
+
+ case CONFTYPE_RECOVERY_LIMIT: {
+ AV *av;
+ GSList *iter;
+ recovery_limit_t *rl = &val_t__recovery_limit(val);
+
+ av = newAV();
+ if (rl->same_host)
+ av_push(av, &PL_sv_undef);
+ for (iter=rl->match_pats; iter != NULL; iter = iter->next) {
+ av_push(av, newSVpv((char *)iter->data, 0));
+ }
+
+ results[0] = sv_2mortal(newRV_noinc((SV *)av));
+ return 1;
+ }
+
+ case CONFTYPE_AUTOLABEL: {
+ autolabel_t *autolabel = &val_t__autolabel(val);
+ HV *hv;
+
+ /* now build the hash */
+ hv = (HV *)sv_2mortal((SV *)newHV());
+ hv_store(hv, "template", 8,
+ (autolabel->template)? newSVpv(autolabel->template, 0) : newSV(0),
+ 0);
+ hv_store(hv, "other_config", 12,
+ (autolabel->autolabel & AL_OTHER_CONFIG)? &PL_sv_yes : &PL_sv_no,
+ 0);
+ hv_store(hv, "non_amanda", 10,
+ (autolabel->autolabel & AL_NON_AMANDA)? &PL_sv_yes : &PL_sv_no,
+ 0);
+ hv_store(hv, "volume_error", 12,
+ (autolabel->autolabel & AL_VOLUME_ERROR)? &PL_sv_yes : &PL_sv_no,
+ 0);
+ hv_store(hv, "empty", 5,
+ (autolabel->autolabel & AL_EMPTY)? &PL_sv_yes : &PL_sv_no,
+ 0);
+
+ results[0] = sv_2mortal(newRV((SV *)hv));
+ return 1;
+ }
+
+ /* No match yet -> not one of the "complex" types */
+ default:
+ SWIG_exception(SWIG_TypeError, "Unknown val_t conftype");
+ break;
+ }
+ }
+
+ return 0;
+
+fail:
+ SWIG_croak_null();
+}
+
+