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;
45 #define realloc realloc
49 MODULE = RRDs PACKAGE = RRDs PREFIX = rrd_
52 #ifdef MUST_DISABLE_SIGFPE
53 signal(SIGFPE,SIG_IGN);
55 #ifdef MUST_DISABLE_FPMASK
63 if (! rrd_test_error()) XSRETURN_UNDEF;
64 RETVAL = newSVpv(rrd_get_error(),0);
129 argv = (char **) malloc((items+1)*sizeof(char *));
131 for (i = 0; i < items; i++) {
133 char *handle = SvPV(ST(i),len);
134 /* actually copy the data to make sure possible modifications
135 on the argv data does not backfire into perl */
136 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
137 strcpy(argv[i+1],handle);
141 rrd_graph(items+1,argv,&calcpr,&xsize,&ysize);
142 for (i=0; i < items; i++) {
147 if (rrd_test_error()) {
149 for(i=0;calcpr[i];i++)
155 for(i=0;calcpr[i];i++){
156 av_push(retar,newSVpv(calcpr[i],0));
162 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
163 PUSHs(sv_2mortal(newSViv(xsize)));
164 PUSHs(sv_2mortal(newSViv(ysize)));
171 unsigned long step, ds_cnt,i,ii;
172 rrd_value_t *data,*datai;
175 AV *retar,*line,*names;
177 argv = (char **) malloc((items+1)*sizeof(char *));
179 for (i = 0; i < items; i++) {
181 char *handle= SvPV(ST(i),len);
182 /* actually copy the data to make sure possible modifications
183 on the argv data does not backfire into perl */
184 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
185 strcpy(argv[i+1],handle);
189 rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data);
190 for (i=0; i < items; i++) {
194 if (rrd_test_error()) XSRETURN_UNDEF;
195 /* convert the ds_namv into perl format */
197 for (ii = 0; ii < ds_cnt; ii++){
198 av_push(names,newSVpv(ds_namv[ii],0));
202 /* convert the data array into perl format */
205 for (i = start; i <= end; i += step){
207 for (ii = 0; ii < ds_cnt; ii++){
208 av_push(line,(isnan(*datai) ? &PL_sv_undef : newSVnv(*datai)));
211 av_push(retar,newRV_noinc((SV*)line));
215 PUSHs(sv_2mortal(newSViv(start)));
216 PUSHs(sv_2mortal(newSViv(step)));
217 PUSHs(sv_2mortal(newRV_noinc((SV*)names)));
218 PUSHs(sv_2mortal(newRV_noinc((SV*)retar)));
230 /* prepare argument list */
231 argv = (char **) malloc((items+1)*sizeof(char *));
233 for (i = 0; i < items; i++) {
235 char *handle= SvPV(ST(i),len);
236 /* actually copy the data to make sure possible modifications
237 on the argv data does not backfire into perl */
238 argv[i+1] = (char *) malloc((strlen(handle)+1)*sizeof(char));
239 strcpy(argv[i+1],handle);
243 data=rrd_info(items+1, argv);
244 for (i=0; i < items; i++) {
248 if (rrd_test_error()) XSRETURN_UNDEF;
252 /* the newSV will get copied by hv so we create it as a mortal to make sure
253 it does not keep hanging round after the fact */
254 #define hvs(VAL) hv_store_ent(hash, sv_2mortal(newSVpv(data->key,0)),VAL,0)
255 switch (data->type) {
257 if (isnan(data->value.u_val))
260 hvs(newSVnv(data->value.u_val));
263 hvs(newSViv(data->value.u_cnt));
266 hvs(newSVpv(data->value.u_str,0));
267 free(data->value.u_str);
276 RETVAL = newRV_noinc((SV*)hash);