13 #include "../../src/rrd_tool.h"
15 /* perl 5.004 compatibility */
16 #if PERLPATCHLEVEL < 5
17 #define PL_sv_undef sv_undef
20 #define rrdcode(name) \
21 argv = (char **) malloc((items+1)*sizeof(char *));\
23 for (i = 0; i < items; i++) { \
25 char *handle= SvPV(ST(i),len);\
26 /* actually copy the data to make sure possible modifications \
27 on the argv data does not backfire into perl */ \
28 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char)); \
29 strcpy(argv[i+1],handle); \
33 RETVAL=name(items+1,argv); \
34 for (i=0; i < items; i++) {\
39 if (rrd_test_error()) XSRETURN_UNDEF;
42 * should not be needed if libc is linked (see ntmake.pl)
46 #define realloc realloc
51 MODULE = RRDs PACKAGE = RRDs PREFIX = rrd_
54 #ifdef MUST_DISABLE_SIGFPE
55 signal(SIGFPE,SIG_IGN);
57 #ifdef MUST_DISABLE_FPMASK
65 if (! rrd_test_error()) XSRETURN_UNDEF;
66 RETVAL = newSVpv(rrd_get_error(),0);
131 argv = (char **) malloc((items+1)*sizeof(char *));
133 for (i = 0; i < items; i++) {
135 char *handle = SvPV(ST(i),len);
136 /* actually copy the data to make sure possible modifications
137 on the argv data does not backfire into perl */
138 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
139 strcpy(argv[i+1],handle);
143 rrd_graph(items+1,argv,&calcpr,&xsize,&ysize);
144 for (i=0; i < items; i++) {
149 if (rrd_test_error()) {
151 for(i=0;calcpr[i];i++)
157 for(i=0;calcpr[i];i++){
158 av_push(retar,newSVpv(calcpr[i],0));
164 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
165 PUSHs(sv_2mortal(newSViv(xsize)));
166 PUSHs(sv_2mortal(newSViv(ysize)));
173 unsigned long step, ds_cnt,i,ii;
174 rrd_value_t *data,*datai;
177 AV *retar,*line,*names;
179 argv = (char **) malloc((items+1)*sizeof(char *));
181 for (i = 0; i < items; i++) {
183 char *handle= SvPV(ST(i),len);
184 /* actually copy the data to make sure possible modifications
185 on the argv data does not backfire into perl */
186 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
187 strcpy(argv[i+1],handle);
191 rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data);
192 for (i=0; i < items; i++) {
196 if (rrd_test_error()) XSRETURN_UNDEF;
197 /* convert the ds_namv into perl format */
199 for (ii = 0; ii < ds_cnt; ii++){
200 av_push(names,newSVpv(ds_namv[ii],0));
204 /* convert the data array into perl format */
207 for (i = start+step; i <= end; i += step){
209 for (ii = 0; ii < ds_cnt; ii++){
210 av_push(line,(isnan(*datai) ? &PL_sv_undef : newSVnv(*datai)));
213 av_push(retar,newRV_noinc((SV*)line));
217 PUSHs(sv_2mortal(newSViv(start+step)));
218 PUSHs(sv_2mortal(newSViv(step)));
219 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
220 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
229 unsigned long step, col_cnt,row_cnt,i,ii;
230 rrd_value_t *data,*ptr;
231 char **argv,**legend_v;
232 AV *retar,*line,*names;
234 argv = (char **) malloc((items+1)*sizeof(char *));
236 for (i = 0; i < items; i++) {
238 char *handle = SvPV(ST(i),len);
239 /* actually copy the data to make sure possible modifications
240 on the argv data does not backfire into perl */
241 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
242 strcpy(argv[i+1],handle);
246 rrd_xport(items+1,argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data);
247 for (i=0; i < items; i++) {
251 if (rrd_test_error()) XSRETURN_UNDEF;
253 /* convert the legend_v into perl format */
255 for (ii = 0; ii < col_cnt; ii++){
256 av_push(names,newSVpv(legend_v[ii],0));
261 /* convert the data array into perl format */
264 for (i = start+step; i <= end; i += step){
266 for (ii = 0; ii < col_cnt; ii++){
267 av_push(line,(isnan(*ptr) ? &PL_sv_undef : newSVnv(*ptr)));
270 av_push(retar,newRV_noinc((SV*)line));
275 PUSHs(sv_2mortal(newSViv(start+step)));
276 PUSHs(sv_2mortal(newSViv(end)));
277 PUSHs(sv_2mortal(newSViv(step)));
278 PUSHs(sv_2mortal(newSViv(col_cnt)));
279 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
280 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
291 /* prepare argument list */
292 argv = (char **) malloc((items+1)*sizeof(char *));
294 for (i = 0; i < items; i++) {
296 char *handle= SvPV(ST(i),len);
297 /* actually copy the data to make sure possible modifications
298 on the argv data does not backfire into perl */
299 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
300 strcpy(argv[i+1],handle);
304 data=rrd_info(items+1, argv);
305 for (i=0; i < items; i++) {
309 if (rrd_test_error()) XSRETURN_UNDEF;
313 /* the newSV will get copied by hv so we create it as a mortal to make sure
314 it does not keep hanging round after the fact */
315 #define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0)
316 switch (data->type) {
318 if (isnan(data->value.u_val))
321 hvs(newSVnv(data->value.u_val));
324 hvs(newSViv(data->value.u_cnt));
327 hvs(newSVpv(data->value.u_str,0));
328 free(data->value.u_str);
337 RETVAL = newRV_noinc((SV*)hash);