From: Sebastien Dugue Date: Fri, 13 Feb 2015 09:29:36 +0000 (+0100) Subject: Perl shared bindings: Add bindings for the LIST command X-Git-Tag: v1.7.0~36^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=faa1d3771a23741367363c865f6ca5a378cac0f5;p=thirdparty%2Frrdtool-1.x.git Perl shared bindings: Add bindings for the LIST command --- diff --git a/bindings/perl-shared/RRDs.xs b/bindings/perl-shared/RRDs.xs index ed5fc76a..af55fa65 100644 --- a/bindings/perl-shared/RRDs.xs +++ b/bindings/perl-shared/RRDs.xs @@ -648,3 +648,57 @@ rrd_flushcached(...) rrdcode(rrd_flushcached); OUTPUT: RETVAL + +SV* +rrd_list(...) + PROTOTYPE: @ + PREINIT: + char *data; + char *ptr, *end; + int i; + char **argv; + AV *list; + PPCODE: + argv = (char **) malloc((items+1)*sizeof(char *)); + argv[0] = "dummy"; + + for (i = 0; i < items; i++) { + STRLEN len; + char *handle= SvPV(ST(i),len); + /* actually copy the data to make sure possible modifications + on the argv data does not backfire into perl */ + argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); + strcpy(argv[i+1],handle); + } + + rrd_clear_error(); + + data = rrd_list(items+1, argv); + + for (i=0; i < items; i++) { + free(argv[i+1]); + } + free(argv); + + if (rrd_test_error()) + XSRETURN_UNDEF; + + list = newAV(); + + ptr = data; + end = strchr(ptr, '\n'); + + while (end) { + *end = '\0'; + av_push(list, newSVpv(ptr, 0)); + ptr = end + 1; + + if (strlen(ptr) == 0) + break; + + end = strchr(ptr, '\n'); + } + + rrd_freemem(data); + + XPUSHs(sv_2mortal(newRV_noinc((SV*)list)));