13 #include "../../src/rrd_tool.h"
15 /* perl 5.004 compatibility */
16 #if PERLPATCHLEVEL < 5
17 #define PL_sv_undef sv_undef
21 #define rrdcode(name) \
22 argv = (char **) malloc((items+1)*sizeof(char *));\
24 for (i = 0; i < items; i++) { \
26 char *handle= SvPV(ST(i),len);\
27 /* actually copy the data to make sure possible modifications \
28 on the argv data does not backfire into perl */ \
29 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \
30 strcpy(argv[i+1],handle); \
34 RETVAL=name(items+1,argv); \
35 for (i=0; i < items; i++) {\
40 if (rrd_test_error()) XSRETURN_UNDEF;
42 #define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0)
44 #define rrdinfocode(name) \
45 /* prepare argument list */ \
46 argv = (char **) malloc((items+1)*sizeof(char *)); \
48 for (i = 0; i < items; i++) { \
50 char *handle= SvPV(ST(i),len); \
51 /* actually copy the data to make sure possible modifications \
52 on the argv data does not backfire into perl */ \
53 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \
54 strcpy(argv[i+1],handle); \
58 data=name(items+1, argv); \
59 for (i=0; i < items; i++) { \
63 if (rrd_test_error()) XSRETURN_UNDEF; \
67 /* the newSV will get copied by hv so we create it as a mortal \
68 to make sure it does not keep hanging round after the fact */ \
69 switch (data->type) { \
71 if (isnan(data->value.u_val)) \
74 hvs(newSVnv(data->value.u_val)); \
77 hvs(newSViv(data->value.u_int)); \
80 hvs(newSViv(data->value.u_cnt)); \
83 hvs(newSVpv(data->value.u_str,0)); \
84 rrd_freemem(data->value.u_str); \
87 rrd_freemem(data->key); \
92 RETVAL = newRV_noinc((SV*)hash);
95 * should not be needed if libc is linked (see ntmake.pl)
99 #define realloc realloc
104 MODULE = RRDs PACKAGE = RRDs PREFIX = rrd_
107 #ifdef MUST_DISABLE_SIGFPE
108 signal(SIGFPE,SIG_IGN);
110 #ifdef MUST_DISABLE_FPMASK
118 if (! rrd_test_error()) XSRETURN_UNDEF;
119 RETVAL = newSVpv(rrd_get_error(),0);
184 argv = (char **) malloc((items+1)*sizeof(char *));
186 for (i = 0; i < items; i++) {
188 char *handle = SvPV(ST(i),len);
189 /* actually copy the data to make sure possible modifications
190 on the argv data does not backfire into perl */
191 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
192 strcpy(argv[i+1],handle);
196 rrd_graph(items+1,argv,&calcpr,&xsize,&ysize);
197 for (i=0; i < items; i++) {
202 if (rrd_test_error()) {
204 for(i=0;calcpr[i];i++)
205 rrd_freemem(calcpr[i]);
210 for(i=0;calcpr[i];i++){
211 av_push(retar,newSVpv(calcpr[i],0));
212 rrd_freemem(calcpr[i]);
217 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
218 PUSHs(sv_2mortal(newSViv(xsize)));
219 PUSHs(sv_2mortal(newSViv(ysize)));
226 unsigned long step, ds_cnt,i,ii;
227 rrd_value_t *data,*datai;
230 AV *retar,*line,*names;
232 argv = (char **) malloc((items+1)*sizeof(char *));
234 for (i = 0; i < items; i++) {
236 char *handle= SvPV(ST(i),len);
237 /* actually copy the data to make sure possible modifications
238 on the argv data does not backfire into perl */
239 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
240 strcpy(argv[i+1],handle);
244 rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data);
245 for (i=0; i < items; i++) {
249 if (rrd_test_error()) XSRETURN_UNDEF;
250 /* convert the ds_namv into perl format */
252 for (ii = 0; ii < ds_cnt; ii++){
253 av_push(names,newSVpv(ds_namv[ii],0));
254 rrd_freemem(ds_namv[ii]);
256 rrd_freemem(ds_namv);
257 /* convert the data array into perl format */
260 for (i = start+step; i <= end; i += step){
262 for (ii = 0; ii < ds_cnt; ii++){
263 av_push(line,(isnan(*datai) ? &PL_sv_undef : newSVnv(*datai)));
266 av_push(retar,newRV_noinc((SV*)line));
270 PUSHs(sv_2mortal(newSViv(start+step)));
271 PUSHs(sv_2mortal(newSViv(step)));
272 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
273 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
282 unsigned long step, col_cnt,row_cnt,i,ii;
283 rrd_value_t *data,*ptr;
284 char **argv,**legend_v;
285 AV *retar,*line,*names;
287 argv = (char **) malloc((items+1)*sizeof(char *));
289 for (i = 0; i < items; i++) {
291 char *handle = SvPV(ST(i),len);
292 /* actually copy the data to make sure possible modifications
293 on the argv data does not backfire into perl */
294 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
295 strcpy(argv[i+1],handle);
299 rrd_xport(items+1,argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data);
300 for (i=0; i < items; i++) {
304 if (rrd_test_error()) XSRETURN_UNDEF;
306 /* convert the legend_v into perl format */
308 for (ii = 0; ii < col_cnt; ii++){
309 av_push(names,newSVpv(legend_v[ii],0));
310 rrd_freemem(legend_v[ii]);
312 rrd_freemem(legend_v);
314 /* convert the data array into perl format */
317 for (i = start+step; i <= end; i += step){
319 for (ii = 0; ii < col_cnt; ii++){
320 av_push(line,(isnan(*ptr) ? &PL_sv_undef : newSVnv(*ptr)));
323 av_push(retar,newRV_noinc((SV*)line));
328 PUSHs(sv_2mortal(newSViv(start+step)));
329 PUSHs(sv_2mortal(newSViv(end)));
330 PUSHs(sv_2mortal(newSViv(step)));
331 PUSHs(sv_2mortal(newSViv(col_cnt)));
332 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
333 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
344 rrdinfocode(rrd_info);
357 rrdinfocode(rrd_update_v);